Смекни!
smekni.com

Реалізація двохзв’язного списка (стр. 2 из 2)

Після закінчення обробки switch здійснюється перевірка на вихід з циклу. Умовою є а!=0. Якщо умова виконується, то надрукується меню і программа буде чекати введення. Не здійснення цикцу приведе до закінчення роботи циклу, а потім і програми.


3. Інструкція користувача

При запуску програми Користувачу пропонується вибрати дію з меню, в якому зазначені пронумеровані можливості:

0 Exit – вихід із програми;

1 About – інформація про завдання;

2 Add – додавання нового елемента в список;

3 Count – друк кількості елементів першого підсписку;

4 Count K – друк кількості лементів другого підсписку;

5 Print – друк першого підсписку;

6 Print K – друк другого підсписку;

7 Search – пошук елемента за полем «Кількість».

Для вибору дії потрібно ввести її номер. В залежності від обраного пункту, програма можливо запросить увести додаткові дані.

У зв’язку з тим, що метою даної роботи являється робота з динамічними структурами даних, то в програму не були введені засоби перевірки коректності уведених даних.

Назва виробу не повинна мати пробілів. Дата виготовлення вводиться як три окремих цілих числа через пробіл. Кількість повинна буди цілим числом.

Програма може працювати вірно лише за умовою вірного вводу даних. За умови невірного вводу даних неможливо передбачити роботу програми. Треба перезавантажити програму для її вірної роботи. Обережно, усі раніше введені дані будуть знищені.

Після виконання якоїсь дії, програма знову надрукує меню і буде чекати Вашого вибору.


4. Контрольний приклад

// Обираємо дію 1 About:

0 Exit 1 About 2 Add 1

KURSOVAYA RABOTA PO DISCIPLINE PROGRAMMIPOVANIE

Variant #15

Realizovat' dvusvyazniy snisok dlya hraneniya i operaciy s dannimi vida

| Naimenovanie izdeliya | Data izgotovleniya | Koli4estvo |

V perviy odnosvyazniy podspisok vhodyat vse zapisi. Vo vtoroy – tol'ko te, gde

pole «Koli4estvo» < K

Obespe4it' vipolnenie operaciy:

– Dobavlenie novogo elementa v spiskok;

– Poisk elementa po polyu «Koli4estvo»;

– Raspe4atka podspiskov;

– Korrektirovka zna4eniya polya «Koli4estvo» nekotorogo elementa.

// Обираємо дію 2 Add:

0 Exit 1 About 2 Add 2

K = 10

Vvedite Naimenovanie izdeliya: Keyboard

Vvedite datu izgotovleniya: 26 12 2003

Vvedite koli4estvo izdeliy: 6

// Обираємо дію 4 Count K:

0 Exit 1 About 2 Add 3 Count

4 Count K 5 Print 6 Print K 7 Search K :4


Spisok sostoit iz 1 strok

// Обираємо дію 2 Add:

0 Exit 1 About 2 Add 3 Count

4 Count K 5 Print 6 Print K 7 Search K :2

Vvedite Naimenovanie izdeliya: Mouse

Vvedite datu izgotovleniya: 01 01 2001

Vvedite koli4estvo izdeliy: 3

// Обираємо дію 4 Count K:

0 Exit 1 About 2 Add 3 Count

4 Count K 5 Print 6 Print K 7 Search K :4

Spisok sostoit iz 2 strok

// Обираємо дію 6 Print K:

0 Exit 1 About 2 Add 3 Count

4 Count K 5 Print 6 Print K 7 Search K :6

| | Naimenovanie izdeliya | Data izgotovleniya | Koli4estvo |

| 1| Keyboard| 26.12.2003 | 6|

| 2| Mouse| 1. 1.2001 | 3|

// Обираємо дію 5 Print:

0 Exit 1 About 2 Add 3 Count

4 Count K 5 Print 6 Print K 7 Search K :5

| | Naimenovanie izdeliya | Data izgotovleniya | Koli4estvo |

| 1| Keyboard| 26.12.2003 | 6|

| 2| Mouse| 1. 1.2001 | 3|

// Обираємо дію 2 Add:

0 Exit 1 About 2 Add 3 Count

4 Count K 5 Print 6 Print K 7 Search K :2

Vvedite Naimenovanie izdeliya: Lamp

Vvedite datu izgotovleniya: 31 12 2006

Vvedite koli4estvo izdeliy: 33

// Обираємо дію 5 Print:

0 Exit 1 About 2 Add 3 Count

