「まず覚えるCの文法」
P22: 条件付ジャンプ
//-------------------------------------
#include <stdio.h> int main(void){
char c; int k=0;
loop:
scanf("%c", &c);
if(c==' '){goto next;}
k++;
next:
if(c!='.'){goto loop;}
printf("k=%d\n", k);
return 0;
}
//-------------------------------------
P23: if-else文
//-------------------------------------
#include <stdio.h>
int main(void){
int k,a,b,c,d,m,n;
a=b=c=d=m=n=0;
loop:
printf("k="); scanf("%d", &k);
if(k>=80){
a++; if(k==m){n++;}
if(k>m){m=k; n=1;}
}
else if(k>=70){b++;}
else if(k>=60){c++;}
else{d++;}
if(k>=0){goto loop;}else{d--;}
printf("%d,%d,%d,%d;", a, b, c, d);
printf("%d,%d\n", m, n);
return 0;
}
//-------------------------------------
P24: while文
//-------------------------------------
#include <stdio.h>
int main(void){
int k,a,b,c,d,m,n;
a=b=c=d=m=n=0;
printf("k="); scanf("%d", &k);
while(k>=0){
if(k>=80){
a++; if(k==m){n++;}
if(k>m){m=k; n=1;}
}
else if(k>=70){b++;}
else if(k>=60){c++;}
else{d++;}
printf("k="); scanf("%d", &k);
}
printf("%d,%d,%d,%d;", a, b, c, d);
printf("%d,%d\n", m, n);
return 0;
}
//-------------------------------------
P24A: do-while文
//-------------------------------------
#include <stdio.h>
int main(void){
int k,a,b,c,d,m,n;
a=b=c=d=m=n=0;
do{
printf("k="); scanf("%d", &k);
if(k>=80){
a++; if(k==m){n++;}
if(k>m){m=k; n=1;}
}
else if(k>=70){b++;}
else if(k>=60){c++;}
else if(k>=0){d++;}
}while(k>=0);
printf("%d,%d,%d,%d;", a, b, c, d);
printf("%d,%d\n", m, n);
return 0;
}
//-------------------------------------
|
P22 のプログラムをコピーして実行し,キーボードから
Hello, world.
と入力すると,画面に
k=12
と表示されることを確かめてください.
・P22 は[#20]の処理を行うプログラムです.
・if(c==' '){goto next;} という文は式「c==' '」の値が
0 でなければ「next:」の直後にジャンプします.この文
は機械語の条件付きジャンプ命令に近い表現です.
・「c==' '」の値は 0 か 1 ですが,数式の 0 でない値は 真偽の判定では 1 と同等に扱われます[#21]. ・「loop:」や「next:」はアドレスを指定するだけで何も
計算しません.
・goto文を使うと制御の流れが分かりにくいプログラムも
作れるので,構造化プログラミングではgoto文の使用を
禁止しています(ジャンプ先を制限したif文やwhile文を
使ってプログラムを作ります).
P23 は試験の点数 k を入力して 80点以上,70~79点,60~
69点,60点未満の人数と,表彰者数を調べるプログラムです
(#23).
・「a=b=0;」は「b=0; a=b;」と同じ(@37).「a=b=c=d=m=n
=0;」も同様.
・最高得点が 80 点以上のとき最高得点者を表彰.
・得点として負の数を入力すると処理を終了します.
・if-else 文の else の部分に別の if-else 文があります.
構文に忠実な表現は
if(k>=80){
a++;
if(k==m){n++;} if(k>m){m=k; n=1;}
}else{
if(k>=70){
b++;
}else{
if(k>=60){
c++;
}else{
d++;
}
}
}
ですが,通常は P23 のように表現します.
if(k>=60){c++;}else{d++;}
の部分は「if(k>=60) c++; else d++;」でもいいのですが
{ } で囲むように習慣付けておく方が無難です.
while文を用いて P23 のプログラムを P24 のように変更する
ことにより,goto文を除去できます(#24).
・反復終了の判定に必要な k の値を知るために while文の外
にも「printf("k="); scanf("%d", &k);」が必要になります.
この部分が大きいときには次のような方法が使えます.
int k,a,b,c,d,m,n,end=0;
a=b=c=d=m=n=0;
while(end==0){
printf("k="); scanf("%d", &k);
if(k>=80){
a++; if(k==m){n++;}
if(k>m){m=k; n=1;}
}
else if(k>=70){b++;}
else if(k>=60){c++;}
else if(k>=0){d++;}
else end=1;
}
・後述の break文を使うと end は不要です(#26).また,P24A
のように do-while文を使う方法もあります(#24&).
|