Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2012, 22:25   #11
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Если включить интуицию, и присмотреццо к тонкому намёку в посте #4,
то можно предположить, что нажатие ентер тоже попадает в буффер ввода.
И именно его считывает scanf("%c", &simbol);

Исходя из чего можно предложить вот такое лекарство:

Код:
#include <stdio.h>
#include <conio.h>

int main()
{     
    float  a, b, c;
    char simbol;
    printf("Vvedite 1-oe cislo : ");
    scanf("%f", &a);
    printf("Vvedite 2-oe cislo : ");
    scanf("%f", &b);
    printf("Vvedite arifmeticheskii simvol : ");
    
    fflush(stdin);         // <---  сбросим содержимое буффера ввода, что б там ничего не было. 
                           //И тогда нижеследующая инструкция вынудит устройство ввода ожидать новые данные
    scanf("%c", &simbol);  // <---  читает из буффера ввода 1 символ. 
    switch(simbol)
    {
    case '+' : c = a + b; break;
    case '-' : c = a - b; break;
    case '*' : c = a * b; break;
    case '/' : c = a / b; break;
    default  : c = 0; break;
    }
    printf("Resultat : %f \n", c);
    getch(); 
}
_Bers вне форума Ответить с цитированием
Старый 19.01.2012, 22:27   #12
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
Если бы вы внимательно прочли предыдущие сообщения, то легко и просто взяли бы это в толк
Понимаешь, вот взять к примеру приплюснутые потоки, у них такого идиотизма нет.

У меня нет перед глазами реализации scanf
А гадать, разглядывая чьи то намёки даже особого желания нету.

Если знаешь - скажи как есть, по человечески.

Гугл мне ни о чем таком конкретном не рассказал. А собственные домысли - это всего лишь домысли. Я хз, как оно там по настоящему работает.
_Bers вне форума Ответить с цитированием
Старый 19.01.2012, 22:29   #13
Alex-Kunfuman
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 20
По умолчанию

\\заботливо считывается символ перевода строки, введенный вами (ну Enter же нажимали после ввода числа "b", да?).\\ я это не совсем понял...всеравно спасибо.
кстати у меня такой вопрос еще есть...Мне нужно узнать, что подразумевается под "прямым методом" интерполяции...Думал,что это связано с интерполяционными формулами Ньютона..оказалось,что это другое..Вы можете что-нибудь подсказать?
Alex-Kunfuman вне форума Ответить с цитированием
Старый 19.01.2012, 22:37   #14
Alex-Kunfuman
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 20
По умолчанию

_Bers, получается, что буффер ввода был просто заполнен по-уши? в этом была проблема?
Alex-Kunfuman вне форума Ответить с цитированием
Старый 19.01.2012, 22:45   #15
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Alex-Kunfuman Посмотреть сообщение
_Bers, получается, что буффер ввода был просто заполнен по-уши? в этом была проблема?
scanf читает из файла. В твоём случае, файлом является "устройство ввода". Оно реагирует на нажатия клавиш. И у него есть так называемый буфер. Особое хранилище данных, из которого можно читать данные о нажатых клавишах (как из обычного файла)

Когда ты свои первые цыферки вводил, ты нажимал клавишу enter.
И видимо, код нажатых клавиш попадал в буффер ввода.

Потом, когда ты хотел прочитать 1 символ из буффера ввода, ты считывал этот самый символ клавиши enter

То есть, вместо того что бы ожидать нового нажатия клавиш, scanf сразу считывал из буфера 1 первый попавшийся символ, а ты соответственно ничего не вводил.

Я сделал сброс буффера перед тем как читать очередную клавишу, и все заработало.

Но это только мои домыслы. Например, не понятно, а почему такого глюка не было, когда ты второе число float с клавиатуры вводил?
_Bers вне форума Ответить с цитированием
Старый 19.01.2012, 22:57   #16
Alex-Kunfuman
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 20
По умолчанию

