Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.86
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
#1

Функция getch() - C++

18.02.2013, 19:14. Просмотров 4003. Ответов 6
Метки нет (Все метки)

Здравствуйте! Проблема следующая: в программе для получения значений от пользователя я использовал функцию getch(), вызов этой функции в main проходит замечательно, но вот в функции класса employee, add() функция getch(), работает некорректно. После ввода пользователем символа, программа ждет от пользователя нажатия enter, хотя такого с этой функцией быть не должно, на сколько я знаю. Помогите пожалуйста!
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
#include <windows.h>
#include <fstream>
#include <iostream>
#include <typeinfo>
#include <process.h>
#include <conio.h>
using namespace std;
 
//---------------------------------------------------------------------------
const int LEN = 32;
const int MAXEM = 100;
enum employee_type { tmanager, tscientist, tlaborer };
char buf[256];
//---------------------------------------------------------------------------
char* Rus ( const char* text )
{
 CharToOem ( text, buf );
 return buf;
}
//---------------------------------------------------------------------------
class employee
{
 private:
  char name[LEN];
  unsigned long number;
  static int n;
  static employee* arrap[];
 
 public:
  virtual void getdata()
  {
   cin.ignore(10, '\n');
   cout << Rus ( "\n Ââåäèòå ГґГ*ìèëèþ: " );
   cin >> name;
   cout << Rus ( "\n Ââåäèòå Г*îìåð: ");
   cin >> number;
  }
//---------------------------------------------------------------------------
  virtual void putdata()
  {
   cout << Rus("\n Г”Г*ìèëèÿ: "); cout << name;
   cout << Rus ("\n Íîìåð: "); cout << number;
  }
//---------------------------------------------------------------------------
  virtual employee_type get_type();
  static void add();
  static void display();
  static void read();
  static void write();
};
//---------------------------------------------------------------------------
int employee :: n;
employee* employee :: arrap[MAXEM];
//---------------------------------------------------------------------------
class manager : public employee
{
 private:
  char tittle[LEN];
  double dues;
 
 public:
  void getdata()
  {
   employee :: getdata ( );
   cout << Rus ( "\n Ââåäèòå ГІГЁГІГіГ«: " ); cin >> tittle;
   cout << Rus ( "\n Ââåäèòå Г*Г*ëîãè: "); cin >> dues;
  }
//---------------------------------------------------------------------------
  void putdata()
  {
   employee :: putdata( );
   cout << Rus("\n Г’ГЁГІГіГ«: "); cout << tittle;
   cout << Rus("\n ГЌГ*ëîãè ãîëüô-êëóáГ*: "); cout << dues;
  }
};
//---------------------------------------------------------------------------
class scientist : public employee
{
 private:
  int pubs;
 
 public:
  void getdata()
  {
   employee :: getdata ();
   cout << Rus("\n Ââåäèòå ÷èñëî ïóáëèêГ*öèé: "); cin >> pubs;
  }
//---------------------------------------------------------------------------
  void putdata()
  {
   employee :: putdata();
   cout << Rus ( "\n ×èñëî ïóáëèêГ*öèé: " ); cout << pubs;
  }
};
//---------------------------------------------------------------------------
class laborer : public employee
{
};
//---------------------------------------------------------------------------
  void employee :: add ( )
  {
   char ch;
   cout << Rus ( "\n Ââåäèòå: " );
   cout << Rus ( "\n 'm' äëÿ äîáГ*âëåГ*ГЁГї ìåГ*åäæåðГ* ");
   cout << Rus ( "\n 's' äëÿ äîáГ*âëåГ*ГЁГї ГіГ·ГҐГ*îãî " );
   cout << Rus ( "\n 'l' äëÿ äîáГ*âëåГ*ГЁГї Г°Г*áî÷åãî " );
   ch = getch(); // âîò Г®Г* ïðîáëåìГ*ûé getch()
 
   switch(ch)
   {
    case 'm': arrap[n] = new manager; break;
    case 's': arrap[n] = new scientist; break;
    case 'l': arrap[n] = new laborer; break;
    default: cout << Rus ( "\n ÍåèçâåñòГ*ûé ГІГЁГЇ Г°Г*áîòГ*ГЁГЄГ* \n" ); return;
   }
   arrap[n++]->getdata();
  }
//---------------------------------------------------------------------------
  void employee :: display ()
  {
   for(int j = 0; j < n; j++ )
   {
    cout << Rus( "\n ГђГ*áîòГ*ГЁГЄ: ") << ( j+1 );
    switch( arrap[j]->get_type() )
    {
     case tmanager: cout << Rus ( "\n Г’ГЁГЇ: ГЊГҐГ*åäæåð" ); break;
     case tscientist: cout << Rus ( "\n Г’ГЁГЇ: Ó÷åГ*ûé" ); break;
     case tlaborer: cout << Rus ("\n Г’ГЁГЇ: ГђГ*áî÷èé" ); break;
     default: cout <<Rus("\n ÍåèçâåñòûГ*Г© ГІГЁГЇ");
    }
    arrap[j]->putdata();
    cout << endl;
   }
  }
