Створення програми із описом основних структур, процедур, модулів, файлів
Else if (!strcmp (curToken, «ctg»)) { typToken = PARSER_CTG; return true; }. Else if (!strcmp (curToken, «cos»)) { typToken = PARSER_COS; return true; }. MessageBox: Show («Багато кроків (Max="+maxCollectionSize+»)" ,. If (openFileDialog1→ShowDialog () == System: Windows: Forms:DialogResult:OK). Else if (!strcmp (curToken, «th»)) { typToken = PARSER_TH; return true; }. Else if (!strcmp (curToken… Читать ещё >
Створення програми із описом основних структур, процедур, модулів, файлів (реферат, курсовая, диплом, контрольная)
Дана частина програми, дозволяє запустити головне вікно програми:
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.
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.
#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.1 415 926 535 897 932 412 023 218 372 608.
// 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=='').
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.
delete history[i];
history.clear ();
root = NULL;
throw error;
return;
}.
bool TParser: GetToken (void).
{.
*curToken = '';
while (expr[pos]==' ') pos++;
if (expr[pos]=='').
{.
curToken[0] = '';
typToken = PARSER_END;
return true;
}.
else if (IsDelim ()).
{.
curToken[0] = expr[pos++];
curToken[1] = '';
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] = '';
int len = strlen (curToken);
for (i=0; 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] = '';
typToken = PARSER_NUMBER;
return true;
}.
else.
{.
curToken[0] = expr[pos++];
curToken[1] = '';
SendError (1);
}.
return false;
}.
bool TParser: Compile (char *_expr).
{.
pos = 0;
expr = _expr;
*curToken = '';
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:
returnCalcTree (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 ();
}.