2015-10-28 156 views
-1

我正在C程序工作,可以返回贷款支付。 yearInt是一年利息 loanAmt是贷款 总量monthlyPay是按月支付 numberPay每月支付程序,不返回任何东西

对于一些原因的号码,当我运行该程序,就什么也不显示,即使我在一个负型数。

有没有办法解决它?

#include <stdio.h> 
int main(void) 
{ 
float yearInt = -1; 
int loanAmt = -1; 
float monthlyPay = -1; 
int numberPay = -1; 
int count = 0; 

while (loanAmt<0) 
{ 
    printf("Please enter valid loan value: \n"); 
    scanf("%f", &loanAmt); 
} 

while (yearInt<0) 
{ 
    printf("Please enter valid yearly interest value: \n"); 
    scanf("%f", &yearInt) 
} 

while (monthlyPay<0) 
{ 
    printf("Please enter valid monthly payment value: \n"); 
    scanf("%f", &monthlyPay); 
} 

while (numberPay<0) 
{ 
    printf("Please enter valid number of monthly payments: \n"); 
    scanf("%f", &numberPay); 
} 

if(loanAmt>monthlyPay) 
{ 
    while(count<numberPay) 
    { 
     loanAmt = loanAmt*(1 + (yearInt/12)) - monthlyPay; 
     count += count+1; 
    } 
    printf("The amount of last payment is: %.2f\n", loanAmt); 
else 
    printf("The amount of last payment is: %.2f\n", loanAmt); 
} 
return 0; 
} 
+0

变量loanAmt声明为具有int类型,但在循环中使用格式说明符%f。至少将其更改为%d。 while(loanAmt <0) { printf(“请输入有效的贷款金额:\ n”); scanf(“%f”,&loanAmt); } –

+0

请编辑您的文章并包含编译(复制/粘贴)的_real_代码。也可以正确缩进。 – Lundin

回答

1
scanf("%f", &loanAmt);   // loanAmt is int 
... 
scanf("%f", &numberPay);  //numberPay is int 

在这两个错误的参数传递给%f,因此,导致UB。使用%d说明符。

而在这其中}缺失 -

if(loanAmt>monthlyPay) 
{ 
    while(count<numberPay) 
    { 
    loanAmt = loanAmt*(1 + (yearInt/12)) - monthlyPay; 
    count += count+1; 
    } 
    printf("The amount of last payment is: %.2f\n", loanAmt); //use %d 
    // ADD '}' here 
else // ADD '{' here 
    printf("The amount of last payment is: %.2f\n", loanAmt); //use %d 
} 

else {前放一个}

+0

谢谢!如果我使用%d,我仍然可以保留2个小数位吗? –

+2

@XinLi整数不能(更确切地说,它们没有_)以小数位表示。如果你想用小数来回答,你应该将这些变量声明为'float'或'double'。 – ameyCU

2

您使用了错误的格式说明阅读loanAmountnumberPay。而不是"%f",请使用"%d"

scanf("%d", &loanAmt); 

scanf("%d", &numberPay); 

此外,经常检查scanf返回值,以确保它能够将数据分配给所有的变量。

改变循环:

while (loanAmt<0) 
{ 
    printf("Please enter valid loan value: \n"); 
    scanf("%d", &loanAmt); 
} 

while (loanAmt<0) 
{ 
    printf("Please enter valid loan value: \n"); 
    if (scanf("%d", &loanAmt) != 1) 
    { 
     // Discard the rest of the line. 
     int c; 
     while ((c = fgetc(stdin)) = '\n' && c != EOF); 
    } 
} 

这将是最好还是把所有的检查,在功能和main调用该函数。

int readInt(char const* prompt) 
{ 
    int val = -1; 

    printf("%s\n", prompt); 
    while (scanf("%f", &val) != 1 || val < 0) 
    { 
     // Discard rest of the line. 
     int c; 
     while ((c = fgetc(stdin)) = '\n' && c != EOF); 

     // If EOF is reached, we have a problem. 
     if (c == EOF) 
     { 
     exit(0); 
     } 
     printf("%s\n", prompt); 
    } 

    return val; 
} 

,然后,使用:

loanAmount = readInt("Please enter valid loan value: "); 

加入类似的功能来读取float S和调用它的读取是float类型的变量。

+0

非常感谢您解决这个问题。解决这个问题之后,当我编译它时,它说“else之前的语法错误”。你知道发生了什么事吗? –

+0

@XinLi从'if'块丢失了大括号。 – Quentin

+1

建议使用'scanf()'的返回值来确定循环延续而不是'val <0' - else readInt()返回负数吗?角落案例失败:除非'scanf(“%d”,&val)'返回1,否则不要相信'val'的内容。理论上,'scanf()'可以返回'EOF'来表示输入错误,在这种情况下'val'是未定义的。 – chux