情報科学演習
2015.10.26

Back to index page



  1. 本日の作業内容

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

    毎週水曜日の4コマ目にこの教室でメンター学習室を開設しています.実習や宿題についての質問や,今後の学習方法など,院生がいろいろと相談に乗ってくれますので,活用してください.すでにこの授業に追い付けていない人が結構見られますので,今のうちにメンター学習室やこの授業の演習の時間に相談してください.

  3. 課題の提出について

    初めての宿題提出ですが,今のところエラーが出るようなものは無く順調です.しかし,中身に問題のあるプログラムを多く見られましたので,以下に代表例を挙げておきます.注意してください.

            int a=92;
    

    なぜ変数が必要だったのか?????

                   char m[1000];
    

    何故配列が必要なんだろうか????

                    printf("My student number: s154002\n\n---    ---       --      --    ---        /\\    |\\    /|\n|   \\  |   \\   /    \\  /    \\  |   \\
    /  \\   | \\  / |\n|    | |    |  |    |  |    |  |    |   /    \\  |  \\/  |\n|   /  |   /   |    |  |       |   /    |    |  |      |\n|--    |--     |    |
    |  --|  |--      |    |  |      |\n|      |  \\    |    |  |    |  |  \\     |----|  |      |\n|      |   \\   |    |  |    |  |   \\    |    |  |      |\n|
      |    \\  \\    /  \\    /  |    \\   |    |  |      |\n-      -     -   --
      --    -     -  -    -  -      -\n\n--------------------------------\n",m);
    

    こういうのは見づらいので止めてください.

            printf("My student number: s154007\n"
    
    "---    ---       --      --    ---        /\\    |\\    /|\n"
    "|   \\  |   \\   /    \\  /    \\  |   \\     /  \\   | \\  / |\n"
    "|    | |    |  |    |  |    |  |    |   /    \\  |  \\/  |\n"
    "|   /  |   /   |    |  |       |   /    |    |  |      |\n"
    "|--    |--     |    |  |  --|  |--      |    |  |      |\n"
    "|      |  \\    |    |  |    |  |  \\     |----|  |      |\n"
    "|      |   \\   |    |  |    |  |   \\    |    |  |      |\n"
    "|      |    \\  \\    /  \\    /  |    \\   |    |  |      |\n"
    "-      -     -   --      --    -     -  -    -  -      -\n"
    
    "--------------------------------\n");
    

    このやりかたも止めましょうと言ったはず...

    以下は字下げ(インデント)に関するものです.最初が肝心なので今のうちに正しいやりかたを身に着けましょう.

    main()
            {
    

    ここの中括弧は下げなくていい,というのも言ったはずですが,b1504とb1556さん.

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

    これは結構根が深くて自分では気づかないことも多いみたいです.コピペをやってばかりいるとこのようになる場合がありますので,該当者は一度ペーストするのをやめて正しく入力してください.スペースとTABの混在でよく起こるようです.b1526, b1546, b1554, b1562, b1565, b1430

    return(0);
    
    
    }
    

    最後の return が何故かインデントされない人が毎年何人かいますので,これも注意してください.b1528, b1577, b1269

        return(0);
            }
    

    これはちょっと変わったパターンですが,やはりコピペが原因かと思われます.b1537

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

    こっちはTABを余計に入れる癖がついている人です.こっちも注意です.b1552, b1435

    main()
    {
        printf("My student number: s154067\n");
    printf("\n");
    

    字下げを途中まったくしていないケースです.これも困ったものです.

  4. 前回の復習

    1. ヘッダファイル

      C言語のプログラミングでは必ず main という名前の関数が必要です. そして,結果を画面に表示するためには入出力のためのあらかじめ用意されてい る道具を必要とします.画面のことを通常「標準出力」,キーボードからの入力 を「標準入力」と呼びますので,入出力を取り扱うための道具として「標準入出 力」(Standard Input Output)用のプログラムを 呼び込みます.そのようなプログラムを「ヘッダファイル」(Header file)と言います.そこで標準入出力のためのヘッダファイルなので, stdio.h というファイルを呼び込み(include)します.ですので, 画面に結果を表示するようなプログラムを組む場合,最初に必ず

      #include <stdio.h>
      

      を記述します.なお,命令である include とファイル名である <stdio.h> の間にはスペースを入れます.無くても動作はしますが, スペースは必ず入れてください.マナーです.

    2. printf

      文字列を画面に表示するのに printf という命令を使用しました.二 重引用符で囲んだ範囲の文字列を画面に表示します.その際に,% 記 号を使用して,変数の値を埋め込むことが可能でした.また,画面上で改行する ためにはバックスラッシュ記法を使用した改行文字 \n が必要なこと も学習しました.今後,ずっと使用しつづけるので,早く慣れてください.

    3. インデント

      中括弧 { } で囲まれた範囲をブロックと呼びます.(教科書p.9参照) このブロックを使用するときには,ブロックの構成要素であることを視覚的にわ かりやすくする目的でインデント(字下げ)が行われます.教科書では4文字分の 字下げとなっていますので,geditのTAB設定を4文字にしておくと,TABキーを押 すだけで,規定の幅のインデントが可能になります.スペースを必要な回数入れ る方法では,不揃いの字下げになる可能性がありますので,必ずTABを使用して ください.

      ちなみに,宿題や小テストでは,インデントの不備は-2点とするようにしていま す.10点満点で-2点ですので,影響は大きいです.注意してください.

    4. 代入

      教科書ではp.16の例題2.6で使用する「代入」を前回の実習では使用しました. 等号の記号 = を使用することで変数に値を代入することが出来ます.これもこれから 何度も使用しますので,すぐに慣れると思います.

  5. エラーメッセージ

    プログラミングを始めると,作ったプログラムに間違いがあってコンパイル時に エラーが表示されることがよくあります.メッセージを良く読むとどこが間違っ ているのかわかるのですが,ただ単に英語で書いてあるというだけで見ない人が 多くいるようです.基本的なパターンは決まっているので,これも慣れさえすれ ばわかるようになるので,必ず見るようにしてください.

    例えば,以下に示すメッセージは,行末のセミコロン( ; )を忘れた場 合に出てくるものです.閉じ括弧の忘れなども同じような形式で出てきます.

     1: 
     2: 
     3: 
     4: 
     5: 
     6: 
     7: 
     8: 
     9: 
    10: 
    
    /* error.c */
    
    #include <stdio.h>
    
    main()
    {
        printf("test\n")     ← ここのセミコロンが無い
    
        return(0);
    }
    
    

    error.c: In function ‘main’:
    error.c:9: error: expected ‘;’ before ‘return’
    
    

    1行目は main の中でエラーが発生したことを警告していて,2行目で 不具合が生じた行が何行目かを示しています.また,内容が簡潔な英語で書いて ありますが,意味は「return の前に期待される ; 」という ことで,セミコロンが無いことを教えてくれています.なお,セミコロンが無いのは7行目ですが,それが無いために問題が生じるのは9行目の return になるので,エラーの生じた行が9行目とメッセージに出てきます.

    C言語は「関数型」の言語なので,最初に記述する main というのも関 数です.関数は英語でfunctionと言うので,1行目に関数 main の中で, とメッセージは言っています.

  6. 四則演算

    本日の授業でまず最初に扱うのは「整数」の演算です.計算機は2進数で内部処理している のはみなさんもよく知っていると思いますが,2進数で小数点を持つ実数を扱う のは,ちょっと面倒な処理が必要です.そのため,計算機の心臓部であるCPUで は整数型と実数型の演算は別の機能として分けて行いますので,数値の「型」, すなわち整数なのか実数なのかが重要なポイントです.教科書にあるように,変 数定義のときに,

    
        int a;
    

    のように int と指定すると変数の値が「整数型」になります.整数の 英語であるintegerから int は来ています.

    • 除算の注意

      整数型の演算ですから,扱える数は整数だけです.なので,4割る3は1,3割る4 は0です.ある数をそれよりも大きい数で割った場合,その答えは必ず0になるこ とに注意してください.

    • 剰余

      「四則演算」というと,通常は加減乗除の4つですが,プログラミングではもう一つ 「剰余」というのが重要なので,それも含めて四則演算と言います.剰余とは割っ た余りです.

      皆さんは,小学校で小数を習って以来,それ以前に使用していた「余り」につい て無視する癖が付いてしまっています.これからはそれを直していく必要があり ますので,注意してください.以下にポイントを示しますので,一刻も早く慣れ ることが重要です.

      • 剰余の動作

        教科書のp.17に出ているように,% の記号は剰余を表します.以下の ような動作になります.

            printf("%d\n", 5 % 3);
        

        とすると,5割る3の除算を実行し,余りは2ですので,2を出力します.

      • 剰余の使い道

        例えば任意の整数を6で割る場合,その余りは0から5までの6つの整数になります. 1つずつ増えていく数列に対して剰余を求めると,特定の範囲の数だけが繰り返 されることになります.先ほどのように6の剰余を求めると,1から100までの数 列ですと,1からはじまり5まで行くと0に戻りまた5まで,ということを繰り返し ます.(下の表参照)

        カレンダーの表示のようなものもわかりやすい例かと思いますが, 今月ですと,1から31までの日付が7つの曜日に分類されるのは日付を7で割った 余りを使用して実行できます.すなわち,今日の26日を7で割ると余りは5ですが, 余りが5になる日は全て月曜日です.

        6日ですが,6を7で割ると商が0で余りが6です.7で割った時の余りの最大値は6であることも理解してください.
        今後乱数を活用してプログラミングに偶然性を取り込みますが,その際に使用す るのもこの剰余です.最初の週にgeditの使用例として挙げたプログラムがサイコロをシミュレートするものでした.それをちょっと変更して以下のように書いてみました.

        
        #include <stdio.h>
        #include <stdlib.h>
        #include <time.h>
        
        main()
        {
            srand((unsigned) time(NULL));
            
            int dice = rand() % 6 + 1;
        
            printf("%d\n", dice);
        
            return(0);
        }
        

        rand() が乱数に関係する部分ですが,出てきた乱数 rand() の値を6で割った余り(0, 1, 2, 3, 4, 5の6種類のどれか)に1を加えています.そうす ると,結局1から6のどれかの整数が表示されることになるのですが,それがコン ピュータで実現する「サイコロ」です.このような利用法もあります.

      • 剰余のツボ

        先ほどから何度か紹介していますが,ある整数で割った余りの種類(個数)はその 割った数と同じです.すなわち,6で割った余りの種類は6種類というこ とですが,これが重要なポイントです.

        除数01234567891011121314151617181920
        2の剰余010101010101010101010
        3の剰余012012012012012012012
        4の剰余012301230123012301230
        5の剰余012340123401234012340
        6の剰余012345012345012345012

        上の表のように,剰余を利用すると連続する整数を特定の範囲の整数の繰り返しに変換することが可能です.これは先ほど紹介した曜日でもそうですし,いずれトランプの課題なのでも登場します.さらに,配列が出てきたらこの考え方は頻繁に使用することになります.

    • 単項演算子

      教科書のp.17に算術演算子の一覧が出ています.四則演算といいながら演算子は 剰余を加えた5つではなく,さらに多い6種類あります.最初にある「負の符号」 というのも演算子ですが,単項演算子と分類されるもので,ちょっと注意が必要 です.その表には,一番右のコラムに「演算順位」というものがあり,この負号 は第1位になっています.この順位は「結合の強さ」とも呼ばれるもので,乗算 と除算は加算と減算よりも優先されるという小学校で習った規則を意味していま す.つまり

      2 + 3 * 4 - 5

      という計算の答えは9になりますが,プログラミングでも同じようになっている ということです.さて,では優先順位第1位の負号ですが,これは数学とは違う プログラミング言語に固有のもので,以下のような演算を可能にするためにあり ます.

          printf("%d\n", 1 + -1);
      
      

      動作は自分で確認してください.

    • 演算子の前後のスペース

      教科書の例題を見ると分かるように,四則演算をプログラム中に記述する場合, 演算子ならびに代入記号の前後にスペースが入っています.前項のような単項演 算子の負号のような場合もありますので,必ずスペースを入れるようにしましょ う.ただし,後で出てくる if 文の条件式などのように入れない場合もあ ります.

  7. 浮動小数点数

    教科書p.18から実数の計算が始まりますが,実数は正確には浮動小数点数 (Floating point number)と言います.小数点が移動可能な数ということですね. 扱える桁数が決まっているので,精度良く計算するためには「倍精度」の数で定 義する必要があります.また,有効数字を明確にするための指数表現が printf で出力する場合に用意されていますので,必要に応じて使用しましょ う.なお,この授業では浮動小数点数はあまり使用しません.基本的には整数 型の演算を最後まで行っていく予定です.

  8. 浮動小数点数を含む四則演算

    浮動小数点数にも加減乗除の四則演算が可能です.ただし,剰余は使用できませ ん.それと注意するのは,整数と実数の間の演算です.これらは基本的には実数 になります.

    1 / 3 => 0
    1 / 3.0 => 0.333333....

    また,printf で表示する際に,実数を %d で 指定すると,データが壊れることがありますので,注意してください.

  9. 実習

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

  10. 次回の予習範囲

    教科書のp.33まで予習をしてきてください.次回は if 文および if else 文に関する小テストを最初に実施しますので,しっかり予習をお願いします.

  11. 宿題

    宿題についても当日ご案内します.ただし, 宿題の問題を見ることができるのは27日以降になりますので,注意してく ださい.


目次ページに戻る