第 12 回 - ソーティング(1)

[5/11, 2006 H.Aman]
67x27(1669bytes)   67x27(1669bytes) 【課題 3】

例題 3

任意個の整数を読み込み,入力順に配列 a へ格納しなさい. ただし,最初に個数を読み込むものとする.
なお, 所定の個数を格納できるだけの配列をメモリ上に確保できない場合は 「メモリが足りません」 というエラーメッセージを出力して終了せよ.

課題1課題2 では「任意個の」整数とはいっても, 256 個以下 という制限が付いていたが, ここでは真に任意個で考える.

方針・アルゴリズム

特別なアルゴリズムは必要としないが, 配列をメモリ上に確保する定番のプログラムを紹介する.

int 型で大きさ 10 の配列 a をメモリ上に確保する場合, 最も簡単なのは
 int  a[10]; 
というように配列の大きさを使って変数宣言すればよい.
しかし,この方法は あらかじめ配列の大きさが分かっている 場合にのみ有効である.

プログラムを実行するまで配列の大きさが不明な場合, 前もって十分大きな配列を用意しておくという手もあるが,無駄が多い.
そこで次の方法を使うと必要な分(メモリ)だけを後から確保できる.

定番プログラム
  int*  a;  /* a は配列の名前 */

  a = (int*)calloc(N, sizeof(int));

  if ( a == NULL ){
    /* メモリ確保に失敗した場合の処理 */
  }

  free(a); /* 確保していたメモリの解放(使用後の後始末) */

N は配列の大きさ
※ #include <stdio.h> の下に #include<stdlib.h> も書いておく.

なお,この方法によって確保したメモリは, 不要になった時点で明示的に解放するのが原則である.
解放には free という関数を使う:
  free( a ); /* a は配列の名前 */
実際にはプログラムの終了と同時に解放が行われるので, この例の場合は無理に free を使う必要は無いが, さまざまな繰り返しの中で使う場合も多いので free を使う習慣を身につけておくべきである.

●参考ページ - 情報工学実験 I(後期開講)の FAQ

コーディング例

     1	/*
     2	 * プログラミング演習 第 12 回
     3	 * [例題 3]
     4	 * (C) 2006 Hirohisa AMAN <aman@cs.ehime-u.ac.jp, aman@computer.org>
     5	 */
     6	#include <stdio.h>
     7	#include <stdlib.h>
     8	
     9	int main(void){
    10	  int i, N;
    11	  int* a;
    12	
    13	  /* 配列の大きさを読み込む */
    14	  scanf("%d", &N);
    15	
    16	  a = (int*)calloc(N, sizeof(int));
    17	
    18	  if ( a == NULL ){
    19	    fprintf(stderr, "メモリが足りません\n"); 
                               /* printf("メモリが..."); でもよい */
    20	    return 1; /* 強制終了 */
    21	  }
    22	  fprintf(stderr, "メモリの確保に成功しました.\n");
    23	
    24	  /* a[i] を読み込む */
    25	  for ( i = 0; i < N; i++ ){
    26	    scanf("%d", &a[i]);
    27	  }
    28	
    29	  /* a[i] を出力 */
    30	  for ( i = 0; i < N; i++ ){
    31	    printf("%d ", a[i]);
    32	  }
    33	  printf("\n");
    34	
    35	  free(a); /* メモリの解放 */
    36	
    37	  return 0;
    38	}
     
※左端の数字は行番号であり,ソースコードには含まれない点に注意!

コンパイル & 実行例

     $ gcc example12_3.c [Enter]
     $ ./a.out [Enter]
     10 [Enter]
     メモリの確保に成功しました.
     1 2 3 4 5 6 7 8 9 10 [Enter]
     1 2 3 4 5 6 7 8 9 10
     
     $ ./a.out [Enter]
     1000000000 [Enter]
     メモリが足りません