「C言語練習」 2-5.c   ・前へ   ・次へ
/* ポインタ   2-5.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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);

/*  2-4.cの並べ替え部分も関数にする。後は同じ。*/

/*  関数での処理はmainとは独立なので、値を渡して並べ替えをしてもmainには反映
されない。従って、変数値の格納場所(memoryのaddress)を直接操作し、値を実際に
書き換えねばならない。
 Cには機械語(assembler)の様に、memoryを直接操作する手段(ポインタ=pointer)が
ある(ポインタの名はmemoryのaddressを直接指し示す[pointする]事から来ている)。
 addressの値を操作する(pointer変数を扱う)時には、変数値の前に(*)を付けてポイ
ンタ操作である事を明示する。ただし、いきなり今まで使っていた通常変数の前に(*)
を付ければ良い訳ではない。pointer変数は通常の変数とは別の名前で宣言しておく。

 上では st_swap関数の引数を *a, *bとしているので、この関数がaddressの値を操作
する事が分かる。main()から関数を呼び出す際は、引数 a, bに変数のaddressを渡す。
*/

/*  ポインタの説明にいきなり構造体を使ったが、整数値、実数値、文字の場合でも扱
いは全く同じである。
int *a; float *b; char *c;
等と宣言すれば、それぞれ整数型、実数型、文字型を扱うポインタを宣言した事になり、
memory操作が可能となる。当然、宣言したpointer変数には実体となる変数のaddressを
入れてやらねばならない。
*/

main()
{
	int i,j,n;
	char dmy[101],fname[50];
	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);
		printf("%-20s  %.1f  %.1f  %.f\n",
			data[i].name,data[i].value[0],data[i].value[1],data[i].value[2]);
		i++;
		if (i%20==0) gets(dmy);
	}
	fclose(fin);
		n=i;
//-----------------
		printf("\n身長順に並べ替えます。(Enter Keyを押して下さい)\n");
	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_swap関数に渡す引数には、(&)を付けて変数のaddressを渡す。*/
		st_display(n,data);
//------------------
		printf("\n体重順に並べ替えます。(Enter Keyを押して下さい)\n");
	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);
//------------------
		printf("\n年齢順に並べ替えます。(Enter Keyを押して下さい)\n");
	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);
//------------------
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%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]);
	}
}
void st_swap (struct survey *a,struct survey *b)
{	struct survey temp;	// 並べ替えの為に、一時預かりの変数tempを宣言しておく。
		temp=*a; *a=*b; *b=temp;
}


(前に戻る)   ・次へ