Процедура добавления элемента
Ниже приведен код процедуры добавления элемента в стек: tStack* temp; // создаём указатель temp типа tStack int num = 0; // количество элементов 0 int max_num = 1000; // максимальное количество элементов равно 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); // диалоговое окно с ошибкой return; // процедура добавления элемента останавливается } num++; // счетчик количества введенных элементов if (pNext) // если есть ссылка на следующий элемент pNext->Add (strFName_, strRValue_, numPar_, pParams_); // добавляем элемент с адресом pNext else { if (! bFilled) // если элемент заполнен { strcpy (strFName, strFName_); // копируем значения строк из одной переменной в другую strcpy (strRValue, strRValue_); numPar = numPar_; pParams = new char* [numPar] ; for (int i = 0; i < numPar; i++) // повторяем цикл numPar раз { pParams [i] = new char [6] ; // выделяем память для хранения одного параметра 6 байт из массива strncpy (pParams [i], pParams_ [i], 6); // копируем значения из введённых, отсекая всё больше 6-ти байт } bFilled = true; // поле считается заполненным } else { pNext = new tStack; // выделяем память под новые элемент tStack pNext->Add (strFName_, strRValue_, numPar_, pParams_); // добавляем элемент } } }
В этой функции реализована и проверка на переполнение стека. Проверка переполнения выполняется по количеству введенных элементов int max_num = 1000; и счётчику текущего элемента num:
if (num == (max_num-1)) MessageBox ("Almost Overload", "Warning ", MB_OK); // если элементов на единицу меньше максимального количества элементов, программа предупредит диалоговым окном if (num == max_num) // если элементов максимальное количество { MessageBox ("Overload", "", "Error", MB_OK); // диалоговое окно с ошибкой return; // процедура добавления элемента останавливается } num++; // счетчик количества введенных элементов
Реализация ввода параметров (по определенному введенному количеству) выполнена через массив указателей. Входные параметры поступают из методов С++ Builder через поля и кнопки исполнения. Выходного значения нету.
Процедура удаления элемента
Ниже приведен код удаления элемента:
void tStack:: Delete () { if (pNext) // если есть следующий элемент if (pNext->pNext) // если есть более 1-го элемента pNext->Delete (); // запускаем рекурсивно метод Delete () для следующего элемента else { delete pNext; // удаляем в памяти адрес указанный pNext pNext = NULL; // присваеваем значение указателя pNext равное нулю } }
По определению стека - удалять можно только последний элемент, не разрушая стека. Входные параметры отсутствуют. Выходного значения нету.
Процедура очистки памяти
Процедура очистки памяти от всего стека, код:
void tStack:: Free () { if (temp) delete temp; // если есть временная переменная temp, то очистить от неё память if (pNext) // если есть хотя бы один элемент { temp = this; // temp присваивается текущее значение 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 (int i = 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’, ‘qwerty asd; asd fg; asdgf1; 123 d456’ и нажмем кнопку добавить. Теперь нажмём кнопку распечатать и получим следующее, учитывая особенности условия: * - -------------- - * Имя функции: summ Возвращаемое значение: 2a+3b Количество параметров: 4 Параметры: 2a 3b 0 1 * - -------------- - * Имя функции: text_summ Возвращаемое значение: abajab Количество параметров: 4 Параметры: qwerty asd fg asdfg1 123d4 Теперь нажмём кнопку удалить, а затем кнопку распечатать: Имя функции: summ Возвращаемое значение: 2a+3b Количество параметров: 4 Параметры: 2a 3b 0 1 Далее нажмём кнопку очистить и при нажатии кнопки распечатать на экран программа ничего выводить не будет. Заключение
Данная курсовая работа является примером обработки информации, представленной в виде стека, которые наглядно позволяет увидеть возможности реализации запросов, предусмотренных алгоритмом, т.е. осуществление ряда операций над данными такой структуры. Описание алгоритма программным способом реализовано при помощи языка С++. Область применения алгоритма достаточно обширна, т.к сам алгоритм представляет собой один из способов обработки информации. Работа с различного рода данными является очень актуальной. Решение таких задач позволяется сократить затрачиваемое время на обработку данных и повысить эффективность самой работы.
Популярное: Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной... Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы... Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (164)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |