学校の課題が分かりません

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

学校の課題が分かりません

#1

投稿記事 by kokoro » 16年前

問題文
  ★下記の仕様を満たすプログラムをC言語で作成しなさい
  【仕様】 表計算ソフト簡易プログラム

  ▽ Excelのように2次元配列で10人分の3教科の素点表示する。
    なお、素点は100点満点でランダムに作るものとする。
  ▽ その右の列に個人別の3教科の合計・平均・順位(合計点の高い学生から
    順に)を表示する。なお平均は少数第1位までの表示とする。
  ▽ 10人分の得点データの下の行に、合計・平均・最高点・最低点の
    行を作り、各行についてそれぞれ求めて表示する。

   (表示例:空欄にはそれぞれ計算結果が入ることになる)

番号|  国語 数学 英語      |合計  |平均  |順位

  1  |  75   35   40     |      |    |
    
 2  |  69  75   82       |      |    |
        (中    略)
 10 |  57  48   36        |      |    |
---------------------------------------------------
合計 |

平均 |

最高 |

最低 |

順位の出し方が分かりません。
順位のプログラムはどうやって書けばいいですか?
教えてください。

とりあえず作ったプログラムは添付しておきます。

kz

Re:学校の課題が分かりません

#2

投稿記事 by kz » 16年前

ソース見させていただきました。

とりあえず見たところ一つ修正点があります。

rand()%100だと100からランダムな数値の割った剰余を求めるので0~99までしかでませんね。

順位の出し方ですが、個人的に簡単な方法の例です。

0~満点をループさせる。for(i=0;i<maxscore;i++)などで

その中で一人ずつ点数を見ていって、ループ中の点数と一致していれば順位を付ける、もしくは出力する。
それを繰り返せば良いと思いますよ。

Dixq (管理人)

Re:学校の課題が分かりません

#3

投稿記事 by Dixq (管理人) » 16年前

それは「ソート」というアルゴリズムを使って並び替えをすればいいと思います。
各変数は構造体で扱いたいところですが、習っていなければまぁ配列でも出来ます。

ソートのアルゴリズムには色んなものがあります。
単純ソート、
バブルソート、
基数ソート、
ヒープソート、
クイックソート、
マージソート、、、。
その中で単純ソートが最も簡単ですので、今回はこれを使ってみましょう。
興味があれば他のソートの方法も調べてみて下さい。

単純ソートの参考にこちらを見て下さい
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と順位が計算できるのではないでしょうか。
 

Dixq (管理人)

Re:学校の課題が分かりません

#4

投稿記事 by Dixq (管理人) » 16年前

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:学校の課題が分かりません

#5

投稿記事 by フリオ » 16年前

 
 順位付けだけです。
#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;
}

non

Re:学校の課題が分かりません

#6

投稿記事 by non » 16年前

まず、順位に全部1を入れます。
次に、単純ソートと同じ方法で2重ループし、総当たりで点数を比較します。
点数が小さい方の順位を+1します。
並べ替えをしないので簡単です。

kokoro

Re:学校の課題が分かりません

#7

投稿記事 by kokoro » 16年前

nonさん

もうちょっと詳しく教えてください。

box

Re:学校の課題が分かりません

#8

投稿記事 by box » 16年前

簡単のために、人数を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:学校の課題が分かりません

#9

投稿記事 by 匿名 » 16年前

上で回答してくれた人はスルーですか?

non

Re:学校の課題が分かりません

#10

投稿記事 by non » 16年前

boxさんの説明でわからなければ、またご質問ください。

kokoro

Re:学校の課題が分かりません

#11

投稿記事 by kokoro » 16年前

分かりました。やってみます。

kokoro

Re:学校の課題が分かりません

#12

投稿記事 by kokoro » 16年前

分からないところがあります。

このプログラムを実行すると、国語の最低点が「1」がないのに
「1」と表示されてしまいます。(何回しても)

同じく英語の最高点が「256」のままになってしまいます。
国語の最低点と英語の最高点がうまく表示されません。

どうしてでしょうか?教えてください。

box

Re:学校の課題が分かりません

#13

投稿記事 by box » 16年前

>		total[MAX-1] += total;
>		if(jp>jpmax)
>		if(math>mathmax)
>		if(en>enmax)
>		if(jp<jpmin)
>		if(math<mathmin)
>		if(en<enmin)

足し込んだり、比較に使ったりする変数は、
事前にきちんと初期化しておきましょう。

kokoro

Re:学校の課題が分かりません

#14

投稿記事 by kokoro » 16年前

わかりました!

ありがとうございます

閉鎖

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