Advertisement
Guest User

Untitled

a guest
May 22nd, 2015
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.73 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <string.h>
  4. using namespace std;
  5. struct vipusk
  6. {
  7. char name[21];
  8. char secname[21];
  9. char klass;
  10. int date;
  11. char univ[21];
  12. };
  13.  
  14. struct onelist
  15. {
  16. vipusk info;
  17. onelist *next;
  18. };
  19. //ПРОТОТИПЫ
  20. // функции input_menu, keyboard_menu, output_menu созданы
  21. // для более дружелюбного вида кода программы
  22. void input_menu(onelist *&head);                                        // меню ввода
  23. void keyboard_menu (onelist *&head, int &count);                        // меню ввода с клавиатуры
  24. void add_head (onelist **head);                                         // добавление в начало
  25. void add_tale (onelist *head);                                          // добавление в конец
  26. void fill_elem (vipusk &tmp);                                           // заполнение элемента
  27. void add_desire (onelist *head, int a);                                 // добавление после нужного элемента
  28. void add_head_file (onelist **head, FILE *fo);                          // добавление элементов файла в начало списка
  29. void output_menu (onelist *head);                                       // меню вывода
  30. void make_out (onelist *head);                                          // вывод
  31. void make_out_file (onelist *head, FILE *&fo);                          // вывод в файл
  32.  
  33. int main()
  34. {
  35. onelist *head = NULL;
  36. int menu;
  37. do
  38. {
  39. puts("МЕНЮ: ");
  40. puts("Нажмите 1 для перехода к меню ввода");
  41. puts("Нажмите 2 для перехода к меню вывода");
  42. puts("Нажмите 3 для выхода из программы");
  43. scanf("%d", &menu);
  44. switch(menu)
  45. {
  46. case 1:
  47. input_menu(head);
  48. break;
  49. case 2:
  50. output_menu(head);
  51. break;
  52. case 3:
  53. puts ("Работа программы завершена!");
  54. break;
  55. default:
  56. puts("Введено некорректное значение, попробуйте снова!");
  57. }
  58. }while(menu != 3);
  59. return 0;
  60. }
  61. void add_head_file (onelist **head, FILE *fo) //добавление элементов файла в начало  списка
  62. {
  63. while(!feof(fo))
  64. {
  65. onelist *tmp = (onelist*)malloc(sizeof(onelist));
  66. fscanf (fo, "%s%s%s%d%s", tmp->info.name, tmp->info.secname, &tmp
  67. ->info.klass, &tmp->info.date, tmp->info.univ);
  68. tmp->next = *head;
  69. *head = tmp;
  70. }
  71. *head = (*head)->next;
  72. }
  73. void add_head (onelist **head) //добавление элемента в начало списка
  74. {
  75. onelist *tmp = (onelist*)malloc(sizeof(onelist));
  76. fill_elem(tmp->info);
  77. tmp->next = *head;
  78. *head = tmp;
  79. }
  80. void add_tale (onelist *head)
  81. {
  82. onelist *tale = head;
  83. while (tale->next != NULL) tale = tale->next;
  84. onelist *tmp = (onelist*)malloc(sizeof(onelist));
  85. fill_elem(tmp->info);
  86. tmp->next = NULL;
  87. tale->next = tmp;
  88. }
  89. void add_desire (onelist *head, int a) // добавление после a элемента
  90. {
  91. onelist *ttmp;
  92. onelist *desire = head;
  93. for (int i = 1; i < a; i++) desire = desire->next;
  94. onelist *tmp = (onelist*)malloc(sizeof(onelist));
  95. fill_elem(tmp->info);
  96. ttmp = desire->next;
  97. desire->next = tmp;
  98. tmp->next = ttmp;
  99. }
  100. void fill_elem (vipusk &tmp)
  101. {
  102. getchar();
  103. puts("Введите имя (начиная с заглавной буквы): ");
  104. int en = 0;
  105. do
  106. {
  107. en = 0;
  108. gets(tmp.name);
  109. if (strlen(tmp.name) < 2) en = 1; // проверяем длину
  110. if ((tmp.name[0] < 'A') || (tmp.name[0] > 'Z')) en = 1; // заглавие
  111. if (en == 1) printf("Ошибка, повторите ввод! ");
  112. } while (en != 0);
  113. puts("Введите фамилию (начиная с заглавной буквы): ");
  114. do
  115. {
  116. en = 0;
  117. gets(tmp.secname);
  118. if (strlen(tmp.secname) < 2) en = 1; // проверяем длину
  119. if ((tmp.secname[0] < 'A') || (tmp.secname[0] > 'Z')) en = 1;
  120. // проверяем заглавие
  121. if (en == 1) printf("Ошибка, повторите ввод! ");
  122. } while (en != 0);
  123. puts("Введите инициал класса (один символ от A до Z верхнего регистра): ");
  124. do
  125. {
  126. scanf("%c", &tmp.klass);
  127. if (!((tmp.klass <= 'Z') && (tmp.klass >= 'A')))
  128. {
  129. puts("Ошибка, повторите ввод! ");
  130. getchar();
  131. }
  132. }
  133. while (!((tmp.klass <= 'Z') && (tmp.klass >= 'A')));
  134. puts("Введите дату выпуска (с 1994 по 2014): ");
  135. do
  136. {
  137. scanf("%d", &tmp.date);
  138. if ((tmp.date < 1995) || (tmp.date > 2014))
  139. {
  140. puts("Ошибка, повторите ввод! ");
  141. getchar();
  142. }
  143. }
  144. while((tmp.date < 1995) || (tmp.date > 2014));
  145. puts("Введите нынешнее место обучения: ");
  146. getchar();
  147. do
  148. {
  149. en = 0;
  150. gets(tmp.univ);
  151. if (strlen(tmp.univ) < 2) en = 1; // проверяем длину
  152. if (en == 1) printf("Ошибка, повторите ввод! ");
  153. } while (en != 0);
  154. }
  155. void make_out (onelist *head)
  156. {
  157. onelist *tmp = head;
  158. int k = 0;
  159. do
  160. {
  161. printf("%d. %s %s выпустил(ась) из 11 %c класса в %d году и поступил(а) в %s\n", ++k, tmp->info.name, tmp->info.secname, tmp->info.klass, tmp->info.date, tmp->info.univ);
  162. tmp = tmp->next;
  163. }while(tmp != NULL);
  164. }
  165. void make_out_file (onelist *head, FILE *&fo)
  166. {
  167. onelist *tmp = head;
  168. int k = 0;
  169. do
  170. {
  171. fprintf(fo, "%d. %s %s выпустил(ась) из 11 %c класса в %d году и поступил(а) в %s\n", ++k, tmp->info.name, tmp->info.secname, tmp
  172. ->info.klass, tmp->info.date, tmp->info.univ);
  173. tmp = tmp->next;
  174. }while(tmp != NULL);
  175. }
  176. void input_menu(onelist *&head)
  177. {
  178. FILE *fo;
  179. int count = 0;
  180. int inputmenu;
  181. do
  182. {
  183. puts("МЕНЮ ВВОДА: ");
  184. puts("Нажмите 1 для ввода с клавиатуры");
  185. puts("Нажмите 2 для ввода из демонстрационного файла");
  186. puts("Нажмите 3 для ввода из произвольного файла");
  187. puts("Нажмите 4 для выхода из меню ввода");
  188. scanf("%d", &inputmenu);
  189. switch(inputmenu)
  190. {
  191. case 1:
  192. //ВВОД С КЛАВИАТУРЫ
  193. keyboard_menu (head, count);
  194. getchar();
  195. break;
  196. case 2:
  197. //ВВОД ИЗ DEMOINPUT
  198. fo = fopen("/home/nuclear0wl/Документы/Файлы к лабораторным/demoinput.txt","r");
  199. add_head_file(&head, fo);
  200. fclose(fo);
  201. puts("Ввод успешно произведён!");
  202. break;
  203. case 3:
  204. //ВВОД ИЗ ПРОИЗВОЛЬНОГО ФАЙЛА
  205. puts("Введите путь к файлу: ");
  206. char way[121];
  207. FILE *fo;
  208. getchar();
  209. do
  210. {
  211. gets (way);
  212. if(fopen(way,"r") == 0)
  213. {
  214. puts("Заданного пути не существует, попробуйте снова!");
  215. }
  216. }while(fopen(way,"r") == 0);
  217. fo = fopen(way,"r");
  218. add_head_file(&head, fo);
  219. fclose(fo);
  220. break;
  221. case 4:
  222. puts ("Работа с меню ввода завершена!");
  223. break;
  224. default:
  225. puts("Введено некорректное значение, попробуйте снова!");
  226. }
  227. }while(inputmenu != 4);
  228. }
  229. void keyboard_menu (onelist *&head, int &count)
  230. {
  231. int low_menu;
  232. low_menu = 1;
  233. do
  234. {
  235. if(head != NULL)
  236. {
  237. puts("МЕНЮ ВВОДА С КЛАВИАТУРЫ: ");
  238. puts ("Нажмите 1 для добавления в начало списка");
  239. puts ("Нажмите 2 для добавления в конец списка");
  240. puts ("Нажмите 3 для добавления после определённого элемента");
  241. puts ("Нажмите 4 для выхода из меню ввода");
  242. puts("Введите нужный пункт меню: ");
  243. scanf("%d", &low_menu);
  244. }
  245. switch(low_menu)
  246. {
  247. case 1:
  248. //ДОБАВЛЕНИЕ В НАЧАЛО
  249. puts("Введите информацию для добавления в начало списка: ");
  250. add_head(&head);
  251. count++;
  252. break;
  253. case 2:
  254. //ДОБАВЛЕНИЕ В КОНЕЦ
  255. puts("Введите информацию для добавления в конец списка: ");
  256. add_tale(head);
  257. count++;
  258. break;
  259. case 3:
  260. //ДОБАВЛЕНИЕ ПОСЛЕ N-НОГО
  261. puts("Введите номер элемента, после которого должен быть расположен вводимый элемент:");
  262. int a;
  263. do
  264. {
  265. scanf("%d", &a);
  266. if ((a < 1)||(a > count)) puts("Значение введено неверно, попробуйте снова");
  267. }while ((a < 1)||(a > count));
  268. add_desire(head, a);
  269. count++;
  270. break;
  271. case 4:
  272. puts("ПОКА");
  273. break;
  274. default:
  275. puts("Значение введено неверно, попробуйте снова.");
  276. }
  277. }while(low_menu != 4);
  278. }
  279. void output_menu (onelist *head)
  280. {
  281. FILE *fo;
  282. int outputmenu;
  283. if(head != NULL)
  284. {
  285. do
  286. {
  287. puts("МЕНЮ ВЫВОДА: ");
  288. puts("Нажмите 1 для вывода на экран");
  289. puts("Нажмите 2 для вывода в файл по умолчанию");
  290. puts("Нажмите 3 для добавления в существующий файл");
  291. puts("Нажмите 4 для выхода из меню вывода");
  292. scanf("%d", &outputmenu);
  293. switch(outputmenu)
  294. {
  295. case 1:
  296. //ВЫВОД НА ЭКРАН
  297. make_out(head);
  298. break;
  299. case 2:
  300. //ВЫВОД В ФАЙЛ ПО УМОЛЧАНИЮ
  301. fo = fopen("/home/nuclear0wl/Документы/Файлы к лабораторным/defaultoutput.txt", "w");
  302. make_out_file(head, fo);
  303. fclose(fo);
  304. break;
  305. case 3:
  306. //ВЫВОД В ПРОИЗВОЛЬНЫЙ СУЩЕСТВУЮЩИЙ ФАЙЛ
  307. puts("Введите путь к файлу: ");
  308. char way[81];
  309. FILE *fo;
  310. getchar();
  311. do
  312. {
  313. gets (way);
  314. if(fopen(way,"r") == 0)
  315. {
  316. puts("Заданного пути не существует, попробуйте снова!");
  317. }
  318. }while(fopen(way,"r") == 0);
  319. fo = fopen(way,"a");
  320. make_out_file(head, fo);
  321. fclose(fo);
  322. break;
  323. default:
  324. puts("Введено некорректное значение, попробуйте снова!");
  325. }
  326. }while(outputmenu != 4);
  327. }
  328. else puts("Нет списка для вывода, заполните список и попробуйте снова!");
  329. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement