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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2021, 21:47   #1
Nutochka
Новичок
Джуниор
 
Регистрация: 31.03.2021
Сообщений: 1
По умолчанию Проверка вводимых данных

Всем привет!
Написала программу в с++, преподаватель развернул ее, не устроила проверка.
Код:
void Person::Input() 
{ 
	int _Number;
	char _Name[100];
	bool _Gender;
	double _Age;

	char str[50];
	bool test = false;
	while (test == false)        //проверяем ввод номера
	{
		test = true;
		std::cout << "Imput number: ";
		std::cin >> str;
		for (int i = 0; i < strlen(str); i++)
			if ((str[i] < '0') || (str[i] > '9')) test = false;
		if (test) _Number = atoi(str);
		else std::cout << "Invalid number!" << std::endl;
	}
	test = false;
	while (test == false)        //проверяем ввод ФИО
	{
		test = true;
		std::cout << "Imput FIO: ";
		std::cin.ignore();
		std::cin.getline(str, sizeof(str));    
		for (int i = 0; i < strlen(str); i++)
			if ((str[i] < 'a') || (str[i] > 'z'))
				if ((str[i] < 'A') || (str[i] > 'Z')) 
					if (str[i] != '.')
						if (str[i] != ' ') test = false;
		if (test) strcpy(_Name, str);
		else std::cout << "Invalid FIO!" << std::endl;
	}
	test = false;
	while (test == false)        //проверяем ввод половой принадлежности
	{
		std::cout << "Imput gender (0-man, 1-woman): ";
		std::cin >> str;
		if (str[0] == '0') { _Gender = false; test = true; }
		if (str[0] == '1') { _Gender = true; test = true; }
		if (!test) std::cout << "Invalid gender!" << std::endl;
	}
	test = false;
	while (test == false)        //проверяем ввод возраста
	{
		test = true;
		std::cout << "Imput age: ";
		std::cin >> str;
		for (int i = 0; i < strlen(str); i++)
			if ((str[i] < '0') || (str[i] > '9'))
				if (str[i] != '.') test = false;
		if (test) _Age = atof(str);
		else std::cout << "Invalid age!" << std::endl;
	}
		setNumber(_Number);
		setName(_Name);
		setGender(_Gender);
		setAge(_Age);
}
Замечание от преподавателя:
"Сделайте проверку вводимых пользователем данных. К примеру, возраст не может быть отрицательным и пр. Если пользователь вводит не верно, ввод должен быть повторён до тех пор, пока не будет введено верное значение.
Исправлено не совсем верно.
Здесь в условиях циклов while (или do-while) в Input используйте проверки, которые должны быть реализованы в методах записи (сделайте, чтобы они возвращали true или false, в зависимости от того, можно ли записать введённое пользователем значение в поле данных)."
Исправила программу, сделала прямой ввод, но ни как не разберусь как осуществить нормальную проверку, ибо у меня выходит только какая-то не правильная (при вводе букв в номер происходит зацикливание, фио читает любой символ, пол при неверном вводе просто сразу выводится результат и программа завершается, ну а возраст также происходит зацикливание при вводе буквы). Информации перерыла много, голова чугунная, ничего уже понять не могу, очень прошу помощи.
Код:
int Person::getNumber() const
{
	return _Number;
}

bool Person::setNumber(int Number)
{
	if (Number > 0)
	{
		this->_Number = Number;
		return true;
	}
	else return false;
}

const char* Person::getName() const
{
	return _Name;
}
bool Person::setName(const char* Name)
{
	for (int i = 0; i < strlen(Name); i++)
		if ((Name[i] >= 'A') || (Name[i] <= 'z'))
	{
	delete[] this->_Name;
	this->_Name = strcpy(new char[strlen(Name) + 1], Name);
	return true;
	}
	else return false;
}

bool Person::getGender() const
{
	return _Gender;
}
bool Person::setGender(bool Gender)
{
	if (Gender == 0 || Gender == 1)
	{
		this->_Gender = Gender;
		return true;
	}
	else return false;
}

double Person::getAge() const
{
	return _Age;
}
bool Person::setAge(double Age)
{
	if (Age > 0.0)
	{
	this->_Age = Age;
	return true;
	}
	else return false;
}

void Person::Input()
{
	int _Number;
	char _Name[100];
	bool _Gender;
	double _Age;

	do
		{
			std::cout << "Imput number: ";
			std::cin >> _Number;
		} 
	while (!setNumber(_Number));
	do
		{
			std::cout << "Imput FIO: ";
			std::cin >> _Name;
		} 
	while (!setName(_Name));

	do
		{
			std::cout << "Imput gender (0-man, 1-woman): ";
			std::cin >> _Gender;
		} 
	while (!setGender(_Gender));

	do
		{
			std::cout << "Imput age: ";
			std::cin >> _Age;
		} 
	while (!setAge(_Age));

		setNumber(_Number);
		setName(_Name);
		setGender(_Gender);
		setAge(_Age);
}
Nutochka вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка типа вводимых данных Death-woolf Общие вопросы C/C++ 2 15.05.2014 23:53
Си. Проверка вводимых значений. veter48 Общие вопросы C/C++ 8 13.10.2011 19:08
проверка вводимых значений Saken_ Общие вопросы Delphi 8 18.10.2010 10:57
Проверка типа вводимых данных ROD Общие вопросы C/C++ 3 19.09.2009 20:22
проверка вводимых значений nik1905 Microsoft Office Excel 7 26.08.2009 17:06