4 Count K 5 Print 6 Print K 7 Search K :5

| | Naimenovanie izdeliya | Data izgotovleniya | Koli4estvo |

| 1| Keyboard| 26.12.2003 | 6|

| 2| Mouse| 1. 1.2001 | 3|

| 3| Lamp| 31.12.2006 | 33|

// Обираємо дію 6 Print K:

0 Exit 1 About 2 Add 3 Count

4 Count K 5 Print 6 Print K 7 Search K :6

| | Naimenovanie izdeliya | Data izgotovleniya | Koli4estvo |

| 1| Keyboard| 26.12.2003 | 6|

| 2| Mouse| 1. 1.2001 | 3|

// Обираємо дію 7 Search K:

0 Exit 1 About 2 Add 3 Count

4 Count K 5 Print 6 Print K 7 Search K :7

Vvedite K: 33

| | Naimenovanie izdeliya | Data izgotovleniya | Koli4estvo |

| 3| Lamp| 31.12.2006 | 33|

// Обираємо дію 3 Count:

0 Exit 1 About 2 Add 3 Count

4 Count K 5 Print 6 Print K 7 Search K :3

Spisok sostoit iz 3 strok

// Обираємо дію 4 Count K:

0 Exit 1 About 2 Add 3 Count

4 Count K 5 Print 6 Print K 7 Search K :4

Spisok sostoit iz 2 strok

// Обираємо дію 0 Exit:

0 Exit 1 About 2 Add 3 Count

4 Count K 5 Print 6 Print K 7 Search K :0

// Виконується вихід з програми.


ВИСНОВКИ

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

В даній курсовій роботі був реалізований один із видів абстрактних типів даних – двохзв’язний список.

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

Розглянуто головні властивості динамічних структур даних, область їх використання, а також приведені приклади їх вживання.


Література

1. Шилдт Г. «Справочник программиста по С/С++»: Пер. с англ.: Видавництво «Вильямс», 2001.

2. А. Хортон «Visual C++ 2005. Базовый курс» Москва, Санкт-Петербург 2007.

3. А.П. Сергеев, А.Н. Терен «Программирование в Microsoft Visual C++ 2005» Москва, Санкт-Петербург 2006.


Додаток

Код програми

#include <iostream>

#include <conio.h>

#include <stdio.h>

#include <string.h>

#include <iomanip>

using namespace std;

////////////////////////////////////////////////////////////////////////////////

// глобальные переменные

const char dd=3; // отвечает за 3 числа даты

const char width=79; // ширина экрана

////////////////////////////////////////////////////////////////////////////////

// описание структуры

struct S_Spisok {

char SName[40];

int SDate[dd];

int SCount;

S_Spisok *Next;

S_Spisok *Next_K;

};

////////////////////////////////////////////////////////////////////////////////

// глобальные переменные


S_Spisok *First = NULL;

S_Spisok *Lost = NULL;

S_Spisok *First_K = NULL;

S_Spisok *Lost_K = NULL;

////////////////////////////////////////////////////////////////////////////////

// 1 About

void About(void) {

cout<<»&bsol;n KURSOVAYA RABOTA PO DISCIPLINE PROGRAMMIPOVANIE&bsol;n Variant #15»

<<»&bsol;n Realizovat' dvusvyazniy snisok dlya hraneniya i operaciy s dannimi vida»

<<»&bsol;n –»

<< "| Naimenovanie izdeliya | Data izgotovleniya | Koli4estvo |»

<<» –»

<<» V perviy odnosvyazniy podspisok vhodyat vse zapisi.»

<<» Vo vtoroy – tol'ko te, gde pole &bsol; «Koli4estvo&bsol;» < K&bsol;n»

<<» Obespe4it' vipolnenie operaciy:»

<<»&bsol;n – Dobavlenie novogo elementa v spiskok;»

<<»&bsol;n – Poisk elementa po polyu &bsol; «Koli4estvo&bsol;»;»

<<»&bsol;n – Raspe4atka podspiskov;»

<<»&bsol;n – Korrektirovka zna4eniya polya &bsol; «Koli4estvo&bsol;» nekotorogo elementa.&bsol;n&bsol;n»;

};

////////////////////////////////////////////////////////////////////////////////

// 2 Add (функция добавления нового элемента)

bool Add (char *Name, int *D, int &Count, int &K)

