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