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

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

Войти
Регистрация
Восстановить пароль
 
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
#1

Реализация Поиска В Файле - C++

19.02.2013, 00:37. Просмотров 458. Ответов 2
Метки нет (Все метки)

Здравствуйте! В книге Лафоре по ООП на С++ есть задача, реализовать в программе приведенной в главе ( ее я собственно привожу ниже, правда уже в измененном виде, она отличается от данного в учебнике образца лишь методом findEmp(); ) Программа вроде бы и рабочая, но все же думается мне, что я сделал не совсем не то, что хотел от меня автор книги.

Текст задачи:
К программе EMPL_IO из этой главы добавьте возможность поиска работника в списке, хранящемся в файле, по номеру. При нахождении совпадения нужно вывести данные об этом работнике на экран. Пользователь должен иметь возможность запустить функцию поиска нажатием клавиши 'f'. У пользователя спрашивается номер работника. Подумайте над вопросом, какой должна быть эта функция - статической, виртуальной или какой - то еще? Поиск и вывод на экран не должны пересекаться с данными в памяти.

Не пытайтесь прочитать файл, созданный программой EMPL_IO. Классы в программах разные благодаря методу find() ( не совсем понял, что имел в виду автор. Этого метода в программе нет ) в новой программе, и проблемы, которые могут возникнуть в случае, если их данные смешаются, уже обсуждались в этой главе. Вам может понадобиться подключить параметр RTTI в компиляторе.

Код:

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
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
//---------------------------------------------------------------------------
 
#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()
  {
   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 findEmp ( );
  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' äëÿ äîáГ*âëåГ*ГЁГї Г°Г*áî÷åãî \n" );
   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));
 
 
    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");
  }
//---------------------------------------------------------------------------
void employee :: findEmp ()
{
 unsigned int en = 0;
 ifstream f1;
  int size;
  employee_type etype;
  employee* e1;
 f1.open("EMPLOY.DAT", ios::binary);
 cout << Rus ( "\n Ââåäèòå Г*îìåð Г°Г*áîòГ*ГЁГЄГ*: " );
 cin >> en;
 while(true)
 {
  f1.read( (char*)&etype, sizeof(etype) );
    if( f1.eof() )
    { cout <<  Rus("\n ГђГ*áîòГ*ГЁГЄ Г*ГҐ Г*Г*éäåГ* " ); break; }
 
    if(!f1)
    { cout << Rus("\n ÍåâîçìîæГ*Г® Г·ГІГҐГ*ГЁГҐ ГІГЁГЇГ*\n"); return ;}
    switch(etype)
    {
     case tmanager:
      e1 = new manager;
      size = sizeof(manager);
      break;
     case tscientist:
      e1 = new scientist;
      size = sizeof(scientist);
      break;
     case tlaborer:
      e1 = new laborer;
      size = sizeof(laborer);
      break;
     default: cout << Rus ( "\n ÍåèçâåñòГ*ûé ГІГЁГЇ Гў ГґГ*éëå\n"); return;
    }
    f1.read( (char*)e1, size );
 
    if( e1->number == en )
    {
     cout << Rus ( "\n ГђГ*áîòГ*ГЁГЄ Г*Г*éäåГ*! \n" );
 
     switch( e1->get_type() )
    {
     case tmanager: cout << Rus ( "\n Г’ГЁГЇ: ГЊГҐГ*åäæåð" ); break;
     case tscientist: cout << Rus ( "\n Г’ГЁГЇ: Ó÷åГ*ûé" ); break;
     case tlaborer: cout << Rus ("\n Г’ГЁГЇ: ГђГ*áî÷èé" ); break;
     default: cout <<Rus("\n ÍåèçâåñòûГ*Г© ГІГЁГЇ");
    }
    e1->putdata();
    break;
    }
 
    if(!f1)
    { cout << Rus("\n Г—ГІГҐГ*ГЁГҐ Г¤Г*Г*Г*ûõ ГЁГ§ ГґГ*éëГ* Г*åâîçìîæГ*Г®\n"); return; }
  }
    }
