第 7 回 変数、 if 文

本日の内容


7-1. Cの構文

C 言語には次のような基本的な構文があります。

  1. 計算式の括弧は丸括弧「( )」のみを使用する。
  2. 文の最後にセミコロン「;」を必ず置く。
  3. 中括弧 「{ }」 の間に命令を書く。
  4. /* と */ で囲まれた部分にはメモを書くことができる。

7-2. 変数

コンピュータはデータをメモリーに記憶することができますが、プログラミン グ言語の多くでは、これを行うのに変数と呼ばれる概念を使います。 C 言語の変数にはという考え方があります。 変数と同じ型のデータは記憶できますが、異なる型のデータは記憶できません。 型には次のものがあります。

int
整数型
float
単精度浮動小数点数(実数型)
double
倍精度浮動小数点数(高精度実数型)
char
文字型

変数は a、 hensu など名前をつけて指定します。 C 言語ではプログラムの先頭で、使用する変数の型と名前を登録する必要があ ります(プログラムの途中ではできません)。 これを宣言文と言います。 宣言文はつぎのような構文になります。

型名 変数名1[, 変数名2[, 変数名3 ...]]

例えば単精度浮動小数点型の変数として、 a, b, x の三つの変数名を使う場 合は次のように宣言します。

float a,b,x;

変数の名前は先頭が英字、二文字目以降は英字または数字でなければなりませ ん。a, bb, c123 は変数名として使えます が、1a, a-b-c などは変数名として使用できません。 また、 C 言語では、一つの名前ではひとつのものしか指せません。 a という名前の変数を整数型で宣言したら、再度文字型で使用する ことはできません(cf. オブジェクト指向言語の関数名などは複数の型を取る ことが可能。BASIC 言語は同じ名前でも各型ごとに別々の値を持つことが可能)。 但し、変数名の大文字と小文字は区別しますので、 a と A は別の変数名にな ります。

データを変数に記憶させるには代入文を使います。

変数名 = 式

  a    =  2;
  b    = a+3;

変数名は必ず左辺に来ます。また、式が計算されてから変数に代入されます。 従って次のような代入文を書くことも可能です。

  i = i+1;
  j = 2*j;

この場合それぞれ、 i の内容は 1 増えて(i+1 の結果が i に代入される)、j の内容は 2 倍されます( 2*j の結果が j に代入される)。

整数型

整数を扱う型は整数型と言います。 プログラム中に整数のデータを書く時は、通常の数字の記述法と同じになりま す(位取りのカンマは使用できません)。 なお、二進数、八進数、十六進数などの記入法もありますが、省略します。

int il
i=2;

文字型

文字型の変数は一文字のみを記憶します。 後で出てくる配列を利用すると、文字列を表すことができます。

プログラム中に文字データを書く場合は'a'など、シングルクォー テーションマーク「'」を使用します。 改行は '\n' で表します。 また、シングルクォーテーションマーク「'」、ダブルクォーテーションマー ク「"」、バックスラッシュ(円記号)「\」、疑問符「?」はそれぞれ、'\'', '\"', '\\', '\?' で表します。

char a,b;
a='a';
b='\n';

浮動小数点型

浮動小数点型は、数値計算など実数を使用するような計算に用います。 但し、実数は取り扱えず、有限の桁の精度しかありません。 float に対して double は二倍の計算精度があります。

浮動小数点数のデータは、通常小数点を含む数の表記で表します。 また、 0.3×10-3のようなデータは 0.3e-3 と表します。

float x;
double y;
x=3.14;
y=0.1e-5;

演習7-1

次の式を正しく計算するためには どのような宣言文が必要か答えなさい。

  1. initial = 'D';
  2. menseki = hankei * hankei * 3.141592;
  3. page = 3;

7-3. 外部関数

計算式を書く時、三角関数や平方根など、既に用意されている関数を使用する ことができます。 C 言語で使用できる主な数学的関数にはつぎのものがあります。

sqrt(x)
xの正の平方根を求めます。xの値が負の場合、エ ラーを示す特別な値が返ります。
sin(x)
sin x の値を求めます。xの単位はラジアンです。
cos(x)
cos x の値を求めます。xの単位はラジアンです。
tan(x)
tan x の値を求めます。xの単位はラジアンです。
exp(x)
exの値を求めます。
log(x)
log xの値を求めます。xの値が0や負の場合エラー を示す特別な値が返ります。
pow(x,y)
xy の値を求めます。xy の値によりエラーが発生する場合、エラーを示す特別な値が 返ります。

なお、これらの関数を使用する場合、プログラムの先頭に次の行を書く必要が あります。

#include <math.h>

またこれらの関数の返す値の型は double です。但し、変数に float 型を使 用しても精度が低くなる他は問題ありません。

演習7-2

直角三角形の直角をはさむ辺の長さ a, b が与えられ た時、斜辺の長さ c を求めるプログラムを書きなさい。

演習7-3

三辺の長さが与えられた時、三角形の面積を求めるプログラムを作りなさい。

ヒント1

三角形に垂線を引き、三平方の定理から連立方程式を立て、高さを求める。

三角形に垂線を引く

ヒント2

余弦定理を使って公式を導く(ヘロンの公式)

