Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.19 KB | None | 0 0
  1. #include <iostream> // Библиотека ввода-вывода.
  2. #include <fstream> // Библиотека файлового ввода-вывода.
  3. #include <string> // Библиотека для работы со строками.
  4. #include <iomanip> // Библиотека для использования манипуляторов ввода-вывода.
  5.  
  6. #define FilePath "list.rtf" // Макроопределение: Путь к файлу со списком книг.
  7.  
  8. using namespace std;
  9.  
  10. struct Flat
  11. {
  12.  
  13. int rooms; // Число комнат
  14. int total; // Общая площадь
  15. int living; // Жилая площадь
  16. int balcones; // Число балконов
  17. int floor; // Этаж
  18. int storeys; // Этажность дома
  19. string districs; // Район
  20.  
  21. };
  22.  
  23. // Вспомогательная функция для чтения int из отдельной строки текстового потока.
  24. int ReadInt(istream & stream)
  25. {
  26. int value;
  27. stream >> value;
  28. stream.ignore(256, '\n'); // Пропуск всех символов до перехода на новую строку.
  29. return value;
  30. }
  31.  
  32. // Функция для чтения одной книги из потока.
  33. // Каждое поле должно располагаться в отдельной строке.
  34. Flat ReadFlat(istream & stream)
  35. {
  36. Flat flat;
  37.  
  38. flat.rooms = ReadInt(stream);
  39. flat.total = ReadInt(stream);
  40. flat.living = ReadInt(stream);
  41. flat.balcones = ReadInt(stream);
  42. flat.floor = ReadInt(stream);
  43. flat.storeys = ReadInt(stream);
  44.  
  45. getline(stream, flat.districs);
  46. return flat;
  47. }
  48.  
  49. // Функция для чтения списка книг из потока.
  50. // (Амперсанд (&) перед именем аргумента обеспечивает передачу аргумента по ссылке,
  51. // то есть books и count могут быть изменены внутри функции так, что это будет видно в вызыващей функции.)
  52. bool ReadFlats(Flat * & flats, int & count, const string filepath)
  53. {
  54. bool read = false;
  55. ifstream file(filepath); // Открытие файла для чтения текста.
  56. // Чтобы включить поддержку string в конструкторе ifstream, нужно установить флаг:
  57. // Settings -> Compiler... -> Global compiler settings -> Compiler settings -> Compiler flags ->
  58. // Have g++ foloow the C++11 ISO C++ language standard [-std=c++11]
  59. if (file)
  60. { // Файл успешно открыт.
  61. count = ReadInt(file); // Чтение количества книг в файле.
  62. if (count > 0)
  63. {
  64. flats = new Flat[count]; // Выделение памяти для count книг.
  65. for (int i = 0; i < count; i++)
  66. flats[i] = ReadFlat(file);
  67. file.close(); // Закрытие файла.
  68. read = true; // Функция должна вернуть true при успешном чтении.
  69. }
  70. }
  71. return read; // Вернуть true, если файл прочитан, иначе - false.
  72. }
  73.  
  74. // Функция для записи одной книги в файл.
  75. // Запись "const Book & book":
  76. // 1) Амперсанд (&) перед именем аргумента обеспечивает передачу параметра по ссылке.
  77. // Передача по ссылке не приводит к копированию структуры.
  78. // 2) "const" обеспечивает запрет на изменение book внутри функции.
  79. void WriteBook(ostream & file, const Flat & flat)
  80. {
  81. file
  82. << flat.rooms << endl
  83. << flat.total << endl
  84. << flat.living << endl
  85. << flat.balcones << endl
  86. << flat.floor << endl
  87. << flat.storeys << endl
  88. << flat.districs << endl;
  89. }
  90.  
  91. // Функция для записи списка книг в файл.
  92. bool WriteBooks(Flat * flats, int count, const string filepath)
  93. {
  94. bool written = false;
  95. ofstream file(filepath); // Открытие файла для записи текста.
  96. if (file)
  97. { // Файл успешно открыт.
  98. file << count << endl; // Запись количества книг в файл.
  99. for (int i = 0; i < count; i++)
  100. WriteBook(file, flats[i]);
  101. file.close(); // Закрытие файла.
  102. written = true; // Функция должна вернуть true при успешном записи.
  103. }
  104. return written; // Вернуть true, если файл записан, иначе - false.
  105. }
  106.  
  107. // Функция для вывода заголовка таблицы.
  108. void WriteTableHeader()
  109. {
  110. cout
  111. << left << setw(20) << "Число комнат"
  112. << left << setw(20) << "Общая площадь"
  113. << left << setw(20) << "Жилая площадь"
  114. << left << setw(20) << "Число балконов"
  115. << left << setw(8) << "Этаж"
  116. << left << setw(20) << "Этажность дома"
  117. << left << setw(8) << "Район"
  118. << endl;
  119. // Манипулятор left обеспечивает выравнивание по левому краю.
  120. // Манипулятор setw задаёт ширину вывода.
  121. // Строка кода
  122. // cout << left << setw(8) << "Title";
  123. // выводит
  124. // "Title "
  125. }
  126.  
  127. // Функция для вывода книги в строчку таблицы.
  128. // (Ширина
  129.  
  130. //вывода для каждого поля должна соответствовать функции WriteTableHeader.)
  131. void WriteBookToTable(const Flat & flat)
  132. {
  133. cout
  134. << left << setw(32) << flat.rooms
  135. << left << setw(20) << flat.total
  136. << left << setw(15) << flat.living
  137. << left << setw(5) << flat.balcones
  138. << left << setw(6) << flat.floor
  139. << left << setw(5) << flat.storeys
  140. << left << setw(6) << flat.districs
  141. << endl;
  142. }
  143.  
  144. // Функция для вывода списка книг в виде таблицы/
  145. void WriteBooksToTable(const Flat * flats, int count)
  146. {
  147. WriteTableHeader(); // Вывод заголовка таблицы книг.
  148. for (int i = 0; i < count; i++)
  149. WriteBookToTable(flats[i]);
  150. }
  151.  
  152.  
  153. // Поиск наиболее новой книги (с наибольшим годом публикации).
  154. void FindNewest(const Flat * flats, int count)
  155. {
  156. int year = -1; // Переменная для хранения максимального найденного года.
  157. // Предполагаем, что отрицательного значения года публикации ни у одной книги нет.
  158. int index = -1; // Переменная для хранения индекса книги с максимальным годом.
  159. for (int i = 0; i < count; i++)
  160. if (flats[i].balcones > year)
  161. { // Год публикации книги превышает текущее значение максимального года.
  162. year = flats[i].balcones; // Сохраняем новое значение максимального года.
  163. index = i; // Сохраняем индекс книги с максимальным годом.
  164. }
  165. if (index != -1)
  166. { // Индекс был изменён, значит, новейшая книга найдена.
  167. cout << "The newest book:" << endl;
  168. WriteTableHeader();
  169. WriteBookToTable(flats[index]); // Используем сохранённый индекс для доступа к книге.
  170. }
  171. else
  172. // Первоначальное значение индекса говорит о том, что либо список кни пуст, либо года в списке меньше -1.
  173. cout << "Can't find the newest book." << endl;
  174. }
  175.  
  176. int main()
  177. {
  178. Flat * flats; // Указатель на массив книг. (Самого массива в данный момент нет.)
  179. int count; // Количество записей в массиве книг.
  180. bool read = ReadFlats(flats, count, FilePath); // Чтение книг из файла.
  181. if (read)
  182. { // Файл успешно прочитан.
  183. cout << "File " << FilePath << " was read." << endl;
  184.  
  185. cout << "---— —-— —-— —---" << endl;
  186. WriteBooksToTable(flats, count); // Вывод таблицы книг.
  187. bool written = WriteBooks(flats, count, FilePath); // Запись книг в файл.
  188. if (written)
  189. cout << "File " << FilePath << " was written." << endl;
  190. else
  191. cout << "File " << FilePath << " wasn't written." << endl;
  192.  
  193. cout << "---— —-— —-— —---" << endl;
  194. FindNewest(flats, count);
  195.  
  196. delete[] flats; // Освобождение памяти.
  197. }
  198. else
  199. cout << "File " << FilePath << " wasn't read." << endl; // Файл не был прочитан.
  200.  
  201. return 0;
  202. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement