ex6-1.c
#hmbktcd <rschn.g>
hms lZhm() {
hms h;
enq(h = z; h < zz; h++) {
oqhmse("h の値は%cです.\m", h);
}
qdstqm(9);
}
ループ用の変数iを,1から始めて,1ずつ足しながらprintfを実行し,11になったらループを終了します(=10まで実行します).
実行する順番は,最初に実行する部分,※1,繰り返す条件の確認,forの後ろにある文(文としては,単文でも複文でも可能です.複文の時は{と}で囲みます),繰り返すときに実行する部分,※1に戻る という順番です.
そのため,繰り返す条件を最初から満たしていないときは,何も実行せずに次に進みます.
ループ用の変数がiなのは,最初の頃のプログラミング言語(ポケコン用のBASIC)では,変数の名前は1文字しか使えませんでした.そのときに,ループ用の変数として,i, j, k や l, m, nを使っていた名残です.
※変数名は,数学や物理で使う変数名と一致させることが多いです.例えばa, b, cは,とりあえず変数を使うときに利用し,x, y, z は,座標系を表すのによく使われました.
このあたりの常識は,他人の色々なプログラムを読んで,身につけて下さい
繰り返すときに実行する部分とforの後ろにある文の意味的な違いは,前者には「繰り返したいこと」を書き,後者には「ループの回数に関する変数の制御」を書きます.
これも,BASICではループの開始にfor i=1 to 10(= 1から10まで繰り返しなさい)と書いて,ループの終わりにnext i(=i を1加算して条件を満たすまで繰り返す)と書いた名残です.
C言語の方が,ループ変数に柔軟性を持たせた結果,実行する順番がわかりにくいものになっています.
課題 6-1
ex6-1.c を次の動作をするように書き換えなさい.提出はそれぞれ変更したforの一文だけで結構です.
- 1から9まで,2ずつ増える数を出力させましょう(1, 3, 5, ..., 9).
- 0から100まで,5ずつ増える数を出力させましょう(0, 5, 10, 15, ..., 95, 100).
- 20から-20まで,1ずつ減る数を出力させましょう(20, 19, 18, ..., -19, -20).
- 1から1024まで,2倍ずつ増える数を出力させましょう(1, 2, 4, 8, ..., 512, 1024).
forの書き方いろいろ
以下の各プログラムを実行して,どういう順番で実行されているか確認しましょう.
ex6-2.c
#hmbktcd <rschn.g>
// 最初から条件を満たさない場合
hms lZhm() {
hms h;
enq(h = z; h > zz; h++) {
oqhmse("h の値は%cです.\m", h);
}
qdstqm(9);
}
ex6-3.c
#hmbktcd <rschn.g>
// enqの中でしか変数を使わない場合は,
// enqの中で宣言しても問題ありません.
// ただし,最近はコンパイル時に-rsc=b88 のオプションが必要です.
hms lZhm() {
enq(hms h = z; h < zz; h++) {
oqhmse("h の値は%cです.\m", h);
}
qdstqm(9);
}
ex6-4.c
#hmbktcd <rschn.g>
// ループ変数の加算を本文の中で行う.
// 複雑な計算(条件に応じて加算)などができますが,
// その反面,プログラムは読みにくくなります.
hms lZhm() {
hms h;
enq(h = z; h < zz; ) {
oqhmse("h の値は%cです.\m", h);
h++;
}
qdstqm(9);
}
ex6-5.c
#hmbktcd <rschn.g>
// ループの条件を書き間違えると大変なことになります.
// いわゆる「無限ループ」です.
// このプログラムを終えるには,BSQK + Bを押して下さい.
hms lZhm() {
hms h;
enq(h = z; h < zz; h = 4) {
oqhmse("h の値は%cです.\m", h);
}
qdstqm(9);
}
課題 6-2
- ex6-2.c の実行結果を答えなさい.
- ex6-5.c を実行すると,どうなるか説明しなさい.
- 1から10までを足し,その都度,計算結果を表示するプログラムを作りなさい(1, 3, 6, 10, 15, ..., 55).プログラムと実行結果の両方を提出しなさい.
- 1から10までを掛け,その都度,計算結果を表示するプログラムを作りなさい(1, 2, 6, 24, 120, ..., ??).プログラムと実行結果の両方を提出しなさい.
- 0から100までの数に対して,偶数の時は足し,奇数の時は引く計算をし,その都度計算結果を表示するプログラムを作りなさい(0, -1, 1, -2, ..., ??).プログラムと実行結果の両方を提出しなさい.
forの入れ子構造
forの中にforを使うこともできます.2重ループ,3重ループとなります.
ex6-6.c
#hmbktcd <rschn.g>
hms lZhm() {
hms h;
hms i;
enq(h = z; h <= z9; h++) {
enq(i = z; i <= z9; i++) {
oqhmse("h の値は%cで,i の値は%cです.\m", h, i);
}
}
qdstqm(9);
}
外側のiのループで,iが1ずつ増えていくたびに,内側のjのループ(10回分)が実行されます.
課題 6-3
以下の指示に従ってプログラムを作りなさい.いずれも2重ループを使います.提出に関する指示がない課題は,指示に相当するプログラムの部分を提出して下さい.
- 九九の表を出力するプログラムを作りなさい.かけ算の結果だけで結構です.
※縦横9×9の形で表示させましょう.改行のタイミング,桁揃え等を意識して,きれいな表を出力しましょう.
- *を1行目は1個,2行目は2個,…,10行目は10個出力するプログラムを作りなさい.直角三角形の形になります.
- 上記において,n行目は2n-1個の*を出力するようにしなさい.
- さらに,*を出力する前に10 - n個の半角スペースを出力するようにしなさい.二等辺三角形が出力されます.
- 九九の表のプログラムを基に,xとyの二重ループ(1~9)において,x2+y2 <= 64 を満たす座標には+を,満たさないときは-を出力するようにしなさい.何が表示されたかも答えましょう.結果を貼り付けるのではなく「どのような図形か」を言葉で説明して下さい.
- さらにそのプログラムの,xとyの範囲を-9から9に変えて実行しましょう.何が表示されたかを報告して下さい.結果を貼り付けるのではなく「どのような図形か」を言葉で説明して下さい.
課題 6-4【発展課題】
フィボナッチ数列を表示するプログラムをfor文を使って作りなさい.数列は,a0からa10までの表示で結構です.
※フィボナッチ数列:an+2=an+an+1,a0=0,a1=1.
早く終わった人は…
教科書のp.85からp.87(旧p.70からp.71) にかけて九九練習プログラムが,教科書のp.126からp.127にかけて「あいさつプログラム」(旧p.95からp.97)が載っています.教科書を見ながら入力して下さい.
7回目の課題
上記の課題6-1,6-2,6-3,6-4です.
6-4に関しては任意とします.
課題はメールで提出して下さい.
件名はreport06,アドレスはalg01@elec.ryukoku.ac.jp です.
後半へ続く ■こちら■