情報科学演習
2012.02.06

Back to index page



  1. 本日の作業内容

  2. アンケートについて

    教育開発センターより1年生に対してメンター制度を含む学習支援に関するアン ケートを依頼されていますので,授業時間中に記入して提出してください.

  3. メンター学習室について

    今週もメンター学習室は水曜日と金曜日の4コマ目に開設されます.期末試験前 の最後の機会ですので,実習課題など良くわからない部分をしっかり学習してく ださい.

  4. 小テストの結果について

    提出されたプログラムですが,コンパイルエラーや実行時にセグメンテーション フォールトで落ちるものなどがたくさんありました.以前から言っているように, 実行できないプログラムは採点できませんので,提出をしないで下さい.小テス トは出席表明では無いので,無駄な提出は要りません.

    以下は解答の中の問題となるポイントを列挙したものですが,いずれも今後とも 出そうなものなので,各自理解して注意して下さい.

             Hello world!\ufffd\u96c0\ufffd$ESC"\u30a8\ufffd^A \ufffd\u96c0\ufffd$ESC"\u30a8\ufffd^A
    

    配列の要素の無い部分を無理矢理表示させようとして,値が無いために変なバイ ナリーデータが表示されている例です.実際の画面では漢字混じりのぐちゃぐちゃ な文字が出ています.

            for(i=0; i<=15; i++){
                    printf("%c" ,a[0][i]);
                    }
    

    これも同じような例なのですが,配列の文字数を超えて出力させたため,以下の ように変な文字が付いて来ています.

    Hello, world!^@^@^@
    

    これは画面に出ているそのままですが,実行画面にこれが出たら減点対象なので, 注意して下さい.

            char str[19]= "\"Hello, world!\"";
    

    これは出題の意図を正しく理解していないものです.Hello, world! という文字列を配列の要素に指定したのに,2重引用符まで要素に入れています.

            static char a[14] = "Hello, world!";
    
            printf("\"%13s \"\n", a[14]);
    

    これも同じようなものですが,要素の文字数が13しか無いのに,配列の14番目の 要素(NULL文字よりもさらに後)を表示させようとしているので,要素が無いこと になっています.また,%s で表示させようとしているので,上の例と 結果が違って下のようになっています.

    "       (null) "
    

    括弧に囲まれた null は文字列を表示したのではなく,要素が無いこ とを教えてくれているものです.

                    printf("Hello,world!\n");
    

    これは絶対にやっちゃダメ,なやりかたです.多少なりともプログラムの基本部 分が正しくなっていれば部分点をつけることもありますが,このようにまったく 問題の趣旨に反して,結果だけつじつまあわせするものは0点です.

            printf("%14d\n",a[1][14]);
    

    文字列を表示するのに,%d という整数値表示の記号を使用しています.

    ello,world!\ufffd
    

    これもまた文字数が表示命令と合っていない例で,最後に変な記号が表示されま す.また,配列の要素が0番から始まることを忘れて,1番目の要素から表示する ようにプログラムされていたので,先頭の H が抜けています.

  5. 宿題の結果について

    いつものように問題のある答案の例です.参考にしてください.

            printf("\n");
            for(i=1;i<=7;i++){
                    b=rand()%7+1;
                    for(j=1;j<8;j++){
                            if(d[j]==b){
                                    b=rand()%7+1;
                                    j=0;
                            }
                    }
                    d[i]=b;
                    printf("%c",a[b-1]);
            }
    

    不要な2重のループや if 文が使用されています.冗長です.

            for(i=0;i<=7;i++){
               a = rand() % (8-i)+i;
                    printf("%c",kazu[a]);
    
                    kazu[a] = kazu[i];
    
            }
    

    上のものは正しくシャッフルされていません.上書きしているだけなので,文 字の重複や不足が生じます.

            for(i=0; i<=8; i++){
                    a=rand() % (9-i)+i;
                    printf("%c", kazu[a]);
                    kazu[a]=kazu[i];
            }
    

    文字の入れ換えでなく上書きになっているので,こちらも文字の過不足が生じま す.

            for(i=0; i<=5; i++){
                    j = rand() % 6;
                    num = str[i];
                    str[i] = str[j];
                    str[j] = num;
            }
    

    発生させる乱数の範囲が毎回同じなので,厳密なシャッフルになっていません.これは 確率的には全く元の文字列と同じに戻ることもありえます.

            for(i=0;i<7;i++){
                    for(j=0;j<7;j++){
                            ran1=rand()%2;
                            if(ran1==0){
                                    tmp=str[i];
                                    str[i]=str[j];
                                    str[j]=tmp;
                            }
                    }
            }
    

    これも最初のものと同じように冗長です.

            for(i=0;i<9;i++){
            printf("%c",str[i]);
            }
            printf("\n");
            for(i=0;i<9;i++){
            a=rand()%(9-i)+i;
            b=str[i];
            str[i]=str[a];
            str[a]=b;
            printf("%c",str[i]);
            }
    

    何度指摘してもインデントの直らない人がいます.

            static char a, str[7]={"nawate"};
    

    この授業の受講者にはnawateさんが2人いたようです.

            char str[6]="abcde";
    
            for(i=0;i<=5;i++)
                    printf("%c",str[i]);
    

    これが小テストの部分にも書いておいた問題のあるものです.文字数が5なのに for 文で6個の出力を指示しているので,最後に ^@ が表示され るのですが,GNOME端末で実行するだけでは「見えない」のです.注意して下さい.今回 の宿題でも大量に出ました.

    NULL文字のような空白文字を表示させるには,以下のように実行して確認すると 良いです.

    $ ./a.out | less

    less というのは長いテキストを1ページずつ表示してくれるフィルタ 型のソフトです.縦棒 | は「パイプ」といって,前のコマンドの実 行結果を後ろのコマンドに渡してくれるものです.

    less コマンドは実行するとページを表示したままになりますので,終 了するためには q をキーボードでタイプしてください.

  6. 前回の復習

    1. 要素の個数

      配列の要素の個数に関する混乱が多く見られました.また,添字と個数の違いも 問題となりそうな人が多くいるようです.次のような注意が必要ですので,気を 付けてください.

      	    int ary[5] = {0, 1, 2, 3, 4};
      

      のとき,配列の要素の総数は5個ですが,最後の要素は「4番目」です.先頭が0 番目であることを常に意識してください.一方,

      	    char str[5] = "abcd";
      

      のとき,要素の個数は5個ですが,最後の要素はNULL文字( \0 )である ので,文字の総数は4文字です.なので,配列の「最後の文字」である d は「3番目」の要素です,それを表示しようと思うと,

      	    for(i=0; i<=3; i++)
      	            printf("%c", str[i]);
      

      のように変数 i の範囲を0から3にしておかなければいけません.

    2. NULL文字

      教科書のp.67に文字列の配列の作成法の基本として,

      	    m[5] = "book";
      

      とありますが,これが基本で一番わかりやすいので,この方法を使用するように しましょう.なぜなら,p.66にあるような1文字ずつの要素定義では,

      	    m[5] = {'b', 'o', 'o', 'k', '\0'};
      

      のように,必ず最後にNULL文字 \0 が必要になるのですが,これを忘 れると画面に変な文字が出てくるからで,余計な心配をしなくても良いように, 2重引用符で囲む形の方を使うことをお薦めします.

      	    m[4] = {'b', 'o', 'o', 'k'};
      	    printf("%s\n", m);
      

      で試してみましょう.

    3. 文字コード

      前回の実習で教科書のp.143から始まるASCIIコード表を利用する問題を出しまし たが,教科書の例題2.4の記憶がまったく抜けている人が実に多くいました.授 業は,内容の積み重ねでどんどん発展していくので,習ったことは復習を通して しっかり身につけておいてください.

      で,実際にやることは単純で,

      	    printf("%c\n", 97);
      

      のように,printf の中において,%c に数字を渡してやれば, その数字を文字コードと理解してその文字を表示する,ということだけです.上 の例では,97を渡していますが,これはアルファベット小文字の a に なります.この部分は変数であっても,配列の要素であっても構いません.

  7. 期末試験の準備

    来週はいよいよ期末試験です.本日は,そのための模擬テストの形式で,解答用 紙の利用法を実習課題で学習します.それ以外の注意事項は以下のようになりま すので,よく読んでおいてください.

    • 試験時間について

      解答準備や退室作業などありますので,実際の試験時 間は80分になる予定です.

    • 遅刻について

      C7クラスの人は16:10分までに入室できるよう準備しておいてください.それ以 降の入室また遅刻は認められませんので,遅れないように注意してください.

    • 途中退室

      C6クラスの人は途中退室は出来ませんので,最後まで720教室に居てください. 気分が悪くなった場合には別途対応しますので,その場合には手を挙げて教えて ください.

    • 携帯電話について

      携帯電話は電源を切って鞄の中に入れておいてください.鳴動したり すると不正行為とみなしますので,注意してください.

    • 電子メールについて

      解答用紙の提出は電子メールで行いますが,電子メールの利用は提出時(試験終 了5分前)に限定します.その時間以外に電子メールアプリが起動している場合に は不正行為とみなしますので,注意してください.

    • クラス入れ換え

      C6クラスの試験が終了すると,受講生全員前のスペースに集合してもらいます. そして,前の扉からエレベーターホールの方向へのみ移動可能ですので,東側エ レベータもしくは非常階段を使用して移動してください.

      C7クラスの人は必ず西側のエレベータを使用し,C6クラスの試験終了後,教室後方のドアが開いたら入室を開始し て,後ろのスペースに待機していて下さい.C6クラスの学生が退室した後に着席 可能です.

    • 履物

      C6クラスの人は入室時に履物を教室前方の三和土に置くか,自分で保管するようにしてください.退 室時には下足箱の方には進めません.

    • 提出時間厳守

      試験終了の合図をして以降の解答の提出は認められませんので,必ず時間内に提 出してください.

    • コンパイル不能および動作不能の答案について

      コンパイルできない答案や,動作させると適切に動かない,終了しないなどの不 備のある答案は採点しませんので,注意してください.

    • 解答用紙

      解答用紙自体がC言語のプログラムにすで になっていますので,扱いに注意してください.

      学生番号と名前は試験前にあらかじめ準備しておいてください.また,コメント 行の部分も消さないでください.もちろん,printf の行は消してはダ メです.

    • 提出方法

      提出方法はいつもの通りです.件名が違っていると採点しませんので,そこも注 意してください.今回の件名は以下のようになります.

      test_c6_120213_s1140** (C6クラス)
      test_c7_120213_s1140** (C7クラス)

  8. 実習

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


目次ページに戻る