While 和 for 循环没有给出正确的答案

问题描述 投票:0回答:3

我的代码应该制作一个金字塔,但只给了我一条线,为什么?我尝试过更改 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");

}
c cs50
3个回答
6
投票

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");
}

2
投票

虽然迭代解决方案(嵌套

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]
的地址进行比较在语言中未定义。


1
投票

虽然 @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;
}
© www.soinside.com 2019 - 2024. All rights reserved.