順序配列(ordered array)の操作
/* Orderd Array */
#include <stdio.h>
#define BUFSIZE 256
#define DATANUM 15 /* 配列のサイズ(最大データ数) */
/* 配列データ */
int data[DATANUM] = { 106, 123, 136, 197, 216, 229, 351, 580, 700, 777 };
/* データの個数 */
int datanum = 10;
void dispdata();
int inputdata();
int insert( int n );
int search( int n );
int delete( int i );
int minimum();
int maximum();
main()
{
char buf[BUFSIZE];
int n, i;
while(1) {
dispdata();
printf("[MENU] i:挿入、s:検索、D,d:削除、I:最小値、A:最大値、c:全消去、q:終了\n");
fgets( buf, BUFSIZE, stdin );
switch( buf[0] )
{
case 'i': /* データを挿入 */
if( (i = insert( n = inputdata() )) < 0 )
printf("配列の容量を越えるので挿入できませんでした。\n");
else
printf("データ %d を %d 番目に挿入しました。\n", n, i );
break;
case 's': /* データを検索 */
if( (i = search( n = inputdata() )) < 0 )
printf("データ %d は見つかりませんでした。\n", n );
else
printf("データ %d は %d 番目に見つかりました\n", n, i );
break;
case 'D': /* データを削除(idx) */
if( delete( i = inputidx() ) < 0 )
printf("%d 番目のデータは削除できませんでした。\n", i );
else
printf("%d 番目のデータを消去しました。\n", i );
break;
case 'd': /* データを削除 */
if( (i = search( n = inputdata() )) < 0 )
printf("データ %d は見つかりませんでした。\n", n );
else
{
if( delete( i ) < 0 )
printf("%d 番目のデータは削除できませんでした。\n", i, n );
else
printf("%d 番目のデータ %d を消去しました。\n", i, n ); }
break;
case 'I': /* 最小値を求める */
if( (i = minimum()) < 0 )
printf("配列が空なので最小値はありません。\n");
else
printf("最小値は %d 番目の %d です。\n", i, data[i] );
break;
case 'A': /* 最大値を求める */
if( (i = maximum()) < 0 )
printf("配列が空なので最大値はありません。\n");
else
printf("最大値は %d 番目の %d です。\n", i, data[i] );
break;
case 'c': /* 全データ削除 */
datanum = 0;
printf("全てのデータを消去しました。\n");
break;
case 'q':
case 'Q': /* 終了 */
exit(1);
default:
continue;
}
}
}
/* 全データを表示する関数 */
void dispdata()
{
int i;
for( i = 0; i < datanum; i++ )
printf(" <%2d>", i );
printf("\n");
for( i = 0; i < datanum; i++ )
printf("%5d", data[i] );
printf("\n");
}
/* データをキー入力する関数 */
int inputdata()
{
char buf[BUFSIZE];
int n;
do {
printf("データを入力して下さい:");
fgets( buf, BUFSIZE, stdin );
} while( sscanf( buf, "%d", &n ) != 1 );
return( n );
}
/* インデックスをキー入力する関数 */
int inputidx()
{
char buf[BUFSIZE];
int n;
do {
printf("インデックスを入力して下さい:");
fgets( buf, BUFSIZE, stdin );
} while( sscanf( buf, "%d", &n ) != 1 );
return( n );
}
/**********************************************************************
完成に向けて作成すべき関数はこの下に集められている。
return( -1 ); 等はその関数が未完成であっても、
コンパイルして他の部分のテストを可能にするためのダミー文
**********************************************************************/
/*
引数で与えられたデータを挿入する関数
挿入できた場合はそのインデックスを返し、
当初の配列のサイズを越えて挿入できない場合は-1を返す
(テストは i コマンドで)
*/
int insert( int n )
{
/* さー考えよう! */
return( -1 );
}
/*
引数で与えられたデータを二分探索(binary search)で探す関数
見つかったらそのインデックスを返し、見つからなければ-1を返す
(テストは s コマンドで)
*/
int search( int n )
{
/* さー考えよう! */
return( -1 );
}
/*
引数で与えられたインデックスのデータを消去する関数
削除できない場合は-1を返す
(テストは D コマンドで)
*/
int delete( int i )
{
/* さー考えよう! */
return( -1 );
}
/*
最小値を求めて、そのインデックスを返す関数
見つからなければ-1を返す
(テストは I コマンドで)
*/
int minimum()
{
/* さー考えよう! */
return( -1 );
}
/*
最大値を求めて、そのインデックスを返す関数
見つからなければ-1を返す
(テストは A コマンドで)
*/
int maximum()
{
/* さー考えよう! */
return( -1 );
}
/* end of oarray0.c */