#include <stdio.h> #define FILE_IA1 "iarray1.txt" /* ファイル名 */ #define ISIZE1 512 /* 配列の要素数 */ void input10_ia1();/* 10進数入力の配列に追加する繰り返しで、数字以外の入力で終わる , 個数icount1も更新 */ void disp10_ia1();/* 添え字 とそれが指し示すデータの10進数を改行とともに出力 */ void save_ia1();/* 配列のデータを改行で区切って指定ファイルへ出力 */ void load_ia1();/* 指定ファイルがあれば、配列へ先頭から順次読み込む , 個数icount1も更新 */ /* 以下の2つが、ここで使うグローバル記憶域 */ int iarray1[ISIZE1]; int icount1=0; /*-----------------------------------------------------------------------------グローバル記憶域定義 終了*/ /* 10進数入力の配列に追加する繰り返しで、数字以外の入力で終わる , 個数icount1も更新 */ void input10_ia1() { while(icount1 < ISIZE1){ /* 配列のアクセス範囲を超えない制限の繰り返し */ printf("%d:DATA>", icount1); if( fscanf(stdin, "%d", & iarray1[icount1]) != 1) break; icount1++; } fflush(stdin); /* 入力バッファに残っている情報を破棄する */ } /*-----------------------------------------------------------------------------関数定義 終了*/ /* 添え字 とそれが指し示すデータの10進数を改行とともに出力 */ void disp10_ia1() { int i = 0; for(i = 0; i < icount1; i++){ printf("%d:%d\n",i, iarray1[i]); } } /*-----------------------------------------------------------------------------関数定義 終了*/ /* 配列のデータを改行で区切って指定ファイルへ出力 */ void save_ia1() { int i; FILE *fpw = fopen( FILE_IA1 , "w" ); for(i = 0; i < icount1; i++){ fprintf(fpw, "%d\n",iarray1[i]); } fclose(fpw); } /*-----------------------------------------------------------------------------関数定義 終了*/ /* 指定ファイルがあれば、配列へ先頭から順次読み込む , 個数icount1も更新 */ void load_ia1() { FILE *fpr; icount1 = 0; fpr= fopen( FILE_IA1 , "r" ); if( fpr != NULL ){ while( fscanf(fpr ,"%d", iarray1 + icount1 ) == 1){ icount1++; } fclose(fpr); } } /*-----------------------------------------------------------------------------関数定義 終了*/ /* 小規模作品 */ /* FILE_IA1のファイルに対して、新規キー入力データ追加、データ件数確認、保存 */ kensaku_a1() { int i; /* 添え字 */ int value; /* 数えたい値 */ int ia[100]; /* 見つかった添え字を記憶する配列 */ int n = 0; /* 個数 */ load_ia1(); /* ファイルから配列へ読み込み */ disp10_ia1(); /* 配列データの表示 */ input10_ia1(); /* キー入力の追加 */ disp10_ia1(); /* 配列データの表示 */ /* 数えたい値を入力して、そのデータがある数を計数する */ printf("数えたい値>"); scanf("%d", & value ); for( i = 0; i < icount1; i++){ if(value == iarray1[i]){ ia[n] = i; /* 見つかった添え字を記憶 */ n++; } } for(i = n -1; i >= 0; i--){ printf("%dの添え字に見つかりました。\n", ia[i]); } if(n == 0){ printf(" %dの値は、見つかりませんでした。\n", value ); } else { printf(" %dの値は、%d個ありました。\n", value, n ); } save_ia1(); /* 配列からファイルへ書き込み */ } /*-----------------------------------------------------------------------------関数定義 終了*/ /* 小規模作品 */ /* FILE_IA1のファイルに対して、データ位置交換を繰り返し、保存 */ void koukan_a1() { int i1, i2; /* 交換用の添え字 */ int work; /* 交換用作業変数 */ load_ia1(); /* ファイルから配列へ読み込み */ for(;;){ disp10_ia1(); /* 配列データの表示 */ printf("交換位置の添え字を2つ入力>"); fscanf(stdin , "%d" , & i1); if(i1 < 0) break; fscanf(stdin , "%d" , & i2); if(i1 >= icount1 || i2 < 0 || i2 >= icount1) { printf("添え字の入力が範囲外です\n"); continue; } work = iarray1[i1]; /* 交換 */ iarray1[i1] = iarray1[i2]; iarray1[i2] = work; } save_ia1(); /* 配列からファイルへ書き込み */ } /*-----------------------------------------------------------------------------関数定義 終了*/ /* 小規模作品 */ /* FILE_IA1のファイルに対して、データ集計 */ void syuukei_a1() { int i, k; /* 添え字 */ int a[100];/* 見つかったデータを記憶する記憶する配列 */ int kei[100]; /* 集計用配列 */ int count = 0; /* 個数 */ load_ia1(); /* ファイルから配列へ読み込み */ disp10_ia1(); /* 配列データの表示 */ for( i = 0; i < icount1; i++){ /* iarray1[i] が aの配列にあるか?*/ for( k = 0; k < count; k++){ if(a[k] == iarray1[i]) break;/* あった(発見)。*/ } if(k >= count){ //見つからないので、記憶 a[count] = iarray1[i]; kei[count] = 1; // 最初の1件 count++; } else {// iに見つかっている。 kei[k]++; } } for(k = 0; k < count; k++){ printf("%dは、%d個ありました。\n", a[k] , kei[k]); } } /*-----------------------------------------------------------------------------関数定義 終了*/ /* dのデータ個数を返す */ int count_a1(int d) { int cn = 0; //計数用変数 int i = 0; while(i < icount1){ if(iarray1[i] == d){ cn++; } i++; } return cn; } /*-----------------------------------------------------------------------------関数定義 終了*/ /* dのデータ個数を返すcount_a1確認プログラム */ void main_i1() { int value; /* 数えたい値 */ int count; /* 計数値 */ load_ia1(); /* ファイルから配列へ読み込み */ disp10_ia1(); /* 配列データの表示 */ printf("数えたい値>"); scanf("%d", & value ); count = count_a1( value );/* 個数計数用関数を使っている*/ if(count == 0){ printf(" %dの値は、見つかりませんでした。\n", value ); } else { printf(" %dの値は、%d個ありました。\n", value, count ); } } /*-----------------------------------------------------------------------------関数定義 終了*/ /* iarray1配列内で、二つの要素の記憶内容を交換 */ void swap_ia1(int i1, int i2) { int work; /* 交換用作業変数 */ work = iarray1[i1]; /* 交換 */ iarray1[i1] = iarray1[i2]; iarray1[i2] = work; } /*-----------------------------------------------------------------------------関数定義 終了*/ /* 要素の記憶内容を交換するswap_ia1確認プログラム */ void main_i2() { int i1, i2; /* 交換用の添え字 */ load_ia1(); /* ファイルから配列へ読み込み */ for(;;){ disp10_ia1(); /* 配列データの表示 */ printf("交換位置の添え字を2つ入力>"); fscanf(stdin , "%d" , & i1); if(i1 < 0) break; fscanf(stdin , "%d" , & i2); if( ! (i1 < icount1 && i2 >= 0 && i2 < icount1) ) { printf("添え字の入力が範囲外です\n"); continue; } swap_ia1(i1,i2); /* 交換 */ } save_ia1(); /* 配列からファイルへ書き込み */ } /*-----------------------------------------------------------------------------関数定義 終了*/ /* d のデータを、iarray1 配列内で、idxの指し示す位置から探す。 */ /* 見つかった時は、その添え字を返す。 見つからないなら -1を返す */ int indexof_ia1(int d, int idx) { while(idx < icount1 && d != iarray1[idx]){ idx++; } if(d == iarray1[idx]) { return idx;/* 見つかった */ } return -1; /* 見つからない */ } /*-----------------------------------------------------------------------------関数定義 終了*/ /* 検索関数 indexof_ia1の確認プログラム */ void main_i3() { int value; /* 数えたい値 */ int idx = 0; /* 探し始める配列内の位置 */ load_ia1(); /* ファイルから配列へ読み込み */ disp10_ia1(); /* 配列データの表示 */ printf("探したい値>"); scanf("%d", & value ); for(;;){ idx = indexof_ia1( value , idx); if(idx == -1) {/* 見つからない */ printf("以上です\n"); break; } else { /* 見つかった */ printf("%dは、%dの位置にあります。\n", value, idx); idx++; /* 次の位置から探す */ } } } /*-----------------------------------------------------------------------------関数定義 終了*/ /* 各種確認用main 必要に応じて呼び出す関数を変更 */ void main() { main_i3(); }