情報科学演習
2010.07.05

Back to index page



  1. 本日の作業内容

  2. 配列

    いよいよ最後の仕上げ,配列です.教科書にあるように,配列は値の入れ物です. 値は数値だけではなく,文字列や,真偽値なのも値として入ることが出来ます. 教科書の例題は結構難易度が高いものが多く,また,すぐに多重(2次元)配列な ども出てきていますので,以下の簡単な実習も含めて学習していきましょう.

  3. 実習

    1. 値の表示

      配列に入っている値を順に表示するだけの処理だと次のようになります.

      #include <stdio.h>
      
      main()
      {
      	int i, ary[5] = {12, 34, 56, 78, 90};
      	
      	for(i=0; i<=4; i++)		
      		printf("%3d\n", ary[i]);
      	
      	return(0);
      }
      

    2. 値の格納

      乱数を10回発生させ,それぞれを配列に入れて,後から表示するようなプログラ ムを作ると,次のようになります.乱数は1から20までとしています.

      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      
      main()
      {
      	srand((unsigned) time(NULL));
      	
      	int i, ary[10];
      	
      	for(i=0; i<=9; i++)
      		ary[i] = rand() % 20 + 1;
      		
      	for(i=0; i<=9; i++)		
      		printf("%3d\n", ary[i]);
      	
      	return(0);
      }
      

    3. さいころの目の出現頻度

      6月21日の宿題を配列を用いて改良しましょう.ずいぶん短くできるはずです.

      解答例(23行)

    4. 配列の初期化への反復処理の応用

      上の問題ではさいころの各目の出現回数を入れる配列の要素を0で初期化してい ます.要素の数が6個の配列なので,解答例のように一つずつ書いていても大し た手間ではありませんが,もっと多くなると大変です.反復処理によりこれらも 自動で出来ます.例えば,以下のような処理が考えられるでしょう.

          int ary[100];
      
          for(i=0; i<=99; i++)
              ary[i] = 0;
      
      

    5. 最小値の探索

      教科書のp.61には最大値を求める方法が載っています.では,それを応用して最 小値を求めるものを考えましょう.本日の実習iiで作った乱数の内の最 小値を求めてみましょう.結果表示は以下のようになるものとします.

      Obtained numbers:  17 16 17 13 11 10  9 19 13  5
      The minimum number is 5.
      

      解答例(28行)

    6. 並べ替え

      100以下の乱数を10個発生させ,それを一度配列に入れて表示します.次に,その 配列の要素を小さい順に並べ替えて表示しましょう.並べ替えには2重のループ が必要になります.

        58  85   2  31  44  69 100  76  58  83
         2  31  44  58  58  69  76  83  85 100
      

      ヒント

      • 比較

        配列の要素を反復処理を使って順に比較していきますが,その際に,まず最初の 要素と残りを順に比較していきます.そのために2重のループが必要です.

      • 値の入れ換え

        数字を小さい順に並べるので,上の操作でより小さい数が見つかったときには比 較の対象の2つの値を入れ換えます.値の入れ換えは一時的に値を保管する変数 が必要になりますので,用意します.前回の最大公約数のアルゴリズムの中にも 値の入れ換えがあったので参考にしてください.

      解答例(34行)

    7. 今年の任意の月のカレンダー

      1から12までの整数を乱数で発生させて,その数字の月のカレンダーを表示させ てみましょう.ポイントは次のような配列を用意しておいて,その月の1日が1月 1日から数えて何日目かを計算できるようにしておくことです.また,今年の元 日は金曜日でした.

          int day[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
      

      ヒント

      • その月の1日の曜日決定

        乱数で月が決まったら,その月の前の月までの日数を計算します.配列 day の要素を足して求めますが,自己代入を行うことで反復処理が使えま す.

      • 1日の前のスペース

        1日が何曜日か決まったら,その曜日に合わせて表示するために空白を入れます が,それも反復処理で空白 " " printf で表示させます.

      • 月内の改行

        土曜日になるたびに改行を入れる必要がありますので,その処理も行いますが, 1日が何曜日だったかがここでも必要になります.

      • 日数と反復処理

        各月の日を表示するのも反復処理ですが,ここでも何回繰り返すかが問題になり ます.配列 day の要素の回数だけ繰り返す処理を作ります.

      以前にも書きましたが,UNIXのターミナルには標準でカレンダーを表示するコマ ンドが用意されています.例えば,今年のカレンダーを表示するためには,

      $ cal 2010

      とすれば12ヶ月分のカレンダーが出てきます.

      $ cal

      と引数をつけなければ今月のカレンダーが表示され,

      $ cal 8

      と引数をつけると今年の8月のカレンダーが出てきます.来年のゴールデンウィー クの様子を見るには,

      $ cal 5 2011

      ですね.

      解答例(37行)

  4. 宿題

    授業の最後に宿題の案内をしますので,注意していて下さい.


目次ページに戻る