2010-04-29 140 views
1

首先,这不是一门功课的问题。我正在练习关于java的知识。我认为一个很好的方法就是在没有帮助的情况下写一个简单的程序。不幸的是,我的编译器告诉我错误,我不知道如何解决。在不改变逻辑和代码的情况下,有人能够指出我的一些错误在哪里?由于简单的Java计算器

import java.lang.*; 
import java.util.*; 

public class Calculator 
{ 
    private int solution; 
    private int x; 
    private int y; 
    private char operators; 

    public Calculator() 
    { 
     solution = 0; 
     Scanner operators = new Scanner(System.in); 
     Scanner operands = new Scanner(System.in); 
    } 

    public int addition(int x, int y) 
    { 
     return x + y; 
    } 
    public int subtraction(int x, int y) 
    { 
     return x - y; 
    } 
    public int multiplication(int x, int y) 
    {  
     return x * y; 
    } 
    public int division(int x, int y) 
    { 
     solution = x/y; 
     return solution; 
    } 
    public void main (String[] args) 
    { 
     System.out.println("What operation? ('+', '-', '*', '/')"); 

     System.out.println("Insert 2 numbers to be subtracted"); 
     System.out.println("operand 1: "); 
     x = operands; 
     System.out.println("operand 2: "); 
     y = operands.next(); 
     switch(operators) 
     { 
      case('+'): 
      addition(operands); 
      operands.next(); 
      break; 
      case('-'): 
      subtraction(operands); 
      operands.next(); 
      break; 
      case('*'): 
      multiplication(operands); 
      operands.next(); 
      break; 
      case('/'): 
      division(operands); 
      operands.next(); 
      break; 
     } 
    } 
} 
+3

你会得到什么样的错误? – 2010-04-29 01:29:22

+2

感谢您发布您的代码。但是,当您发布从编译器获得的错误消息文本时,它也会有很大的帮助 - 这使得人们可以更轻松地快速识别问题(无需阅读整个代码或自行编译)。 – 2010-04-29 01:42:01

回答

3
package org.com; 

import java.lang.*; 
import java.util.*; 

public class Calculator 
{ 
    private int solution; 
    private static int x; 
    private static int y; 
    private char operators; 

    public Calculator() 
    { 
     solution = 0; 
     Scanner operators = new Scanner(System.in); 
     Scanner operands = new Scanner(System.in); 
    } 

    public int addition(int x, int y) 
    { 
     return x + y; 
    } 
    public int subtraction(int x, int y) 
    { 
     return x - y; 
    } 
    public int multiplication(int x, int y) 
    {  
     return x * y; 
    } 
    public int division(int x, int y) 
    { 
     solution = x/y; 
     return solution; 
    } 

    public void calc(int ops){ 
     x = 4; 
     System.out.println("operand 2: "); 
     y = 5; 

     switch(ops) 
     { 
      case(1): 
       System.out.println(addition(x, y)); 

      // operands.next(); 
       break; 
      case(2): 
       System.out.println(subtraction(x, y)); 
       // operands.next(); 
       break; 
      case(3): 
       System.out.println(multiplication(x, y)); 
      // operands.next(); 
       break; 
      case(4): 
       System.out.println(division(x, y)); 
      // operands.next(); 
       break; 
      } 
    } 
    public static void main (String[] args) 
    { 
     System.out.println("What operation? ('+', '-', '*', '/')"); 
     System.out.println(" Enter 1 for Addition"); 
     System.out.println(" Enter 2 for Subtraction"); 
     System.out.println(" Enter 3 for Multiplication"); 
     System.out.println(" Enter 4 for Division"); 

     Calculator calc = new Calculator(); 
     calc.calc(1); 


    } 
} 

这将工作

4

operandsoperators超出范围主。你在构造函数中声明了局部变量,所以当你退出ctor时,他们有资格获得GC并离开。

你有编译错误 - 他们的10。

+0

你会建议重新宣布他们在主要像: this.operands; this.operators; 还是这是为了另一个目的? – dukevin 2010-04-29 01:53:52

+0

@Kevin Duke:你不能在运行时用语言向类中添加字段。您需要在计算器中指定它们,如您指定的解决方案和操作员。 Main也没有“this”,因为它必须是静态的。 – 2010-04-29 03:02:26

0

你的主要方法需要声明如下:

public static void main(String[] args) {..} 

而且,好像你只提供一个参数传送给所有的算术方法(加,减等),但它们需要两个。

public int addition(int x, int y); 

不能与addition(operands)被调用,也就是只有一个参数,该参数是错误的类型(该方法需要两个int,你给它一个Scanner)。所有这些方法都是一样的。你需要从Scanner提取int秒。你可以用Scanner.nextInt()来做到这一点。

2

的另一个问题是,该行

y = operands.next(); 

试图广场Scanner.next()一个String返回到被声明为类型int的一个变量y

Scanner.nextInt()该方法可用于试图返回int

1

除了其他的答案,你的main()方法必须是为了一个程序入口点静态。在main()中,你需要构造你自己的Calculator对象,并调用它的方法。

-2

就像提示一样,开始将

import java.util.*;
扔到程序中通常不是一个好主意,因为它会使程序不必要的大而慢。所有你需要的是
import java.util.Scanner;
如果我是正确的,那么大多数如果不是java.lang中的所有东西都已经为你导入了。

+2

这是错误的。导入通配符包与运行时性能(或者程序的大小)无关。它仅用于编译时符号解析。 – 2012-12-23 00:26:25

2
package com.abc; 

import java.util.Scanner; 

public class Calculator { 
    private static final String pos = "+"; 
    private static final String neg = "-"; 
    private static final String mult = "*"; 
    private static final String div = "/"; 

    private enum operation { 
     pos, neg, mult, div 
    }; 
    private int solution; 
    private int x; 
    public int getX() { 
     return x; 
    } 

    public void setX(int x) { 
     this.x = x; 
    } 

    public int getY() { 
     return y; 
    } 

    public void setY(int y) { 
     this.y = y; 
    } 

    private int y; 



    static Scanner operators; 

    public Calculator() { 
     solution = 0; 
     operators = new Scanner(System.in); 

    } 

    public int addition(int x, int y) { 
     return x + y; 
    } 

    public int subtraction(int x, int y) { 
     return x - y; 
    } 

    public int multiplication(int x, int y) { 
     return x * y; 
    } 

    public int division(int x, int y) { 
     solution = x/y; 
     return solution; 
    } 

    public static void main(String[] args) { 
     Calculator calc = new Calculator(); 

     System.out.println("Insert 2 numbers"); 

     System.out.println("operand 1: "); 

     calc.setX(Integer.parseInt(operators.next())); 

     System.out.println("operand 2: "); 
     calc.setY(Integer.parseInt(operators.next())); 

     System.out.println("What operation? ('pos', 'neg', 'mult', 'div')"); 
     operation ttt = operation.valueOf(operators.next()); 
     int output = 0 ; 
     switch(ttt){ 
     case pos: 
      output = calc.addition(calc.getX(), calc.getY()); 

      break; 
      case neg: 
       output = calc.subtraction(calc.getX(), calc.getY()); 

      break; 
      case mult: 
       output = calc.multiplication(calc.getX(), calc.getY()); 

      break; 
      case div: 
       output = calc.division(calc.getX(), calc.getY()); 

      break; 
     } 
     System.out.println("output ="+output); 
    } 
} 
1

这是所有伟大的,但您使用的编写Java程序是什么? 也许你应该考虑使用像Eclipse这样的IDE,因为它可以自动检测错误并添加导入。 (我不确定你的是否这样做)它还会告诉你程序的问题是'英文'。 另外,还要考虑这个类的,也许做一个计算器的更容易,更复杂的方式:

public class Calculator { 
public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 
    System.out.print("Enter an Operator: "); 
    String in = sc.next(); 
    char oper = in.charAt(0); 

    System.out.print("Enter a number: "); 
    in = sc.next(); 
    double num1 = Double.parseDouble(in); 

    System.out.print("Enter another number: "); 
    in = sc.next(); 
    double num2 = Double.parseDouble(in); 

    if(oper == '+') { 
     double result = num1 + num2; 
     System.out.println(result); 
    } else if(oper == '-') { 
     double result = num1 - num2; 
     System.out.println(result); 
    } else if(oper == 'x') { 
     double result = num1 * num2; 
     System.out.println(result); 
    } else if(oper == '/') { 
     double result = num1/num2; 
     System.out.println(result); 
    } else { 
     double result = num1 % num2; 
     System.out.println(result); 
    } 
     System.out.println("Hope this helped your mathmatical troubles!"); 
} 

}
而作为习惯问题,而不是做:

import java.util.*; 

它是更好要做:

import java.util.Scanner; 

这可能不会有很大的区别,但如果您正在运行一个更大的程序导入整个java.util会大大减慢你的程序。

希望这会有所帮助!

+0

你最后一点是错误的。导入通配符包与运行时性能无关。它仅用于编译时符号分辨率 – 2012-12-23 00:27:05

+0

对不起。这只是我听到大量的人说如何导入整个Java库会减慢程序的速度。或者我听错了? – Dan299 2012-12-23 11:23:57

+0

我怀疑你没有听错 - 周围只有大量的错误信息。看看[这个问题](http://stackoverflow.com/questions/7128348/performance-difference-between-a-wild-card-import-and-the-required-class-import)。 – 2012-12-23 16:40:17

0
import java.lang.*; 

import java.util.*; 


public class Calculator 
{ 
    private int solution; 
    private int x; 
    private int y; 
private char operators; 

    public Calculator() 
    { 
     solution = 0; 
     Scanner operators = new Scanner(System.in); 
     Scanner operands = new Scanner(System.in); 
    } 

    public int addition(int x, int y) 
    { 
     return x + y; 
    } 
    public int subtraction(int x, int y) 
    { 
     return x - y; 
    } 
    public int multiplication(int x, int y) 
    {  
     return x * y; 
    } 
    public int division(int x, int y) 
    { 
     solution = x/y; 
     return solution; 
    } 
    public void main (String[] args) 
    { 
     System.out.println("What operation? ('+', '-', '*', '/')"); 

     System.out.println("Insert 2 numbers to be subtracted"); 
     System.out.println("operand 1: "); 
     x = operands; 
     System.out.println("operand 2: "); 
     y = operands.next(); 
     switch(operators) 
     { 
      case('+'): 
      addition(operands); 
      operands.next(); 
      break; 
      case('-'): 
      subtraction(operands); 
      operands.next(); 
      break; 
      case('*'): 
      multiplication(operands); 
      operands.next(); 
      break; 
      case('/'): 
      division(operands); 
      operands.next(); 
      break; 
     } 
    } 
} 
-1

您正在要求用户键入整数,但是您将语句operands.next();作为输入。尽量保持与你的变量和用户输入保持一致,所以把它改为operands.nextInt()会有帮助。