Смекни!
smekni.com

Динамические структуры данных (стр. 2 из 2)

pNext->Free (); // запускаем метод Free () для следующего элемента

}

}

Достаточно удалить первый элемент стека для разрушения стека, здесь удаляется весь стек с конца, т.е. сначала процедура доходит до конца стека, далее в обратном порядке удаляет в памяти значения элементов.

Входные параметры отсутствуют. Выходного значения нету.

2.4 Распечатка содержимого

Ниже приведен код распечатки содержимого всего стека:

void tStack:: Print (TMemo* memo)

{

memo->Lines->Add ("* - -------------- - *"); // вывод на экран значений

memo->Lines->Add (strFName);

memo->Lines->Add (strRValue);

memo->Lines->Add (IntToStr (numPar));

for (inti = 0; i < numPar; i++) // повторяем в цикле распечатку параметров с каждой новой строчки

{

memo->Lines->Add (pParam [i]); // добавление указателя pParam [i]

}

if (pNext) // если есть следующий элемент

pNext->Print (memo); // рекурсивно запустить распечатку следующего элемента

}

Входные параметры поступают из методов С++ Builder через поля и кнопки исполнения. Выходного значения нету.

3. Инструкция пользователя

В этом разделе будет описано как пользоваться разработанной программой.

Если нужно добавить элемента, то следуйте следующим пунктам:

введите в поле "Имя функции" имя вашей функции;

введите в поле "Возвращаемое значение" возвращаемое значение вашей функции;

введите в поле "Параметры" ваши параметры (максимум по6 символов, по условию) через знак "; " (точка с запятой);

нажмите кнопку добавить.

Если нужно удалить элемент, то нажмите кнопку "Удалить" и последний элемент стека очиститься из памяти.

Если нужно очистить память от всего стека сразу, то нажмите кнопку "Очистить".

Если нужно получить данные, введенные в стек, то нажмите кнопку "Распечатать" и программа в поле Edit выведет все элементы стека в порядке "снизу-вверх", т.е. сначала к концу.

4. Код программы

// ---------------------------------------------------------------------------

#include <vcl. h>

#pragma hdrstop

#include "Unit1. h"

#include <stdio. h>

#include <stdlib. h>

// ---------------------------------------------------------------------------

#pragma package (smart_init)

#pragma resource "*. dfm"

TForm1 *Form1;

// ---------------------------------------------------------------------------

__fastcall TForm1:: TForm1 (TComponent* Owner)

: TForm (Owner)

{

}

// ---------------------------------------------------------------------------

struct tStack

{

char strFName [255] ;

char strRValue [6] ;

int numPar;

char** pParams;

bool bFilled;

tStack* pNext;

tStack ()

{

pNext = NULL;

numPar = 0;

bFilled = false;

}

void Add (char* strFName_, char* strRValue_, int numPar_, char** pParams_);

void Delete ();

void Print (TMemo* memo);

void Free ();

};

tStack* temp;

int num = 0;

int max_num = 1000;

void tStack:: Add (char* strFName_, char* strRValue_, int numPar_, char** pParams_)

{

if (num == (max_num-1)) MessageBox ("Almost Overload", "Warning ", MB_OK);

if (num == max_num)

{

MessageBox ("Overload", "", "Error", MB_OK);

}

num++;

if (pNext)

pNext->Add (strFName_, strRValue_, numPar_, pParams_);

else

{

if (! bFilled)

{

strcpy (strFName, strFName_);

strcpy (strRValue, strRValue_);

numPar = numPar_;

pParams = new char* [numPar] ;

for (int i = 0; i < numPar; i++)

{

pParams [i] = new char [6] ;

strncpy (pParams [i], pParams_ [i],

6);

}

bFilled = true;

}

else

{

pNext = new tStack;

pNext->Add (strFName_, strRValue_, numPar_, pParams_);

}

}

}

void tStack:: Delete ()

{

if (pNext)

if (pNext->pNext)

pNext->Delete ();

else

{

delete [] pNext;

pNext = NULL;

}

}

