Курсовой проект по дисциплине «Структуры и организация данных в эвм» Тема

Вид материалаКурсовой проект

Содержание


Фамилия Имя Отчество Руководитель проекта: старший преподаватель
Белорусский национальный технический университет Факультет информационных технологий и робототехники
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА к курсовому проекту по дисциплине «Структуры и организация данных в ЭВМ»
Подпись Фамилия Имя Отчество
Тема проекта
Содержание расчетно-пояснительной записки
Перечень графического материала
Консультанты по проекту (с указанием разделов проекта)
Дата выдачи задания
Постановка задачи
Сценарий работы ПО
Предусмотреть наличие Helpa по структуре ЛОС.
Односвязный список
Кольцевой связный список
Применение линейных списков
Состав Dеlphi-проекта
Helpcontent.htm – справка
Статические данные и структуры
Логические структуры данных
Рис. 4.1. Главное окно приложения
...
Полное содержание
Подобный материал:

Белорусский национальный технический университет

Факультет информационных технологий и робототехники

Кафедра «Программное обеспечение вычислительной техники и
автоматизированных систем»

КУРСОВОЙ ПРОЕКТ

по дисциплине

«Структуры и организация данных в ЭВМ»

Тема: «_______________________________________________________________________________________________________________________________»

Выполнил: студент 3 курса ФИТР, группы 307_______

_____________________________

^

Фамилия Имя Отчество




Руководитель проекта: старший преподаватель

Романов А. В.




Минск 2009




^

Белорусский национальный технический университет

Факультет информационных технологий и робототехники

Кафедра «Программное обеспечение вычислительной техники и
автоматизированных систем»




^

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовому проекту по дисциплине

«Структуры и организация данных в ЭВМ»

Тема: «_______________________________________________________________________________________________________________________________»




Выполнил:

студент 3 курса ФИТР, группы 307____ _________ __________________

^

Подпись Фамилия Имя Отчество

Руководитель: ________ Романов А. В.

Подпись







Минск 2009





Белорусский национальный технический университет







Факультет: ФИТР

Кафедра «Программное обеспечение

«УТВЕРЖДАЮ»

вычислительной техники и




автоматизированных систем»

Зав. кафедрой ____________________

(подпись)










«9» сентября 2009 г.






З А Д А Н И Е

по курсовому проектированию





Студенту гр. 307__________________________







1. ^ Тема проекта













2. Сроки сдачи студентом законченного проекта 25.12.2009

3. Исходные данные к проекту _________________________________________

Базовая структура данных 

Метод сортировки 

Примечания:

4. ^ Содержание расчетно-пояснительной записки:

ВВЕДЕНИЕ

1 Состав проекта программного обеспечения

2 Статические данные и структуры

3 Логические структуры данных

4 Алгоритмы обработки Базовой структуры

5 Руководство пользователя

Заключение

Литература

Приложения






5. ^ Перечень графического материала:

Схемы логических структур

Логические схемы операций













6. ^ Консультанты по проекту (с указанием разделов проекта)

Романов Александр Васильевич  все разделы













7. ^ Дата выдачи задания __________________________







8. Календарный график работы над проектом (с указанием трудоемкости отдельных этапов)

Изучение литературы и проектирование ПО  20 % (до 15.10.2009 )

Кодирование и отладка  40 % (до 15.11.09 )

Тестирование  30 % (до 5.12.09 )

Оформление пояснительной записки  10 % (до 25.12.09 )

























Руководитель ______________________







Задание принял к исполнению _________________________________________

(дата и подпись студента)



^

ПОСТАНОВКА ЗАДАЧИ




Ставится задача написать программу, реализующую Графическое моделирование операций в односвязном списке.




^

Сценарий работы ПО:

Задается количество элементов линейного односвязного списка (ЛОС)  до 10-ти элементов. Прорисовывается логическая структура ЛОС с единственным информационным полем целого типа  полем ключа. Показываются неповторяющиеся значения ключей на логической структуре; эти значения генерируются программным датчиком из диапазона [1, 99].

Обеспечивается возможность выбора текущей операции: передвижение на один элемент, вставка, дополнение, удаление, сортировка. Процесс выполнения выбранной операции отображается на логической структуре ЛОС по шагам. Шаг инициализируется щелчком по предопределенной командной кнопке.

