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