/* ポインタ 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;
}