C言語の解説と演習(第四回)


内容

  1. はじめに
  2. さらにさらにその次の一歩
  3. 演習問題

1. はじめに

前回は goto 命令を説明しましたが、実は C言語において、goto 命令が使われることはまれで、なるべく goto 命令は使わないでプログラムを作ることが望ましいといわれています.これは、goto 命令を多用したプログラムでは、どうしてもプログラムの流れが非常に読みづらくなってしまうからです(このように goto 命令を多用したため、分かりづらくなってしまったプログラムを、俗にスパゲッティプログラムと呼びます.プログラムの流れが、スパゲッティのように複雑に入り組んでいるからです).これを防ぐため、なるべく goto 命令を使わないでプログラムを作ることを、「構造化プログラミング」と言います.
今回は、C言語における構造化プログラミングの要である for 命令を取り扱います.C言語における for 命令は BASIC における for 命令よりはるかに柔軟性があり、これと if 命令さえ知っていれば、たいていのプログラムはかけてしまうほど強力です。
一度にいろいろとやると混乱してしまうかもしれないので、今回は BASIC の for 命令と同じような使い方だけを紹介します。


2. さらにさらにその次の一歩

今回は、「BASICプログラミング」の「for命令を使う」をC言語に変えてみましょう.「for 命令を使う」はBASIC で書かれた次のようなプログラムでした.


10 input "足す数の個数 n=",n
20 sum = 0
30 for i=1 to n
40   a = i
50   sum = sum + a
70 next i
80 print "合計=",sum
90 end

このプログラムは、「BASICプログラミング」の「1から n までの数の和を計算する」と全く同じ計算するプログラムです。プログラムの流れは以下の通りです.
まず、行番号 10 で n を入力し、行番号20 で変数 sum に 0 を代入します.行番号 30 の for i=1 to n と行番号 70 の next i が対応しており、行番号 30 から行番号 70 の間が、変数 i の値を i = 1, 2, 3, .... n と変えながら、 n 回実行されます.例えば n = 3 の時には

行番号 30 : 変数 i の値が 1 にセットされる.
行番号 40 : a = 1 が実行され、変数 a の値が 1 になる.
行番号 50 : sum = sum + 1 が実行され、変数 sum の値が 1 になる.
行番号 70 : next i が実行され、プログラムが行番号 30 へ飛ぶ.
行番号 30 : 変数 i の値が 1 つ増やされ、2 になる.
行番号 40 : a = 2 が実行され、変数 a の値が 2 になる.
行番号 50 : sum = sum + 2 が実行され、変数 sum の値が 3 になる.
行番号 70 : next i が実行され、プログラムが行番号 30 へ飛ぶ.
行番号 30 : 変数 i の値が 1 つ増やされ、3 になる..
行番号 40 : a = 3 が実行され、変数 a の値が 3 になる.
行番号 50 : sum = sum + 3 が実行され、変数 sum の値が 6 になる.
行番号 70 : next i が実行され、i が n と等しいので、次の行番号 80 へ行く.

という流れでプログラムが動き、変数 sum に 1 から n までの和、つまり 6 がセットされます.
行番号 80 で、その sum の値を表示し、行番号 90 でプログラムを終了します.
上の BASIC のプログラムを C 言語に書きなおすと、次のようになります.

#include <stdio.h>

main()
{
  int sum,i,n,a;
  
  printf("足す数の個数 n=");
  scanf("%d",&n);
  sum = 0; 

  for (i=1;i<=n;i=i+1) {
    a = i;
    sum = sum + a;
  }

  printf("合計=%d¥n",sum);
}


上の C のプログラムを順に見ていきましょう.
まず、

#include  <stdio.h>

ですが、これはおまじないだと説明しましたね.

