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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.02.2012, 14:00   #1
stdio
Форумчанин
 
Аватар для stdio
 
Регистрация: 14.02.2012
Сообщений: 105
Вопрос Консольный колькулятор.

Написал вот такой калькулятор. но он выдаёт ошибку при введении данные в неправильной форме и переходит в бесконечный вывод данных и забирает процессор на 100%

P.S Не обращайте внимание на грамматические ошибки в комментариях кода не до этого было.


Код:
#include <iostream>

using namespace std;

int main()
{    
	 //================================================================================================//
	// ВСТУПЛЕНИЕ (Русский язык,Ввод переменных,Инстркуция Пользывателю,Ожидание ввода и сбор данных) //
   //================================================================================================//
	setlocale(LC_CTYPE,"Russian");
	float a;
	float b;
	float r;
	char z;
	char restart;
	
	do
	{	
	cout << "============\n";
	cout << "ИНСТРУКЦИЯ:" << endl; 
	cout << "============\n";
	cout << endl;
	cout << endl;
	cout << "Введите последовательно [ЧИСЛО][ВЫРОЖЕНИЯ][ЧИСЛО] и нажмите <Enter>" << endl;
	cout << "Допустимые ВЫРОЖЕНИЯ('+'_Плюс,'-'_Минус,'*'_Умножить,'/'_Разделить)"<< endl;
	cout << endl;
	cout << endl;
	cout << "ПРИМЕР:" << endl;
	cout << "2+2" << endl;
	cout << "===============================================================================" << endl;
	cout << endl;
	cout << "ВВОДИТЕ" << endl;
	cout << "-------" << endl;
	cin >> a >> z >> b;
	

	 //=================================//
	// Обработка полученной информации //
   //=================================//
	switch (z)
		
	{
	case '+':
		r=a+b;
		break;
	case '-':
		r=a-b;
		break;
	case '*':
		r=a*b;
		break;
	case '/':
		r=a/b;
		break;
	default:
		cout << "Вы ввели данный неправильно!!!" << endl;
		cout << "Прочитайте правила ещё раз" << endl;
		return(0);
		break;

	
	} //switch
	 //==============//
	// ВЫВОД ДАННЫХ //
   //==============//
	cout << "------------------------------------" << endl;
	cout << "РЕЗУЛЬТАТ:\n" << a << z << b << "=" << r << endl ;
	cout << "------------------------------------" << endl;
	 //====================//
	// ВЫХОД ИЗ ПРОГРАММЫ //
   //====================//
	
	cout << "Продолжить?(Y/N)..." << endl;
	cout << "Для ПРОДОЛЖЕНИЯ нажмите Y и затем Enter" << endl;
	cout << "Для ВЫХОДА нажмите N и затем Enter" << endl;
	cin >> restart ;
	}//do
	while(restart == 'y' || 'Y');
		
}//int main

Последний раз редактировалось Stilet; 29.02.2012 в 22:09.
stdio вне форума Ответить с цитированием
Старый 29.02.2012, 16:37   #2
Kamilius
Пользователь
 
Регистрация: 28.02.2012
Сообщений: 23
По умолчанию

На сколько я помню, по крайней мере, мне так говорил преподаватель, нет защиты от ввода данных неверного типа. Я так же задавал этот вопрос, если я правильно тебя понял.
Kamilius вне форума Ответить с цитированием
Старый 29.02.2012, 19:54   #3
stdio
Форумчанин
 
Аватар для stdio
 
Регистрация: 14.02.2012
Сообщений: 105
По умолчанию

мне кажется просто неудачная конструкция цикла do while
stdio вне форума Ответить с цитированием
Старый 29.02.2012, 21:43   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Дело в том, что если пользователь ввёл бурду, то std::cin фиксит баг, и начинает ломаццо, ака девочка. И что бы вразумить его (да и пользователя заодно), надобно один почистить, другого попросить не вводить шмурдюки всякие. А сделать это можно
очень просто:

Код:
#include <iostream>

using namespace std;

// Внимательно смотрим сюда:

