2015-01-27 85 views
0

现在我在读“C的Primer Plus”,由斯蒂芬·普拉塔并有在第6章,其在书中没有解决的练习4,所以我不能检查,如果我做到了正常。我的代码的工作原理应该如此,但我想知道也许有一些更好或更清洁的解决方案。你们能帮助我吗?我的代码低于练习的描述。Ç的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; 
} 
+0

这是一个很好的解决方案,恭喜。 – 2015-01-27 00:48:08

+5

如果代码正在工作(并产生预期的输出),它就属于https://codereview.stackexchange.com。除了“更好或更清洁的解决方案”之外,一定要包含更多关于您正在寻找的建议的信息。 – 2015-01-27 00:49:11

+0

@remyabel感谢您的链接和建议。 – 2015-01-27 00:53:50

回答

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; 
} 
+0

我改变了我的代码,所以现在它是正确的。您使用if语句,但在后面会出现的书中,因此您的解决方案无关紧要。但是,无论如何,谢谢:) – 2015-01-27 03:48:57

+0

'(p = strchr(AtoZ,ch))!= NULL || (退出((printf(“无效输入!\ n”), - 1)),0);' – BLUEPIXY 2015-01-27 08:33:34

1

我觉得你都很好。我只是改变了一点点(因此很少一点清洁剂):

  1. 打印空间不需要“%c”。只是“”。

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

  3. 命名的变量:中期:一排,第四中间:印刷前(即从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; 
    } 
    

---更新--- 另外,在来回循环可以被替换为:

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

然而,你需要定义而不是int forth; int back;

+0

谢谢!这就是我想知道的:) – 2015-01-27 05:21:24

+0

更新了第四个和后面循环的替代方案。 – 2015-01-27 05:56:40