Показать полную графическую версию : Калькулятор на С++
Просто я позно спахватился,думал, что легко написать... а в эту пятницу уже курсач сдавать(( завтра буду разгребать, чуть что задам вопросиков..=))
Вот, пишу спросить немного по программе
у меня 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;
}
Тока пожалуйста не посылайте читать книжки.....и если можно объясните попонятней) и всё , что я закоментил, это важно для меня....
calc_var calculator; »
Вон у тебя calc.cpp реализует тип 'calc_var'. Соотв этой строкой ты создаешь переменную "calculator" типа calc_var, реализация которой написана в calc.cpp.
try// этот оператор что обозначает, опишите, как он работает »
Операторы try... catch. Нужны, чтобы "ловить" ошибки и программировать действия программы в том или ином случае. Что собственно и делается в программе.
Что касается отличий virtual, protected и т.п. - все таки придется тебе прочесть главу по объектам. Хотя бы "по диагонали".
...
calc.cpp завтра распишу. Говорил тебе - пиши сам, проще будет. Вечно не послушаются...
Всё, уже ненада, защитил курсовую и так) большое спасибо.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.