プログラミング入門 2

    7-1. 復習
    7-2. C 言語の文法1
    7-3. C 言語の文法2
    7-4. アルゴリズム 1

7-1. 復習

プログラムを動かすまで
  1. プログラムのファイルを作る
    1. プログラムの名前を決める。 (xxxx.c と最後が ".c" で終るようにする)
    2. C 言語のプログラムを作成する
    3. 保存する
  2. コンパイル
    gcc プログラムのファイル名
    
  3. 実行
    .\a.exe
    

WWW の一部をドキュメントをプログラムとして取り込んで、コンパイルする方法


7-2. C 言語の文法1

前回のプログラムの解説
1: /* This program prints "Hello World!". */
2: #include <stdio.h>
3: main(){
4:   printf("Hello World!\n");
5: }
1行目: /* コメント */
/**/ で囲まれた部分はプログラムとして解釈されないので、コメントを書き込むことができる。 どこからでも書くことができ、また何行でも書くことができる。 (入れ子構造にはできない)
2 行目: #include
C のコンパイラはコンパイルをする前に前処理をする。 前処理をするのを「プリプロセッサ」と言う。 プリプロセッサの命令は全て「#」記号で始まる。(#define, #ifdef など)
3 行目: main(){ と 5 行目: }
main という関数の定義。詳しい意味は後述
4 行目: printf("Hello World!\n");
OS が提供している出力関数の呼び出し。詳しくは後述。

関数の呼出しと定義

関数は数学の関数とほぼ同じ意味。 値を与えると、定められた処理をして、対応した値を返してくる。

printf("Hello World!\n");
は C 言語の文で、printf という名前の関数を呼出すという意味である。 引数として "Hello World!\n" が与えられる。 この関数を実行すると、Hello World!\n を出力する。 printf は関数の値は出力した文字数を返す。

関数の呼出し方の基本

  1. 返り値 = 名前(引数);
    
    で関数名「名前」という関数に「引数」を与えて呼出す。 関数の返す値は返り値にセットされる。
  2. 関数の返り値が不要ならば、
    名前(引数);
    
    で関数名「名前」という関数に「引数」を与えて呼出す。

関数の定義1

a.exe を実行すると、mainという関数を呼出す。 C 言語でプログラムを作成するには、 main という関数を定義する。

mainの定義は 次のように書く。 (これは正式な記述法ではない。正式な記述は後述。)

main(){
プログラムの内容
}

7-3. C 言語の文法2

 1: #include <stdio.h>
 2: #include <math.h>

 3: main()
 4: {
 5:   float a,b,c,d,kai1,kai2,zitsubu,kyobu;
 6:   a=2.0; b=3.0; c=1.0;
 7:   printf(" %f x^2 + %f x + %f = 0\n",a,b,c);
 8:   d=b*b-4*a*c;
 9:   if(d==0){
10:     kai1 = -b/2/a;
11:     printf("root = %f\n", kai1);
12:   }else{
13:    if( d>0 ){
14:       kai1 = (-b + sqrt(d))/2/a; kai2 = (-b - sqrt(d))/2/a;
15:       printf("root1= %f, root2= %f\n",kai1,kai2);
16:     }else{
17:       zitsubu= -b/2/a; kyobu = sqrt(d)/2/a;
18:       printf("kai = %f +- %fi\n",zitsubu,kyobu);
19:     }
20:   }
21: }
1,2行目: #include <stdio.h> #include <math.h>
printf関数を呼出す時、stdio.hを指定する。 sqrt関数を呼出す時、math.hを指定する。
5行目: float a,b,c,d,kai1,kai2,zitsubu,kyobu;
変数宣言(後述)。使用する変数はあらかじめ宣言する。 float は「浮動小数点」という「」を表す。(「型」も後述)
 6:   a=2.0; b=3.0; c=1.0;
 8:   d=b*b-4*a*c;
14:       kai1 = (-b + sqrt(d))/2/a; kai2 = (-b - sqrt(d))/2/a;
計算式。= の右辺の計算した結果を左辺の変数に代入する。
 7:   printf(" %f x^2 + %f x + %f = 0\n",a,b,c);
11:     printf("root = %f\n", kai1);
15:       printf("root1= %f, root2= %f\n",kai1,kai2);
18:       printf("kai = %f +- %fi\n",zitsubu,kyobu);
printf 関数の使い方。 printf("文字列",変数1,変数2,...) 通常、文字列はそのまま表示される。特殊な文字に特殊な機能が割当られている。
%
%fは浮動小数点の変数の表示位置を表す。
 7:   printf(" %f x^2 + %f x + %f = 0\n",a,b,c);
の場合、 一番目の%faの表示位置、 ニ番目の%fbの表示位置、 三番目の%fcの表示位置を表す。
 9:   if(d==0){
12:   }else{
19:   }
条件文。()内の条件が成立したら最初の{}内の文を実行する。成立しなかったら、elseの直後の文を実行する。 等号条件は=を使わず、==を使用する。 もし、(d=0)と書くと、dに 0 が代入され、常にelse以下の文が実行される。

C 言語で扱えるデータには、整数、実数(浮動小数点)、文字、文字列などがある。

整数
0, 1, 500, -350
実数(浮動小数点)
0.0, 1.1, 1.3E3, -4.5E-3
文字
'a' '\n'
文字列
"abcdef"

浮動小数点とは、有効桁が定まっている実数。(計算機では無限の桁数を扱えない。) float では 7 桁。 x.xxxxxx × 10^yy という形を C 言語では x.xxxxxxEyy で表現する。

型宣言

変数や関数はを持つ。 型には主に、整数型(int)、実数(浮動小数点)型(float)、文字型(char)がある。 変数を使用するにはあらかじめ型宣言をする必要がある。 (文字列型はない。文字列の扱いは次回以降。)

整数型、実数型、文字型

int i;
float a,b;
char c,d,e;

printf の型指定

printf の第一引数の文字列中での変数の型指定

整数型%d
実数型%f
文字型%c

例題

  1. 次のプログラムがどのように動作するか予想しなさい。
  2. 次にプログラムを実際にコンパイルし、予想通り動作するか確かめなさい。
#include <stdio.h>
main(){
   int i;
   float a;
   i=1;
   i=i+1;
   a=0.314E1;
   printf("%d %f\n",i,a);
}

7-4. アルゴリズム 1

プログラミングには、プログラミング言語の知識だけでは不十分。 コンピュータで問題を解決するためには、問題の解決方法を考えることが重要。

問題を解決するための計算方法を アルゴリズム と言う。

演習

  1. 二元連立一次方程式の解法を書きなさい。式は次の通りとし、与えられる値は a,b,c,d,e,f とする。
    a x + b y = e
    c x + d y = f
    
  2. C 言語で二元連立一次方程式を解くプログラムを書きなさい。

注意: 割り算で、0 で割ってはいけない。 この場合、逆行列が存在しない時の処理を考えなければならない。 つまり、行列式を計算して判断しなければならない。

解答例

    1. det = ad - bc とする。
    2. det が 0 でないとき、 x, y は次の式で得られる。
      ┌x┐     1  ┌  d  -b ┐┌ e ┐
      │ │ =  --- │        ││   │
      └y┘    det └ -c   a ┘└ f ┘
      

      従って、 x=(de-bf)/det, y=(-ce+af)/det である。

    3. det が 0 の時: a:b:e=c:d:f ならば ax+by=e を満たす全ての x, y、そうでなければ解無し。 なお、a:b:e=c:d:f は C 言語では判定できない。 a:b=c:d は、ad-bc=0 は既にわかっているので、 a:e=c:f を判定すれば良い。 つまり、af と ce が等しいかどうかを判定すれば良い。
  1. プログラムは次の通りである。
    #include <stdio.h>
    main(){
      float a,b,c,d,e,f,x,y;
      float det;
      a=1.0; b=2.0; c=3.0; d=4.0; e=5.0; f=6.0;
      det = a * d - b * c;
      if(det==0){
        if(a*f==c*e){
          printf("%f x + %f y = %f を満す全ての x, y\n",a,b,e);
        }else{
          printf("解なし\n");
        }
      }else{
        x=(d*e-b*f)/det;
        y=(-c*e+a*f)/det;
          printf("x = %f, y = %f\n",x,y);
      }
    }
    

坂本直志 sakamoto@c.dendai.ac.jp