「C言語練習」 2-4.c   ・前へ   ・次へ
/* 構造体と関数   2-4.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct st_hw
{
	char name[21];
	float h;
	float w;
};

/*  2-3.cの画面表示部分を関数にする。後は同じ。*/

void st_display(int n, struct st_hw a[]);

/*  関数のprototype宣言。引数の型をきちんと書かねばならないので、( )内は上の様になる。
構造体を扱う名(=変数名)は何でもよい(mainとは無関係)。関数内で複数のdataを扱うので[]を
付けて要素数不定の配列にしている。頭のvoidは、この関数が値を返さない事を示す。

 当然の事だが、この関数宣言は構造体宣言の後に書く。*/

main()
{
	int i,j,n;
	char dmy[101],fname[50];
	struct st_hw hw[500],temp;

	FILE *fin;

	printf("* 身長と体重 *\n\nFile名を入力:");
		gets(fname);
			putchar('\n');
	fin=fopen(fname,"r");	// 入力fileを開ける。
		if (fin==NULL) {printf("File がありません!\n\nEnd\n"); exit(1);}

		i=0;
	while (! feof(fin)) {
		fgets(dmy,100,fin); dmy[strlen(dmy)-1]='\0'; 
			if (strlen(dmy)>20) dmy[20]='\0';
			strcpy(hw[i].name,dmy); 
		fscanf(fin,"%f %f",&hw[i].h,&hw[i].w);
		fgets(dmy,100,fin);

		printf("%-20s  %.1f  %.1f\n",hw[i].name,hw[i].h,hw[i].w);
		i++;
		if (i%20==0) gets(dmy);	// 表示待ち
	}

	fclose(fin);	// 入力fileを閉じる。
		n=i;

	//-----------------
		printf("\n身長順に並べ替えます。(Enter Keyを押して下さい)\n");
	for (i=0;i<n-1;i++) {
		for (j=i+1;j<n;j++) 
			if (hw[i].h>hw[j].h)
			{temp=hw[i]; hw[i]=hw[j]; hw[j]=temp;}
	}
	st_display(n,hw);	// 画面表示の関数を呼び出す

	//------------------
		printf("\n体重順に並べ替えます。(Enter Keyを押して下さい)\n");
	for (i=0;i<n-1;i++) {
		for (j=i+1;j<n;j++) 
			if (hw[i].w>hw[j].w)
			{temp=hw[i]; hw[i]=hw[j]; hw[j]=temp;}
	}
	st_display(n,hw);

	//------------------
		printf("\n名前順に並べ替えます。(Enter Keyを押して下さい)\n");
	for (i=0;i<n-1;i++) {
		for (j=i+1;j<n;j++) 
			if (strcmp(hw[i].name,hw[j].name)>0)
			{temp=hw[i]; hw[i]=hw[j]; hw[j]=temp;}
	}
	st_display(n,hw);

	//------------------

printf("\nEnd\n");
return 0;
}

//---------以下 関数-----------

void st_display(int n,struct st_hw a[])
{
	int i; char dmy[10];	// i, dmyは引数に無いので宣言する。

	for (i=0;i<n;i++) {
		if (i%20==0) gets(dmy);	// 表示待ち
		printf("%-20s  %.1f  %.1f\n",a[i].name,a[i].h,a[i].w);
	}
}


(前に戻る)   ・次へ