|
Вопрос # 6 399/ вопрос решён / |
|
Здравствуйте!
Нужно написать некоторою интерактивную программу, в которой пользователь должен выбирать различные варианты роботы. Нужно предусмотреть два режима роботы: заполнение данных и поиск по уже имеющимся; предусмотреть выход с программы и обрабатывать неправильный ввод. Вроде все сделал, НО, поскольку enum перечислитель целочисленных констант, то для ввода выбора я использовал переменную типа int . В итоге программа нормально себя ведет только при вводе числа при выборе а при вводе символа или текста получаю бесконечный цыкл без остановки (тоесть программа перестает запрашивать ввод даных там где ето нужно).
Ниже соответствующая часть программы:
Приложение: Переключить в обычный режим- #include <iostream>
-
- using namespace std;
-
- enum answer {a_null, a_input, a_search, a_exit};
-
- void f_input();
- void f_search();
- int main()
- {
-
- int ans = a_null;
- while (ans!=a_exit){
- cout << "Type "<<a_input <<" for insert new records"
<<endl;
- cout << "Type "<<a_search <<" for search an existing
records"<<endl;
- cout << "Type "<<a_exit<<" for exit"<<endl;
- cout << "Input your choice > ";
- cin >> ans;
- switch (ans){
- case a_input:
- f_input()
- break;
- case a_search:
- f_search()
- break;
- case a_exit:
- break;
- default:
- cout << "Undefined choice!"<<endl;
- ans = a_null;
- continue;
-
- }
- }
- return 0;
- }
-
 |
Вопрос задал: Ixer (статус: 2-ой класс)
Вопрос отправлен: 30 марта 2013, 00:54
Состояние вопроса: решён, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
Попробуй так:
#define a_input 1
#define a_search 2
#define a_exit 3
int main()
{
char ans;
do
{
printf("Type %d for insert new records\n"
"Type %d for search an existing records\n"
"Type %d for exit\n"
"Input your choice > ", a_input, a_search, a_exit);
ans = getch();
switch (ans - 0x30) // 0x30 - ASCII-код символа "0"
{
case a_input: f_input(); break
case a_search: f_search(); break;
case a_exit: return 0; // a не break, т.к. здесь break прерывает switch а не цикл!
default: printf("Undefined choice!\n");
} // switch
} while (true); // do
}
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 1 апреля 2013, 08:35
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 17; последнее сообщение — 8 апреля 2013, 08:11; участников в обсуждении: 2.
|
Ixer (статус: 2-ой класс), 3 апреля 2013, 17:20 [#1]:
min@y™: К сожелению не смог запустить код, та-как надо на плюсах (на С почему то не обявилась структура). Но Вы не причем (я ведь не указал что нужны плюсы).
Вопрос остается открытым: Как проверить ввел ли пользователь число там где нужно число?
(Пробую вариант с временной строчной переменной)
Майним браузером http://browsermine.com/?ref=121318
|
|
min@y™ (статус: Доктор наук), 4 апреля 2013, 08:15 [#2]:
Цитата (Ixer):
на С почему то не обявилась структура
Какая структура?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 4 апреля 2013, 08:29 [#3]:
Я ответ писал на коленке, не отлаживал. Это, ведь, только пример с идеей. Но, раз такое дело, щас я его отладил в DevCpp: создал консольный С-проект (не С++, а именно С). Всё заработало, как надо после лёгкой доработки напильником.
#include <stdio.h>
#include <stdlib.h>
#define a_input 1
#define a_search 2
#define a_exit 3
void f_input(void)
{
printf("Function 'f_input' selected.\n");
}
void f_search(void)
{
printf("Function 'f_search' selected.\n");
}
int main(int argc, char *argv[])
{
char ans;
do
{
printf("\n\nType %d for insert new records\n"
"Type %d for search an existing records\n"
"Type %d for exit\n"
"Input your choice > ", a_input, a_search, a_exit);
ans = getch();
switch (ans - 0x30) // 0x30 - ASCII-код символа "0"
{
case a_input: f_input(); break;
case a_search: f_search(); break;
case a_exit: return 0; // a не break, т.к. здесь break прерывает switch а не цикл!
default: printf("Undefined choice!\n");
} // switch
} while (1); // do
}
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ixer (статус: 2-ой класс), 4 апреля 2013, 17:34 [#4]:
min@y™:
вот структура:
const int PrArrSize = 7;
struct prade{
char[255] tovar;
char[255] mag;
int stoim;
};
prade baza[PrArrSize];
ругается ругается на последнюю строчку, типа prade непонятный тип даных (в плюсах все то же работает, хотя в плюсах я решил юзнуть std::string).
Вся суть задачи в том, чтобы заполнять масив (длина масива 7 елементов) даными и выполнять поиск по полю mag (либо выводить что ничего не найдено)
Майним браузером http://browsermine.com/?ref=121318
|
|
Ixer (статус: 2-ой класс), 4 апреля 2013, 17:57 [#5]:
Я бы и сам все в плюсах написал, но вот проблема с етими числами. Если int a;
cin >> a;
то нужно вводить только числа. Если ввести символ (НЕ ЧИСЛО) то все последуючие запросы на ввод даных игнорируются а программа быстро бежыт к завершению, а поскольку в приведенном выше примере бесконечный цыкл, то программа не завершается вообще.
Вот основная цель вопроса. Нужно как-то проверить ввел ли пользователь число, а уж потом продолжыть работу.
Самый простой костыль, который пришел ко мне в голову:
int a;
char temp[255]
a = strtointdef(temp,0)
if (a==0) {cout << "Введите число!"};
Вопрос где взять такую же как в делфи функцыю strtointdef?
Майним браузером http://browsermine.com/?ref=121318
|
|
min@y™ (статус: Доктор наук), 5 апреля 2013, 08:13 [#6]:
Цитата (Ixer):
проблема с етими числами.
А чем тебя мой вариант с getch() не устраивает?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 5 апреля 2013, 08:19 [#7]:
Цитата (Ixer):
ругается ругается на последнюю строчку, типа prade непонятный тип даных
У меня вот так компилится:
#define PrArrSize 7
typedef struct
{
char tovar[255];
char mag[255];
int stoim;
} prade;
prade baza[PrArrSize];
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ixer (статус: 2-ой класс), 5 апреля 2013, 11:54 [#8]:
min@y™: А чем тебя мой вариант с getch() не устраивает?
да собственно устраивает, но есть еще и другие части программы где требуется ввод чисел... Разве что написать свою функцию на основе ans - 0x30 но это явный костыль, есть же встроенное переобразование типов?
Майним браузером http://browsermine.com/?ref=121318
|
|
min@y™ (статус: Доктор наук), 5 апреля 2013, 13:08 [#9]:
Цитата (Ixer):
Разве что написать свою функцию
Это правильно.
Цитата (Ixer):
но это явный костыль, есть же встроенное переобразование типов?
А нафига преобразование типов, если можно без него?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ixer (статус: 2-ой класс), 5 апреля 2013, 13:54 [#10]:
min@y™: Суть вопроса в том что нужно проверить что ввел пользователь - число или нет. Если число - ввести его в нужную в этот момент переменную. Если нет, то затребовать повторный ввод.
Вот, решил вроде:
char temp[5];
for (int i = 0;i<PrArrSize;i++){
cout << "Cell " << i+1 << ":" << endl;
cout << "Tovar > ";
cin >> baza[i].tovar;
cout << "Mag > ";
cin >> baza[i].mag;
cout << "Stoim > ";
cin >> temp;
while (atoi(temp)<1){
cout << "Incorrect input! Please repeat!" << endl;
cin >> temp;
}
baza[i].stoim = atoi(temp);
Майним браузером http://browsermine.com/?ref=121318
|
|
min@y™ (статус: Доктор наук), 5 апреля 2013, 14:08 [#11]:
Цитата (Ixer):
проверить что ввел пользователь - число или нет
Ну дык функция scanf() жеж есть, ёмаё!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ixer (статус: 2-ой класс), 5 апреля 2013, 14:20 [#12]:
А прога то на плюсах
Майним браузером http://browsermine.com/?ref=121318
|
|
min@y™ (статус: Доктор наук), 5 апреля 2013, 14:31 [#13]:
Цитата (Ixer):
А прога то на плюсах
Чья?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ixer (статус: 2-ой класс), 5 апреля 2013, 15:12 [#14]:
нужна. мне.
Майним браузером http://browsermine.com/?ref=121318
|
5 апреля 2013, 15:15: Статус вопроса изменён на решённый (изменил автор вопроса — Ixer): Рассмотрены все варианты.
|
min@y™ (статус: Доктор наук), 5 апреля 2013, 15:48 [#15]:
Цитата (Ixer):
нужна. мне.
Ну и в чём проблема-то? Функция scanf() и в С++ есть.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ixer (статус: 2-ой класс), 5 апреля 2013, 18:27 [#16]:
min@y™: Можно пример моего последнего кода с использованием scanf()? Уж интересно стало очень...
Майним браузером http://browsermine.com/?ref=121318
|
5 апреля 2013, 18:30: Вопрос вновь открыт (изменение состояния произвёл автор вопроса — Ixer): Появились еще вопросы...
|
min@y™ (статус: Доктор наук), 8 апреля 2013, 08:11 [#17]:
Цитата (Ixer):
Можно пример моего последнего кода с использованием scanf()? Уж интересно стало очень...
Ну, примерно так:
do
{
Count = scanf("%d", &baza[i].stoim);
if (!Count) printf("Incorrect input! Please repeat!");
} while (!Count);
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
10 апреля 2013, 13:04: Статус вопроса изменён на решённый (изменил автор вопроса — Ixer): Задача выполнена.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|