Возникли проблемы с циклами do while в C - PullRequest
1 голос
/ 07 октября 2011

Я новичок в C и пишу основную программу, которая конвертирует доллары в евро. По какой-то причине программа не запускает эту строку: "scanf ("% c ", & yn);". Если я удаляю цикл do while, программа работает нормально.

Вместо того, чтобы останавливаться и ждать, пока пользователь введет 'y' или 'n', цикл перезапускается и снова запрашивает сумму в долларах США.

#include<stdio.h>

main()

{
    float usd = 0.00;
    float euro = 0.00;
    char yn;
    const float conversion = 0.75;

    do {
        /*get amount to convert*/
        printf("Please enter the amount of USD you want to convert to Euros: ");
        scanf("%f", &usd);

        /*convert amount*/
        euro = (usd * conversion);

        /*output results and ask to continue*/
        printf("\n%.2f USD equals %.2f Euros. Do you want to convert another amount? (y/n): ", usd, euro);
        scanf("%c", &yn);
        printf("\n");


        /*if yes, get new amount to convert. if no, program ends*/
    } while (yn = 'y');

    return 0;
}

Заранее спасибо.

Ответы [ 8 ]

4 голосов
/ 07 октября 2011

Ваш scanf выбирает новую строку из ранее прочитанного с плавающей точкой.Вы должны учитывать новую строку, scanf(" %c", &yn); должно работать. Даже если вы введете 'y' или 'n', оценка не будет выполнена, потому что вы присваиваете 'y' для yn, что всегда будет оцениваться как true,измените его на while( yn == 'y').

4 голосов
/ 07 октября 2011
do {
  // ...
} while( yn == 'y'); // At this statement you are making an assignment,
                     // not comparison. Use the equal to operator.
2 голосов
/ 07 октября 2011

Вы хотели сделать == в вашем while состоянии, а не один =, который всегда будет оцениваться правдиво.

2 голосов
/ 07 октября 2011

Вам нужно изменить yn = 'y' на yn == 'y'.В первом случае вы устанавливаете yn на 'y', в то время как вы хотите сравнить с 'y'.Для сравнения используется оператор ==.

1 голос
/ 07 октября 2011

Дайте пробел во втором скане перед %c, как это scanf(" %c", &yn);.

Также пройдите этот вопрос, очень похожий на вашу проблему:

Замечание странноеповедение со строками в c

Также, как отмечали другие:

while (yn = 'y'); будет (yn == 'y')

0 голосов
/ 07 октября 2011

Как уже отмечали другие, проблема в том, что вы случайно написали оператор присваивания вместо теста на равенство.Мы все это сделали.

Но, к сведению, как младший программист на Си, вы можете столкнуться с советом, предлагающим вам изменить порядок операндов в тесте на равенство (что приведет к ошибке компиляции, есливы делаете ту же ошибку), или #define EQUALS (или, по связанной теме, TRUE и FALSE).Это очень плохой совет.

Изменение порядка операндов затрудняет чтение кода, потому что вы на самом деле не хотите сравнивать константу с переменной, вы хотите сравнить переменную с константой.(Кроме того, это совсем не поможет, если вы сравниваете две переменные.) Использование #defines также загромождает код ненужной ерундой.В C нет логического типа данных, а в C есть операторы присваивания и равенства с одинаковыми именами.

Лучший совет - изучать язык, а не пытаться сделать так, чтобы он не выглядел так, как он.

0 голосов
/ 07 октября 2011

Вы, вероятно, заметили и поняли глупую ошибку, однако, это очень распространенная ошибка, и ее действительно сложно отследить, потому что операция присваивания всегда возвращает правильное значение присваивания. Есть два способа минимизировать вероятность такой ошибки. во-первых, использовать #define equals =. Другой два всегда заменяют порядок сравнения. поэтому yn == 'y' станет 'y' == yn. Таким образом, если по ошибке замените == на =, вы получите ошибку компиляции. Я не знаю ни одного человека, который бы не наткнулся на эту ошибку ...

0 голосов
/ 07 октября 2011

while (yn = 'y') должно быть while (yn == 'y')

...