main()
{


の部分は関数 main() の定義で、C のプログラムは実行されると、必ずこの関数から実行されると「第一回の解説」で説明しました.次に

 int  sum,i,n,a;

ですが、これは変数の宣言です.C のプログラムでは使う変数は必ず宣言しなければなりません.これも「第一回の解説」で説明しました.

 printf("足す数の個数 n=");
 scanf("%d",&n);


の部分は BASIC のプログラムの行番号 10 に相当しています.このあたりは「第二回の解説」で説明しましたので、分からない人はもう一度そこを読んでください.次の

sum = 0;

はBASIC の行番号 20 に相当しており、変数 sum に 0 を代入しています.
次にいよいよ今回の解説のメインである for 命令が出てきます.プログラムの解説をするまえに for 命令について簡単に説明しましょう. for 命令は、次のような形をとります.

for (初期設定;条件;終端設定) {
  命令1;
  …
  命令n;
}


上の for 命令は、次のプログラムと全く同じ意味を持ちます

初期設定;
loop:
if  (!(条件))  goto  finish;
命令1;
.…
命令m;
終端設定;
goto loop;
finish:

上のプログラムで loop と finish はラベルです.ラベルは「第三回の解説」で説明しているので、わからない人はそれを見てください.また、

if  (!(条件))  goto  finish;

はもし条件が満たされなければ finish へ行けという命令です.
つまり、まず初期設定を実行し、その次に条件が満たされるかどうかを調べ、もし条件が満たされなければ、finish へ行き、for 命令を終了します.条件が満たされる場合には、命令1、….、命令mと実行し、最後に終端設定を行ってたのちにまた loop のところへ戻ります.そしてまた条件が満たされるかどうかのチェックを行います.以下同様に、条件が満たされなくなるまで、命令1、…、命令m、終端設定の実行を繰り返します.
よって上の C のプログラムの

  for (i=1;i<=n;i=i+1) {
    a = i;
    sum = sum + a;
  }
の部分は、

i = 1;
loop:
if  ( !(i <= n) )  goto  finish;
a = i;
sum = sum + a;
i = i+1;
goto loop;
finish:

と同じ意味になります.このプログラムを実行すると、例えば n = 3 の時には

i = 1; で i に 1 がセットされます.
if ( !(i <= n) ) goto finish; の部分では i <= n なので、何も起こりません.
a = i; で a に i (=1) がセットされます.
sum = sum + a; で sum に sum + a (=1) がセットされます.
i = i+1; で i の値を一つ増やされ、2 となります.
goto loop; で loop のところへプログラムが飛んでいきます.
if ( !(i <= n) ) goto finish; の部分では i <= n なので、何も起こりません.
a = i; で a に i (=2) がセットされます.
sum = sum + a; で sum に sum + a (=3) がセットされます.
i = i+1; で i の値を一つ増やされ、3 となります.
goto loop; で loop のところへプログラムが飛んでいきます.
if ( !(i <= n) ) goto finish; の部分では i <= n なので、何も起こりません.
a = i; で a に i (=3) がセットされます.
sum = sum + a; で sum に sum + a (=6) がセットされます.
i = i+1; で i の値を一つ増やされ、4 となります.
goto loop; で loop のところへプログラムが飛んでいきます.
if ( !(i <= n) ) goto finish; の部分では i <= n ではないので、finish のところへ飛んでいきます.

のようにプログラムが動きますから、BASIC の行番号 30 から 70 と全く同じことをしているのが分かります.
上の for 命令の説明は難しくてよく分からないと思った人は、とりあえず C言語では

  for (i=1;i<=n;i=i+1) {
    命令1;
   …
   命令m;
  }
とかけば、命令1から命令mまでが n 回実行され、その間、i の値は 1,2,3,...,n と一つずつ増やされると覚えておけば良いでしょう.つまり、上のプログラムは BASIC の

for  i = 1  to  n
 命令1
 …
 命令m
next  i


と同じになります.
C のプログラムの解説に戻ると、最後に

printf("合計=%d¥n",sum);

で変数 sum の値を合計値として表示しています.
上のプログラムを cygnus でコンパイルして、実行すると

足す数の個数 n=

と聞いてきますから、

10 [ENTER KEY]

と入力すると

合計=55

と 1 から 10 までの合計値 55 を計算して、表示するはずです.
これで今回の解説を終わります.今回もいろいろと新しいことが出てきました.

  1. for 命令は

    for (初期設定;条件;終端設定) {
      命令1;
      …
      命令n;
    }


    の形でつかう.これは

    初期設定;
    loop:
    if  (!(条件))  goto  finish;
    命令1;
    .…
    命令m;
    終端設定;
    goto loop;
    finish:


    と全く同じ意味である.
  2. BASIC の

    for  i = 1  to  n
     命令1
     …
     命令m
    next  i


    は C 言語では

      for (i=1;i<=n;i=i+1) {
        命令1;
       …
       命令m;
      }
    

    となる.
  3. if 命令において

    if  (!(条件))  命令;

    と書けば、条件が満たされないときに命令が実行される.


 

3. 演習問題

今回の C のプログラムを利用して、n! = 1 x 2 x 3 x … x n を 計算するプログラムを作れ.

答えを見る