2013-11-26 154 views
1

這是一些我寧願弄清楚自己的工作,所以你可以請不要直接給出答案,但也許可以指出我正確的方向爲什麼我我正在從循環輸出接收錯誤,以及爲什麼IF語句沒有生成輸出。對於循環錯誤 - >如果語句不產生輸出

我必須允許用戶輸入'推薦的最高員工工資',然後從不同商店單元的文件中讀取文本以計算每個商店單位的員工工資和總員工成本。

這裏是我要讀

Unit One 
4 
32 8 
38 6 
38 6 
16 7 

Unit Two 
0 

Unit Three 
2 
36 7 
36 7 

Unit Four 
6 
32 6.5 
32 6.5 
36 6.5 
36 6.5 
38 6.5 
38 6.5 

...continued up to 9 shop units. 

文本這是我的代碼:

public class Recursion { 

    public static void main(String[] args) { 
      // TODO Auto-generated method stub 
      int count =0; 
      int n = 1; 
      int t=0; 
      int triangularNumber =0; 
      while (n<Integer.MAX_VALUE) 
      { 
        t = isTriangularNumber(n,count,triangularNumber); 
        triangularNumber=0; 
        int starNumber= ((6*n)*(n-1)) + 1; 
        if (starNumber ==t) 
        { 
          System.out.println(t); 
        } 
        n++; 
      }  
      if (n==Integer.MAX_VALUE) 
      { 
       System.exit(0); 
      } 
    } 


    public static int isTriangularNumber(int n, int count, int triangularNumber) 
    { 
      triangularNumber =triangularNumber + (n-(n-count)); 
      if (count<=n) 
      {  
        return isTriangularNumber(n,(count++), triangularNumber); 
      }  
      else return triangularNumber; 
    } 

} 爲鋪臺的打印輸出都很好,但它的輸出後產生一個錯誤,並且if語句的輸出不出來,如下所示:

Please enter the recommended maximum staff cost: 
900 
You entered: 900.0 
256.0 
484.0 
712.0 
824.0 
The total staff cost of Unit One is £824.0 
The total staff cost of Unit Two is £0.0 
252.0 
504.0 
The total staff cost of Unit Three is £504.0 
208.0 
416.0 
650.0 
884.0 
1131.0 
1378.0 
The total staff cost of Unit Four is £1378.0 
208.0 
464.0 
688.0 
944.0 
The total staff cost of Unit Five is £944.0 
266.0 
461.0 
653.0 
845.0 
1037.0 
The total staff cost of Unit Six is £1037.0 
The total staff cost of Unit Seven is £0.0 
480.0 
The total staff cost of Unit Eight is £480.0 
192.0 
348.0 
543.0 
711.0 
935.0 
The total staff cost of Unit Nine is £935.0 
Exception in thread "main" java.util.NoSuchElementException: No line found 
at java.util.Scanner.nextLine(Unknown Source) 
at TEST.main(TEST.java:48) 

任何想法可能會造成這種情況?

+0

粗略猜測:你的兩個'infile.nextLine()'調用試圖超過輸入文件的末尾? –

回答

0

if語句的輸出未到達的原因是該語句不在循環中。正確格式化您的代碼應該可以幫助您更早地識別此類錯誤。

的花括號結束for (int b = 0; b <shopunits; b++)循環的if語句之前位於同一符合total = 0;。這就是在循環期間沒有達到條件的原因。

另一個問題是,您的代碼在處理當前商店後消耗商店之間的新線。只要有下一家商店,這就行得通;然而,只要你到達最後一家商店,就會發生這種情況。

要解決這個問題,之前消費新行添加的檢查,像這樣:

if (!inFile.hasNextLine()) break; 
Unitnum = inFile.nextLine(); 
if (!inFile.hasNextLine()) break; 
Unitnum = inFile.nextLine(); 

另外,還可以保護nextLine()當前塊讀取與單一if,像這樣:

if (b != shopunits-1) { 
    // Skip lines only if we haven't reached the last block 
    Unitnum = inFile.nextLine(); 
    Unitnum = inFile.nextLine(); 
} 

在循環內移動if語句並修復此問題後,程序應正常運行。

+0

好的謝謝,只是想知道我會在哪裏添加他們的代碼行?我得到的if語句現在工作正常,只是循環的問題仍然 – user2863681

+0

@ user2863681你有兩個連續的行'Unitnum = inFile.nextLine();'那裏。目前,它們一直在執行。你可以在它們周圍添加一個'if(b!= shopunits-1)',或者在這些行的前面添加'if(!inFile.hasNextLine())break;'。兩種方式都應該正常工作。 – dasblinkenlight

1

以下行給你一個錯誤:

Unitnum = inFile.nextLine(); 
Unitnum = inFile.nextLine(); 

你可以在他們包裹:

if (b < shopunits - 1) { 
    ... 
} 
1

您已經達到了文件的末尾,掃描儀嘗試讀取nextLine時在導致此問題的文件末尾。

1

Adarsh說的很可能是正確的,你應該做的是把它包裝在一個while循環中。

while(infile.hasNextLine()){ 
    ... 
} 

這種方式,當它到達最後它不會失敗。 我經歷並編輯了格式化代碼,起初很難遵循。我認爲你的if block的問題在那裏沒有括號。

試試這個:

if(total > recommended_max){ 
    System.out.println("Higher"); 
}else{ 
    System.out.println("Lower"); 
} 

我知道它有時無,但有時括號取決於如何或在哪裏它被寫入它可能不是。所以它總是很好的把它們放在上面。

0
  1. 對於在端部的誤差,似乎在下面的for循環嘗試之後讀取線每次迭代結束:

    Unitnum = inFile.nextLine();
    Unitnum = inFile.nextLine();

因此,無論你應該有2個空行的文件的末尾,還是應該在循環的開始讀取行:約

while(inFile.hasNextLine()) { 
    Unitnum = inFile.nextLine(); 
    saleassist = inFile.nextInt(); 
    ....... 
} 
  1. 二問題「如果「塊在每次迭代結束時與總值設置爲0有關:

    小時= 0; rate = 0; total = 0;

您需要在外部循環之外聲明的額外變量來保存循環中總計的總和。

double sumOfTotal=0; 
...... 
System.out.println("The total staff cost of " + Unitnum +" is £"+ total); 
//this holds the sum of totals across loops 
sumOfTotal += total; 
...... 
total=0; 
} 
if (sumOfTotal > reccomended_max) 
    System.out.println("Higher"); 
else 
    System.out.println("Lower");