^

Предусмотреть наличие Helpa по структуре ЛОС.




СОДЕРЖАНИЕ



ВВЕДЕНИЕ..............................................................................................7
  1. Состав Dеlphi-проекта ..........................................................11
  2. Статические данные и структуры.................................12
  3. Логические структуры данных.......................................13
  4. Алгоритмы обработки основных структур ...........14
  5. Руководство пользователя.................................................28
  6. ЗАКЛЮЧЕНИЕ.....................................................................................30
  7. Литература.......................................................................................31
  8. Приложение (исходные тексты всех модулей)...32



ВВЕДЕНИЕ




В информатике, cвя́зный спи́сок — структура данных, состоящая из узлов, каждый из которых содержит как собственные данные, так и одну или две ссылки («связки») на следующее и/или предыдущее поле. Принципиальным преимуществом перед массивом является структурная гибкость: порядок элементов связного списка может не совпадать с порядком расположения элементов данных в памяти компьютера, а порядок обхода списка всегда явно задаётся его внутренними связями.




Виды связных списков


^

Односвязный список



В односвязном списке можно передвигаться только в сторону конца списка. Узнать адрес предыдущего элемента из данного невозможно.

Двусвязный список

По двусвязному списку можно передвигаться в любом направлении — как к началу, так и к концу. В этом списке проще производить удаление и перестановку элементов, т.к. всегда известны адреса тех элементов списка, указатели которых направлены на изменяемый элемент.

^

Кольцевой связный список

Разновидностью связных списков является кольцевой (циклический, замкнутый) список. Он тоже может быть односвязным или двусвязным. Последний элемент кольцевого списка содержит указатель на первый, а первый (в случае двусвязного списка) — на последний.






Достоинства
  • лёгкость добавления и удаления элементов;
  • размер ограничен только объёмом памяти компьютера и разрядностью указателей;



Недостатки
  • сложность определения адреса элемента по его индексу (номеру) в списке;
  • на поля-указатели (указатели на следующий и предыдущий элемент) расходуется дополнительная память (в массивах, например, указатели не нужны);
  • работа со списком медленнее, чем с массивами, так как к любому элементу списка можно обратиться, только пройдя все предшествующие ему элементы элементы списка могут быть расположены в памяти разреженно, что окажет негативный эффект на кэширование процессора над связными списками гораздо труднее (хотя и в принципе возможно) производить параллельные векторные операции, такие как вычисление суммы.



^ Применение линейных списков


Линейные списки находят широкое применение в приложениях, где непредсказуемы требования на размер памяти, необходимой для хранения данных; большое число сложных операций над данными, особенно включений и исключений. На базе линейных списков могут строиться стеки, очереди и деки. Представление очереди с помощью линейного списка позволяет достаточно просто обеспечить любые желаемые дисциплины обслуживания очереди. Особенно это удобно, когда число элементов в очереди трудно предсказуемо.




  1. ^ Состав Dеlphi-проекта



тип приложения – SDI


Состав проекта:


about.pas – ОКНО ABOUT

sdimain.pas – ГЛАВНОЕ ОКНО ПРИЛОЖЕНИЯ И ВСЕ ОСНОВНЫЕ ОПЕРАЦИИ СО СПИСКОМ

sdimain.dfm – ГЛАВНАЯ ФОРМА ПРИЛОЖЕНИЯ

^ HELPCONTENT.HTM – СПРАВКА


Главная форма приложения:




Главный модуль приложения:

unit SDIMAIN;


  1. ^ Статические данные и структуры


Запись для хранения элемента линейного односвязного списка:


TElement = Record

Data : Telem;

Next : TList;

End;


Хранимый элемент типа целое

Telem = integer;


Указатель на элемент списка

TList = ^TElement;


  1. ^ Логические структуры данных





Рис. 1: Представление односвязного списка в памяти


На рис. 1 приведена структура односвязного списка. На нем поле INF - информационное поле, данные, NEXT - указатель на следующий элемент списка. Каждый список должен иметь особый элемент, называемый указателем начала списка или головой списка, который обычно по формату отличен от остальных элементов. В поле указателя последнего элемента списка находится специальный признак nil, свидетельствующий о конце списка.





Также введен указатель m_Head, который хранит адрес элемента Head (голова) списка.

m_nCount, m_nCurrCount – переменные целочсленного типа, необходимые для хранения

кол-ва элементов очереди и текущего кол-ва элементов очереди соответственно.
  1. Алгоритмы обработки основных структур













































  1. Руководство пользователя


Приложение является SDI приложением и при запуске можно увидеть его главное окно (рис. 4.1).





^

Рис. 4.1. Главное окно приложения


Структура приложения состоит из окна LinearList.

В главной форме расположены группы:

Настройки

Список

Операции

Настройки

Для задания необходимого кол-ва элементов списка необходимо задать его значение в поле и нажать УСТАНОВИТЬ. Если кол-во элементов равно 0 – добавление эл-ов в список невозможно.


^ Список

В этой группе отобрражаются 3 элемента линейного списка + текущее кол-во эл-ов.


Операции


Тут производится управление списком – операции:

Добавления, редакстрования, удаления, сортировки, перемещения по списку влево/вправо.

Элемент управления ЭЛЕМЕНТ синхронизирован со 2-м элементов в группе СПИСОК.

Для добавления эл-та в список необходимо набрать его значение в поле ЭЛЕМЕНТ и нажать ДОБАВИТЬ.

Для редактирования эл-та в списке необходимо набрать его значение в поле ЭЛЕМЕНТ и нажать РЕДАКТИРОВАТЬ.

Для удаления эл-та из списка необходимо нажать УДАЛИТЬ.

Для сортировки списка по возрастанию эл-ов необходимо нажать СОРТИРОВАТЬ.
  1. ЗАКЛЮЧЕНИЕ


Поставленная задача была полностью решена, результатом чего является программа LinearList, реализующую Графическое моделирование операций в односвязном линейном списке.

Программа полностью работоспособна под операционными системами Windows 98/2000/ХР. Для установки программы требуется около 2.5 мегабайт дискового пространства и около 3 мегабайт оперативной памяти. Для дальнейшей работы может понадобиться дополнительное место на жёстком диске для хранения баз данных. Минимальные системные требования – процессор на уровне Pentium I, 32Мб оперативной памяти, графический видеоадаптер 4Мб, операционная система Windows 2000.
  1. ЛИТЕРАТУРА



  1. А.Я. АрхангельскийПрограммирование в Delphi 7. — М.: ООО Бином-Пресс, 2003 г..
  2. Delphi help
  3. Кэнту М. Delphi 7 для профессионалов
  4. Архангельский А.Я. Delphi 6. Справочное пособие.  М.: ЗАО «Издательсво БИНОМ», 2001г.
  5. Структуры и организация данных в компьютере. Учебное пособие / Романов А.В., Лакин В.И. – Мн.: НПООО «Пион», 2005г.



  1. Приложение (исходные тексты всех модулей)


unit SDIMAIN;


interface


uses Windows, Classes, Graphics, Forms, Controls, Menus,

Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls, ImgList, StdActns,

ActnList, ToolWin, {DList} SysUtils, shellapi;


type

Telem = integer;


TList = ^TElement;

TElement = Record

Data : Telem;

Next, Prev : TList;

End;


TSDIAppForm = class(TForm)

OpenDialog: TOpenDialog;

SaveDialog: TSaveDialog;

ToolBar1: TToolBar;

ToolButton9: TToolButton;

ToolButton1: TToolButton;

ToolButton2: TToolButton;

ToolButton3: TToolButton;

ToolButton4: TToolButton;

ToolButton5: TToolButton;

ToolButton6: TToolButton;

ActionList1: TActionList;

FileNew1: TAction;

FileOpen1: TAction;

FileSave1: TAction;

FileSaveAs1: TAction;

FileExit1: TAction;

EditCut1: TEditCut;

EditCopy1: TEditCopy;

EditPaste1: TEditPaste;

HelpAbout1: TAction;

StatusBar: TStatusBar;

ImageList1: TImageList;

MainMenu1: TMainMenu;

