よりにもよって、季節の変わり目で、鼻水で頭はフラフラしている最中ですが、Javaの実力検証のためのテストを受けることになりました。
みんな解けるくらいの簡単なものだと言いましたが、必ずしもみんなそう思うわけにはいかないので、長い時間があっても手間取っていた人もいました。
目次
Java 問題 1. 1桁を一に変えるコードを作成せよ
public class Exercise1 {
public static void main(String[] args) {
int num = 333;
int num2 = (int)Math.round((double)(Math.floor((float)num*0.1f)))*10+1;
System.out.println(num2);
}
}
実はnum / 10 * 10
が簡単で、そう解いた人が圧倒的に多いですが、これにも理由はある…というには長すぎます。解いた後に後悔した件です。
Stringに変えてサブストリングで変えて、 Integer.parseInt()
もいいアイデアですね。
Java 問題 2. 1から20までの整数のなか2と3の倍数ではない数字をすべて加えよ
public class Exercise2 {
public static void main(String[] args) {
int sum = 0;
for(int i = 1; i <= 20; i++) {
sum += (i % 2 == 0 || i % 3 == 0) ? 0 : i;
}
System.out.println("2の倍数でも、3の倍数でもない数字の総合: "+sum);
}
}
もちろん、ifを使った人が多いでしょう。私は短いコードが大好きです。
Java 問題 3. ダイス二つを投げてその合が6の場合をすべて求めよ
public class Exercise3 {
public static void main(String[] args) {
for(int i = 1; i < 7; i++) { if(6-i > 0) {
System.out.printf("%d, %d\n", i, 6-i);
}
}
}
}
for分重複も可能かと問う問題のようですが、パフォーマンスを考えるとこちらがいいでしょう。当然、出題者の意図とは食い違いがあるでしょう。
for(int i = 1; i < 7; i++) {
for(int j = 1; j < 7; j++) {
if(i+j==6){
System.out.printf("%d, %d\n", i, 6-i);
}
}
}
多分、こちらが合ってると思います。
Java 問題 4. 2x+4y=10 方程式の解になれるすべての場合を求めよ。ただし、xとyは整数である。
public class Exercise4 {
public static void main(String[] args) {
//2x+4y=10
for(int x = 0; x <= 10; x++) { int y = (5-x) / 2; float fy = (5-x) / 2.0f; if(y*100==fy*100) { if(y>=0 && y<=10) {
System.out.printf("x=%d, y=%d\n",x,y);
}
}
}
}
}
実際に、方程式を解く語りになりましたが、せっかくループを使っているのに、一つ一つ代入するという基礎を見逃れました。意図にあわせて修正するとこうなりますね。
for(int x = 0; x <= 10; x++){
for(int y = 0; y <= 10; y++) {
if(2*x+4*y==10) {
System.out.printf("x=%d, y=%d\n",x,y);
}
}
}
Java 問題 5. 字を一つずつ読んで、数字か判別せよ
public class Exercise5 {
public static void main(String[] args) {
String value = "12a34";
boolean isNumber = true;
for(int i = 0; i < value.length(); i++) {
char c = value.charAt(i); //방법1
try {
Integer.parseInt(String.valueOf(c));
} catch(NumberFormatException e) {
isNumber = false;
break;
}
}
System.out.println(value+"는 "+(isNumber?"숫자입니다.":"숫자가 아닙니다."));
}
}
Java 問題 6. 1から100までのランダムの整数をユーザーが当てることで、低いか高いか出力して、合ったら正解だと出力して終了するコードを作成せよ
public class Exercise6 {
public static void main(String[] args) {
int answer = (int)Math.round(Math.random() * 100 + 1);
int input = 0; //ユーザーの入力を記憶する
int count = 0; //トライの回数
//画面からユーザー入力を受け入れるためのスキャナークラスの使用
java.util.Scanner s = new java.util.Scanner(System.in);
do {
count++;
System.out.print("1と100の間の数字でお願いします: ");
input = s.nextInt();
if(input == answer) {
System.out.println("当たりました。");
System.out.printf("トライの回数は%d回です。\n",count);
break;
} else {
System.out.println(input > answer ? "より小さい数です。" : "より大きい数です。");
}
}while(true);
}
}
ループを唯一うまく使っている問題でしたが、半分は完成していたので、手を出す必要があまりありませんでした。ifの分岐を最小限にするために、変なelse文が出ましたが、核心はbreakの有無だと思います。while(true)があったので、問題を変えずにはこれが絶対必要でした。
random() * 99で移出しましたが、* 100に修正します。 random()は1.0が出ないらしいです。
Java 問題 7. 条件を満たすStudent classを作成せよ
public class Student {
private String name;
private int ban;
private int no;
private int kor;
private int eng;
private int math;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBan() {
return ban;
}
public void setBan(int ban) {
this.ban = ban;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public Student(String name, int ban, int no, int kor, int eng, int math) {
this.name = name;
this.ban = ban;
this.no = no;
this.kor = kor;
this.eng = eng;
this.math = math;
}
public int getTotal() {
return kor + eng + math;
}
public double getAverage() {
return getTotal() / 3.0d;
}
}
アクセス修飾子であるprivateとpublicを見分けることが大事です。そして、問題8と関連して、無造作にaverageとtotalフィールドを追加したら、次で手が止まってしまいます。GetterやSetter、そして生成者はeclipseのSourceメニューからGenerateすれば、簡単です。すべてが実は関数だと自覚したら、合計も平均も関数を呼ぶことで克服も容易いことですね。
Java 問題 8. 上記のStudentを活用して、TotalとAverageを与えたコードで求められるようにせよ
public class Exercise8 {
public static void main(String[] args) {
Student s = new Student("野崎君",1,1,100,60,76);
System.out.println("名前:"+s.getName());
System.out.println("総点数:"+s.getTotal());
System.out.println("平均:"+s.getAverage());
}
}
忘れるわけがありませんが、こうして、整理しておくのも悪くないようです。
それより、4時間もいたら、時間と空間の部屋に閉ざしてしまう気分ですね。本を読みながら、心を整えたらどうでしょうか。
これからも、他人に説明できるほどの専門性を育っていかなければなりませんね。