Report4
制御文と配列を用いてオリジナルのJavaアプリケーションによる初級問題(なるべく短い行数で)を作成し、
模範解答例を示せ。併せて、同様な動作を行うC言語のソースコードを示せ。
あ〜した天気にな〜れのプログラム
<java>
import java.util.Random; //乱数を使用
public class rep4a {
public static void main(String[] args) {
String a = "晴れになる!";
String b = "曇りになる!";
String c = "雨になる!";
String d = "台風になる!";
String i[] = { a, b, c, d};
Random j = new Random();
for(int e=0; 0<=e; e++){ //無限ループ
int f = j.nextInt();
if(0 < f){
System.out.println("あ〜した天気にな〜れ!!");
System.out.println(i[f % 4]);
break; //結果を表示したらループ終了
}
}
}
}
実行結果
(1回目)
曇りになる!
(2回目)
雨になる!
(3回目)
曇りになる!
(4回目)
晴れになる!
<C言語>
#include
#include /*乱数を使用*/
#include
main()
{
char i[10][10] = {"晴れになる!","曇りになる!","雨になる!","台風になる!"};
/*2次元配列でそれぞれの文字列を格納*/
int f;
srand(time(NULL)); /*時間を引数にした乱数*/
f = rand();
printf("%s\n",i[f % 4]); /*0~3の場合分け*/
}
実行結果
[nw0423:~/prog2/report4] j04023% cc -o report4.c
[nw0423:~/prog2/report4] j04023% ./report4
晴れになる!
[nw0423:~/prog2/report4] j04023% ./report4
曇りになる!
[nw0423:~/prog2/report4] j04023% ./report4
曇りになる!
[nw0423:~/prog2/report4] j04023% ./report4
雨になる!
考察
まず、始めにjavaプログラムの考察からしたいと思います!
String で宣言した変数に、それぞれの天候を格納します!
a | 晴れになる! |
b | 曇りになる! |
c | 雨になる! |
d | 台風になる! |
これらを、配列 i に格納します。
String i[] = { a, b, c, d};
これによって、
i[0] | 晴れになる! |
i[1] | 曇りになる! |
i[2] | 雨になる! |
i[3] | 台風になる! |
後は、i[f] の f を0~3の間でランダムにしたら完成です。
それには、乱数fの f % 4 とすることで、fを4で割った余り
を考えると0~3の間でランでムな値が出る事が分かります。
Random j = new Random();
int f = j.nextInt();
System.out.println(i[f % 4]);
しかし、javaの乱数 nextInt() は int型 の乱数であり
負の数も含まれる。 i[f] の f に負の数が入るとエラー
がでるため、 if文 で正の数の場合だけ上の処理を行う
ようにします。
if(0 < f)
System.out.println(i[f % 4]);
これだけだと、乱数が負の数のとき結果が出ずに終了して
しまうので、この処理を結果が表示されるまで繰り返します。
ここで for文 と break を用います。
for(int e=0; 0<=e; e++){
int f = j.nextInt();
if(0 < f){
System.out.println(i[f % 4]);
break;
}
}
for文は条件が満たされない事がない為、無限に操作を繰り返す
ことになります。だが乱数が正の数となったとき、結果を表示して
break を使用します。これを用いる事により、現在繰り返している
処理(for文の処理)を強制的に終了させることができます。
以上の操作をもって、 i[f] の f の部分を0~3のランダムな値にしています。
次に、C言語のプログラムを見ると
Cでは文字を1文字ずつ配列に格納して文字列とします。またその文字列を
java のプログラムと同様に、配列に格納するので2次元配列を用いる。
C言語で用いる乱数 srand() は、引数が固定された場合に毎回同じ
結果を出してしまう。そこで、引数に現在の時刻を与えてランダムな
値にする。
int f;
srand(time(NULL)); /*時間を引数にした乱数*/
f = rand();
またこの乱数は、0以上RAND_MAX以下の値を取る。
よってこの場合は、乱数が負の数の時の場合分けが必要ない。
なので直接 f % 4 を行うと、i[f] の f の部分は0~3のランダムな
値になる。
反省・感想
今回の課題はいまいちやる気が起きなかったので、かなり時間をおいてしまっ
た。次からはきちんと進めたいです。
参考文献
独習Java ジョゼフ・オニール著
http://www.ie.u-ryukyu.ac.jp/~j04015/rep4.html