みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Javaで九九の計算

今、Javaの勉強をしてる者です。勉強本の中に九九の問題があり、正しく動作することを確認したのですが、
入力された値が数値以外のものだった場合に、再入力させるプログラムに機能アップしたいと欲が出てきました。

現状のプログラムでは、入力値が整数でない場合、NumberFormatException で判定をして次の回に進んでしまってます。

int result = Integer.parseInt(line);
の戻り値を判定して、整数でない場合に再入力させれば良いのかと予想したのですが、どう記載すべきかわかりません。
そもそもこの考え方は間違っているのか、別の方法が良いのかご教示いただけませんでしょうか。

---
import java.io.*;

public class KuKu4 {
public static final int max_question = 10;
public static void main(String[] args){
int goodAns = 0;
for(int i=0; i < max_question; i++){
boolean check = showQuestion(i+1);
if(check){
goodAns++;
}
}
double rate = (goodAns * 100 / max_question) ;
System.out.println("");
System.out.println("正解は" + goodAns +"問");
System.out.println("間違いは" + (max_question - goodAns) +"問");
System.out.println("正答率は" + rate +"%");
}

public static boolean showQuestion(int question){
int x = (int)(Math.random() * 9) + 1;
int y = (int)(Math.random() * 9) + 1;
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println("[第" + question + "問]" + x + " * " + y + "== ?");
String line = reader.readLine();
int result = Integer.parseInt(line);
if(x * y == result){
System.out.println("正しい");
return true;
}else{
System.out.println("正しくない");
return false;
}
}catch(IOException e){
System.out.println(e);
}catch(NumberFormatException e){
System.out.println("入力された値が正しくない");
}
return false;
}
}

投稿日時 - 2017-11-22 20:49:00

QNo.9400186

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

「x、y」の計算をshowQuestion関数の外に出した方がスマートですね。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class KuKu4 {

enum Enum_QuestionStatus {
Refresh, // FlushをRefreshに変更しています。
Recycle,
Error,
IOError,
NumberFormatError,
Irregular,
Correct
};
public static final int max_question = 10;

public static void main(String[] args) {

int x=0, y=0;
int goodAns = 0;
Enum_QuestionStatus questionStatus = Enum_QuestionStatus.Refresh;
int i = 0;
while( i < max_question ){
if(Enum_QuestionStatus.Refresh.equals(questionStatus)){
x = (int)(Math.random() * 9) + 1;
y = (int)(Math.random() * 9) + 1;
}
Enum_QuestionStatus check = showQuestion(i+1, x, y);
if(Enum_QuestionStatus.Correct.equals(check)){
goodAns++;
}
if( Enum_QuestionStatus.Correct.equals(check)||
Enum_QuestionStatus.Irregular.equals(check) ){
questionStatus = Enum_QuestionStatus.Refresh;
i++;
}else{
questionStatus = Enum_QuestionStatus.Recycle;
}
}
double rate = (goodAns * 100 / max_question) ;
System.out.println("");
System.out.println("正解は" + goodAns +"問");
System.out.println("間違いは" + (max_question - goodAns) +"問");
System.out.println("正答率は" + rate +"%");

System.exit(0);
}

public static Enum_QuestionStatus showQuestion( int question, int x, int y ){
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println("[第" + question + "問]" + x + " * " + y + "== ?");
String line = reader.readLine();
int result = Integer.parseInt(line);
if(x * y == result){
System.out.println("正しい");
return Enum_QuestionStatus.Correct;
}else{
System.out.println("正しくない");
return Enum_QuestionStatus.Irregular;
}
}catch(IOException e){
System.out.println(e);
return Enum_QuestionStatus.IOError;
}catch(NumberFormatException e){
System.out.println("入力された値が正しくない");
return Enum_QuestionStatus.NumberFormatError;
}
// return Enum_QuestionStatus.Error;
}

}

投稿日時 - 2017-11-23 22:55:20

ANo.2

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class KuKu4 {

enum Enum_QuestionStatus {
Flush,
Recycle,
Error,
IOError,
NumberFormatError,
Irregular,
Correct
};
static Enum_QuestionStatus questionStatus;
static int questionX,questionY;
public static final int max_question = 10;

public static void main(String[] args) {

int goodAns = 0;
questionStatus = Enum_QuestionStatus.Flush;
int i=0;
while( i < max_question ){
Enum_QuestionStatus check = showQuestion(i+1, questionStatus);
if(Enum_QuestionStatus.Correct.equals(check)){
goodAns++;
}
if( Enum_QuestionStatus.Correct.equals(check)||
Enum_QuestionStatus.Irregular.equals(check) ){
questionStatus = Enum_QuestionStatus.Flush;
i++;
}else{
questionStatus = Enum_QuestionStatus.Recycle;
}
}
double rate = (goodAns * 100 / max_question) ;
System.out.println("");
System.out.println("正解は" + goodAns +"問");
System.out.println("間違いは" + (max_question - goodAns) +"問");
System.out.println("正答率は" + rate +"%");

System.exit(0);
}

public static Enum_QuestionStatus showQuestion(int question, Enum_QuestionStatus QStatus){
if(Enum_QuestionStatus.Flush.equals(QStatus)){
questionX = (int)(Math.random() * 9) + 1;
questionY = (int)(Math.random() * 9) + 1;
}
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println("[第" + question + "問]" + questionX + " * " + questionY + "== ?");
String line = reader.readLine();
int result = Integer.parseInt(line);
if(questionX * questionY == result){
System.out.println("正しい");
return Enum_QuestionStatus.Correct;
}else{
System.out.println("正しくない");
return Enum_QuestionStatus.Irregular;
}
}catch(IOException e){
System.out.println(e);
return Enum_QuestionStatus.IOError;
}catch(NumberFormatException e){
System.out.println("入力された値が正しくない");
return Enum_QuestionStatus.NumberFormatError;
}
//return Enum_QuestionStatus.Error;
}

}

投稿日時 - 2017-11-23 14:53:02

ANo.1

try{
//処理
}catch(IOException e){
System.out.println(e);
}catch(NumberFormatException e){
System.out.println("入力された値が正しくない");
}
return false;
となっているのを
while(true)
try{
//処理
return false;
}catch(IOException e){
System.out.println(e);
}catch(NumberFormatException e){
System.out.println("入力された値が正しくない");
}
とすればどうですか?

投稿日時 - 2017-11-22 22:54:19

あなたにオススメの質問