PREVIOUS | TOP | NEXT

(第6回)C言語の初歩

今日の目標

  1. C言語のプログラムを書いてコンパイル実行できるようになる。
  2. 標準入出力(キーボードからの入力、端末への出力)に慣れる。
  3. 変数、算術計算をおこなう。

参考書

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

筆者のつくったPDFの資料

C言語入門

C言語のコンパイルと実行の流れ(絵のない額縁)

  1. emacs などのテキストエディタでソースファイル(ここでは例としてファイル名をfilename.cとする)を作成する。
    emacs filename.c
  2. ソースファイルをコンパイル(c 言語⇒機械語に変換すること)する。
    g++ filename.c
  3. コンパイル時にエラー(構文上の誤り, syntax error)が出たら、ソースファイルにもどっ て修正する。 ある種の意味的な誤り(semantic error)もこの時点で見つけられることもあります。
  4. 出来上がったプログラムを実行して、動作確認。
    ./a.out
  5. うまく動作しないときは、ソースファイルの修正からやり直し。 実行時のエラーには、意味的な誤りと論理的な誤り(logical error)があります。
    参考文献:
    L. ゴールドシュレーガー & A. リスター(武市・小川・角田 訳) 『計算機科学入門 第2版(Computer Science)』、 (近代科学社、2000年)、第2章第2節。)

練習(準備運動)

  1. ソースファイルの作成。
    次のC言語プログラムソースファイルを emacs で作成してください。ファイル名は hello.c としましょう。
    (C言語のソースファイルは、かならず .c で終わるファイル名を作ることになっています。)
    $ cd Documents
    $ emacs hello.c &
    
    /* Time-stamp: <作成日の日付 作成者>
     *
     * Hello, World を出力するだけのプログラム
     * 
     */
    
    #include <stdio.h>
    
    int main () {
      printf("Hello, World!\n");
      return 0;
    }
    
    この後、もちろん、
    emacs で、C-x C-s (保存)
    
    その後、
    $ ls 
    
    として、「hello.c」のできていることを観ましょう。 端末内で、「hello.c」の内容を確認するには、 less コマンドをつかいます。
    $ less hello.c
    
    すると、ファイルの内容を閲覧することができます。 lessコマンドを終了するときは q です
  2. コンパイル
    linux でのC言語のコンパイルは g++ というコマンドを用います(参考 書 K & R 『プログラミング言語C』では cc というコマンドを用いるとなっているものです)。
    以下を実行すると、hello.cをコンパイルして、新たにa.outというファイルを作成します。これが実行ファイル(プログラム)です。
    $ g++ hello.c
    
    あるいは、
    $ gcc hello.c
    
    としてもかまいません。
    何もメッセージが表示されなければコンパイルは無事に成功しているはずです。a.outが作成されたことを ls で確認しましょう。
    もし何らかのメッセージが出力されたときは、なにかソースコードに不具合があったことを示しています(コンパイルエラーが起きたといいます)。emacsでソースコードを確認して、間違いを修正してください。
    新たに作成するファイル名を a.out 以外のものにしたいときは mv で名前を変更するか
    $ g++ -o outputfilename  hello.c
    
    とすればできます。
  3. プログラムの実行
    以下の様に実行ファイル a.outのパスを入力して Enter すれば、 プログラムは実行されます。
    $ ./a.out
    Hello, World!
    $
    
    うまく出力されましたか?出力結果が期待(仕様)どおりになれば、プログラミングは完了です。
    もし、期待通りの動作をしない場合は、 (基本的に)ソースコードに、意味的な誤り、あるいは、論理的な誤り(logical error)があることになります。この場合はソースコードを修正するところからや り直して、期待通りの動作をするまで繰り返すことになります。

C言語 変数宣言、算術計算

 C言語によるプログラミングの初歩を さらに、かんたんな例で学んでいきます。
例1

/*   ***** sansu1.c ***  */
// sansu1.c

#include <stdio.h>

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

    a= 200;
    b = 1300;

    c = a + b;

    printf("a + b = %d\n", c);
    
    return 0;
}
  • コンパイルする。
    g++ sansu1.c
    
    エラーが出た場合、3. にもどって、 「sansu1.c」を編集し直す。
    エラー表示がなく、プロンプト (入力を促す記号、ここでは「$」) が出た場合、以下に進む
  • ファイル「a.out」ができているか、 確認する。
    ls (と入力してEnter)
    a.out hello.c sansu1.c(表示が出る)
    
  • 実行
    ./a.out
    a + b = 1500 (表示が出る)
    

    代入演算子「=」

    右辺を左辺に代入する。

    a = b;
    a = a + 1;
    

    演算
     c = a + b;
    

    標準出力
      printf("a + b = %d\n", c);
    
    %dのところに変数cの内容を10進整数で出力する。

    練習課題1

    a = 100, b = 200のとき、3 * a + b を計算し、 端末に出力してください。

    ●Cのプログラムの基本構造

    1. 全体の構造
      #include <stdio.h>
      ...
      
      main()
      {
          変数の型宣言とその初期化
          ......
          変数をつかった演算等
          
          出力
      }
      

      入出力

      // 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;
      }
      
      実行結果
      ./a.out
      Enter an integer a: 100
      Enter an integer b: 30
      a + b = 130
      a - b = 70
      a * b = 3000
      a / b = 3
      

      標準入力
      scanf("%d", &a);
      
      キーボードから10進整数を読み込み、 変数aの箱に入れる。 演算
      a + b = 130
      a - b = 70
      a * b = 3000
      a / b = 3
      
      整数型変数の割り算は切り捨てになる ことに注意する!!

      練習課題2

        キーボードから整数a,bを読み込んで、
      3 * a + b、および、3 * (a + b) を計算し、 端末に出力してください。

      printfの書式を整えるには、

      webページで調べるのも手。

      いままでの基本的な文法

      1. 主関数

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

      2. 変数とその宣言

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

        float upper, lower;
        int fahr, celsius;
        
      3. 変数の初期化
      4. 初期化は変数に初期値をセットすることです。 つまり、変数のメモリ領域に、じっさいにビット(0または1) の列が入ることです。
        lower = 0;
        upper = 300;
        

          [解説]代入演算子(再登場)

          C言語では、変数aの値を 計算によって新しい値にしたい場合に、

          a = a + 2;
          

          とします。 これにより「(新しい a) = (前の a) + 2 」が実現されます。 計算機が a = a + 2 を処理するときに、 単純な演算に分解して処理すると理解してください。 つまり、最初に a+2 を計算しその値 p = (a+2) を保持します。 次に、a=p という代入演算を行ないます。 つまり、計算機は二つの演算子「+」と「=」の どちらを最初に処理するかという優先順位のルールをもっていて、 変数はその演算に応じて書き換えられていきます。 (注意) a = a + ba = a - b といったタイプの計算は頻繁に行われるので、a += ba -= bといった 省略表現がC言語の代入演算子のバリエーションとして用意されています。

          [解説]インクリメント演算子

          i++i--i = i + 1 (またはi += 1) i = i - 1 (またはi -= 1) という意味で、インクリメント(デクリメント)演算子と 呼ばれます。 前置き++iと後置きi++があり、 i にとっては違いがありませんが、 (++i) の値は i+1 であり、 (i++) の値は i という違いがあります。

          今日の提出課題

          つぎのプログラムを作成し、ソースコード、 および実行結果を合わせたファイルを を印刷して提出すること。 その際、ソースコード内に作成者の名前をコメントとして含ませること。
          1. 練習問題2
          テキストファイルを印刷するには、 ソースコードに実行結果を コメントとして、 貼り付けたファイルを
          emacsのメニューで
          「ファイル」→「印刷」
          とした後、出てきたウィンドウで「OK」
          

          とすればよい。


          PREVIOUS | TOP | NEXT