我的代码应该制作一个金字塔,但只给了我一条线,为什么?我尝试过更改 for 和 while 循环的条件,但没有找到任何解决方案。任何帮助将不胜感激!!
#
##
###
####
#####
######
#######
########
#include <stdio.h>
#include <cs50.h>
int main(void)
{
int n = get_int("Add the height of the pyramid: ");
int j = 0;
for(int i = 0; i < n ; i++) {
while (j <= i) {
printf("#");
j = j + 1;
}
printf("\n");
}
在
j
循环内声明 for
,以便每次迭代都从 0 开始。
for(int i = 0; i < n; i++) {
int j = 0;
while (j <= i) {
printf("#");
j = j + 1;
}
printf("\n");
}
内部循环也可以重写为
for
循环。
for(int i = 0; i < n; i++) {
for (int j = i; j >= 0; j--) printf("#");
printf("\n");
}
虽然迭代解决方案(嵌套
for()
循环)是最简单的,但这可能是发现递归的好时机。只要金字塔不高到有堆栈溢出的风险,以下工作就可以进行(将收集/验证用户输入作为练习。)
#include <stdio.h>
#include <cs50.h>
void print( int n ) {
if( n > 1 )
print( n - 1 );
while( n-- )
putchar( '#' );
putchar( '\n' );
}
int main() {
print( 7 );
return 0;
}
putchar()
是一个比 printf()
简单得多的函数,应该在输出简单的单个字符时使用(为了速度和效率。)
如果您思考所介绍的操作,您将了解递归以及有时如何使用它来解决问题。
另一个(尽管“有限”)解决方案如下:
int main() {
char wrk[] = "################";
int i = sizeof wrk - 1; // 'i' starts as the 'length' of the string
int want = 7;
while( want-- )
puts( wrk + --i ); // adding decreasing values of 'i' prints longer strings
return 0;
}
puts()
将在附加“换行符”的同时将字符串输出到标准输出。fputs()
) 以类似的方式工作,但不会为您附加 LF。
做事的方法往往有很多种。
编辑:
这是使用指针的另一个极简解决方案。这个使用“编译时”字符串,因此不容易受到用户的影响(但如果你聪明的话,可以这样做。)
#include <stdio.h>
#include <string.h>
int main() {
char want[] = "#######";
char *p = want + strlen( want );
while( --p >= want) puts( p );
return 0;
}
编辑#2:(更正)
四个月后,我的注意力又回到了这个答案上。令人尴尬的是,最后一个例子表现出了 UB,需要修正。保留该代码不变,以便读者与此固定版本进行比较:
#include <stdio.h>
int main() {
char str[] = "#######", *p = str + sizeof str - 1;
while( p > str ) puts( --p );
return 0;
}
当指针
p
递减到“小于”数组 str
第一个字符的地址的值时,就会出现错误代码的微妙 UB。将该值与 str[0]
的地址进行比较在语言中未定义。
虽然 @Unmitigated 的 答案是正确的,但这将是将某些功能分解为函数的好地方。
void print_n_ln(char *str, int n) {
for (; n > 0; n--) {
printf("%s", str);
}
printf("\n");
}
然后:
int main(void) {
int n = get_int("Add the height of the pyramid: ");
for (int i = 1; i <= n; i++)
print_n_ln("#", i);
return 0;
}