PREVIOUS | TOP | NEXT

(第7回)C言語のプログラムの流れの制御1 (条件分岐)

今日の目標

  1. 今回は前回の復習、およびとそのつづきとして、 プログラムの流れの制御その1(条件分岐・選択) に取り組みます。

参考書

プログラミング言語C 以降、K & Rと略記します。

筆者のつくったPDFの資料

タッチタイピング

プログラミングの練習に関連して、 タイピングの練習もするのはよいことでしょう。 いわゆるタッチタイピング(キーボードを見ないで タイプする)です。暇なときに練習してみてください。 フリーソフトもいくつかあります。 たとえば、e-typingを使うことが できます。

C言語入門(前回の復習とそのつづき)

C言語のコンパイルと実行の流れ(復習)

  1. プログラミング言語で書かれたソースコード を記述したファイル(=ソースファイル、「*.c」。 いま、仮に「file1.c」としておきましょう)を作成します。
    $ emacs file1.c &
    
  2. ソースファイルをgccに翻訳してもらいます。
    $ g++ file1.c
    
  3. できあがったファイルを実行します。
    $ ./a.out
    
  4. コンパイル時、実行時に出るエラーを直す。

基本的な文法(復習とつづき)

まず、前回のプログラムを 再度挙ておきます。
// sansu2.c

#include <stdio.h>

