2015-10-28 3 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

Вы используете неправильный спецификатор формата для чтения loanAmount и numberPay. Вместо "%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 с и называем его для чтения переменных, которые имеют типа float.

+0

Большое спасибо, чтобы исправить это. После исправления этого, когда я скомпилирую его, он говорит «синтаксическая ошибка перед« else ». Вы знаете, что происходит? –

+0

@XinLi отсутствует скобка из блока 'if'. – Quentin

+1

Предложите использовать возвращаемое значение 'scanf()' для определения продолжения цикла, а не 'val <0' - иначе как' readInt() 'возвращает отрицательные числа? Ошибка корневого регистра: если 'scanf ("% d ", & val)' возвращает 1, не доверяйте содержимому 'val'.Теоретически 'scanf()' может возвращать 'EOF' для обозначения входной ошибки, и в этом случае' val' не определено. – chux

Смежные вопросы