「n回繰り返すプログラムを作りたい」
「while文で無限ループを起こさないようにしたい」
そんな疑問を持つ方が解決できるような記事を目指して書きました!
大学や本で学んだことをわかりやすくまとめてみました!
while文
以下のプログラムをまず実行してみましょう。
#include <stdio.h> /* printf, scanf を使うのに必要 */
int main(void)
{
int a,s,x;
int k=1;
printf("用意した石の数は?:"); scanf("%d",&a);
while(a-s>=0){
s=k*(k+1)*(2*k+1)/6;
k++;
}
printf("その数の石でできるピラミッドは%d段で,石は%d個残ります",k,a-s);
return 0;
}
このプログラムは、用意する石の数をキーボードから入力して、
その石で何段のピラミッドを作ることができるのかを出力するものです。
while文は、
while(条件式){
処理
}
と書きます。
while文は、条件を満たしている間だけずっと処理が行われます。
そのため、条件が常に満たされるものにしてしまうと、
無限ループが起こってしまいます。
そこで今回の例では、条件に変数を使って
処理する内容でその変数の値を変えていくことにより
ループを抜け出すことができます。
do while文
ついでにdo while文についても解説します。
do while文は、while文と違って
1度は処理を行うという点があります。
do{
処理
}while(条件式);
まず、処理を行って、条件式を満たす間は
さらに処理をし続けるというものになります。
for文
以下のプログラムをまず実行してみましょう。
#include <stdio.h>
int main(void) {
int n;
int line; /* 行番号 */
int mark; /* マークのループ用変数 */
printf("正の整数:"); scanf("%d",&n);
if (n<=0) {
printf("正の整数ではありません\n");
} else {
for(line=1;line<=n;line++) { /* 各行の出力 */
for(mark=1;mark<=n+1-line;mark++)
printf(" "); /* 空白を出力 */
for(mark=1;mark<=2*line-1;mark++)
printf("*"); /* *を出力 */
for(mark=1;mark<=n+1-line;mark++)
printf(" "); /* 空白を出力 */
printf("\n"); /* 各行の最後で改行 */
}
}
return 0;
}
このプログラムは、入力した整数の高さだけ✳︎の三角形を印字するものになります。
for文は、
for(式A;条件式B;式C){
処理
}
と書きます。
まず、式Aを実行して条件式Bを満たす間処理を行い、処理の後に式Cを実行します。
今回は、式Aでlineという変数に1を代入し、
条件式Bでline<=n,つまりn以下の間は実行され、
式Cでlineに1ずつ処理されたあとに足していく
というプログラムになっています。
問題(発展)
今回学んだことを活かして以下の問題を解いてみましょう。
「ある月のカレンダーを画面に印字するプログラム」を作成しましょう。
最初に曜日を数字で指定させます。
例:日曜日(1),月曜日(2),,,,
次に月末を指定して、28日以上31日以下であった場合のみカレンダーを作成します。
違う数字を入力した場合は再度入力を求めます。
答えは以下になります。
#include <stdio.h>
int main(void) {
int a,b,i,k;
printf("1日の曜日は?: 日(1) 月(2) 火(3) 水(4) 木(5) 金(6) 土(7);"); scanf("%d",&a);/*1日の曜日を決める*/
while(a<1 || a>7){
printf("1日の曜日は?: 日(1) 月(2) 火(3) 水(4) 木(5) 金(6) 土(7);"); scanf("%d",&a);
}
printf("月末の日付は?: 28日以上, 31日以下:"); scanf("%d",&b);/*月末の日付を決める*/
while(b<28 || b>31){
printf("月末の日付は?: 28日以上, 31日以下:"); scanf("%d",&b);
}
printf("\n");
printf("SUN MON TUE WED THU FRI SAT \n");/*カレンダーを作成する*/
for(i=1;i<a;i++)
printf(" ");
for (k=1; k<=b; k++) {
printf("%3d ",k);
if((a+k)>6 && ((a+k-1)%7)==0)
printf("\n");
}
printf("\n");
return 0;
}
発展問題のような難しいものとなっていますので、作れたら凄いくらいに思ってください。
もちろん書き方は人によって変わるので、似たような結果になれば大丈夫です!
まとめ
今回は、while,for文について解説しました。
これにより繰り返し処理を行えるようになりました。
次回は配列について解説しますので、良ければこちらをご覧ください。