//---------------------------------------------------------------------------
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 'f' - äëÿ ïîèñêГ* Г°Г*áîòГ*ГЁГЄГ* ГЇГ® Г*îìåðó" );
  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 'f':
   employee :: findEmp(); break;
  case 'x': exit(0);
  default: cout << Rus ( "\n ÍåèçâåñòГ*Г*Гї êîìГ*Г*Г¤Г*");
 }
 }
        return 0;
}
//---------------------------------------------------------------------------
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2013, 00:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Реализация Поиска В Файле (C++):

реализация поиска нужного имени в файле и вывод данных, относящихся к этому имени - C++
Доброго времени суток всем! Прошу помощи у более компитентных людей нежели я. Полное задание выглядит так: Разработать программу,...

Поиска в записанном ранее файле по фамилии или по группе с выбором параметра поиска - C++
Нужно написать код для поиска в записанном ранее файле по фамилии или по группе с выбором параметра поиска. Помогите пожайлуйста, потому...

Реализация дерева поиска - C++
Мне крайне срочно необходимо реализовать дерево поиска на с++(чтобы пользователь сам вводил значения), я и сам конечно пытался сделать это,...

Реализация бинарного поиска - C++
Здравствуйте. Решил реализовать на С++ бинарный поиск. Вместо массива я взял vector (думаю особой роли это не играет), все бы хорошо, НО....

Реализация поиска в глубину - C++
Всем привет. Решил начать учить теорию графов, решаю задачки на одном сайте. Столкнулся с задачкой в которой просто нужно реализовать поиск...

Реализация бинарного дерева поиска - C++
Задача: Реализация бинарного дерева поиска Компилируется нормально, а при запуске выбивает ошибку : &quot;Необработанное исключение по адресу...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
19.02.2013, 00:44 #2
Цитата Сообщение от fuzzytoozy Посмотреть сообщение
C++
1
enum employee_type { tmanager, tscientist, tlaborer };
и последующие выборы switch с этим связанные.
Очень сомневаюсь, что они нужны. Наследование для того и существует, чтобы не приходилось в switch перебирать каждый раз варианты действий. ВСЕ действия должны быть перегружены в потомках. Статические замени на нестатические методы в классе и перегрузи их для потомков.
И вообще, для пользователя, интерфейс класса с которым он работает следует делать как можно более общим и абстрактным, даже не стоит давать ему узнать вот это
C++
1
virtual employee_type get_type();
0
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
19.02.2013, 01:10  [ТС] #3
Kuzia domovenok, спасибо конечно, но вопрос то был не в этом, это не моя программа, мне лишь нужно добавить поиск и только. Вот мне и кажется, что поиск добавил я не тем путем, которым хотел автор. А усовершенствовать её, разумеется, можно множеством способов. Я бы не использовал enum здесь в принципе. Думаю автор использовал его для наглядности кода. Ведь программа написана в образовательных целях, а не в каких - либо еще.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2013, 01:10
Привет! Вот еще темы с ответами:

Реализация поиска мостов на графе - C++
Подскажите, в чем проблема. Вроде весь код написан верно, но ничего не считает в итоге. У меня есть неориентированный граф, который я задаю...

Реализация бинарного дерева поиска - C++
Не выводит значения узлов деревьев, как я понял происходит утечка памяти, но я не пойму, что нужно сделать. Программа ошибку не выдаёт....

Алгоритм прямого поиска. Реализация на С++ - C++
может кто-то написать алгоритм прямого поиска на С++? очень надо... суть поиска такова: Алгоритм прямого поиска Идея...

Реализация словаря в двоичном дереве поиска - C++
Ребят очень нужно, хотя бы реализацию словаря в C++ ,никак не могу найти


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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