* 第1回 制御構造 [#u041da9d] - ''基本課題''は授業時間中に終わらせること。 - ★印の付いている問題は,当教員に見せて確認の印(またはサイン)を得ること。 - 授業時間中に終わらなかった''応用課題''は,次回(2週間後)までの宿題とする。 - [[C言語のコンパイルと実行のしかた>../C言語環境]] -- プログラムのファイル名は,「問題番号.c」としてください。例:a1.c, ax3.c - [[プログラムの提出のしかた>../提出]] -- 提出URL http://vilab.org/upload/clab-upload.html - [[C言語おすすめ情報>../C言語参考資料]] -- 参考になるWebページや書籍の紹介。 ** 基本課題 [#d3f7b4f1] *** 表示と演算 [#e08a1df9] >関連項目: printf, scanf, 変数の型, 演算子 ''a1)'' 標準出力(画面)に、自分の好きなことわざを''2行に分けて''表示するプログラムを作成しなさい。 ''★a2)'' 単価がx円の鉛筆をy本買いました。z円札を出したときのお釣りを表示するプログラムを作成しなさい。x, y, zの値はキーボードから入力すること。 >【ポイント】 変数名や関数名(「識別子」という)は、1文字とは限らない。1文字目には英文字、2文字目以降には英数字が使える。 pi, kingaku, y2003, ... *** 条件分岐 [#p721da83] >関連項目: if, else ''★a3)'' キーボードから整数を読み込み,それが3の倍数だった場合には「3」、それ以外で偶数だった場合には「2」,どちらにもあてはまらない場合には「X」、と表示するプログラムを作成しなさい。 >【ポイント】 elseの後には、ifを続けて書ける。 if (...) { ... } else if (...) { ... } else if (...) { ... } else { ... } *** 繰り返し [#v72166f4] >関連項目: for, while, break ''a4)'' 2つの整数aとbを読み込み,aからbまでの和a + (a+1) + … + (b-1) + b を計算して出力するプログラムをfor文を用いて作成しなさい。ただし,aがbより大きい場合には,aとbを交換して計算しなさい。 ''★a5)'' 正の整数を順次キーボードから読み込んで合計を計算し,ゼロまたは負数が入力された時点で結果を表示して終了するプログラムを作成しなさい。このとき,正数のみの合計を表示して終了すること。 ** 応用課題 [#vf71e4f7] ''ax1)'' ある金額を硬貨で支払う際に,枚数がもっとも少なくなる支払い方(つまり,“普通の”支払い方)を求めるプログラムを作成しなさい。支払い金額はキーボードから読み込むこと。 ''ax2)'' 2つのdouble型の変数を読み込んで,前者の値が後者の値の何%であるか表示するプログラムを作成しなさい。ただし,後者が0だった場合には「Cannot devide by zero」と表示して計算を行わない。 >【ポイント】 変数に値を入れる代入(=)と、等しいことを判定する等号(==)は異なる。C言語の基本中の基本だが、慣れてきてもうっかり間違えやすいところ。 a = 10; if (a == 10) { … ''ax3)'' 整数a, b, cを読み込み、それらを3辺の長さとする三角形が、直角三角形であるか、二等辺三角形であるか、正三角形であるか判定するプログラムを作成しなさい。 - 参考 http://contest.thinkquest.gr.jp/tqj2002/50027/page183.html >【ポイント】 3つの値を比較する条件式は、 if (a < b < c) { … /* 誤り!! */ if (a == b == c) { … /* 誤り!! */ のようには続けて書けない。かわりに、 if (a < b && b < c) { … if (a == b && b == c) { … のように、論理AND演算子&&(〜かつ〜)を利用する。 ''ax4)'' 複利の年利x%で毎月利息がつく銀行預金に,毎月y円ずつ積み立てる。たとえば,x=12%(1月あたり1%), y=1000円なら,積み立てを始めてから1ヵ月後には1000×1.01+1000=2010円,2ヵ月後に2010×1.01+1000=3030円になっている計算である(小数点以下は切り捨て)。では,何年何ヶ月後に100万円を越えるか計算するプログラムを作成しなさい。 - 日本では慣習および法律で,複利の場合も「月利=年利÷12」と決まっている。 ''ax5)'' 掛け算の九九の表を出力するプログラムを作成しなさい。余裕のあるひとは左下または右上半分だけ出力するプログラムを作成しなさい。以下に例を示す。(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| ** 発展課題 [#t182078d] *** RPGの戦闘プログラム [#e654e23d] ''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.の手順をどちらかの体力がゼロになるまで繰り返す。 上記は非常に簡単な例である。モンスターに名前をつけたり,防御力を入れてみたり,魔法を入れてみたり,武器の種類を入れてみたり,グラフィックをつけてみたり,いくらでも工夫は自由である。