情報科学演習
2011.12.05

Back to index page



  1. 本日の作業内容

  2. 宿題の結果について

    件名に関する間違いが今回ありませんでした.素晴らしいことです.今後も注意 して提出しましょう.

    いつものように間違いのパターンをいくつか示します.

            int m,n,p,q=0,i,j,k=0,sum=0,sub=rand()%900+100;
    
            m=rand() % 90 +10;
            n=rand() % 90 +10;
            p=rand() % 90 +10;
    
            for(i=1 ; i<=n ; i++)
            sum+=m;
    
            for( ; ; ){
            sub-=p;
            if(sub <=0){
            break;
            }
            k+=1;
            }
    
            for(i=1 ; i<=k ; i++)
            q+=p;
    

    インデントがおかしいですね.それと割算をごまかしています.かけ算をして後 から q を作っています.

            for(i = 1;i <= n;i++){
                    m += i;
    
            }
                    printf("m * n = %d\n",m );
                    printf("p = %d,q = %d, ",p,q);
            for(i = 1;i <= p;i++){
                    q -= i;
    
            }
    

    割算の処理で q から p を引くのではなく,i を 引いています.

    
    
            for(i=0;; i++){
                    b += p;
                    if(b>q)
                            break;
            }
    

    計算が間違っています.

            int i, m = rand() % 90 + 10, n = rand() % 90 + 10;
    
            for(i=0;i<n;i++)
                    sum += n;
    

    m n の区別がついていません.これでは n * n を計算しています.

            for(i=0;;i++){
                    zyo+=p;
                    if(zyo>q)
                            break;
            }
            printf("p=%d, q=%d, q/p=%d\n\n",p,q,i);
    

    なるべく break は使わないようにしましょう.break を使 う癖をつけると,頼りすぎてしまうかもしれません.また,if 文は不 要ですし,ループの回った回数 i を使うのも止めましょう.

            m = rand()% 100 + 1;
            n = rand()% 100 + 1;
            p = rand()% 100 + 1;
            q = rand()% 900 + 100;
    
                                    m = rand() % 98 + 1;
                                    n = rand() % 98 + 1;
                                    p = rand() % 98 + 1;
    

    上の2つは両方とも乱数が間違っています.

            printf("p=%d, q=%d, q/p=%d" ,p ,q ,q/p);
    

    これは最悪の答案です.割算処理を考えるのが課題ですから / を使っ た段階で0点です.

            for(i = 1; i <= q; i++){
                    q = q - p;
                            if(q >= 0)
                                            z = z + 1;}
                                    printf("q/p=%d \n", z);
    

    if は不要で冗長です.

            P = 0;
            Q = 0;
    

    変数名に大文字を使わないようにしましょう.

            for(i = 1; p < q ;i++)
                    q = q - p;
    
                    printf("q/p=%d\n\n",i);
                    printf("------------------------------------------\n");
                    return(0);
    

    インデントが変です.また,i を使用しています.

                    sum2 ++;
    

    変数名と演算子 ++ の間にスペースが入っています.単項演算子と同 じように,++ -- は前の変数と間を空けないで使ってく ださい.

    My student number: s******
    
    m=22, n=71, m*n=1562
    p=14, q=427, q/p=30...7
    
    --------------------------------------
    

    こちらが指定していない余りを求めて表示する処理があります.不要なものは付 けないでください.こういうのも減点の対象となります.

            for(;;){
                    q -= p;
            if(q < 0)break;
                    quo++;
            }
    

    これもインデントのおかしい例です.if 文は for 文の中に あるのでインデントされて右に移動していなければなりません.

            for(i=1; i<=n; i++){
                    a += m;
                    }
            printf("m=%d, n=%d, m*n=%d\n", m, n, a);
    
            printf("p=%d, q=%d, ", p, q);
            for(j=0; q>=p; j++){
                    q -= p;
                    }
    

    for 文が2回以上出てきても変数を i j を使っ て区別する必要はありません.

  3. 前回の復習

    for 文を学習しました.for 文はこの後で登場する while 文に比べると分かりやすく,初心者にも使い易いと言われてい るものですが,授業の実習では明らかに予 習不足のため理解が悪い人が多く見られました.しっかり予習はや りましょう.以下に,教科書の内容に関する補足を少し行っておきます.

    • 「式1」の意味

      教科書のp.39にある for 文の基本形式ですが,その内のまず「式1」 についてもう少し説明しておきます.良くあるのが,i=1 のようなも のですが,これは見てのとおり「代入」です.変数 i にこの場合数値 の1を代入しています.for ループの中で使用する変数 i の 値を初期化しているわけですが,ここで注意が必要なのは,前回多くの人が間違 えていた以下のような処理です.

          i = rand();
      
          for(i=1; i<=10; i++)
      

      上では,1行目で変数 i に乱数の値を代入していますが,その直後に for 文で i に1を代入しています.for 文で使 用する変数はこのように初期化されるので,それ以前にたとえ値を持っていた としても,変更されます.気を付けて下さい.

      そのため,for 文の仮変数として使用される i, j, k, ... などは通常の変数名として使用しません.整数を扱う変数名としては,m, n, p, q などを使用するか,きちんとした名前をつけるかしてください.

    • 「式2」について

      「式2」は真偽値を判断するためのものです.教科書に書いてあるように,式2が 真であればループ内の処理(「文」)を実行します.偽になるとループを抜けるこ とになります.無限ループになる,もしくは,実行しない場合など,この式2も 原因となっていることがありますので,注意してください.

          for(i=1; i==10; i++)
      

      上のような場合,ループは一回も回りません.また,

          for(i=1; i=10; i++)
      

      では無限ループになります.

    • 「式3」について

      式3も無限ループを引き起こす可能性のある部分ですので注意してください.例 えば,次の例は教室のCの環境では動作しますが,別の環境では無限ループにな る場合がありますので,注意してください.

          for(i=1; i<=10; i=i++)
      

  4. 多重の for

    例題4.8では2重の for 文を使用して2次元の座標のような考え方を実 現しています.ただし,あまり良い例ではありません.もっと単純な2次元処理 を考えてみましょう.変数 i j を用意して以下のよ うな処理を考えると,

        for(i=1; i<=5; i++)
            for(j=1; j<=5; j++)
    

    以下のような座標的な処理が実現できますので,その位置で何をするか決めれば いろんな処理が出来ます.

    (1,1) (1,2) (1,3) (1,4) (1,5)
    (2,1) (2,2) (2,3) (2,4) (2,5)
    (3,1) (3,2) (3,3) (3,4) (3,5)
    (4,1) (4,2) (4,3) (4,4) (4,5)
    (5,1) (5,2) (5,3) (5,4) (5,5)
    

    ちなみに教科書の例題4.8を書き直すと以下のようになります.

    #include 
    
    main()
    {
    	int i, j;
    	
    	for(i=-5; i<=5; i++){
    		for(j=0; j<=i*i; j++)
    			printf(" ");
    			
    		printf("*\n");
    	}
    	
    	return(0);
    }
    

  5. 実習

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

  6. 次回の予習範囲

    教科書のp.49の例題4.9を予習してきてください.ただし,前回と同様5行目でインクルード されている conio.h というヘッダファイルは教室の環境には無いので 使えません.これは12行目の clrscr() (クリアスクリーン)を使うた めのものなので,この行を削除すれば conio.h をインクルードしなく ても大丈夫です.

  7. 宿題

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


目次ページに戻る