void tStack:: Print (TMemo* memo)

{

memo->Lines->Add ("* - -------------- - *");

memo->Lines->Add ("Имя функции: "+ (AnsiString) strFName);

memo->Lines->Add ("Возвращаемое значение: "+ (AnsiString) strRValue);

memo->Lines->Add ("Количество параметров: "+ (AnsiString) IntToStr (numPar));

memo->Lines->Add ("Параметры функции: ");

for (int i = 0; i < numPar; i++)

{

memo->Lines->Add (pParams [i]);

}

if (pNext)

pNext->Print (memo);

}

void tStack:: Free ()

{

if (temp) delete [] temp;

if (pNext)

{

temp = this;

pNext->Free ();

}

}

tStack* stack;

void __fastcall TForm1:: Button1Click (TObject *Sender)

{

if (! stack) stack = new tStack;

char* str = new char [Edit1->Text. Length () + 1] ;

strcpy (str, Edit1->Text. c_str ());

char* str2 = new char [Edit2->Text. Length () + 1] ;

strncpy (str2, Edit2->Text. c_str (),

6);

char* str3 = Edit3->Text. c_str ();

char* ptr = strtok (str3, "; ");

char** p = new char* [255] ;

int n = 0;

while (ptr)

{

p [n] = new char [6] ;

strncpy (p [n], ptr,

6);

ptr = strtok (NULL, "; ");

n++;

}

stack->Add (str, str2, n, p);

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: Button4Click (TObject *Sender)

{

Memo1->Lines->Clear ();

if (! stack) return;

stack->Print (Memo1);

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: Button2Click (TObject *Sender)

{

if (! stack) return;

if (! stack->pNext)

{

delete [] stack;

stack = NULL;

return;

}

stack->Delete ();

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: Button3Click (TObject *Sender)

{

if (! stack) return;

stack->Free ();

delete [] stack;

stack = NULL;

}

// ---------------------------------------------------------------------------

void __fastcall TForm1:: FormCreate (TObject *Sender)

{

temp = NULL;

}

// ---------------------------------------------------------------------------

5. Контрольный пример

Введём в программу следующие значения:

имя функции 'summ'

возвращаемое значение ‘2a+3b’;

параметры ‘2a; 3b; 0; 1’;

и нажмем кнопку добавить.

Далее введём аналогичные данные соответственно:

‘test_summ’, ‘abajaba’, ‘qwertyasd; asdfg; asdgf1; 123 d456’ и нажмем кнопку добавить.

Теперь нажмём кнопку распечатать и получим следующее, учитывая особенности условия:

* - -------------- - *

Имя функции: summ

Возвращаемое значение: 2a+3b

Количество параметров: 4

Параметры:

2a

3b

0

1

* - -------------- - *

Имя функции: text_summ

Возвращаемое значение: abajab

Количество параметров: 4

Параметры:

qwerty

asdfg

asdfg1

123d4

Теперь нажмём кнопку удалить, а затем кнопку распечатать:

Имя функции: summ

Возвращаемое значение: 2a+3b

Количество параметров: 4

Параметры:

2a

3b

0

1

Далее нажмём кнопку очистить и при нажатии кнопки распечатать на экран программа ничего выводить не будет.

Заключение

Данная курсовая работа является примером обработки информации, представленной в виде стека, которые наглядно позволяет увидеть возможности реализации запросов, предусмотренных алгоритмом, т.е. осуществление ряда операций над данными такой структуры.

Описание алгоритма программным способом реализовано при помощи языка С++.

Область применения алгоритма достаточно обширна, т.к сам алгоритм представляет собой один из способов обработки информации.

Работа с различного рода данными является очень актуальной. Решение таких задач позволяется сократить затрачиваемое время на обработку данных и повысить эффективность самой работы.

Перечень используемой литературы

1. М. Уэйт, С. Прата "Язык Си", М: МИР, 1988

2. У. Мюррей, К. Паллас "VisualC++", М: BHV, 1996


Приложения