C言語関係掲示板

過去ログ

No.500.構造体のソート

[戻る] [ホームページ]
No.3761

ソーティング上手くいきません
投稿者---由兎(2002/12/09 00:45:50)


#include <stdio.h>
#define SIZE 100

void swap( char *x, char *y )
{
char tmp;

tmp = *x;
*x = *y;
*y = tmp;
}

main()
{
char fname[40];
FILE *fp;
int datanum;
int i,k,n;
char name[20];
int age;
float max;
float weight, height;

printf("ファイル名を入力してください:");
scanf("%s", fname );

if( !(fp = fopen( fname, "r")) )
{
printf("File <%s> not found!\n", fname );
exit(1);
}

fscanf(fp, "%d", &datanum );

for( i = 0; i < datanum; i++ )
{
fscanf(fp, "%s", name );
fscanf(fp, "%d", &age );
fscanf(fp, "%f", &weight );
fscanf(fp, "%f", &height );
printf("氏名:%s 年齢:%3d 体重:%5.1f 身長:%6.1f\n",
name, age, weight, height );
}

printf("\n");
printf("ソートしています!\n\n");

for( n = datanum; n >= 2; n-- )
{
max = name[k = 0];
for( i = 1; i < n; i++ )
if( name[i] > max )
max = name[k = i];
swap(&name[k], &name[n-1]);
}

for( i = 0; i < datanum; i++ )
{
fscanf(fp, "%s", name );
fscanf(fp, "%d", &age );
fscanf(fp, "%f", &weight );
fscanf(fp, "%f", &height );
printf("氏名:%s 年齢:%3d 体重:%5.1f 身長:%6.1f\n",
name, age, weight, height );
}
fclose(fp);
}

ファイルから読み込んだデータを年齢順にソーティングしたいのですが
どうしたらいいでしょうか?
ファイルは↓のをtxtファイルに書き込んで使用してます。
3
山田太郎 18 80.0 170.0
鈴木健史 17 75.0 175.0
佐藤博司 19 90.0 180.0



No.3830

Re:ソーティング上手くいきません
投稿者---ともじ(2002/12/12 21:56:18)


こんばんは。どこが間違っているか、よく見比べてください。

#include <stdio.h>
#include <stdlib.h>
#define SIZE 100

typedef struct {
	char name[20];
	int age;
	float weight, height;
} Student;

void swap( Student *x, Student *y )
{
	Student tmp;

	tmp = *x;
	*x = *y;
	*y = tmp;
}

int main(void)
{
	char fname[40];
	FILE *fp;
	int datanum;
	int i,k,n;
	Student s[SIZE];
	float max;


	printf("ファイル名を入力してください:");
	scanf("%s", fname );

	if( (fp = fopen( fname, "r")) == NULL )
	{
		printf("File <%s> not found!\n", fname );
		exit(1);
	}

	fscanf(fp, "%d", &datanum );

	if (datanum > SIZE) {
		printf("size over!\n");
		fclose(fp);
		exit (1);
	}

	for( i = 0; i < datanum; i++ )
	{
		fscanf(fp, "%s", s[i].name );
		fscanf(fp, "%d", &s[i].age );
		fscanf(fp, "%f", &s[i].weight );
		fscanf(fp, "%f", &s[i].height );
		printf("氏名:%s 年齢:%3d 体重:%5.1f 身長:%6.1f\n",
			s[i].name, s[i].age, s[i].weight, s[i].height );
	}

	printf("\n");
	printf("ソートしています!\n\n");

	for( n = datanum - 1; n >= 1; n-- )
	{
		for( i = 1; i <= n; i++ )
			if( s[i].age < s[i-1].age )
				swap(&s[i], &s[i-1]);
	}

	for( i = 0; i < datanum; i++ )
	{
		printf("氏名:%s 年齢:%3d 体重:%5.1f 身長:%6.1f\n",
			s[i].name, s[i].age, s[i].weight, s[i].height );
	}
	fclose(fp);
	
	return (0);
}


No.3908

Re:ソーティング上手くいきません
投稿者---由兎(2002/12/17 01:13:46)


返事ありがとうございます。
もう一つ聞きたいことがあるのですが、
最後の身長部分を書き込まずに次の人の
データを書き込むにはどうしたら良いでしょうか?
左のデータを使い右のような実行結果にしたいです。
山田太郎 18 80.0 170.0   山田太郎 18 80.0
鈴木健史 17 75.0 175.0 → 鈴木健史 17 75.0
佐藤博司 19 90.0 180.0 佐藤博司 19 90.0


No.3937

Re:ソーティング上手くいきません
投稿者---おぐら(2002/12/18 00:21:59)


ソースを見て思ったのですが、ソート後の出力で、身長を出力しないように
すればよいのではないですか。
そうすれば、身長がでないと思いますが。
間違っていたらすみません。