プログラミング入門II
2019.05.13

Back to index page



  1. 本日の作業内容

  2. 前回の宿題について

    形式的な不備の人が残念ながら出ています.気をつけましょう.

    名前と学生番号なし: b1864
    インデントの不備: b1863

    今回はまず大文字か小文字かのどちらかを出す,という部分ですでに問題のあるプログラムが結構見られました.両方出しておいて入れ替えるではなく,どちらかを出して,それを小文字もしくは大文字に変える,という作業ですので,解答例を参考にもう一度見なおしてください.

    以下は問題のあるプログラムの一部です.こちらも参考にしてください.

            int a=rand()%26+65;
            
            int b=a+32;
            
            printf("My student number: s186006\n");
            
            exchange(a,b);
            
            printf("\nAn original letter: %c\n",a);
            
            printf("Changed into : %c\n",b);        
            
            printf("\n-------------------------\n");
            
            return 0;
    }
    
    void exchange (int a,int b)
    {
            int c;
            
            c=a;
            a=b;
            b=c;
            
    }
    

    参考演算子の活用がポイントでした.これでは入れ替えではありません.

            int a = rand() % 26 + 65;
            int b = rand() % 26 + 97;
            int c = rand() % 2 + 1,d = 0;
            
            c == 2 ? d:(d = a);
            c == 1 ? d:(d = b);
            
            printf("An original letter: %c\n",d);
            
            
            c == 2 ? d:(oomoji(d));
            c == 1 ? d:(komoji(d));
    

    こちらも大文字と小文字の両方を出しておくという間違った作業です.

            int letter = rand() % 26 + 97;
            int Letter = rand() % 26 + 65;
    

    こういうのも同じですね.で,変数名は小文字で始める癖をつけましょう.他の言語でも困らないよう,世の中の約束事は守ってください.

            int x = rand() % 26 + (rand() % 23 + 65);
    

    残念ながらこれは意味不明でした.

  3. 前回の復習

    ここまで関数を自分で作る作業を実習しました.その際に戻り値の有無で関数の型の指定が違うことを体験しました.戻り値がなければ void 型となり,戻り値がある場合にはその型に従って int や double などの型になります.今回はその戻り値を渡す方法と,再帰についてです.

  4. 値渡し

    これまでプログラミングの中でmain()関数の最後に return 0; とつけてきました.このリターンというのは「値を戻す」ということなのですが,ここまでは必ず値として数値の 0 を戻してきたはずです.この数値の 0 というのはコンピュータに対して「プログラムは正常に終了した」という通告のようなものです.0 以外だと「異常終了」という意味です.

    このように,プログラムは終了時に何らかの「値を返す」ことができます.この値のことを「戻り値」と言います.

    教科書のリスト4_7の値の入れ替えプログラムを自分で実行して見てください.p.80にも書いてありますが,関数 exchange() の中で変数の値を入れ替えていますが,元の変数の値自体が入れ替えられたわけではないことがわかります.なんとも不思議な動作だと思います.そして,関数 exchange() の中には return 文はありません.これも不思議です.

    この「値渡し」という操作はわかりにくいですが,関数が終了した段階で return で戻せる値は「1つだけ」という仕様にC言語はなっています.値を2つ渡せたら関数で値の入れ替えができるのですが,それができないのです.このようにC言語は仕様的には少し古いところがあり,いろいろつぎはぎの拡張がなされてきてはいるのですが,なかなか面倒な言語です.この授業の範囲ではありませんが,ポインタというものを使うと値を入れ替えることができます.後ほど演習で試してみましょう.

    C言語にオブジェクト指向を取り入れたC++や現在主流となっているC#などの言語では値渡しではなく「参照渡し」ができるようになっています.ポインタを意識しなくてもいろんなことができるようになっています.
  5. 再帰

    再帰も難しい技術です.教科書に書いてありますが,数学で学んだ「漸化式」が書ければ, for 文のような反復処理を書かなくても繰り返しができるというものです.こちらは教科書に詳しく書いてありますので,そちらを読んで勉強してください.ただし,読んだだけで何がどうなっているのかわかれば素晴らしい読解力です.

  6. 演習

    演習問題はこちらです.

  7. 宿題

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

  8. 次回の予習範囲

    教科書のp.91からp.101の範囲を予習してください.


目次ページに戻る