2011-10-31 85 views
-1

我有一個家庭作業,我覺得我已經接近正確了。作業如下:循環問題,過早停止

銀行貸款給對方。在經濟困難時期,如果銀行破產,可能無法償還貸款。銀行的總資產是其目前的餘額加上其他銀行的貸款。圖8.1(附圖)是一張圖,顯示了五家銀行。銀行目前的餘額分別爲:25,125,175,75億和1.81億美元。從節點1到節點2的有向邊表示銀行1個貸款40磨到銀行2.

diagram

如果銀行總資產下一定限度時,該行被認爲是不安全的。如果一家銀行不安全,它所借的錢不能退還給貸方,貸方也不能將其貸款總額計入其中。因此,貸款人也可能不安全。

編寫一個程序來查找所有不安全的銀行。你的程序如下讀取輸入。它首先讀取兩個整數,nlimit,其中n表示銀行數量,limit是保持銀行安全的最低資產。然後它讀取n行描述n銀行ID爲從0到n-1的信息。該行的第一個數字是銀行的餘額。第二個數字表示從銀行借來的錢的數量,其餘的是兩個數字。每一對描述一個借款人。第一個數字是銀行ID,第二個數字是它借入的金額。假設銀行的最大數量是100。例如,對於五家銀行的輸入是如下(上限爲201)

25 2 1 100.5 320.5 4

銀行3的總資產是75加125,這是在201以下,所以銀行是不安全的。銀行3不安全後,銀行1的總資產變爲125 + 40,現在也不安全。輸出應該是「不安全的銀行是3 1」

這是我目前的解決方案的問題。我無法弄清楚如何找到所有不安全的銀行。只是第一個。我有它設置爲靜態輸入測試。如果我能夠正常工作,我已經準備好了工作用戶輸入代碼。

#include <iostream> 

using namespace std; 

int main() 
{ 
    const int SIZE = 100; 
    double balance[SIZE]; 
    double loan[SIZE][SIZE]; 
    int nobanks; 
    int limit; 
    int i = 0; 
    int j = 0; 
    int k = 0; 
    int noborrowers; 
    double assets[SIZE]; 
    bool isSafe[SIZE]; 
    bool newunsafefound = true; 

    cout << "Enter number of banks and the limit:" << endl; 

    // Set all of the data 
    nobanks = 5; 
    limit = 201; 
    balance[0] = 25.0; 
    balance[1] = 125.0; 
    balance[2] = 175.0; 
    balance[3] = 75.0; 
    balance[4] = 181.0; 
    loan[0][1] = 100.5; 
    loan[0][4] = 320.5; 
    loan[1][2] = 40.0; 
    loan[1][3] = 85.0; 
    loan[2][0] = 125.0; 
    loan[2][3] = 75.0; 
    loan[3][0] = 125.0; 
    loan[4][2] = 125.0; 

    // Set array to all true values 
    for(i = 0; i < nobanks; i++) 
    { 
     isSafe[i] = true ; 
    } 

    cout << "Unsafe banks are: "; 

    i=0; 

    while(isSafe[i] == true) 
    { 
     newunsafefound=false; 

     i=0; 

     do 
     { 
      assets[i] = balance[i]; //Set assets to balance 

      for (j = 0; j < nobanks; j++) // Check if a bank has loans and add them to assets 
      { 
       if (loan[i][j] >= 0) 
        assets[i] += loan[i][j]; 
      } 

      if (assets[i] < limit) // Check to see if current bank meets limit 
      { 
       isSafe[i] = false; // Set bank to not safe if limit not met 

       newunsafefound = true; 

       cout << i << " " ; //Display the bank that is unsafe and a space for the next bank 

       k=0; 

       for (k = 0; k < nobanks; k++) 
       { 
        loan[i][k] = 0; //Set banks loans to 0 if unsafe. 
        k++; 
       } 
      } 
      i++; 
     } while(i < nobanks); 
    } 
    return (0); 
} 

我在做什麼錯?

+4

你真的*不縮進你的代碼,或者你有問題複製和粘貼它嗎? –

+0

難道你不應該從文件中讀取你的輸入嗎? – Mranz

+1

請請縮進。 –

回答

1
for (k = 0; k < nobanks; k++) 
{ 
    loan[i][k] = 0; //Set banks loans to 0 if unsafe. 
    k++; 
} 

,對於k額外增量看起來非常可疑;)

+0

是的,它確實......不應該在那裏。我回到了一個for循環,並沒有擺脫這個侮辱。不幸的是還是破了 – user999861

+0

@ user999861您應該將您的代碼更新爲您現在擁有的代碼。我不確定你運行的代碼是什麼樣的。 –

1

你必須明確地初始化數組loan,這樣你就不會使用的元素沒有任意值:

double loan[SIZE][SIZE] = {{0}}; 

另外loan[i][k] = 0;意味着你正在調零貸款銀行i給出到t他的銀行k,但你想要的是零銀行i借給銀行k任何錢。

而且還有一個問題:

    在外環的退出條件
  • (那隻退出,如果最後銀行(nobank-1)是不安全的),
  • newunsafefound的處理,這不做變量名稱暗示的內容。
+0

這很有用。我以前認爲這是我的問題,但事實並非如此。 – user999861

+0

@ user999861:該代碼可能存在許多問題。 –