Однозв’язні списки в моделюванні колоди гральних карт

  1. Завдання :

 

  1. На мові програмування Pascal реалізувати процедури:

— Підготовки стека вільних елементів об’ємом  120 заготовок карт

— Додавання нової карти в колоду після поточної карти

— Видалення з колоди карти, безпосередньо наступної за поточної картою

— Отримання доступу до наступній карті в колоді

  1. Скориставшись процедурами, реалізованими в завданні 1, а) наповнити колоду 62-ма гральними картами випадковим чином (значення полів генерувати за допомогою генератора випадкових чисел); б) запрограмувати алгоритм обробки колоди гральних карт, розділити колоду на 4 колоди по мастям.

 

 

  1. Хід роботи : В процесі виконання роботи , спочатку реалізую процедури із завдання 1. Далі, на базі реалізованих процедур ,  я рандомізую колоду гральних карт. В ході цього завдання, виконую особисте завдання свого варіанта, а саме — запрограмовую алгоритм обробки колоди гральних карт, розділивши колод на 4 колоди по мастям.

 

 

  1. Код програми :

 

program prog5;

uses crt;

const

maximum=120;

file_first=’deck_before.log’;

file_second=’deck_after.log’;

 

type karta_record=record

tag:0..1;

suit:1..4;

rank:2..14;

next:pointer;

title:string[6];

end;

 

struct_coloda=record

current, top, first, last:^karta_record;

end;

 

var

karta:karta_record;

coloda:struct_coloda;

i:integer;

error:integer;

fileo:text;

 

{создание карты}

procedure createCard(var karta:karta_record);

begin

karta.tag:=random(2);

karta.suit:=random(4)+1;

karta.rank:=random(13)+2;

case karta.rank of

2: karta.title:=’ДВА’;

3: karta.title:=’ТРИ’;

4: karta.title:=’ЧЕТЫРЕ’;

5: karta.title:=’ПЯТЬ’;

6: karta.title:=’ШЕСТЬ’;

7: karta.title:=’СЕМ’;

8: karta.title:=’ВОСЕМЬ’;

9: karta.title:=’ДЕВЯТЬ’;

10: karta.title:=’ДЕСЯТЬ’;

11: karta.title:=’ВАЛЕТ’;

12: karta.title:=’ДАМА’;

13: karta.title:=’КОРОЛЬ’;

14: karta.title:=’ТУЗ’;

end;

end;

 

{убрать карту после текущего указателя}

procedure removeInFront(var coloda:struct_coloda; var error:integer);

var temp:^karta_record;

begin

if coloda.current^.next=coloda.top then

begin

error:=1;

exit;

end;

temp:=coloda.current^.next;

coloda.current^.next:=temp^.next;

dispose(temp);

error:=0;

end;

 

{переход к следующей карте после текущей}

procedure stepForward(var coloda:struct_coloda; var error:integer);

begin

if coloda.current^.next=coloda.top then {если достигли конца колоды возвращаем ошибку}

begin

error:=1;

exit;

end;

coloda.current:=coloda.current^.next;

error:=0;

end;

 

{вставка карты после текущего указателя}

procedure insertInFront(var coloda:struct_coloda; karta:karta_record; var error:integer);

var temp:^karta_record;

begin

new(temp);

temp^.next:=coloda.current^.next;

coloda.current^.next:=temp;

coloda.current:=temp;

dispose(temp);

coloda.current^.tag:=karta.tag;

coloda.current^.suit:=karta.suit;

coloda.current^.rank:=karta.rank;

coloda.current^.title:=karta.title;

error:=0;

end;

 

{вывод колоды в файл}

procedure writeColoda(coloda:struct_coloda; var out_file:text; var error:integer);

var j:integer;

mast:string[5];

vid:string[6];

buff:^karta_record;

begin

if coloda.top=coloda.first then

begin

error:=1;

writeln(‘Нет карт’);

exit;

end;

buff:=coloda.current;

coloda.current:=coloda.first;

while coloda.current<>coloda.top do

begin

case coloda.current^.tag of

0: vid:=’шуба’;

1: vid:=’лицо’;

end;

case coloda.current^.suit of

1: mast:=’червь’;

2: mast:=’бубна’;

3: mast:=’трефь’;

4: mast:=’пика’;

end;

writeln(out_file,’   ‘,vid:4,’   ‘,mast:5,’   ‘,coloda.current^.title:6);

coloda.current:=coloda.current^.next;

end;

coloda.current:=buff;

buff:=NIL;

error:=0;

end;

 

{снять карту сверху}

procedure pop(var coloda:struct_coloda; var karta:karta_record; var error:integer);

var i:integer;

