2015-06-04 74 views
-2

我對編程確實很陌生,我剛開始嘗試使用哈佛CS50上的一些問題集。如果有人能向我指出爲什麼我的代碼是錯誤的,將不勝感激。CS50 PSET 1貪婪

編譯並運行代碼後,沒有任何輸出。

另一個說明,有人可以向我解釋「圓」是如何工作的?我真的不會從終端上的人那裏得到它。謝謝!


#include <stdio.h> 
#include <math.h> 
int main(void) 
{ 
    printf(" O hai! How much change is owed?\n"); 

    float change; 
    change=GetFloat(); 
    double round(double change); 
    int x= change*100; 

    int i=0; 

    while(x>25) { 
    x=x-25; 
    i++; 
    return i; 
    } 

    while(x>10) { 
    x= x-10; 
    i++; 
    return i; 
    } 

    while(x>5) { 
    x=x-5; 
    i++; 
    return i; 
    } 

    while(x>1) { 
    x=x-1; 
    i++; 
    return i; 
    } 

    printf("%d\n",i); 

} 
+0

當你運行你的代碼時會發生什麼?如果我們不知道它在做什麼,我們不知道爲什麼它會表現錯誤。 – SuperBiasedMan

+0

發佈錯誤你得到 –

+0

我沒有得到這個代碼的任何輸出......所以我不知道最新錯誤:'( – cornstar94

回答

0

您的代碼不工作,因爲你正在返回在每個while循環i

當行return i執行時,main函數返回並且程序終止。

可能的解決方案是刪除循環內的所有返回語句。

0

return語句表示函數的結束。循環不是函數,所以返回語句對它們不是必需的。

您沒有收到輸出,因爲Main本身是一個函數。因此,當「返回i」達到時,機器認爲主功能已到達並停止運行。

因此,低於第一個while循環的所有內容都不會運行。這就是爲什麼你沒有看到printf輸出。

在編程之後,您將使用多個return語句來表示函數(或程序本身)應停止運行的位置。但是在第一個任務中,最後只能有一個返回語句。

0

首先,我會建議您閱讀cs50Style並添加一些註釋,以便代碼更清晰,不僅適用於我們,也適用於您。另一項建議是在節目中加入一些「測試」,例如,如果你想,如果在執行程序的某一部分添加一些代碼,想知道:

printf("TEST1\n"); //check 1 

這樣做,你可以查看當你的程序是達到某個點或失敗。 (在發送或檢查問題之前,這些測試將被刪除,不要忘記)。

現在讓我們來看看主要問題。要知道某個功能或功能是什麼,可以訪問[參考cs50]:https://reference.cs50.net或在您的「cs50應用裝置」控制檯中寫入:男人後面跟着功能的名稱男人輪

基本上這個函數將數字四捨五入到最接近的整數值(2.70到3.00)。

關於爲什麼你的程序不工作的問題。

首先我會看在輸入部分實施do..while循環的方式:

printf(" O hai! How much change is owed?\n"); 
float change; 
change=GetFloat(); 

因爲如果我寫下來-5.00,會是什麼的結果呢?

其次,在每次迭代中返回i的值不是必須的。

第三,我看到符號有問題,例如:x> 25,x> 10。如果你寫了x> 10,那麼如果剩下的硬幣是10呢?這是很容易解決這個問題壽:)

第四,如果你仔細想想,你不是真的需要寫代碼的最後一部分

while(x>1) 
{ 
x=x-1; 
i++; 

,因爲硬幣值是1,所以你可以將總共剩餘1個硬幣添加到總數(i + x)。

並嘗試書面方式代碼

x = x-1; 

等於在使用該功能拍攝adventage的風格

x -= 1; 

而且最後我想告訴你,有沒有解決這個問題的辦法任何時候(x> = 25,x> = 10,...),只要通過求和,分割(考慮類型的int屬性)和模操作。

此外,我希望你不要放棄在這門課程中,一旦你學到東西,這是充滿挑戰但很有趣的,就像某種雪球。

祝你好運!

0

正如JPG所提到的,它沒有給你任何輸出的原因是因爲每當你使用return語句時,它立即嘗試退出當前活動的函數。當這個功能是主要的,這意味着程序本身將嘗試退出。

你的想法是試圖用剩餘價值做一些事情是在正確的軌道上,這是你需要做的,但是你需要以不同的方式去做。您可能可以使用除法,但我建議查看mod(%)運算符。它會更清潔。

另外,您的循環存在流動問題。嵌套循環通過每個級別的工作。爲了滿足你的期望,每個循環都需要處於同一水平。您將很快運行嵌套循環,理解邏輯流程非常重要。

這實際上是我第一次見到這種嘗試,說實話很有意思!如果你刪除了我的回報,你實際上會得到(不正確的)輸出。有更簡單的方法來獲得結果,但這種方式一旦修復邏輯錯誤就能正常工作。

1

你輸入後的第一件事 美圓用戶 你應該100之後是相乘將其轉換爲美分 和使用功能。 使用

change = round(change) ; 

在你的代碼 的變化是一個浮點值 但我們需要在整數的錢硬幣計數的數量用於 所以我們使用圓形改變成整型 當我們不能算使用的硬幣數使用浮點值

則: 的return i ; 聲明不應該在每次循環 使用 從每個循環中刪除。

因爲,如果您在每個lopp 中使用它,它會計算這些特定的硬幣 ,然後將退出程序。 因此,刪除所有這些return i陳述 並且您可以在 printf("%d\n", i);陳述後編寫return 0 ;