ページ 11

構造体

Posted: 2012年1月07日(土) 15:47
by sa
今構造体を使って
配列に文字を入れるプログラムを作ってるのですが
printf_profileでその構造体に入ったデータを見られるようにしました。
そこで
moziの配列の最初の文字を辞書順で小さい順に比べて
それとセットになってるnamaeの配列も一緒に小さい順に並び替えたいのですが
どうしたらいいでしょうか?

わかりずらいので例を書きます

namaeにaaa
moziにbbb
と最初に入力したら

namaeにccc
moziにaaa
と次に入力します

処理をすると
NO1
ccc
aaa

NO2
aaa
bbb
となるようにしたいです




コード:

#include<stdio.h>
typedef struct{
    char mozi[10];
    char namae[30];
}PE;
void input_profile(PE *p,int *a);
void printf_profile(PE *p,int *a);
int main(void)
{
            int i=0;
            PE c[999];
            input_profile(c,&i);
            return 0;
}

void input_profile(PE *p,int *a){	
	int c,b;
	for(b=0;999>b;b++)
	{
		
		printf("名前を入力\n");
		scanf("%s",(p+b)->namae);
		printf("文字を入力\n");
		scanf("%s",(p+b)->mozi);
		printf("入力を終えるなら0を入力してください\n続けるなら、それ以外の数字を入力してください\n");
		scanf("%d",&c);
		if(c==0)break;
	}
	b++;
	*a=b;
	printf_profile(p,a);
}

void printf_profile(PE *p,int *a)
{
	int b;
	for(b=0;*a>b;b++)
	{
		printf("NO%d\n",b+1);
		printf("文字%s\n",(p+b)->mozi);
		printf("名前%s\n",(p+b)->namae);
	}
}

Re: 構造体

Posted: 2012年1月07日(土) 15:56
by beatle
標準ライブラリのqsortに,適切な比較関数を組み合わせればできると思います.
qsortで構造体を並べ替えるサンプルはhttp://simd.jugem.jp/?eid=116にあります.

Re: 構造体

Posted: 2012年1月07日(土) 16:39
by sa
すみません
よくわからないです
関数を使わずにやる方法はありませんか?

Re: 構造体

Posted: 2012年1月07日(土) 16:43
by beatle
saさんが何かしらのソートアルゴリズムを知っているのでしたら,特に既存のソート関数を利用する必要はありません.
クイックソート,マージソート,バブルソートなどなど.
要するに,qsortが内部で行なっている処理を全部saさんが書けばいいわけです.難しいですが.

Re: 構造体

Posted: 2012年1月07日(土) 16:45
by box
私だったら、こんな風に設計します。

main関数
・入力関数を呼び出す。
・並べ替え関数を呼び出す。
・出力関数を呼び出す。

入力関数
・データの入力「だけ」を行なう。今のコードのような、入力関数の中で出力する「ことはしない」。

並べ替え関数
・データの並べ替え「だけ」を行なう。

出力関数
・データの出力「だけ」を行なう。

Re: 構造体

Posted: 2012年1月07日(土) 16:51
by non
このプログラムは学校の課題ですか、それともsaさんが自分勉強のために作っているものですか?
私も、boxさんと同じように気になるところがいろいろとあります。

Re: 構造体

Posted: 2012年1月07日(土) 16:56
by sa
学校の課題です
ソートをとりあえず調べてやってみます

Re: 構造体

Posted: 2012年1月07日(土) 17:04
by non
学校の課題なら、与えられている課題を正確に伝えてください。
例えば、関数のプロトタイプは指定されているのか。
データの入力の終わりの合図は、あのような方法を取るのは指定か。
ソートにしても何を使ってもよいのか。
すでにどんなソートを習ったのかなど。。。

Re: 構造体

Posted: 2012年1月07日(土) 17:15
by sa
バブルソートを習っています

与えられた課題の内容は
データ一覧をmoziのアルファベット順に表示するように書けという問題です

授業自体が関数を使ってはいけない傾向にあります

Re: 構造体

Posted: 2012年1月07日(土) 17:16
by beatle
関数を使ってはいけないというのは,標準関数を使うなということなのか,関数を自分で作ることさえだめなのか.どっちでしょうか.

Re: 構造体

Posted: 2012年1月07日(土) 17:22
by sa
わかりにくい回答ですみません

関数を自分で作るのは許されてます

Re: 構造体

Posted: 2012年1月07日(土) 18:01
by non
私が気になる点
1 mainの流れはboxさんのいうとおり

2 void input_profile(PE *p,int *a); は
int input_profile(PE *p);の構造の方がわかりやすい。
データ数をreturnで返す。(好き好きかもしれないが)

3 void printf_profile(PE *p,int *a); は
void printf_profile(PE *p,int a);の構造の方がわかりやすい。
aの値は変更しないので。

4 printf("入力を終えるなら0を入力してください\n続けるなら、それ以外の数字を入力してください\n"); は
名前を入力のところで、終了の合図を入れた方が、使用者が使いやすい。

5 for(b=0;999>b;b++) は、これも好き好きですが
for(b=0;b<999;b++) の方が一般的

Re: 構造体

Posted: 2012年1月07日(土) 20:10
by box
sa さんが書きました: 授業自体が関数を使ってはいけない傾向にあります
関数を自分で作るのは許されてます
printf()とかscanf()とかの標準関数を使うのはかまわないのですか?

Re: 構造体

Posted: 2012年1月07日(土) 20:13
by sa
そうですね
出来る限り自分でやりなさいということなので

学校で指定された関数は使っていいです


for scanf printf while switch if とかアスキーコードの知識は使っていいと思います