С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
1

Код из "Р.Лафоре. ООП в С++"

07.10.2013, 21:02. Показов 3394. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Р.Лафоре. "ООП в С++ " (4-е издание). 2012. Глава 12, стр.574, листинг 12.17, программа EMPL_IO.
В классах присутствуют виртуальные методы и используются бинарные методы чтения\записи памяти под объектами. Кто что думает по поводу этого кода?
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
// empl_io.cpp
// performs file I/O on employee objects
// handles different sized objects
#include <fstream>            //for file-stream functions
#include <iostream>
#include <typeinfo>           //for typeid()
using namespace std;
#include <process.h>          //for exit()
 
const int LEN = 32;           //maximum length of last names
const int MAXEM = 100;        //maximum number of employees
 
enum employee_type {tmanager, tscientist, tlaborer};
////////////////////////////////////////////////////////////////
class employee                //employee class
   {
   private:
      char name[LEN];         //employee name
      unsigned long number;   //employee number
      static int n;           //current number of employees
      static employee* arrap[];  //array of ptrs to emps
   public:
      virtual void getdata()
         {
         cin.ignore(10, '\n');
         cout << "   Enter last name: "; cin >> name;
         cout << "   Enter number: ";      cin >> number;
         }
      virtual void putdata()
         {
         cout << "\n   Name: " << name;
         cout << "\n   Number: " << number;
         }
      virtual employee_type get_type();  //get type
      static void add();      //add an employee
      static void display();  //display all employees
      static void read();     //read from disk file
      static void write();    //write to disk file
   };
//--------------------------------------------------------------
//static variables
int employee::n;              //current number of employees
employee* employee::arrap[MAXEM];  //array of ptrs to emps
////////////////////////////////////////////////////////////////
//manager class
class manager : public employee
   {
   private:
      char title[LEN];        //"vice-president" etc.
      double dues;            //golf club dues
   public:
      void getdata()
         {
         employee::getdata();
         cout << "   Enter title: ";          cin >> title;
         cout << "   Enter golf club dues: "; cin >> dues;
         }
      void putdata()
         {
         employee::putdata();
         cout << "\n   Title: " << title;
         cout << "\n   Golf club dues: " << dues;
         }
   };
////////////////////////////////////////////////////////////////
//scientist class
class scientist : public employee
   {
   private:
      int pubs;               //number of publications
   public:
      void getdata()
         {
         employee::getdata();
         cout << "   Enter number of pubs: "; cin >> pubs;
         }
      void putdata()
         {
         employee::putdata();
         cout << "\n   Number of publications: " << pubs;
         }
   };
////////////////////////////////////////////////////////////////   
//laborer class
class laborer : public employee
   {
   };
////////////////////////////////////////////////////////////////
//add employee to list in memory
void employee::add()
   {
   char ch;
   cout << "'m' to add a manager"
           "\n's' to add a scientist"
           "\n'l' to add a laborer"
           "\nEnter selection: ";
   cin >> ch;
   switch(ch)
      {                       //create specified employee type
      case 'm': arrap[n] = new manager;   break;
      case 's': arrap[n] = new scientist; break;
      case 'l': arrap[n] = new laborer;   break;
      default: cout << "\nUnknown employee type\n"; return;
      }
   arrap[n++]->getdata();     //get employee data from user
   }
//--------------------------------------------------------------
//display all employees
void employee::display()
   {
   for(int j=0; j<n; j++)
      {
      cout  << (j+1);           //display number
      switch( arrap[j]->get_type() )   //display type
         {
         case tmanager:    cout << ". Type: Manager";   break;
         case tscientist:  cout << ". Type: Scientist"; break;
         case tlaborer:    cout << ". Type: Laborer";   break;
         default: cout << ". Unknown type";
         }
      arrap[j]->putdata();    //display employee data
      cout << endl;
      }
   }
//--------------------------------------------------------------
//return the type of this object
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 << "\nBad employee type"; exit(1); }
   return tmanager;
   }
//--------------------------------------------------------------
//write all current memory objects to file
void employee::write()
   {
   int size;
   cout << "Writing " << n << " employees.\n";
   ofstream ouf;              //open ofstream in binary
   employee_type etype;       //type of each employee object
 
   ouf.open("EMPLOY.DAT", ios::trunc | ios::binary);
   if(!ouf)
      { cout << "\nCan't open file\n"; return; }
   for(int j=0; j<n; j++)     //for every employee object
      {                       //get its type
      etype = arrap[j]->get_type();
                              //write type to file
      ouf.write( (char*)&etype, sizeof(etype) );
      switch(etype)           //find its size
         {
         case tmanager:   size=sizeof(manager); break;
         case tscientist: size=sizeof(scientist); break;
         case tlaborer:   size=sizeof(laborer); break;
         }                    //write employee object to file
      ouf.write( (char*)(arrap[j]), size );
      if(!ouf)
         { cout << "\nCan't write to file\n"; return; }
      }
   }
//--------------------------------------------------------------
//read data for all employees from file into memory
void employee::read()
   {
   int size;                  //size of employee object
   employee_type etype;       //type of employee
   ifstream inf;              //open ifstream in binary
   inf.open("EMPLOY.DAT", ios::binary);
   if(!inf)
      { cout << "\nCan't open file\n"; return; }
   n = 0;                     //no employees in memory yet
   while(true)
      {                       //read type of next employee
      inf.read( (char*)&etype, sizeof(etype) );
      if( inf.eof() )         //quit loop on eof
         break;
      if(!inf)                //error reading type
         { cout << "\nCan't read type from file\n"; return; }
      switch(etype)
         {                    //make new employee
         case tmanager:       //of correct type
            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 << "\nUnknown type in file\n"; return;
         }                    //read data from file into it
      inf.read( (char*)arrap[n], size  );
      if(!inf)                //error but not eof
         { cout << "\nCan't read data from file\n"; return; }
      n++;                    //count employee
      }  //end while
   cout << "Reading " << n << " employees\n";
   }
////////////////////////////////////////////////////////////////
int main()
   {
   char ch;
   while(true)
      {
      cout << "'a' -- add data for an employee"
              "\n'd' -- display data for all employees"
              "\n'w' -- write all employee data to file"
              "\n'r' -- read all employee data from file"
              "\n'x' -- exit"
              "\nEnter selection: ";
      cin >> ch;
      switch(ch)
         {
         case 'a':            //add an employee to list
            employee::add(); break;
         case 'd':            //display all employees
            employee::display(); break;
         case 'w':            //write employees to file
            employee::write(); break;
         case 'r':            //read all employees from file
            employee::read(); break;
         case 'x': exit(0);   //exit program
         default: cout << "\nUnknown command";
         }  //end switch
      }  //end while
   return 0;
   }  //end main()
0
IT_Exp
Эксперт
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
Блог
07.10.2013, 21:02
Ответы с готовыми решениями:

Пособие Р.Лафоре. ООП в С++
Отличная книга(для начала), но вот задания в ней ужасно запутаны. Может кто-нибудь объяснить,есть...

