成績表の作成

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
nao

成績表の作成

#1

投稿記事 by nao » 12年前

データファイル「kd13.txt」から、人数と、学生番号、3 科目(英語、数学、理科)の得点を読み込んで以下の処理を行い、結果を表示しなさい。
以下はデータの先頭部
63
101 70 60 80
102 72 67 70
103 69 42 74
104 68 64 74
問1.以下の処理はmain()を1 つで作成すること。
1.各自の3 科目の合計点、平均点
2.各自の合否の判定。合格は、英語、数学、理科の各科目すべて60 点以上の場合のみ合格とする。
3.英語、数学、理科、合計点それぞれについて全体の平均点、標準偏差を計算し表示する。
以上を処理し表示する。サブ関数、2 次元配列を利用すると、比較的楽にプログラムが作れます。
問2.問1を進化させて以下のプログラムを作成する。
4.各自の偏差値を計算する。
5.合計点が高い順に並べて処理し結果を表示する。
一応行列は作れたのですが、どうやってデータを読み込むのかがわかりません。
またどのようにプログラムを組めばいいのでしょうか。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 成績表の作成

#2

投稿記事 by みけCAT » 12年前

課題の丸投げは禁止されています。
nao さんが書きました:一応行列は作れたのですが
まずはそのプログラムを貼り付けてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

nao

Re: 成績表の作成

#3

投稿記事 by nao » 12年前

#include<stdio.h>
void set(int x[][4])
{ int i,j,k;//データ入力
for(j=0;j<63;j++){
for(k=0;k<4;k++){
scanf("%d",&x[j][k]);
printf("%d",x[j][k]);
}
printf("\n");
}
return;
}
int main (void)
{ int i,j,k,x[63][4]={0},y[63][4]={0},a[63];
set(x,a);
return(0);
}
すみません。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 成績表の作成

#4

投稿記事 by beatle » 12年前

本当に行列が作れたのでしょうか.
というより,そのプログラムはコンパイルが通って実行できるのでしょうか.

(もしコンパイルできない場合)コンパイルができないのに行列が作れた,というのはどういうことでしょうか.

それから,ソースコードはcodeタグで囲んで,必ずプレビューしてから投稿してください.
フォーラムのルールでもありますから,ご協力お願いします.

non
記事: 1097
登録日時: 13年前

Re: 成績表の作成

#5

投稿記事 by non » 12年前

>int i,j,k,x[63][4]={0},y[63][4]={0},a[63];

x,y,aの配列は何のためのものか説明願います。
non

nao

Re: 成績表の作成

#6

投稿記事 by nao » 12年前

code=c++
#include<stdio.h>
#include<math.h>
void kaku(float x[][10],int n)
{ int i,j;
for(i=0;i<n;i++){//データの表示
for(j=0;j<10;j++){
printf("%5.0f",x[j]);
}
printf("\n");

}
return;
}
void kaku2(float y[])
{
printf("英語 %4.3f 数学 %4.3f 理科 %4.3f 合計%4.3f\n",y[1],y[2],y[3],y[4]);
return;
}
void kaku3(float z[])
{
printf("標準偏差%4.3f %4.3f %4.3f %4.3f\n",z[1],z[2],z[3],z[4]);
return;
}
int main (void)
{ int i,j,k,m,o,n=63;
float x[63][10]={0},y[10]={0},z[10]={0},wa,bunsan,hensa;
for(i=0;i<n;i++){//データの入力
for(j=0;j<4;j++){
scanf_s("%f",&x[j]);
}
}
for(k=0;k<n;k++){//合計
for(m=1;m<4;m++){
x[k][4]=x[k][4]+x[k][m];
}
}
for(o=0;o<n;o++){//平均
x[o][5]=(float)x[o][4]/3;
}
for(k=0;k<n;k++){//合否
if(x[k][1]>=60&&x[k][2]>=60&&x[k][3]>=60){
x[k][6]=1;
}
else{
x[k][6]=0;
}
}
for(k=1;k<5;k++){//科目平均
wa=0;
for(m=0;m<n;m++){
wa=wa+x[m][k];
}
y[k]=wa/(n-1);
}
for(k=1;k<5;k++){//標準偏差
bunsan=0;
for(m=0;m<n;m++){
bunsan=bunsan+(x[m][k]-y[k])*(x[m][k]-y[k]);
}
bunsan=bunsan/(n-1);
z[k]=sqrt(bunsan);
}
for(k=0;k<n;k++){//偏差値
x[k][7]=(x[k][4]-y[4])/z[4]*10+50;
}
printf("番号 英語 数学 理科 合計 平均 合否 偏差値\n");
kaku(x,n);
kaku2(y);
kaku3(z);
return(0);
}
/code
一応途中までは作りました。
成績の良い順に表示するのと、合否を文字で表すのと、平均や偏差値だけを実数で表すのはどうやればいいのか困っています。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 成績表の作成

#7

投稿記事 by beatle » 12年前

codeタグの使い方に関しては,投稿前チェックリストのチェック2を御覧ください.

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 成績表の作成

#8

投稿記事 by beatle » 12年前

Visual C++ 2010でコンパイルはできましたが,kd13.txtが無いために動作検証ができません.正確な回答をするために必要ですので,添付していただけますか?

気になる点
変数i,j,k,m,oはすべてint型で,for文のカウンタ変数として使われていますが,i,jだけで統一できるはずです.カウンタ変数は一般的にi,j,k,...の先頭から使っていきますから,もし1重for文ならiを,2重for文ならi,jを使います.

科目平均を求める際に,y[k]=wa/(n-1);とやっているが,n-1ではなくてnで割るのではないでしょうか.

質問への回答
  • 成績の良い順に表示する:qsort標準関数を用いて,行列xのすべての行を成績順にソートして,上から表示します.
  • 合否を文字で表す:合否は1か0の整数で表されていますので,if文を用いて1と0で場合分けし,1と0の代わりに文字を表示します.
  • 平均や偏差値だけを実数で表す:学籍番号や個人の科目の点数は整数ですから,本来なら行列xに入れるのではなく,整数用の行列を別に作って,そこに入れる方がいいだろうと思います.行列xのまま無理にやりたいなら,int型にキャストすればいいでしょう.例えばprintf("%d\n", (int)x[j])のように.


今,ほとんどのデータは行列xに格納されていますが,一人分のデータを構造体でまとめ,構造体の配列として管理すると分かりやすいプログラムになるのではないかと思います.

nao

Re: 成績表の作成

#9

投稿記事 by nao » 12年前

このように変えてみました。
code=c++
#include<stdio.h>
#include<math.h>
void kaku(float x[][8],int n)
{ int i,j;
for(i=0;i<n;i++){//データの表示
for(j=0;j<5;j++){
printf("%3.0f ",x[j]);
}
for(j=5;j<7;j++){
printf("%3.3f ",x[j]);
}
printf("%.0f ",x[7]);
printf("\n");
}
return;
}
void kaku2(float y[])
{
printf("英語 %4.3f 数学 %4.3f 理科 %4.3f 合計%4.3f\n",y[1],y[2],y[3],y[4]);
return;
}
void kaku3(float z[])
{
printf("標準偏差%4.3f %4.3f %4.3f %4.3f\n",z[1],z[2],z[3],z[4]);
return;
}
void set(float x[][8],int n)
{ int i,j;
for(i=0;i<n;i++){//データの入力
for(j=0;j<4;j++){
scanf_s("%f",&x[j]);
}
}
return;
}
void goukei(float x[][8],int n )
{ int i,j;
for(i=0;i<n;i++){//合計
for(j=1;j<4;j++){
x[4]=x[4]+x[j];
}
}
return;
}
void heikin(float x[][8],int n)
{ int k;
for(k=0;k<n;k++){//平均
x[k][5]=(float)x[k][4]/3;
}
return;
}
void gouhi(float x[][8],int n)
{ int k;
for(k=0;k<n;k++){//合否
if(x[k][1]>=60&&x[k][2]>=60&&x[k][3]>=60){
x[k][7]=1;
}
else{
x[k][7]=0;
}
}
return;
}
void heikin2(float x[][8],int n,float y[])
{ int i,j;
float wa;
for(i=1;i<5;i++){//科目平均
wa=0;
for(j=0;j<n;j++){
wa=wa+x[j];
}
y=wa/n;
}
return;
}
void hensa(float x[][8],float y[],int n,float z[] )
{ int i,j;
float bunsan;
for(i=1;i<5;i++){//標準偏差
bunsan=0;
for(j=0;j<n;j++){
bunsan=bunsan+(x[j]-y[i])*(x[j][i]-y[i]);
}
bunsan=bunsan/(n-1);
z[i]=sqrt(bunsan);
}
return;
}
void hensati(float x[][8],float z[],int n,float y[])
{ int k;
for(k=0;k<n;k++){//偏差値
x[k][6]=(x[k][4]-y[4])/z[4]*10+50;
}
return;
}
void sort(float x[][8],int n)
{ int i,j,k;
float max;
for(j=0;j<n;j++){//成績順にする
max=0;
for(i=j+1;i<n;i++){
if(x[i][4]>x[j][4]){
for(k=0;k<8;k++){
max=x[i][k];
x[i][k]=x[j][k];
x[j][k]=max;
}
}
}
}
return;
}

