Программирование >>  Динамические структуры данных 

1 ... 25 26 27 [ 28 ] 29 30 31 ... 38


Приведем текст программы:

#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:



1 ... 25 26 27 [ 28 ] 29 30 31 ... 38

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика