簡體   English   中英

C while循環計算利息

[英]C while loop to calculate interest

我希望我的程序使用while循環並執行此興趣計算。 我希望如果輸入-1作為principal的值,則循環結束。

我覺得我缺少了一些非常重要的東西,並且這不允許我的程序相應地運行。

該程序有時也會崩潰,而其他時間會運行,但永遠不會計算利息。

float interest;
float rate;
float principal;
int days;


while(principal !=-1)
{
        interest = principal * rate * days / 365;


    printf("%s""Enter loan principal (-1 to end):");
    scanf("%f", &principal);

    printf("%s""Enter interest rate:");
    scanf("%f", &rate);

    printf("%s""Enter term of the loan in days:");
    scanf("%d", &days);

    printf("The interest charge is $%.2f", interest);
}

您在這里有幾個經典的編程錯誤。 這個問題應該遷移到StackOverflow,但是在此之前,我將在此處提供答案。

在考慮給定代碼塊的行為時,請始終考慮“值是什么”。

在這種情況下,在第3行

 float principal

執行此操作后,存儲在變量主體中的值是多少? [簡單的答案:我們不知道。 我們將需要知道使用哪種編譯器類型,使用哪個版本以及使用哪個標志從此源創建可執行文件]

我們為什么不知道? 與之比較,

float principal = 0.0

現在我們可以清楚地說出什么是價值。

因此,鑒於我們不知道principal的初始值是多少,將其與-1進行比較會發生什么? 為此,我們需要了解如何在您的特定硬件平台上存儲浮點值和整數。 讓我們選擇-1的通用格式(如果我們用十六進制表示位)則對應於0xFFFF。 現在我們要將該值與principal的值進行比較……由於principal當前具有隨機/未知數據,這肯定不會等於……這是個好消息,因為我們將進入循環! 有時...當主體碰巧具有0xFFFF的位模式時

那么,當程序進入循環時,為什么會崩潰呢?
這與代碼中的語法錯誤有關,我認為代碼在編譯時會產生警告消息...

我只看一行,但是所有的printf語句都有相同的問題。

printf("%s""Enter loan principal (-1 to end):");

printf希望從根本上講一個參數來打印或兩個參數-第一個是如何打印第二個的格式。

在這種情況下,您只有一個字符串-編譯器已將兩個引用的項目混為一個printf ...的參數,該參數正在查看%s的格式說明符並期望第二個字符串...因此它需要一個堆棧中的隨機值,並使用它打印第二個字符串。 你應該有:

printf("%s", "Enter loan principal (-1 to end):");

修正這些錯誤,您的代碼即可正常運行。 如果為主體變量和其他變量提供良好的值,則它將正確運行。

在C和C ++中,變量通常沒有任何特定值,除非您為其分配一個值

  • C和C ++編程的關鍵部分是,除非您明確為其指定一個值,否則您聲明的大多數變量都不會分配值。 如果您沒有為變量指定值,則該變量中存在的初始值被稱為undefined ,這意味着它實際上可以是任何值。

  • 在大多數系統上,這可能只是為該變量保留的內存位置中的任何值,該值實際上是隨機的。

  • 結果,除非您為變量聲明一個已知值,否則您不能假定其具有某個已知值,例如0。 在您的情況下,您需要在聲明變量時對其進行初始化:

     float interest = 0.0f; float rate = 0.0f; float principal = 0.0f; int days = 0; 

    只有這樣,您才能依賴每個變量中存儲的有效值。

如果要退出中間循環,則應在適當的時間檢查退出條件

  • 如果您希望程序在用戶輸入-1作為主體時立即退出循環,則需要更改循環以在用戶輸入值后立即進行檢查。

  • 這意味着您需要將while的條件更改為true (這樣它就不會在循環迭代的開始或結束時退出),並在循環中添加條件break 不必檢查在循環的開始或結束。

雜項代碼錯誤

  • 您也不應計算出利息價值,直到您從用戶那里獲得了利息價值。 這意味着應將計算放在輸入提示之后,但在輸出結果之前。

  • 如果您的printf()語句僅打印靜態字符串,則無需指定要打印的字符串以外的任何內容。 提示的末尾也應該有一個空格,以便輸入不緊挨提示而沒有空格。

經過更正的代碼如下:

/* Declare and initialize all variables. */
float interest = 0.0f;
float rate = 0.0f;
float principal = 0.0f;
int days = 0;    

/* Don't check for any condition at the start of the loop, just run the loop. */
while(true)
{
    printf("Enter loan principal (-1 to end): ");
    scanf("%f", &principal);

    /* If principal is -1, exit from the loop now. */
    if(principal == -1.0f)
        break;

    printf("Enter interest rate: ");
    scanf("%f", &rate);

    printf("Enter term of the loan in days: ");
    scanf("%d", &days);

    /* Compute the interest charge once the input is read. */
    interest = principal * rate * days / 365;

    /* Display the result. */
    printf("The interest charge is $%.2f", interest);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM