2015-09-06 6 views
1

Мой код предназначен для отображения наименьшего количества монет, которые нужны человеку за определенную сумму денег. Я преобразовал значение в центы, а затем использовал циклы, чтобы проверить каждую монету. Вы можете увидеть printf для переменных, которые я использовал для тестирования, чтобы увидеть, где это происходит. Петли просто продолжаются вечно и не вычитают значение С столько раз, сколько цикл повторяется. ех. c-25 остается на 475 центов, а не уменьшается на 25 каждый раз, когда цикл повторяется (для значения $ 5,00).Почему циклы в моей программе не заканчиваются?

#include <stdio.h> 
#include <cs50.h> 
#include <math.h> 

int main(void) 
{ 
float c=0; 
int i=0; 
int y=0; 

    printf("How much change do you owe?\n"); 
    c=GetFloat(); 
    c=c*100; 
    printf("%f\n", c); 
    do 
    { 
     c-25; 
     printf("%d\n", c-25); 
     if (c>25) 
     { 
      i++; 
      printf("%d\n", i); 
     } 
    } 
     while (c>=25); 
    printf("%d\n", i); 

    do 
    { 
     y=c-10; 
     if (y>0) 
     { 
      i++; 
     } 
    } 
     while (y>10); 
    if (y<=10) 
    { 
     printf("%d\n", i); 
    } 
    do 
    { 
     y=c-5; 
     if (y>0) 
     { 
      i++; 
     } 
    } 
     while (y>5); 
    if (y<=5) 
    { 
     printf("%d\n", i); 
    } 
    do 
    { 
     y=c-1; 
     if (y>0) 
     { 
      i++; 
     } 
    } 
     while (y>1); 
    if (y==0) 
    { 
     printf("%d\n", i); 
    } 
} 

Примечание: Это для программы "Время перемен" в CS50

+0

** Не используйте 'float', если вам нужны точные значения! ** – Olaf

ответ

4

c никогда не изменяется.

Там нет никакого эффекта на заявление:

c-25; 

, который, вероятно, следует:

c = c - 25; 

или

c -= 25; 
1

Вот некоторые замечания по вашему коду:

#include <stdio.h> 
#include <cs50.h> 
#include <math.h> 

int main(void){ 
// use self-explanatory and meaningful names of your variables 
float c = 0; 
int i = 0; 
int y = 0; 

// input 
printf("How much change do you owe?\n"); 
c = GetFloat(); 
c = c * 100; 
// print input 
printf("%f\n", c); 

// add comment explaining the purpose of this loop 
do{ 
    c = c - 25; // corrected to decrement by 25 

    printf("%d\n", c); 
    if (c > 25){ 
     i++; 
     printf("%d\n", i); 
    } 
}while(c >= 25); 

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

// add comment explaining the purpose of this loop 
do{ 
    y = c - 10; 
    if (y > 0){ 
     i++; 
    } 
}while(y > 10); 

// add comment explaining the purpose of this condition statement 
if (y <= 10){ 
    printf("%d\n", i); 
} 

// add comment explaining the purpose of this loop 
do{ 
    y = c-5; 
    if (y > 0){ 
     i++; 
    } 
}while(y > 5); 

// add comment explaining the purpose of this condition statement 
if (y <= 5){ 
    printf("%d\n", i); 
} 

// add comment explaining the purpose of this condition statement 
do{ 
    y = c-1; 
    if (y > 0){ 
     i++; 
    } 
}while(y > 1); 
// add comment explaining the purpose of this condition statement 
if(y == 0){ 
    printf("%d\n", i); 
} 
} 

Основные проблемы возникают из условий прекращения и переменных счетчика инкрементации/декрементирование, которые неправильно или отсутствуют, и что приводят к бесконечной петле.