スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

電卓ソース

/************************************************************
make qoopty

2006/03/16 電卓完成 version.1.00
2006/03/19 version 1.01b

************************************************************/
#include
#include
#include
#include
#include
#include"main.hpp"
//main.hpp はべつで


using namespace std;


tg_makelist::tg_makelist()
{
cout << "tg_makelist()_constract" << endl;
p_tokens = tokens.begin();

}

tg_makelist::~tg_makelist()
{
cout << "tg_makelist()_destract" << endl;
}



void tg_makelist::list_set(){
tg_cell cell;

for(counter = 0; counter if(numerical[counter]>='0' && numerical[counter]<='9'){
cell.num_para = 1;
cell.number = change_number();
tokens.push_back(cell);
}else{
cell.num_para = 0;
cell.operant = numerical[counter];
tokens.push_back(cell);
}
}
}

int tg_makelist::change_number()
{
string num_buff;

do{
num_buff += numerical[counter];

++counter;
}while(numerical[counter]>='0' && numerical[counter]<='9');
--counter;

return atoi(num_buff.c_str());
}

int tg_cell::operator==(tg_cell ob)
{
if(num_para == ob.num_para && num_para == 0){
return (operant == ob.operant);
}
if(num_para == ob.num_para && num_para == 1){
return (number == ob.number);
}
return (num_para == ob.num_para);
}

int tg_cell::operator!=(tg_cell ob)
{
return (num_para != ob.num_para) || (number !=ob.number) || (operant != ob.operant);
}

ostream &operator<<(ostream &stream, const tg_cell &ob)
{

stream << "num_para: " << ob.num_para;
if(ob.num_para == 1){
stream << "number; " << ob.number;
}else{
stream << "opernat: " << ob.operant;
}
return stream;
}

ostream &operator<<(ostream &stream, tg_analyze &ob)
{
stream << "tg_analyze now"<< endl;
stream << ob.result();
return stream;
}

istream &operator>>(istream &stream, tg_makelist &ob)
{
stream >> ob.numerical;
ob.list_set();

return stream;
}

tg_analyze::tg_analyze( list &tokens)
{
cout << "tg_analyze constractor"<< endl;
p_tokens = tokens.begin();
ep_tokens = tokens.end();


}

tg_analyze::~tg_analyze()
{
cout << "tg_analyzes distractor"<< endl;
}

void tg_analyze::analyzer()
{

while(p_tokens != ep_tokens){
addsub();
++p_tokens;
}

}

void tg_analyze::addsub()
{
muldiv();
if(p_tokens->operant =='+'){
++p_tokens;
if(p_tokens == ep_tokens) throw 1;
muldiv();
set_calc.set('+');
cout << "+"<< endl;

}
if(p_tokens->operant =='-'){
++p_tokens;
if(p_tokens == ep_tokens) throw 1;
muldiv();
set_calc.set('-');
cout << "-" << endl;
}
}

void tg_analyze::muldiv()
{
exper();
if(p_tokens->operant =='*'){
++p_tokens;
if(p_tokens == ep_tokens) throw 1;
exper();
set_calc.set('*');
cout << "*"<< endl;

}
if(p_tokens->operant =='/'){
++p_tokens;
if(p_tokens == ep_tokens) throw 1;
exper();
set_calc.set('/');
cout << '/'<< endl;
}
}

void tg_analyze::exper()
{
if(p_tokens->num_para == 0){
if(p_tokens->operant == '('){
++p_tokens;
if(p_tokens == ep_tokens) throw 1;
addsub();
if(p_tokens->operant == ')'){
++p_tokens;
if(p_tokens == ep_tokens) throw 1;
}
}
}else if(p_tokens->num_para == 1){
set_calc.set(p_tokens->number);
cout << p_tokens->number << endl;
}
}

int tg_analyze::result()
{
cout << "tg_analuze::result()"<< endl;
return set_calc.output();

}

int tg_set_calc::output()
{
return numbers.top();
}


tg_set_calc::tg_set_calc() {cout << "tg_set_calc constractor"<< endl;}
tg_set_calc::~tg_set_calc(){cout << "tg_set_calc distractor" << endl;}

void tg_set_calc::set(char operant)
{

switch((int)operant){
case '+':
sum();
return ;

case '-':
subtract();
return ;

case '*':
mul();
return ;

case '/':
div();
return ;

default:
cout << "error_operant" << endl;
exit(1);
}
}

void tg_set_calc::set(int number)
{
numbers.push(number);

}


void tg_set_calc::sum()
{
cout << "push_sum"<< endl;
int n1, n2;
if(numbers.empty()) throw(2);
n1 = numbers.top();
numbers.pop();
if(numbers.empty()) throw(2);
n2 = numbers.top();
numbers.pop();
numbers.push(n2 + n1);
}

void tg_set_calc::subtract()
{
int n1, n2;
if(numbers.empty()) throw(2);
n1 = numbers.top();
numbers.pop();
if(numbers.empty()) throw(2);
n2 = numbers.top();
numbers.pop();
numbers.push(n2 - n1);
}

void tg_set_calc::mul()
{
int n1, n2;
if(numbers.empty()) throw(2);
n1 = numbers.top();
numbers.pop();
if(numbers.empty()) throw(2);
n2 = numbers.top();
numbers.pop();
numbers.push(n2 * n1);
}

void tg_set_calc::div()
{
int n1, n2;
n1 = numbers.top();
numbers.pop();
n2 = numbers.top();
numbers.pop();
numbers.push(n2 / n1);

}



int main()
{
try{
start:
tg_makelist makelist;

cin >> makelist;
tg_analyze analyze(makelist.tokens);

analyze.analyzer();

cout << "analyze" << endl;
cout <<"\nasnwer: " << analyze << endl;


return 0;
}
catch(int &i){
if(i == 1) cout << "opernat_error"<< endl;
if(i == 2) cout << "stack_error" << endl;
goto start;
}
catch(bad_alloc){
cout << "memory_error" << endl;
exit(1);
}
catch(...){
cout << "bad_error" << endl;
exit(1);
}

}
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

かみさまみならい

Author:かみさまみならい
FC2ブログへようこそ!

最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム

この人とブロともになる

ブログ内検索
RSSフィード
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。