2014-03-05 2 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 

왜 그것이 쿠폰 클래스의 객체라고 볼 수 없습니다입니까? 나는 (println 메소드는 문자열을 감지합니다 그것은 있도록 toString 메소드와 함께)이 전에 내 쿠폰 클래스를 컴파일하고 여전히 만이 알려져이 문제 :(helppp if의 범위에을 선언

+0

쿠폰 bestCoupon 쿠폰의 범위'bestCoupon' 내부 접근 블록이 선언되었습니다. – makata

답변

2

당신 때문에이 :

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을 for 루프의 맨 위로 이동하십시오.

이어서 루프 측

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

변경 이렇게 ...

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