File1: TMenuItem;

FileNewItem: TMenuItem;

FileOpenItem: TMenuItem;

FileSaveItem: TMenuItem;

FileSaveAsItem: TMenuItem;

N1: TMenuItem;

FileExitItem: TMenuItem;

Edit1: TMenuItem;

CutItem: TMenuItem;

CopyItem: TMenuItem;

PasteItem: TMenuItem;

Help1: TMenuItem;

ToolBar2: TToolBar;

ToolButton7: TToolButton;

ToolButton8: TToolButton;

ToolButton10: TToolButton;

ToolButton11: TToolButton;

ToolButton12: TToolButton;

ToolButton13: TToolButton;

ToolButton14: TToolButton;

GroupBox1: TGroupBox;

EditElement1: TEdit;

EditElement2: TEdit;

EditElement3: TEdit;

GroupBox2: TGroupBox;

Label1: TLabel;

ButtonAdd: TButton;

ButtonEdit: TButton;

ButtonDelete: TButton;

ButtonLeft: TButton;

ButtonRight: TButton;

EditElement: TEdit;

GroupBox3: TGroupBox;

Label2: TLabel;

Edit6: TEdit;

ButtonSet: TButton;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

EditCurrentCount: TEdit;

ButtonSort: TButton;

procedure FileNew1Execute(Sender: TObject);

procedure FileOpen1Execute(Sender: TObject);

procedure FileSave1Execute(Sender: TObject);

procedure FileExit1Execute(Sender: TObject);

