【问题标题】:Building a pyramid of letters in C99在 C99 中构建字母金字塔
【发布时间】:2018-03-03 06:58:59
【问题描述】:
#include <stdio.h>
#define FINISH 'Z'
int main(void){
    int spacenm, currentspacenm, i;
    char ini, inirecord;
    int rownm, currentrownm;
    printf("PLease enter a random uppercase letter: ");
    scanf("%c", &inirecord);
    spacenm = rownm = FINISH - inirecord;
    for (i = 0; i<= spacenm; i++)
        printf(" ");
    printf("%c\n", inirecord);
    i = 0;
    for (currentrownm = 1; currentrownm <= rownm; currentrownm ++){
        for (currentspacenm = 1; currentspacenm <= spacenm; currentspacenm++)
            printf(" ");
        spacenm--;
        for (ini = inirecord; ini<=inirecord+i; ini++)
            printf("%c", ini);
        i++;
        for (; ini>=inirecord; ini--)
            printf("%c", ini);
        printf("\n");
    }
    return 0;
}

我想知道是否有更好的方法需要更少的变量或使用更少的冗余代码结构来提高效率。

【问题讨论】:

  • 在改进工作代码的情况下,Code Review 可能是一个更好的地方。 :)
  • 请尝试解释您的代码的作用。另外,请尝试解释您尝试过的所有方法并展示您的研究。
  • 您应该检查输入是否成功并得到一个大写字母。查看scanf()的返回值——应该是1;将格式字符串更改为" %c"%c 之前为空白);使用来自&lt;ctype.h&gt; 的函数。就个人而言,我会使用putchar() 来输出单个字符;这似乎不像以前那样广泛使用了。
  • 感谢大家的帮助,因为我真的是一个初学者,所以对 C 等中的约定知之甚少。无论如何,你的回答都很有帮助。
  • @Francis.Tricka 第一行应该只包含一个字母吗?如果输入的字母是“Z”,那么输出应该是什么?

标签: c loops for-loop while-loop


【解决方案1】:

我们初学者应该互相帮助。:)

您的程序中没有检查用户输入是否有效。

另外,如果我没记错的话,并非所有编码表,例如 EBCDIC 表都包含顺序大写字母。

不需要像你这样写单独的sn-p代码来输出金字塔的第一行

for (i = 0; i<= spacenm; i++)
    printf(" ");
printf("%c\n", inirecord);

使用格式化可以消除循环次数。

考虑到一般情况下,而不是这种格式规范

scanf("%c", &inirecord);
      ^^^^ 

你应该使用以下

scanf(" %c", &inirecord);
      ^^^^^ 

否则也会读取控制字符。

这是我的三分钱。:)

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main(void) 
{
    const char *letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    const size_t N = strlen( letters );

    while ( 1 )
    {
        char alpha[3];
        _Bool exit_status;
        const char *p;

        do
        {
            printf( "PLease enter a random uppercase letter (Enter - exit ): " );
            exit_status = fgets( alpha, sizeof( alpha ), stdin ) == NULL || alpha[0] == '\n'; 

            if ( !exit_status ) 
            {
                p = NULL;
                if ( alpha[1] == '\n' )
                {
                    alpha[0] = toupper( ( unsigned char )alpha[0] );
                    p = strchr( letters, alpha[0] );
                }
            }
        } while ( !exit_status && !p );     

        if ( exit_status ) break;

        int n = &letters[N] - p;

        putchar( '\n' );
        for ( int i = 0; i < n; i++ )
        {
            printf( "%*c", n - i, alpha[0] );
            int j = 0;
            while ( j != i ) putchar( p[++j] );
            while ( j != 0 ) putchar( p[--j] );
            putchar( '\n' );
        }
        putchar( '\n' );
    }

    return 0;
}

程序输出可能看起来像

PLease enter a random uppercase letter (Enter - exit ): Z

Z

PLease enter a random uppercase letter (Enter - exit ): Y

 Y
YZY

PLease enter a random uppercase letter (Enter - exit ): X

  X
 XYX
XYZYX

PLease enter a random uppercase letter (Enter - exit ): A

                         A
                        ABA
                       ABCBA
                      ABCDCBA
                     ABCDEDCBA
                    ABCDEFEDCBA
                   ABCDEFGFEDCBA
                  ABCDEFGHGFEDCBA
                 ABCDEFGHIHGFEDCBA
                ABCDEFGHIJIHGFEDCBA
               ABCDEFGHIJKJIHGFEDCBA
              ABCDEFGHIJKLKJIHGFEDCBA
             ABCDEFGHIJKLMLKJIHGFEDCBA
            ABCDEFGHIJKLMNMLKJIHGFEDCBA
           ABCDEFGHIJKLMNONMLKJIHGFEDCBA
          ABCDEFGHIJKLMNOPONMLKJIHGFEDCBA
         ABCDEFGHIJKLMNOPQPONMLKJIHGFEDCBA
        ABCDEFGHIJKLMNOPQRQPONMLKJIHGFEDCBA
       ABCDEFGHIJKLMNOPQRSRQPONMLKJIHGFEDCBA
      ABCDEFGHIJKLMNOPQRSTSRQPONMLKJIHGFEDCBA
     ABCDEFGHIJKLMNOPQRSTUTSRQPONMLKJIHGFEDCBA
    ABCDEFGHIJKLMNOPQRSTUVUTSRQPONMLKJIHGFEDCBA
   ABCDEFGHIJKLMNOPQRSTUVWVUTSRQPONMLKJIHGFEDCBA
  ABCDEFGHIJKLMNOPQRSTUVWXWVUTSRQPONMLKJIHGFEDCBA
 ABCDEFGHIJKLMNOPQRSTUVWXYXWVUTSRQPONMLKJIHGFEDCBA
ABCDEFGHIJKLMNOPQRSTUVWXYZYXWVUTSRQPONMLKJIHGFEDCBA

PLease enter a random uppercase letter (Enter - exit ): 

【讨论】:

  • “我们初学者”?你有 133k 代表和 C 和 C++ 的金徽章 LOL
  • @MarcoBonelli 我一生中从未写过例如 C++ 程序。:) 我没有工作。所以我是初学者。
  • 嗯,这不是初学者的定义,但是好吧,啊哈
  • @VladfromMoscow 好吧,谢谢伙计。我得说你的程序看起来很棒,并且包含我还没有达到的代码......所以稍后随着我的进步,我肯定会过来学习你的代码。另一个微不足道的问题:因为我正在用一本书做这个,而这个“金字塔”的东西来自一个附加的练习问题,所以我想知道是否有基于我的代码的更简单的方法(特别是如何替换这两个尴尬带有一个智能循环的 for 循环,可提供正确的第一行输出)?
  • @Francis.Tricka 考虑一下我的程序中的循环 for (int i = 0; i
猜你喜欢
  • 1970-01-01
  • 2020-02-11
  • 2021-12-15
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多