「C言語練習」 2-6.c   ・前へ   ・次へ
/* 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;
}


(前に戻る)   ・次へ