構造体などなど

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

構造体などなど

#1

投稿記事 by C言語リアン » 13年前

C言語でインベーダーゲーム作ってるんですけどランキングの表示のプログラムがネットにあり使って見ようと思ってやったんですがこのプログラムの構造体はどうかけばいいんですか?
あと構造体に子のゲームをやった人の点数を格納してそれを点数の大きい順に並び替えるのってどうするんですか?

int ranking(int key,int x,int y)
{
int loop=0;


for (loop=0;loop<5;++loop)
{
rank.score[loop]=(5-loop)*10;
rank.name[loop]="someone";
}

for (loop=0;loop<5;++loop)
{
if(rank.score[loop]<thescore)
{
ranking(loop);
}
}

return 0;
}
void special_key2(int key, int x, int y)
{
if(game.state == START)
{
switch( key )
{
case GLUT_KEY_LEFT: // 左矢印
if(battery.position.x > BATTERY_POSITION_MIN)
battery.position.x -= BATTERY_MOVE_DISTANCE;
break;

case GLUT_KEY_RIGHT: // 右矢印
if(battery.position.x < BATTERY_POSITION_MAX)
battery.position.x += BATTERY_MOVE_DISTANCE;
break;

default:
break;
}
}
}

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

Re: 構造体などなど

#2

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

コードはcodeタグで囲んでいただけると助かります。
C言語リアン さんが書きました:このプログラムの構造体はどうかけばいいんですか?
一番シンプルなランキングの構造体は

コード:

typedef struct {
    int score;
    char* name;
} rank_t;
だと思います。
C言語リアン さんが書きました:あと構造体に子のゲームをやった人の点数を格納してそれを点数の大きい順に並び替えるのってどうするんですか?
qsort関数を使うと楽だと思います。
サンプルは

コード:

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

typedef struct {
    int score;
    char* name;
} rank_t;

int comp(const void* x,const void* y) {
	rank_t* a=(rank_t*)x;
	rank_t* b=(rank_t*)y;
	if(a->score<b->score)return 1;
	if(a->score>b->score)return -1;
	return 0;
}

int main(void) {
	rank_t rank[5];
	int i;
	rank[0].score=100;
	rank[0].name="石田彰";
	rank[1].score=500;
	rank[1].name="関智一";
	rank[2].score=200;
	rank[2].name="三木眞一郎";
	rank[3].score=1000;
	rank[3].name="宮田幸季";
	rank[4].score=700;
	rank[4].name="保志総一朗";
	qsort(rank,5,sizeof(rank_t),comp);
	for(i=0;i<5;i++) {
		printf("%5d %s\n",rank[i].score,rank[i].name);
	}
	return 0;
}
こんな感じです。

コードをよく読んでいないので、合わなかったらすみません。

コード:

rank.name[loop]="someone";
この代入の仕方ができるようにポインタを使っていますが、
ランキングを保存する事を考えると、ポインタではなくchar型の配列で名前を保存したほうがいいです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 構造体などなど

#3

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

すいません。
このプログラムなら、ランキングの構造体は

コード:

#define RANKING_MAX 10 /*ランキングの最大数*/
typedef sturct {
    int score[RANKING_MAX];
    char* name[RANKING_MAX];
} rank_t;
ですね。
この場合qsortでやるのは無理だと思います。
ソートのアルゴリズムを学んでください。
サイト例→http://www.ics.kagoshima-u.ac.jp/~fuchi ... algorithm/
交換するときに、scoreとnameのそれぞれ同じ位置同士を一緒に交換します。
比較するのはscoreです。

あと、どこのサイトを参考にしたかも教えてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 構造体などなど

#4

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

提示されたプログラムは、矛盾しているようです。

コード:

int ranking(int key,int x,int y)

コード:

ranking(loop);
ranking関数の定義と呼び出し方が異なります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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