第1回 条件分岐

基本課題

表示と演算

関連項目: printf, scanf, 変数の型, 演算子

a1) 標準出力(画面)に、自分の好きなことわざを2行に分けて表示するプログラムを作成しなさい。

★a2) 単価がx円の鉛筆をy本買いました。z円札を出したときのお釣りを表示するプログラムを作成しなさい。x, y, zの値はキーボードから入力すること。

【ポイント】 変数名や関数名(「識別子」という)は、1文字とは限らない。1文字目には英文字、2文字目以降には英数字が使える。

pi, kingaku, y2003, ...

条件分岐

関連項目: if, else

a3) キーボードから整数をひとつ読み込んで,それが偶数か奇数かを判定し出力するプログラムを作成しなさい。

★a4) 2次方程式の各項の係数を入力し,実数解の個数を出力するプログラムを作成しなさい。

★a5) キーボードから整数を読み込み,それが3の倍数だった場合には「3」、それ以外で偶数だった場合には「2」,どちらにもあてはまらない場合には「X」、と表示するプログラムを作成しなさい。

【ポイント】 elseの後には、ifを続けて書ける。

if (...) {
    ...
} else if (...) {
    ...
} else if (...) {
    ...
} else {
    ...
}

応用課題

ax1) ある金額を硬貨で支払う際に,枚数がもっとも少なくなる支払い方(つまり,“普通の”支払い方)を求めるプログラムを作成しなさい。支払い金額はキーボードから読み込むこと。

ax2) a=5, b=3とするとき,a*bおよびa/bの演算結果がどうなるのか,aとbのデータ型が,ともにint, ともにdouble,片方がintで片方がdouble,のそれぞれの場合についてどうなるか試してみなさい。double型の変数xを用意して,x=a*bなどとしてからxの値を表示させるとよい。

ax3) 2つのdouble型の変数を読み込んで,前者の値が後者の値の何%であるか表示するプログラムを作成しなさい。ただし,後者が0だった場合には「Cannot devide by zero」と表示して計算を行わない。

【ポイント】 変数に値を入れる代入(=)と、等しいことを判定する等号(==)は異なる。C言語の基本中の基本だが、慣れてきてもうっかり間違えやすいところ。

a = 10;
if (a == 10) { …

ax4) 整数a, b, cを読み込み、それらを3辺の長さとする三角形が、直角三角形であるか、二等辺三角形であるか、正三角形であるか判定するプログラムを作成しなさい。

【ポイント】 3つの値を比較する条件式は、

if (a < b < c) { …    /* 誤り!! */
if (a == b == c) { …  /* 誤り!! */

のようには続けて書けない。かわりに、

if (a < b && b < c) { …
if (a == b && b == c) { …

のように、論理AND演算子&&(〜かつ〜)を利用する。

ax5) キーボードから整数を1つ読み込み、それが偶数だった場合には「2」、それがさらに4の倍数だった場合にはそれに加えて「4」、どちらにもあてはまらない場合には「X」、と表示するプログラムを作成しなさい。

発展課題

RPGの戦闘プログラム

この課題は,繰り返し(ループ)の知識が必要である。

az1) ロールプレイングゲーム(RPG)における,主人公とモンスターの戦闘システムをプログラムしてみなさい。以下に示すのは簡単な例である。

  1. 主人公とモンスターは,「技術点」と「体力点」を持っているものとする。
    • 平均的な主人公で,技術点は7,体力点は14とする。
    • モンスターの技術点と体力点は,その種類によって異なる。
  2. 主人公とモンスターの技術点に,それぞれサイコロを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;
      }
  3. 両者の攻撃力を比較して,小さかったほうから体力点を2だけ減らす。もし,体力点がゼロになったら戦闘終了(死亡)。
  4. 上の2.〜4.の手順をどちらかの体力がゼロになるまで繰り返す。

上記は非常に簡単な例である。モンスターに名前をつけたり,防御力を入れてみたり,魔法を入れてみたり,武器の種類を入れてみたり,グラフィックをつけてみたり,いくらでも工夫は自由である。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS