|
Программирование >> Динамические структуры данных
Приведем текст программы: #include <stdio.h> #include <stdlib.h> #include <string.h> /* #1 nclude <windows.h> char bufRus[256]: char* Rus(const char* text) { CharToOem(text. bufRus): return bufRus: const int l name = 31; struct Man { char nanie[l name]; int birth day: float pay; Man* next; Man* add(Man* beg. const Man &man); int edit(Man* beg); Man* find(Man* beg. char* name. Man** prev): void find(Man* beg. int birth day); void find(Man* beg. float pay); void find man(Man* beg); void get name(char* name): int menuO; void print dbase(Man* beg): Man* read dbase(char* filename): Man read man(); Man* remove(Man* beg); int write dbase(char* filename. Man* beg): -------------------------------- int main(){ Man* beg == read dbase( dbase.txt if (Ibeg) return 1; while (true) { switch (menuO) { case 1: add(beg. read man()); case 2: beg = remove(beg); case 3: find man(beg); case 4: edit(beg); case 5: print dbase(beg): ..... Главная функция ios::in ios::nocreate); break break break break break case 6: write dbase( dbase.txt . beg); break; case 7: return 0; default: puts( Надо вводить число от 1 до 7 ): break; } return 0; ------------......-.....--------- Man* add(Man* beg. const Man& man) { Добавление сотрудника Man* pv = new Man; pv->next = 0; if (beg) { Man* temp = beg; while (temp->next) temp =- temp->next; temp->next = pv; else . beg = pv; return beg; --------------.......------ int edit(Man* beg) { char name[l name]. buf[80]: get name(name): Формирование нового элемента *pv = man; Список не пуст Поиск конца списка Привязывание нового элемента Список пуст Корректировка сведений Кого ищем? Man* prev; Man* pv = find(beg, name. &prev); if (Ipv) return 1; He нашли do { puts( BBeflHTe новый оклад ); 1 gets(buf): } while (l(pv->pay = (float)atof(buf))); return 0; ......------.......--................- Поиск сотрудника в списке по фамилии Man* find(Man* pv. char* name, Man** prev) { *prev = 0; while(pv){ if (strstr(pv->name. name)) if (pv->name[strlen(name)] == ) { printf( X30s!i;5i3;i0.2f\n . pv->name. pv->birth day. pv->pay); return pv; 7 Зое 784 *prev = pv: pv = pv->next: puts( Такого сотрудника нет\п ): return 0: -----.....- Поиск и вывод сотрудников по году рождения void find(Man* pv. int birth day) { while (pv){ if (pv->birth day < birth day) printf( !i;30sX5iX10.2f\n~. pv->name. pv->birth day. pv->pay): pv pv->next: ..............-----Поиск и вывод сотрудников по окладу void find(Man* pv. float pay) { while (pv) { if (pv->pay >- pay) printf( !i;30s!i;5i!i;i0.2f\n . pv\>name. pv->birth day. pv->pay): pv = pv->next: ----......-.....-...............----.............Поиск void find man(Man* beg) { char buf[l name]: int birth day. option: float pay: do { puts( l - поиск no фамилии. 2 - no году рождения.\n\ 3 - no окладу. 4 - отмена\п ): gets(buf): while ((option = atoi(buf))): switch (option) { case 1: get name(buf): Man *prev: Man *pv = find(beg. buf. Sprev): break: case 2: do { puts( Введите год рождения\п ): gets(buf): whi1e (!(bi rth day - atoi(buf))): find(beg. birth day): break: case 3: do { puts( Введите оклад\п ); gets(buf): while (!(pay - (float)atof(buf))): find(beg, pay): break: case 4: return: default: puts( неверный режииХп ): ......................... void get name(char* name) { puts( Введите фамилию И.О. gets(name): OemToChar(name, name): } ................-........ int menuO { char buf[10]: int option: do { puts( - Ill Запрос фамилии Вывод меню puts( l - добавление coтpyдникa\t 4 - корректировка сведений ): puts( 2 - удаление coтpyдникa\t\t 5 - вывод базы на экран ): puts( 3 - поиск coтpyдникa\t\t 6 - вывод базы в файл ): puts( \t\t\t 7 - выход ): gets(buf): option = atoi(buf): while (loption): return option: ........-------.......--..........Вывод базы на экран void print dbase(Man* beg) { Man* pv = beg: while (pv) { printf( !i;s!i;5i!i;i0.2f\n . pv->name. pv->birth day. pv->pay): pv = pv->next: ............--....................Чтение базы из файла Man* read dbase(char* filename) { FILE* fTn: Man man. *beg = 0: if ((fin = fopen(filename. r )) - 0 ) { pri ntf ( Нет файла %s\r\ . filename): return 0: while (!feof<fin)) { fgets (man. name. l name. fin): fscanf(fin. Xin . &man.birth day. &man,pay): beg - add(beg. man): fclose(fin): return beg: ..................... Man read man() { Man man: char buf[80]: Ввод информации о новом сотруднике get name(man.name): for (int i strlen(man.name): i < l name: i++) man.name[i] - : man.name[l name - 1] - \0*: do { puts( Введите год рождения ); gets(buf): while (!(man.birth day - atoi(buf))); do { puts( Введите оклад ): gets(buf): while (!(man.pay - (float)atof(buf))).: return man: ---V...............................Удаление сотрудника Man* remove(Man* beg) { char name [l name]: get name(name): Кого удаляем? Man* prev: Man* pv = find(beg. name. &prev): if (pv) { Если нашли if (pv - beg) Удаление из начала списка beg - beg->next: else Удаление из середины или конца списка prev->next - pv->next: delete pv: Освобождение памяти из-под элемента return beg: ...................................... Вывод базы в файл int write dbase(char *filename. Man *pv) { FILE *fout: if ((fout = fopen(filename. w )) == NULL ) { puts( Ошибка открытия файла ): return 1: while (pv) { fprintf(fout. pv = pv->next: fclose(fout): return 0: XsX5ill0.2f\n . pv->name. pv->birth day. pv->pay): ВНИМАНИЕ - Здесь так же, как и в задаче 6.1, необходимо учесть возможные различия в кодировке символов кириллицы. Если вы работаете в среде Visual С++, а текстовый файл базы данных подготовлен в текстовом редакторе с кодировкой ANSI, то вам нужно: а) раскомментировать оператор 3, б) подключить функцию Rus(), убрав скобки комментария в строках 1 и 2, в) заменить все строковые константы в операторах вывода на вызов функции Rus О, подставляя в качестве аргумента заменяемую константу. Обратите внимание, что и прототипы, и сами функции расположены в алфавитном порядке и снабжены хорошо читаемыми комментариями. Это упрощает отладку программы. В программе предусмотрена защита от дурака : если пользователь введет неверный режим или нечисловые символы там, где этого делать нельзя, программа корректно обработает эту ситуацию. При отладке вывода в файл (функция wri te dbase) рекомендуем вам задать имя, отличное от исходного файла, с тем, чтобы случайно его не испортить. На этом примере вы можете потренироваться в технологии создания программы сверху вниз : сначала отладить главную функцию, а затем постепенно добавлять к ней остальные. На месте еще не добавленных функций обычно ставятся так называемые заглушки - функции, единственный действием которых является вывод сообщения о том, что эта функция была вызвана. В качестве самостоятельного упражнения добавьте в эту программу функцию формирования упорядоченного списка. За образец можно взять аналогичную функцию, приведенную в Учебнике на с.119. Забегая немного вперед, предложим вам более грамотное решение, касающееся использованной в этой задаче структуры данных. В программах, рассмотренных ранее, под именем Man мы описывали структуру, содержащую сведения о сотруднике. В этой задаче мы в угоду своим интересам добавили в нее поле указателя, которое, вообще говоря, к сведениям о сотруднике отношения не имеет. Более правильным было бы оставить структуру Man неизменной и унаследовать от нее структуру Node, которая и являлась бы элементом списка: struct Man { char name[l name]: int birth day:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |