2016-10-19 17 views
0

私は完全にこの1つに困惑しています。私は簡単な等級計算機を作成しようとしています。はい、これは学校の割り当てです。しかし、締め切りと呼ばれるものがあり、私の教師は会うことが不可能になるので、私はすでに自分の仕事をしている成績評価プログラムを取り入れました。しかし、私は好奇心が強い人です。私の先生は私の質問に答えることができませんでした。Cでの文字列配列からのフル値を表示

私のプロジェクトでは、すべてがうまくいきます。しかし、自分の出力を印刷するときに、最初の生徒の名前が完全に表示されることはありません。私の人生では、他のすべてのループがどのように問題なく名前を生成するのかを理解し始めても、最初の反復はできません。私は間違って何をしましたか?

私は、私の問題が私の変数宣言のどこかにあるか、これについて述べています。どんな助けもありがたいです。私は他の方法を学ぶことはありません。

for (int m=0; m<numstudents; m++) { 
     printf("\n\n*****************\n\n***Report card***\n\n*****************"); 
     printf("\nName of student: %s", namestudent[m]); 
     printf("\nPhysics: %.2f/100", physicsstudent[m]); 
     printf("\nChemistry: %.2f/100", chemistrystudent[m]); 
     printf("\nMath: %.2f/100", physicsstudent[m]); 

     total = physicsstudent[m]+chemistrystudent[m]+mathstudent[m]; 
     realtotal = (total/300)*100; 
     printf("\nTotal: %.2f/300", total); 

     if(realtotal > 89) { 
      printf("\nYour letter grade: A"); 
     } else if(realtotal > 79) { 
      printf("\nYour letter grade: B"); 
     } else if(realtotal > 69) { 
      printf("\nYour letter grade: C"); 
     } else if(realtotal > 49) { 
      printf("\nYour letter grade: D"); 
     } else if((realtotal) < 50) { 
      printf("\nYour letter grade: F"); 
     } 
    } 

全体コード:

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

int main() { 
    char line[100][100], namestudent[20][20]; 
int numstudents, grade; 
float realtotal, total, physicsstudent[100], chemistrystudent[100], mathstudent[100]; 

    printf("\n***Welcome to the grade calculator***\n\n=>Press G to enter grade calculator\n\n=>Press H for help\n\nPlease enter your option: "); 
char userinput = getchar(); 

if (userinput == 'g' || userinput == 'G') { 
    printf("\nWelcome to the grade calculator\nEnter the total number of students in your class: "); 
    scanf("%d", &numstudents); 

    if (numstudents <= 0) { 
     printf("Terminating program"); 
     return(0); 
    } 

    for (int i=0; i<numstudents; i++) { 
     printf("\nPlease enter the name of student %d: ", i+1); 
     fgets(namestudent[i], sizeof(namestudent[i]), stdin); 
      namestudent[strlen(namestudent[i])-1][i] = '\0'; 
      scanf("%s", namestudent[i]); 

      printf("Please enter %s\'s Physics score (out of 100 points): ", namestudent[i]); 
     scanf("%f", &physicsstudent[i]); 

     printf("Please enter %s\'s Chemistry score (out of 100 points): ",namestudent[i]); 
     scanf("%f", &chemistrystudent[i]); 

     printf("Please enter %s\'s Math score (out of 100 points): ",namestudent[i]); 
     scanf("%f", &mathstudent[i]); 

    } 

    for (int m=0; m<numstudents; m++) { 
     printf("\n\n*****************\n\n***Report card***\n\n*****************"); 
     printf("\nName of student: %s", namestudent[m]); 
     printf("\nPhysics: %.2f/100", physicsstudent[m]); 
     printf("\nChemistry: %.2f/100", chemistrystudent[m]); 
     printf("\nMath: %.2f/100", physicsstudent[m]); 

     total = physicsstudent[m]+chemistrystudent[m]+mathstudent[m]; 
     realtotal = (total/300)*100; 
     printf("\nTotal: %.2f/300", total); 

     if(realtotal > 89) { 
      printf("\nYour letter grade: A"); 
     } else if(realtotal > 79) { 
      printf("\nYour letter grade: B"); 
     } else if(realtotal > 69) { 
      printf("\nYour letter grade: C"); 
     } else if(realtotal > 49) { 
      printf("\nYour letter grade: D"); 
     } else if((realtotal) < 50) { 
      printf("\nYour letter grade: F"); 
     } 
    } 

} else if (userinput == 'h' || userinput == 'H') { 
    printf("~~~Help~~~\n\n*After typing G, you will be entering the grade calculator\n\n1.Then, you will be asked to enter the number of students that you are going to enter grades for.\nThis will be an integer value only.\n\n2.If you enter any other character (other thaninteger), you must prompt to the user to enter a valid integer number only.\n\n3.Then the calculator asks you for the names of the students (if you entered 3 in the step 1, the loop will run for 3 times....taking 3 student names).\n\n4.Then the program will start asking for the individual scores (physics, chemistry and math in our case).\n\n5.Finally, it will print a report card with scores and the grade (calculated). I have programmed to give A, B, C and F grades only.You are free to use other grading scales as well."); 
} else { 
    printf("You entered a value that is not accepted. Terminating program"); 
} 
    return(0); 
} 

結果:その下

***************** 

***Report card*** 

***************** 
Name of student: a <--- input was 'apple' 
Physics: 90.00/100 
Chemistry: 90.00/100 
Math: 90.00/100 
Total: 270.00/300 
Your letter grade: A 

***************** 

***Report card*** 

***************** 
Name of student: orange 
Physics: 90.00/100 
Chemistry: 90.00/100 
Math: 90.00/100 
Total: 270.00/300 
Your letter grade: A 

***************** 

***Report card*** 

***************** 
Name of student: banana 
Physics: 90.00/100 
Chemistry: 90.00/100 
Math: 90.00/100 
Total: 270.00/300 
Your letter grade: A 

Process exited with code: 0 
+0

今後は、編集をスキップして追いかけます。 – KevinDTimm

+0

問題ありません。私を助ける時間をとってくれてありがとう。 – Chapo

答えて

0

fgetsおよび/または割り当てが物事をいじくるています。それらを取り出して残りの部分と同様にscanfを使用してください。

+0

私は完全な馬鹿のような料金を払っています。これらの手順を実行すると、プログラムは完璧に動作します。 – Chapo

0

コール

scanf("%d", &numstudents); 

後に改行文字が入力ストリームにまだあります。 fgetsの次の呼び出し、

fgets(namestudent[i], sizeof(namestudent[i]), stdin); 

i = 0に相当する空行と戻ります。

上記のscanf行の後に、残りの行を無視するコードを追加する必要があります。

int c; 
    while ((c = getchar()) != EOF && c != '\n'); 
+0

説明をありがとうございます。私は最近、文字列の '\ n'と '\ o'文字について学習し、それらを削除しようとしていたため、fgets部分を追加しました。スコットハンターのように、もし私が単にscanfを使うのであれば、プログラムは完璧に動作します。 – Chapo

関連する問題