{

S_Spisok *Temp = new S_Spisok;

strcpy_s (Temp->SName, Name);

for (int c=0; c<dd; c++) Temp->SDate[c] = D[c];

Temp->SCount = Count;

Temp->Next = NULL;

Temp->Next_K = NULL;

if(Lost)

{

Lost->Next = Temp;

Lost = Temp;

}

else

{

First = Temp;

Lost = Temp;

};

if (Count < K)

{

if (Lost_K)

{

Lost_K->Next_K = Temp;

Lost_K = Temp;

}

else

{

First_K = Temp;

Lost_K = Temp;

};

};

return 1;

};

////////////////////////////////////////////////////////////////////////////////

// 3 Count (определение размера списка)

int Count (S_Spisok *Temp)

{

int k=0;

while(Temp)

{

k++;

Temp = Temp->Next;

};

return k;

};

////////////////////////////////////////////////////////////////////////////////

// 4 Count_K (определение размера списка К)

int Count_K (S_Spisok *Temp)

{

int k=0;

while(Temp)

{

k++;

Temp = Temp->Next_K;

};

return k;

};

////////////////////////////////////////////////////////////////////////////////

// 5 Print (вывод на экран данных)

// –

void Line0 (void) {

for (int c=0; c<width; c++) cout<<» –»;

cout<<»&bsol;n| | Naimenovanie izdeliya | Data izgotovleniya | Koli4estvo |&bsol;n»;

for (int c=0; c<width; c++) cout<<» –»;

};

// –

// –

void Line (S_Spisok *Temp, int &k)

{

cout<<»&bsol;n| "<<setw(2)<<k<<"| "<<setw(40)<<Temp->SName<<"|»;

cout<<» «<<setw(2)<<Temp->SDate[0]<<».»

<<setw(2)<<Temp->SDate[1]<<».»

<<setw(4)<<Temp->SDate[2]<<» |»;

cout<<setw(12)<<Temp->SCount<< "|&bsol;n»;

for (int c=0; c<width; c++) cout<<» –»;

};

// –

void Print(void)

{

S_Spisok *Temp = First;

int k=0;

if(Temp) Line0 ();

while(Temp)

{

k++;

Line (Temp, k);

Temp = Temp->Next;

};

cout<<»&bsol;n»;

};

// –

void Print_K(void)

{

S_Spisok *Temp = First_K;

int k=0;

if(Temp) Line0 ();

while(Temp)

{

k++;

Line (Temp, k);

Temp = Temp->Next_K;

};

cout<<»&bsol;n»;

};

////////////////////////////////////////////////////////////////////////////////

// 7 Search (поиск элемента с полем, равным К)

void Search_K (int k)

{

S_Spisok *Temp = First;

bool b=0;

int c=1;

while(Temp)

{

if (Temp->SCount == k)

{

if (b==0)

{

Line0 ();

b=1;

};

Line (Temp, c);

};

Temp = Temp->Next;

c++;

};

if (b==0) cout<<»&bsol;n Zna4eniy, udovletvoryayuwih usloviyu, ne suwestvuet.»;

};

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

// основное тело проги

int main (void) {

char Name[40]; // масив для хранения наименования продукта

int a, // храним тут выбранную команду меню

D[dd], // масив для хранени даты

k, // храним вводимое количество продукта

K=0; // инициализация числа К

do {

cout<<»&bsol;n 0 Exit «<<«1 About «<< «2 Add»;

if(First) cout<< «3 Count &bsol;n»<<» 4 Count K»

<<«5 Print «<<«6 Print K «<< «7 Search K :»;

cin>>a;

switch(a) {

case 0: break;

case 1: About();

break;

case 2: if(! First)

{

cout<<»&bsol;n K =»;

cin>>K;

};

cout<<»&bsol;n Vvedite Naimenovanie izdeliya:»;

cin>>Name;

cout<<» Vvedite datu izgotovleniya:»;

for (int c=0; c<dd; c++) cin>>D[c];

cout<<» Vvedite koli4estvo izdeliy:»;

cin>>k;

Add (Name, D, k, K);

break;

case 3: cout<<»&bsol;n Spisok sostoit iz «<<Count(First)<<» strok&bsol;n»;

break;

case 4: cout<<»&bsol;n Spisok sostoit iz «<<Count_K (First_K)<<» strok&bsol;n»;

break;

case 5: Print();

break;

case 6: Print_K();

break;

case 7: cout<<»&bsol;n Vvedite K:»;

cin>>k;

Search_K(k);

break;

default: cout<<» Neponyatnen'ko, povtorite vvod.»;

break;

};

} while (a!=0);

return 0;};