情報科学演習
2016.10.24

Back to index page



  1. 本日の作業内容

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

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

  3. 課題の提出について

    1年生の皆さんには初めての宿題の提出でしたが,いくつか不備の答案が出てきたのは残念です.以下に問題のあるものの例を示しておきますので,参考にしてください.次回以降はこのようなことにならないように注意しましょう.

    まず,採点対象外のものは下記になります.

    警告が出たもの: b1638 b1670 b1529 b1269
    コンパイルエラー: b1657 program5
    解答用紙不使用: b1556

    次に,プログラムの中身の問題ですが,まずはインデント(字下げ)の不備のものが,特に1年生に多かったので,紹介します.意味がわからなければ,授業中に聞いてください.

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

    上のようにTABの個数が揃っていなくでずれているものが結構見られました.

    /*      この行以降に解答のプログラムを書くこと        */
            #include 
    
            main()
    
            {
                    int a=100, b=101, c=102, d=103;
       
                    printf("My student number: s164001\n");
                    printf("%4d\n", a);
                    printf("%c%c%c%c\n",a,b,c,d);
                    printf("-------------------------------------------\n");
                    return(0);
            }
    

    これも先週の授業中に気づいた人には言ったのですが,main() などは下げません.教科書をよく見てください.下げるのは中括弧 { } が出てきてからです.

    #include
    
    main()
    {
                    int a=100,b=101,c=102,d=103;
    
                    printf("My student nunber: s164011\n\n");
                    printf("%4d\n", a);
                    printf("%c%c%c%c\n\n",a,b,c,d);
                    printf("-------------------------------\n");
                    return(0);
    }
    

    TABの個数が多すぎて,下がり過ぎの例です.

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

    これも時々見られるのですが,return(0); まではインデントが必要です.

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

    これはgeditで,自動でTABが入る設定にしている場合に,生じる問題です.最後の閉じカッコまで字下げされるので,手動で先頭に揃える癖をつけてください.

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

    下がり方がまちまちでTABが多すぎるところがあります.

    次に示すのは,間違ったプログラムの例です.

            printf("%cdefg \n");
    

    %c のところに代入するべき変数が指定されていません.

            printf("%d\n",a);
    

    数字の表示部分は4桁分確保してもらうように,問題のところでわかりやすく見せていたつもりでした.この間違いは過年度生に多かったので,今一度%記法の桁数指定を見なおしておいてください.

    	printf("%s\n",defg);
    

    %s は文字列に対して行います.また,変数は一つ一つカンマで区切らないと,別の変数になります.

    	printf("\n\n%4d\n",a ,b ,c ,d);
    

    二重引用符の中には %d がひとつだけですが,うしろに4つの変数を指定していますので,数があっていません.

    	printf("\nMy student number: s124069\n\n",a);
    

    こっちは反対に二重引用符の中には%で指定する値が無いのに,後ろに変数を指定しています.

    他には,学生番号の表示部分が99番のままだったり,名前がなかったり,ハイフンの線がなかったり,というような回答もいくつか見られましたので,次回からはそちらも注意してください.

  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で割った 余りを使用して実行できます.すなわち,今日の24日を7で割ると余りは3ですが, 余りが3になる日は全て月曜日です.

        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日以降になりますので,注意してく ださい.


目次ページに戻る