int main (void)
{ int n=63;
float x[63][8]={0},y[10]={0},z[10]={0};
set(x,n);
goukei(x,n);
heikin(x,n);
gouhi(x,n);
heikin2(x,n,y);
hensa(x,y,n,z);
hensati(x,z,n,y);
sort(x,n);
kaku(x,n);
kaku2(y);
kaku3(z);
return(0);
}
/code
入力する値です。
101 70 60 80
102 72 67 70
103 69 42 74
104 68 64 74
105 69 22 86
106 67 40 76
107 73 60 78
108 75 50 75
109 84 66 84
110 64 67 79
111 72 55 84
112 76 44 75
113 64 54 76
114 70 70 82
115 72 50 74
116 65 46 72
117 87 76 95
118 71 36 59
119 70 58 81
120 64 80 76
121 66 58 54
122 67 38 75
123 68 54 84
124 62 48 86
125 73 68 74
126 53 45 60
127 2 0 5
128 78 77 82
129 72 80 78
130 72 48 84
131 70 69 78
132 74 34 91
133 70 53 72
134 65 60 80
135 60 57 74
136 67 59 80
137 82 63 70
138 78 50 89
139 72 70 91
140 67 60 65
141 74 56 81
142 33 44 55
143 69 50 81
144 58 60 78
145 64 63 71
146 54 58 56
147 76 60 71
148 76 61 85
149 67 63 76
150 80 69 73
151 76 88 94
152 87 99 92
153 65 51 80
154 81 62 87
155 54 59 91
156 77 65 87
157 69 66 81
158 62 48 71
159 81 87 70
160 100 99 100
161 0 1 0
162 50 51 52
163 77 78 76
結果です。
左から番号、英語、数学、理科、合計、平均、偏差値、合否です。
160 100 99 100 299 99.667 71.845 1
152 87 99 92 278 92.667 67.185 1
117 87 76 95 258 86.000 62.746 1
151 76 88 94 258 86.000 62.746 1
159 81 87 70 238 79.333 58.307 1
128 78 77 82 237 79.000 58.085 1
109 84 66 84 234 78.000 57.419 1
139 72 70 91 233 77.667 57.197 1
163 77 78 76 231 77.000 56.753 1
154 81 62 87 230 76.667 56.531 1
129 72 80 78 230 76.667 56.531 1
156 77 65 87 229 76.333 56.309 1
148 76 61 85 222 74.000 54.756 1
150 80 69 73 222 74.000 54.756 1
114 70 70 82 222 74.000 54.756 1
120 64 80 76 220 73.333 54.312 1
131 70 69 78 217 72.333 53.646 1
138 78 50 89 217 72.333 53.646 0
157 69 66 81 216 72.000 53.424 1
125 73 68 74 215 71.667 53.202 1
137 82 63 70 215 71.667 53.202 1
111 72 55 84 211 70.333 52.315 0
141 74 56 81 211 70.333 52.315 0
107 73 60 78 211 70.333 52.315 1
101 70 60 80 210 70.000 52.093 1
110 64 67 79 210 70.000 52.093 1
119 70 58 81 209 69.667 51.871 0
102 72 67 70 209 69.667 51.871 1
147 76 60 71 207 69.000 51.427 1
123 68 54 84 206 68.667 51.205 0
136 67 59 80 206 68.667 51.205 0
149 67 63 76 206 68.667 51.205 1
104 68 64 74 206 68.667 51.205 1
134 65 60 80 205 68.333 50.983 1
155 54 59 91 204 68.000 50.761 0
130 72 48 84 204 68.000 50.761 0
143 69 50 81 200 66.667 49.873 0
108 75 50 75 200 66.667 49.873 0
132 74 34 91 199 66.333 49.651 0
145 64 63 71 198 66.000 49.429 1
153 65 51 80 196 65.333 48.985 0
115 72 50 74 196 65.333 48.985 0
144 58 60 78 196 65.333 48.985 0
124 62 48 86 196 65.333 48.985 0
133 70 53 72 195 65.000 48.763 0
112 76 44 75 195 65.000 48.763 0
113 64 54 76 194 64.667 48.542 0
140 67 60 65 192 64.000 48.098 1
135 60 57 74 191 63.667 47.876 0
103 69 42 74 185 61.667 46.544 0
116 65 46 72 183 61.000 46.100 0
106 67 40 76 183 61.000 46.100 0
158 62 48 71 181 60.333 45.656 0
122 67 38 75 180 60.000 45.434 0
121 66 58 54 178 59.333 44.990 0
105 69 22 86 177 59.000 44.769 0
146 54 58 56 168 56.000 42.771 0
118 71 36 59 166 55.333 42.327 0
126 53 45 60 158 52.667 40.552 0
162 50 51 52 153 51.000 39.442 0
142 33 44 55 132 44.000 34.781 0
127 2 0 5 7 2.333 7.038 0
161 0 1 0 1 0.333 5.707 0
各科目と合計の平均点です
英語 67.778 数学 57.714 理科 75.079 合計200.571
標準偏差15.594 17.808 16.548 45.057
続行するには何かキーを押してください . . .

後は合否を文字で表したいのですがどうやればいいのかわからないので困っています。

アバター
沖 滉均
記事: 237
登録日時: 13年前
住所: K県F市

Re: 成績表の作成

#10

投稿記事 by 沖 滉均 » 12年前

beatle さんが書きました:codeタグの使い方に関しては,投稿前チェックリストのチェック2を御覧ください.
beatle さんが書きました:それから,ソースコードはcodeタグで囲んで,必ずプレビューしてから投稿してください.
フォーラムのルールでもありますから,ご協力お願いします.
再三注意されてるはずですがcodeタグを使用してプレビューで確認してから投稿しましょう。
ハイライトもインデントもない他人の書いた、ベタ書きのコードなんて誰も読む気になりません。

送信ボタンの横にプレビューボタンが表示されています!
それを押してcodeタグが使用できているか確認すればわかると思いますよ?
There is no royal road to learning.
codeタグで指定できる言語
画像

閉鎖

“C言語何でも質問掲示板” へ戻る