【问题标题】:Can anyone help me modify my code in Java?谁能帮我修改我的Java代码?
【发布时间】:2011-04-21 05:59:52
【问题描述】:

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

输出的示例应如下所示: 欢迎使用计算器配置器

  1. 从文件中恢复计算器

  2. 从头开始创建一个计算器

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

2

好的。所以你想自己创建一个。

你的计算器叫什么名字?弗雷德

指明您希望将我们库存中的哪些功能添加到您的计算器中(输入 0 退出此菜单):

添加(1)

乘法(2)

除法(3)

函数对(4)

输入 (2)

指明您希望将我们库存中的哪些功能添加到您的计算器中(输入 0 退出此菜单):

添加

相乘

除法

函数对

1 指明您希望将我们库存中的哪些功能添加到您的计算器中(输入 0 退出此菜单): 添加

相乘

除法

函数对

4

为这对提供一个名称:

BothAddAndMult

提供这对的描述:

相乘再相加

首先应该使用哪个函数?

相乘(0)

添加(1)

0

首先应该使用哪个函数?

相乘

添加

1

指明您希望将我们库存中的哪些功能添加到您的计算器中(输入 0 退出此菜单):

添加

相乘

除法

函数对

4

为这对提供一个名称:

多次后

提供这对的描述:在乘法和加法之后最后相乘

首先应该使用哪个函数?

相乘

添加

BothAddAndMult

2

首先应该使用哪个函数?

相乘

添加

BothAddAndMult

指明您希望将我们库存中的哪些功能添加到您的计算器中(输入 0 退出此菜单):

添加

相乘

除法

函数对

0

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

  1. 退出

  2. 清除内存

  3. 两个数相乘

  4. 两个数字相加

  5. 先相乘再相加

  6. 在乘法和加法后最后乘法

有人可以帮我实现这个输出吗?

这是我目前的代码

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);

}
}

计算器.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;
}
}

添加.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;
}
}

如果可以,请提供帮助。谢谢!

【问题讨论】:

  • 请提供具有逻辑和一致形式的缩进和分隔代码块的代码。那个代码是一团糟!如果您可以将问题的代码减少到SSCCE,您还将获得更好的帮助机会。这将涉及将所有类放入同一个源文件中,只有带有 main(String[]) 的类声明为 public。
  • go() 和 doIt() 是糟糕的函数名。另外请修正你的缩进,让它更难阅读。

标签: java


【解决方案1】:

伪代码:

// 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

【讨论】:

  • 怎么折腾到函数集中?我应该把它放在main中吗?
  • @Billy 是的,这是主要的;看,他正在使用您已经创建的扫描仪来读取输入。你知道扫描仪或主要功能是什么吗?至于如何“折腾添加到函数集中”,您将需要像您的 funs 一样构建一个 CalcFunction[] ,然后在扫描器循环选择它们时将 funs 的每个值设置为函数。例如,如果开关 1:则 funs[0] = new Add(kbd, "add two numbers");但你不能使用 0,你要么必须使用迭代器(还要担心数组的大小),要么使用 ArrayList,然后在完成后将其复制到数组中。
  • @Zaphod42 谢谢先生,这真的很有帮助。抱歉,我没有意识到代码没有缩进。我还有一个问题。我如何让用户创建一个函数?例如,用户可以创建一个名为“addmult”的新函数,该函数调用 add 函数(提示输入两个数字并将它们相加)并将总和确定为乘法函数的操作数之一(它必须提示输入第二个操作数)。我将如何实现这一点?
【解决方案2】:

如果您希望用户能够为计算器动态添加计算器功能,那么您将需要这样的东西:

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

...但这需要将this.functions 修改为Collection&lt;CalcFunction&gt;

如果您希望用户按名称引用这些函数,那么您需要映射它们:

private Map<String, CalcFunction> functions;

...

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

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

【讨论】:

  • 我不知道如何使用地图。 addCalcFuntion 方法会放在我这里的另一个类或我的一个类中吗?
  • 它会进入你的计算器类。这就是您要添加计算器功能的地方。您可以在online JavaDocs 上查看如何使用Map
猜你喜欢
  • 2011-05-03
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
相关资源
最近更新 更多