7-4. printf

printfは画面(標準出力)に文字を書く命令です。 次のような書式になっています。

printf(フォーマットを示す文字列 [, 変数1 [, 変数2 [, 変数3 ...]]])

フォーマットを示す文字列の中に % と英字の組合せを入れると、最初の %+英 字が変数1 の値に、二番目の %+英字が変数2 の値にと、順に変数の値と置 き換わります。 %と英字の組合せには次のものがあります。

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

その他、 %s,%o, %x, %u, %e, %g, %p などありますが、ここでは特に取り上げま せん。

フォーマットを示す文字列はダブルクォーテーションマーク「""」で括ります。 文字列は次回以降の講義で取りあげます。

なお、「%4.2f」など % と英字の間に数を入れると、「最小幅 4 桁、小数点 以下 2 桁」など表示する書式を表すことができます。詳しくは専門書を参照し てください。

演習7-4

次のプログラムの最後に printf 文を書き、変数の内容を表示させなさい。

#include <stdio.h>
main(){
  int x;
  double y;
  char z;
  x=1;
  y=3.141592
  z='a';
  /* ここに printf 文を書き、変数の内容を表示させる */
}

7-5. if文

if 文は条件式が正しい時と正しくない時で動作を変える場合に使用します。 構文は次の通りです(但し、 else 以下は必要ない場合、省略することができま す)。

if(条件式){
   条件が正しい時の動作
}else{
   条件が正しくない時の動作
}

例えば、方程式 ax+b=0 を満たす xを求めることを考えましょう。 この時、a の値が 0 か 0 でないかで解き方が異なります。 これを C 言語では次のような構文で書きます。

if( a が 0 である){
    a が 0 の時の解法
}else{
    a が 0 でない時の解法
}

「a が 0 である」という条件式は次のように書きます。

   a==0

「等しい」という条件は、イコール記号「=」を二つ続けて書くことに注意して 下さい。一つだけ書くと「変数 a に 0 を記憶しなさい」という別の意味になっ てしまい、エラーは一切出ませんが、プログラムが正常に動作しません。 なお、イコール記号を重ねなかった時にエラーが出てしまうように 0==a と書く人もいます。 ただ、これは左辺が数字のときだけうまくいくという部分的な解決法なので、根本 的な理解やチェックのこつを学ぶ上では妨げになるという見方もあります。

イコール記号二つで「等しい」を表す他に、条件を表現する記号には次のようなも のがあります。

a != b
a と b は等しくない
a < b
a は b より小さい
a > b
a は b より大きい
a <= b
a は b 以下
a >= b
a は b 以上

演習7-5

次のプログラム program 1 は方程式 ax+b=0 を解くように見えま すが、かなりおかしいところが(全部で 5 箇所)あるので正しい答を求められ ません。 このプログラムを正しく動くように直して、次の方程式の解を求めなさい。

  1. 2x-4=0
  2. -2x+1=0
  3. 0x+3=0
  4. 0x+0=0
/* program 1 */
#include <stdio.h>
main(){
  int a,b,x;
  a=2;
  b=-4;
  if(a=0){
    if(b=0){
      printf("x は任意の数\n");
    }else{
      printf("解なし\n");
    }
  }else{
    x=b/a;
    printf("x = %d\n",x);
  }
}

ヒント

それぞれの解をまず手計算で求めて、プログラムの出力と比較しなさい。

演習7-6

二次方程式 ax2+bx+c=0 (a≠0) の解を求 めるプログラムを書きなさい。但し、解は公式により次のように得られます。

D = b2-4ac と置いた時、

     -b ± √D
x = -----------
        2a

作ったプログラムで次の方程式を解きなさい。

  1. 2x2-5x-3=0
  2. x2+2x+1=0
  3. x2-2x+5=0

ヒント

D が負だと解は複素数になりますが、C 言語は複素数を扱えません。従って D の符号(0 との大小関係)を調べてから処理する必要があります。

また、上の問題の解は次のような表示にしなさい。

  1. x = 3, -0.5
  2. x = -1
  3. x = 1 ± 2 i

演習7-7

方程式 ax2+bx+c=0 の解を求 めるプログラムを書きなさい。 a = 0 の場合、方程式の次数が 1 次以下に落ちることに注意しなさい。

作ったプログラムで次の方程式を解きなさい。

  1. 2x2-5x-3=0
  2. x2+2x+1=0
  3. x2-2x+5=0
  4. 0x2-2x+4=0
  5. 0x2-0x+5=0
  6. 0x2-0x+0=0

演習7-8

次の連立方程式を解くプログラムを作りなさい。 ad-bc=0 の時、解の存在条件を吟味しなければならない点に注意しなさい。

ax + by = e
cx + dy = f

できたプログラムで次の方程式を解きなさい。

  1.   x -  y =  0
      x +  y =  2
    
  2.  2x -  y =  1
    -4x + 2y = -2
    
  3.  2x +  y =  1
     4x + 2y = -2
    
  4.  0x + 0y =  1
     4x + 2y = -2
    
  5.  0x + 0y =  0
     4x + 2y = -2
    

坂本直志 <sakamoto@c.dendai.ac.jp>
東京電機大学工学部情報通信工学科