Файл: Документ Microsoft Office Word.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 26.11.2019

Просмотров: 470

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Списком називається структура даних, до якої елементи можуть додаватись (або вилучатись з нього) в довільному місці. Списки поділяються на однозв’язні та двозв’язні. Елемент однозв’язного списку складається з одного інформаційного поля ( або кількох ) та вказівника на наступний елемент. Елемент двозв’язного списку крім того містить ще й вказівник на попередній елемент.

3.2. Опис алгоритму.

В даному алгоритмі ми використовуємо однонаправлений лінійний список в якому кожен елемент має вказівник на наступний елемент, а також три інформаційних поля. Алгоритм обчислення базується на тому що ми за один цикл, переглядаючи список від початку, знайшовши знак операції та два операнди, виконуємо одну операцію і вносимо відповідні зміни в список.

3.3. Текст програми.

Для реалізації цього алгоритму потрібно ініціалізувати список. Це виконує процедура Init ( L ) . Після ініціалізації виконуємо ввід виразу в список. Для запису введених операцій та операндів у список використовується перевірка чи введений елемент є одним з чотирьох знаків арифметичних дій, чи числом чи символом закінчення вводу вираза. На основі цього, якщо введений знак, то в поле typ записується true, в поле znak – відповідний знак, а якщо введене число, то в поле typ записується false, а в num – значення числа. Ми переглядаємо список від початку, і коли зустрічається знак і два числа, слідуючих за ним, ми виконуємо відповідну операцію над операндами, зберігаємо результат в елементі списку, де був знак і видаляємо елементи списку де знаходились операнди за допомогою процедури Delete ( L , I ). Знову повторюємо перегляд, аж поки в списку не залишиться один елемент, значення інформаційного поля якого і буде результатом обчислення введеного арифметичного виразу.

3.4. Тестування.

Для тестування введемо наступний вираз, натискаючи Enter після вводу кожної операції та операнда : / + - * 15 2 37 19 + 7 1. Після вводу виразу у префіксній формі вводимо q, що означає кінець вводу. Отримаємо результат : 1.5 .

Висновки.

Під час виконання курсової роботи “Структури даних та алгоритми” я ознайомився з основними та базовими типами і структурами даних. Також я ознайомився з основними алгоритмами роботи з масивами та списками. Я розробив та протестував ряд програм та алгоритмів, які були використані при виконанні поставлених задач. Мною були розроблені програми, які представляли дані у вигляді, у якому вони зберігаються у пам’яті комп’ютера, виконували сортування елементів, пошук елемента у списку, реалізовували однонаправлений список, обчислювали арифметичний виразу, записаний у префіксній формі. Також я набув навичок розробки програмних продуктів, їх тестування, а також навиків виконання та оформлення технічної документації.

Список використаної літератури:

1. Методичні вказівки і завдання до курсової роботи „Структури даних та алгоритми” з курсу „Основи інформатики, алгоритмізації та мов програмування” для студентів спеціальності


7.091502

"Технологія проблемного та системного програмування" / Укл. Лисак Т.А. – Львів: ІППТ, 2002. – 50 с.

2. Кнут Д. Искусство програмирования, том 3. Сортировка и поиск. –М.: Изд.дом „Вильямс”, 2001. – 832 с.

Додаток 1.

Представлення даних в пам’яті комп’ютера.

Текст програми.

program Kursova;

{$APPTYPE CONSOLE}

uses

SysUtils;

const

zz1=02;

zz2=85;

zz3=zz2-30;

var

b1 : boolean;

b2 : Wordbool;

b3 : Longbool;

ch : Char;

i1 : Byte;

i2 : Shortint;

i3 : Word;

i4 : Integer;

i5 : Longint;

r1 : Real;

r2 : Single;

r3 : Double;

r4 : Extended;

r5 : Comp;

str : String [15];

p : String;

d : zz1..zz2;

m : array [1..2, 1..5] of char;

rec : record

a1, a2 : string[15];

b1, b2, b3 : char;

c1, c2 : integer

end;

s : set of

zz1 .. zz3 ;

f : text;

procedure BooleanTP(b1:boolean);

const b:array[0..15] of char='0123456789ABCDEF';

var

i:integer;

a:array[1..1] of byte absolute b1;

begin

b1:=(i1 mod 2)=0;

write('Predstavlennya typu Boolean: ');

for i:=1 to 1 do write(b[a[i] div 16], b[a[i] mod 16]);

writeln

end;

procedure WordBooleanTP(b2:WordBool);

const

b:array[0..15] of char='0123456789ABCDEF';

var

i:integer; a:array[1..2] of byte absolute b2;

begin

b2:=succ(b1);

write('Predstavlennya typu Word Boolean: ');

for i:=1 to 2 do write(b[a[i] div 16], b[a[i] mod 16],' ');

writeln

end;

procedure LongBooleanTP;

const

b:array[0..15] of char='0123456789ABCDEF';

var

i:integer;

a:array[1..4] of byte absolute b3;

begin

b2:=pred(pred(b1));

write('Predstavlennya typu Long Boolean: ');

for i:=1 to 4 do write(b[a[i] div 16], b[a[i] mod 16],' ');

writeln

end;

procedure CharTP;

const

b:array[0..15] of char='0123456789ABCDEF';

var

i:integer;

a:array[1..1] of byte absolute ch;

begin

write('Ch = ', ch, '

');

write('Predstavlennya typu Char: ');

for i:=1 to 1 do write(b[a[i] div 16], b[a[i] mod 16],' ');

writeln

end;

procedure ByteTP;

const

b:array[0..15] of char='0123456789ABCDEF';

var

i:integer;

a:array[1..1] of byte absolute i1;

begin

write('I1 = ',i1,'

');

write('Predstavlennya typu Byte: ');

for i:=1 to 1 do write(b[a[i] div 16], b[a[i] mod 16],' ');

writeln

end;

procedure ShortIntegerTP;

const b:array[0..15] of char='0123456789ABCDEF';

var i:integer;

a:array[1..1] of byte absolute i2;

begin

write('I2 = ',i2,'

');

write('Predstavlennya typu Short integer: ');

for i:=1 to 1 do write(b[a[i] div 16], b[a[i] mod 16]);

writeln

end;

procedure WordTP;

const b:array[0..15] of char='0123456789ABCDEF';

var i:integer;

a:array[1..2] of byte absolute i3;

begin

write('I3 = ',i3,'

');

write('Predstavlennya typu Word: ');

for i:=1 to 2 do write(b[a[i] div 16], b[a[i] mod 16],' ');

writeln

end;

procedure IntegerTP;

const b:array[0..15] of char='0123456789ABCDEF';

var i:integer;

a:array[1..2] of byte absolute i4;

begin

write('I4 = ',i4,'

');

write('Predstavlennya typu Integer: ');

for i:=1 to 2 do write(b[a[i] div 16], b[a[i] mod 16],' ');

writeln

end;

procedure LongIntegerTP;

const b:array[0..15] of char='0123456789ABCDEF';

var i:integer;

a:array[1..4] of byte absolute i5;

begin

write('I5 = ',i5,'

');

write('Predstavlennya typu Long Integer: ');

for i:=1 to 4 do write(b[a[i] div 16], b[a[i] mod 16],' ');

writeln

end;

procedure RealTP;

const b:array[0..15] of char='0123456789ABCDEF';

var i:integer;

a:array[1..6] of byte absolute r1;

begin

write('R1 = ',r1:4:2,'

');

write('Predstavlennya typu Real: ');

for i:=1 to 6 do write(b[a[i] div 16], b[a[i] mod 16],' ');

writeln

end;

procedure SingleTP;

const

b:array[0..15] of char='0123456789ABCDEF';

var

i:integer;

a:array[1..4] of byte absolute r2;

begin

write('R2 = ',r2:6:2,' ');

write('Predstavlennya typu Single: ');

for i:=1 to 4 do write(b[a[i] div 16], b[a[i] mod 16],' ');

writeln

end;

procedure DoubleTP;

const

b:array[0..15] of char='0123456789ABCDEF';

var

i:integer;

a:array[1..8] of byte absolute r3;

begin

write('R3 = ',r3:6:2,' ');

write('Predstavlennya typu Double: ');

for i:=1 to 8 do write(b[a[i] div 16], b[a[i] mod 16],' ');

writeln

end;

procedure ExtendedTP;

const

b:array[0..15] of char='0123456789ABCDEF';

var

i:integer;

a:array[1..10] of byte absolute r4;

begin

write('R4 = ',r4:6:2,' ');

write('Predstavlennya typu Extended: ');

for i:=1 to 10 do write(b[a[i] div 16], b[a[i] mod 16],' ');

writeln

end;

procedure CompTP;

const

b:array[0..15] of char='0123456789ABCDEF';

var

i:integer;

a:array[1..8] of byte absolute r5;

begin

write('R5 = ',r5:4:0,'

');

write('Predstavlennya typu Comp: ');

for i:=1 to 8 do write(b[a[i] div 16], b[a[i] mod 16],' ');

writeln

end;

procedure StringTP;

const b:array[0..15] of char='0123456789ABCDEF';

var

i:integer;

a:array[1..13] of byte absolute str;

begin

write('Str = ',str,'

');

write('Predstavlennya typu String: ');

for i:=1 to 12 do write(b[a[i] div 16], b[a[i] mod 16],' ');

writeln

end;

procedure CountingTP;

const b:array[0..15] of char='0123456789ABCDEF';

var

i:integer;

a:array[1..1] of byte absolute p;

begin

write('P = ',p,'

');

write('Predstavlennya typu Counting: ');

for i:=1 to 1 do

write(b[a[i] div 16], b[a[i] mod 16],' ');

writeln

end;

procedure DiapasonTP;

const b:array[0..15] of char='0123456789ABCDEF';


var

i:integer;

a:array[1..1] of byte absolute d;

begin

write('D = ',d,'

');

write('Predstavlennya typu Diapason: ');

for i:=1 to 1 do

write(b[a[i] div 16], b[a[i] mod 16],' ');

writeln

end;

procedure MasyvTP;

const b:array[0..15] of char='0123456789ABCDEF';

var

i,j:integer;

a:array[1..10] of byte absolute m;

begin

write('M = ');

for i:=1 to 2 do

for j:=1 to 5 do write(m[i,j],' ');

writeln;

write('

Predstavlennya typu Masyv: ');

for i:=1 to 10 do

write(b[a[i] div 16], b[a[i] mod 16],' ');

writeln

end;

procedure RecordTP;

const

b:array[0..15] of char='0123456789ABCDEF';

var

i:integer;

a:array[1..39] of byte absolute rec;

begin

write('Rec = ',rec.a1,rec.b1,' ',rec.a2,rec.b2,' ',rec.c1,

rec.b3,rec.c2,'

' );

writeln;

write('

Predstavlennya typu Record: ');

for i:=1 to 39 do begin

write(b[a[i] div 16], b[a[i] mod 16],' ');

if (i=10) or (i=20) or (i=30) then begin

writeln; write('

')

end;

end;

writeln

end;

begin

writeln('Vvedit pershu literu prizvushca (velyku)');

readln(ch);

writeln('Vvedit den narodzhennja');

readln(i1);

{День народження}

i2:=-i1;

{-i1}

i3:=i1*125;

{i1*125}

i4:=-i3;

{-i3}

i5:=-i3;

{-i3}

writeln('Vvedit drobove chyslo:cila chastyna-misjatc narodzh, drobova-rik');

readln(r1);

{дробове число:ціла частина-місяць народження,

дробова частина-рік народження}

r2:=r1*125;

{r1*125}

r3:=-r2;

{-r2}

r4:=r2;

{r2}

r5:=i5;

{i5}

writeln('Vvedit prizvyshce z velykoi litery');

readln(str);

{Прізвище}

writeln('Vvedit imja z velykoi litery');

readln(p);

{Ім'я}

d:=i1+15;

{День народження + 15}

m[1,1]:='3';

m[1,2]:='9';

m[1,3]:='0';

m[1,4]:='8';

m[1,5]:='0';

m[2,1]:='0';

m[2,2]:='1';

m[2,3]:='0';

m[2,4]:='9';

m[2,5]:='6';

writeln('Vvedit misto');

readln(rec.a1);

{назва міста в адресі прописки}

writeln('Vvedit vulytcju');

readln(rec.a2); {назва вулиці в адресі прописки}

writeln('Vvedit nomer budynku');

readln(rec.c1);

{номер будинку в адресі прописки}

writeln('Vvedit nomer kvartyry');

readln(rec.c2);

{номер квартири в адресі прописки}

rec.b1:= ',';

rec.b2:= ',';

rec.b3:= '/';

if (i1 mod 2)=0

then b1:=true

else b1:=false;

write('B1 = ',b1,'

');

BooleanTP(b1);

b2:=succ(b1);

write('B2 = ',b2,'

');

WordBooleanTP(b2);

b3:=pred(pred(b1));

write('B3 = ',b3,'

');

LongBooleanTP;

CharTP;

ByteTP;

ShortIntegerTP;

WordTP;

IntegerTP;

LongIntegerTP;

RealTP;

SingleTP;

DoubleTP;

ExtendedTP;

CompTP;

StringTP;

CountingTP;

DiapasonTP;

MasyvTP;

RecordTP;

readln

end.

Додаток 2.

Сортування і пошук.

Порозрядне сортування.

program PorozrSort;

{$APPTYPE CONSOLE}

uses

SysUtils;

const n=10; h=32;

type

TElem=record

dec:integer;

bin:array [1..h] of char;

end;

TSpysok=array[1..n] of TElem;

var

i,j,k,p,a_or_b:integer; {a_or_b: 0 - a, 1 - b}

a,b:TSpysok;

c:TElem;

procedure Dec2Bin(var z:TElem; x:integer);

var

k,l:byte;

b:string[2];

y:integer;

begin

b:='01';

k:=h;

y:=abs(x);

while y>=2 do begin

z.bin[k]:=b[(y mod 2)+1];

y:=y div 2;

k:=k-1

end;

z.bin[k]:=b[y+1];

for l:=k-1 downto 1 do z.bin[l]:='0';

if x>=0

then z.bin[1]:='1' {1 - chyslo dodatnie}

else z.bin[1]:='0' {0 - chyslo vidjemne}

end;

procedure Vvid(var z:TSpysok);

var sign,i,choice:integer;

begin

Randomize;

writeln('1 - Vypadkovi chysla');

writeln('2 - Vvesty chysla');

readln(choice);

while (choice1) and (choice2) do begin

writeln('!!! Nevirnyj vybir. Vvedit'' 1 abo 2');

readln(choice);

end;

if choice=1 then begin

sign:=1;

for i:=1 to n do begin

a[i].dec:=Random(1000)*sign;

sign:=-sign;

Dec2Bin(a[i], a[i].dec)

end;

end

else if choice=2 then begin

writeln('Vvedit'' 10 chysel');

for i:=1 to n do begin

readln(a[i].dec);

Dec2Bin(a[i], a[i].dec)

end;

end;

writeln('---===||| Vhidna poslidovnist''');

for i:=1 to n do writeln(a[i].dec,'

',a[i].bin)

end;

procedure SortVidjem(w:TSpysok; var z:TSpysok; k:integer);

var i,j:integer;

begin

j:=1;

if p>=2 then begin

for i:=1 to p do begin

if w[i].bin[k]='1' then begin

z[j]:=w[i];

j:=j+1

end;

end;

for i:=1 to p do begin

if w[i].bin[k]='0' then begin

z[j]:=w[i];

j:=j+1

end;

end;

end;

end;

procedure SortDodat(w:TSpysok; var z:TSpysok; k:integer);

var i,j:integer;

begin

j:=n;

if n-p>=2 then begin

for i:=n downto p+1 do begin

if w[i].bin[k]='1' then begin

z[j]:=w[i];

j:=j-1

end;

end;

for i:=n downto p+1 do begin

if w[i].bin[k]='0' then begin

z[j]:=w[i];

j:=j-1

end;

end;

end;

end;

procedure Vyvid(z,w:TSpysok);

var i: byte;

begin

writeln('---===||| Vidsortovana poslidovnist''');

if a_or_b=0

then for i:=1 to n do writeln(z[i].dec,'

',z[i].bin)

else for i:=1 to n do writeln(w[i].dec,'

',w[i].bin);

end;

begin

Vvid(a);

for i:=n downto 2 do

for j:=1 to i-1 do

if a[j].bin[1]>a[j+1].bin[1] then begin

c:=a[j+1];

a[j+1]:=a[j];

a[j]:=c

end;

p:=0;

while a[p+1].bin[1]='0' do p:=p+1; {p - kil''kist'' vidjemnyh chysel}

if p=1 then b[1]:=a[1];

if p=n-1 then b[n]:=a[n];

k:=h;

while k>=2 do begin

SortVidjem(b,a,k);

SortDodat(b,a,k);

a_or_b:=0;

k:=k-1;

if k>=2 then begin

SortVidjem(a,b,k); SortDodat(a,b,k);

a_or_b:=1;

k:=k-1

end;

end;

Vyvid(a,b);

readln

end.

Пошук Фібоначчі

program FiboSearch;

{$APPTYPE CONSOLE}

uses

SysUtils;

const

n=12;

type

TSpysok=array[1..n] of integer;

Var

K,i:integer;

a:TSpysok;

error:boolean;


porivn:integer;

procedure Vvid(var z:TSpysok);

var sign,i,choice:integer;

begin

Randomize;

writeln('1 - Vypadkovi chysla');

writeln('2 - Vvesty chysla');

readln(choice);

while (choice1) and (choice2) do begin

writeln('!!! Nevirnyj vybir. Vvedit'' 1 abo 2');

readln(choice);

end;

if choice=1 then begin

sign:=1;

for i:=1 to n do begin

a[i]:=Random(1000)*sign;

sign:=-sign;

end;

end

else if choice=2 then begin

writeln('Vvedit'' 12 chysel');

for i:=1 to n do readln(a[i])

end

end;

procedure Sort(var z:TSpysok);

var i,j,x:integer;

begin

for i:=n downto 2 do

for j:=1 to i-1 do

if a[j]>a[j+1] then begin

x:=a[j+1];

a[j+1]:=a[j];

a[j]:=x

end

end;

function Find(z:TSpysok; x:integer):integer;

var i,p,q,p1:integer;

found:boolean;

begin

Find:=0;

error:=false;

found:=false;

i:=8; p:=5; q:=3;

repeat

porivn:=porivn+1;

if xthen

if q0 then begin

i:=i-q;

p1:=p;

p:=q; q:=p1-q

end

else begin

writeln('!Nema takogo elementa v masyvi!');

readln; halt

end

else begin

porivn:=porivn+1;

if x>a[i] then

if p1 then begin

i:=i+q;

p:=p-q; q:=q-p

end

else begin

writeln('!Nema takogo elementa v masyvi.!');

readln; halt

end

else begin

Find:=i;

found:=true

end

end

until found;

end;

begin

porivn:=0;

writeln('*** Poshuk Fibonacci ***');

Vvid(a);

Sort(a);

writeln('

Vhidna poslidovnist''');

for i:=1 to n do writeln(i,')

',a[i]);

write('Vvedit'' element, jakyy treba znaity: ');

readln(K);

writeln('Poriadkovyi nomer chysla ',K,': ',Find(a,K),'.');

writeln('Kil''kist'' porivnian'' : ',porivn,'.');

readln

end.

Додаток 3.

Обчислення арифметичного виразу, записаного у префіксній формі.

program spysok_masyv;

{$APPTYPE CONSOLE}

uses SysUtils, A_list;

begin

Init(L);

writeln('** Obchyslennia vyrazy, zapysanogo v prefiksnij formi **');

Vvid(L,Free,Space);

writeln('** Rezultat obchyslennia : ',PrefixCalculate(L):10:4,'**');

readln

end.

unit A_List;

interface

const N=100;

type

IndexType=0..N;

InfoType=real;

ElemType=record

typ:boolean;

num:InfoType;

znak:char;

next:IndexType;

end;

ListType=IndexType;

SpaceType=array [0..N] of ElemType;

var L:ListType;

Free:IndexType;

Space:SpaceType;

procedure Init (var L:ListType);

function Empty (L:ListType):boolean;

function Full (L:ListType):boolean;

function FindLast (L:ListType):IndexType;

function FindBefore (L:ListType; K:IndexType):IndexType;

procedure Delete (var L:ListType;K:IndexType);

procedure AddElem (var L:ListType; t:boolean; x:InfoType; c:char);

procedure Vvid(var L:ListType;var Free:IndexType;var Space:SpaceType);

function PrefixCalculate (L:ListType):real;

implementation

procedure Init (var L:ListType);

var i:IndexType;

begin

for i:=1 to N-1 do space[i].Next:=i+1;

Space[0].next:=0;

Space[N].next:=0;

L:=0;

Free:=1

end;

function Empty (L:ListType):boolean;

begin

Empty:=L=0

end;

function Full (L:ListType):boolean;

begin

Full:=Free=0

end;

function FindLast (L:ListType):IndexType;

var i:IndexType;

begin

i:=L;

while Space[i].Next0 do i:=space[i].Next;

FindLast:=i

end;

function FindBefore (L:ListType; K:IndexType):IndexType;

var i:IndexType;

begin

i:=L;

FindBefore:=0;

while Space[i].NextK do i:=Space[i].Next;

FindBefore:=i

end;

procedure Delete (var L:ListType;K:IndexType);

var i,j:IndexType;

begin

i:=K;

if Space[i].Next=0

then begin

j:=FindBefore(L,i); Space[j].Next:=0;

end

else begin

j:=Space[i].Next;

Space[i]:=Space[j]; i:=j;

end;

Space[FindLast(Free)].Next:=i;

Space[i].Next:=0

end;

procedure AddElem (var L:ListType; t:boolean; x:InfoType; c:char);

var i,j:IndexType;

begin

if not Full(L) then begin

i:=Free;

Free:=Space[Free].next;

space[i].typ:=t; space[i].num:=x; space[i].znak:=c;

space[i].next:=0;

j:=FindLast(L);

space[j].Next:=i;

end

else writeln('Error: List is Full')

end;

procedure Vvid(var L:ListType;var Free:IndexType;var Space:SpaceType);

var i:integer; s:string; x:InfoType;

begin

writeln('- Vvedit vyraz v prefiksnij formi, natyskajuchy "Enter"');

writeln('

pislia kozhnogo operatora ta operanda');

writeln('

(dlia zakinchennia vvodu vyraza vvedit'' q)');

repeat

readln(s);

if (s[1]='+')or(s[1]='-')or(s[1]='*')or(s[1]='/')or(s[1]='.')

or(s[1]='1')or(s[1]='2')or(s[1]='3')or(s[1]='4')or(s[1]='5')

or(s[1]='6')or(s[1]='7')or(s[1]='8')or(s[1]='9')or(s[1]='0')

then if (s[1]='+')or(s[1]='-')or(s[1]='*')or(s[1]='/')

then AddElem(L,true,0,s[1])

else begin

Val(s,x,i); AddElem(L,false,x,' ');

end

else if s[1]='q'

then writeln('- vvid zakincheno')

until s[1]='q';

end;

function PrefixCalculate (L:ListType):real;

var i,j:IndexType;

z:char;

calc:0..2;

a:array[1..2] of InfoType;

begin

PrefixCalculate:=0;

calc:=0;

z:=' ';

while FindLast(L)>1 do begin

i:=L;

repeat

i:=Space[i].next;

if Space[i].typ=true

then begin

calc:=0;

z:=Space[i].znak

end

else begin

calc:=calc+1; a[calc]:=Space[i].num

end;

until calc=2;

j:=FindBefore(L,i);

Delete(L,i);

i:=FindBefore(L,j);

Delete(L,j);

Space[i].typ:=false;

Space[i].znak:=' ';

case z of

'+': Space[i].num:=a[1]+a[2];

'-': Space[i].num:=a[1]-a[2];

'*': Space[i].num:=a[1]*a[2];

'/': Space[i].num:=a[1]/a[2];

end;

end;

i:=Space[L].next;

if Space[i].next=0

then PrefixCalculate:=Space[i].num

else writeln('Error - je > 1 elem')

end;

end.



Ключові слова:

Курсова робота , Структури даних та алгоритми





Коментарі



Залишити коментар »


Ви не можете залишити коментар.



Для цього, будь ласка, увійдіть або зареєструйтесь.

Завантаження файлу

поділитись

Стань активним учасником руху antibotan!

Поділись актуальною інформацією,

детальніше

і отримай привілеї у користуванні архівом! детальніше

Вхід

увійти

реєстрація

забули пароль?

запам'ятати мене

Партнери сайту





© 2012 antibotan.com - Навчатись легко!