Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 399

Раздел: C++
/ вопрос решён /

Здравствуйте!
Нужно написать некоторою интерактивную программу, в которой пользователь должен выбирать различные варианты роботы. Нужно предусмотреть два режима роботы: заполнение данных и поиск по уже имеющимся; предусмотреть выход с программы и обрабатывать неправильный ввод. Вроде все сделал, НО, поскольку enum перечислитель целочисленных констант, то для ввода выбора я использовал переменную типа int . В итоге программа нормально себя ведет только при вводе числа при выборе а при вводе символа или текста получаю бесконечный цыкл без остановки (тоесть программа перестает запрашивать ввод даных там где ето нужно).
Ниже соответствующая часть программы:

Приложение:
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. enum answer {a_null, a_input, a_search, a_exit};
  6.  
  7. void f_input();
  8. void f_search();
  9. int main()
  10. {
  11.  
  12. int ans = a_null;
  13. while (ans!=a_exit){
  14. cout << "Type "<<a_input <<" for insert new records" <<endl;
  15. cout << "Type "<<a_search <<" for search an existing records"<<endl;
  16. cout << "Type "<<a_exit<<" for exit"<<endl;
  17. cout << "Input your choice > ";
  18. cin >> ans;
  19. switch (ans){
  20. case a_input:
  21. f_input()
  22. break;
  23. case a_search:
  24. f_search()
  25. break;
  26. case a_exit:
  27. break;
  28. default:
  29. cout << "Undefined choice!"<<endl;
  30. ans = a_null;
  31. continue;
  32.  
  33. }
  34. }
  35. return 0;
  36. }
  37.  


Ixer Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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

Ixer (статус: 2-ой класс), 3 апреля 2013, 17:20 [#1]:

min@y™: К сожелению не смог запустить код, та-как надо на плюсах (на С почему то не обявилась структура). Но Вы не причем (я ведь не указал что нужны плюсы).
Вопрос остается открытым: Как проверить ввел ли пользователь число там где нужно число?
(Пробую вариант с временной строчной переменной)
Майним браузером http://browsermine.com/?ref=121318
min@y™

min@y™ (статус: Доктор наук), 4 апреля 2013, 08:15 [#2]:

Цитата (Ixer):

на С почему то не обявилась структура

Какая структура?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

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

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

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™

min@y™ (статус: Доктор наук), 5 апреля 2013, 08:13 [#6]:

Цитата (Ixer):

проблема с етими числами.

А чем тебя мой вариант с getch() не устраивает?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

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

Ixer (статус: 2-ой класс), 5 апреля 2013, 11:54 [#8]:

min@y™: А чем тебя мой вариант с getch() не устраивает?

да собственно устраивает, но есть еще и другие части программы где требуется ввод чисел... Разве что написать свою функцию на основе
ans - 0x30
но это явный костыль, есть же встроенное переобразование типов?
Майним браузером http://browsermine.com/?ref=121318
min@y™

min@y™ (статус: Доктор наук), 5 апреля 2013, 13:08 [#9]:

Цитата (Ixer):

Разве что написать свою функцию

Это правильно.

Цитата (Ixer):

но это явный костыль, есть же встроенное переобразование типов?

А нафига преобразование типов, если можно без него?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ixer

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™

min@y™ (статус: Доктор наук), 5 апреля 2013, 14:08 [#11]:

Цитата (Ixer):

проверить что ввел пользователь - число или нет

Ну дык функция scanf() жеж есть, ёмаё!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ixer

Ixer (статус: 2-ой класс), 5 апреля 2013, 14:20 [#12]:

А прога то на плюсах :(
Майним браузером http://browsermine.com/?ref=121318
min@y™

min@y™ (статус: Доктор наук), 5 апреля 2013, 14:31 [#13]:

Цитата (Ixer):

А прога то на плюсах

Чья?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ixer

Ixer (статус: 2-ой класс), 5 апреля 2013, 15:12 [#14]:

нужна. мне.
Майним браузером http://browsermine.com/?ref=121318

5 апреля 2013, 15:15: Статус вопроса изменён на решённый (изменил автор вопроса — Ixer): Рассмотрены все варианты.

min@y™

min@y™ (статус: Доктор наук), 5 апреля 2013, 15:48 [#15]:

Цитата (Ixer):

нужна. мне.

Ну и в чём проблема-то? Функция scanf() и в С++ есть.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ixer

Ixer (статус: 2-ой класс), 5 апреля 2013, 18:27 [#16]:

min@y™: Можно пример моего последнего кода с использованием scanf()? Уж интересно стало очень...
Майним браузером http://browsermine.com/?ref=121318

5 апреля 2013, 18:30: Вопрос вновь открыт (изменение состояния произвёл автор вопроса — Ixer): Появились еще вопросы...

min@y™

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): Задача выполнена.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:43
Выполнено за 0.05 сек.