temp:pointer;

begin

if coloda.top=coloda.first then

begin

error:=1;

exit;

end;

if coloda.first^.next=coloda.top then

begin

coloda.current:=NIL;

coloda.top:=coloda.first;

karta:=coloda.top^;

error:=0;

exit;

end;

coloda.current:=coloda.first^.next;

temp:=coloda.first;

for i:=2 to maximum-1 do

if coloda.current^.next=coloda.top then

break

else

begin

temp:=coloda.current;

coloda.current:=coloda.current^.next;

end;

coloda.top:=coloda.current;

coloda.current:=temp;

temp:=NIL;

karta:=coloda.top^;

error:=0;

end;

 

{создание новой колоды}

procedure createColoda(var coloda:struct_coloda);

var i:integer;

begin

new(coloda.first);

coloda.top:=coloda.first;

for i:=2 to maximum do

begin

new(coloda.last);

coloda.top^.next:=coloda.last;

coloda.top:=coloda.last;

end;

coloda.top:=coloda.first;

coloda.current:=NIL;

coloda.last^.next:=NIL;

end;

 

{положить на верх карту}

procedure push(var coloda:struct_coloda; karta:karta_record; var error:integer);

begin

if coloda.top=coloda.last then{обработка переполнения}

begin

error:=1;

exit;

end;

coloda.current:=coloda.top;

coloda.top^.tag:=karta.tag;

coloda.top^.suit:=karta.suit;

coloda.top^.rank:=karta.rank;

coloda.top^.title:=karta.title;

coloda.top:=coloda.current^.next;

error:=0;

end;

 

{удаление всех элементов колоды из}

procedure crearColoda(var coloda:struct_coloda);

var i:integer;

begin

coloda.current:=coloda.first;

coloda.last:=NIL;

coloda.first:=NIL;

while coloda.current<>NIL do

begin

coloda.top:=coloda.current^.next;

dispose(coloda.current);

coloda.current:=coloda.top;

end;

end;

 

{разделение колоды на 4-ре по мастям}

procedure changeColoda(var coloda:struct_coloda);

var colodaC, colodaB, colodaT, colodaP:struct_coloda;

karta:karta_record;

out_file:text;

begin

createColoda(colodaC);

createColoda(colodaB);

createColoda(colodaT);

createColoda(colodaP);

while coloda.first<>coloda.top do

begin

pop(coloda, karta, error);

case karta.suit of

1: push(colodaC, karta, error);

2: push(colodaB, karta, error);

3: push(colodaT, karta, error);

4: push(colodaP, karta, error);

end;

end;

assign(out_file,file_second);

{$I-}

rewrite(out_file);

{$I+}

writeln(out_file, ‘Колода червь:’);

writeColoda(colodaC, out_file, error);

writeln(out_file, ‘Колода бубны:’);

writeColoda(colodaB, out_file, error);

writeln(out_file, ‘Колода трефь’);

writeColoda(colodaT, out_file, error);

writeln(out_file, ‘Колода пик’);

writeColoda(colodaP, out_file, error);

close(out_file);

end;

 

BEGIN

clrscr;

createColoda(coloda);

randomize;

for i:=1 to 62 do

begin

createCard(karta);

push(coloda,karta,error);

end;

assign(fileo,file_first);

{$I-}

rewrite(fileo);

{$I+}

writeColoda(coloda, fileo, error);

close(fileo);

changeColoda(coloda);

writeln(‘Колода до изменения была записана в файл’, file_first);

writeln(‘Колода после изменения была записана в файл’, file_second);

writeln(‘Нажмите любую клавишу для выхода из программы…’);

readkey;

crearColoda(coloda);

END.

 

  1. Результат програми :

 

 

Deck_before                                                                         

шуба    пика   ДЕВЯТЬ

лицо   червь   ДЕВЯТЬ

шуба   трефь   КОРОЛЬ

лицо    пика      ДВА

шуба   червь    ВАЛЕТ

шуба   бубна   ВОСЕМЬ

лицо    пика      ТРИ

лицо   трефь     ПЯТЬ

лицо   червь      ДВА

шуба   червь   ВОСЕМЬ

шуба   червь      ТРИ

шуба    пика      ТУЗ

лицо    пика      ТРИ

шуба   бубна     ПЯТЬ

лицо   трефь   КОРОЛЬ

шуба   червь      ДВА

шуба   бубна   КОРОЛЬ

лицо   червь   ВОСЕМЬ

лицо    пика     ПЯТЬ

лицо   червь   ВОСЕМЬ

шуба   трефь   ДЕСЯТЬ

лицо    пика    ШЕСТЬ

шуба   трефь     ПЯТЬ