template<class tType> tType InputValue()
{ 
	tType val;
	do 
	{
		std::cin.clear(); fflush(stdin);  //чистим поток после шмурдюка
                std::cin >> val;
		if(!std::cin) { std::cout<<"введите корректное число\n"; }
	} while (!std::cin ); //заставляем пользователя вводить заново, 
                                   //если он ввёл шмурдюк
	return val;
}
//////////////////
int main()
{    
     //================================================================================================//
    // ВСТУПЛЕНИЕ (Русский язык,Ввод переменных,Инстркуция Пользывателю,Ожидание ввода и сбор данных) //
   //================================================================================================//
    setlocale(LC_CTYPE,"Russian");
    float a;
    float b;
    float r;
    char z;
    char restart;
    
    do
    {    
    cout << "============\n";
    cout << "ИНСТРУКЦИЯ:" << endl; 
    cout << "============\n";
    cout << endl;
    cout << endl;
    cout << "Введите последовательно [ЧИСЛО][ВЫРОЖЕНИЯ][ЧИСЛО] и нажмите <Enter>" << endl;
    cout << "Допустимые ВЫРОЖЕНИЯ('+'_Плюс,'-'_Минус,'*'_Умножить,'/'_Разделить)"<< endl;
    cout << endl;
    cout << endl;
    cout << "ПРИМЕР:" << endl;
    cout << "2+2" << endl;
    cout << "===============================================================================" << endl;
    cout << endl;
    cout << "ВВОДИТЕ" << endl;
    cout << "-------" << endl;
    
    a=InputValue<float>(); //пользователь должен будет ввести дробное число
    z=InputValue<float>(); //пользователь должен будет ввести дробное число
    b=InputValue<float>(); //пользователь должен будет ввести дробное число

//    cin >> a >> z >> b;
    

     //=================================//
    // Обработка полученной информации //
   //=================================//
    switch (z)
        
    {
    case '+':
        r=a+b;
        break;
    case '-':
        r=a-b;
        break;
    case '*':
        r=a*b;
        break;
    case '/':
        r=a/b;
        break;
    default:
        cout << "Вы ввели данный неправильно!!!" << endl;
        cout << "Прочитайте правила ещё раз" << endl;
        return(0);
        break;

    
    } //switch
     //==============//
    // ВЫВОД ДАННЫХ //
   //==============//
    cout << "------------------------------------" << endl;
    cout << "РЕЗУЛЬТАТ:\n" << a << z << b << "=" << r << endl ;
    cout << "------------------------------------" << endl;
     //====================//
    // ВЫХОД ИЗ ПРОГРАММЫ //
   //====================//
    
    cout << "Продолжить?(Y/N)..." << endl;
    cout << "Для ПРОДОЛЖЕНИЯ нажмите Y и затем Enter" << endl;
    cout << "Для ВЫХОДА нажмите N и затем Enter" << endl;
    cin >> restart ;
    }//do
    while(restart == 'y' || 'Y');
        
}//int main
_Bers вне форума Ответить с цитированием
Старый 29.02.2012, 21:56   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

вот так ещё красивее:
Код:
template<class tType> void InputValue(tType& val)
{ 
	do {  std::cin.clear(); fflush(stdin);  std::cin >> val;
		    if(!std::cin) { std::cout<<"введите корректное число\n"; }
	   } while (!std::cin );
}

int main(){   float val; InputValue(val); }
_Bers вне форума Ответить с цитированием
Старый 01.03.2012, 13:46   #6
stdio
Форумчанин
 
Аватар для stdio
 
Регистрация: 14.02.2012
Сообщений: 105
По умолчанию

что то я не понял как это теперь должно работать(
stdio вне форума Ответить с цитированием
Старый 01.03.2012, 20:49   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от stdio Посмотреть сообщение
что то я не понял как это теперь должно работать(
Точно так же, как и твой собственный код. Я просто добавил проверку, что std::cin не поломался. И если поломался - что бы почистился, и снова заработал. Бизнес-логика программулички не изменилась)
_Bers вне форума Ответить с цитированием
Старый 01.03.2012, 22:04   #8
stdio
Форумчанин
 
Аватар для stdio
 
Регистрация: 14.02.2012
Сообщений: 105
По умолчанию

у меня так почему не работает, вроде всё так же сделал


Код:
#include <iostream>

using namespace std;


template<class tType> void InputValue(tType& val)
{ 
	do {  std::cin.clear(); fflush(stdin);  std::cin >> val;
		    if(!std::cin) { std::cout<<"введите корректное число\n"; }
	   } while (!std::cin );
}

int main()
{    
	 //================================================================================================//
	// ВСТУПЛЕНИЕ (Русский язык,Ввод переменных,Инстркуция Пользывателю,Ожидание ввода и сбор данных) //
   //================================================================================================//
	setlocale(LC_CTYPE,"Russian");
	float a;
	float b;
	float r;
	char z;
	char restart;
	
	do
	{	
	cout << "============\n";
	cout << "ИНСТРУКЦИЯ:" << endl; 
	cout << "============\n";
	cout << endl;
	cout << endl;
	cout << "Введите последовательно [ЧИСЛО][ВЫРОЖЕНИЯ][ЧИСЛО] и нажмите <Enter>" << endl;
	cout << "Допустимые ВЫРОЖЕНИЯ('+'_Плюс,'-'_Минус,'*'_Умножить,'/'_Разделить)"<< endl;
	cout << endl;
	cout << endl;
	cout << "ПРИМЕР:" << endl;
	cout << "2+2" << endl;
	cout << "===============================================================================" << endl;
	cout << endl;
	cout << "ВВОДИТЕ" << endl;
	cout << "-------" << endl;

	
    float val; InputValue(val);
	float val; InputValue(val);
	float val; InputValue(val);
     

	//cin >> a >> z >> b;
	

	 //=================================//
	// Обработка полученной информации //
   //=================================//
	switch (z)
		
	{
	case '+':
		r=a+b;
		break;
	case '-':
		r=a-b;
		break;
	case '*':
		r=a*b;
		break;
	case '/':
		r=a/b;
		break;
	default:
		cout << "Вы ввели данный неправильно!!!" << endl;
		cout << "Прочитайте правила ещё раз" << endl;
		return(0);
		break;

	
	} //switch
	 //==============//
	// ВЫВОД ДАННЫХ //
   //==============//
	cout << "------------------------------------" << endl;
	cout << "РЕЗУЛЬТАТ:\n" << a << z << b << "=" << r << endl ;
	cout << "------------------------------------" << endl;
	 //====================//
	// ВЫХОД ИЗ ПРОГРАММЫ //
   //====================//
	
	cout << "Продолжить?(Y/N)..." << endl;
	cout << "Для ПРОДОЛЖЕНИЯ нажмите Y и затем Enter" << endl;
	cout << "Для ВЫХОДА нажмите N и затем Enter" << endl;
	cin >> restart ;
	}//do
	while(restart == 'y' || 'Y');
		
}//int main
stdio вне форума Ответить с цитированием
Старый 01.03.2012, 23:03   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Нууу....

Код:
        float val; InputValue(val);
	float val; InputValue(val);
	float val; InputValue(val);
Переопределение? Видишь? переменная val объявляется три раза подряд. К твоему коду она вообще никакого отношения не имеет. Это была просто иллюстрация идеи.
Я поторопился))

