Разработка программы для создания и работы с двусвязным списком, состоящим из структур (Структура содержит фамилию и 4 оценки), страница 2

int fileopen()   - данная процедура открывает исходный файл для чтения и считывает из него информацию о студентах. Далее открывается файл и посимвольно считываются из него данные, сначала о фамилии студента, далее об оценках. Так как в файле данные разделены запятыми, то и каждое поле считывается до запятой. Если встречается конец строки, то это является сигналом о том, что запись окончена. Считанные данные вводятся присваиваются полям структуры, новый элемент которой создается перед считыванием из файла новой строки. После того, как данные записаны происходит определение указателей, которые привязываются к предыдущему и последующим элементам. Таким образом формируется двунаправленный список. Если элемент списка первый по счету, то он объявляется головой списка. После окончания файла последний элемент списка объявляется хвостом списка.

Int screen() – данная процедура позволяет просматривать полученные списки. Перед началом выполнения программа обращается к голове списка. Вывод осуществлен в виде таблицы. Сначала выводится заголовок, затем построчно данные из списка. После вывод одной структуры происходит продвижение по списку вперед. После вывода 20 записей выполнение останавливается, пользователю предлагается нажать любую клавишу. Затем выводятся заголовок и следующие 20 записей. Так продолжается до тех пор, пока все записи не будут выведены на экран.

int add() - данная процедура осуществляет добавление информации о новом студенте в конец списка и в исходный файл. В начале выполнения отображается рабочее окно функции. Далее пользователю предлагается ввести информацию о студенте. После этого файл открывается для добавления и в конец файла дописывается новая запись. Введенная пользователем информация сохраняется так же в полях созданной структуры. После того как файл закрыт и структура заполнена необходимо добавить ее в конец списка. Для этого обращаемся к хвосту списка и перенаправляем его указатели таким образом, чтобы новый элемент стал последним. Теперь он будет хвостом списка. Алгоритм перенаправления подробно описан в предыдущем разделе.

int remove() – данная процедура позволяет скорректировать данные списка, а именно – удалить из него всех неуспевающих, то есть студентов имеющих двойки по всем предметам. Процедура перебирает элементы списка поочередно, от начала к концу. Если встречается неуспевающий студент, то данный элемент удаляется из списка путем перенаправления указателей предыдущего и последующего элементов, а сам элемент удаляется из памяти. Так же следует учитывать расположение удаляемого элемента, если он находится в голове или хвосте списка, то алгоритм перенаправления меняется. Исходный файл сформирован таким образом, чтобы были удалены данные из всех возможных мест.

Алгоритм перенаправления подробно описан в предыдущем разделе.

Следует отметить, что данная процедура удаляет данные только из списка, но не из файла. Это сделано для того чтобы можно было несколько раз продемонстрировать выполнение программы, не меняя перед каждой демонстрацией содержимого исходного файла.

int head() – функция вывода на экран заголовка таблицы.


4.  Исходный модуль программы

#include <conio.h>

#include <stdio.h>

#include <dos.h>

#include <bios.h>

#include <string.h>

#include <stdlib.h>

#include <iostream.h>

#include <fstream.h>

//uslovie peredvizheniya po punktam menu

#define STOP if(kod<0) kod=0; if(kod>=kodmax) kod=kodmax-1

#define VIDEO 0x10

//strucktura student

struct spis{

char fam[20];                       //familiya studenta

int ocenka1;                    //ocenka po 1 predmetu

int ocenka2;                    //ocenka po 2 predmetu

int ocenka3;                    //ocenka po 3 predmetu

int ocenka4;                    //ocenka po 4 predmetu

struct spis *next;                  //ukazatel na sleduyushiy element

struct spis *prev;                  //ukazatel na predidushiy element

};

//shablon strukturi okno

typedef struct {

int LtRow,LtCol;                 //koordinati verhnego levogo ugla

int Width;                            //shirina okna

int Height;                            //visota okna

int TypteBorder;                  // tip ramki

char *Titl;                            //zagolovok

int SimvolColor;                  //cvet simvolov

int Background;                               //cvetfona

int n;                                     //kolichestvo tem menu

char **Text;                                    //Textovoe soderzhanie okna

}Menu_W;

//punkti menu

char *mnu1[]={"File \n",

                "Add \n",

                "Correct \n"};

//opisanie prototipov funkciy

int ShowWindow(Menu_W Menu);

int Select_tema(Menu_W Menu,int kod);

int Navig(Menu_W Menu);

int dile(int kod);

int fileopen();

int screen();

int add();

int remove();

int head();

Menu_W Menu={1,1,79,24,0,"Kursovaya rabota",RED,BLUE,0,NULL},

Menu1={2,2,16,4,0,"Deystvie",BLACK,LIGHTGRAY,3,mnu1},

Menu2={1,25,79,0,0,"Podskazka",RED,LIGHTGRAY,0,NULL},

Menu3={1,1,79,24,0,"Sozdanie spiska",BLACK,CYAN,0,NULL},

Menu4={1,1,79,24,0,"Dobavlenie v konec spiska",BLACK,CYAN,0,NULL},

Menu5={1,1,79,24,0,"Udalenie neuspevayushih",BLACK,CYAN,0,NULL},