-1

すべてのヘッダー ファイルを適切に「リンク」した後、コードを正しくコンパイルできるようになりました。mariov1.c (以下に示すコード) を実行したとき、20 のテスト入力を使用しました。その結果、3 つのハッシュマークが出力され、コマンド行が次のように表示されました。

###[xvp@localhost ~]$

現在、ハッシュマークの数が usrHeight になるまで、ハッシュマークを追加し、各行にスペースを減算する 21 個のスペースと 2 つのハッシュマークの出力が想定されていました (基本的に、実際にはハッシュの数によって決定されるように設定されていませんが、それでも機能しますこのように見えるはずです。

How High?
10
constructing...
         ##
        ###
       ####
      #####
     ######
    #######
   ########
  #########
 ##########
###########

これにより、正しい位置合わせが維持されます。

mariov1.c ソース

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

int main(void)
{
    int usrHeight = 0;
    int levelCounter = 0;
    int paddIt = usrHeight - 1;
    int hashCounter = 2;


    do 
    {
        printf("How high?\n");
        int usrHeight = GetInt();
    }
    while ( usrHeight > 23 || usrHeight < 0);
    if ( usrHeight >= 0 && usrHeight <= 23);
    {
        printf("constructing...\n");

    }
    for (levelCounter = 0; levelCounter <= usrHeight; levelCounter++)
    {
            printf("%.*s\n", paddIt, "");
            for (int i = 0; i <= hashCounter; i++)
                putchar('#'); 
            paddIt = paddIt - 1;
            hashCounter = hashCounter + 1;
    }

}

この大失敗の後、途中で for ループを使用して別の do while ループを使用して 2 回目の試行を行いました (間違いなく間違いでした) が、端末が継続的にハッシュでいっぱいになったので、どこに行けばよいかわかりません。点。

ここに mariov2.c ソースがあります

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

int main(void)
{
    int usrHeight = 0;
    int levelCounter = 0;
    int paddIt = usrHeight - 1;
    int hashCounter = 2;


    do 
    {
        printf("How high?\n");
        int usrHeight = GetInt();
    }
    while ( usrHeight > 23 || usrHeight < 0);
    if ( usrHeight >= 0 && usrHeight <= 23);
    {
        printf("constructing...\n");

    }
    //doing a test to see if this do while loop will handle this appropriatelly
    do
    {
        printf("%.*s\n", paddIt, "");
            for (int i = 0; i <= hashCounter; i++)
        {
            putchar('#');
            paddIt = paddIt - 1;
            hashCounter = hashCounter + 1;
            levelCounter = levelCounter + 1;
        }   
    }
    while ( levelCounter <= usrHeight );
    //commented area part of original code
    //for (levelCounter = 0; levelCounter <= usrHeight; levelCounter++)
    //{
        //  printf("%.*s", paddIt, "");
        //  for (int i = 0; i <= hashCounter; i++)
        //      putchar('#'); 
        //  paddIt = paddIt - 1;
        //  hashCounter = hashCounter + 1;
    //}

}
4

1 に答える 1

2

最初に気付くのはusrHeight、ループで使用している は常に0セグメント内にあるためです。

do 
{
    printf("How high?\n");
    int usrHeight = GetInt();
}
while ( usrHeight > 23 || usrHeight < 0);

usrHeight、この while スコープに対してローカルです。コントロールがこのスコープの外usrHeightにあり、実際に使用すると、関数 main のスコープで定義した変数になります。intから削除int usrHeight = GetInt();

paddItまた、 を使用して値で実際に変数を初期化する前に、変数を計算しましたGetInt ()

于 2014-02-07T04:29:19.163 に答える