现在我正在阅读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;
}
答案 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)
我认为你的很好。我只是改变了一点点(因此更清洁一点):
打印一个不需要的空间&#34;%c&#34;。只是&#34; &#34 ;.
仔细设计,不需要+1和-2。
变量的命名: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;
}
---更新--- 或者,第四个和第二个循环可以替换为:
for (let = 'A'; let < mid; let++)
printf ("%c", let);
for ( ; let >= 'A'; let--)
printf ("%c", let);
但是,您需要定义int let;
而不是int forth; int back;