C语言 While和for循环未给出正确答案

ogq8wdun  于 2022-12-22  发布在  其他
关注(0)|答案(3)|浏览(115)

我的代码应该是这样的金字塔,但只是给了我一行,为什么?我已经尝试改变条件的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");

}
ckx4rj1h

ckx4rj1h1#

for循环中声明j,以便在每次迭代中从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");
}
kkbh8khc

kkbh8khc2#

虽然answer from @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;
}
esbemjvw

esbemjvw3#

虽然迭代解决方案(嵌套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()将向stdout输出一个字符串,同时追加一个"newline"。
NB:它的更通用的兄弟函数(fputs())以类似的方式工作,但不为您附加LF。
做事的方法往往有很多种。

    • 编辑:**

这是另一个使用指针的极简解决方案,它使用了一个"编译时"字符串,所以不容易受用户的影响(但是如果你聪明的话,它可以这样做)。

#include <stdio.h>
#include <string.h>

int main() {
    char want[] = "#######";
    char *p = want + strlen( want );

    while( --p >= want) puts( p );

    return 0;
}

相关问题