簡體   English   中英

我的 CS50 mario 不太舒服的代碼有什么問題?

[英]What is wrong with my CS50 mario less comfortable code?

這是我的代碼的副本:

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    int height = get_int("Please enter a height between 1 and 8 (inclusive)\nHeight: ");

    if(0 < height && height < 9)
    for(int i = 0; i <= height; i++)
    {
        for(int s = (height - 1); s >= 1; s--)
        {
            printf("a");
        }

        for(int h = 1; h <= i; h++)
        {
            printf("#");
        }

        printf("\n");
    }

    else
    printf("Please try again.\n"),
    main();
}

我似乎無法正確打印的部分是打印正確數量的空格,因為它似乎沒有在每個循環之后減少變量“s”。 (我已經用字母“a”替換了空格,這樣我就可以看到代碼哪里出錯了。)代碼的目的是打印一個右對齊的#金字塔。 我在這里哪里出錯了?

例如,如果用戶輸入高度 3,則 output 將是:

aa

aa#

aa##

aa###

但是,我希望 output 是:

aa#

a##

###

主要問題是打印“a”時代碼中的第二個 for 循環。 每次你在這個特定的循環中,你基本上打印(高度 - 1)乘以“a”。 事實上,你應該每次少一個“a”(多一個哈希)就打印出來。 為此,我們需要調整 s 的條件。 而不是這個

int s = height - 1; s >= 1

用這個

int s = height - i; s > 1

由於您的主循環有迭代器i ,我們可以在這里使用它。

第二個問題是,根據 CS50 問題集描述,您實際上應該打印" " (空格),而不是"a" 為此,您應該將"a"替換為" "

第三個問題是您的代碼在開頭打印了一個充滿空間的額外行。 您需要使用此條件調整主 for 循環以刪除額外的一行。

i < height

在打印#符號的 for 循環中,您需要從零開始迭代器 h,以便它立即打印第一行。

int h = 0

更好的解決方案是使用已經存在的printf的內置功能,將問題簡化為一個簡單的循環。

#include <stdio.h>

int main(void) {
    int height = get_int("Please enter a height between 1 and 8 (inclusive)\nHeight: ");

    unsigned char blocks[height];
    memset(blocks, '#', height);

    for(int i=0; i<height; ++i)
    {
        printf("%*.*s\n", height, i+1, blocks);
    }
    return 0;
}

Output

Success #stdin #stdout 0s 4212KB
    #
   ##
  ###
 ####
#####

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM