1

Тема: Проблема з використанням маски для символьного типу

Суть задачі в тому, що є два дроби, які описуються в структурному типі. І потім в залежності від знаку з ними треба зробити відповідні математичні дії, а результат подати у вигляді третього дробу того ж структурного типу. Я знаю, як це зробити, але я загруз на введенні символу дії. Підкажіть в чому проблема. Може треба якийсь інший модуль підключити? Чи я не правильно тип char використовую?

Весь код:

#include <cstdlib>
#include <iostream>

using namespace std;

struct TDrib
{
    int a;
    unsigned int b;
    unsigned int c;    
} X1, X2, X3;

void read_TDrib (TDrib &k)
{
    printf("Input a="); scanf("%d",&k.a);
    printf("Input b="); scanf("%d",&k.b);
    printf("Input c="); scanf("%d",&k.c);    
}

void write_TDrib (TDrib const &k)
{
    printf("%d %d/%d,\n",k.a,k.b,k.c); 
}

int main ()
{
    TDrib X1, X2, X3;
    printf("First fraction:\n");
    read_TDrib(X1);
    write_TDrib(X1);
    printf("Second fraction:\n");
    read_TDrib(X2);
    write_TDrib(X2);
    char op;
    printf("Input operation:"); scanf("%c",&op);
    system("PAUSE");
    return EXIT_SUCCESS;    
}

 

Конкретно момент, який не виконується.

    char op;
    printf("Input operation:"); scanf("%c",&op);

2 Востаннє редагувалося koala (12.06.2013 09:40:43)

Re: Проблема з використанням маски для символьного типу

1. Це C чи C++? В першому випадку що там роблять iostream і посилання, в другому - нащо ті printf-и, якщо тут сам Страуструп велів оператор >> перевизначати? Ні, я розумію, С++ добре ставиться до конструкцій С, але то у вас такий страшний суржик виходить, що йой...
2. Давайте змінним зрозумілі імена. Що воно таке a, b і c? integerPart, numerator і denominator, звісно, ви можете не знати (хоча в цілому знати англійську програмісту вкрай бажано); але хіба важко писати щось на кшталт tsil, chys, znam?
3. Ну й до вашої проблеми - вона полягає в тому, що scanf і operator >> для потоків беруть з вводу необхідний мінімум, а решту лишають. Тобто знак нового рядка в кінці вводу лишається в буфері вводу, і наступна операція знову його читає. Щоб цього не сталося, додайте

fflush(stdin); /*для C*/
cin.sync(); //для C++

перед викликом scanf - це почитстить буфер.

4 Ніколи, ніколи! не використовуйте system("pause") для паузи. Це гидотно. Можна так:

printf("Press ENTER to continue");
fflush(stdin);
getc();
або
cout << "Press ENTER to continue"
cin.sync();
cin.get();

якщо точно потрібна пауза; а ще краще - використовуйте середовище розробки, де в консольних програмах пауза додається автоматично (чи налаштовуйте своє оточення відповідним чином). Наприклад, Orwell Dev-C++ таке вміє.

Подякували: Yola, illia, Chemist-i3

3

Re: Проблема з використанням маски для символьного типу

Вставте     

printf("%d", (int)op);

після зчитування операції і ви побачите, що ви зчитали перехід на новий рядок.

4

Re: Проблема з використанням маски для символьного типу

koala написав:

1. Це C чи C++? В першому випадку що там роблять iostream і посилання, в другому - нащо ті printf-и, якщо тут сам Страуструп велів оператор >> перевизначати? Ні, я розумію, С++ добре ставиться до конструкцій С, але то у вас такий страшний суржик виходить, що йой...

Це С++. У нас не дуже хороший викладач в університеті. Роблю так, як він вчив.

koala написав:

Щоб цього не сталося, додайте
cin.sync(); //для C++
перед викликом scanf - це почитстить буфер.

Дякую! Це допомогло.

koala написав:

4 Ніколи, ніколи! не використовуйте system("pause") для паузи.

Це стандартний шаблон запису при створенні нового консольного проекту в середовищі Dev-C++

5

Re: Проблема з використанням маски для символьного типу

Це стандартний шаблон запису при створенні нового консольного проекту в середовищі Dev-C++

Шаблони редагуються.
system("pause") - справді не найліпший варіант тут. Можна взяти getch(). Можна cin.get(). Можна навіть зроверити і використати kbhit(). :)