プログラミング入門II
2019.06.10

Back to index page



  1. 本日の作業内容

  2. 宿題の結果について

    エラーが出るようなプログラムがなかったことは良かったのですが,配列ではありがちなコアダンプを起こすプログラムが出てきました.配列の要素として準備していないところに値を入れようとした時に起こる stack smashing ですね.注意しましょう.

    コアダンプ: b1817

    他にはハイフンラインがない人と,インデントが変(不要なブロック作成)がありました.注意しましょう.

    ハイフンライン無し: b1839
    インデント不備: b1818

    以下はいつものように問題のあるプログラムの例です.参考にしてください.

            int num[10],i;
            for(i = 0;i <= 10;i++)
            {
                    num[i] = rand() % 101;
            }
    

    要素の個数は10個なのに, for 文では10番めの要素にアクセスしています.先週のWebテキストの「配列のキモ」をもう一度見てください.

            for(i=0;i<=4;i++)
            {
                    num1=rand()%90+10;
                    
                    a[i]=num1;
                    
                    printf("    %d",a[i]);
            }
    

    発生させる乱数は今回は1桁から3桁までありますので,上記ではいろいろ間違っています.特に, %d の桁数指定は必須です.

            int num,i,ary[9];
    

    なぜ要素の個数が9個?

                    num1=rand()%90+10;
    

    いつもいつも2桁の整数とは限りませんし.

            printf("\n  ----    ----    ----    ----    ---- \n");
    

    for 文で書いてください.筆算の個数が5個でなくて100個とかだったらどうしますか?

            int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    

    乱数を入れる予定の配列になぜ値を入れておく?

    	for(i=5; i<=9; i++)
    	{
    		if(ary[i]<10 && i==5)
    		{
    			printf("+)   %d", ary[i]);
    		}&
    		
    		if(ary[i]>=10 && ary[i]<100 && i==5)
    		{
    			printf("+)  %d", ary[i]);
    		}
    		
    		if(ary[i]==100 && i==5)
    		{
    			printf("+) %d", ary[i]);
    		}
    		
    		if(ary[i]<10 && i>5)
    		{
    			printf("  +)   %d", ary[i]);
    		}
    		
    		if(ary[i]>=10 && ary[i]<100 && i>5)
    		{
    			printf("  +)  %d", ary[i]);
    		}
    		
    		if(ary[i]==100 && i>5)
    		{
    			printf("  +) %d", ary[i]);
    		}
    	}
    

    %d の記法は教科書のp.31-32でやりました.書式指定子をもう一度見なおしてください.

  3. 前回の復習

    前回から配列に入りました.一つの名前で複数の値を格納できるため,データを扱うという意味ではすごく有用なものです.添字を操作することで個別の値にも,全体にも用意にアクセスできます.配列のキモをもう一度示しますので,よく理解しておいてください.

    配列のキモ

    • 宣言するときの [ ] の中は要素の個数

    • 配列の添字は 0 から始まる

    • 配列の一番最後の要素の添字は,要素の個数ひく1

    • つまり, ary[5] のように宣言した配列には実際には,値を参照するときに ary[5] は無い

    • 基本的には for 文などの反復処理と一緒に使用

  4. 1次元配列

    配列に値を格納すると,それらを後からいろいろ参照できるようになります.前回はサイコロの目の出た回数などを格納することを行いましたが,今回は並べ替えに挑戦しましょう.

    100以下の正の整数を乱数で5つ発生させ,それらを大きい順に並べ変えることを考えてみましょう.以下のように表示するものとします.

    
     85  48  72  41  51
     85  72  51  48  41
    
    

    例えば,上の例のように現在配列 ary に順に85,48,72,41,51が入っ ているとします.このとき,配列の要素は以下の表のようになっています.

    添字01234
    要素8548724151

    まず,先頭の要素(0番目)と次(1番目)の要素,2番目の要素と順に比較し,もし 後の方が大きい場合には値を入れ換える操作を行うものとします.そのとき,比 較と入れ替えの操作は

    	if(ary[i] < ary[j]){
    		tmp = ary[i];
    		ary[i] = ary[j];
    		ary[j] = tmp;
    	}
    

    のように2重ループの変数 i j を使用して行うものとし ます.そのとき, i j の値と配列の要素がどのように変 化していくのかを順に示すと,以下のようになります.

    変数ij添字 01234操作
    01要素8548724151そのまま
    02要素8548724151そのまま
    03要素 8548724151そのまま
    04要素 8548724151そのまま
    一巡目終了
    12要素8572484151入れ換え
    13要素8572484151そのまま
    14要素8572484151そのまま
    二巡目終了
    23要素8572484151そのまま
    24要素8572514148入れ換え
    三巡目終了
    34要素8572514841入れ換え
    四巡目終了

    このように i j が変化していくようなループを作れば完 了です.すなわち,外側の for 文の変数 i は先頭の 0 から,最後の要素の添字よりも 1 少ないところまで変化させ,内側の for 文の変数 j i よりも 1 大きいところから最後まで,です.

  5. 実習

    実習の演習問題はこちらです.

  6. 次回の予習範囲

    教科書のp.116からp.120までを予習してきてください.

  7. 宿題

    宿題の公開は6月11日以降です.よろしくお願いします.


目次ページに戻る