Описать структуру с именем WORKER - C (СИ) (76532)
Формулировка задачи:
Уважаемые програмисты. Я учусь програмированию и натолкнулся на задачу:
Вариант 6.
Описать структуру с именем WORKER, содержащую следующие поля:
- фамилия и инициалы работника;
- название занимаемой должности;
- год поступления на работу.
Написать программу, выполняющую следующие действия:
1. Создание нового файла.
2. Добавление записи типа WORKER в файл.
3. Удаление указанной записи.
4. Корректировку указанной записи.
5. Просмотр файла.
6. Сортировку по алфавиту.
7. Вывод на дисплей фамилий работников, чей стаж работы в организации превышает значение,
введенное с клавиатуры. Если таких работников нет, вывести на дисплей соответствующее сообщение.
порядок работы:
1. Продумать тип компонента файла. Это структура.
2. Программа должна быть структурированной. Структурный подход предполагает:
• что программа должна состоять из функций;
• нисходящее проектирование.
3. Главная функция (main) должна вызывать действия по запросу пользователя. Значит, она должна:
• показывать меню - список действий, которые должна выполнить программа;
• получать номер действия, которое должна выполнить программа;
• вызывать выбранное действие;
• повторять с пункта а), до тех пор, пока не будет выбрано завершение программы.
4. Рассмотрим действия, которые должна выполнять программа.
• Создание нового файла. Если файл уже существует, выдать сообщение и запросить действия пользователя.
• Добавление новой записи в файл. Файл следует открывать в режиме дополнения «а». Если файл не существует, выдать сообщение об ошибке.
• Удаление записи из файла. Для решения этой задачи можно использовать вспомогательный файл. Во вспомогательный файл можно скопировать все записи из исходного файла, кроме той, которую надо удалить. Затем исходный файл удалить, а вспомогательный файл переименовать.
• Корректировка записи. При корректировке надо найти запись по запросу пользователя, изменить одно поле или несколько полей и записать в файл по прежнему адресу.
• Сортировка. Для решения этой задачи можно менять местами записи в файле или создавать специальный индексный файл, содержащий адреса записей, упорядоченных в заданном порядке.
• Просмотр. Выполнение этой задачи сводится к чтению записей из файла и выводу их на экран. Так как количество записей в файле может оказаться больше количества строк экрана, следует предусмотреть возможность листания информации. Это значит, что после вывода определенного количества записей следует приостановить вывод и запросить пользователя о дальнейших действиях: вывод следующих записей, возврат к предыдущим записям, прекращение просмотра.
• Поиск. Поиск можно выполнять либо по номеру записи, либо по контексту – содержанию определенного поля или группы полей. Если выполняется поиск по номеру, следует проверить, существует ли в файле запись с указанным номером (номер искомой записи не должен превышать размера файла в записях). Если поиск выполняется по контексту, то поиск можно прекратить, как только будет найдена первая запись, или продолжать поиск, до тех пор, пока не будут найдены все записи, соответствующие указанному критерию.
С Инициализацией структуры я разобрался.
Но из-за этого порядка работы запутался совсем.
Помогите разобраться!
// Вот структура, а дальше нужно вроде какие-то функции использовать. Однако я даже не знаю какие. Не работал с файлами и функциями еще.
#include <stdio.h> #include <stdlib.h> struct WORKER { char FIO [50]; // Фамилия и иницалы char Post [25]; // Должность long god; // год поступления на службу }
Решение задачи: «Описать структуру с именем WORKER»
textual
Листинг программы
#include <stdio.h> #include <conio.h> #include <io.h> #include <string.h> #include <stdlib.h> int Total=0; char FileName[100]; char *OpenFileMsg="\nFirst, open or create a new file"; struct WORKER { char F[20]; // familiya char Group[20]; //dolgnost short O[10]; // god }; struct WORKER Mas[500]; int Save(); void ShowHelp(void) /*цнрнбн*/ { printf("\nClick:\n1.-Add record;\n2.-Delete record;\n" "3.-Correct;\n4.-View list;\n5.-Sort(A-Z);\n" "6.-Information workers;\n" "7.-Create File;\n8.-Load.\n"); } /*--------------------------------------------------------------------------------------------------------------------------------*/ void Edit(int Num) { printf("\nEnter surname: \n"); scanf("%s", &Mas[Num].F[20]); printf("Enter post: \n"); scanf("%s", &Mas[Num].Group[20]); printf("Enter year: \n"); scanf("%i", &Mas[Num].O[10]); printf("Date edit.\n"); } /*---------------------------------------------------------------------------------------------------------------------------------*/ int Add() /*цнрнбн*/ { if (Total>499) { printf("\nToo many records.\n"); return 0; }; Edit(Total); Total++; if (Save()) { return 1; } else { Total--; printf("\nUnsave.\n"); return 0; } } /*---------------------------------------------------------------------------------------------------------------------------------*/ int Save() { FILE *out; int i; if ((out=fopen(FileName,"w+t"))==NULL) { return 0; } fseek(out,0,0); for(i=0;i<Total;i++) { fprintf(out,"\n%s;\n",&Mas[i].F[20]); fprintf(out,"%s;\n",&Mas[i].Group[20]); fprintf(out,"%i;\n",&Mas[i].O[10]); if (i!=Total-1) { fprintf(out,"\n"); } } fclose(out); return 1; } /*---------------------------------------------------------------------------------------------------------------------------------*/ int Load(char FN[100]) { char *s; FILE *fp; if ((fp=fopen(FN,"rt"))==NULL) { printf("Can not open file\n"); return 0; }; Total=0; while (!(feof(fp))) { fgets(s,255,fp); sscanf(s,"%s %s %i",&Mas[Total].F,&Mas[Total].Group,&Mas[Total].O); Total++; }; fclose(fp); strcpy(FileName,FN); return 1; } /*-----------------------------------------------------------------------------------------------------------------------------------*/ void Sort() { struct WORKER t; int i,count,swp; if (Total<2) { printf("\nToo few records to sort.\n"); return; } count=1; do { swp=0; for (i=0;i<Total-count;i++) { if (strcmp(Mas[i].F,Mas[i+1].F)>0) { swp++; t=Mas[i]; Mas[i]=Mas[i+1]; Mas[i+1]=t; } } count++; } while (swp>0); printf("\nSorted.\n"); } /*---------------------------------------------------------------------------------------------------------------------------------------*/ int Delete(int Num) { int i; if (Num>=Total) { printf("\nNo such record"); return 0; } for (i=Num;i<Total-1;i++) { Mas[i]=Mas[i+1]; } Total--; if (Save()) { return 1; } else { printf("\nUnsave."); Total++; return 0; } } /*--------------------------------------------------------------------------------------------------------------*/ void List() { int i; if (Total==0) { printf("\nThe list is empty.\n"); return; } for (i=0;i<Total;i++) { printf("%s\n",&Mas[i].F[20]); printf("%s\n",&Mas[i].Group[20]); printf("%i\n",&Mas[i].O[10]); } } /*--------------------------------------------------------------------------------------------------------------*/ void ShowInfo() { int god; int i, c; if (Total==0) { printf("\nList is empty, nothing to look"); return 0; } for (i=0;i<Total;i++) { c=0; printf("\nEnter year: "); scanf("%d", &god); if (god==Mas[i].O[10]) { printf("\n%s\n",&Mas[i].F[20]); printf("%s\n",&Mas[i].Group[20]); printf("%i\n",&Mas[i].O[10]); } else printf("Wrong.\n"); return 0; } } /*----------------------------------------------------------------------------------------------------------------------*/ void CreateNewFile() { FILE *NewFile; printf("Enter the file name\n"); char s[100]; scanf("%s",&s); if ((NewFile=fopen(s,"w+t"))==NULL) { printf("Failed to create a new file.\n"); getch(); } else { fclose(NewFile); Total=0; strcpy(FileName,s); printf("New file created.\n"); } } /*-----------------------------------------------------------------------------------------------------------------------*/ void LoadFile() { char s[100]; printf("Enter the file name\n"); scanf("%s",&s); if (!Load(s)) { printf("\nCould not load file"); } else { printf("file is loaded"); } } /*------------------------------------------------------------------------------------------------------------------------*/ int main(void) { int c,n; ShowHelp(); do { c=getch(); switch(c) { case 13: ShowHelp(); break; case 49: { if (strcmp(FileName,"")==NULL) { printf(OpenFileMsg); } else { Add(); } } break; case 50: { if (strcmp(FileName,"")==NULL) { printf(OpenFileMsg); } else { printf("\nSpecify the number of records: "); scanf("%d",&n); Delete(n); } } break; case 51: { if (strcmp(FileName,"")==NULL) { printf(OpenFileMsg); } else { printf("Specify the number of records: "); scanf("%d",&n); Edit(n); if (Save()==0) { printf("/nNot maintained"); } } } break; case 52: { if (strcmp(FileName,"")==NULL) { printf(OpenFileMsg); } else { List(); } } break; case 53: { if (strcmp(FileName,"")==NULL) { printf(OpenFileMsg); } else { Sort(); } } break; case 54: { if (strcmp(FileName,"")==NULL) { printf(OpenFileMsg); } else ShowInfo(); } break; case 55: { CreateNewFile(); } break; case 56: { LoadFile(); } break; } } while (c!=27); }
Объяснение кода листинга программы
Структура WORKER:
- F[20]: строка, в которой хранится фамилия работника.
- Group[20]: строка, в которой хранится должность работника.
- O[10]: короткое целое число, в котором хранится год рождения работника. Переменные:
- Total: общее количество записей в файле.
- FileName[100]: строка, в которой хранится имя файла.
- OpenFileMsg[200]: строка, содержащая сообщение, которое выводится при открытии файла. Функции:
- Save(): сохраняет данные из памяти в файл.
- ShowHelp(): выводит на экран список команд для работы с базой данных.
- Edit(int Num): открывает запись с указанным номером для редактирования.
- Add(): добавляет новую запись в базу данных.
- Load(char FN[100]): загружает данные из файла в память.
- Sort(): сортирует записи в базе данных по фамилии работника.
- Delete(int Num): удаляет запись с указанным номером из базы данных.
- List(): выводит на экран все записи из базы данных.
- ShowInfo(): выводит информацию о работнике по его году рождения.
- CreateNewFile(): создает новый файл.
- LoadFile(): загружает данные из файла в память.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д