Добавление данных в программу, если она существует; еще генерировать случайные данные в Java

1

У меня есть математическая программа, которая показывает случайные математические проблемы, когда вы нажимаете, чтобы увидеть следующий ответ, появится следующий ответ.

Я добавил метод, который загружает файл с именем upload.txt

Я хочу, чтобы моя программа запускала математические задачи в этом файле вместо запуска случайных математических задач, если файл существует. Если нет, я хочу, чтобы программа запускала текущий способ, который запускает случайные математические проблемы.

Мой текущий метод добавления текстового файла не является на 100 процентов точным. Я просто хочу, чтобы проблемы, написанные в файле, были добавлены. Я получил его, просто загружая числа в командную строку, используя код из другого потока в StackOverflow.

класс случайных математических задач

import java.util.Random;

public class MathProblems {
     private static final int MAX_NUMBER = 1000;
     private static final Random random = new Random();

     private double expected = 0;
     private String question = "";


     public void run() {
         final int a = random.nextInt(MAX_NUMBER);
         final int b = random.nextInt(MAX_NUMBER);

         final int type = random.nextInt(4);

         switch (type) {
             case 0: 
                 add(a, b);
                 break;
             case 1: 
                subtract(a, b);
                break;
             case 2:
                multiply(a, b);
                break;
             case 3:
                 divide(a, b);
                 break;
         }
     }

     private void add(final int a, final int b) {
         expected = a + b;

         askQuestion(a + " + " + b + " = ");
     }

     private void subtract(final int a, final int b) {
         expected = a - b;

         askQuestion(a + " - " + b + " = ");
     }

     private void multiply(final int a, final int b) {
         expected = a * b;

         askQuestion(a + " * " + b + " = ");
     }

     private void divide(final int a, final int b) {
         expected = (double)a / b; 

         askQuestion(a + " / " + b + " = ");
     }

     private  void askQuestion(final String question) {
         this.question = question;
     }  

     public String getQuestion() {
         return question;
     }

     @Override
     public String toString(){
     return Double.toString(expected);
     }
}

Класс водителя

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.*;

import javax.swing.*;

public class Driver extends MathProblems {

        MathProblems problems = new MathProblems();

        Scanner textfile;

        String s = "Welcome Students!";
        String b = "Start!";
        private JFrame f;
        private JPanel p;

        JFrame frame = new JFrame();

        JButton b1 = new JButton(b);

        JLabel jl = new JLabel(s);

        int i;

        private int clicked;

        public Driver() {
                gui();
        }

        public void gui() {
                f = new JFrame("Flash Card Program");
                p = new JPanel();
                f.setLayout(new GridLayout(2, 1));
                f.add(jl);
                f.add(p);
                p.setLayout(new GridLayout(2, 1));
                p.add(b1);

                jl.setHorizontalAlignment(JLabel.CENTER);

                // pack the frame for better cross platform support
                f.pack();
                // Make it visible
                f.setVisible(true);
                f.setSize(500, 400); // default size is 0,0
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                b1.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {

                                if (b1.getText().equals("Click For Answer")) {
                                        jl.setText(problems.toString());
                                        b = "Next Question";
                                        b1.setText(b);
                                } else {
                                        problems.run();
                                        jl.setText(problems.getQuestion());
                                        b = "Click For Answer";
                                        b1.setText(b);

                                }

                        }
                });

                b1.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {

                                if (clicked++ == 10) {

                                        Object[] options = { "No, thanks", "Yes, please" };

                                        int response = JOptionPane.showOptionDialog(frame,
                                                        "Would you like more math questions? ",
                                                        "Math Questions", JOptionPane.YES_NO_CANCEL_OPTION,
                                                        JOptionPane.QUESTION_MESSAGE, null, options,
                                                        options[1]);

                                        if (response == 1)
                                                clicked = 0; // reset
                                        else
                                                System.exit(0);
                                }

                        }
                });

        }

        static void filereader(Scanner textfile) {         
                    int i = 0;         
                    int sum = 0;          
                    while(i <= 19)         
                    {       
                        int nextInt = textfile.nextInt();          

                        System.out.println(nextInt);             
                        sum = sum + nextInt;
                        i++;         
                    }     
                }

        public static void main(String[] args) throws IOException {
                EventQueue.invokeLater(new Runnable() {
                        public void run() {
                                new Driver();

                Scanner textfile = null;
                try {
                    textfile = new Scanner(new File("upload.txt"));
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }

                filereader(textfile);
                }
                });
        }
}

.txt файл

1 + 1
2 + 2
3 + 3
4 + 4
5 + 5
6 + 6
7 + 7
8 + 8
9 + 9
10 + 10
  • 0
    Так в чем же заключается вопрос? Вы в настоящее время получаете ошибку? Если да, можете ли вы опубликовать эту ошибку? Есть ли конкретная часть кода, на которую мы должны смотреть?
  • 0
    Да, метод загрузки файла .txt. Я пытаюсь добавить эти проблемы в текстовом файле в программу, а не запускать случайные математические задачи. Если файл существует.
Показать ещё 6 комментариев
Теги:
math
random

2 ответа

2
Лучший ответ

Вам нужно определить глобальный вектор значений вопроса для каждого из a и b. Хороший способ сделать это - определить класс под названием "OneProblem", в котором есть члены для a, b и op. Вы создаете единый "Вектор" <OneProblem> ", и когда вы читаете файл, вы создаете объект OneProblem для каждой строки источника. Затем во время выполнения вы либо выбираете случайную математическую задачу, либо просматриваете все объекты OneProblem, либо генерируете полностью случайную OneProblem из генератора случайных чисел. Что-то вроде:

class OneProblem {
    public int a = 0;
    public int b = 0;
    public int op = 0;

    public OneProblem(int _a, int _op, int _b) {
        a =_a;
        b = _b;
        op = _op;
    }
}

class MathProblems {

    Vector<OneProblem> problems = new Vector<OneProblem>();

    //...lot of your other code here as well....

    workQuestion(OneProblem problem) {
        switch (problem.op) {
        case 0: 
            add(problem.a, problem.b);
            break;
        case 1: 
            subtract(problem.a, problem.b);
            break;
        case 2:
            multiply(problem.a, problem.b);
            break;
        case 3:
             divide(problem.a, problem.b);
             break;
        }
    }
}

Вы должны читать читателю каждую строку и анализировать первое и второе значения из строки, а также (я полагаю) операнд между ними. Прочитайте строку и найдите операнд и разделите целое число до и после целого числа. Затем, когда вы читаете каждую строку, OneProblem экземпляр OneProblem для соответствия каждой строке. Теперь вы настроены на запуск.

Представляя математические вопросы, вы перебираете значения от i=0 до i<problems.size(). Если файл не был прочитан, эти векторы не будут иметь записей и, следовательно, будут проваливаться. После того, как вы закончите векторы или если векторы пусты, введите математические вопросы со случайными значениями.

if (problems.size()>0) {
    for (int i=0; i<problems.size(); i++) {
        OneProblem selProblem = problems.get(i);
        workQuestion(selProblem);
    }
}
else {
    workQuestion(new OneProblem({{random a}}, {{random op}}, {{random b}}));
}

Заполните соответствующий метод для askQuestion. Это представлено выше как цикл, но, возможно, вы хотите выбрать случайное одно из тестовых значений для презентации? Затем выберите разумное случайное значение для я в этом диапазоне и получите проблему из векторов.

  • 0
    Хорошо, понял. так что в основном это if ints из txt файла, а остальное будет моей текущей проблемой randomMath? Так что это будет сделано в публичном методе void run из класса MathProblems?
  • 0
    Я заполнил метод 'workProblem', чтобы показать вам, как вы используете объект, и переименовал класс 'OneProblem', потому что предыдущее имя было слишком близко к вашему основному классу.
Показать ещё 5 комментариев
0

В методе filereader вас есть эта строка в цикле:

    int nextInt = textfile.nextInt();          

Но текст примера, который вы показываете, содержит символы "+" между вашими числами, и я не вижу никакого кода, чтобы принять это во внимание.

Чтобы исправить это, вы можете либо определить "+" в качестве разделителя на свой объект Scanner, либо убедиться, что ваш цикл читает его как строку.

  • 0
    Хорошо, спасибо, это имеет смысл. Я изменил текстовый файл, чтобы показать 1 2 3 4 и т. Д. Так что, если я хочу сказать, эй, Java-программа, если существует текстовый файл, используйте его целые и суммируйте их, иначе запустите программу как обычно, просто создавая случайные математические задачи. вопрос "нажмите для ответа" ответ "нажмите для следующего вопроса" и т. д.
  • 0
    Затем вам понадобится код, который определяет, существует ли файл или нет, и предпринимает соответствующие действия. Есть несколько способов сделать это, но я уверен, что если вы немного подумаете об этом и посмотрите, что происходит, когда вы пытаетесь создать Scanner для файла, который не существует, вы поймете это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню