[英]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 ++編程的關鍵部分是,除非您明確為其指定一個值,否則您聲明的大多數變量都不會分配值。 如果您沒有為變量指定值,則該變量中存在的初始值被稱為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.