黑马程序员技术交流社区

标题: 编程问题输出字母金字塔 [打印本页]

作者: 黑色L    时间: 2013-10-1 11:23
标题: 编程问题输出字母金字塔
本帖最后由 黑色L 于 2013-10-2 08:55 编辑

输入一个字母,输出由这个字母决定其高度的字符"金字塔"
例如:输入字母 d 输出如下  
        A
      ABA
     ABCBA
   ABCDCBA


作者: 陈行    时间: 2013-10-1 11:48
char类型的和int类型的有一定的联系 每个字母对应了一个数字  只能帮你到这了
作者: 黑色L    时间: 2013-10-1 12:36
程序设计思路啊
作者: -___Is、_C    时间: 2013-10-1 16:02
以前有做过一个数字的希望对你有帮助
int rows = 4;
Console.Write("输入需显示的行数.\r\n");
rows =Convert.ToInt16(Console.ReadLine());
if (rows < 1 || rows > 100)
{
    Console.Write("输入不合法.\r\n");
     return;
}
for (int i = 1; i < rows + 1; i++)
{
for (int j = 0; j < (rows - i); j++)
{
Console.Write(" ");
}
for (int j = 1; j <= i + (i - 1); j++)
{
if (j > i)
Console.Write((i + (i - 3)) - (j - 3));
  else
Console.Write(j);
  }
Console.Write("\r\n");
}
Console.Write("输入任意字符终止程序.\r\n");
string tp = Console.ReadLine();
作者: 大虾挂了    时间: 2013-10-1 18:17
本帖最后由 大虾挂了 于 2013-10-1 18:56 编辑

手头暂时没有VS,说下我的想法。

先看空格数量的关系,假设最后一行没有空格,那么每一行的空格数应该是总行数-当前行数。

程序提示用户输入一个1到26之间的数字决定金字塔的层数。把这个输入保存给row(总行数)
建立一个双层for循环,
外层循环,参数为i,每次循环自加1。次数就是row,负责打印A前面的空格和最后的换行符。
空格数量也就是前面说的row-i;内层循环结束后增加换行符。

内层循环决定每一行字母的打印。
内层循环有两种写法。

方法一:
内层循环可以分成两个循环来写:
①参数为j。j初值为0,每次j++,循环次数为row-1,循环内容为显示char类型:‘A’+j。
②参数为j,j初值为row-2,每次j--,循环次数为row-2,循环内容为显示char类型:‘A’+j

方法二:
内层循环直接用一个来写,只不过要在外面先定义一个int类型变量num,初值为65(也就是A的ASCII码)
循环参数为j,初值为0,循环次数为2*row-1次(1,3,5,7,9.。。。。),每次i自加1。
增加判断:
如果j<row-1,先显示num的值,然后num自加1.
如果j>=row-1,先显示num的值,然后num自减1.
这里可能比较奇怪,举个列子,第四行内层循环应该输出ABCDCBA。当j<4-1,也就是j<3的时候(0,1,2),每次num自加1,打印出了ABC。j=3的时候,num内应该存储的是D(最后一次输出完C自加1),此时满足条件二,所以先输出num,也就是D,然后num自减1,下次就会输出C,以此类推直到完成2*4-1次循环。刚好输出所有结果ABCDCBA

手头暂时没有VS,我自己先尝试写一下代码。一会儿发上来。

作者: 大虾挂了    时间: 2013-10-1 19:16
代码来了,这里简化了一点,没有读取用户要求的行数,我直接让行数为26了,当然想读取输入改动一下就好。
方法1代码:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;

  6. namespace 字母金字塔1
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             int row=26;            

  13.             for (int i = 1; i <= row; i++)
  14.             {
  15.                 for (int j = 0; j < row - i; j++)//输出该行空格
  16.                 {
  17.                     Console.Write(" ");
  18.                 }

  19.                 for (int j = 0; j < i; j++) //输出A到该行最大的字母
  20.                 {
  21.                     Console.Write(Convert.ToChar('A'+j));
  22.                 }
  23.                 for (int j = i - 2; j >= 0; j--) //输出该行第二大的字母到A
  24.                 {
  25.                     Console.Write(Convert.ToChar('A' + j));
  26.                 }
  27.                
  28.                 Console.WriteLine();//输出最后的换行符

  29.             }

  30.             Console.ReadKey();

  31.         }
  32.     }
  33. }
