Висновки
Під час розробки програми мною були засвоєні основні функції мови C++. Створивши програму-калькулятор, я здійснив можливість користувачу виконувати в ній основні дії. В програмі застосовані способи та прийоми роботи з вказівниками та різноманітними функціями. Основна задача полягає у виконанні елементарних арифметичних дій, виведення таких констант як PI та експоненти, виконання дій з ними. Дана програма дозволяє зручно виконувати дії використовуючи дужки. Використовувати її можна у будь яких організаціях.
Також неможна не згадати, що завдяки написанню даної курсової роботи я отримав хороший практичний досвід у використанні функцій програмування.
Перелік використаної літератури
1. Стефенс Д.Р.С++.Сборник рецептов. – КУДИЦ-ПРЕСС, 2007. – 624 с. – ISBN 5-91136-0306
2. К. Джамаса. Учимся програмировать на языке С++: Пер. С англ.. – Москва: Мир, 1997. 320с.
3. Шпак З.Я. Програмування мовою С –Львів: Оріяна-Нова, 2006 р.-432с.
4. С++, Культин Н.Б, СПб:БХВ-Петербург, 2005г. 288с.
5. Герберт Шилдт. Полный справочник по С++=С++:The Complete
6. Reference. – 4-е изд. – М. Вильямс, 2006. – 800с. ISBN 0-07-2226803
Додаток. Лістинг програми мовою с
#include <iostream>
#include <string>
#include <map>
#include <cctype>2
#include <sstream>
#include <conio.h>
using namespace std;
istream* input;
int no_of_errors;
map<string,double> table;
double number_value;
string string_value;
int no_of_strings=0;
enum Token_value
{
NAME,NUMBER,END,PLUS='+',MINUS='-',MUL='*',DIV='/',
PRINT=',',ASSIGN='=',LP='(',RP=')'
};
Token_value curr_tok=PRINT;
double term(bool get);
double prim(bool get);
double expr(bool get);
int error(const string &s);
Token_value get_token();
int main(int argc, char* argv[])
{
switch(argc)
{
case 1:
input=&cin;
break;
case 2:
input=new istringstream(argv[1]);
break;
default:
error("To mach parameters!!!");
return 1;
};
table ["pi"]=3.1415926535897932385;
table["e"] =2.7128272824590452354;
while(input)
{
get_token();
if(curr_tok==END)break;
if(curr_tok==PRINT)continue;
cout<<expr(false)<<'\n';
};
if(input!=&cin)delete input;
return no_of_errors;
};
double expr(bool get)
{
double left=term(get);
for(;;)
{
switch(curr_tok)
{
case PLUS : left+=term(true);break;
case MINUS : left-=term(true);break;
default : return left;
};
};
};
double term(bool get)
{
double left=prim(get);
for(;;)
{
switch(curr_tok)
{
case MUL : left*=prim(true);break;
case DIV : if(double d=prim(true))
{
left/=d;
break;
};
return error("DIVIZION BY ZERO");
default : return left;
};
};
};
double prim(bool get)
{
if(get)get_token();
switch(curr_tok)
{
case NUMBER :
{
double v=number_value;
get_token();
return v;
};
case NAME :
{
double&v=table[string_value];
if(get_token()==ASSIGN)v=expr(true);
return v;
};
case MINUS : return -prim(true);
case LP :
{
double e=expr(true);
if(curr_tok!=RP)return error(") EXPECTED");
get_token();
return e;
};
default : return error("PRIMARY EXPRESSION EXPECTED");
};
};
Token_value get_token()
{
char ch=0;
do{if(!input->get(ch))return curr_tok=END;}
while(ch!='\n'&&isspace(ch));
switch(ch)
{
case 0 : return curr_tok=END;
case ':': case '*': case '/': case '+':
case '-': case '(': case ')':
case '=' :
return curr_tok=Token_value(ch);
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
case '8': case '9':
case '.' :
input->putback(ch);
*input>>number_value;
return curr_tok=NUMBER;
case ';' :
case '\n' :
no_of_strings++;
return curr_tok=PRINT;
default :
if (isalpha(ch))
{
string_value=ch;
while(input->get(ch)&&isalpha(ch))
string_value.push_back(ch);
input->putback(ch);
return curr_tok=NAME;
};
error("INCORECT WORD");
return curr_tok=PRINT;
};
};
int error(const string &s)
{
no_of_errors++;
cerr<<no_of_strings<<" :-: ERROR:"<<s<<'\n';
return 1;
};