Курсовой проект по дисциплине «Структуры и организация данных в эвм» Тема
Вид материала | Курсовой проект |
- Курсовой проект по дисциплине "Организация эвм, комплексов и систем", 549.85kb.
- Курсовой проект по дисциплине «Констуирование и производство эвм» Тема: Разработка, 321.45kb.
- Курсовой проект по дисциплине "Схемотехника эвм", 121.85kb.
- Курсовой проект по курсу "Организация и методика производственного обучения" ( 0308., 237.65kb.
- Методическая разработка по дисциплине «Информатика» Тема: «Организация данных в виде, 447.07kb.
- Методические указания по выполнению курсового проекта по учебной дисциплине " организация, 157.65kb.
- Курсовой проект по дисциплине тема, 12.37kb.
- Курсовой проект по дисциплине Тема, 10.97kb.
- Курсовой проект (работа) по дисциплине, 15.61kb.
- Об использовании структур представления данных для решения возникающих задач; знать, 116.73kb.
Белорусский национальный технический университет
Факультет информационных технологий и робототехники
Кафедра «Программное обеспечение вычислительной техники и
автоматизированных систем»
КУРСОВОЙ ПРОЕКТ
по дисциплине
«Структуры и организация данных в ЭВМ»
Тема: «_______________________________________________________________________________________________________________________________»
Выполнил: студент 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
- Состав Dеlphi-проекта ..........................................................11
- Статические данные и структуры.................................12
- Логические структуры данных.......................................13
- Алгоритмы обработки основных структур ...........14
- Руководство пользователя.................................................28
- ЗАКЛЮЧЕНИЕ.....................................................................................30
- Литература.......................................................................................31
- Приложение (исходные тексты всех модулей)...32
ВВЕДЕНИЕ
В информатике, cвя́зный спи́сок — структура данных, состоящая из узлов, каждый из которых содержит как собственные данные, так и одну или две ссылки («связки») на следующее и/или предыдущее поле. Принципиальным преимуществом перед массивом является структурная гибкость: порядок элементов связного списка может не совпадать с порядком расположения элементов данных в памяти компьютера, а порядок обхода списка всегда явно задаётся его внутренними связями.
Виды связных списков
^
Односвязный список
В односвязном списке можно передвигаться только в сторону конца списка. Узнать адрес предыдущего элемента из данного невозможно.
Двусвязный список
По двусвязному списку можно передвигаться в любом направлении — как к началу, так и к концу. В этом списке проще производить удаление и перестановку элементов, т.к. всегда известны адреса тех элементов списка, указатели которых направлены на изменяемый элемент.
^Кольцевой связный список
Разновидностью связных списков является кольцевой (циклический, замкнутый) список. Он тоже может быть односвязным или двусвязным. Последний элемент кольцевого списка содержит указатель на первый, а первый (в случае двусвязного списка) — на последний.
Достоинства
- лёгкость добавления и удаления элементов;
- размер ограничен только объёмом памяти компьютера и разрядностью указателей;
Недостатки
- сложность определения адреса элемента по его индексу (номеру) в списке;
- на поля-указатели (указатели на следующий и предыдущий элемент) расходуется дополнительная память (в массивах, например, указатели не нужны);
- работа со списком медленнее, чем с массивами, так как к любому элементу списка можно обратиться, только пройдя все предшествующие ему элементы элементы списка могут быть расположены в памяти разреженно, что окажет негативный эффект на кэширование процессора над связными списками гораздо труднее (хотя и в принципе возможно) производить параллельные векторные операции, такие как вычисление суммы.
^ Применение линейных списков
Линейные списки находят широкое применение в приложениях, где непредсказуемы требования на размер памяти, необходимой для хранения данных; большое число сложных операций над данными, особенно включений и исключений. На базе линейных списков могут строиться стеки, очереди и деки. Представление очереди с помощью линейного списка позволяет достаточно просто обеспечить любые желаемые дисциплины обслуживания очереди. Особенно это удобно, когда число элементов в очереди трудно предсказуемо.
- ^ Состав Dеlphi-проекта
тип приложения – SDI
Состав проекта:
about.pas – ОКНО ABOUT
sdimain.pas – ГЛАВНОЕ ОКНО ПРИЛОЖЕНИЯ И ВСЕ ОСНОВНЫЕ ОПЕРАЦИИ СО СПИСКОМ
sdimain.dfm – ГЛАВНАЯ ФОРМА ПРИЛОЖЕНИЯ
^ HELPCONTENT.HTM – СПРАВКА
Главная форма приложения:
Главный модуль приложения:
unit SDIMAIN;
- ^ Статические данные и структуры
Запись для хранения элемента линейного односвязного списка:
TElement = Record
Data : Telem;
Next : TList;
End;
Хранимый элемент типа целое
Telem = integer;
Указатель на элемент списка
TList = ^TElement;
- ^ Логические структуры данных
Рис. 1: Представление односвязного списка в памяти
На рис. 1 приведена структура односвязного списка. На нем поле INF - информационное поле, данные, NEXT - указатель на следующий элемент списка. Каждый список должен иметь особый элемент, называемый указателем начала списка или головой списка, который обычно по формату отличен от остальных элементов. В поле указателя последнего элемента списка находится специальный признак nil, свидетельствующий о конце списка.
Также введен указатель m_Head, который хранит адрес элемента Head (голова) списка.
m_nCount, m_nCurrCount – переменные целочсленного типа, необходимые для хранения
кол-ва элементов очереди и текущего кол-ва элементов очереди соответственно.
- Алгоритмы обработки основных структур
- Руководство пользователя
Приложение является SDI приложением и при запуске можно увидеть его главное окно (рис. 4.1).
^
Рис. 4.1. Главное окно приложения
Структура приложения состоит из окна LinearList.
В главной форме расположены группы:
Настройки
Список
Операции
Настройки
Для задания необходимого кол-ва элементов списка необходимо задать его значение в поле и нажать УСТАНОВИТЬ. Если кол-во элементов равно 0 – добавление эл-ов в список невозможно.
^ Список
В этой группе отобрражаются 3 элемента линейного списка + текущее кол-во эл-ов.
Операции
Тут производится управление списком – операции:
Добавления, редакстрования, удаления, сортировки, перемещения по списку влево/вправо.
Элемент управления ЭЛЕМЕНТ синхронизирован со 2-м элементов в группе СПИСОК.
Для добавления эл-та в список необходимо набрать его значение в поле ЭЛЕМЕНТ и нажать ДОБАВИТЬ.
Для редактирования эл-та в списке необходимо набрать его значение в поле ЭЛЕМЕНТ и нажать РЕДАКТИРОВАТЬ.
Для удаления эл-та из списка необходимо нажать УДАЛИТЬ.
Для сортировки списка по возрастанию эл-ов необходимо нажать СОРТИРОВАТЬ.
- ЗАКЛЮЧЕНИЕ
Поставленная задача была полностью решена, результатом чего является программа LinearList, реализующую Графическое моделирование операций в односвязном линейном списке.
Программа полностью работоспособна под операционными системами Windows 98/2000/ХР. Для установки программы требуется около 2.5 мегабайт дискового пространства и около 3 мегабайт оперативной памяти. Для дальнейшей работы может понадобиться дополнительное место на жёстком диске для хранения баз данных. Минимальные системные требования – процессор на уровне Pentium I, 32Мб оперативной памяти, графический видеоадаптер 4Мб, операционная система Windows 2000.
- ЛИТЕРАТУРА
- А.Я. АрхангельскийПрограммирование в Delphi 7. — М.: ООО Бином-Пресс, 2003 г..
- Delphi help
- Кэнту М. Delphi 7 для профессионалов
- Архангельский А.Я. Delphi 6. Справочное пособие. М.: ЗАО «Издательсво БИНОМ», 2001г.
- Структуры и организация данных в компьютере. Учебное пособие / Романов А.В., Лакин В.И. – Мн.: НПООО «Пион», 2005г.
- Приложение (исходные тексты всех модулей)
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.