プログラミング入門I
2021.11.08

Back to index page



  1. 本日の作業内容

  2. 前回の宿題について

    さて,今回も形式的な問題から中身の問題までいろいろと不備のあるものが提出されました.そして,依然として解答用紙を使用していないものもあり,残念です.

    解答用紙不使用: b1923

    なお,解答用紙については文字化けが環境によって起ることがありますので,本日のものからいくつかの文字コードについて用意することにします.自分の環境で文字が崩れていないものを使用してください.また,基本的には日付けの部分と,ヘッダの読み込みくらいしか変更しませんので,前回までのものを流用してもらっても構いません.日付,学生番号,氏名,出力時の学生番号表示,出力時のハイフンライン表示のところをしっかりと守ってください.

    コンパイルエラーが以下のように3件ありました.こちらも気をつけてください.採点の対象外となります.

    コンパイルエラー: b1923 b2105 b2141

    警告が出るものもありました.文字と文字列の区別ができていないことによるものでした.

    警告: b1972

    間違った学生番号(基本的にはs216099ですが)や名前が出ているものもありましたので,こちらも解答を開始する前にまず自分のものに直しておく習慣をつけましょう.

    出力時などの学生番号間違い: C006 b2111 b2131 b2158

    解答用紙の番号と名前の間違い: b2115 b2126

    インデントの不備が相変わらずあります.中括弧が出てきたらその中(ブロック)をタブ1個分字下げする,ということを早く理解してください.

    インデントの不備: C003 b1972 b2027 b2067 b2103 b2107 b2121 b2122 b2129 b2143 b2158 b2159

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

        int Hensuu = rand () ;
    

    変数名は小文字で始めるよう,以前から指摘しているのですが,まだ出てきますね.

        ALPHABET = rand()% 26 + 65;
    

    こっちも大文字で始まっている変数名です.変数名は小文字で始めましょう.

            printf("%C%C\n", 'A'+i, 'a'+t);
    

    動作はちゃんとできているようですが,書式の %c などの%記法では,小文字にしましょう.

            printf("%c%d¥n",upper, rand()%9+1);
    

    円マークをわざわざ苦労して出しているようですが,円マーク¥は日本語環境独自のものなので,使用しません.Windows上では円に見えたりバックスラッシュになったりするかもしれませんが,本来はバックスラッシュ\が正しい記号です.

        if(num == 65 || num = 69 || num == 73 || num == 79 || num == 85)
    

    ありがちな間違いで,誰でもよく起こします.なので,余計に注意が必要です.コンパイル時のメッセージや実行結果をしっかり見て,なんとか自分で見つけて修正できるようにしたいですね.

        if (upper == 'A')
        {
            printf("%d\n" , num);
        }
        else if (upper == 'E')
        {
            printf("%d\n" , num);
        }
        else if (upper == 'I')
        {
            printf("%d\n" , num);
        }
        else if (upper == 'O')
        {
            printf("%d\n" , num);
        }
        else if (upper == 'U')
        {
            printf("%d\n" , num);
        }
        else
        {
            printf("%c\n" , lower);
        }
    

    論理演算子を使いましょう.その方が書く文字数が少なくて,間違いも減ると思います.

  3. 前回の復習

    if-else と論理演算子の組み合わせを行いました.さまざまな条件判断を効率的に行うために,これからも適宜論理演算子の活用を考えていきましょう.もう一度確認しておきますと,以下のようなものは正しく動作しません.
        if(a > b, b > c)	意味不明な動作になる可能性
    	
        if(a == b || c)	cに値があれば必ず真
    	
        if(a < b < c)	右の不等号以降は無視される
    

    上記はいずれも間違ったプログラムです.正しくは,以下のように書く必要がありますので気をつけてください.

        if(a > b && b > c) もしくは if(a > b || b > c)
    	
        if(a == b || a == c)	
    	
        if(a < b && b < c)	
    

  4. switch

    今回は switch 文ですが,この授業では必ず使えるようにならないといけないわけではありません.ただ,処理によっては if 文よりも速く動作する場合がありますので,あくまで必要に応じて使用する感じでしょうか.

    switch 文で特徴的なことは,式の部分が整数でなければならないことです. if 文では,ある値よりも大きいや小さいとか,等しいなどブール値が返ってくるような条件式が使用されましたが, switch 文ではそのような条件式は使用できません.あくまで,整数の定数値のみ使用可能です.ややこしいですが,結果が整数値になる四則演算などを含む式は大丈夫です.やってみないとわからないことも多いですので,まずは演習で試してみましょう.

    また, if-else 文のところでも説明しましたが,分岐処理の後,必ず何かを行うのであれば,条件の最後は case 句を書くのではなく, default にしましょう.何もしない場合もある場合には, case 句の並びだけで記述します.

    case 句の簡略化

    11月の日付けを乱数により発生させて,今月の祝日かどうかを判定するプログラムは次のようになります.必要ない部分は省略出来ることを理解してください.

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main(void)
    {
        srand((unsigned) time(NULL));
        
        int date = rand() % 30 + 1;
        
        printf("Nov. %d ", date);
        
        switch(date){
            case 3: 	
            case 23:    printf("Holiday\n");
                        break;
            default:    printf("\n");
                        break;
        }
        	
        return 0;
    }
    

  5. 実習

    実習の演習問題は予習用の部分はすでに見えますのでしっかり予習してください.

  6. 次回の予習範囲

    引き続き教科書のp.57まで勉強をしてきてください.

  7. 宿題

    宿題についても当日ご案内します.ただし,宿題の問題を見ることができるのは8日18:00以降になります.また,11月14日(日)は朝から夜まで大学は停電です.レポート提出システムも前日の夜から停止していますので,注意してください.提出は土曜日の夕方までが無難です.


目次ページに戻る