C言語の解説と演習

(第三回)

メニュー

「N88BASICについて」へ行く

「C言語の解説と演習(第二回)」へ行

トップページへ行く

質問箱へ行く



はじめに

この解説も3回目になりました.ここまでの内容がまだよく分かっていない人は、「C言語の解説と演習(第一回)」「C言語の解説と演習(第二回)」をよく読んでおいてください.読んでもよく内容がわからない人は質問箱にわからない点を書き込んでください.だんだん内容が難しくなっていきます.今回は if 命令と goto 命令を取り扱います.


さらにその次の一歩

今回は、「N88BASIC について」「if 命令と goto命令」をC言語に変えてみましょう.if 命令と goto命令はBASIC で書かれた次のようなプログラムでした.

10  input "a=",a
20  input "b=",b
30  print "a+b=",a+b
40  input "もう一回? (yes=1/no=0)",ans
50  if ans=1 then goto 10
60  end


このプログラムは 10行目で変数 a へ、20行目で変数 b へキーボードから入力した値を代入し、30行目で a+b を表示させるところまでは、前回の BASIC のプログラムと同じです.その後に、

もう一回? (yes=1/no=0)

と画面に表示し、キーボードに 1 を入力すると、もう一度行番号 10 に戻って、a+b の計算をやり直します.キーボードに 0 を入力すると行番号 60 へ行き、プログラムを終了します.
このプログラムを C のプログラムに書きかえると次のようになります.


#include  <stdio.h>
main() {

    int a,b,ans;
 
start: 
    printf("a=");
    scanf("%d",&a);
    printf("b=");
    scanf("%d",&b);
    printf("a+b=%d ¥n",a+b);
    printf("もう一回? (yes=1/no=0) ¥n");
    scanf("%d",&ans);
    if (ans==1) goto start;

}
      

printf("a="); から printf("a+b=%d \n",a+b); までは先週の演習問題の解答そのものです.これは BASIC のプログラムの行番号 10 から 30に対応しており、変数 a,b にキーボードからの入力値を代入した後に、a+b を計算し、表示します.そのつぎにある

printf("もう一回? (yes=1/no=0) ¥n");
scanf("%d",&ans);

は BASIC のプログラムの行番号40に対応しており、画面に

もう一回? (yes=1/no=0)

と表示した後、キーボードからの入力を変数 ans に代入します.この辺りの説明がわからない人は、前回の「C言語の解説と演習(第二回)」をもう一度見てください.
その次に出てくる if 命令

if  (ans==1)  goto  start;

が今回、重要なテーマの一つです.この命令は BASIC のプログラムの行番号 50 の

50  if  ans=1  then  goto  10

に対応しています.これは変数 ans の値が 1 と等しければ、start へ行けという命令です. 以下、C言語の if 命令と goto 命令を説明します.
C 言語の if 命令は

if  (条件文)  実行文;

の形をしており、条件文が真になれば、実行文が実行されます.例えば

if  ( a == 1 )  printf("a=1");

は変数 a の値が 1 ならば、a=1 と画面に表示する命令です.
C言語の if 命令は BASIC の if 命令と大体同じですが、いくつか細かい点が異なっています.
  1. 条件文(上の a == 1 の部分のこと) を上のようにカッコでくくる.
  2. a と 1 が等しいという条件を BASIC のように a = 1 でなく a == 1 と書く.
  3. BASIC の if 命令にある then は書かない.
次に goto 命令について説明します.これも BASIC の goto 命令とほとんど同じであり、

goto 行き先

とすると、「行き先」のところへ飛んでいく命令です.BASIC の goto 命令との唯一の違いは、行き先を指定するのに行番号を使わないことです.C言語では行番号をプログラムに書かないので、行き先として BASIC のように行番号を指定するということができません.そこで、「ラベル」というものを使います.上のCのプログラムをよく見てみると、変数宣言の

int a,b,ans;

のすぐ後に

start:

という部分がありますね.これがラベルです.ラベルを定義するには、プログラムの中で

ラベル名:

と書きます(最後の : に注意してください).このようにプログラムの中で、ラベルを定義して、

goto  ラベル名

とすると、プログラムはラベルを定義したところへ飛んでいきます.ですから、上の C のプログラムで

goto  start

という命令があると、プログラムは

start:

のところへ飛んでいき、その次の命令の

printf("a=");

からもう一度、プログラムの実行を行います.以上から、

if  (ans==1)  goto  start;

が変数 ans の値が 1 と等しければ、start へ行けという命令であって、BASIC のプログラムの行番号 50 と同じ働きをすることになります.また、ans の値が 1 でないときには goto  start は実行されませんから、そのままプログラムは次へ行き、もう命令がないので終了します.
これで今回のプログラムの解説は終わります.今回はいろいろ新しいことが出ました.
  1. goto 命令は、BASIC の goto 命令とほぼ同じ働きをする命令であり、goto ラベル名 の形で用いる.ラベル名はプログラムの中で ラベル名: の形で定義する.
  2. if 命令は if (条件文)  実行文 の形をとり、条件文が真であるときのみ、実行文が実行される. BASIC の if 命令とほぼ同じ働きをする命令であるが、次のように、いくつか細かい点が異なる.
    • 条件文を上のようにカッコでくくる.
    • a と 1 が等しいという条件文は BASIC のように a = 1 でなく a == 1 と書く.
    • BASIC の if 命令にある then は書かない.
次回の予定

次回は for 命令を取り扱います.


演習問題


「N88BASIC について」「n個の数の和を計算する」のように、キーボードから入力する n 個の数の和を計算する Cのプログラムを作れ.
(ヒント: x と y 等しいかまたは x が y より小さいという条件文は C言語では BASIC と同様に x <= y と書く).