99年度計算機プログラミングI(植田)試験問題
1.以下のプログラムと説明を読んで、プログラムに誤りがあればその誤りを指摘した上で、説明に書かれたとおりのことをするように修正しなさい。なお、誤りがあるとは限らないし、ある場合でも一つとは限らない。但し、KeyboardInputクラスのinputDoubleメソッドは授業で使用したものと同じものが正しく定義されているものとする。(10×2=20点)
(編注:KeyboardInput.inputDouble()はDouble.parseDouble(bf.readLine())とか(new Double(bf.readLine())).doubleValue()と同じである。また、IOExceptionなどの例外はスローしない。)
(1)
class Swap{
public static void main(String[] args){
double a, b;
a = KeyboardInput.inputDouble();
b = KeyboardInput.inputDouble();
if ( a > b ) {
b = a;
a = b;
}
System.out.println("a = "+ a);
System.out.println("b = "+ b);
}
}
説明:変数aとbの値(double型)をキーボードから入力し、もし変数aの値が変数bの値よりも大きければ両者を入れ替えて(そうでなければ入れ替えずに)、変数aとbの値をディスプレイに表示する。
(2)
class Person{
String name;
int age;
int id = 1;
Person(String n,int a) {
setPerson(n, a);
}
void setPerson(String n, int a) {
name = n;
age = a;
id++;
}
public static void main(String[] args){
Person person1 = new Person("Sato", 33);
System.out.println("person1 の id番号 = " + person1.id);
System.out.println("person1 の 名前 = " + person1.name);
System.out.println("person1 の 年齢 = " + person1.age);
Person person2 = new Person("Kimura", 50);
System.out.println("person2 の id番号 = " + person2.id);
System.out.println("person2 の 名前 = " + person2.name);
System.out.println("person2 の 年齢 = " + person2.age);
}
}
説明:名前を表すnameフィールド,年齢を表すageフィールド,ID番号を表すidフィールドをもつPerson型のクラスを定義する。そのコンストラクタPersonも定義する。インスタンスを生成するたびにnameフィールドとageフィールドへ値を代入すると同時に、インスタンスの生成順に1,2,3,… というように,idフィールドへID番号も代入する。
2.以下のプログラムはnの階乗を求めるプログラムである。(但し、キーボード入力される数numは0以上だとする)。このプログラムのうち、再帰計算を用いて書かれているメソッドのみを、再帰計算を用いないものに書き改めなさい。なお、KeyboardInputクラスのinputIntメソッドは授業で使用したものと同じものが正しく定義されているものとする。(15点)
public class Factorial {
static int num;
public static int factorial(int n){
if(n==0)
return 1;
else
return (n * factorial(n - 1));
}
public static void main(String] args){
System.out.print("Enter a number: ");
num = KeyboardInput.inputInt();
System.out.println("The Factorial: " + factorial(num));
}
}
3.貴方が友達と数当てゲームをするとしよう。数当てゲームとは「1からnまでの整数のうち友達が最初に考えた整数を当てる」ゲームのことである(もちろん友達は、ゲームの最中に考えを変えないものとする)。貴方が1からnまでの整数の任意の1つを当てずっぽうで言うと、その言った数字が友達の考えていた数字と同じである(正解)かそうでないか(不正解)かをその友達は答える。これを正解にたどり着くまで繰り返す。このとき以下の質問に答えなさい。
(1)貴方はランダムに数字を言っても混乱すると思い、1から順に整数を言っていくことにした。このとき正解にたどり着くまでの平均回数(貴方が数字を言う回数の平均)を計算しなさい(5点)
(2)上の方法だと時間がかかるので、友達は単に正解か不正解かを教えるだけでなく、貴方が言った数字が自分が考えている数字よりも、(1)大きいか(2)小さいか(3)同じ(つまり正解)か、のいずれかを偽りなく教えることにした。友達が教えてくれるこの情報を効率的に使った場合(つまり、友達の情報を用いて正しく正解の候補を絞り込んでいった場合)、正解にたどり着くまでの平均回数(貴方が数字を言う回数の平均)を計算しなさい。(10点)