int main() {
    int a, b, c;

    printf("Enter an integer a: ");
    scanf("%d", &a);
    printf("Enter an integer b: ");
    scanf("%d", &b);

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

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

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

    c = a / b;
    printf("a / b = %d\n", c);
 
    return 0;
}
実行結果
    内容を再訪しましょう。
  1. 主関数

    Cのプログラムには主関数(main)がただひとつ存在します。 プログラムは主関数から始まります。波括弧「{, }」 のなかがその定義となります。

  2. 変数とその宣言

    変数はメモリ内の位置を 部屋のようなものとかんがえればよいでしょう。 宣言は変数の型の名前と変数のリストから成ります。 Cでは、ふつうは関数の初めに変数の宣言を します。

    float upper, lower; (単精度実数型)
    double x, y;    (倍精度実数型)
    int fahr, celsius; (整数型)
    
  3. 変数の初期化
  4. 初期化は変数に初期値をセットすることです。 つまり、変数のメモリ領域に、じっさいにビット(0または1) の列が入ることです。
    lower = 0;
    upper = 300;
    
  5. 基本的な演算子
  6. 代入演算子「=」

    右辺を左辺に代入する。

    a = b;
    a = a + 1;
    
    算術演算子「+, -, *, /, %」

    「✕」、「÷」は、それぞれ、「*」、「/」で表わします。 整数型どうしの時は、「/」では切り捨てが行われることに 注意が必要です。「%」は整数どうしの演算で余りを 計算します。

    celsius = 5 * (fahr - 32) / 9;
    
    q  = a / b;
    r = a % b;
    
    標準出力
      printf("a + b = %d\n", c);
    
    %dのところに変数cの内容を10進整数で出力する。 標準入力
    scanf("%d", &a);
    
    キーボードから10進整数を読み込み、 変数aの箱に入れる。 そこで、 単精度実数型で四則演算を行なうと
    // sansu2a.c
    
    #include <stdio.h>
    
    int main() {
        float a, b, c;
    
        printf("Enter a real number a: ");
        scanf("%f", &a);
        printf("Enter a real number b: ");
        scanf("%f", &b);
    
        c = a + b;
        printf("a + b = %f\n", c);
    
        c = a - b;
        printf("a - b = %f\n", c);
    
        c = a * b;
        printf("a * b = %f\n", c);
    
        c = a / b;
        printf("a / b = %f\n", c);
     
        return 0;
    }
    
    課題1
    倍精度実数で四則演算をおこなってください。 関係・等値演算子

    演算子と用例 意味
    a > b aはbより大
    a >= b aはb以上
    a < b aはbより小
    a <= b aはb以下
    a == b aとbは等しい(論理的等価)
    a != b aとbは等しくない


    論理演算子

    演算子と用例 用例 意味
    ! !a 論理的否定。真偽を反転させる。
    && (a == b) && (c == d) かつ。論理積を取る。
    || (a == b) || (c == d) または。論理和を取る。
  7. 標準入出力
  8. モニターへの出力が標準出力。 キーボードからの入力が標準出力。 そのための関数群を取り込むために
    #include <stdio.h>
    
    と書くのでした。

    標準出力

    演算子と用例 意味
    printf("%d + %d = %d\n", a, b, c); a, b, cを順に%dの箇所に 10進整数で出力する。
    printf("%3.0f %6.1f\n", fahr, celsius); fahr, celsiucを順に%fの箇所に 実数で出力する。fahrは、すくなくとも3文字幅 (小数点を込める)、小数点以下なし。celsiusは、 すくなくとも6文字幅、小数点以下3桁。
    printf("%c", c); cを半角文字として出力する。
    putchar(c); cを半角文字として出力する。

    標準入力

    演算子と用例 意味
    scanf("%d", &a); キーボードから読み込んだ10進整数を変数aに入れる。
    scanf("%d %d", &a, &b); キーボードから10進整数をふたつ、空白を置いて 読み込む。
    scanf("%d", &a); キーボードから読み込んだ10進整数を変数aに入れる。
    scanf("%f", &a); キーボードから(10進の)単精度実数を読み込む。
    scanf("%lf", & a); キーボードから(10進の)倍精度実数を読み込む。 「%lf」は「エル・エフ」である。
    scanf("%lf", &a); キーボードから(10進の)倍精度実数を読み込む。 「%lf」は「エル・エフ」である。
    scanf("%c", &c); cを半角文字として入力する。
    getchar( ); cを半角文字として入力する。

  9. プログラムの流れの制御(概論)
  10. プログラムは、主関数(main)から始まり、とくべつな流れの制御の指示 がなければ、上の行から順番に実行されます(連続、逐次的実行)。 流れの制御の種類としては、ある条件をみたすかどうかによって プログラムの流れを分岐して選択させる(分岐、選択)、および、 ある条件をみたすときに、プログラムのある部分を連続的に繰り返すもの (繰り返し、ループ)があります。 (ジャンプするようなものは省きます。)

    いかなるプログラムも、上記の(i)連続 (ii)分岐・選択 (iii)繰り返し(ループ)の3種類をつかって構成することができます。

    実際のプログラムでは、 (i)連続 (ii) 分岐・選択 (iii) 繰り返し(ループ)の3種類を 組み合わせて用いることになります。いくつかの例を、 以下に、 模式的に挙げてみることにします。

  11. プログラムの流れの制御(選択、if-else)
  12.   if (式1)    {                     
                  文 1;
       }
       else    {                   
                  文 2;
         }
    
    if 文では、括弧『(』、『)』のなかの「式 1」が真(true)のときに、「文 1」が実行される。 「式 1」が偽(false)のときには、if ブロックには入らず、elseブロックのほ うに進み、「文 2」を実行します。 ここで、真というのは、「式 1」の値が0以外のときで、偽は「式 1」の値が0に なるときです。elseブロックは省略することができます。
    /* saikoro1.c */
    /* 丁か半か?  */ 
    
    #include <stdio.h>
    
    int main()  {
     
       int a, b, c; 
         
       printf("サイコロの目をふたつ(a, b)入力してください。\n "); 
       printf("a: "); 
       scanf("%d", &a);  /* ひとつめのサイコロの目の数 */ 
       printf("\nb: "); 
       scanf("%d", &b); /* ふたつめのサイコロの目の数 */ 
        
       c = a + b; /* サイコロの目の数の和 */ 
    if ((c % 2) == 0) /* 目の数の和が偶数のとき*/    { 
          printf("%d, %d の「丁」\n", a, b); 
       } 
       else /* 目の数の和が奇数のとき*/     { 
          printf("%d, %d の「半」\n", a, b); 
       } 
    
        return 0;
    } 
    
    サイコロ賭博でよくある風景です。 ほんらい乱数などでサイの目をきめるべきです。 しかし、ここでは、いかさまの意図はありませんが、 、手動にしてあります。 また、丁・半の分類だけで、「ぞろ目」の場合をとくに区別はしていません。

    課題2

     摂氏温度と華氏温度の変換は、つぎのようになっている。
    (華氏温度) = (摂氏温度) * 9 / 5 +32
    となっている。
    いま、摂氏温度、あるいは華氏温度がわかっているとき、 もう一方の表示での温度を計算し、両者を端末に出力せよ。 適当な標準入力により2つのコースを選択するように 設定することが必要である。

    ◎実行例◎
    [matsu@localhost Documents]$ g++ ondo1.c
    [matsu@localhost Documents]$ ./a.out
    摂氏・華氏の温度変換をします。
    摂氏→華氏のときは、0を入力してください。
    華氏→摂氏のときは、1を入力してください。
    0
    摂氏温度をあたえてください。
    100
    摂氏: 100.00度, 華氏: 212.00度
    [matsu@localhost Documents]$ ./a.out
    摂氏・華氏の温度変換をします。
    摂氏→華氏のときは、0を入力してください。
    華氏→摂氏のときは、1を入力してください。
    1
    華氏温度をあたえてください。
    212
    摂氏: 100.00度, 華氏: 212.00度
    [matsu@localhost Documents]$ ./a.out
    摂氏・華氏の温度変換をします。
    摂氏→華氏のときは、0を入力してください。
    華氏→摂氏のときは、1を入力してください。
    0
    摂氏温度をあたえてください。
    0
    摂氏:  0.00度, 華氏: 32.00度
    [matsu@localhost Documents]$ ./a.out
    摂氏・華氏の温度変換をします。
    摂氏→華氏のときは、0を入力してください。
    華氏→摂氏のときは、1を入力してください。
    1
    華氏温度をあたえてください。
    0
    摂氏: -17.78度, 華氏:  0.00度
    

    今日の提出課題

    課題2のソースコードに実行結果を二つ三つ 付けたファイルを印刷して、提出せよ。 A2あるいはB2, 学籍番号, 名前を大きく書いてください。
    PREVIOUS | TOP | NEXT