//---------------------------------------------------------------------------
  employee_type employee::get_type()
  {
   if( typeid(*this) == typeid(manager) )
   return tmanager;
   else if ( typeid(*this) == typeid(scientist) )
   return tscientist;
   else if ( typeid(*this) == typeid(laborer) )
   return tlaborer;
   else
    { cerr << Rus ( "\n ГЌГҐГЇГ°Г*âèëüГ*ûé ГІГЁГЇ Г°Г*áîòГ*ГЁГЄГ*"); exit(1); }
   return tmanager;
  }
//---------------------------------------------------------------------------
  void employee :: write()
  {
   int size;
   cout << Rus ( "\n Èäåò Г§Г*ГЇГЁГ±Гј " ); cout << n << Rus ("\n Г°Г*áîòГ*èêîâ.\n");
   ofstream ouf;
   employee_type etype;
   ouf.open("EMPLOY.DAT", ios::trunc|ios::binary);
   if(!ouf)
    { cout << Rus ( "\n ÍåâîçìîæГ*Г® îòêðûòü ГґГ*éë\n"); return; }
   for (int j = 0; j < n; j++ )
   {
    etype = arrap[j]->get_type();
    ouf.write((char*)&etype,sizeof(etype));
    system("PAUSE");
 
    switch(etype)
    {
     case tmanager: size = sizeof(manager); break;
     case tscientist: size = sizeof(scientist); break;
     case tlaborer: size = sizeof(laborer); break;
    }
    ouf.write( (char*)(arrap[j]), size );
    if(!ouf)
    { cout << Rus("\nГ‡Г*ГЇГЁГ±Гј Гў ГґГ*éë Г*åâîçìîæГ*Г*\n"); return; }
   }
  }
//---------------------------------------------------------------------------
  void employee :: read()
  {
   int size;
   employee_type etype;
   ifstream inf;
   inf.open("EMPLOY.DAT", ios::binary);
 
   if(!inf)
   { cout << Rus("\n ÍåâîçìîæГ*Г® îòêðûòü ГґГ*éë!"); return; }
   n = 0;
 
   while(true)
   {
    inf.read( (char*)&etype, sizeof(etype) );
    if( inf.eof() )
    break;
 
    if(!inf)
    { cout << Rus("\n ÍåâîçìîæГ*Г® Г·ГІГҐГ*ГЁГҐ ГІГЁГЇГ*\n"); return ;}
    switch(etype)
    {
     case tmanager:
      arrap[n] = new manager;
      size = sizeof(manager);
      break;
     case tscientist:
      arrap[n] = new scientist;
      size = sizeof(scientist);
      break;
     case tlaborer:
      arrap[n] = new laborer;
      size = sizeof(laborer);
      break;
     default: cout << Rus ( "\n ÍåèçâåñòГ*ûé ГІГЁГЇ Гў ГґГ*éëå\n"); return;
    }
    inf.read( (char*)arrap[n], size );
    if(!inf)
    { cout << Rus("\n Г—ГІГҐГ*ГЁГҐ Г¤Г*Г*Г*ûõ ГЁГ§ ГґГ*éëГ* Г*åâîçìîæГ*Г®\n"); return; }
    n++;
    }
   cout << Rus ( "\n Èäåò Г·ГІГҐГ*ГЁГҐ "); cout << n << Rus(" Г°Г*áîòГ*èêîâ\n");
  }
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
 char ch;
 while(true)
 {
  cout << Rus ("\n 'a' - äîáГ*âëåГ*ГЁГҐ Г¤Г*Г*Г*ûõ Г® Г°Г*áîòГ*ГЁГЄГҐ" );
  cout << Rus ( "\n 'd' - âûâåñòè ñâåäåГ*ГЁГї îáî ГўГ±ГҐГµ Г°Г*áîòГ*ГЁГЄГ*Гµ" );
  cout << Rus ( "\n 'w' - Г§Г*ГЇГЁГ±Г*ГІГј ГўГ±ГҐ Г¤Г*Г*Г*ûå Гў ГґГ*éë" );
  cout << Rus ( "\n 'r' - ïðî÷èòГ*ГІГј ГўГ±ГҐ Г¤Г*Г*Г*ûå ГЁГ§ ГґГ*éëГ*" );
  cout << Rus ( "\n 'x' - âûõîä \n" );
  ch = getch(); // ýòîò getch Г°Г*áîòГ*ГҐГІ Г*îðìГ*ëüГ*Г®
 switch(ch)
 {
  case 'a':
   employee :: add(); break;
  case 'd':
   employee:: display(); break;
  case 'w':
   employee :: write(); break;
  case 'r':
   employee :: read(); break;
  case 'x': exit(0);
  default: cout << Rus ( "\n ÍåèçâåñòГ*Г*Гї êîìГ*Г*Г¤Г*");
 }
 }
        return 0;
}
//---------------------------------------------------------------------------
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2013, 19:14     Функция getch()
Посмотрите здесь:

