情報科学演習
2013.01.28

Back to index page



  1. 本日の作業内容

  2. 宿題の結果について

    以下にお示しするように今回は大量のセグメンテーション違反が出てきました.配列の操作については,値の範囲をよく考えてから処理を組んでください.

    コンパイルエラーは以下の答案です.

    b1216 b1256

    セグメンテーション違反です.

    b1205 b1217 b1225 b1228 b1247 b1250 b1268 b1271
    b0915 b0946 b1120

    以下はよくわかりませんが,中身の無いデータでした.

    b1212

    解答用紙の不使用もなくなりません.

    b1255

    では,例によって問題のある答案の一部です.

            static char str[11] = "absdefghij";
    

    アルファベットを一から学習しなおして下さい.

            for(i=0;i<=4;i++){
                    printf(" ");
                    for(j=0;j<=2;j++){
                            printf("%c",word[i][j]);
                    }
            }
    

    上の解答は間違いでは無いのですが,今日のテキストでも説明しているように,%s の意味が分かれば,2重の for 文が必要ないことが分かるでしょう.

            printf("%s ",word[i]);
            }
    

    インデントの問題です.前回も説明しましたが,for 文において閉じ括弧の上の行の処理が括弧と同じ位置にくることはありません.

            char word[5][4] = {"gcd", "bfi", "eff", "dah", "hfj"};
    

    これは何でしょう?

  3. 補講について

    12月10日に休講としたときの補講ですが,下記の日程で行います.不便な時間帯で申し訳ありませんが,よろしくお願いします.内容は,期末試験で使用する解答用紙の使用練習と,一応,「模試」的なものを行います.

    C6クラス 1/30 9・10時限(16:15-17:45)
    C7クラス 1/30 11・12時限(18:00-19:30)

  4. 初期化について

    前回,変数の初期化をしないまま複合演算子を使用することの問題について説明しましたが,教室の環境ではコンパイル(cc コマンド)時に以下のオプションを使用することで,警告を出せるようになりますので,課題の提出等で最終チェックする際には利用してください.

    $ cc -Wuninitialized hoge.c

    長いオプションですが,警告(warning)のWと未初期化の英語(uninitialized)とからなると覚えれば,簡単です.
  5. 前回の復習

    文字列配列の要素数と添字

    整数型の配列のときと異なる要素の考え方について理解の足らない人が多く見られました.もう一度よく確認してください.

    • 文字列の考え方

      文字列(複数の文字の組合せ)はそれ自体が配列です.ですので,整数型で定義していた変数ならば,

      	int a = 100;
      

      のように定義していたのですが,数値としての100は値が一つなのに対して,文字列としての100であれば3つの文字の列として扱われるので,それだけで配列となり,以下のように定義しないといけなくなります.

      	char a[4] = "100";
      

    • NULL文字

      文字列は複数の値を持つということで,どこが文字列の終わりなのかを示す記号であるNULL文字が必ず必要となります.そのため,要素の個数は文字数+1となります.

      	char a[4] = {'1', '0', '0', '\0'};
      

      のような定義方法であれば,要素が4つというのがよくわかりますが,これは面倒なので,以下のような定義が便利なのですが,その際にはヌル文字まで含めた要素の個数に注意してください.

      	char a[4] = "100";
      

    • 添字

      上のような要素として1,0,0の3つを持つ文字列配列の要素を for 文を使用して順に表示する場合,以下のような添字なので対応に注意が必要です.

      添字 0 1 2 3
      '1' '0' '0' '\0'

      上記のような添字との対応なので,for 文で順に表示する際には,変数 i は0から2までと要素のサイズよりも2つ小さい i = 2 までになります.

      配列のサイズよりも1つだけ小さい i まで反復処理を行なう例が前回も多く見られました.その間違いに気づくためにも,処理を less に渡すことを忘れないでください.

      $ ./a.out | less
    • %s の意味

      教科書のp.21で %s はすでに紹介されていたのですが,文字列を扱うようになると頻繁に使用するようになります.前回のテキストでも説明しておきましたが,文字1つずつは %c ですが,文字列単位で出力するときには %s が便利です.

      	char a[3] = "ab";
      	char b[3][3] = {"ab", "bc", "ca"};
      	
      	printf("%s\n", a);
      	printf("%s\n", b[0]);
      	
      	for(i=0; i<=2; i++)
      		printf("%s\n", b[i]);
      

      のように使用できます.文字列単位で扱えるということは,文字順を示す添字が不要なので,配列の添字が省略できることに注意してください.

  6. 実習

    実習の演習問題は当日ご案内します.

  7. 宿題

    授業の終わりに宿題の案内をします.ただし,問題を見ることができるのは31日以降です.レポート提出システムから閲覧してください.


目次ページに戻る