* 第1回 条件分岐 [#p5025f1d]
- ''基本課題''は,必ず授業時間中に終わらせること。
- ''★印の付いている問題''は,担当教員に見せて確認の印(またはサイン)を得ること。
- ''応用課題''は,終わらなかったら''次週(1週間後の午前11:00)までの宿題''とする。
- ''他人のコピーと判断されたものは正当な提出と認めない。''その場合,2人のコピーなら2分の1の点数,3人のコピーなら3分の1の点数(以下同様)とする。
- プログラムのファイル名は,「問題番号.c」とすること。
-- 例: a1.c, ax3.c
- [[プログラムの提出のしかた>../提出]]をよく読むこと。
-- 提出URL http://vilab.org/upload/clab-upload.html
** 基本課題 [#p63ae053]
*** 表示と演算 [#w73740a6]
>関連項目: printf, scanf, 変数の型, 演算子
''a1)'' 標準出力(画面)に,自分の好きなことわざを''2行に分けて''表示するプログラムを作成しなさい。
''a2)''★ 単価がx円の鉛筆をy本買いました。z円札を出したときのお釣りを表示するプログラムを作成しなさい。x, y, zの値はキーボードから入力すること。
>【ポイント】 変数名や関数名(「識別子」という)は,1文字とは限らない。1文字目には英文字,2文字目以降には英数字が使える。
pi, kingaku, y2003, ...
*** 条件分岐 [#w835a322]
>関連項目: if, else
''a3)'' キーボードから整数をひとつ読み込んで,それが偶数か奇数かを判定し出力するプログラムを作成しなさい。
>【ポイント】 変数に値を入れる代入(=)と,等しいことを判定する等号(==)は異なる。C言語の基本中の基本だが,慣れてきてもうっかり間違えやすいところ。
a = 10;
if (a == 10) { …
''a4)''★ キーボードから整数を読み込み,それが3の倍数だった場合には「3」,それ以外で偶数だった場合には「2」,どちらにもあてはまらない場合には「X」,と表示するプログラムを作成しなさい。
>【ポイント】 elseの後には,ifを続けて書ける。
if (...) {
...
} else if (...) {
...
} else if (...) {
...
} else {
...
}
''a5)''★ 整数a, b, cを読み込み,それらを3辺の長さとする三角形が,正三角形であるか,二等辺三角形であるか,どちらでもないか判定するプログラムを作成しなさい。
>【ポイント】 1つのif文の中で複数の条件式を組み合わせるには論理演算子(「&&」と「||」)を用いる。論理AND演算「A && B」はAとBの両方の条件式が真ならば真となる(「A and B」「A かつ B」)。論理OR演算「A || B」はAとBのどちらか一方でも条件式が真ならば真になる(「A or B」「A または B」)。
if (a == 0 && b == 0) {
/* a と b が,両方とも 0 ならば実行する文 */
}
>
if (a == 0 || b == 0) {
/* a と b のどちらか(または両方)が 0 ならば実行する文 */
}
>【ポイント】 3つの値を比較する条件式は,
if (a < b < c) { … /* 誤り!! */
if (a == b == c) { … /* 誤り!! */
のようには続けて書けない。かわりに,
if (a < b && b < c) { …
if (a == b && b == c) { …
のように,論理演算子&&(〜かつ〜)を利用する。
** 応用課題 [#f296b0d9]
''ax1)'' ある金額を硬貨で支払う際に,枚数がもっとも少なくなる支払い方(つまり,金額ちょうどを払う“普通の”支払い方)を求めるプログラムを作成しなさい。支払い金額はキーボードから読み込むこと。
''ax2)'' 下記の4つの変数の組み合わせについて表の引き算と割り算の演算結果を表示させなさい(割り算の順番に注意)。double型の変数aを用意して,a=i-jなどとして演算結果をaに代入してからaの値を表示させるとよい。
|変数の組み合わせ |変数1 |変数2 |引き算|割り算|h
|符号つき整数と符号つき整数|int i = 3; |int j = 5; |i - j |j / i (順番に注意)|
|符号なし整数と符号なし整数|unsigned n = 3;|unsigned m = 5;|n - m |m / n |
|浮動小数点数と浮動小数点数|double x = 3.0;|double y = 5.0;|x - y |y / x |
|符号つき整数と浮動小数点数|int k = 3; |double z = 5.0;|k - z |z / k |
''ax3)'' 2つのdouble型の変数を読み込んで,前者の値が後者の値の何%であるか表示するプログラムを作成しなさい。ただし,後者が0だった場合には「Cannot devide by zero」と表示して計算を行わないこと。
''ax4)'' キーボードから4つの整数を読み込み,先頭の数よりも大きい数が何個あるか''個数''を表示するプログラムを作成しなさい。(配列や繰り返しは使わなくてよい)
''ax5)'' 整数a, b, cを読み込み,それらを3辺の長さとする三角形が成立するのかどうかをまず調べ,さらにそれが直角三角形であるか判定するプログラムを作成しなさい。
- 参考 「三角形の2辺の長さの和は,他の1辺の長さより大きい」(三角形の成立条件)
- 参考 「三平方の定理(ピタゴラスの定理)が成立すれば直角三角形である」
** 発展課題 [#g04dbad4]
- 発展課題には''提出期限を設けない''ので,どれでも自分の面白いと思うものをやってよい。
*** RPGの戦闘プログラム [#vd111de9]
この課題は,繰り返し(ループ)の知識が必要である。
''az1)'' ロールプレイングゲーム(RPG)における,主人公とモンスターの戦闘システムをプログラムしてみなさい。以下に示すのは簡単な例である。
+ 主人公とモンスターは,「技術点」と「体力点」を持っているものとする。
-- 平均的な主人公で,技術点は7,体力点は14とする。
-- モンスターの技術点と体力点は,その種類によって異なる。
+ 主人公とモンスターの技術点に,それぞれサイコロを2つ振って出た目を加えて「攻撃力」とする。
-- C言語で乱数(でたらめな数)を発生させるにはrand()関数を用いる。以下に例を示す。
#include <stdio.h>
#include <stdlib.h> /* rand()とsrand()に必要 */
#include <time.h> /* time()に必要 */
int main(void)
{
int i;
int sai1, sai2;
/* rand()を使うプログラムで最初にやるおまじない */
srand((unsigned) time(NULL));
for (i = 0; i < 10; i++) {
/* 1〜6の乱数を2つ発生 */
sai1 = rand() % 6 + 1;
sai2 = rand() % 6 + 1;
printf("%d+%d=%d\n", sai1, sai2, sai1 + sai2);
getchar();
}
return 0;
}
+ 両者の攻撃力を比較して,小さかったほうから体力点を2だけ減らす。もし,体力点がゼロになったら戦闘終了(死亡)。
+ 上の2.〜4.の手順をどちらかの体力がゼロになるまで繰り返す。
上記は非常に簡単な例である。モンスターに名前をつけたり,防御力を入れてみたり,魔法を入れてみたり,武器の種類を入れてみたり,グラフィックをつけてみたり,いくらでも工夫は自由である。