pNext->Free (); // запускаем метод Free () для следующего элемента
}
}
Достаточно удалить первый элемент стека для разрушения стека, здесь удаляется весь стек с конца, т.е. сначала процедура доходит до конца стека, далее в обратном порядке удаляет в памяти значения элементов.
Входные параметры отсутствуют. Выходного значения нету.
Ниже приведен код распечатки содержимого всего стека:
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 через поля и кнопки исполнения. Выходного значения нету.
В этом разделе будет описано как пользоваться разработанной программой.
Если нужно добавить элемента, то следуйте следующим пунктам:
введите в поле "Имя функции" имя вашей функции;
введите в поле "Возвращаемое значение" возвращаемое значение вашей функции;
введите в поле "Параметры" ваши параметры (максимум по6 символов, по условию) через знак "; " (точка с запятой);
нажмите кнопку добавить.
Если нужно удалить элемент, то нажмите кнопку "Удалить" и последний элемент стека очиститься из памяти.
Если нужно очистить память от всего стека сразу, то нажмите кнопку "Очистить".
Если нужно получить данные, введенные в стек, то нажмите кнопку "Распечатать" и программа в поле Edit выведет все элементы стека в порядке "снизу-вверх", т.е. сначала к концу.
// ---------------------------------------------------------------------------
#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;
}
// ---------------------------------------------------------------------------
Введём в программу следующие значения:
имя функции '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