复制代码
方法二代码:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;

  6. namespace 字母金字塔2
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             int row = 26;
  13.             int letter = 65;


  14.             for (int i = 1; i <= row; i++)
  15.             {
  16.                 for (int j = 0; j < row - i; j++)//输出该行的空格
  17.                 {
  18.                     Console.Write(" ");
  19.                 }

  20.                 letter = 65; //下面循环进行完毕会更改letter的值,这里对其进行恢复
  21.                 for (int j = 0; j < 2 * i - 1; j++)
  22.                 {
  23.                     if (j < i - 1)//输出A到该行第二大的字母,第一行此判定直接不成立
  24.                     {
  25.                         Console.Write(Convert.ToChar(letter));
  26.                         letter += 1;
  27.                     }
  28.                     if (j >= i - 1)//输出该行最大的字母到A,对于第一行该判断刚好只输出一个A
  29.                     {
  30.                         Console.Write(Convert.ToChar(letter));
  31.                         letter -= 1;
  32.                     }
  33.                 }

  34.                 Console.WriteLine();

  35.             }

  36.             Console.ReadKey();

  37.         }
  38.     }
  39. }
复制代码
不太会发图片,自己跑一下就好了。
作者: 七里香    时间: 2013-10-1 19:43
大虾挂了 发表于 2013-10-1 18:17
手头暂时没有VS,说下我的想法。

先看空格数量的关系,假设最后一行没有空格,那么每一行的空格数应该是总 ...

数学好就是不一样啊。以后有机会多指教一下俺的数学啊{:soso_e100:}

作者: 赖龙威    时间: 2013-10-1 19:49

  1.                 Scanner scanner = new Scanner(System.in);
  2.                 char zimu = scanner.nextLine().charAt(0);;
  3.                 int suzi = zimu - 'A' + 1;
  4.                 for (int i = 1; i <= suzi; i++) {
  5.                         for (int j = 1; j <= 2 * suzi -1; j++) {
  6.                                 if (i + j - 1 < suzi || j - i + 1 > suzi ) {
  7.                                         System.out.print(" ");
  8.                                 }
  9.                                 else {
  10.                                         if (j <= suzi) {
  11.                                                 System.out.print((char)(i + j - suzi - 1 + 'A'));
  12.                                         }
  13.                                         else {
  14.                                                 System.out.print((char)(i  - j  + zimu));
  15.                                         }
  16.                                 }
  17.                         }
  18.                         System.out.println();
  19.                 }
  20.         }
  21. }
复制代码
功能是实现了。就是代码难看了点。见谅

QQ截图20131001194817.png (1002 Bytes, 下载次数: 53)

QQ截图20131001194817.png

作者: 大虾挂了    时间: 2013-10-1 19:51
七里香 发表于 2013-10-1 19:43
数学好就是不一样啊。以后有机会多指教一下俺的数学啊

好的,互相帮助互相帮助。{:soso_e149:}

作者: 大虾挂了    时间: 2013-10-1 20:19
赖龙威 发表于 2013-10-1 19:49
功能是实现了。就是代码难看了点。见谅

前面几行东西没有看懂。看完后面的大概知道前面几个东西是干什么了。
不知道我理解的对不对:
zimu是读取了一个用户输入的一个字母,表示你这个金字塔中出现的最大字母。suzi是这个最大字母的数字编号(A编号为1,B为2,以此类推)
for循环中实际你输出的是一个方形空间吧。
外层if输出方形空间去掉有字母部分的两个空白三角
内层if输出本行A到本行最大的字母
内层else输出本行第二大字母到A

内层的if和else中,输出字母与行数和列数的关系很厉害,看了好久才理解。

手头没有VS,比较郁闷,不能实际跑一下你的代码,直接放在main函数里就可以了吧?我拷贝一下。

作者: 赖龙威    时间: 2013-10-1 20:54
大虾挂了 发表于 2013-10-1 20:19
前面几行东西没有看懂。看完后面的大概知道前面几个东西是干什么了。
不知道我理解的对不对:
zimu是读取 ...
  1. import java.util.Scanner;


  2. public class Jzt {
  3.         public static void main(String[] args)
  4.         {
  5.                 Scanner scanner = new Scanner(System.in);
  6.                 char zimu = scanner.nextLine().charAt(0);;
  7.                 int suzi = zimu - 'A' + 1;
  8.                 for (int i = 1; i <= suzi; i++) {
  9.                         for (int j = 1; j <= 2 * suzi -1; j++) {
  10.                                 if (i + j - 1 < suzi || j - i + 1 > suzi ) {
  11.                                         System.out.print(" ");
  12.                                 }
  13.                                 else {
  14.                                         if (j <= suzi) {
  15.                                                 System.out.print((char)(i + j - suzi - 1 + 'A'));
  16.                                         }
  17.                                         else {
  18.                                                 System.out.print((char)(i  - j  + zimu));
  19.                                         }
  20.                                 }
  21.                         }
  22.                         System.out.println();
  23.                 }
  24.         }
  25. }

复制代码
当时复制的时候没有复制好

作者: 大虾挂了    时间: 2013-10-1 21:04
赖龙威 发表于 2013-10-1 20:54
当时复制的时候没有复制好

晕啊。。。。java的?不过算法是可以借鉴的。
作者: 大虾挂了    时间: 2013-10-1 21:40
发下上面的结果吧






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2