#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();
}