/* 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;
}