Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/35: Рейтинг темы: голосов - 35, средняя оценка - 4.77
9 / 9 / 7
Регистрация: 23.11.2012
Сообщений: 94
1

Функция getch()

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

Author24 — интернет-сервис помощи студентам
Здравствуйте! Проблема следующая: в программе для получения значений от пользователя я использовал функцию 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;
}
//---------------------------------------------------------------------------
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.02.2013, 19:14
Ответы с готовыми решениями:

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

Функция getch. Необходимо исправить ошибку
Программа, содержащая динамическую информацию о наличии автобусов в автобусном парке. Все должно...

Аналог getch или русские буквы в getch
Здравствуйте, уважаемые господа. Существуют ли какие-нибудь аналоги getch () и _getch, которые...

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

6
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
18.02.2013, 19:57 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;
  }
1
9 / 9 / 7
Регистрация: 23.11.2012
Сообщений: 94
18.02.2013, 20:36  [ТС] 3
Спасибо конечно. Но можете пожалуйста объяснить почему?
0
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
18.02.2013, 20:49 4
Признаться, до сих пор сижу копаюсь в этом. ignore не использовал ни разу сам. Если докопаюсь - дам знать))) Хотел спросить, с какой целью эта строка была вставлена на самом деле?)
0
9 / 9 / 7
Регистрация: 23.11.2012
Сообщений: 94
18.02.2013, 21:42  [ТС] 5
Я не знаю зачем эта функция нужна в принципе. Она была в исходном коде программы. Я лишь ее(программу) модифицировал слегка. Я так понимаю, что cin.ignore( 10, '\n' ); выбрасывает из входного потока 10 символов или пока не встретит '\n'. Я не понимаю для чего это может понадобиться и на кой черт вообще нужна эта функция. Что она делает, если употребить её без аргументов я тоже без понятия.
0
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
18.02.2013, 21:51 6
Ну, вот, например, http://www.cplusplus.com/refer... am/ignore/

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

Вообще, в качестве лирического отступления, можно сказать, что библиотека потоков - целая кладезь неизвестных многим функциональностей))) Это похоже на фотошоп или 3D Max - никто (или большинство) не знает всех их функций, даже те, кто создавал ПО))))))))
0
9 / 9 / 7
Регистрация: 23.11.2012
Сообщений: 94
18.02.2013, 21:57  [ТС] 7
Хех. Ну ПО такого уровня, как правило, в одно лицо не пишется. Так что, думаю, каждый кодер знает свой кусочек =) Спасибо за помощь.
0
18.02.2013, 21:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.02.2013, 21:57
Помогаю со студенческими работами здесь

Ошибка: "error C2660: getch: функция не принимает 1 аргументов"
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; void main() {int i, n, x, fact, znak,...

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru