Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <malloc.h>
- #include <string.h>
- using namespace std;
- struct vipusk
- {
- char name[21];
- char secname[21];
- char klass;
- int date;
- char univ[21];
- };
- struct onelist
- {
- vipusk info;
- onelist *next;
- };
- //ПРОТОТИПЫ
- // функции input_menu, keyboard_menu, output_menu созданы
- // для более дружелюбного вида кода программы
- void input_menu(onelist *&head); // меню ввода
- void keyboard_menu (onelist *&head, int &count); // меню ввода с клавиатуры
- void add_head (onelist **head); // добавление в начало
- void add_tale (onelist *head); // добавление в конец
- void fill_elem (vipusk &tmp); // заполнение элемента
- void add_desire (onelist *head, int a); // добавление после нужного элемента
- void add_head_file (onelist **head, FILE *fo); // добавление элементов файла в начало списка
- void output_menu (onelist *head); // меню вывода
- void make_out (onelist *head); // вывод
- void make_out_file (onelist *head, FILE *&fo); // вывод в файл
- int main()
- {
- onelist *head = NULL;
- int menu;
- do
- {
- puts("МЕНЮ: ");
- puts("Нажмите 1 для перехода к меню ввода");
- puts("Нажмите 2 для перехода к меню вывода");
- puts("Нажмите 3 для выхода из программы");
- scanf("%d", &menu);
- switch(menu)
- {
- case 1:
- input_menu(head);
- break;
- case 2:
- output_menu(head);
- break;
- case 3:
- puts ("Работа программы завершена!");
- break;
- default:
- puts("Введено некорректное значение, попробуйте снова!");
- }
- }while(menu != 3);
- return 0;
- }
- void add_head_file (onelist **head, FILE *fo) //добавление элементов файла в начало списка
- {
- while(!feof(fo))
- {
- onelist *tmp = (onelist*)malloc(sizeof(onelist));
- fscanf (fo, "%s%s%s%d%s", tmp->info.name, tmp->info.secname, &tmp
- ->info.klass, &tmp->info.date, tmp->info.univ);
- tmp->next = *head;
- *head = tmp;
- }
- *head = (*head)->next;
- }
- void add_head (onelist **head) //добавление элемента в начало списка
- {
- onelist *tmp = (onelist*)malloc(sizeof(onelist));
- fill_elem(tmp->info);
- tmp->next = *head;
- *head = tmp;
- }
- void add_tale (onelist *head)
- {
- onelist *tale = head;
- while (tale->next != NULL) tale = tale->next;
- onelist *tmp = (onelist*)malloc(sizeof(onelist));
- fill_elem(tmp->info);
- tmp->next = NULL;
- tale->next = tmp;
- }
- void add_desire (onelist *head, int a) // добавление после a элемента
- {
- onelist *ttmp;
- onelist *desire = head;
- for (int i = 1; i < a; i++) desire = desire->next;
- onelist *tmp = (onelist*)malloc(sizeof(onelist));
- fill_elem(tmp->info);
- ttmp = desire->next;
- desire->next = tmp;
- tmp->next = ttmp;
- }
- void fill_elem (vipusk &tmp)
- {
- getchar();
- puts("Введите имя (начиная с заглавной буквы): ");
- int en = 0;
- do
- {
- en = 0;
- gets(tmp.name);
- if (strlen(tmp.name) < 2) en = 1; // проверяем длину
- if ((tmp.name[0] < 'A') || (tmp.name[0] > 'Z')) en = 1; // заглавие
- if (en == 1) printf("Ошибка, повторите ввод! ");
- } while (en != 0);
- puts("Введите фамилию (начиная с заглавной буквы): ");
- do
- {
- en = 0;
- gets(tmp.secname);
- if (strlen(tmp.secname) < 2) en = 1; // проверяем длину
- if ((tmp.secname[0] < 'A') || (tmp.secname[0] > 'Z')) en = 1;
- // проверяем заглавие
- if (en == 1) printf("Ошибка, повторите ввод! ");
- } while (en != 0);
- puts("Введите инициал класса (один символ от A до Z верхнего регистра): ");
- do
- {
- scanf("%c", &tmp.klass);
- if (!((tmp.klass <= 'Z') && (tmp.klass >= 'A')))
- {
- puts("Ошибка, повторите ввод! ");
- getchar();
- }
- }
- while (!((tmp.klass <= 'Z') && (tmp.klass >= 'A')));
- puts("Введите дату выпуска (с 1994 по 2014): ");
- do
- {
- scanf("%d", &tmp.date);
- if ((tmp.date < 1995) || (tmp.date > 2014))
- {
- puts("Ошибка, повторите ввод! ");
- getchar();
- }
- }
- while((tmp.date < 1995) || (tmp.date > 2014));
- puts("Введите нынешнее место обучения: ");
- getchar();
- do
- {
- en = 0;
- gets(tmp.univ);
- if (strlen(tmp.univ) < 2) en = 1; // проверяем длину
- if (en == 1) printf("Ошибка, повторите ввод! ");
- } while (en != 0);
- }
- void make_out (onelist *head)
- {
- onelist *tmp = head;
- int k = 0;
- do
- {
- 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);
- tmp = tmp->next;
- }while(tmp != NULL);
- }
- void make_out_file (onelist *head, FILE *&fo)
- {
- onelist *tmp = head;
- int k = 0;
- do
- {
- fprintf(fo, "%d. %s %s выпустил(ась) из 11 %c класса в %d году и поступил(а) в %s\n", ++k, tmp->info.name, tmp->info.secname, tmp
- ->info.klass, tmp->info.date, tmp->info.univ);
- tmp = tmp->next;
- }while(tmp != NULL);
- }
- void input_menu(onelist *&head)
- {
- FILE *fo;
- int count = 0;
- int inputmenu;
- do
- {
- puts("МЕНЮ ВВОДА: ");
- puts("Нажмите 1 для ввода с клавиатуры");
- puts("Нажмите 2 для ввода из демонстрационного файла");
- puts("Нажмите 3 для ввода из произвольного файла");
- puts("Нажмите 4 для выхода из меню ввода");
- scanf("%d", &inputmenu);
- switch(inputmenu)
- {
- case 1:
- //ВВОД С КЛАВИАТУРЫ
- keyboard_menu (head, count);
- getchar();
- break;
- case 2:
- //ВВОД ИЗ DEMOINPUT
- fo = fopen("/home/nuclear0wl/Документы/Файлы к лабораторным/demoinput.txt","r");
- add_head_file(&head, fo);
- fclose(fo);
- puts("Ввод успешно произведён!");
- break;
- case 3:
- //ВВОД ИЗ ПРОИЗВОЛЬНОГО ФАЙЛА
- puts("Введите путь к файлу: ");
- char way[121];
- FILE *fo;
- getchar();
- do
- {
- gets (way);
- if(fopen(way,"r") == 0)
- {
- puts("Заданного пути не существует, попробуйте снова!");
- }
- }while(fopen(way,"r") == 0);
- fo = fopen(way,"r");
- add_head_file(&head, fo);
- fclose(fo);
- break;
- case 4:
- puts ("Работа с меню ввода завершена!");
- break;
- default:
- puts("Введено некорректное значение, попробуйте снова!");
- }
- }while(inputmenu != 4);
- }
- void keyboard_menu (onelist *&head, int &count)
- {
- int low_menu;
- low_menu = 1;
- do
- {
- if(head != NULL)
- {
- puts("МЕНЮ ВВОДА С КЛАВИАТУРЫ: ");
- puts ("Нажмите 1 для добавления в начало списка");
- puts ("Нажмите 2 для добавления в конец списка");
- puts ("Нажмите 3 для добавления после определённого элемента");
- puts ("Нажмите 4 для выхода из меню ввода");
- puts("Введите нужный пункт меню: ");
- scanf("%d", &low_menu);
- }
- switch(low_menu)
- {
- case 1:
- //ДОБАВЛЕНИЕ В НАЧАЛО
- puts("Введите информацию для добавления в начало списка: ");
- add_head(&head);
- count++;
- break;
- case 2:
- //ДОБАВЛЕНИЕ В КОНЕЦ
- puts("Введите информацию для добавления в конец списка: ");
- add_tale(head);
- count++;
- break;
- case 3:
- //ДОБАВЛЕНИЕ ПОСЛЕ N-НОГО
- puts("Введите номер элемента, после которого должен быть расположен вводимый элемент:");
- int a;
- do
- {
- scanf("%d", &a);
- if ((a < 1)||(a > count)) puts("Значение введено неверно, попробуйте снова");
- }while ((a < 1)||(a > count));
- add_desire(head, a);
- count++;
- break;
- case 4:
- puts("ПОКА");
- break;
- default:
- puts("Значение введено неверно, попробуйте снова.");
- }
- }while(low_menu != 4);
- }
- void output_menu (onelist *head)
- {
- FILE *fo;
- int outputmenu;
- if(head != NULL)
- {
- do
- {
- puts("МЕНЮ ВЫВОДА: ");
- puts("Нажмите 1 для вывода на экран");
- puts("Нажмите 2 для вывода в файл по умолчанию");
- puts("Нажмите 3 для добавления в существующий файл");
- puts("Нажмите 4 для выхода из меню вывода");
- scanf("%d", &outputmenu);
- switch(outputmenu)
- {
- case 1:
- //ВЫВОД НА ЭКРАН
- make_out(head);
- break;
- case 2:
- //ВЫВОД В ФАЙЛ ПО УМОЛЧАНИЮ
- fo = fopen("/home/nuclear0wl/Документы/Файлы к лабораторным/defaultoutput.txt", "w");
- make_out_file(head, fo);
- fclose(fo);
- break;
- case 3:
- //ВЫВОД В ПРОИЗВОЛЬНЫЙ СУЩЕСТВУЮЩИЙ ФАЙЛ
- puts("Введите путь к файлу: ");
- char way[81];
- FILE *fo;
- getchar();
- do
- {
- gets (way);
- if(fopen(way,"r") == 0)
- {
- puts("Заданного пути не существует, попробуйте снова!");
- }
- }while(fopen(way,"r") == 0);
- fo = fopen(way,"a");
- make_out_file(head, fo);
- fclose(fo);
- break;
- default:
- puts("Введено некорректное значение, попробуйте снова!");
- }
- }while(outputmenu != 4);
- }
- else puts("Нет списка для вывода, заполните список и попробуйте снова!");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement