* 第2回 繰り返し [#k9fc2eb9]
- ''基本課題''は,必ず授業時間中に終わらせること。
- ''★印の付いている問題''は,担当教員に見せて確認の印(またはサイン)を得ること。
- ''応用課題''は,終わらなかったら次週(1週間後の午前11:00)までの宿題とする。
- ''他人のコピーと判断されたものは正当な提出と認めない。''その場合,2人のコピーなら2分の1の点数,3人のコピーなら3分の1の点数(以下同様)とする。
- プログラムのファイル名は,「問題番号.c」とすること。
-- 例: a1.c, ax3.c
- [[プログラムの提出のしかた>../提出]]をよく読むこと。
-- 提出URL http://vilab.org/upload/clab-upload.html
** 基本課題 [#z0324c50]
*** 繰り返し(ループ) [#kea7b696]
>関連項目: for, while, break
''b1)'' 「0, 2, 4, 6, 8...」というように、0以上100未満の偶数を、小さい順(昇順)順に画面に表示するプログラムを作成しなさい。
>【ポイント】 forループは次のように表されるが,
for (開始処理; 継続条件; 更新処理) {
繰り返し処理
}
これは,次のwhileループとほぼ同じ意味である(break, continueを使うときだけ意味が違う)。
開始処理
while (継続条件) {
繰り返し処理
更新処理
}
たとえば,更新処理にはi++のような式を書くと決まっているわけではなく,どんな式でも書くことができる。
''b2)''★ 10個の整数をキーボードから読み込み,奇数と偶数の個数を数えて出力するプログラムを作成しなさい。(繰り返しを使うこと。配列は使わないこと)
''b3)'' 2つの整数aとbを読み込み,a以上b以下の整数を''大きい順(降順)''に画面に表示するプログラムをforを用いて作成しなさい。もし,aがbより大きかったら,まずaとbを交換してから処理しなさい。
''b4)''★ キーボードから自然数を順次読み込み,0を読み込んだら,それまでの最大値を表示して終了するプログラムを作成しなさい。
>【ポイント】 while (1) や for (;;) という書き方で「終わらないループ」を作ることができる。このようループを''無限ループ''という。ただし,本当に終わらないループを書いてはいけない。何かの条件でループを抜けるように,break 文を記述しなければならない。
while (1) {
/* このままだと永久に実行し続ける */
...
if (終了条件) break; /* ここで終わる */
...
}
''b5)''★ 掛け算の九九の表を出力するプログラムを作成しなさい。余裕のあるひとは左下または右上半分だけ出力するプログラムを作成しなさい。以下に例を示す。(2重ループを使うこと。配列は使わないほうがよい)
|~\|~1|~2|~3|~4|~5|~6|~7|~8|~9|
|~1|1|||||||||
|~2|2|4||||||||
|~3|3|6|9|||||||
|~4|4|8|12|16||||||
|~5|5|10|15|20|25|||||
|~6|6|12|18|24|30|36||||
|~7|7|14|21|28|35|42|49|||
|~8|8|16|24|32|40|48|56|64||
|~9|9|18|27|36|45|54|63|72|81|
>【ポイント】 ループの中にループを書くことを2重ループ(多重ループ)という。
** 応用課題 [#jafa0531]
''bx1)'' 2つの整数aとbを読み込み,aからbまでの和a + (a+1) + … + (b-1) + b を計算して出力するプログラムをfor文を用いて作成しなさい。ただし,aがbより大きい場合には,aとbを交換して計算しなさい。
''bx2)'' 正の整数を順次キーボードから読み込んで合計を計算し,ゼロまたは負数が入力された時点で結果を表示して終了するプログラムを作成しなさい。このとき,正数のみの合計を表示して終了すること。
''bx3)'' 複利の年利x%で毎月利息がつく銀行預金に,毎月y円ずつ積み立てる。たとえば,x=12%(1月あたり1%), y=1000円なら,積み立てを始めてから1ヵ月後には1000×1.01+1000=2010円,2ヵ月後に2010×1.01+1000=3030円になっている計算である(小数点以下は切り捨て)。では,何年何ヶ月後に100万円を越えるか計算するプログラムを作成しなさい。
- 参考 日本では慣習および法律で,複利の場合も「月利=年利÷12」と決まっている。
''bx4)'' キーボードから読み込みこんだ整数n (ただしn≧2)を1辺の長さとするアスタリスク(*)の正方形を描画するC言語のプログラムを作成しなさい。たとえば,n=2,3,4のときは,それぞれ以下のような図形が出力される。
n=2 ** n=3 *** n=4 ****
** *** ****
*** ****
****
''bx5)'' 2+3+5=10のように,合計が10になるような3つの正の整数の組み合わせをすべて調べて列挙するプログラムを作成しなさい。
** 発展課題 [#rbe2e198]
- 発展課題には''提出期限を設けない''ので,前回までの発展課題でやっていないものも含めて,どれでも自分の面白いと思うものをやってよい。
*** RPGの戦闘プログラム(団体戦) [#f67ec794]
この課題は,配列の知識が必要である。
''bz1)'' ''az1)''の戦闘プログラムを改良して,複数対複数で戦えるようにしなさい。とはいっても,いきなり“乱戦”を実現するのは難しいので,柔道の団体戦のように1人ずつ順番に対戦する勝ち抜き戦を実現しなさい。
... 味方2 味方1 味方0 →×← モンスター0 モンスター1 モンスター2 ...
主人公たちは,狭い洞窟の通路を,たいまつを灯しながら1列になって進んでいる。そのとき,前方から咆哮が聞こえ,凶暴なモンスターのグループが襲ってきた!
+ 主人公側,モンスター側ともに,メンバーに0から番号を振っておく。これが対戦の順番になる。
-- 技術点や体力点を保存するのには配列を利用する。たとえば,味方の3人目の技術点はskill[2],体力点はstamina[2]などとする。
+ まず,主人公側の1人目とモンスター側の1匹目が対戦する。これは1対1なので''az1)''の方法で闘えばよい。
-- ここで,体力がゼロになるまで戦わず,ある値(例えば5)以下になったら列の一番後ろに退却することにすると,よりリアリティが増すかもしれない。
+ 勝った側は勝ち抜きとなり,先頭に残って次の相手とそのまま対戦する。負けた側は,次の順番のメンバーが交代で前に進み出て闘う。
+ 以下同様に闘い,どちらかが全滅したら戦闘終了である。
前回同様,乱戦に対応させるなど,これも改良自由である。