Ну вот рабочий код:

Код:
                                                                              //проверка, что пользователь ввел 
template<class tType> void InputValue(tType& val)         //корректные значения с клавиатуры 
{  do {  std::cin.clear(); fflush(stdin);  std::cin >> val;     
    if(!std::cin) { std::cout<<"введите корректное число\n"; }  } while (!std::cin ); }

using namespace std;

int main()
{    
    //================================================================================================//
    // ВСТУПЛЕНИЕ (Русский язык,Ввод переменных,Инстркуция Пользывателю,Ожидание ввода и сбор данных) //
    //================================================================================================//
    setlocale(LC_CTYPE,"Russian");   float a, b, r;   char z, restart;
    do
    {	
        cout << "============\n"
                 << "ИНСТРУКЦИЯ:" 
                 << "\n============\n\n\n"
                 << "Введите последовательно [ЧИСЛО][ВЫРОЖЕНИЯ][ЧИСЛО] и нажмите <Enter>\n"
                 << "Допустимые ВЫРОЖЕНИЯ('+'_Плюс,'-'_Минус,'*'_Умножить,'/'_Разделить)\n\n\n"
                 << "ПРИМЕР: 2+2\n"
                 << "===============================================================================\n\n"
                 << "ВВОДИТЕ\n"
                 << "-------" << endl;

        InputValue(a);     InputValue(z);      InputValue(b);

        switch (z)                                        //=================================//
        {                                                                 // Обработка полученной информации //
            case '+': { r=a+b; break; }          //=================================//
            case '-':  { r=a-b;  break; }
            case '*':  { r=a*b;  break; }
            case '/':  { r=a/b;  break; }
            default: {   cout << "Вы ввели данный неправильно!!!\nПрочитайте правила ещё раз\n";    return(0);    break; }
        } //switch

        cout << "------------------------------------\n"             //==============//
                 << "РЕЗУЛЬТАТ:\n" << a << z << b << "=" << r       //ВЫВОД ДАННЫХ //
                 << "\n------------------------------------\n";       //==============//

        cout << "Продолжить?(Y/N)...\n"                                         //====================//
                 << "Для ПРОДОЛЖЕНИЯ нажмите Y и затем Enter\n"     // ВЫХОД ИЗ ПРОГРАММЫ  //
                 << "Для ВЫХОДА нажмите N и затем Enter\n";             //====================//
        cin >> restart ;
    }  while(restart == 'y' || 'Y');
}//int main

Последний раз редактировалось _Bers; 01.03.2012 в 23:09.
_Bers вне форума Ответить с цитированием
Старый 01.03.2012, 23:10   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

теги разъезжаются на местном форуме) Но не суть))
_Bers вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
колькулятор fedot_sterlec Помощь студентам 2 30.05.2011 17:30
Консольный калькулятор 999Corp999 Помощь студентам 2 17.01.2011 17:17
Консольный архиватор Alex Cones Софт 12 14.04.2010 12:53
Консольный сервер на C++ Builder BleStaR C++ Builder 3 20.01.2010 20:16
TCP-server (консольный) SirToxa Работа с сетью в Delphi 8 02.03.2008 13:26