/* switch文 2-6.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* program中で幾つかの仕事内容をmenuとして並べ、そこから選ぶ方が簡単で便利な 事がある。そういう場合にはswitch(切り替え)文を使う。2-5.cを改変。*/ struct survey { char name[21]; float value[3]; }; void st_display (int n, struct survey a[]); void st_swap (struct survey *a, struct survey *b); main() { int i,j,n; char dmy[101],fname[50],menu[5]; //--menuは1字で良いが、文字列として5文字確保したのは入力ミスを救うため。 struct survey data[500]; FILE *fin; printf("* 身長、体重、年齢 *\n\nFile名を入力:"); gets(fname); putchar('\n'); fin=fopen(fname,"r"); 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(data[i].name,dmy); fscanf(fin,"%f %f %f",&data[i].value[0],&data[i].value[1],&data[i].value[2]); fgets(dmy,100,fin); i++; } fclose(fin); n=i; menu[0]='1'; while (menu[0] != '0' && menu[0] != '\0') { system("cls"); //--systemでOSに戻って、OSの命令を実行。cls(=clear screen)はMS-DOSの画面消去命令。 printf("\n並べ替えます [File:%s]\n\n",fname); printf("名前順 … 1\n"); printf("身長順 … 2\n"); printf("体重順 … 3\n"); printf("年齢順 … 4\n"); printf("終了 … 0\n"); gets(menu); switch (menu[0]) { /* switch文は、switch (分岐条件となる数値か文字) {case(=場合) 場合1 : ... case 場合2 : ... case 場合3 : ... default : ...} の様に書く。ここでは menu[0](=文字列menuの初めの文字)の値に対応した処理をする事になる。caseの[場合 =条件] は定数でなければならないが、数値でも文字でも可(文字も数値である)。どの 条件にも当てはまらない時にする仕事は、最後のdefault : の後に書く。不要ならば 省略可。*/ case '1' : //--これが数であれば、case 1 : の様に書く。 for (i=0;i<n-1;i++) for (j=i+1;j<n;j++) if (strcmp(data[i].name,data[j].name)>0) st_swap(&data[i],&data[j]); //-- 文字列比較(アルファベット順)には、strcmpを使う。 st_display(n,data); break; /* case は単なる標識なので、必要な仕事が終わったらbreakでswitch の範囲を抜ける。 breakがない場合、これ以降のprogramを続けて行う。*/ //----------------- case '2' : for (i=0;i<n-1;i++) for (j=i+1;j<n;j++) if (data[i].value[0]>data[j].value[0]) st_swap(&data[i],&data[j]); st_display(n,data); break; //------------------ case '3' : for (i=0;i<n-1;i++) for (j=i+1;j<n;j++) if (data[i].value[1]>data[j].value[1]) st_swap(&data[i],&data[j]); st_display(n,data); break; //------------------ case '4' : for (i=0;i<n-1;i++) for (j=i+1;j<n;j++) if (data[i].value[2]>data[j].value[2]) st_swap(&data[i],&data[j]); st_display(n,data); break; } //-- switch_end } //-- menu_while_end printf("\nEnd\n"); return 0; } //---------以下 関数----------- void st_display(int n,struct survey a[]) { int i;char dmy[10]; for (i=0;i<n;i++) { if ((i+1)%20==0) gets(dmy); printf("%-20s %.1f %.1f %.f\n", a[i].name,a[i].value[0],a[i].value[1],a[i].value[2]); } gets(dmy); //--- 表示を一旦止める。 } void st_swap (struct survey *a,struct survey *b) { struct survey temp; temp=*a; *a=*b; *b=temp; }