ページ 1 / 1
学校の課題が分かりません
Posted: 2008年10月28日(火) 23:33
by kokoro
問題文
★下記の仕様を満たすプログラムをC言語で作成しなさい
【仕様】 表計算ソフト簡易プログラム
▽ Excelのように2次元配列で10人分の3教科の素点表示する。
なお、素点は100点満点でランダムに作るものとする。
▽ その右の列に個人別の3教科の合計・平均・順位(合計点の高い学生から
順に)を表示する。なお平均は少数第1位までの表示とする。
▽ 10人分の得点データの下の行に、合計・平均・最高点・最低点の
行を作り、各行についてそれぞれ求めて表示する。
(表示例:空欄にはそれぞれ計算結果が入ることになる)
番号| 国語 数学 英語 |合計 |平均 |順位
1 | 75 35 40 | | |
2 | 69 75 82 | | |
(中 略)
10 | 57 48 36 | | |
---------------------------------------------------
合計 |
平均 |
最高 |
最低 |
順位の出し方が分かりません。
順位のプログラムはどうやって書けばいいですか?
教えてください。
とりあえず作ったプログラムは添付しておきます。
Re:学校の課題が分かりません
Posted: 2008年10月29日(水) 00:50
by kz
ソース見させていただきました。
とりあえず見たところ一つ修正点があります。
rand()%100だと100からランダムな数値の割った剰余を求めるので0~99までしかでませんね。
順位の出し方ですが、個人的に簡単な方法の例です。
0~満点をループさせる。for(i=0;i<maxscore;i++)などで
その中で一人ずつ点数を見ていって、ループ中の点数と一致していれば順位を付ける、もしくは出力する。
それを繰り返せば良いと思いますよ。
Re:学校の課題が分かりません
Posted: 2008年10月29日(水) 00:59
by Dixq (管理人)
それは「ソート」というアルゴリズムを使って並び替えをすればいいと思います。
各変数は構造体で扱いたいところですが、習っていなければまぁ配列でも出来ます。
ソートのアルゴリズムには色んなものがあります。
単純ソート、
バブルソート、
基数ソート、
ヒープソート、
クイックソート、
マージソート、、、。
その中で単純ソートが最も簡単ですので、今回はこれを使ってみましょう。
興味があれば他のソートの方法も調べてみて下さい。
単純ソートの参考にこちらを見て下さい
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:学校の課題が分かりません
Posted: 2008年10月29日(水) 01:21
by Dixq (管理人)
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:学校の課題が分かりません
Posted: 2008年10月29日(水) 04:21
by フリオ
順位付けだけです。
#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:学校の課題が分かりません
Posted: 2008年10月29日(水) 21:09
by non
まず、順位に全部1を入れます。
次に、単純ソートと同じ方法で2重ループし、総当たりで点数を比較します。
点数が小さい方の順位を+1します。
並べ替えをしないので簡単です。
Re:学校の課題が分かりません
Posted: 2008年10月30日(木) 21:45
by kokoro
nonさん
もうちょっと詳しく教えてください。
Re:学校の課題が分かりません
Posted: 2008年10月30日(木) 22:25
by box
簡単のために、人数を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位です。
おしまい。
Re:学校の課題が分かりません
Posted: 2008年10月31日(金) 00:55
by 匿名
上で回答してくれた人はスルーですか?
Re:学校の課題が分かりません
Posted: 2008年10月31日(金) 07:12
by non
boxさんの説明でわからなければ、またご質問ください。
Re:学校の課題が分かりません
Posted: 2008年10月31日(金) 14:06
by kokoro
分かりました。やってみます。
Re:学校の課題が分かりません
Posted: 2008年11月01日(土) 19:01
by kokoro
分からないところがあります。
このプログラムを実行すると、国語の最低点が「1」がないのに
「1」と表示されてしまいます。(何回しても)
同じく英語の最高点が「256」のままになってしまいます。
国語の最低点と英語の最高点がうまく表示されません。
どうしてでしょうか?教えてください。
Re:学校の課題が分かりません
Posted: 2008年11月01日(土) 19:35
by box
> total[MAX-1] += total;
> if(jp>jpmax)
> if(math>mathmax)
> if(en>enmax)
> if(jp<jpmin)
> if(math<mathmin)
> if(en<enmin)
足し込んだり、比較に使ったりする変数は、
事前にきちんと初期化しておきましょう。
Re:学校の課題が分かりません
Posted: 2008年11月01日(土) 20:19
by kokoro
わかりました!
ありがとうございます