Stack Overflow на русском Asked by Samvise on November 5, 2021
Я сделал программу, которая создаёт случайные примеры, и ты должен на них ответить. После её написания программы я решил сделать ограничение по времени, но столкнулся с тем, что программа не продолжается, пока я не напишу ответ. Как можно это реализовать?
import java.io.*;
public class Sum
{
public static void main (String[] args) throws IOException
{
String operands[] = {"+", "-", "/", "*"};
int first, second, op, score = 0;
double res;
System.out.println("Если вы хотите закончить, то введите слово "stop"." );
do
{
System.out.print("Решите следующий пример: ");
one: for (;;)
{
first = (int) (Math.random() * 100);
second = (int) (Math.random() * 100);
op = (int)Math.floor(Math.random() * operands.length);
if (op == 2 & (first % second != 0 | second == 0))
{
for (;;)
{
first = (int) (Math.random() * 100);
second = (int) (Math.random() * 100);
if (second != 0 && first % second == 0 && first >= second)
{
System.out.print(first + " " + operands[op] + " " + second + " = ");
break one;
}
}
}
else
{
System.out.print(first + " " + operands[op] + " " + second + " = ");
break;
}
}
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
System.out.print("Оставшееся время: 15");
for (int sec = 0; sec < 15; sec++)
{
System.out.print("bb" + sec);
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
int c;
if ( str.equals("stop"))
{
System.out.println("Вы уверены?");
String answer = br.readLine();
switch (answer)
{
case "Да": System.out.println("Подсчёт очков: " + score + ".");
break;
case "Нет": continue;
}
break;
}
else
{
try
{
c = Integer.parseInt(str);;
}
catch (NumberFormatException exp)
{
System.out.println("Неверный формат!");
continue;
}
}
switch (op)
{
case 0:
if (first + second == c)
{
System.out.println("Всё верно!");
score++;
continue;
}
else
{
System.out.println("Неверно!");
continue;
}
case 1:
if (first - second == c)
{
System.out.println("Всё верно!");
score++;
continue;
}
else
{
System.out.println("Неверно!");
continue;
}
case 2:
if (first / second == c)
{
System.out.println("Всё верно!");
score++;
continue;
}
else
{
System.out.println("Неверно!");
continue;
}
case 3:
if (first * second == c)
{
System.out.println("Всё верно!");
score++;
continue;
}
else
{
System.out.println("Неверно!");
continue;
}
}
} while(first != 1024);
}
}
Вот пример. Он конечно базовый, и многого не учитывает, но идею даст.
Сперва реализуем интерфейс Callable
. Это задача, которая может исполняться параллельно и возвращает какой-то результат.
package click.webelement.so;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.concurrent.Callable;
public class Question implements Callable<Boolean> {
String question;
int correctAnswer;
public Question(String question, int correctAnswer){
this.question = question;
this.correctAnswer = correctAnswer;
}
@Override
public Boolean call() throws Exception {
System.out.println(question);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
while (!bufferedReader.ready()){
Thread.sleep(100);
}
if(Integer.parseInt(bufferedReader.readLine()) == correctAnswer){
return true;
}
return false;
}
}
В основном методе мы показываем вопрос и считываем вариант ответа.
Далее в главном потоке мы раз в секунду проверяем результат:
package click.webelement.so;
import click.webelement.so.Question;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class TimeLimitTask {
public static void main(String[] args) {
int totalScore = 0;
totalScore += askQuestion(new Question("Test question 1", 1));
totalScore += askQuestion(new Question("Test question 2", 2));
if (totalScore > 1){
System.out.println("Test passed");
}else{
System.out.println("Test failed");
}
}
public static int askQuestion(Question question) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<Boolean> questionFuture = executorService.submit(question);
int secondsPassed = 0;
try {
while (secondsPassed < 5) {
if (questionFuture.isDone()) {
if (questionFuture.get()) {
System.out.println("Correct answer!");
return 1;
} else {
System.out.println("Incorrect answer!");
return 0;
}
}
Thread.sleep(1000);
secondsPassed++;
}
} catch (Exception e) {
e.printStackTrace();
return 0;
} finally {
executorService.shutdownNow();
}
System.out.println("No answer received in time..");
return 0;
}
}
Тут есть ряд моментов, которые можно и нужно улучшать, но в целом, идею этот вариант обрисовывает.
Answered by Alexey R. on November 5, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP