ランキングの処理について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
しゅんたまん
記事: 2
登録日時: 1年前

ランキングの処理について

#1

投稿記事 by しゅんたまん » 1年前

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void print_rank(double rank[],int size)
{
puts("Rank Score\n");
for(int t=0;t<size;t++){
printf("%d ・・・ %.1f\n",t+1,rank[t]);
}
}

int main (void)
{
double rank[10] = {1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,2.0,3.0};
int m=0;
int retry;
do{
print_rank(rank,10);
for (int i=1;i<4;i++)
{
int no;
int s;
printf("ターン%d\n",i);
time_t x=0;
srandom(time(NULL));
x=random() % 100+1;
printf("今日は%d~\n",x);
for (int j=1;j<100;j++)
{
printf("第%d回目の予想:",j);
scanf("%d",&no);
s=abs(no-x);
if (s==0)
{
printf("正解!");
printf("%d回目の予想で正解しました\n",j);
m=m+j;
break;
}
else if (s<=5)
{
puts("惜しいな、先に言ってよ");
}
else if (s<=10)
{
puts("もうちょいやったのにな~");
}
else{
puts("全然あかんやん~");
}
}
}
printf("3ターンで%d回の予想をしました\n",m);
printf("平均予想回数は%.4f回です\n",(double)m/3);
if((m/3.0)==1)
{
puts("やるやん");
}
else if((m/3.0)<=2)
{
puts("あほ");
}
else if((m/3.0)<=3)
{
puts("立っとれ");
}
else
{
puts("出ていけ");
}

for (int y=0; y<10; y++){
if((m/3.0)<=rank[y]){
printf("あなたは%d位です\n",y+1);
break;
}
}
if((m/3.0)>3.0){
puts("ランク外です");
}
double score=m/3.0;
rank[9]=score;
for(int z=9; rank[z-1]>rank[z]; z--){
if(rank[z-1]>rank[z]){
double tmp=rank[z];
rank[z]=rank[z-1];
rank[z-1]=tmp;
}
}
print_rank(rank,10);
printf("ゲームを続行しますか?(1:続行 0:終了)_");
scanf("%d",&retry);
}
while (retry==1);
return 0;
}

このコードに改良を加えて
・スコアのランクを求める処理を関数get_rank()として定義する処理
・ランクの更新を関数update_ranking()として定義する処理
の二つの改良を加えたコードを求めてほしいです!
解説付きですとありがたいです!!

アバター
幸尚
記事: 47
登録日時: 2年前
連絡を取る:

Re: ランキングの処理について

#2

投稿記事 by 幸尚 » 1年前

ソースを貼る場合は

コード:

で囲んでいただけると見やすくなり助かります。

また、処理系(VC++など)は何です?

コード:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void print_rank(double rank[], int size)
{
	puts("Rank Score\n");
	for (int t = 0; t < size; t++) {
		printf("%d ・・・ %.1f\n", t + 1, rank[t]);
	}
}

int main(void)
{
	double rank[10] = { 1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,2.0,3.0 };
	int m = 0;
	int retry;
	do {
		print_rank(rank, 10);
		for (int i = 1; i < 4; i++)
		{
			int no;
			int s;
			printf("ターン%d\n", i);
			time_t x = 0;
			srandom(time(NULL));
			x=random() % 100+1;
			printf("今日は%d~\n", x);
			for (int j = 1; j < 100; j++)
			{
				printf("第%d回目の予想:", j);
				scanf("%d", &no);
				s = abs(no - x);
				if (s == 0)
				{
					printf("正解!");
					printf("%d回目の予想で正解しました\n", j);
					m = m + j;
					break;
				}
				else if (s <= 5)
				{
					puts("惜しいな、先に言ってよ");
				}
				else if (s <= 10)
				{
					puts("もうちょいやったのにな~");
				}
				else {
					puts("全然あかんやん~");
				}
			}
		}
		printf("3ターンで%d回の予想をしました\n", m);
		printf("平均予想回数は%.4f回です\n", (double)m / 3);
		if ((m / 3.0) == 1)
		{
			puts("やるやん");
		}
		else if ((m / 3.0) <= 2)
		{
			puts("あほ");
		}
		else if ((m / 3.0) <= 3)
		{
			puts("立っとれ");
		}
		else
		{
			puts("出ていけ");
		}

		for (int y = 0; y < 10; y++) {
			if ((m / 3.0) <= rank[y]) {
				printf("あなたは%d位です\n", y + 1);
				break;
			}
		}
		if ((m / 3.0) > 3.0) {
			puts("ランク外です");
		}
		double score = m / 3.0;
		rank[9] = score;
		for (int z = 9; rank[z - 1] > rank[z]; z--) {
			if (rank[z - 1] > rank[z]) {
				double tmp = rank[z];
				rank[z] = rank[z - 1];
				rank[z - 1] = tmp;
			}
		}
		print_rank(rank, 10);
		printf("ゲームを続行しますか?(1:続行 0:終了)_");
		scanf("%d", &retry);
	} while (retry == 1);
	return 0;
}
ボールを違うところに投げてたらご指摘して頂けると嬉しいです(o_ _)o

アバター
幸尚
記事: 47
登録日時: 2年前
連絡を取る:

Re: ランキングの処理について

#3

投稿記事 by 幸尚 » 1年前

ソースを貼る場合は
[code][/code]
([]は半角で)
で囲んでいただけると見やすくなり助かります。
ボールを違うところに投げてたらご指摘して頂けると嬉しいです(o_ _)o

アバター
幸尚
記事: 47
登録日時: 2年前
連絡を取る:

Re: ランキングの処理について

#4

投稿記事 by 幸尚 » 1年前

コード:

		double score = m / 3.0;
		rank[9] = score;
		for (int z = 9; rank[z - 1] > rank[z]; z--) {
			if (rank[z - 1] > rank[z]) {
				double tmp = rank[z];
				rank[z] = rank[z - 1];
				rank[z - 1] = tmp;
			}
		}

上の部分を改良してそれぞれ関数化すれば良いのではないでしょうか?

あと、数字以外を入力すると予期せぬ動きをするのも修正したほうがよいですね。
ボールを違うところに投げてたらご指摘して頂けると嬉しいです(o_ _)o

アバター
幸尚
記事: 47
登録日時: 2年前
連絡を取る:

Re: ランキングの処理について

#5

投稿記事 by 幸尚 » 1年前

↑はupdate_ranking()です。

get_rank()は

コード:

		for (int y = 0; y < 10; y++) {
			if ((m / 3.0) <= rank[y]) {
				printf("あなたは%d位です\n", y + 1);
				break;
			}
		}
		if ((m / 3.0) > 3.0) {
			puts("ランク外です");
		}
ここのあたりを改良して関数化すればよいかと思います。
ボールを違うところに投げてたらご指摘して頂けると嬉しいです(o_ _)o

アバター
幸尚
記事: 47
登録日時: 2年前
連絡を取る:

Re: ランキングの処理について

#6

投稿記事 by 幸尚 » 1年前

あと気になるのが

コード:

srandom(time(NULL));
この部分をdo~while文の外に出したほうが良いですね。

詳細については
viewtopic.php?f=3&t=21531
ボールを違うところに投げてたらご指摘して頂けると嬉しいです(o_ _)o

返信

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