Решения упражнений [Книга Р.Лафоре "ООП в С++]
//Глава 4. Структуры. Перечисления. //Упражнение 6 #include&lt;iostream&gt; #include&lt;conio.h&gt; using...

Дальнейшее чтение после Р.Лафоре искусство ООП программирования С++
Всем привет. Прочел книгу Р.Лафоре искусство ООП программирования С++. И вот стою курю и думаю. А...

Зацикливание программы. В чем же ошибка? ( Упражнение 5 Глава 7 Лафоре ООП C++)
Миллион раз пересмотрел, ну не вижу ошибку и все тут :(. Должна же остановка на вводе быть! Что...

12
Неэпический
18112 / 10699 / 2062
Регистрация: 27.09.2012
Сообщений: 26,944
Записей в блоге: 1
07.10.2013, 21:09 2
Цитата Сообщение от alsav22 Посмотреть сообщение
В классах присутствуют виртуальные методы
А что в этом такого?
Правда я не вижу виртуального деструктора

Добавлено через 2 минуты
Или Вы имеете ввиду, что будет и указатель на таблицу виртуальных функций записан при
Цитата Сообщение от alsav22 Посмотреть сообщение
используются бинарные методы чтения\записи памяти под объектами.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
07.10.2013, 21:11  [ТС] 3
Цитата Сообщение от Croessmah Посмотреть сообщение
Или Вы имеете ввиду, что будет и указатель на таблицу виртуальных функций записан
Именно это.
0
Неэпический
18112 / 10699 / 2062
Регистрация: 27.09.2012
Сообщений: 26,944
Записей в блоге: 1
07.10.2013, 21:33 4
Цитата Сообщение от alsav22 Посмотреть сообщение
Именно это.
скажем так, что в пределах одной компиляции это не так критично. Но если, создать файл, выйти, потом перекомпилировать программу, и потом считать, то адрес таблицы может поменяться и тогда беда.

Добавлено через 4 минуты
Специально потестил:
Первый запуск:
croessmah@croessmah-pc:~/c++/prj1/prj1$ ./main
'a' -- add data for an employee
'd' -- display data for all employees
'w' -- write all employee data to file
'r' -- read all employee data from file
'x' -- exit
Enter selection: a
'm' to add a manager
's' to add a scientist
'l' to add a laborer
Enter selection: m
Enter last name: 1111
Enter number: 22
Enter title: 333
Enter golf club dues: 4444

'a' -- add data for an employee
'd' -- display data for all employees
'w' -- write all employee data to file
'r' -- read all employee data from file
'x' -- exit
Вот этот момент важен (то, что создали):
Enter selection: d
1. Type: Manager
Name: 1111
Number: 22
Title: 333
Golf club dues: 4444
'a' -- add data for an employee
'd' -- display data for all employees
'w' -- write all employee data to file
'r' -- read all employee data from file
'x' -- exit
Enter selection: w
Writing 1 employees.
'a' -- add data for an employee
'd' -- display data for all employees
'w' -- write all employee data to file
'r' -- read all employee data from file
'x' -- exit
Enter selection: r
Reading 1 employees
'a' -- add data for an employee
'd' -- display data for all employees
'w' -- write all employee data to file
'r' -- read all employee data from file
'x' -- exit
Вот этот момент важен (то, что записали в файл и считали):
Enter selection: d
1. Type: Manager
Name: 1111
Number: 22
Title: 333
Golf club dues: 4444
'a' -- add data for an employee
'd' -- display data for all employees
'w' -- write all employee data to file
'r' -- read all employee data from file
'x' -- exit
Enter selection: x
Вышли из программы, добавил в прогу одну функцию:
C++
1
2
3
4
 int foo () {
     std::cout <<"Fuck off"<<std :: endl;
     return 25 ;
 }
и её вызов в main

Теперь запускаем новую программу:
croessmah@croessmah-pc:~/c++/prj1/prj1$ ./main
Fuck off //Добавленная строчка
'a' -- add data for an employee
'd' -- display data for all employees
'w' -- write all employee data to file
'r' -- read all employee data from file
'x' -- exit
Enter selection: r
Считали данные (там как и положенно один рабочий)
Reading 1 employees
'a' -- add data for an employee
'd' -- display data for all employees
'w' -- write all employee data to file
'r' -- read all employee data from file
'x' -- exit
И кульминация:
Enter selection: d
1. Type: Scientist
Name: 1111
Number: 22
Number of publications: 3355443

'a' -- add data for an employee
'd' -- display data for all employees
'w' -- write all employee data to file
'r' -- read all employee data from file
'x' -- exit
Enter selection: x
1
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
07.10.2013, 21:56  [ТС] 5
Я его так пробовал: код в Debug записывал, а четние и вывод - в Release (или наоборот), или переносил файл, записанный в студии, в Code Blocks и запускал там чтение файла и вывод данных. Ошибки.
0
Неэпический
18112 / 10699 / 2062
Регистрация: 27.09.2012
Сообщений: 26,944
Записей в блоге: 1
07.10.2013, 22:24 6
Цитата Сообщение от alsav22 Посмотреть сообщение
Кто что думает по поводу этого кода?
вот:
Цитата Сообщение от alsav22 Посмотреть сообщение
Ошибки.
В книге далее нигде не упоминается об этом?

Добавлено через 10 минут
Да и еще, нафига
C++
1
#include <process.h>          //for exit()
cstdlib же есть!
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
07.10.2013, 22:33  [ТС] 7
Цитата Сообщение от Croessmah Посмотреть сообщение
В книге далее нигде не упоминается об этом?
Сильно далеко не смотрел. Далее есть описание взаимодействия с этого программой (скрины). Всю книгу не читал, поэтому сказать не могу: затрагивается ли там эта тема или нет, но мне кажется, что о таких вещах сразу предупреждают.
Миниатюры
Код из "Р.Лафоре. ООП в С++"   Код из "Р.Лафоре. ООП в С++"  
0
Неэпический
18112 / 10699 / 2062
Регистрация: 27.09.2012
Сообщений: 26,944
Записей в блоге: 1
07.10.2013, 22:36 8
Цитата Сообщение от alsav22 Посмотреть сообщение
что о таких вещах сразу предупреждают.
В книжных листингах всегда есть ошибки, которые могут оставаться не замеченными долгое время. Если есть более новое издание, может в нем они уже исправлены.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
07.10.2013, 22:46  [ТС] 9
Цитата Сообщение от Croessmah Посмотреть сообщение
В книжных листингах всегда есть ошибки
Есть то они есть... Но тут ошибка не техническая (если это ошибка). Тут же весь код на полиморфизме построен.

Добавлено через 4 минуты
Да и более поздних изданий я не вижу.
0
Неэпический
18112 / 10699 / 2062
Регистрация: 27.09.2012
Сообщений: 26,944
Записей в блоге: 1
07.10.2013, 22:50 10
Цитата Сообщение от alsav22 Посмотреть сообщение
Тут же весь код на полиморфизме построен.
Цитата Сообщение от alsav22 Посмотреть сообщение
Но тут ошибка не техническая
Почему не техническая? Как раз самая техническая - забыли про реализацию виртуальности.

Не по теме:

Как раз моя подпись подходит... про второй экземпляр :D

0
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113
08.12.2013, 16:35 11
up
Как раз изучаю тему работы с файлами по этой книге. Тоже столкнулся с этой проблемой. В пределах одной компиляции все работает стабильно - пишет-читает-выводит. Но после перезапуска ,при попытки считать - пишет что считал,а при попытки вывести на экран - компилятор завершает работу. Я с плюсами недавно, по-этому,не могли бы вы популярно объяснить почему так происходит ?
Буду благодарен
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
08.12.2013, 16:52  [ТС] 12
Здесь почитайте: Запись и чтение объектов разных классов в один файл
Запись и извлечение данных в несколько запусков программы
1
13 / 13 / 2
Регистрация: 13.09.2013
Сообщений: 113
08.12.2013, 17:35 13
Благодарю,разобрался
0
08.12.2013, 17:35
BasicMan
Эксперт
19315 / 2622 / 84
Регистрация: 17.02.2009
Сообщений: 10,364
Блог
08.12.2013, 17:35
Помогаю со студенческими работами здесь

Работа с Классами или разбираем 10 Упражнение 6 главы книги ООП в С++ Р.Лафоре
Доброго времени суток господа. Подскажите пожалуйста каким образом можно объединить классы? Почему...

Что лучше читать Программирование: принципы и практика - Страуструпа или ООП в С++ - Лафоре
Вот хочу научиться программировать, пошел я в библиотеку и взял две книги по программированию на...

Проблемы с переводом строки в число (по книге Лафоре "ООП в С ++ ")
Лафоре &quot;ООП в Си ++ &quot; - проблемы с упражнением 12, глава 7 Условие: Напишите программу,...

Р. Лафоре "ООП в C++". Не компилируется пример с консольной графикой
Изучаю C++ по книге Р. Лафоре. Дошёл до 5-ой главы, и мне встретился пример использования...

Программа лифтов из учебника Лафоре "ООП на С++"
Здравствуйте! Помогите, пожалуйста, разобраться, в чем причина неправильного отображения лифтов? Я...

Лафоре, код из 10 главы
Как не ломал голову, не могу понять, зачем тут префиксная запись инкремента на 16-ой строке кода :...

Лафоре 7.12 Прошу исправить код
Вернемся к обсуждению денежных строк из упражнения 6. Напишите ме- тод ldtoms() для преобразования...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Блоги программистов
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного суматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­хронный счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
Применение компонентов PrimeVue в Vue.js 3 на TypeScript
BasicMan 04.01.2025
Введение в PrimeVue и настройка окружения PrimeVue представляет собой мощную библиотеку компонентов пользовательского интерфейса для Vue. js 3, которая предоставляет разработчикам богатый набор. . .
Как стать Senior developer
cpp_developer 04.01.2025
В современной индустрии разработки программного обеспечения позиция Senior Developer представляет собой не просто следующую ступень карьерной лестницы, а качественно новый уровень профессионального. . .
Что известно о дате выхода Windows 12 и чего от нее ждать
IT_Exp 04.01.2025
В мире технологий постоянно происходят изменения, и операционные системы не являются исключением. Windows 11, выпущенная в октябре 2021 года, принесла множество инноваций и улучшений, но. . .
Что новенького в .NET Core 9
Programming 04.01.2025
Обзор ключевых изменений в . NET Core 9 Платформа . NET Core продолжает активно развиваться, и версия 9 представляет собой значительный шаг вперед в эволюции этой технологии. Новый релиз. . .
Инструкция по установке python3.13.1 в Debian 12
AlexSky-coder 03.01.2025
sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget. . .
Затестил триггеры. архив проекта прилагаю с GOA файлами в настройках архиватора проектов.
Hrethgir 03.01.2025
В этот раз нет закольцованности, потому что от неё только глюки, как я понял, логика не вырезанная. Триггеры очень быстрые если верить измерениям с помощью анализатора от Gowin. Есть ещё регистры,. . .
Python в помощь DevOps
IT_Exp 03.01.2025
Причины использования Python в работе DevOps Python стал неотъемлемой частью мира DevOps, и это не случайно. Этот язык программирования обладает множеством преимуществ, которые делают его. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru