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

Функция getch()

18.02.2013, 19:14. Показов 6590. Ответов 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;
}
//---------------------------------------------------------------------------
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.02.2013, 19:14
Ответы с готовыми решениями:

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

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

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

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

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

Вообще, в качестве лирического отступления, можно сказать, что библиотека потоков - целая кладезь неизвестных многим функциональностей))) Это похоже на фотошоп или 3D Max - никто (или большинство) не знает всех их функций, даже те, кто создавал ПО))))))))
0
9 / 9 / 7
Регистрация: 23.11.2012
Сообщений: 94
18.02.2013, 21:57  [ТС]
Хех. Ну ПО такого уровня, как правило, в одно лицо не пишется. Так что, думаю, каждый кодер знает свой кусочек =) Спасибо за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.02.2013, 21:57
Помогаю со студенческими работами здесь

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

Ошибка: "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, y; printf (&quot;VVedite n&quot;); ...

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK сделайте это, JDK, то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Перейдите по ссылке:. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru