/* 構造体と関数 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);
}
}