| 
| 
 | Вопрос # 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): Задача выполнена. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |