学校の課題が分かりません
学校の課題が分かりません
問題文
★下記の仕様を満たすプログラムをC言語で作成しなさい
【仕様】 表計算ソフト簡易プログラム
▽ Excelのように2次元配列で10人分の3教科の素点表示する。
なお、素点は100点満点でランダムに作るものとする。
▽ その右の列に個人別の3教科の合計・平均・順位(合計点の高い学生から
順に)を表示する。なお平均は少数第1位までの表示とする。
▽ 10人分の得点データの下の行に、合計・平均・最高点・最低点の
行を作り、各行についてそれぞれ求めて表示する。
(表示例:空欄にはそれぞれ計算結果が入ることになる)
番号| 国語 数学 英語 |合計 |平均 |順位
1 | 75 35 40 | | |
2 | 69 75 82 | | |
(中 略)
10 | 57 48 36 | | |
---------------------------------------------------
合計 |
平均 |
最高 |
最低 |
順位の出し方が分かりません。
順位のプログラムはどうやって書けばいいですか?
教えてください。
とりあえず作ったプログラムは添付しておきます。
★下記の仕様を満たすプログラムをC言語で作成しなさい
【仕様】 表計算ソフト簡易プログラム
▽ Excelのように2次元配列で10人分の3教科の素点表示する。
なお、素点は100点満点でランダムに作るものとする。
▽ その右の列に個人別の3教科の合計・平均・順位(合計点の高い学生から
順に)を表示する。なお平均は少数第1位までの表示とする。
▽ 10人分の得点データの下の行に、合計・平均・最高点・最低点の
行を作り、各行についてそれぞれ求めて表示する。
(表示例:空欄にはそれぞれ計算結果が入ることになる)
番号| 国語 数学 英語 |合計 |平均 |順位
1 | 75 35 40 | | |
2 | 69 75 82 | | |
(中 略)
10 | 57 48 36 | | |
---------------------------------------------------
合計 |
平均 |
最高 |
最低 |
順位の出し方が分かりません。
順位のプログラムはどうやって書けばいいですか?
教えてください。
とりあえず作ったプログラムは添付しておきます。
Re:学校の課題が分かりません
ソース見させていただきました。
とりあえず見たところ一つ修正点があります。
rand()%100だと100からランダムな数値の割った剰余を求めるので0~99までしかでませんね。
順位の出し方ですが、個人的に簡単な方法の例です。
0~満点をループさせる。for(i=0;i<maxscore;i++)などで
その中で一人ずつ点数を見ていって、ループ中の点数と一致していれば順位を付ける、もしくは出力する。
それを繰り返せば良いと思いますよ。
とりあえず見たところ一つ修正点があります。
rand()%100だと100からランダムな数値の割った剰余を求めるので0~99までしかでませんね。
順位の出し方ですが、個人的に簡単な方法の例です。
0~満点をループさせる。for(i=0;i<maxscore;i++)などで
その中で一人ずつ点数を見ていって、ループ中の点数と一致していれば順位を付ける、もしくは出力する。
それを繰り返せば良いと思いますよ。
Re:学校の課題が分かりません
それは「ソート」というアルゴリズムを使って並び替えをすればいいと思います。 各変数は構造体で扱いたいところですが、習っていなければまぁ配列でも出来ます。 ソートのアルゴリズムには色んなものがあります。 単純ソート、 バブルソート、 基数ソート、 ヒープソート、 クイックソート、 マージソート、、、。 その中で単純ソートが最も簡単ですので、今回はこれを使ってみましょう。 興味があれば他のソートの方法も調べてみて下さい。 単純ソートの参考にこちらを見て下さい http://lecture.ecc.u-tokyo.ac.jp/~cichi ... -12-1.html 並び替えを行うと順番はぐちゃぐちゃになってしまうので、 順番の情報つまり、各情報にIDをつけてからソートすればいいと思います。 そこで int score[10], id[10] の2つを用意しました。 並び替えの途中、値を交換する時は、このID情報も交換しています。 下を見て下さい。 #include<stdio.h> #include<stdlib.h> #include<time.h> /* 受け取った2つの値を交換する関数 */ void swap(int *a, int *b){ int t = *b; *b = *a; *a = t; } int main(void){ int i, j; int score[10],id[10]; srand((unsigned)time(NULL)); printf("-- ソート前 --\n"); for(i=0; i<10; i++){ score = rand()%100;//適当な値を入れる id = i;//最初の昇順番号をIDとして入れる printf("[%2d] : %d\n", id, score); } printf("--------------\n"); /* ソート開始 */ for(i=0; i<10-1; i++){ for(j=i+1; j<10; j++){ if (score < score[j]) { swap(&score , &score[j]);//値の交換 swap(&id , &id[j]);//値の交換 } } } /* ソート終了 */ printf("-- ソート後 --\n"); for(i=0; i<10; i++){ printf("[%2d] : %d\n", id, score); } printf("--------------\n"); return 0; } 実行結果 -- ソート前 -- [ 0] : 28 [ 1] : 84 [ 2] : 78 [ 3] : 96 [ 4] : 14 [ 5] : 46 [ 6] : 27 [ 7] : 57 [ 8] : 97 [ 9] : 5 -------------- -- ソート後 -- [ 8] : 97 [ 3] : 96 [ 1] : 84 [ 2] : 78 [ 7] : 57 [ 5] : 46 [ 0] : 28 [ 6] : 27 [ 4] : 14 [ 9] : 5 -------------- ソート後に表示された左側がIDです。 ソート前の値と見比べてみて下さい。 IDに対するスコアの値の関係は同じです。 こうすることでIDと順位が計算できるのではないでしょうか。
Re:学校の課題が分かりません
IDと順位の対応がわかりにくいかもしれませんので、
順位を発表する方法を追記します。
一番最後のソート後表示のところのみ変更しています。
ソートした通りに表示するのではなく、
最初の表示の横に順位を表示するようにしてあります。
これでどうでしょうか。
順位を発表する方法を追記します。
一番最後のソート後表示のところのみ変更しています。
ソートした通りに表示するのではなく、
最初の表示の横に順位を表示するようにしてあります。
#include<stdio.h> #include<stdlib.h> #include<time.h> /* 受け取った2つの値を交換する関数 */ void swap(int *a, int *b){ int t = *b; *b = *a; *a = t; } int main(void){ int i, j; int score[10],id[10]; srand((unsigned)time(NULL)); printf("-- ソート前 --\n"); for(i=0; i<10; i++){ score = rand()%100;//適当な値を入れる id = i;//最初の昇順番号をIDとして入れる printf("[%2d] : %2d\n", id, score); } printf("--------------\n"); /* ソート開始 */ for(i=0; i<10-1; i++){ for(j=i+1; j<10; j++){ if (score < score[j]) { swap(&score , &score[j]);//値の交換 swap(&id , &id[j]);//値の交換 } } } /* ソート終了 */ /* printf("-- ソート後 --\n"); for(i=0; i<10; i++){ printf("[%2d] : %d\n", id, score); } printf("--------------\n"); */ printf("-- 順位発表! --\n"); for(i=0; i<10; i++){ for(j=0 ; j<10 ; j++){ if(i == id[j]){ printf("[%2d] : %2d -> %2d位\n", id[j], score[j], j+1); break; } } } printf("----------------\n"); return 0; } 実行結果 -- ソート前 -- [ 0] : 48 [ 1] : 20 [ 2] : 55 [ 3] : 35 [ 4] : 74 [ 5] : 63 [ 6] : 84 [ 7] : 75 [ 8] : 13 [ 9] : 93 -------------- -- 順位発表! -- [ 0] : 48 -> 7位 [ 1] : 20 -> 9位 [ 2] : 55 -> 6位 [ 3] : 35 -> 8位 [ 4] : 74 -> 4位 [ 5] : 63 -> 5位 [ 6] : 84 -> 2位 [ 7] : 75 -> 3位 [ 8] : 13 -> 10位 [ 9] : 93 -> 1位 ----------------
これでどうでしょうか。
Re:学校の課題が分かりません
順位付けだけです。
#include <stdio.h> #include <stdlib.h> #include <time.h> #define RAND (101 * (rand() / (RAND_MAX + 1.0))) void Init(int student[/url][2]) { int i, j; srand((unsigned)time(NULL)); for(i = 0; i < 10; i ++){ for(j = 0; j < 3; j ++) student[0] = RAND; } } void Sort(int student[/url][2], int rank[/url]) { int i, j; for(i = 0; i < 9; i ++){ for(j = 9; j > i; j --){ if(student[rank[j]][0] > student[rank[j - 1]][0]){ int tmp = rank[j]; rank[j] = rank[j - 1]; rank[j - 1] = tmp; } } } } void Rank(int student[/url][2]) { int rank[10], i; for(i = 0; i < 10; i ++) rank = i; Sort(student, rank); student[rank[0]][1] = 1; for(i = 1; i < 10; i ++){ if(student[rank][0] == student[rank][0]){ student[rank][1] = student[rank][1]; } else student[rank][1] = i + 1; } } void Print(int student[/url][2]) { int i; for(i = 0; i < 10; i ++) printf("%3d %3d\n", student[0], student[1]); } int main(void) { int student[10][2]; Init(student); Rank(student); Print(student); return 0; }
Re:学校の課題が分かりません
まず、順位に全部1を入れます。
次に、単純ソートと同じ方法で2重ループし、総当たりで点数を比較します。
点数が小さい方の順位を+1します。
並べ替えをしないので簡単です。
次に、単純ソートと同じ方法で2重ループし、総当たりで点数を比較します。
点数が小さい方の順位を+1します。
並べ替えをしないので簡単です。
Re:学校の課題が分かりません
簡単のために、人数を4人とします。
各人の点数を、50点、30点、90点、70点とします。
まず、全員の順位を1位とします。
50点と30点を比べます。30点の方が小さいので、順位に1を加えます。
この時点では、50点:1位、30点:2位、90点:1位、70点:1位です。
50点と90点を比べます。50点の方が小さいので、順位に1を加えます。
この時点では、50点:2位、30点:2位、90点:1位、70点:1位です。
50点と70点を比べます。50点の方が小さいので、順位に1を加えます。
この時点では、50点:3位、30点:2位、90点:1位、70点:1位です。
30点と90点を比べます。30点の方が小さいので、順位に1を加えます。
この時点では、50点:3位、30点:3位、90点:1位、70点:1位です。
30点と70点を比べます。30点の方が小さいので、順位に1を加えます。
この時点では、50点:3位、30点:4位、90点:1位、70点:1位です。
90点と70点を比べます。70点の方が小さいので、順位に1を加えます。
この時点では、50点:3位、30点:4位、90点:1位、70点:2位です。
おしまい。
各人の点数を、50点、30点、90点、70点とします。
まず、全員の順位を1位とします。
50点と30点を比べます。30点の方が小さいので、順位に1を加えます。
この時点では、50点:1位、30点:2位、90点:1位、70点:1位です。
50点と90点を比べます。50点の方が小さいので、順位に1を加えます。
この時点では、50点:2位、30点:2位、90点:1位、70点:1位です。
50点と70点を比べます。50点の方が小さいので、順位に1を加えます。
この時点では、50点:3位、30点:2位、90点:1位、70点:1位です。
30点と90点を比べます。30点の方が小さいので、順位に1を加えます。
この時点では、50点:3位、30点:3位、90点:1位、70点:1位です。
30点と70点を比べます。30点の方が小さいので、順位に1を加えます。
この時点では、50点:3位、30点:4位、90点:1位、70点:1位です。
90点と70点を比べます。70点の方が小さいので、順位に1を加えます。
この時点では、50点:3位、30点:4位、90点:1位、70点:2位です。
おしまい。
Re:学校の課題が分かりません
分からないところがあります。
このプログラムを実行すると、国語の最低点が「1」がないのに
「1」と表示されてしまいます。(何回しても)
同じく英語の最高点が「256」のままになってしまいます。
国語の最低点と英語の最高点がうまく表示されません。
どうしてでしょうか?教えてください。
このプログラムを実行すると、国語の最低点が「1」がないのに
「1」と表示されてしまいます。(何回しても)
同じく英語の最高点が「256」のままになってしまいます。
国語の最低点と英語の最高点がうまく表示されません。
どうしてでしょうか?教えてください。
Re:学校の課題が分かりません
> total[MAX-1] += total; > if(jp>jpmax) > if(math>mathmax) > if(en>enmax) > if(jp<jpmin) > if(math<mathmin) > if(en<enmin) 足し込んだり、比較に使ったりする変数は、 事前にきちんと初期化しておきましょう。