Не определяется функция getch - C++
Ошибку выдаёт getch(); //--------------------------------------------------------------------------- #pragma hdrstop ...

Как работает функция getch() и какая библиотека нужна? - C++
Ребят подскажите пожалуйста в C++ как работает функция getch() и какая библиотека нужна ?

getch - C++
Недавно начал изучать си++. Что-то написал, не знаю по какой причине не компилирует. Прошу помочь. Думаю проблема где-то в 12 строке. ...

getch() - C++
Здравствуйте, форумчане! написал программу, которая должна переводить миллион символов 16-го кода в двоичный, но столкнулся с...

getch() - C++
с помощью функции getch() узнал код клавиш... int n; n = getch(); cout &lt;&lt; n;

getch - C++
что озночает ввод синволов с помощю getch без буферизации

Не работает getch() - C++
Здравствуйте, решил написать первую серьезную программу ,в данном случае змейку, не получается ввести нажатие клавиши с клавиатуры.После...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
18.02.2013, 19:57     Функция getch() #2
Убери cin.ignore(10, '\n');
В нем проблема, а не в гетче

C++
1
2
3
4
5
6
7
8
virtual void getdata()
  {
   cin.ignore(10, '\n');
   cout << Rus ( "\n Введите фамилию: " );
   cin >> name;
   cout << Rus ( "\n Введите номер: ");
   cin >> number;
  }
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
18.02.2013, 20:36  [ТС]     Функция getch() #3
Спасибо конечно. Но можете пожалуйста объяснить почему?
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
18.02.2013, 20:49     Функция getch() #4
Признаться, до сих пор сижу копаюсь в этом. ignore не использовал ни разу сам. Если докопаюсь - дам знать))) Хотел спросить, с какой целью эта строка была вставлена на самом деле?)
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
18.02.2013, 21:42  [ТС]     Функция getch() #5
Я не знаю зачем эта функция нужна в принципе. Она была в исходном коде программы. Я лишь ее(программу) модифицировал слегка. Я так понимаю, что cin.ignore( 10, '\n' ); выбрасывает из входного потока 10 символов или пока не встретит '\n'. Я не понимаю для чего это может понадобиться и на кой черт вообще нужна эта функция. Что она делает, если употребить её без аргументов я тоже без понятия.
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
18.02.2013, 21:51     Функция getch() #6
Ну, вот, например, http://www.cplusplus.com/reference/i...stream/ignore/

Тут функция эта (в примере) используется, чтобы выдрать только инициалы при условии, что ты вводишь имя и отчество, как 2 слова, разделенных пробелом. Вообще, я ни разу не встречал её в работе/учёбе))) и самому не было надобности использовать. Впрочем, на форуме этом всего несколько дней, а видел, как люди в своих примерах юзают тут её часто. Хз, может это новый писк моды, тьфу, stream'ов))))) В твоей программе она не нужна, как мне кажется)

Вообще, в качестве лирического отступления, можно сказать, что библиотека потоков - целая кладезь неизвестных многим функциональностей))) Это похоже на фотошоп или 3D Max - никто (или большинство) не знает всех их функций, даже те, кто создавал ПО))))))))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.02.2013, 21:57     Функция getch()
Еще ссылки по теме:

аналог getch() - C++
Ребят getch меня не устраивает следующим: когда окно теряет фокус он не работает. как выйти из ситуации?

getch и TCHAR - C++
Встала следующая задача : 1) Недопустить ввод кол-ва символов &gt; 10 2) Заменить все символы на * (пароль) Всё это прекрасно...

getch() error - C++
Привет всем, такое дело, не работает getch()! Вот, что пишет: C:\Users\AKHURS\Desktop\tetris_start.cpp:122: implicit declaration...

Замена getch() - C++
Здравствуйте. Решил повысить переносимость своего кода и задался вопросом: на что заменить getch? Насколько я понимаю, эта функция...

Не работает getch() - C++
не работает задержка по getchar() #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;time.h&gt; #include &lt;cstdio&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
18.02.2013, 21:57  [ТС]     Функция getch() #7
Хех. Ну ПО такого уровня, как правило, в одно лицо не пишется. Так что, думаю, каждый кодер знает свой кусочек =) Спасибо за помощь.
Yandex
Объявления
18.02.2013, 21:57     Функция getch()
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru