C Primer Plus第6章练习4检查

时间:2015-01-27 00:44:58

标签: c loops for-loop

现在我正在阅读Stephen Prata的“C Primer Plus”,第6章中的练习4在本书中没有解决方案,所以我无法检查我是否正确地完成了它。我的代码就像它应该的那样工作,但我想知道可能有一些更好或更清洁的解决方案。伙计们,能帮助我吗?我的代码低于练习的描述。

以下是描述: 让程序请求用户输入大写字母。使用嵌套循环生成金字塔图案,如下所示:

    A
   ABA
  ABCBA
 ABCDCBA
ABCDEDCBA

模式应扩展为输入的字符。例如,前面的模式将由E的输入值产生。提示:使用外部循环来处理行。连续使用三个内部循环,一个用于处理空格,一个用于按升序打印字母,另一个用于按降序打印字母。

#include <stdio.h>

int main(void) {
    char ch;
    char row;
    char spaces;
    char let;
    char back;

    printf("Please, insert an uppercase letter: ");
        scanf("%c", &ch);

    for(row = 'A'; row <= ch; row++) {
        for(spaces = ch; spaces > row; spaces--)
            printf("%c", ' ');

        for(let = 'A'; let <= row; let++)
            printf("%c", let);    

        for(back = let; back > 'A' + 1; back--)
            printf("%c", back - 2);
        printf("\n");
    }
    return 0;
}

2 个答案:

答案 0 :(得分:3)

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

#define AtoZ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

int main(void) {
    char ch, *p;
    int row, spaces;
    int r, i;

    printf("Please, insert an uppercase letter: ");
    scanf("%c", &ch);
    if((p = strchr(AtoZ, ch))==NULL){
        printf("invalid input!\n");
        return -1;
    }

    row = p - AtoZ + 1;
    for(r = 0; r < row; r++) {
        spaces = row - r -1;
        for(i = 0; i < spaces; i++)
            printf("%c", ' ');

        for(i = 0; i < r; i++)
            printf("%c", AtoZ[i]);

        for(;i >= 0; i--)
            printf("%c", AtoZ[i]);

        printf("\n");
    }
    return 0;
}

答案 1 :(得分:1)

我认为你的很好。我只是改变了一点点(因此更清洁一点):

  1. 打印一个不需要的空间&#34;%c&#34;。只是&#34; &#34 ;.

  2. 仔细设计,不需要+1和-2。

  3. 变量的命名:mid:行的中间,第四行:向前打印(即从A到X-1,向后:向后打印,即从X到A.

    #include <stdio.h>
    int main(void) {
        char ch;
        char mid;
        char spaces;
        char forth;
        char back;
    
        printf("Please, insert an uppercase letter: ");
        scanf("%c", &ch);
    
        for(mid = 'A'; mid <= ch; mid++) {
            for(spaces = ch; spaces > mid; spaces--)
                printf(" ");
    
            for(forth = 'A'; forth < mid; forth++)
                printf("%c", forth);    
    
            for(back = mid; back >= 'A'; back--)
                printf("%c", back);
            printf("\n");
        }
        return 0;
    }
    
  4. ---更新--- 或者,第四个和第二个循环可以替换为:

    for (let = 'A'; let < mid; let++)
        printf ("%c", let);
    for (   ;  let >= 'A'; let--)
        printf ("%c", let);
    

    但是,您需要定义int let;而不是int forth; int back;