procedure HelpAbout1Execute(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure ButtonAddClick(Sender: TObject);


Procedure InitList( var L:Tlist );

function ListPrint2(l:Tlist):real;

Procedure AddAfter(X : Telem; Var L : TList);

Procedure Add(X : Telem; Var L : TList);

Procedure GotoFirst(var l:tlist);

procedure ListPrintLeft(l:Tlist);

procedure ListPrintRight(l:Tlist);

Procedure ListDestroy(var l:tlist);


procedure ButtonEditClick(Sender: TObject);

procedure ButtonDeleteClick(Sender: TObject);

procedure ButtonSetClick(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure ButtonLeftClick(Sender: TObject);

procedure ButtonRightClick(Sender: TObject);

procedure Help1Click(Sender: TObject);

procedure ButtonSortClick(Sender: TObject);


private

{ Private declarations }

public

{ Public declarations }

end;


var

SDIAppForm: TSDIAppForm;

m_L:Tlist;

m_Head:TList;

m_nCount, m_nCurrCount, m_nCurrPos:integer;


implementation


uses about;


{$R *.dfm}


procedure TSDIAppForm.FileNew1Execute(Sender: TObject);

begin

{ Do nothing }

end;


procedure TSDIAppForm.FileOpen1Execute(Sender: TObject);

begin

OpenDialog.Execute;

end;


procedure TSDIAppForm.FileSave1Execute(Sender: TObject);

begin

SaveDialog.Execute;

end;


procedure TSDIAppForm.FormClose(Sender: TObject; var Action: TCloseAction);

begin

ListDestroy(m_L);

end;


procedure TSDIAppForm.FormCreate(Sender: TObject);

begin

m_nCurrCount:=0;

m_nCurrPos:=2;

EditCurrentCount.Text:=IntToStr(0);

end;


procedure TSDIAppForm.ButtonAddClick(Sender: TObject);

var

res:real;

begin

Add(StrToInt(EditElement.Text), m_L);

ListPrint2(m_L);

end;


procedure TSDIAppForm.ButtonDeleteClick(Sender: TObject);

label end_;

begin

if(m_L=nil) then goto end_;

if(m_L.Next=nil) then

begin

m_L:=nil;

goto end_;

end;

m_L:=m_Head;

if(m_L.Next=m_L) then

begin

m_L:=nil;

m_nCurrCount:=m_nCurrCount-1;

EditCurrentCount.Text:=IntToStr(m_nCurrCount);

goto end_;

end;

m_L:=m_Head^.next;

if( (m_L^.prev.Next<>nil)) then

if(m_L^.next=nil) then

m_L^.prev.Next:=nil

else

m_L^.prev.Next:=m_L^.next;

if(m_L^.next<>nil) then

if( (m_L^.next.Prev<>nil) AND (m_L^.prev<>nil)) then

m_L^.next.Prev:=m_L^.prev;

m_nCurrCount:=m_nCurrCount-1;

EditCurrentCount.Text:=IntToStr(m_nCurrCount);

end_: ListPrint2(m_L);

end;


procedure TSDIAppForm.ButtonEditClick(Sender: TObject);

begin

m_L:=m_Head^.next;

m_L^.Data:=StrToInt(EditElement.text);

ListPrint2(m_L);

end;


procedure TSDIAppForm.ButtonLeftClick(Sender: TObject);

begin

if(m_nCurrCount>2) then

ListPrintLeft(m_L);

end;


procedure TSDIAppForm.ButtonRightClick(Sender: TObject);

begin

if(m_nCurrCount>2) then

ListPrintRight(m_L);

end;


function TSDIAppForm.ListPrint2(l:Tlist):real;

label end_;

var

i:integer;

ptr: Tlist;

begin


EditElement1.text:='';

EditElement2.text:='';

EditElement3.text:='';


if(m_L=nil) then goto end_;

ptr:=m_Head^.next;

L:=m_Head;


if(L=nil) then goto end_;

i:=1;

if( L^.Next = L) then

EditElement1.text:=IntToStr(L^.data);

While ptr <> m_Head do

begin

if(i=1)then EditElement1.text:=IntToStr(ptr^.prev.data);

if(i=1)then

begin

EditElement2.text:=IntToStr(ptr^.data);

EditElement.text:=EditElement2.text;

end;

if(i=2)then EditElement3.text:=IntToStr(ptr^.data);

result:= L^.data;

i:=i+1;

if(L^.next=L) then break;

ptr:=ptr^.next

end;

end_: result:=0;

end;


Procedure TSDIAppForm.ListPrintLeft(l:Tlist);

label end_;

var

i, j:integer;

ptr: Tlist;

begin


EditElement1.text:='';

EditElement2.text:='';

EditElement3.text:='';


if(m_L=nil) then goto end_;

ptr:=m_Head;

for j := 1 to m_nCurrPos do

ptr:=ptr^.next;

L:=m_Head;

if(m_nCurrPos+1>m_nCount) then

m_nCurrPos:=1

else

m_nCurrPos:=m_nCurrPos+1;


if(L=nil) then goto end_;

i:=1;

if( L^.Next = L) then

EditElement1.text:=IntToStr(L^.data);

if(ptr^.prev<>nil) then EditElement1.text:=IntToStr(ptr^.prev.data);

EditElement2.text:=IntToStr(ptr^.data);

EditElement.text:=EditElement2.text;

if(ptr^.next<>nil) then EditElement3.text:=IntToStr(ptr^.next.data);

end_:

end;


Procedure TSDIAppForm.ListPrintRight(l:Tlist);

label end_;

var

i, j, k :integer;

ptr: Tlist;

begin


EditElement1.text:='';

EditElement2.text:='';

EditElement3.text:='';


if(m_L=nil) then goto end_;

ptr:=m_Head;


if(m_nCurrPos-1>0) then

m_nCurrPos:=m_nCurrPos-1

else

m_nCurrPos:=m_nCount;

k:=1;

while k

begin

ptr:=ptr^.next;

k:=k+1;

end;

L:=m_Head;


if(L=nil) then goto end_;

i:=1;

if( L^.Next = L) then

EditElement1.text:=IntToStr(L^.data);

if(ptr^.prev<>nil) then EditElement1.text:=IntToStr(ptr^.prev.data);

EditElement2.text:=IntToStr(ptr^.data);

EditElement.text:=EditElement2.text;

if(ptr^.next<>nil) then EditElement3.text:=IntToStr(ptr^.next.data);

end_:

end;


Procedure TSDIAppForm.AddAfter(X : Telem; Var L : TList);

label end_;

Var P : TList;

Begin

if(m_nCurrCount>=m_nCount) then goto end_;

if l<>nil then

begin

m_nCurrCount:=m_nCurrCount+1;

P:=New(TList);

P^.Data:=X;

If (L^.Next = Nil) Then

Begin

L^.Next:=P;

P^.Prev:=L;

P^.Next:=Nil;

End

Else

Begin

P^.Next:=L^.Next;

L^.Next^.Prev:=P;

P^.Prev:=L;

L^.Next:=P;

End;

end else writeln('Error!');

end_:

End;


Procedure TSDIAppForm.Add(X : Telem; Var L : TList);

label end_;

Var P : TList;

Begin

if(m_nCurrCount>=m_nCount) then goto end_;

if L=nil then

begin

m_nCurrCount:=m_nCurrCount+1;

EditCurrentCount.Text:=IntToStr(m_nCurrCount);

L:=Nil;

L:=New(TList);

L^.Next:=L;

L^.Prev:=L;

L^.Data:=X;

m_Head:=L;

end

else

begin

m_nCurrCount:=m_nCurrCount+1;

EditCurrentCount.Text:=IntToStr(m_nCurrCount);

P:=New(TList);

P^.Data:=X;

If (L^.Next = Nil) Then

Begin

L^.Next:=P;

P^.Prev:=L;

P^.Next:=Nil;

End

Else

Begin

P^.prev := L^.prev; { <--- Предыдущее для вновь добавленного значения }

P^.next := L; { <--- Следующее для вновь добавленного - всегда начало списка }

L^.prev^.next := P; { <--- Обновляем "бывший" последний элемент }

L^.prev := P; { <--- Предыдущий для первого элемента }

End;

end;

end_:

End;


Procedure GotoLast(var l:tlist);

begin

While L^.next <> Nil Do L:=L^.Next

end;


Procedure TSDIAppForm.ListDestroy(var l:tlist);

var

ptr:Tlist;

label end_;

begin

if(L=nil) then goto end_;

ptr:=m_Head;

L:=m_Head;

While ptr.next <> m_Head do

Begin

ptr:=L;

L:=L^.Next;

Dispose(ptr);

End;

end_:

m_L:=nil;

m_nCurrCount:=0;

end;


procedure TSDIAppForm.ButtonSetClick(Sender: TObject);

begin

m_nCount:=StrToInt(Edit6.Text);

end;


procedure TSDIAppForm.ButtonSortClick(Sender: TObject);

var Arr: array [1..10] of integer;

ptr, ptr_add:Tlist;

i, j, k, t, count_temp :integer;

begin


for i := 1 to 10 do Arr[i]:=-1;

ptr:=m_Head;

ptr_add:=m_Head;

k:=1;

While ptr.next <> m_Head do

Begin

ptr:=ptr_add;

Arr[k]:=ptr.Data;

ptr_add:=ptr_add^.next;

k:=k+1;

End;

//сортировка

for j:=1 to m_nCurrCount-1 do

for i:=1 to m_nCurrCount-j do

if (Arr[i] > Arr[i+1]) then

begin

t := Arr[i];

^ Arr[i] := Arr[i+1];

Arr[i+1] := t

end;

count_temp:=m_nCurrCount;

ListDestroy(m_L);

i:=1;

While i <= count_temp do

Begin

Add(Arr[i], m_L);

i:=i+1;

End;

ListPrint2(m_L);

end;


procedure TSDIAppForm.FileExit1Execute(Sender: TObject);

begin

Close;

end;


procedure TSDIAppForm.Help1Click(Sender: TObject);

begin

ShellExecute(0,0,'explorer.exe','HelpContent.htm',0,SW_SHOW);

end;


procedure TSDIAppForm.HelpAbout1Execute(Sender: TObject);

begin

AboutBox.ShowModal;

end;


Procedure TSDIAppForm.GotoFirst(var l:tlist);

begin

While L^.Prev<>NIL Do L:=L^.Prev

end;


Procedure ListPrint(l:Tlist);

begin

While L^.prev <> Nil Do L:=L^.prev;

While L <> Nil Do

begin

write(L^.data, ' ');

L:=L^.next

end

end;


Procedure TSDIAppForm.InitList( var L:Tlist );

begin

L:=Nil;

L:=New(TList);

L^.Next:=L;

L^.Prev:=L;

L^.Data:=0;

end;


end.