情報科学演習
2014.11.10

Back to index page



  1. 本日の作業内容

  2. 前回の宿題の結果について

    今のところコンパイルエラーが無いので助かっていますが,インデントやハイフンによるライン引きなどに問題のある人が多いので,注意してください.なお,今回も大馬鹿野郎が出てきたので下に挙げておきます.困ったものです.

    b1355 b1370

    以下は問題のある解答の例ですが,全部ではありませんので,各自解答例と自分の解答を見比べてよく確認しておいて下さい.

            n = rand();
    
            printf("\nMy student number: s144099\n\n");
    
            printf("%d %d %d %d %d \n",n % 900 + 100, n/2 % 900 + 100, n/3 % 900 + 100, n/4 % 900 + 100, n/5 % 900 + 100 );
            if((n % 900 + 100) > (n/2 % 900 + 100))
                    m = n % 900 + 100;
            else
                    m = n/2 % 900 + 100;
            if(     m < (n/3 % 900 + 100))
                    m = n/3 % 900 + 100;
            if(m < (n/4 % 900 + 100))
                    m = n/4 % 900 + 100;
            if(m < (n/5 % 900 + 100))
                    m = n/5 % 900 + 100;
                    printf("Maximum of above numbers:%d\n", m);
    

    使える変数が2つまでに限定されているからといって,上のような無理矢理な処理は無いでしょう.

        if(num1 >= num2){
           num2 = rand() % 900 +100;
           printf("%d ",num2);
         }
    
         else{
           num1 = rand() % 900 + 100;
           printf("%d ",num1);
          }
    

    インデントもおかしいですが,それ以前に今回は else を必要としていません.

            int a = rand() % 900 + 100;
            int b = rand() % 900 + 100;
            printf("My student number: s144099\n\n");
            printf("%d %d %d %d %d\n", a, b, a, b, a);
    

    ????? 乱数が2種類だけ.

            printf("%d %d %d %d %d\n",a%900+100,b%900+100,a%450+b%450+100,a%321+b%579+100,a%579+b%321+100);
            printf("Maximum of above numbers: ");
            if(a%900+100<=b%900+100);
                    else if(a%900+100<=a%450+b%450+100);
                            else if(a%900+100<=a%321+b%579+100);
                                    else if(a%900+100<=a%579+b%321+100)
                                            printf("%d",a%579+b%321+100);
                                            else
                                                    printf("%d",a%900+100);
            if(b%900+100

    すごいですね.何がどうなっているのかわかりません.よくこんな面倒なこと考えつきますね.僕が横着な人間なので,この授業ではこのような力ずくの処理は決して出てきません.

            int a = rand() % 900 + 100,b = rand() % 900 + 100,c = rand() % 900 + 100,d = rand() % 900 + 100,e = rand() % 900 + 100,max;
    
            int i,num,max=0;
    
            int num, ary[5], max, i;
    

    変数は2つまでと言っているのになぜでしょうかね.今回の宿題では変数の使い捨て,というか,変数の値を次々に変える練習を行いました.これは次週からの for 文のための準備も兼ねています.

            printf("------------------------------\n");
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
                                                    return(0);
    }
    

    嫌がらせですか?

    以下はインデントのおかしいものの例です.きちんと自分のものとつき合わせて確認しておいて下さい.

    main()
    {
        srand((unsigned) time(NULL));
    
            int x,y;
    

    毎回こんなへんなのがあると,言っているのに直らないですね.5番.

            int m, n;
    
                    printf("My student number: s144099\n\n");
    
            m = rand() % 900 + 100;
                    printf("%d",m);
            n=m;
    
            m = rand() % 900 + 100;
                    printf(" %d",m);
            if(n<m)
            {n=m;}
    
            m = rand() % 900 + 100;
                            printf(" %d",m);
    

    最初の printf が何故下がるのか?最後の printf も何故そこまで下がるのか?

            if(a>b)
            b = a;
            printf(" %d ", a);
    

    まったく無視ですね.喧嘩売ってますか?

            return(0);
            }
    

    これも最後まできちんと注意しましょうと指摘しておいたものですが,また出ました.8番他.

                    if(a>=b)
                            printf("\nMaximum of above numbers: %d\n\n",a);
                    else
                            printf("\nMaximum of above numbers: %d\n\n",b);
    
                    printf("----------------------------\n");
                    return(0);
    }
    

    基本的に最初の位置が下がりすぎています.何故?

        if(a > b)
           b = a;
    

    スペースを入れて適当に下げるのでは無く,TABできちんと下げましょう.

        printf("------------------------------\n");
    
           return(0);
    }
    

    初めてのパターンです.28番.

    main()
            {
    
                    srand((unsigned)time(NULL));
    

    これも毎回のように注意しているものですね.66番.

    723845271515630
    Maximum of above numbers:845
    

    これは表示の問題です.全然三桁の数に見えないですが.

  3. 前回の復習

    • else

      else の処理について実習を行いました.if だけではやりづ らい2者択一の処理も else を使ってすっきりと実現できます. 今後も必要に応じて使ってください.

    • 論理演算式

      if 文の判別式の部分で論理演算の間違いをしている人が実習中に結構 見られました.以下のようなものは間違いですので,注意してください.

      	    if(a == 1, 2, 3)
      
      	    if(a == 1 || 2 || 3)
      

    • 除算と剰余算の上手な使い方

      トランプの課題を行いましたが,以下のように考えると if 文がすっきりしますので,適宜活用してください.トランプについては配列を学習したらまた扱います.

               0  1  2  3  4  5  6  7  8  9 10 11 12  <-- 13で割ったら商が0 Spades
              13 14 15 16 17 18 19 20 21 22 23 24 25  <-- 13で割ったら商が1 Hearts
              26 27 28 29 30 31 32 33 34 35 36 37 38  <-- 13で割ったら商が2  Diamonds
              39 40 41 42 43 44 45 46 47 48 49 50 51  <-- 13で割ったら商が3  Clubs
      13で割った剰余   0  1  2  3  4  5  6  7  8  9 10 11 12
                       A  2  3  4  5  6  7  8  9 10  J  Q  K
      				 
  4. switch

    switch 文は規則性の無い選択処理の際に使用すると便利です.が,み なさんの場合は if 文を使用してすっきりと書けるものまで switch を使ってしまう例がこれまで見られます.ですので,この授 業では本日の実習以外では switch 文を使用する処理は使わない と思ってください.すみません.

    正確には,if else 文と swith 文では分岐の動作が違います.if else 文では条件がたくさんあるとき,上から順番に if の式の真偽判定を順に行っていきます.下の方にある条件に合致するとしたら,それまで上でずっと続けられた判定は時間の無駄になってしまいます.一方,switch 文の場合は一発で該当する case 句に飛びますので,負荷の低減になります.ですので,分岐が多い場合には switch 文を使用するのが適切と言えます.
    注意

    教科書のp.35に switch 文の基本構成を示した図がありますが,ここで case の次にある「定数式」というのがわかりづらいかと思います.教科書にもあるようにこれは「整数型」か「文字型」で無いといけないのですが,教科書の例題3.7は「文字型」の例となっており,そのため演算記号の両側に文字を記述するための記号である引用符 ' ' がついています.「整数型」の場合には当然ですが引用符はあってはいけません.

    また,定数式ということで,変数や変数を含む式,また,文字列が来ることはできません. 1 + 1 のように変数を含まない式は可能ですが,使うことは無いでしょう.文字は教科書のp.143のASCIIコード表にあるように数値として計算機の内部で処理されます.そのように,単純な数値を値に持つものが定数式です.先ほどの 1 + 1 は2という数値になりますし,文字の '+' であればコード表にあるように10進法で43という数値で表されるので switch 文の中で使用できるのです.

  5. 実習

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

  6. 次回の予習範囲

    教科書のp.41まで予習をしてきてください.教科書のp.38にある復号演算子は特 に重要です.必ず予習してきてください.

    また,次回は for 文に関する小テストを実施しますので,予習は特に念入りにお願いします.

  7. 宿題

    授業の終わりに宿題の案内をします.ただし,問題を見ることができるのは11日以降です.


目次ページに戻る