Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <locale.h>
- struct person
- {
- char lastname[50]; //фамилия сотрудника
- int birthYear; //год рождения сотрудника
- char sex[50]; //пол сотрудника
- char education[50]; //образование сотрудника
- int workYear; //год поступления сотрудника на работу
- };
- void add (char*); /* добавить запись в файл */
- void edit (char*); /* редактировать запись */
- void show (char*); /* просмотреть содержимое файла */
- void search (char*); /* вывести сотрудников до 28 лет с высшим образованием */
- void del (char*); /* удалить запись из файла */
- void youngestMan (char*); /* вывести самого молодого сотрудника-мужчину */
- int main (int argc, char* argv[]) {
- system("chcp 1251");
- system ("CLS");
- char filename[50]; //имя входного файла
- int menu; //пункт в меню
- if(argc > 1) {
- memcpy (filename, argv[1], 50);
- }
- else {
- puts ("Имя файла:");
- gets (filename);
- }
- /* меню */
- do
- {
- system ("CLS");
- puts ("1. Добавление записи");
- puts ("2. Редактирование записи");
- puts ("3. Просмотр записей");
- puts ("4. Вывести список молодых специалистов (до 28 лет) с высшим образованием");
- puts ("5. Самый старший сотрудник среди мужчин");
- puts ("6. Удаление записи");
- puts ("7. Выход");
- scanf ("%d%*c", &menu);
- switch (menu)
- {
- case 1 : add (filename); break;
- case 2 : edit (filename); break;
- case 3 : show (filename); break;
- case 4 : search (filename); break;
- case 5 : youngestMan(filename); break;
- case 6 : del (filename); break;
- }
- }
- while (menu!=7);
- system ("CLS");
- return 0;
- }
- /* функция вывода на экран одной записи */
- void print1 (struct person data)
- {
- printf ("Фамилия : %s\nГод рождения : %d\nПол : %s\nОбразование : %s\nГод поступления на работу : %d\n",
- data.lastname, data.birthYear, data.sex, data.education, data.workYear);
- }
- /*заполнение одной записи (ввод данных о клиенте)*/
- struct person input_worker (void)
- {
- struct person worker;
- int flag = 1; //переменная-флаг
- int i;
- char input[30]; //массив для ввода данных
- /* ввод фамилии сотрудника */
- puts ("Фамилия сотрудника");
- gets (worker.lastname);
- /* ввод пола сотрудника */
- puts ("Пол сотрудника (\"Мужской\" или \"Женский\")");
- do {
- flag = 0;
- gets(input);
- for(i = 0; i < strlen(input); i++) {
- if ( strcmp(input, "Мужской") && strcmp(input, "Женский") ) {
- puts("Некорректный ввод, пол вводится с заглавной буквы");
- flag = 1;
- break;
- }
- }
- } while (flag);
- strcpy(worker.sex, input);
- flag = 1;
- /* ввод образования сотрудника */
- puts ("Образование (\"Среднее\" или \"Высшее\")");
- do {
- flag = 0;
- gets(input);
- for(i = 0; i < strlen(input); i++) {
- if ( strcmp(input, "Среднее") && strcmp(input, "Высшее") ) {
- puts("Некорректный ввод, образование вводится с заглавной буквы");
- flag = 1;
- break;
- }
- }
- } while (flag);
- strcpy(worker.education, input);
- flag = 1;
- /* ввод года рождения сотрудника */
- puts ("Год рождения (1930-2007)");
- do {
- scanf("%d", &worker.birthYear);
- if ((worker.birthYear>2007)||(worker.birthYear<1930)) {
- printf("Некорректный ввод, сотрудник еще слишком молодой,\n");
- printf("либо сотрудник с таким годом рождения уже слишком старый для работы в нашей лаборатории\n");
- printf("Повторите ввод\n");
- }
- else flag = 0;
- } while (flag);
- flag = 1;
- while (getchar()!='\n');
- /* ввод года поступления на работу сотрудника */
- puts ("Год поступления на работу (1940-2021)");
- do {
- scanf("%d", &worker.workYear);
- if ((worker.workYear>2021)||(worker.workYear<1940)) {
- printf("Некорректный ввод, введенный вами год либо не наступил,\n");
- printf("либо в таком году наша лаборатория еще не существовала\n");
- printf("Повторите ввод\n");
- }
- else flag = 0;
- } while (flag);
- flag = 1;
- while (getchar()!='\n');
- printf("Нажмите enter для выхода...\n");
- getchar();
- return worker;
- }
- /* Вывод самого старшего сотрудника среди мужчин */
- void youngestMan (char* file) {
- system ("CLS");
- FILE * f;
- struct person worker, required;
- if ((f=fopen (file, "rb"))==NULL)
- {
- perror ("Ошибка открытия файла"); getchar();
- return;
- }
- int max_birthYear = 3000;
- while (fread(&worker, sizeof(worker), 1, f) == 1) {
- if (strcmp(worker.sex, "Мужской") == 0) {
- if (worker.birthYear <= max_birthYear) {
- max_birthYear = worker.birthYear;
- required = worker;
- }
- }
- }
- if (max_birthYear != 0) {
- printf("Самый старший сотрудник среди мужчин:\n\n");
- printf("--------------------------------\n");
- print1(required);
- printf("--------------------------------\n");
- }
- else {
- puts("Таких записей нет");
- }
- printf("Нажмите enter для выхода...\n");
- getchar();
- fclose(f);
- }
- /* функция добавления записи в файл */
- void add (char* file)
- {
- FILE * f;
- struct person worker;
- system ("CLS");
- if ((f=fopen (file, "ab"))==NULL)
- {
- perror ("Ошибка открытия файла");
- getchar();
- return;
- }
- worker = input_worker();
- fwrite (&worker, sizeof (worker), 1, f);
- fclose (f);
- }
- /* функция редактирования записи */
- void edit (char* file)
- {
- FILE * f;
- struct person worker;
- char name[30], yes;
- int flag = 0;
- system ("CLS");
- if ((f=fopen (file, "rb+"))==NULL)
- {
- perror ("Ошибка открытия файла"); getchar();
- return;
- }
- printf ("Фамилия сотрудника: "); gets (name);
- while (fread(&worker, sizeof(worker), 1, f))
- if (!strcmp(worker.lastname, name))
- {
- print1 (worker);
- puts ("Редактировать? (y/n)");
- do
- {
- yes = getchar();getchar();
- }
- while (yes!='y' && yes!='Y' && yes!='n' && yes!='N');
- if (yes=='y' || yes=='Y')
- {
- worker = input_worker();
- fseek (f, -sizeof(worker), SEEK_CUR);
- fwrite (&worker, sizeof (worker), 1, f);
- fseek (f,0,SEEK_CUR);
- }
- }
- else {
- flag = 1;
- }
- if (flag) puts("Такой записи нет");
- printf("\nНажмите enter для выхода...\n");
- getchar();
- fclose(f);
- }
- /* функция печати содержимого файла */
- void show (char* file)
- {
- FILE *f;
- struct person worker;
- int k=0, yes, len=0;
- const int str=5; /* количество на одной странице */
- system("CLS");
- if((f=fopen(file, "rb"))==NULL) //Проверка открытия файлов
- {
- perror("Ошибка открытия файла");
- system("pause");
- return;
- }
- while(fread(&worker, sizeof(worker), 1, f))
- len++;
- fseek(f, 0, SEEK_SET);
- while(yes!='3')
- {
- fflush(stdin);
- system("cls");
- puts("| N | Фамилия сотрудника | Год рождения | Пол | Образование | Год поступления на работу |");
- puts("--------------------------------------------------------------------------------------------------");
- do
- {
- k++;
- fread(&worker, sizeof(worker), 1, f);
- printf("| %3d | %-21s | %-12d | %-7s | %-11s | %-25d |\n", k, worker.lastname, worker.birthYear, worker.sex, worker.education, worker.workYear);
- }
- while(k%str&&k!=len);
- puts("--------------------------------------------------------------------------------------------------");
- /* пагинация */
- puts("'1' - предыдущая страница. '2' - следующая. Чтобы выйти, нажмите '3'");
- do
- yes=getchar();
- while(yes!='1' && yes!='2' && yes!='3');
- if(yes=='1')
- {
- if(k<=str)
- {
- fseek(f, 0, SEEK_SET);
- k=0;
- }
- else if(k==len && len%str)
- {
- fseek(f, -(len%str+str)*sizeof(worker), SEEK_END);
- k=len-len%str-str;
- }
- else
- {
- fseek(f, -2*str*sizeof(worker), SEEK_CUR);
- k-=2*str;
- }
- }
- else if(yes=='2')
- {
- if(k==len)
- {
- if(k==str)
- {
- fseek(f, 0, SEEK_SET);
- k=0;
- }
- else if(!(len%str))
- {
- fseek(f, -(str)*sizeof(worker), SEEK_END);
- k=len-str;
- }
- else
- {
- fseek(f, -(len%str)*sizeof(worker), SEEK_END);
- k=len-len%str;
- }
- }
- }
- }
- fclose(f);
- system("pause");
- }
- /* функция вывода сотрудников до 28 лет с высшем образованием: */
- void search (char* file)
- {
- FILE * f;
- struct person worker, required;
- int max_year = 0;
- system ("CLS");
- if ((f=fopen (file, "rb"))==NULL)
- {
- perror ("Ошибка открытия файла"); getchar();
- return;
- }
- puts ("Список сотрудников до 28 лет (1993 год рождения) с высшем образованием:");
- while (fread(&worker, sizeof(worker), 1, f) == 1) {
- if ((strcmp(worker.education, "Высшее") == 0) && worker.birthYear > 1993 )
- {
- max_year = worker.birthYear;
- printf("--------------------------------\n");
- print1 (worker);
- printf("--------------------------------\n");
- }
- }
- if (max_year == 0) puts ("Такие записи отсутствуют");
- fclose(f);
- printf("\nНажмите enter для выхода...\n");
- getchar();
- }
- /* функция удаления записи из файла */
- void del (char* file)
- {
- FILE *f, *ft;
- struct person worker;
- char yes, tempfile[]="tempfile";
- int one,end, birthYear;
- char lastname[50]; //массив с фамилией сотрудника
- int flag = 0; //переменная-флаг
- system("CLS");
- if((f=fopen(file, "rb"))==NULL) //Проверка открытия файлов
- {
- perror("Ошибка открытия файла");
- system("pause");
- return;
- }
- ft=fopen(tempfile, "wb");
- puts("Фамилия сотрудника: ");
- scanf("%s", &lastname); //фамилия сотрудника для поиска
- puts("Год рождения сотрудника: ");
- scanf("%d",&birthYear); //год рождения сотрудника для поиска
- while(fread(&worker, sizeof(worker), 1, f))
- if((strcmp(lastname, worker.lastname) == 0) && (worker.birthYear == birthYear))
- {
- print1(worker); //вывод записи
- puts("Удалить? (y/n)");
- do
- yes=getchar();
- while(yes!='y' && yes!='Y' && yes!='n' && yes!='N');
- if(yes=='y' || yes=='Y')
- {
- rewind(f);
- while(fread(&worker, sizeof(worker), 1, f))
- if(strcmp(lastname, worker.lastname) != 0)
- fwrite(&worker, sizeof(worker), 1, ft);
- fseek(f, sizeof(worker), SEEK_SET);
- one=ftell(f); //запоминаем позицию после 1 элемента
- fseek(f, 0, SEEK_END);
- end=ftell(f); //запоминаем позицию конца
- fclose(f);
- fclose(ft);
- remove(file);
- if(one!=end)
- rename(tempfile, file);
- else
- remove(tempfile);
- return;
- }
- }
- else {
- flag = 1;
- }
- if (flag) puts("Такой записи нет");
- fclose(f);
- fclose(ft);
- system("pause");
- return;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement