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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.10.2015, 12:26   #1
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
Вопрос Как защитить переменную int от записи в неё символа

Есть следующий код:
Код:
#include <iostream>
using namespace std;

int main()
{
	setlocale(LC_ALL, "rus");

	int answer = 0; // будет хранить выбор пользователя
	bool var = true; // управляющая переменная цикла do while

	cout << "Введите номер станции метро, для расчета времени в пути (от 1 до 5): ";

	do{
		cin >> answer; // ввод значения
		cin.clear();

		switch (answer) // switch принимает переменную answer и ищет подходящий case
		{
		case 1:  // если answer равно 1, на экран выйдут сообщения этого case
			cout << "Станция метро Trinitat Nova: ";
			cout << "Время в пути - 15 мин." << endl;
			break; // выход из switch. иначе будет переход case(2)  и т.д.
		case 2: // если answer равно 2
			cout << "Станция метро Casa de l’Aigua: ";
			cout << "Время в пути - 19 мин." << endl;
			break;
		case 3:
			cout << "Станция метро Torre Baro Vallbona: ";
			cout << "Время в пути - 25 мин." << endl;
			break;
		case 4:
			cout << "Станция метро Ciutat Meridiana: ";
			cout << "Время в пути - 30 мин." << endl;
			break;
		case 5:
			cout << "Станция метро Can Cuias: ";
			cout << "Время в пути - 38 мин." << endl;
			break;
		default: // если ни один case не сработал, сработает default
			cout << "Станции под номером " << answer << " нет! ";
			cout << "Сделайте правильный выбор (от 1 до 5): ";
		}
		// если введено правильное значение (от 1 до 5)
		// default не сработает и выполнится блок if
		// переменная var примет значение false
		// и цикл do while не повторится
		if (answer >= 1 && answer <= 5)
			var = false;
	} while (var); //цикл повторится, пока var не изменит значение на false
	system("pause");
	return 0;
}
С цифрами это работает, а как быть с буквами или символами? Дабы исключить случайное нажатие. А то тоже выводит бесконечно станции под номером … нет и т.д.
marenko.lilia вне форума Ответить с цитированием
Старый 01.10.2015, 13:07   #2
Gekan
Пользователь
 
Регистрация: 29.06.2012
Сообщений: 39
По умолчанию

Да вот как-то так можно.

Код:
#include <iostream>
using namespace std;

int main()
{
	setlocale(LC_ALL, "rus");

	int answer = 0; // будет хранить выбор пользователя
	bool var = true; // управляющая переменная цикла do while
	do
	{
		do 
		{
		cout << "Введите номер станции метро, для расчета времени в пути (от 1 до 5): ";
		cin.clear();
		cin.sync();
		cin>> answer;
		} while ( cin.fail() );
		/*
		do{
		cin >> answer; // ввод значения
		cin.clear();
		} while (answer >= 1 && answer <= 5);
		*/
		switch (answer) // switch принимает переменную answer и ищет подходящий case
		{
		case 1:  // если answer равно 1, на экран выйдут сообщения этого case
			cout << "Станция метро Trinitat Nova: ";
			cout << "Время в пути - 15 мин." << endl;
			break; // выход из switch. иначе будет переход case(2)  и т.д.
		case 2: // если answer равно 2
			cout << "Станция метро Casa de l’Aigua: ";
			cout << "Время в пути - 19 мин." << endl;
			break;
		case 3:
			cout << "Станция метро Torre Baro Vallbona: ";
			cout << "Время в пути - 25 мин." << endl;
			break;
		case 4:
			cout << "Станция метро Ciutat Meridiana: ";
			cout << "Время в пути - 30 мин." << endl;
			break;
		case 5:
			cout << "Станция метро Can Cuias: ";
			cout << "Время в пути - 38 мин." << endl;
			break;
		default: // если ни один case не сработал, сработает default
			cout << "Станции под номером " << answer << " нет!\n";
			//cout << "Сделайте правильный выбор (от 1 до 5): ";
		}
		// если введено правильное значение (от 1 до 5)
		// default не сработает и выполнится блок if
		// переменная var примет значение false
		// и цикл do while не повторится
		if (answer >= 1 && answer <= 5)
			var = false;
	} while (var); //цикл повторится, пока var не изменит значение на false
	system("pause");
	return 0;
}
Gekan вне форума Ответить с цитированием
Старый 01.10.2015, 13:34   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как защитить переменную int от записи в неё символа
Я бы воспользовался такой функцией: http://www.cplusplus.com/reference/string/stoi/
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.10.2015, 13:38   #4
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию

Спасибо!

Только расскажите, пожалуйста, что делают cin.sync(); и cin.fail()

Цитата:
Сообщение от Stilet Посмотреть сообщение
Я бы воспользовался такой функцией: http://www.cplusplus.com/reference/string/stoi/
Как бы ты ней воспользовался? )

Последний раз редактировалось Stilet; 01.10.2015 в 14:22.
marenko.lilia вне форума Ответить с цитированием
Старый 01.10.2015, 14:33   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Лягко и невозмутимо:
Код:
// stoi.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <string>
#include <iostream>

using namespace std;

bool TryStrToInt(string s,int &i){
	size_t e;
 try{
	 i=stoi(s,&e);
	 return e==s.length();
 } catch(invalid_argument& ia) {
	return false;
 }
}

int _tmain(int argc, _TCHAR* argv[])
{
	string s;
	int i;
	for(getline(cin,s);!TryStrToInt(s,i);getline(cin,s)) cout<<"Oah shit..."<<endl; 
	cout<<"ok:"<<i;
	cin.get();
	return 0;
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как преобразовать символ string в переменную int-типа Dima-91 C++ Builder 4 16.10.2015 16:56
Regular expression - найти последнюю точку и три символа после неё Enfiol C# (си шарп) 5 28.04.2012 08:58
Как считать int-овское число из файла в переменную? (Си) farewe11 Помощь студентам 5 31.05.2010 19:46
Как защитить записи от изменений??access2003. ww01031977 Microsoft Office Access 1 21.04.2010 17:17
Как получить текст из Edit в переменную INT nimbler Win Api 4 05.11.2009 22:45