2015-01-27 86 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