任何人都可以帮我修改我的Java代码吗?

时间:2011-04-21 05:59:52

标签: java

好的更清楚这是我需要对整个程序做的事情。我需要main来恢复文件“calc.bak”中的任何计算器,然后向用户显示一个菜单,main应该在退出之前保存同一文件中存在的所有计算器(适当地覆盖)。我还需要让用户选择创建一个全新的计算器,命名它,并从已经存在的集合中添加一个函数(这是我的添加,乘法和除法)。我还需要用户通过设计和命名任何一对函数的组合来创建自己的函数。第一个函数的输出必然输入到第二个函数。例如,用户可以创建一个名为“addmult”的新函数,该函数调用add函数(提示两个数字并添加它们)并将sum建立为乘法函数的操作数之一(必须提示其第二个操作数)。

示例输出应该如下所示: 欢迎使用Calculator Configurator

  1. 从文件中恢复计算器

  2. 从头开始创建计算器

  3. 让我创建一个可以使用的计算器

  4. 2

    行。所以你想自己创造一个。

    您的计算器名称是什么?佛瑞德

    指出您想要添加到计算器中的库存中的哪些功能(输入0退出此菜单):

    添加(1)

    乘法(2)

    除以(3)

    一对功能(4)

    输入(2)

    指出您想要添加到计算器中的库存中的哪些功能(输入0退出此菜单):

    添加

    鸿沟

    一对功能

    1 指出您想要添加到计算器中的库存中的哪些功能(输入0退出此菜单):  添加

    鸿沟

    一对功能

    4

    提供此对的名称:

    BothAddAndMult

    提供此对的说明:

    乘以然后添加

    首先应该使用哪个功能?

    乘(0)

    添加(1)

    0

    首先应该使用哪个功能?

    添加

    1

    指出您想要添加到计算器中的库存中的哪些功能(输入0退出此菜单):

    添加

    鸿沟

    一对功能

    4

    提供此对的名称:

    MultAfter

    提供此对的描述:在乘法后乘以最后并添加

    首先应该使用哪个功能?

    添加

    BothAddAndMult

    2

    首先应该使用哪个功能?

    添加

    BothAddAndMult

    指出您想要添加到计算器中的库存中的哪些功能(输入0退出此菜单):

    添加

    鸿沟

    一对功能

    0

    我是一个名叫弗雷德的计算器

    1. 退出

    2. 清除记忆

    3. 乘以两个数字

    4. 添加两个数字

    5. 相乘然后添加

    6. 在乘法后乘以最后并添加

    7. 有人可以帮助我达到这个输出吗?

      到目前为止,这是我的代码

      CalcConfig.java

      import java.util.Scanner;
      
      // program to model a configurable calculator
      public class CalcConfig {
       public static void main(String [] args)
       {
         System.out.println("Welcome to the Calculator Configurator");
         Scanner kbd = new Scanner(System.in);
         CalcFunction [] funs = {
           new Add(kbd, "add two numbers"),
           new Multiply(kbd, "Multiply two numbers"),
           new Divide(kbd, "divide two numbers")};
         Calculator calc = new Calculator(funs);
         calc.go(kbd);
      
      }
      }
      

      Calculator.java

      //my Calculator class
      
      import java.util.Scanner;
      
      // models a configurable calcuator
      public class Calculator {
         private CalcFunction [] functions;
         private double memory = 0;
         private boolean clear = true;
      
      public Calculator(CalcFunction [] functions)
      {
         this.functions = functions;
      }
      
      public void go(Scanner kbd)
      {
         int choice = 0;
         do
         {
            System.out.println(this);
            choice = kbd.nextInt();
            if (choice == 0) return; // choice is to quit
            if (choice == 1)
            {
               clear = true;
               continue;
            }
            if (choice < 0 || choice >= 5)
             {
                System.out.println("error");
                continue;
             }
            if (!clear)
             {
                System.out.print("use memory [" + memory + "] (y or n)? ");
                String ans = kbd.next();
                if (ans.equals("n")) clear = true;
             }
            if (clear)
             memory = functions[choice-2].doit();
           else
             memory = functions[choice-2].doit(memory);
           clear = false;
           System.out.println(memory);
      } while(choice != 0);
      }
      
      public String toString()
      {
          String out = "0. quit\n1. clear memory\n";
          for (int i=0; i<functions.length; i++)
          out += (i+2) + ". " + functions[i] + "\n";
          return out;
      }
      }
      

      CalcFunction.java

      //my CalcFunction class
      import java.util.Scanner;
      
      // generic class to model a function in a calculator
      public abstract class CalcFunction {
             private Scanner kbd;
             private String description;
      
      public CalcFunction(Scanner kbd, String description)
      {
             this.kbd = kbd;
             this.description = description;
      }
      
      public abstract double doit();
      public abstract double doit(double memory);
      
      // get a string from the user
      protected String getString(String prompt)
      {
           System.out.print(prompt);
           return kbd.next();
      }
      // get a number from the user
      protected double getNum(String prompt)
      {
           System.out.print(prompt);
           while(!kbd.hasNextDouble())
           {
               System.out.print("Invalid: need a number: ");
               kbd.next(); // discard invalid input
           }
           return kbd.nextDouble();
      }
      
      public String toString()
      {
        return description;
      }
      }
      

      Add.java

      //just one of my functions(Add)
      import java.util.Scanner;
      
      // class to encapsulate adding two numbers
      public class Add extends CalcFunction {
      public Add(Scanner kbd, String description)
      {
           super(kbd, description);
      }
      
      public double doit()
      {
          double n1 = this.getNum("Enter a number: ");
          return this.doit(n1);
      }
      
      public double doit(double first)
      {
          double n2 = this.getNum("Enter a second number: ");
          double answer = first + n2;
          return answer;
      }
      }
      

      如果可以,请帮忙。谢谢!

2 个答案:

答案 0 :(得分:0)

的伪代码:

// 1 maps to add, 2 to subtract, etc

while(cur_func = scanner.read != sentinal value) {
    switch(cur_func) { 
        1:
            //toss add into the functions set
            break
        .
        .
        .
    }
}

toArray your set and build the calc

答案 1 :(得分:0)

如果您希望用户能够将计算器功能动态添加到计算器中,那么您将需要以下内容:

public void addCalcFunction(CalcFunction newCalcFunction) {
    this.functions.add(newCalcFunction);
}

...但这需要将this.functions修改为Collection<CalcFunction>

如果您希望用户按名称引用这些功能,则需要映射它们:

private Map<String, CalcFunction> functions;

...

public void addCalcFunction(String functionName, CalcFunction newCalcFunction) {
    this.functions.put(functionName, newCalcFunction);
}

使用Map会要求您进行进一步的更改,但我相信您可以解决这些问题。