C/C++ - Калькулятор на С++

Аватара пользователя
lxa85

Re: C/C++ - Калькулятор на С++

Сообщение lxa85 »

Buchik, жаль что сдался, ну да ладно. Попробуем воскресить бренное тело Изображение С готовыми исходниками разобрался? Принцип их работы понятен?
Аватара пользователя
Buchik

Re: C/C++ - Калькулятор на С++

Сообщение Buchik »

Вот, пишу спросить немного по программе

у меня 3 файла, начальный, объявление класса и его компонентов, и деструкторы и конструкторы.



я буду помечать в коде, что хотел бы узнать, что обозначает. помогите пожалуйста.А то я отчёт по курсовой написал, а его ещё и защитить надо....



файл calc1.cpp



Код:

Код: Выделить всё

#include "stdafx.h"
#include "calc.h"
#include <iostream>
#include <locale>
using namespace std;
int main(int argc, char* argv[])
{
	wcout.imbue(locale("rus_rus.866"));
	char line [80];
	calc_var calculator;// что это обозначает?
	wcout << L"Доступные операции : +-*/ \n" ;
	wcout<< L"Введите 'z' для выхода.\n";
	while(true)
	{
		wcout << L"Введите выражение: \n";
		cin.getline(line,79);
		if(*line=='z')break;
		try// этот оператор что обозначает, опишите, как он работает
		{
		calculator.SetFunction(line);
		wcout << L"Ответ : "<< calculator.proceed() <<"\n" ;
		}
		catch(calc_var::SyntaxError e)
		{
			wcout << L"Синтаксическая ошибка :" <<e.p<<"\n" ;
		}
		catch (calc_var::divzero)
		{
			wcout << L"Ошибка.Деление на ноль!(Или равно бесконесность!)\n" ;
		};
	}
	return 0;
}

файл calc.h



Код:

Код: Выделить всё

#include <string.h>
#include <ctype.h>
#include <math.h>
class calc_var  
{
public:
	double proceed();
	void SetFunction(char* lpszCommand);
	calc_var(char* lpszCommand);
	calc_var();
	struct divzero{};
	struct SyntaxError
	{
		const char* p;
		SyntaxError(const char* q){p=q;}
	};
	virtual ~calc_var();//что обозначает виртуал??
private:
	virtual	void GetToken();
	double mul_div();
	enum Tok_Type {UNDEF, NUMBER, OPERATOR, END};
	Tok_Type CurrTok;
protected://чем протектед от привайт отличается??? при чём ниже объявляются функции, а почему потом они вызываются , как конструкторы?
	char* pCurrPos;
	char TokenValue[16];
	double add_sub();
	char Function[255];
	virtual double prim();
};

файл calc.cpp



Код:

Код: Выделить всё

#include "stdafx.h"
#include "calc.h"
#include <string>
#include "ctype.h"
#include <math.h>
//////////////////////////////////////////////////////////////////////
// конструкторы/деструкторы
//////////////////////////////////////////////////////////////////////
calc_var::calc_var()//что это делает, и где оно вызывается??
{
 memset(Function,0,256);
 pCurrPos=Function;
}
calc_var::~calc_var() 
{
}
calc_var::calc_var(char* lpszCommand)// что это? и где вызывается??
{
	SetFunction(lpszCommand);
}
void calc_var::SetFunction(char* lpszCommand)// что этот конструктор делает?
{
	strncpy_s(Function,lpszCommand,255);//strncpy_s(); что это обозначает??
	Function[255]=0;
	pCurrPos=Function;
}
double calc_var::proceed()
{
	if (strlen(Function)<1) throw(SyntaxError("No Expression"));//strlen(Function) - это что-то вроди если символов в ведённой линии маньше 1-цы то выыодит синтаксическую ошибку?
	return add_sub();
}
double calc_var::add_sub()
{
	double left=mul_div();
	while(true)
	{
		switch (*TokenValue) 
		{
		case '+':  left+=mul_div(); break;
		case '-': left-=mul_div();break;
		default: return left;
		}
	}
}
double calc_var::mul_div()
{
	double left=prim();
	while (true) 
	{
		switch(*TokenValue)
		{
		case '(': if(pCurrPos-Function)pCurrPos--;
				//предоставлена возможность не ставиь знак * перед и после скобки.
			//уменьшаем текущую разбираемую позицию на 1 и далее вызывается стандартное умножение
		case '*': left*=prim();break;
		case '/': { double d=prim();
					if(d==0) throw(divzero());
					left/=d; 
					break;}
		default:return left;
		}
	}
}
double calc_var::prim()// что делает этот конструктор???, шде он вызывается я вижу , но что он именно делает?
{
	GetToken();
	switch(CurrTok)
	{
	case NUMBER://что делает ,если кейс попадает на это условие???
		{
			double temp=atof(TokenValue);
			GetToken();
			return temp;
		}
	case OPERATOR:
		{
			switch(*TokenValue)
			{
				case '-':return -prim();
				case '+':return prim();
				case '(':
					{
						double temp=add_sub();
						if(*TokenValue!=')') throw(SyntaxError(") expected"));
						GetToken();
						return temp;
					}
			}
			throw(SyntaxError("Incorrect operator"));
		}
	default:throw(SyntaxError("No Expression"));
	}
}
void calc_var::GetToken()//это отсортировывает операции в отдельную переменную??
{
	if(!pCurrPos){ CurrTok=END; *TokenValue=0; return;}//конец выражения
	while(*pCurrPos==' ')pCurrPos++;//Пропускаем пробелы в начале
	char* temp=TokenValue;
	if(isdigit(*pCurrPos))
	{
		CurrTok=NUMBER;
		while(isdigit(*pCurrPos)||(*pCurrPos=='.'))*temp++=*pCurrPos++;
	}
	else if(strchr("+-*/()",*pCurrPos))//strchr("+-*/()",*pCurrPos) что за условие проверяет этот иф???strchr что обозначает??
	{
		CurrTok=OPERATOR;
		//перейти к следующему символу
		*temp++=*pCurrPos++;//занесли в TokenValue оператор
	}
	else CurrTok=END;
	*temp=0;
}





Тока пожалуйста не посылайте читать книжки.....и если можно объясните попонятней) и всё , что я закоментил, это важно для меня....
Аватара пользователя
lxa85

Re: C/C++ - Калькулятор на С++

Сообщение lxa85 »

Цитата Buchik:



calc_var calculator;
C/C++ - Калькулятор на С++




Вон у тебя calc.cpp реализует тип 'calc_var'. Соотв этой строкой ты создаешь переменную "calculator" типа calc_var, реализация которой написана в calc.cpp.


Цитата Buchik:



try// этот оператор что обозначает, опишите, как он работает
C/C++ - Калькулятор на С++




Операторы try... catch. Нужны, чтобы "ловить" ошибки и программировать действия программы в том или ином случае. Что собственно и делается в программе.

Что касается отличий virtual, protected и т.п. - все таки придется тебе прочесть главу по объектам. Хотя бы "по диагонали".

...

calc.cpp завтра распишу. Говорил тебе - пиши сам, проще будет. Вечно не послушаются...
Аватара пользователя
Buchik

Re: C/C++ - Калькулятор на С++

Сообщение Buchik »

Всё, уже ненада, защитил курсовую и так) большое спасибо.
Ответить

Вернуться в «Программирование и базы данных»