構造体

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

構造体

#1

投稿記事 by sa » 14年前

今構造体を使って
配列に文字を入れるプログラムを作ってるのですが
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);
	}
}

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 構造体

#2

投稿記事 by beatle » 14年前

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

sa

Re: 構造体

#3

投稿記事 by sa » 14年前

すみません
よくわからないです
関数を使わずにやる方法はありませんか?

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 構造体

#4

投稿記事 by beatle » 14年前

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

box
記事: 2002
登録日時: 15年前

Re: 構造体

#5

投稿記事 by box » 14年前

私だったら、こんな風に設計します。

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

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

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

出力関数
・データの出力「だけ」を行なう。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

non
記事: 1097
登録日時: 15年前

Re: 構造体

#6

投稿記事 by non » 14年前

このプログラムは学校の課題ですか、それともsaさんが自分勉強のために作っているものですか?
私も、boxさんと同じように気になるところがいろいろとあります。
non

sa

Re: 構造体

#7

投稿記事 by sa » 14年前

学校の課題です
ソートをとりあえず調べてやってみます

non
記事: 1097
登録日時: 15年前

Re: 構造体

#8

投稿記事 by non » 14年前

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

sa

Re: 構造体

#9

投稿記事 by sa » 14年前

バブルソートを習っています

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

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

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 構造体

#10

投稿記事 by beatle » 14年前

関数を使ってはいけないというのは,標準関数を使うなということなのか,関数を自分で作ることさえだめなのか.どっちでしょうか.

sa

Re: 構造体

#11

投稿記事 by sa » 14年前

わかりにくい回答ですみません

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

non
記事: 1097
登録日時: 15年前

Re: 構造体

#12

投稿記事 by non » 14年前

私が気になる点
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++) の方が一般的
non

box
記事: 2002
登録日時: 15年前

Re: 構造体

#13

投稿記事 by box » 14年前

sa さんが書きました: 授業自体が関数を使ってはいけない傾向にあります
関数を自分で作るのは許されてます
printf()とかscanf()とかの標準関数を使うのはかまわないのですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

sa

Re: 構造体

#14

投稿記事 by sa » 14年前

そうですね
出来る限り自分でやりなさいということなので

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


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

閉鎖

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