2.2. Частина 1: Побудова атд
2.2.1. Постановка задачі
Змоделювати абстрактний тип даних (АТД) на базі статичного масиву, який використати в другій частині цього завдання. Переписати основні операції роботи з АТД і продемонструвати їх застосування при додаванні та вилученні елементів в АТД. Для реалізації цього задати послідовність з К > 10 цілих чисел (числа вводити з клавіатури). Всі парні числа додавати в АТД, а кожне непарне число має вилучати з АТД один елемент. Виводити на екран динаміку вмісту АТД під час обробки заданої послідовності.
2.2.2. Динаміка вмісту
Виберу якусь вхідну послідовність для виконання програми
4,2,8,-3,10-2,-9,-7,5,7
Намалюю динаміку вмісту черги після введення таких даних:
2.2.3. Результати виконання програми
Випадок спроби віднімання з пустої черги елементів, та виведення повідомлення “Queue is empty”.
Спроба переповнення черги, та вивід повідомлення “Queue overflow”.
2.3. Частина 2. Застосування АТД
2.3.1. Постановка задачі
Розв’язати задачу використовуючи АТД "ЧЕРГА"
7. Дано позначення двох полів шахівниці (наприклад, A5 і C2). Знайти мінімальне число ходів, які потрібні шаховому коневі для переходу з першого поля на друге.
Вказівки до розв’язання задачі: Ідея рішення ґрунтується на використанні черги. Спочатку в чергу міститься елемент, що визначає вихідне положення шахового коня, а відповідна клітка поля позначається як така, яку відвідали.
На кожному з наступних кроків алгоритму (поки черга не порожня або не позначена кінцева клітка) виконуються наступні дії.
Із черги вилучається черговий елемент, що визначає деяку позицію (x,y).
Знаходяться клітки в межах поля, які досяжні з (x,y) одним ходом шахового коня, і які ще не позначені.
Елементи, що відповідають знайденим кліткам, додаються в чергу, а клітки позначаються як такі, яких відвідали.
При цьому спочатку всі клітки повинні бути непозначені, а мітку бажано ставити таку, щоб можна було відновити шлях між полями. Для цього мітку поля можна визначити як позицію поля, з якої вона була позначена.
2.3.2. Алгоритм розв’язання задачі
Для розв’язання цієї задачі використовую чергу, створену у частині 1. Додаю до неї функції void push(int); void pop (); та int front(); для роботи з ходами фігури (push_front). В файлі main.cpp запрограмував введення з клавіатури вхідних даних. Потім задаю до черги початкове і кінцеве значення фігури. Тоді в циклі перевіряю всі варіанти ходу, знаходжу найкоротший шлях. Вихід з циклу реалізується тоді, коли знайдено найкоротший шлях. Кожна відвідана клітка відмічається як та, яку відвідали.
2.3.3. Результати виконання програми
Висновки
Виконуючи цю частину курсової роботи я навчився дослідження внутрішнє представлення в пам’яті комп’ютера базових і похідних типів даних статичної структури та динамічних структур даних, а саме детально познайомився з структурою даних черга і навчився використовувати її на прикладі конкретної задачі.
Список літератури
Матвейчук Т. А. Основи представлення данних в пам'яті комп'ютера: Конспект лекцій (частина І ) з дисципліни “Програмування. Частина IIІ. Структури даних та алгоритми". – Львів: Видавництво НУ “Львівська політехніка”, 2010 – 37 с.
Конспект лекцій.
Додатки
До завдання 1
Файл queue1.h
#define maxqueue 5
class Tqueue
{
private:
int data[maxqueue];
int first,last,count;
public:
bool EMPTY, FULL;
Tqueue();
void push(int);
void pop();
int front();
};
Файл main.cpp
#include <conio.h>
#include <iostream>
#include "queue1.h"
using namespace std;
void print(Tqueue q)
{
Tqueue tmp;
tmp=q;
cout<<"Dunamika:";
if(q.EMPTY==true)
cout<<"Queue is EMPTY\n";
else
{
cout<<"{ ";
while(tmp.EMPTY==false)
{
cout<<tmp.front()<<" ";
tmp.pop();
}cout<<"}\n";
}
}
int main()
{
Tqueue a;
int i,b,c,k=0,m=1;
cout<<"Killist elementiv cherhy: ";
cin>>b;
for(i=0;i<b;i++)
{
cout<<"Vvedit ["<<i+1<<"] element: ";
cin>>c;
if(c%2==0)
{
if(a.FULL==true)
{
cout<<"queue overflow\n";
}
else a.push(c);
}
if(c%2==1)
{
if(a.EMPTY==true)
{
cout<<"queue underflow\n";
}
else a.pop();}
print(a);
}
getch();
return 0;
}
Файл queue1.cpp
#include "queue1.h"
#include <iostream>
using namespace std;
Tqueue::Tqueue()
{
first=0,last=-1,count=0;
EMPTY=true, FULL=false;
}
void Tqueue::push(int item)
{
if(FULL==false)
{
data[++last]=item;
++count;
EMPTY=false;
if(count==maxqueue)
FULL=true;
};
}
void Tqueue::pop()
{
if(EMPTY==false)
{
for(int i=0;i<(count-1);i++)
data[i]=data[i+1];
count--;last--;
if(count==0)EMPTY=true;
}
}
int Tqueue::front()
{
return (data[first]);
}
До завдання 2
Файл queue1.h
#define maxqueue 64
class Tqueue
{
private:
int data[maxqueue];
//int mas[maxqueue];
int first,last,count;
public:
bool EMPTY, FULL;
Tqueue();
void push(int);
void pop();
int front();
};
Файл main.cpp
#include <conio.h>
#include <iostream>
#include "queue1.h"
using namespace std;
void print(Tqueue q)
{
Tqueue tmp;
tmp=q;
cout<<"Dunamika: ";
if(q.EMPTY==true)
cout<<"queue is EMPTY\n";
else
{
cout<<"{ ";
while(tmp.EMPTY==false)
{
cout<<tmp.front()<<" ";
tmp.pop();
}cout<<"}";
}
}
const int dx[] = {-2, -2, 2, 2, -1, -1, 1, 1};
const int dy[] = {-1, 1, -1, 1, -2, 2, -2, 2};
int main(){
int pole[8][8]={0}, i, j;
char c1, c2;
int x1, y1, x2, y2;
for(i=0; i<8; i++)
for(j=0; j<8; j++)
pole[i][j]=100;
cout << "Pochatkova pozyciya: ";
cin >> c1 >> y1;
x1=c1-65;
y1=y1-1;
cout << "Kinceva pozyciya: ";
cin >> c2 >> y2;
x2=c2-65;
y2=y2-1;
pole[x1][y1]=99;
pole[x2][y2]=98;
Tqueue ch;
ch.push(x2);
ch.push(y2);
while(ch.EMPTY==0){
int k1=ch.front();
ch.pop();
int k2=ch.front();
ch.pop();
for(int d=0; d<8; d++){
if(k1+dx[d]>=0 && k1+dx[d]<8 && k2+dy[d]>=0 && k2+dy[d]<8 && (pole[k1+dx[d]][k2+dy[d]]==100 || pole[k1+dx[d]][k2+dy[d]]==99)){
if(pole[k1+dx[d]][k2+dy[d]]==99){
pole[k1+dx[d]][k2+dy[d]]=k1*10+k2;
goto end;
}
ch.push(k1+dx[d]);
ch.push(k2+dy[d]);
pole[k1+dx[d]][k2+dy[d]]=k1*10+k2;
}
}
}
end:;
int pole1[8][8]={0};
int klk=0;
i=x1; j=y1;
cout << "Zrobleni hody: " << endl;
while(i!=x2 || j!=y2){
do{
int ch1=pole[i][j]/10;
int ch2=pole[i][j]%10;
pole1[i][j]=klk+1;
i=ch1; j=ch2; klk++;
char s=ch1+65;
cout << s << ch2+1 << endl;
}while(i!=x2 || j!=y2);
}
pole1[x2][y2]=klk+1;
cout << "Kil'kist' hodiv: " << klk << endl << " ";
for (i=0; i<8; i++)
printf(" %d ", i+1);
cout << endl << " -------------------------" << endl;
for (i=0; i<8; i++){
printf("%c |",i+65);
for (j=0; j<8; j++){
printf(" %d|", pole1[i][j]);
}
cout << endl << " -------------------------" << endl;
}
system("pause");
return 0;
}
Файл queue1.cpp
#include "queue1.h"
#include <iostream>
using namespace std;
Tqueue::Tqueue()
{
first=0,last=-1,count=0;
EMPTY=true, FULL=false;
}
void Tqueue::push(int item)
{
if(FULL==false){
data[++last]=item;
++count;
EMPTY=false;
if(count==maxqueue)FULL=true;
};
}
void Tqueue::pop()
{
if(EMPTY==false){
for(int i=0;i<(count-1);i++)
data[i]=data[i+1];
count--;last--;
if(count==0)EMPTY=true;
}
}
int Tqueue::front()
{
return (data[first]);
}
