Advertisement
Guest User

Untitled

a guest
May 28th, 2015
624
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.43 KB | None | 0 0
  1. /*
  2. Описать класс "Расписание приема пациентов". Каждая запись содержит: дату, время, фамилию пациента.
  3. Время приема одного пациента должно быть равно одному часу. Предусмотреть возможность формирования
  4. расписания с клавиатуры и из файла. печати всего расписания, или расписания в конкретный день,
  5. добавление и удаление записей, сохранение в файл. При добавлении записи следует учитывать, что время
  6. записи должно быть сводобно ( не существует уже созданной записи с этим же временем ).
  7. */
  8.  
  9. #include <vector>
  10. #include <string>
  11. #include <iostream>
  12. #include <fstream>
  13. #include <windows.h>
  14. #include <conio.h>
  15.  
  16.  
  17. using namespace std;
  18.  
  19. string DOW(int);
  20. void show_menu();
  21.  
  22.  
  23.  
  24. class Time_Table
  25. {
  26. private:
  27. struct Patient // Структура пациент
  28. {
  29. int day;
  30. string name;
  31. int time;
  32. Patient *next;
  33. Patient *prev;
  34. };
  35. Patient *Head; //Начало списка
  36. Patient *Tail; // Конец списка
  37.  
  38.  
  39. public:
  40. Time_Table() {Head = Tail = NULL;}; // Инициализация списка
  41. bool Head_chker() { if (Head == NULL) return 1; else return 0 ;} // Проверка на существование списка
  42. ~Time_Table(); // Деструктор списка
  43. void show_day(); // Показывает список на определенный день
  44. void show_week(); // Показывает список на всю неделю
  45. void push(int, string, int); // Вставка пациента в конкретный день в список
  46. void pop(int, string, int); // Удаление пациента из конкретного дня в конкретное время
  47. bool Repeat_Checker(int); //Функция проверки на одинаковое время в одинаковый день
  48. void File_Save(ofstream&); // Функция сохранения расписания в файл
  49. void File_Read(ifstream&, Time_Table&); //Функция чтения расписания с файла
  50.  
  51. };
  52.  
  53. bool Time_Table:: Repeat_Checker(int i)
  54. {
  55. Patient *temp = Head;
  56. while (temp != NULL)
  57. {
  58. if (temp->time == i) return 0;
  59. temp = temp->next;
  60. }
  61. return 1;
  62. }
  63.  
  64. Time_Table::~Time_Table()
  65. {
  66. while(Head)
  67. {
  68. Tail = Head->next;
  69. delete Head;
  70. Head = Tail;
  71. }
  72. }
  73.  
  74. void Time_Table::push(int D, string N, int T)
  75. {
  76. Patient *person = new Patient; //Создаем нового пациента
  77. bool err = ((D > 5 || D < 1) || (T > 17 || T < 8));
  78. if (err)
  79. cout << "Мы работаем с понедельника по пятницу. С 8:00 утра до 17:00 вечера." << endl;
  80. else
  81. {
  82.  
  83. person->day = D;
  84. person->name = N; // Инициализируем его данные
  85. person->time = T;
  86.  
  87. if (Head == NULL) // Если списка нет, то наш пациент - начальный и последний
  88. {
  89. person->prev = NULL;
  90. person->next = NULL;
  91. Head = Tail = person;
  92. cout << " Запись успешно добавлена!" << endl;
  93. }
  94. else
  95. {
  96. if (Repeat_Checker(person->time)) // Если в одном списке время совпадает, создать записть невозможно.
  97. {
  98. Patient *temp = Head;
  99. bool flag = true;
  100. bool checker = person->time == temp->time;
  101.  
  102. if (person->time < temp->time) //Если пациент должен стать раньше головы
  103. {
  104. Head->prev = person;
  105. person->next = Head;
  106. person->prev = NULL;
  107. Head = person;
  108. }
  109. else // Если пациент по времени позже головы
  110. {
  111. while (flag)
  112. {
  113. if (temp->next == NULL) // Если добрались до конца списка
  114. {
  115. person->prev = temp;
  116. person->next = NULL; //Пациент становится хвостом
  117. temp->next = person;
  118. Tail = person;
  119. flag = 0;
  120. }
  121. else // Иначе шагаем пока не будем позже 1 пациента и раньше другого
  122. {
  123. temp = temp->next;
  124.  
  125. if (person->time < temp->time) //Если стали раньше другого пациента, меняем все ссылки
  126. {
  127. person->next = temp;
  128. person->prev = temp->prev;
  129. temp->prev->next = person;
  130. temp->prev = person;
  131. flag = 0;
  132. }
  133.  
  134. }
  135. }
  136. }
  137. cout << " Запись успешно добавлена!" << endl;
  138. }
  139. else cout << "Запись не может быть осущствлена. Время занято." << endl;
  140. }
  141. }
  142. }
  143.  
  144. void Time_Table::pop(int D, string N, int T)
  145. {
  146. if (Head == NULL) cout << "Список пуст. Удаление невозможно." << endl; // Если список пустой, выводим сообщение
  147. else
  148. {
  149. if (Head == Tail) // Если всего 1 элемент в списке - удаляем
  150. {
  151. delete Head;
  152. Head = Tail = NULL;
  153. }
  154. else
  155. {
  156. bool flag = true;
  157. Patient *temp = Head;
  158. while (flag)
  159. {
  160. if (D == temp->day && N == temp->name && temp->time == T) // Если наши данные и данные из списка совпадают
  161. {
  162. if (temp == Head) // Если это головной элемент
  163. {
  164. temp->next->prev = NULL;
  165. Head = temp->next;
  166. delete temp; // Удаляем голову
  167. flag = false;
  168. }
  169. else
  170. {
  171. if (temp == Tail) // Если хвостовой элемент
  172. {
  173. temp->prev->next = NULL;
  174. Tail = temp->prev;
  175. delete temp; // Удаляем хвост
  176. flag = false;
  177. }
  178. else
  179. {
  180. temp->prev->next = temp->next;
  181. temp->next->prev = temp->prev; // Если посередине элемент, выставляемадреса
  182. delete temp;
  183. flag = false;
  184. }
  185. }
  186. }
  187. else temp = temp->next; // Если данные не совпадают, прыгаем дальше
  188. }
  189. }
  190. cout << "Удаление прошло успешно" << endl;
  191. }
  192.  
  193. }
  194.  
  195. void File_Read(ifstream &f, Time_Table *W)
  196. {
  197. string name, blank;
  198. int day, time_pass;
  199. if (!f)
  200. {
  201. cout << "Ошибка открытия файла." << endl;
  202. }
  203. else
  204. {
  205.  
  206. while (!f.eof())
  207. {
  208. f >> name;
  209. f >> day;
  210. f >> time_pass;
  211.  
  212. W [day-1].push(day, name, time_pass);
  213. }
  214. cout << "Файл был успешно считан.";
  215. cout << blank;
  216. }
  217. }
  218.  
  219. void Time_Table::show_day()
  220. {
  221. Patient *temp = Head; // Начиная с головы, показываем нужную информацию и перескакиваем по указателям, пока не дойдем до хвоста
  222. while (temp != NULL)
  223. {
  224. cout << endl << "Назначенный день:" << DOW(temp->day) << endl;
  225. cout << "Фамилия пациента: " << temp->name << endl;
  226. cout << "Время приема: " << temp->time << ":00" << endl << endl;
  227. temp = temp->next;
  228. }
  229. }
  230.  
  231. void Time_Table::File_Save(ofstream &f)
  232. {
  233. Patient *temp = Head; // Начиная с головы, показываем нужную информацию и перескакиваем по указателям, пока не дойдем до хвоста
  234. while (temp != NULL)
  235. {
  236. f << endl << "Назначенный день:" << DOW(temp->day) << endl;
  237. f << "Фамилия пациента: " << temp->name << endl;
  238. f << "Время приема: " << temp->time << ":00" << endl << endl;
  239. temp = temp->next;
  240. }
  241. }
  242. int main()
  243. {
  244. setlocale(LC_ALL, "Russian");
  245.  
  246. Time_Table RJD1, RJD2, RJD3, RJD4, RJD5; // Массив из 5 расписаний на каждый день недели
  247. Time_Table week[5] = {RJD1, RJD2, RJD3, RJD4, RJD5};
  248.  
  249. string name; // Данные для 1-го пациента
  250. int time_pass;
  251. int k, day;
  252.  
  253. show_menu();
  254. cout << endl << "Введите пункт меню. " << endl;
  255. k = getch();
  256. cout << endl;
  257.  
  258. while(k != 'Q')
  259. {
  260. switch(k)
  261. {
  262. case '1' :
  263. {
  264. ifstream r("input.txt");
  265. File_Read(r, week);
  266. r.close();
  267.  
  268.  
  269. }; break;
  270.  
  271. case '2' :
  272. {
  273.  
  274. for(int i = 0; i < 5; i++)
  275. {
  276. cout << "-----------------------"<< DOW(i+1)<< "------------------------" << endl;
  277. if (week[i].Head_chker())
  278. cout << "Записей на сегодня нет!" << endl;
  279. else
  280. week[i].show_day();
  281. cout << "------------------------------------------------------" << endl;
  282. }
  283.  
  284. cout << endl << "--------------------------ВЫХОДНОЙ---------------------------" << endl;
  285. cout << "--------------------------ВЫХОДНОЙ---------------------------" << endl;
  286.  
  287.  
  288. }; break;
  289.  
  290.  
  291. case '3' :
  292. {
  293. cout << endl << "Введите день: ";
  294. cin >> day;
  295. cout << "-------------" << DOW(day) << "---------" << endl;
  296.  
  297. if (week[day-1].Head_chker())
  298. cout << "Записей на сегодня нет" << endl;
  299. else
  300. week[day-1].show_day();
  301.  
  302. }; break;
  303.  
  304.  
  305. case '4' :
  306. {
  307. cout << "Введите фамилию: ";
  308. cin >> name;
  309. cout << "Введите день приема: ";
  310. cin >> day;
  311. cout << "Введите время приема: ";
  312. cin >> time_pass;
  313.  
  314. week[day-1].push(day, name, time_pass);
  315. }; break;
  316.  
  317. case '5' :
  318. {
  319.  
  320. cout << "-------Удаление записи-------" << endl;
  321. cout << "Введите фамилию пациента, удаляемого из списка: ";
  322. cin >> name;
  323. cout << "Введите назначенный день приема: ";
  324. cin >> day;
  325. cout << "Введите время приема: ";
  326. cin >> time_pass;
  327. week[day-1].pop(day, name, time_pass);
  328. }; break;
  329.  
  330.  
  331. case '6' :
  332. {
  333. ofstream f("output.txt");
  334. for (int i = 0; i < 5; i++)
  335. {
  336. f << "-----------------------"<< DOW(i+1)<< "------------------------" << endl;
  337. if (week[i].Head_chker())
  338. f << "Записей на сегодня нет!" << endl;
  339. else
  340. week[i].File_Save(f);
  341. f << "------------------------------------------------------" << endl;
  342. }
  343.  
  344. f << endl << "--------------------------ВЫХОДНОЙ---------------------------" << endl;
  345. f << "--------------------------ВЫХОДНОЙ---------------------------" << endl;
  346. f.close();
  347. cout << "Расписание успешно сохранено в файл!" << endl;
  348. }; break;
  349.  
  350. default :
  351. {
  352. cout << "Простите, данной цифры в меню нет. Попробуйте ещё раз.";
  353. }; break;
  354. };
  355.  
  356. cout << endl << "Введите пункт меню." << endl;
  357. k = getch();
  358. cout << endl;
  359. }
  360.  
  361. return 0;
  362. }
  363.  
  364. string DOW(int D) // Функция показа дней недели в зависимости от int
  365. {
  366. switch(D)
  367. {
  368. case 1 : return "Понедельник"; break;
  369. case 2 : return "Вторник"; break;
  370. case 3 : return "Среда"; break;
  371. case 4 : return "Четверг"; break;
  372. case 5 : return "Пятница"; break;
  373. default : return "Не рабочий день.";
  374. }
  375. }
  376.  
  377. void show_menu() // Функция показа меню
  378. {
  379. cout << " ***************************************************" << endl;
  380. cout << " ** Работа расписания пациентов. **" << endl;
  381. cout << " ***************************************************" << endl;
  382. cout << " ***************************************************" << endl;
  383. cout << " ** Выберите желаемую операцию: **" << endl;
  384. cout << " ** --------------------------------------------- **" << endl;
  385. cout << " ** | 1. Формирование расписания с файла. | **" << endl;
  386. cout << " ** | 2. Показать расписание на неделю. | **" << endl;
  387. cout << " ** | 3. Показать расписание конкретного дня. | **" << endl;
  388. cout << " ** | 4. Добавить запись. | **" << endl;
  389. cout << " ** | 5. Удалить запись. | **" << endl;
  390. cout << " ** | 6. Сохранить расписание в файл. | **" << endl;
  391. cout << " ** --------------------------------------------- **" << endl;
  392. cout << " ***************************************************" << endl;
  393. cout << " ***************************************************" << endl;
  394. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement