前提・実現したいこと
大学のC言語の自由課題で、簡易成績処理システムを作成しています。
<仕様>
・成績処理を行う人数を入力し、学生氏名と得点を人数分入力する。
・入力された数値を元に、平均得点、最高得点、最小得点、最高得点者の人数および氏名を出力する。
・なお、成績処理を行う人数を入力後、学生氏名と得点の入力方法を手動と自動(シミュレーター)で選択できるようにする。
・シミュレーターは乱数を取得し、その乱数に従い予め配列に格納された複数の氏名から一つを洗濯して、構造体内の変数に格納する。
・得点も同様に、乱数を用いて0~100の間で取得し構造体内の変数に格納する。
発生している問題・エラーメッセージ
コンパイル時のエラーは特にありません。
発生している問題は以下になります。
2次元配列を利用し文字列を予め格納しておき、乱数を用いてランダムに取り出す際に「佐々木」を取り出す時だけ「佐々木山口」と次の配列要素に格納されている文字まで同時に出力されます。
以下が実行結果になります。
人数を入力してください。人数=30 成績を入力します。 手動入力の場合は「m」をを入力してください。 自動入力(シミュレーション)する場合は「a」を入力してください。 a <結果一覧> Student_1_井上の点数は78 Student_2_山田の点数は24 Student_3_井上の点数は45 Student_4_佐藤の点数は79 Student_5_斎藤の点数は21 Student_6_伊藤の点数は70 Student_7_中村の点数は54 Student_8_佐々木山口の点数は14 Student_9_加藤の点数は42 Student_10_山口の点数は19 Student_11_佐藤の点数は59 Student_12_渡辺の点数は66 Student_13_鈴木の点数は10 Student_14_吉田の点数は78 Student_15_井上の点数は16 Student_16_佐々木山口の点数は90 Student_17_山口の点数は31 Student_18_井上の点数は72 Student_19_伊藤の点数は80 Student_20_小林の点数は78 Student_21_林の点数は6 Student_22_鈴木の点数は62 Student_23_高橋の点数は72 Student_24_斎藤の点数は99 Student_25_中村の点数は58 Student_26_田中の点数は4 Student_27_伊藤の点数は12 Student_28_佐々木山口の点数は23 Student_29_木村の点数は21 Student_30_高橋の点数は88 平均は49.033333である。 最大値は99.000000である。 最小値は4.000000である。 最高得点者の人数は1人です。 最高得点者は以下の通りです。 Student_24_斎藤_99.000000点
ソースコード
c
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <time.h> 5#define N 1000 6 7//構造体の定義 8struct Seiseki{ 9 char*pname;//名前を格納する(ポインタ) 10 int score;//得点を格納する 11}; 12 13//プロトタイプ宣言 14struct Seiseki input_Manual(int); 15struct Seiseki input_Auto(void); 16float calc_average(int*,struct Seiseki*); 17float calc_max(int*,struct Seiseki*); 18float calc_min(int*,struct Seiseki*); 19void output_students(int*,struct Seiseki*); 20void output_str(char*,float); 21void output_max(float,struct Seiseki*); 22 23//グローバル変数 24int highest;//最高得点者の人数を格納 25int highest_number[N];//最高得点者の番号を格納 26 27//main関数 28int main(){ 29 int number;//名前を格納する人数を格納する変数 30 int*pnumber;//numberのアドレス(ポインタ) 31 pnumber=&number; 32 float ave;//平均を格納 33 float max;//最大値を格納 34 float min;//最小値を格納 35 struct Seiseki seiseki[N]; 36 int i; 37 char str[3]; 38 char*pstr; 39 pstr=str; 40 char*pm="m"; 41 char*pa="a"; 42 srand(time(NULL)); 43 printf("人数を入力してください。人数="); 44 scanf("%d",pnumber); 45 printf("成績を入力します。\n"); 46 printf("手動入力の場合は「m」をを入力してください。\n"); 47 printf("自動入力(シミュレーション)する場合は「a」を入力してください。\n"); 48 scanf("%s",str); 49 pstr=(char*)malloc(sizeof(char)*(strlen(str)+1)); 50 strcpy(pstr,str); 51 if(strcmp(pstr,pm)==0){//手動入力の場合の処理 52 for(i=0;i<*pnumber;i++){ 53 seiseki[i]=input_Manual(i); 54 if(seiseki[i].score>=101||seiseki[i].score<0){ 55 printf("入力エラー。Scoreは0~100の間で入力してください。\n"); 56 i=i-1; 57 }; 58 }; 59 }else if(strcmp(pstr,pa)==0){//自動入力の場合の処理 60 for(i=0;i<*pnumber;i++){ 61 seiseki[i]=input_Auto(); 62 }; 63 }else{ 64 printf("入力エラー。プログラムを終了します。"); 65 return 0; 66 }; 67 ave=calc_average(pnumber,seiseki); 68 max=calc_max(pnumber,seiseki); 69 min=calc_min(pnumber,seiseki); 70 printf("<結果一覧>\n"); 71 output_students(pnumber,seiseki); 72 output_str("平均",ave); 73 output_str("最大値",max); 74 output_str("最小値",min); 75 output_max(max,seiseki); 76 return 0; 77} 78 79//input_Manual関数 80struct Seiseki input_Manual(int i){ 81 struct Seiseki temp; 82 char str[100]; 83 printf("Student_%d_Name=",i+1); 84 scanf("%s",str); 85 temp.pname=(char*)malloc(sizeof(char)*(strlen(str)+1)); 86 strcpy(temp.pname,str); 87 printf("Score="); 88 scanf("%d",&temp.score); 89 return temp; 90} 91 92//input_Auto関数 93struct Seiseki input_Auto(){ 94 struct Seiseki temp; 95 int name=0,point=0; 96 char str[20][9]={"佐藤","鈴木","高橋","田中","伊藤","渡辺","山本","中村","小林","加藤", 97 "吉田","山田","佐々木","山口","松本","井上","木村","林","斎藤","清水"}; 98 name=rand()%20;/*乱数を取得*/ 99 temp.pname=(char*)malloc(sizeof(char)*(strlen(str[name])+1)); 100 strcpy(temp.pname,str[name]); 101 point=(rand()%101); 102 temp.score=point; 103 return temp; 104} 105 106//calc_average関数(平均得点の計算) 107float calc_average(int*pnumber,struct Seiseki*seiseki){ 108 int i,j; 109 float sum,ave; 110 for(i=0;i<*pnumber;i++){ 111 sum=sum+(seiseki[i].score); 112 }; 113 j=*pnumber; 114 ave=sum/(float)j; 115 return ave; 116} 117 118//calc_max関数(最高得点の計算と最高得点者の記録) 119float calc_max(int*pnumber,struct Seiseki*seiseki){ 120 int i; 121 float max=0; 122 for(i=0; i<*pnumber; i++){ 123 if(max<(seiseki[i]).score){ 124 max=(seiseki[i].score); 125 highest=1; 126 highest_number[highest]=i+1; 127 } 128 else if(max==(seiseki[i].score)){ 129 highest=highest+1; 130 highest_number[highest]=i+1; 131 } 132 }; 133 return max; 134} 135 136//calc_min関数(最小得点を計算) 137float calc_min(int*pnumber,struct Seiseki*seiseki){ 138 int i; 139 float min=100; 140 for(i=0; i<*pnumber; i++){ 141 if(min>=(seiseki[i].score)){ 142 min=(seiseki[i].score); 143 } 144 }; 145 return min; 146} 147 148//output_students関数(学生ごとの点数を表示する関数) 149void output_students(int*pnumber,struct Seiseki*seiseki){ 150 int i; 151 for(i=0;i<*pnumber;i++){ 152 printf("Student_%d_%sの点数は%d\n",i+1,(seiseki[i].pname),(seiseki[i].score)); 153 }; 154} 155 156//output_str関数(何らかの実数を文字列とセットに表示する関数) 157void output_str(char*moziretu,float number){ 158 printf("%sは%fである。\n",moziretu,number); 159} 160 161//output_max関数(最高得点者の人数と氏名を表示する関数) 162void output_max(float max,struct Seiseki*seiseki){ 163 int i; 164 printf("最高得点者の人数は%d人です。\n",highest); 165 printf("最高得点者は以下の通りです。\n"); 166 for(i=0;i<highest;i++){ 167 printf("Student_%d_",highest_number[i+1]); 168 printf("%s",(seiseki[highest_number[i+1]-1].pname)); 169 printf("_%f点\n",max); 170 }; 171}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/25 04:07