Реалізація програми для зчитування функції з файлу в об’єктно орієнтованому стилі з використанням, процедур та функцій мови С++
Алгоритм як система точно сформованих правил, що визначає послідовність команд, які потрібно виконати над вихідними даними для отримання результату. Визначення процедури, яка відкриває вікно з числовими значеннями функції на мові програмування С++.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | украинский |
Дата добавления | 21.07.2017 |
Размер файла | 214,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
Размещено на http://www.allbest.ru
Вступ
Метою написання курсового проекту є реалізація програми в об'єктно орієнтованому стилі з використанням, процедур та функцій мовою С++. При виконанні завдання потрібно набути практичних навиків при програмуванні мовою С++ та зрозуміти її концепції.
Для забезпечення виконання поставленого завдання, потрібно розробити деякі процедури та функції, які б забезпечували реалізацію даного завдання.
1. Розробка алгоритму функціонування
Алгоритм - система точно сформованих правил, що визначає (задає) послідовність команд (дій, вказівок), які потрібно виконати над вихідними даними для отримання результату за скінчене число кроків.
Процедура - блок з формальними параметрами або без них, виконання якого відбувається після приведення його до стану готовності до виконання.
Дана програма складається з таких процедур:
private: System::Void Form1_Load(System::Object sender, System::EventArgs e) - це є головна процедура, яка виводить на екран головну форму.
private: System::Void відкритиToolStripMenuItem_Click(System::Object sender, System::EventArgs e) - процедура яка відкриває файл.
private: System::Void вийтиToolStripMenuItem_Click(System::Object sender, System::EventArgs e) - процедура яка закриває програму
private: System::Void button2_Click(System::Object sender, System::EventArgs e) - процедура яка відкриває вікно з числовими значеннями функції.
private: System::Void button1_Click(System::Object sender, System::EventArgs e)- процедура , яка виводить графік функції.
Процедуру визначають за допомогою опису, що розміщений у розділі процедур і функцій. Вона має таку ж структуру, як і підпрограма, тобто складається із заголовку і блоку - тіла процедури. Заголовок починається із службового слова, що містять ім'я, що відповідає цій процедурі, а також може містити параметри - деяку додаткову інформацію, яка полегшує використання цієї процедури.
2. Створення програми із описом основних структур, процедур, модулів, файлів
Дана частина програми, дозволяє запустити головне вікно програми:
int main(void)
{
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
// Создание главного окна и его запуск
Application::Run(gcnew Form1());
return 0;
}
Функція, яка відкриває файл і зчитує функцію:
private: System::Void відкритиToolStripMenuItem_Click(System::Object sender, System::EventArgs e) {
if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)
{
String FName = openFileDialog1->FileName;
if (FName != "")
{
textBox1->Text = System::IO::File::ReadAllText(FName);;
}
}
}
Функція, яка будує графік функції в заданих межах:
private: System::Void button1_Click(System::Object sender, System::EventArgs e) {
double x1, x2, dX; String s = textBox1->Text;
this->chart1->Visible = false;
if (Parse(this->x1->Text, x1) == false ||
Parse(this->x2->Text, x2) == false ||
Parse(this->dX->Text, dX) == false) {
MessageBox::Show("Введіть x1,x2,dx", "Помилка", MessageBoxButtons::OK);
return;
}
if (x1 >= x2 || x1 + dX >= x2) {
MessageBox::Show("Неправильний ввід. Потрібно x1<x1+dX<x2", "Помилка", MessageBoxButtons::OK);
return;
}
if ((x2 - x1) / dX > maxCollectionSize) {
MessageBox::Show("Багато кроків (Max="+maxCollectionSize+")",
"Помилка", MessageBoxButtons::OK);
dX = (x2 - x1) / (double)maxCollectionSize;
this->dX->Text = Math::Round(dX, 2).ToString(nfi);
}
this->chart1->Visible=true;
if (!Check (s,x1)) {
MessageBox::Show ("Введіть вірну функцію, неможливо обчислити значення функції при заданому значені х",
"Помилка",MessageBoxButtons::OK);
return;
}
Go (s, x1, x2, dX);
}
Код, що перетворює стрічку в функцію f(x):
#include "stdafx.h"
#include <math.h>
#include "parser.h"
#define OP_PLUS 0
#define OP_MINUS 1
#define OP_MULTIPLY 2
#define OP_DIVIDE 3
#define OP_PERCENT 4
#define OP_POWER 5
#define OP_UMINUS 6
#define OP_SIN 10
#define OP_COS 11
#define OP_TG 12
#define OP_CTG 13
#define OP_ARCSIN 14
#define OP_ARCCOS 15
#define OP_ARCTG 16
#define OP_ARCCTG 17
#define OP_SH 18
#define OP_CH 19
#define OP_TH 20
#define OP_CTH 21
#define OP_EXP 22
#define OP_LG 23
#define OP_LN 24
#define OP_SQRT 25
#define OP_X 26
// PI...
#define M_PI 3.1415926535897932384626433832795
// Member functions
TParserNode *TParser::CreateNode(double _value, TParserNode *_left, TParserNode *_right)
{
TParserNode *pNode = new TParserNode(_value, _left, _right);
history.push_back(pNode);
return pNode;
}
void TParser::SendError(int errNum)
{
static char *errs[7] = { NULL,
NULL,
"Unexpected end of expression",
"End of expression expected",
"'(' or '[' expected",
"')' or ']' expected",
NULL
};
static char buffer[80];
int len = strlen(curToken);
if(*curToken=='\0')
strcpy(curToken, "EOL");
switch(errNum)
{
case 0:
sprintf(buffer, "Unknown keyword: '%s'", curToken);
errs[0] = buffer;
break;
case 1:
sprintf(buffer, "Unknown symbol: '%s'", curToken);
errs[1] = buffer;
break;
case 6:
sprintf(buffer, "Unexpected '%s'", curToken);
errs[6] = buffer;
break;
}
TError error(errs[errNum], pos-len);
for(int i=0; i<history.size(); i++)
delete history[i];
history.clear();
root = NULL;
throw error;
return;
}
bool TParser::GetToken(void)
{
*curToken = '\0';
while(expr[pos]==' ') pos++;
if(expr[pos]=='\0')
{
curToken[0] = '\0';
typToken = PARSER_END;
return true;
}
else if(IsDelim())
{
curToken[0] = expr[pos++];
curToken[1] = '\0';
switch(*curToken)
{
case '+': typToken = PARSER_PLUS; return true;
case '-': typToken = PARSER_MINUS; return true;
case '*': typToken = PARSER_MULTIPLY; return true;
case '/': typToken = PARSER_DIVIDE; return true;
case '%': typToken = PARSER_PERCENT; return true;
case '': typToken = PARSER_POWER; return true;
case '[':
case '(': typToken = PARSER_L_BRACKET; return true;
case ']':
case ')': typToken = PARSER_R_BRACKET; return true;
}
}
else if(IsLetter())
{
int i=0;
while(IsLetter()) curToken[i++] = expr[pos++];
curToken[i] = '\0';
int len = strlen(curToken);
for(i=0; i<len; i++)
if(curToken[i]>='A' && curToken[i]<='Z')
curToken[i] += 'a' - 'A';
if(!strcmp(curToken, "x")) { typToken = PARSER_X; return true; }
else if(!strcmp(curToken, "pi")) { typToken = PARSER_PI; return true; }
else if(!strcmp(curToken, "e")) { typToken = PARSER_E; return true; }
else if(!strcmp(curToken, "sin")) { typToken = PARSER_SIN; return true; }
else if(!strcmp(curToken, "cos")) { typToken = PARSER_COS; return true; }
else if(!strcmp(curToken, "tg")) { typToken = PARSER_TG; return true; }
else if(!strcmp(curToken, "ctg")) { typToken = PARSER_CTG; return true; }
else if(!strcmp(curToken, "arcsin")) { typToken = PARSER_ARCSIN; return true; }
else if(!strcmp(curToken, "arccos")) { typToken = PARSER_ARCCOS; return true; }
else if(!strcmp(curToken, "arctg")) { typToken = PARSER_ARCTG; return true; }
else if(!strcmp(curToken, "arcctg")) { typToken = PARSER_ARCCTG; return true; }
else if(!strcmp(curToken, "sh")) { typToken = PARSER_SH; return true; }
else if(!strcmp(curToken, "ch")) { typToken = PARSER_CH; return true; }
else if(!strcmp(curToken, "th")) { typToken = PARSER_TH; return true; }
else if(!strcmp(curToken, "cth")) { typToken = PARSER_CTH; return true; }
else if(!strcmp(curToken, "exp")) { typToken = PARSER_EXP; return true; }
else if(!strcmp(curToken, "lg")) { typToken = PARSER_LG; return true; }
else if(!strcmp(curToken, "ln")) { typToken = PARSER_LN; return true; }
else if(!strcmp(curToken, "sqrt")) { typToken = PARSER_SQRT; return true; }
else SendError(0);
}
else if(IsDigit() || IsPoint())
{
int i=0;
while(IsDigit()) curToken[i++] = expr[pos++];
if(IsPoint())
{
curToken[i++] = expr[pos++];
while(IsDigit()) curToken[i++] = expr[pos++];
}
curToken[i] = '\0';
typToken = PARSER_NUMBER;
return true;
}
else
{
curToken[0] = expr[pos++];
curToken[1] = '\0';
SendError(1);
}
return false;
}
bool TParser::Compile(char *_expr)
{
pos = 0;
expr = _expr;
*curToken = '\0';
if(root!=NULL)
{
DelTree(root);
root = NULL;
}
history.clear();
GetToken();
if(typToken==PARSER_END) SendError(2);
root = Expr();
if(typToken!=PARSER_END) SendError(3);
history.clear();
return true;
}
TParserNode *TParser::Expr(void)
{
TParserNode *temp = Expr1();
while(1)
{
if(typToken==PARSER_PLUS)
{
GetToken();
temp = CreateNode(OP_PLUS, temp, Expr1());
}
else if(typToken==PARSER_MINUS)
{
GetToken();
temp = CreateNode(OP_MINUS, temp, Expr1());
}
else break;
}
return temp;
}
TParserNode *TParser::Expr1(void)
{
TParserNode *temp = Expr2();
while(1)
{
if(typToken==PARSER_MULTIPLY)
{
GetToken();
temp = CreateNode(OP_MULTIPLY, temp, Expr2());
}
else if(typToken==PARSER_DIVIDE)
{
GetToken();
temp = CreateNode(OP_DIVIDE, temp, Expr2());
}
else if(typToken==PARSER_PERCENT)
{
GetToken();
temp = CreateNode(OP_PERCENT, temp, Expr2());
}
else break;
}
return temp;
}
TParserNode *TParser::Expr2(void)
{
TParserNode *temp = Expr3();
while(1)
{
if(typToken==PARSER_POWER)
{
GetToken();
temp = CreateNode(OP_POWER, temp, Expr2());
}
else break;
}
return temp;
}
TParserNode *TParser::Expr3(void)
{
TParserNode *temp;
if(typToken==PARSER_PLUS)
{
GetToken();
temp = Expr4();
}
else if(typToken==PARSER_MINUS)
{
GetToken();
temp = CreateNode(OP_UMINUS, Expr4());
}
else
temp = Expr4();
return temp;
}
TParserNode *TParser::Expr4(void)
{
TParserNode *temp;
if(typToken>=PARSER_SIN && typToken<=PARSER_X)
{
temp = CreateNode(OP_SIN-PARSER_SIN+typToken);
GetToken();
if(typToken!=PARSER_L_BRACKET) SendError(4);
GetToken();
temp->left = Expr();
if(typToken!=PARSER_R_BRACKET) SendError(5);
GetToken();
}
else
temp = Expr5();
return temp;
}
TParserNode *TParser::Expr5(void)
{
TParserNode *temp;
switch(typToken)
{
case PARSER_NUMBER:
temp = CreateNode((double)atof(curToken));
GetToken();
break;
case PARSER_PI:
temp = CreateNode((double)M_PI);
GetToken();
break;
case PARSER_E:
temp = CreateNode((double)exp(1.));
GetToken();
break;
case PARSER_L_BRACKET:
GetToken();
temp = Expr();
if(typToken!=PARSER_R_BRACKET) SendError(5);
GetToken();
break;
default:
SendError(6);
}
return temp;
}
double TParser::Evaluate(void)
{
result = CalcTree(root);
return result;
}
double TParser::CalcTree(TParserNode *tree)
{
static double temp;
if(tree->left==NULL && tree->right==NULL)
return tree->value;
else
switch((int)tree->value)
{
case OP_PLUS:
return CalcTree(tree->left)+CalcTree(tree->right);
case OP_MINUS:
return CalcTree(tree->left)-CalcTree(tree->right);
case OP_MULTIPLY:
return CalcTree(tree->left)*CalcTree(tree->right);
case OP_DIVIDE:
return CalcTree(tree->left)/CalcTree(tree->right);
case OP_PERCENT:
return (int)CalcTree(tree->left)%(int)CalcTree(tree->right);
case OP_POWER:
return (double)pow(CalcTree(tree->left),CalcTree(tree->right));
case OP_UMINUS:
return -CalcTree(tree->left);
case OP_SIN:
return sin(CalcTree(tree->left));
case OP_COS:
return cos(CalcTree(tree->left));
case OP_TG:
return tan(CalcTree(tree->left));
case OP_CTG:
return 1.0/tan(CalcTree(tree->left));
case OP_ARCSIN:
return asin(CalcTree(tree->left));
case OP_ARCCOS:
return acos(CalcTree(tree->left));
case OP_ARCTG:
return atan(CalcTree(tree->left));
case OP_ARCCTG:
return M_PI/2.0-atan(CalcTree(tree->left));
case OP_SH:
temp = CalcTree(tree->left);
return (exp(temp)-exp(-temp))/2.0;
case OP_CH:
temp = CalcTree(tree->left);
return (exp(temp)+exp(-temp))/2.0;
case OP_TH:
temp = CalcTree(tree->left);
return (exp(temp)-exp(-temp))/(exp(temp)+exp(-temp));
case OP_CTH:
temp = CalcTree(tree->left);
return (exp(temp)+exp(-temp))/(exp(temp)-exp(-temp));
case OP_EXP:
return exp(CalcTree(tree->left));
case OP_LG:
return log10(CalcTree(tree->left));
case OP_LN:
return log(CalcTree(tree->left));
case OP_SQRT:
return sqrt(CalcTree(tree->left));
case OP_X:
return x[int(CalcTree(tree->left))];
}
return 0;
}
void TParser::DelTree(TParserNode *tree)
{
if(tree==NULL) return;
DelTree(tree->left);
DelTree(tree->right);
delete tree;
return;
}
Функція, що відкриває вікно відображення числових значень:
private: System::Void button2_Click(System::Object sender, System::EventArgs e) {
Form2 F2 = gcnew Form2;
using namespace System::Windows::Forms::DataVisualization::Charting;
for each (DataPoint p in chart1->Series[0]->Points) {
F2->Do (p->XValue, p->YValues[0],nfi);
}
F2->Show();
}
3. Опис технології роботи програми - ввід даних, основні режими роботи, вивід результатів
Після запуску програми на екрані комп'ютера з'являється вікно яке головне вікно програми курсової роботи (мал. 1).
Мал. 1
Далі натискаємо на вкладку Файл->Відкрити і завантажуємо файл із записаною в ньому функцією, для якої потрібно побудувати графік (мал. 2).
Мал. 2
Завантаживши файл в поле буде записана функція. Для побудови графіка потрібно вказати межі графіка та крок і натиснути на кнопку «Побудувати». Після цього на головному вікні з'явиться графік даної функції (мал. 3).
Мал. 3
Для того, щоб переглянути числові значення функції потрібно натиснути на кнопку «Показати числові значення» (мал. 4).
Мал. 4
Висновок
алгоритм числовий програмування
В ході виконання курсової роботи було розроблено windows додаток, що дозволяє будувати графіки заданої функції. Програма має можливість зчитувати функцію з файлу і будувати її графік на заданому користувачем діапазоні із заданим кроком. Програма має зручний та зрозумілий графічний інтерфейс виконаний на основі windows-форм.
Даний додаток буде потрібний, як студентам чи учням в процесі навчання, так і професійним користувачам, в яких виникає необхідність в побудові графіків.
Написану програму було детально протестовано на тестових даних і помилок в процесі роботи не виникало.
Размещено на Allbest.ru
...Подобные документы
Редагування за допомогою текстового редактора NotePad вхідного файлу даних. Програмна реалізація основного алгоритму з використанням засобів об'єктно-орієнтованого програмування. Об’ява та опис класів і об'єктів. Розробка допоміжних програмних засобів.
курсовая работа [69,4 K], добавлен 14.03.2013Розробка програми на мові програмування С++ з використанням об'єктно-орієнтованого програмування. Робота з файлами, графікою, класами, обробка числової інформації. Графічні засоби мови програмування. Алгоритм задачі та допоміжні програмні засоби.
курсовая работа [102,5 K], добавлен 14.03.2013Використання математичного сопроцесора або його емулятора при програмуванні на мові асемблера з використанням дробових чисел. Створення програми на мові ASM-86, яка реалізує функції [x], {x}, |X|. Алгоритм перетворення цілого числа в дійсне та навпаки.
курсовая работа [12,4 K], добавлен 08.08.2009Розробка програми на мові програмування С++ з використанням об’єктно-орієнтованого програмування, яка включає в себе роботу з файлами, класами, обробку числової інформації і роботу з графікою. Структура класів і об’єктів. Лістинг та алгоритм програми.
курсовая работа [104,4 K], добавлен 14.03.2013Програми і мови програмування. Алфавіт мови програмування. Лексеми, зарезервовані слова мови Pascal. Ідентифікатори, типи даних. Арифметичні вирази, операції. Стандартні функції, структура програми. Процедури введення-виведення. Правила написання команд.
лекция [445,0 K], добавлен 24.07.2014Розгляд особливостей мови програмування С++: основні можливості, характеристика функцій. Аналіз файлів з вхідними даними. Використання похідних класів як ефективний засіб об’єктно-орієнтованого програмування. Способи роздруківки графічного вирішення.
курсовая работа [510,9 K], добавлен 14.03.2013Зчитування числової інформації з файлу DATA.txt, аналізування, обробка та виконання графічного відображення. Редагування файлу тексту програми. Метод відображення кнопки з надписом на екрані. Створення нових класів на основі інших, вже створених.
курсовая работа [196,2 K], добавлен 14.03.2013Концепції об'єктно-орієнтованого програмування. Методи створення класів. Доступ до методів базового класу. Структура даних, функції. Розробка додатку на основі діалогових вікон, програми меню. Засоби розробки програмного забезпечення мовами Java та С++.
курсовая работа [502,5 K], добавлен 01.04.2016Принципи об'єктно-орієнтованого підходу. Розробка програмного комплексу з використанням цього алгоритму і користувальницьких класів на мові програмування С++. Реалізація простого відкритого успадкування. Тестування працездатності системи класів.
курсовая работа [98,0 K], добавлен 06.05.2014Загальні відомості про процедури та функції. Характеристика, особливості і можливості мови Pascal, її використання для розробки наочних, компактних, структурованих програм, створення умов для систематичного і цілеспрямованого процесу програмування.
реферат [30,0 K], добавлен 13.11.2010Особливості редагування за допомогою текстового редактора NotePad вхідного файлу. C++ як універсальна мова програмування, знайомство с функціями. Характеристика графічних засобів мови С. Аналіз основних понять об’єктно-орієнтованого програмування.
курсовая работа [123,3 K], добавлен 14.03.2013Визначення поняття автоматизації та інформаційної технології. Вибір мови програмування, аналіз бібліотеки класів та системи масового обслуговування. Реалізація інтерфейсу програми Visual C# 2010 Express. Діаграма класів до основних функцій программи.
курсовая работа [1,5 M], добавлен 28.04.2012Розробка програми для моделювання роботи алгоритму Дейкстри мовою C# з використанням об’єктно-орієнтованих принципів програмування. Алгоритм побудови робочого поля. Програмування графічного інтерфейсу користувача. Тестування програмного забезпечення.
курсовая работа [991,4 K], добавлен 06.08.2013Розробка програми імітації схеми життя лісового біому. Алгоритм пересування по головному полю. Основні глобальні функції програми. Динамічна ідентифікація типу даних. Вирішення завдань в області об’єктно-орієнтованого програмування засобами C++.
курсовая работа [423,1 K], добавлен 26.11.2014Складання блок-схеми і програми обчислення значення функції з заданою точністю та програми табулювання функції з заданим кроком. Обчислення двох значень поліному за допомогою схеми Горнера. Програма введення вхідних даних з клавіатури і з файлу ZAD4.DAT.
контрольная работа [168,6 K], добавлен 29.09.2010Робота з цілими значеннями за допомогою арифметичних команд. Механізм роботи команд передачі керування мови Assembler. Типи даних "FPU" та система регістрів. Програма та її структура на мові Assembler, робота з директивами. Текстовий режим відеоадаптера.
лабораторная работа [1,7 M], добавлен 31.05.2014Аналіз особливостей мови програмування Java та середовища Android Studio. Розробка програмного забезпечення для якісного та ефективного вивчення іноземних слів. Побудова базових алгоритмів і структури даних. Вибір мови програмування, реалізація програми.
курсовая работа [335,3 K], добавлен 11.01.2015Організація двозв’язного списку об’єктів в динамічній пам’яті. Функція Power як авторська реалізація функції піднесення в квадрат. Реалізація зв’язку між елементами і їх координатами у файл. Відображення результату в полі Crossed класу TTriangle.
курсовая работа [27,3 K], добавлен 14.03.2013Стандартні розміри чисел при програмуванні на мові Асемблера. Робота з дробовими числами, використання математичного сопроцесора або його емулятора. Створення програми, яка б перетворювала ціле число в дробове і навпаки, а також функції [x], {x}, |X|.
курсовая работа [22,0 K], добавлен 12.08.2009Характеристика методів та етапів створення простих програм на мові програмування С++. Особливості структури та порядку запуску програми. Функції вводу і виводу та маніпулятори мови С++. Робота з одновимірними масивами. Символьна інформація та рядки.
дипломная работа [91,2 K], добавлен 19.06.2010