プログラミング2
Report#4

課題メニュー


ソースプログラム(Java Ver.)
実行結果
ソースプログラム(C Ver.)
考察
感想
参考文献・HP

ソースプログラム(Java Ver.)

/*
Program       :report4.java
Student-ID    :045733H
Author        :HIDENORI Tamayose
Date          :2004,11,
Comments      :数あてゲーム
*/

public class report4{
    public static void main(String args[])
    {
    	
    	int an = ((int)Math.floor(Math.random()*50) +1);
    	int co;
    	int fir = -1;

        System.out.println("数あてゲーム(10回限定)");
        System.out.println("0~50で数字を選んでください。");

        for( co = 1 ; co <= 10 ; co++ ){
            fir = -1;
            while( fir < 0 || fir > 50 )
                fir = readNumber();
    
            if( fir == an ){
            	
                System.out.print("\n☆あなたは" + co);
                System.out.println("回目で正解☆");
                System.out.println("ちなみに答えは" + an);
                
                break;
            }
            if( fir < an )
                System.out.println("答えより小さいです");
            else
                System.out.println("答えより大きいです");
        }
        if( fir != an ){
            System.out.println("\n正解は" + an);
            System.out.println("制限の10回を過ぎてしまいました。\nGame Over....");
        }
    }

    public static int readNumber()
    {
        byte b[] = new byte[50];

        try{
            System.out.print("=>");
            System.in.read(b);
            return Integer.parseInt(new String(b).trim());
        }catch(Exception e){
            return -1;
        }
    }

}

実行結果

正解の場合 不正解の場合
数あてゲーム(10回限定)
0~50で数字を選んでください。
=>22
答えより小さいです
=>44
答えより大きいです
=>37

☆あなたは8回目で正解☆
ちなみに答えは37
数あてゲーム(10回限定)
0~50で数字を選んでください。
=>8
答えより小さいです

正解は9
制限の10回を過ぎてしまいました。
Game Over....

ソースプログラム(C Ver.)

/*
  Program       :report#4.c
  Student-ID    :045733H
  Author        :HIDENORI Tamayose
  Date          :2004,11,
  Comments      :数あてゲーム
*/

#Include
#include      /*この二行が必要(rand関数)*/
#include  

main()
{
  int co,an,m;
  srand((unsigned)time(NULL));        /*乱数の初期化*/
  an = rand() % 50;                     /*xは1から50の間でランダム生成*/

  printf("数あてゲーム(10回限定)\n");
  printf("1~50の間で数字を選んでください。\n");

  for( co = 1 ; co <= 10 ; co++){          /*カウント*/
    scanf("%d",&m);                   /*数字の読み取り*/
     
    if(m == an ){                      /*正解時の処理*/
      printf("\nあなたは%d回目で正解☆",co);
      printf("\nちなみに答えは%d\n",an);
      break;
    }

    if(m < an)                         /*不正解時のヒント処理*/
      printf("答えより小さいです。\n");
      else
	printf("答えより大きいです。\n");
    }
    
  if(m != an){                      /*制限回数オーバー時の処理*/
      printf("\n正解は%d",an);
      printf("\n制限の10回を過ぎてしまいました。\nGame Over....\n");
	 }
 }

考察

1、((int)Math.floor(Math.random()*50) +1);

(1)floor()
文法はfloor(…値d…)でdを超えない最大の整数を返す事となっている。
(2)random()
これは0.0〜1.0未満の乱数を返す。
(1)と(2)よりこの文は、{(2)×50+1}つまり1~50の数字を発生させてそれをint型で返す

2、メソッドreadNumber

(1)byte b[] = new byte[50];
byte型bの配列を宣言
(2)read()
キーボードからの入力を読み取り、配列bに代入
(3)return Integer.parseInt(new String(b).trim());
new String(b)で配列b内の文字をくつけて、trim()で余分なスペースを削る。
そしてInteger.parseInt()で文字を整数化。(もちろん整数外だとダメです。)

(4)try{…}catch{…}
エラー検出。もし数値以外(英字など)また改行込みの入力があるとreturn -1で再入力を要求します。
(1)〜(4)よりキーボードからの数値入力を受け取ります。

3、制御文

cでもやったので軽くまとめてみます。
(1)if文
if(条件){
  ブロック1
}else{
  ブロック2
}  

もし条件が真であればブロック1を実行、それ以外であればブロック2を実行。

(2)for文
for(初期値a;繰り返し条件;処理){
  ブロック
}

初期値aが条件に見合えばブロックを繰り返し実行。

(3)while文
while(条件){
  ブロック
}

条件が見合えばブロックを繰り返し実行。実行しない場合もあります。

(4)do文
do{
  ブロック
}while(条件)

繰りかえされるブロックが1つの場合{}はいりません。条件が真の限りブロックを実行。
必ず1回は実行されます。

(5)switch文
switch(条件){
  case a:
    ブロック1
  case b:
    ブロック2
  case c:
    ブロック3
	  :
	  break;
}

if文は2つの選択肢に適します。しかしそれ以上の枝分かれの場合はswitch文がいいでしょう。

4、配列
宣言方法(領域割りあて)
  型 配列名[];
  型 []配列名;
  
  配列名 = new 型[サイズ];


Cとの違いはさほどありません。しかし違うところといえば配列の最後にNULLを含まないということ。

感想

今回はテスト、C言語やらなにやらでかなり苦戦しました。C言語なんて久しぶりだからコンパイルの仕方すら忘れてました (情けない…)でもなんとか完成しました。

参考文献・HP

・独習Java第2版 『ジョゼフ・オニール著』
・C実践プログラミング 『Steve Oualline著』
・浅煎り珈琲-Javaアプリケーション入門
・Java入門
・初心者のためのポイント学習C言語