лицо   бубна   ЧЕТЫРЕ

лицо   трефь      ТУЗ

лицо   бубна      СЕМ

лицо    пика    ВАЛЕТ

лицо   червь   ЧЕТЫРЕ

лицо   трефь   ВОСЕМЬ

лицо   червь      ДВА

шуба   бубна      ТРИ

лицо   трефь      ДВА

лицо   трефь      ТУЗ

шуба   трефь      ТУЗ

лицо    пика   ЧЕТЫРЕ

лицо   бубна   ВОСЕМЬ

шуба   бубна      СЕМ

лицо   червь      ТУЗ

шуба   бубна   ЧЕТЫРЕ

лицо   трефь   ЧЕТЫРЕ

шуба   бубна    ВАЛЕТ

лицо   червь    ВАЛЕТ

шуба    пика    ШЕСТЬ

лицо    пика      ДВА

шуба    пика      ТРИ

лицо    пика   ДЕВЯТЬ

лицо   трефь     ДАМА

шуба   трефь      СЕМ

шуба   трефь   ЧЕТЫРЕ

лицо   трефь   ДЕВЯТЬ

лицо   трефь   КОРОЛЬ

лицо    пика    ШЕСТЬ

шуба   бубна   ВОСЕМЬ

лицо   трефь   КОРОЛЬ

лицо   червь    ШЕСТЬ

шуба   трефь   ВОСЕМЬ

лицо    пика   КОРОЛЬ

лицо   трефь      ТРИ

шуба   бубна   ЧЕТЫРЕ

шуба   трефь      ТРИ

лицо   бубна      ТУЗ

лицо   бубна      ТУЗ

 

deck_after

 

Колода червь:

лицо   червь    ШЕСТЬ

лицо   червь    ВАЛЕТ

лицо   червь      ТУЗ

лицо   червь      ДВА

лицо   червь   ЧЕТЫРЕ

лицо   червь   ВОСЕМЬ

лицо   червь   ВОСЕМЬ

шуба   червь      ДВА

шуба   червь      ТРИ

шуба   червь   ВОСЕМЬ

лицо   червь      ДВА

шуба   червь    ВАЛЕТ

лицо   червь   ДЕВЯТЬ

Колода бубны:

лицо   бубна      ТУЗ

лицо   бубна      ТУЗ

шуба   бубна   ЧЕТЫРЕ

шуба   бубна   ВОСЕМЬ

шуба   бубна    ВАЛЕТ

шуба   бубна   ЧЕТЫРЕ

шуба   бубна      СЕМ

лицо   бубна   ВОСЕМЬ

шуба   бубна      ТРИ

лицо   бубна      СЕМ

лицо   бубна   ЧЕТЫРЕ

шуба   бубна   КОРОЛЬ

шуба   бубна     ПЯТЬ

шуба   бубна   ВОСЕМЬ

Колода трефь

шуба   трефь      ТРИ

лицо   трефь      ТРИ

шуба   трефь   ВОСЕМЬ

лицо   трефь   КОРОЛЬ

лицо   трефь   КОРОЛЬ

лицо   трефь   ДЕВЯТЬ

шуба   трефь   ЧЕТЫРЕ

шуба   трефь      СЕМ

лицо   трефь     ДАМА

лицо   трефь   ЧЕТЫРЕ

шуба   трефь      ТУЗ

лицо   трефь      ТУЗ

лицо   трефь      ДВА

лицо   трефь   ВОСЕМЬ

лицо   трефь      ТУЗ

шуба   трефь     ПЯТЬ

шуба   трефь   ДЕСЯТЬ

лицо   трефь   КОРОЛЬ

лицо   трефь     ПЯТЬ

шуба   трефь   КОРОЛЬ

Колода пик

лицо    пика   КОРОЛЬ

лицо    пика    ШЕСТЬ

лицо    пика   ДЕВЯТЬ

шуба    пика      ТРИ

лицо    пика      ДВА

шуба    пика    ШЕСТЬ

лицо    пика   ЧЕТЫРЕ

лицо    пика    ВАЛЕТ

лицо    пика    ШЕСТЬ

лицо    пика     ПЯТЬ

лицо    пика      ТРИ

шуба    пика      ТУЗ

лицо    пика      ТРИ

лицо    пика      ДВА

шуба    пика   ДЕВЯТЬ

 

  1. Використанні джерела :

 

 

http://lord-n.narod.ru/download/books/walla/programming/Spr_po_C/22/2205.htm

 

http://www.cyberforum.ru/turbo-pascal/thread1109025.html

 

http://algolist.manual.ru/ds/basic/simple_list.php

 

 

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s