2014-03-05 46 views
0
1 // This program reads in an item's cost and some coupons' information, 
2 // and then determines which is the best coupon to use and the amount 
3 // to pay. 
4 
5 import java.util.*; 
6 
7 
8 public class Redeem { 
9   
10  public static void main(String[] args) { 
11   Scanner sc = new Scanner(System.in); 
12   double price = sc.nextDouble(); 
13   int size = sc.nextInt(); 
14   int i=0; 
15   double amtPay = price; 
16   double negativeAmt= -99999.99; 
17   
18   ArrayList<Coupon>coupons = new ArrayList<Coupon>(size); 
19   
20   for(i=0; i<size; i++) { 
21    Coupon newCoupon = new Coupon(sc.next(), sc.nextDouble()); 
22    coupons.add(i, newCoupon); 
23    sc.nextLine(); 
24   } 
25    
26   for(i=0; i<size; i++) { 
27    double temp = (coupons.get(i)).payment(price); 
28    if (temp < 0) { 
29     if (temp > negativeAmt) { 
30      negativeAmt = temp; 
31      Coupon bestCoupon = new Coupon(coupons.get(i)); 
32     } 
33     amtPay = 0.00; 
34    } 
35    else { 
36     if (amtPay != 0) { 
37      if (temp < amtPay) { 
38       amtPay = temp; 
39      } 
40      Coupon bestCoupon = new Coupon(coupons.get(i)); 
41     } 
42    }  
43   }  
44   System.out.println("Best choice: " + bestCoupon); 
45   System.out.printf("You need to pay $%.2f\n", amtPay); 
46  } 
47 } 

我不断收到错误无法找到对象符号错误和定义

Redeem.java:44: error: cannot find symbol 
       System.out.println("Best choice: " + bestCoupon); 
                ^
    symbol: variable bestCoupon 
    location: class Redeem 
1 error 

为什么它没有看出它是优惠券类的对象?我编我的优惠券类在此之前(含一个toString方法,因此println的应检测的字符串),仍然有这个问题:(

+0

优惠券的范围'bestCoupon'是内部接近它宣布的区块。 – makata

回答

2

因为你if的范围内声明它helppp,它是只知道有:

if(temp > negativeAmt) { 
    negativeAmt = temp; 
    Coupon bestCoupon = new Coupon(coupons.get(i)); 
    //bestCoupon is known here 
} 
//But not here 

更普遍的例子:

if(something) { 
    int a; 
    if(somethingElse) { 
     int b; 
     a = b; //OK 
    } 
    b = a; //Error, b is not known here 
} 
1

范围的事项

您将该变量的范围限制在if。如果该变量不可用,则表示不支持。

移动你的宣言Coupon bestCoupon为循环顶端的。

然后,在循环的侧

bestCoupon = new Coupon(coupons.get(i)); 

实施例:

Coupon bestCoupon= null; 
    for{ 
     if(){ 
     bestCoupon=... 
     } 
    } 
//Access here. 
0
Coupon bestCoupon =null; 
for(i=0; i<size; i++) { 
    ... 
    bestCoupon = new Coupon(coupons.get(i)); //not Coupon bestCoupon = new Coupon(coupons.get(i)); 
    ... 
} 
System.out.println("Best choice: " + bestCoupon); 
0

变化券bestCoupon like--

public class Redeem { 

     public static void main(String[] args) { 
      Scanner sc = new Scanner(System.in); 
      double price = sc.nextDouble(); 
      int size = sc.nextInt(); 
      int i=0; 
      double amtPay = price; 
      double negativeAmt= -99999.99; 
      Coupon bestCoupon =null; //<-- Declaration of Coupon 
      ArrayList<Coupon>coupons = new ArrayList<Coupon>(size); 

      for(i=0; i<size; i++) { 
       Coupon newCoupon = new Coupon(sc.next(), sc.nextDouble()); 
       coupons.add(i, newCoupon); 
       sc.nextLine(); 
      } 

      for(i=0; i<size; i++) { 
       double temp = (coupons.get(i)).payment(price); 
       if (temp < 0) { 
        if (temp > negativeAmt) { 
         negativeAmt = temp; 
         bestCoupon = new Coupon(coupons.get(i)); 
        } 
        amtPay = 0.00; 
       } 
       else { 
        if (amtPay != 0) { 
         if (temp < amtPay) { 
          amtPay = temp; 
         } 
         bestCoupon = new Coupon(coupons.get(i)); 
        } 
       }  
      }  
      System.out.println("Best choice: " + bestCoupon); 
      System.out.printf("You need to pay $%.2f\n", amtPay); 
     } 
    }