хз. можт просто переполнение было..
Alex-Kunfuman вне форума Ответить с цитированием
Старый 19.01.2012, 22:59   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Понимаешь, вот взять к примеру приплюснутые потоки, у них такого идиотизма нет.
чу это нету? есть там все, не спроста же cin.ignore применяют.
Цитата:
Когда ты свои первые цыферки вводил, ты нажимал клавишу enter.
И видимо, код нажатых клавиш попадал в буффер ввода.
попадает 13 и 10(от одной клавиши), но ввод заканчивается при попадании 13, а 10 остается на потом.
Цитата:
Но это только мои домыслы. Например, не понятно, а почему такого глюка не было, когда ты второе число float с клавиатуры вводил?
я посмотрел, глюк есть, но видимо scanf игнорировало его, а при спецификаторе %c не игнорирует.
Цитата:
хз. можт просто переполнение было..
какое переполнение?
вам говорят о символе с кодом 10, а вы про переполнение, буфер способен вместить достаточно данных.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.01.2012, 23:06   #18
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
чу это нету? есть там все, не спроста же cin.ignore применяют.

Впервые в жизни с таким сталкиваюсь.
К слову:

Код:
int main()
{
    float q,w; char c;
    
    std::cout<< "введите q: ";  std::cin >> q;
    std::cout<< "введите w: ";  std::cin >> w;
    std::cout<< "введите c: ";  std::cin >> c;
}
Проблем никаких не вызывает. И ведёт себя именно так, как и ожидается.

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
попадает 13 и 10(от одной клавиши), но ввод заканчивается при попадании 13, а 10 остается на потом.
я посмотрел, глюк есть, но видимо scanf игнорировало его, а при спецификаторе %c не игнорирует.
Эм... а у меня почему то светит, что ентер - эт вообще 8
А блииин вру вру.. 13 да)
В бакспейсом попутал

Последний раз редактировалось _Bers; 19.01.2012 в 23:09.
_Bers вне форума Ответить с цитированием
Старый 19.01.2012, 23:14   #19
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Проблем никаких не вызывает. И ведёт себя именно так, как и ожидается.
хм, видимо не всегда.
или это особенность std::getline.
не помню уже(уже почти месяц нет проектов с вводом консольным).
Цитата:
Эм... а у меня почему то светит, что ентер - эт вообще 8
Код:
#include <stdio.h>
#include <conio.h>


int main()
{     
    float  a, b, c;
    char simbol;
    printf("Vvedite 1-oe cislo : ");
    scanf("%f", &a);
	scanf("%c", &simbol);
	printf("%d",(int)simbol);
    printf("Vvedite 2-oe cislo : ");
    scanf("%f", &b);
	scanf("%c", &simbol);
	printf("%d",(int)simbol);
    printf("Vvedite arifmeticheskii simvol : ");
    
    fflush(stdin);         // <---  сбросим содержимое буффера ввода, что б там ничего не было. 
                           //И тогда нижеследующая инструкция вынудит устройство ввода ожидать новые данные
    scanf("%c", &simbol);  // <---  читает из буффера ввода 1 символ. 
    switch(simbol)
    {
    case '+' : c = a + b; break;
    case '-' : c = a - b; break;
    case '*' : c = a * b; break;
    case '/' : c = a / b; break;
    default  : c = 0; break;
    }
    printf("Resultat : %f \n", c);
    getch(); 
}
так выдает как положено.

а вы как тестили?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.01.2012, 23:19   #20
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
чу это нету?
Щас в пошаговой отладке глянул, как с этим делом у std::cin обстоит...

Код:
  bool __CLR_OR_THIS_CALL _Ipfx(bool _Noskip = false)
		{	// test stream state and skip whitespace as needed
		if (ios_base::good())
			{	// state okay, flush tied stream and skip whitespace
			if (_Myios::tie() != 0)
				_Myios::tie()->flush();  // <---- люди, которые  
                     

              //проектировали std::cin мало мало мазгой думали.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ оператор switch Pingvinenok_Lolo Помощь студентам 4 05.12.2011 23:11
оператор switch aank10 Общие вопросы C/C++ 3 01.06.2011 10:28
оператор выбора Switch Fornarina Общие вопросы C/C++ 1 31.10.2010 12:56
Оператор выбора switch(C++) michal3003 Помощь студентам 2 06.09.2010 02:05
Оператор switch. IgorArhangel Помощь студентам 4 16.01.2009 01:53