1

次のcプログラムを手伝ってくれる人はいますか? これは C での 2 番目のプログラムにすぎないため、何をしているのかわかりません。

ファイル「input.txt」を読み取り、学生の正答率に基づいて学生の数学のスコアをアスタリスクで与えるプログラムをcで作成しようとしています

私が思いついたのは、の無限ループだけです

+:*

-:*

* :*

/:*

input.txt は以下のようになります


1生徒数

カーラ生徒の名前

8/10で決めた8 10加算点

50 80 50/80 で決定される減算スコア

30 60 30/60 で決まる掛け算の得点

2/5で決まる2・5部門の得点


の望ましい出力で

カーラ

+: * * * * * * * *

-: * * * * * *

*: * * * * *

/: * * * *


私のコード

int num; 
char name; 
int sum;
int cur;
int i;
int avg; 

//call file
FILE*ifp=fopen("input.txt","r");
fscanf(ifp,"%d",&num);
for (i=0;i=num;i++){
        fscanf(ifp,"%c",&name);
        printf("%c",&name);
        for(sum=0;sum<=4;sum++){
            fscanf(ifp,"%d",&cur);
            scanf(cur,"%d %d")
            avg=%d/%d;
            if (sum==1)
                printf("+:");
            else if (sum==2)
                printf("-:");
            else if (sum==3)
                printf("*:");
            else if (sum==4)
                printf("/:");
            if (avg==1)
                printf("**********\n");
            else if (avg>=.9)
                printf("*********\n");
            else if (avg>=.8)
                printf("********\n");
            else if (avg>=.7)
                printf("*******\n");
            else if (avg>=.6)
                printf("******\n");
            else if (avg>=.5)
                printf("*****\n");
            else if (avg>=.4)
                printf("****\n");
            else if (avg>=.3)
                printf("***\n");
            else if (avg>=.2)
                printf("**\n");
            else if (avg>=.1)
                printf("*\n");
            else
                printf("\n");
        }
}
//close file
fclose(ifp);
return 0;

誰かが私を助けることができれば、私はそれを大いに感謝します.

4

2 に答える 2

2

無限ループは、外側のループ条件が原因です:for (i=0;i=num;i++)に変更for (i=0;i<num;i++)

そのままでは、毎回 i を num に割り当てるだけなので、無限ループになります。

編集:行に構文エラーがあることも指摘する必要があります

scanf(cur,"%d %d")
avg=%d/%d;

また、avg変数が int として宣言されているため、整数除算を実行することになりますが、期待どおりに動作しない可能性があります。つまり、整数のみを取得するため、その後の条件はほとんど意味がありません。float または double にし、オペランドの 1 つを浮動小数点にキャストする必要があります。

于 2013-03-23T00:38:33.087 に答える
0

次の For ループを検討してください。

for(i = 0, i < 10; i++)
{
   DoSomething();
}

これが実行される順序は次のとおりです。

  • i = 0 を実行します。
  • i < 10 を実行します。結果が「True」の場合は続行します。結果が「False」の場合、ループを終了します。i は最初は 0 であり、0 は 10 未満であるため、結果は true です。立ち止まるな
  • DoSomething() を実行します。
  • i++ を実行
  • 「実行 i < 10; 結果が「True」の場合に戻る. . .

あなたの場合、i が num と等しいかどうかを確認する代わりに、実際に num を i に割り当てています。C は 0 を "False" として扱い、それ以外は "True" として扱い、i = 10 の "結果" は 10 であるため (サイドバー 1 を参照)、コンピューターは i = 10 を "True" と評価し、ループを続行します。

これは、コンパイラが警告しないため、C では非常に簡単に犯す間違いです。Lint のような静的分析ツールはそうしますが、それはまた別の話です。

結論では、おそらく "i = num" を "i < num" または "i <= num" またはその他の条件ステートメントにする必要があります。

Sidebar1このプロパティを使用すると、a = b = c = 10 のように代入を連鎖させることができます。c = 10 の結果は 10 であるため、b に代入されます。b = 10 の結果は 10 なので、a に割り当てられます。

于 2013-03-23T00:46:20.123 に答える