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