Tam Sürümünü Görmek İçin : hesapmakinası hakkında yardım
slm keypad kullanarak c dilinde yazılmıs bir hesapmakinası lazım yani ln sin dort islem .. butur özelliklere sahip bir hesap makinası kodları lazım bana uardımcı ola bilecek bir arkadaşım var mı acaba
haciyasin
01/06/2005, 01:00
Aşağıda vereçeğim kodlar Borland builde 6 ile çelışmaktadır.
#include <iostream>
#include <stack>
#include <string>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <vector>
#include <fstream>
using namespace std;
vector<string> expr_poloneza;
long nivel_expr_poloneza = -1;
class pNod
{
public:
pNod();
string Text;
pNod *left,*right;
};
pNod::pNod()
{
Text = "";
}
pNod* gen_arb(long li,long ls,vector<string> expr_fara_paranteze ,long *P)
{
pNod *c = new pNod;
long i,j,min;
min = P[ls];
i = ls;
for(j = ls;j>=li;j--)
if(P[j]<min)
{
min = P[j];
i = j;
}
c->Text = expr_fara_paranteze[i];
if(li==ls)
c->left = c->right = NULL;
else
{
c->left = gen_arb(li,i-1,expr_fara_paranteze,P);
c->right = gen_arb(i+1,ls,expr_fara_paranteze,P);
}
return c;
}
void parc(pNod *c)
{
if(c!=NULL)
{
if(c->left) parc(c->left);
if(c->right) parc(c->right);
expr_poloneza.push_back(c->Text);
nivel_expr_poloneza++;
}
}
void citeste_expresie(string &expresie)
{
cout<<"Introduceti expresia aritmetica: "<<endl;
cin>>expresie;
}
float StrToFloat(string S)
{
ofstream T("temp.tmp");
T<<S;
T.close();
ifstream P("temp.tmp");
float F;
P>>F;
P.close();
return F;
}
string FloatToStr(float F)
{
ofstream T("temp.tmp");
T<<F;
T.close();
ifstream P("temp.tmp");
string S;
P>>S;
P.close();
return S;
}
float expr_value(string expresie)
{
int nivel_expr_formatabila = 0,nivel_expr_formatata = -1,nivel_expr_fara_paranteze = -1,i;
vector<string> expr_formatabila,expr_formatata,expr_finala,expr_f ara_paranteze;
long *prioritati,*P;
float f1,f2;
expr_formatabila.push_back("");
pNod *c;
for(i = 0;i<expresie.length();i++)
{
if(expresie[i]!='+'&&expresie[i]!='-'&&expresie[i]!='*'&&expresie[i]!='/'&&expresie[i]!='^'&&expresie[i]!='('&&expresie[i]!=')')
expr_formatabila[nivel_expr_formatabila]+=expresie[i];
else
{
if(expresie[i]=='-'&&(expresie[i-1]=='('||i==0))
{
nivel_expr_formatabila++;
expr_formatabila.push_back("-");
}
else
{
nivel_expr_formatabila++;
expr_formatabila.push_back("");
expr_formatabila[nivel_expr_formatabila]+=expresie[i];
nivel_expr_formatabila++;
expr_formatabila.push_back("");
}
}
}
for(i = 0;i<=nivel_expr_formatabila;i++)
if(expr_formatabila[i]!="")
{
expr_formatata.push_back(expr_formatabila[i]);
nivel_expr_formatata++;
}
try
{
if(expr_formatata[0]=="+"||expr_formatata[0]=="-"||expr_formatata[0]=="*"||expr_formatata[0]=="/"||expr_formatata[0]=="^")
throw 1;
}
catch(int eroare_first_operator)
{
cout<<"EROARE : Plasare eroanata a primului operator..."<<endl;
exit(1);
}
try
{
for(i = 0;i<nivel_expr_formatata;i++)
if((expr_formatata[i]=="+"||expr_formatata[i]=="-"||expr_formatata[i]=="*"||expr_formatata[i]=="/"||expr_formatata[i]=="^")&&(expr_formatata[i+1]=="+"||expr_formatata[i+1]=="-"||expr_formatata[i+1]=="*"||expr_formatata[i+1]=="/"||expr_formatata[i+1]=="^"))
throw i;
}
catch(int exceptie_operatori_consecutivi)
{
cout<<"EROARE : Operatori consecutivi in expresie..."<<endl;
exit(1);
}
try
{
int nivel = -1;
vector<string> paranteze;
for(i = 0;i<=nivel_expr_formatata;i++)
{
if(expr_formatata[i]=="(")
{
paranteze.push_back("(");
nivel++;
}
else
if(expr_formatata[i]==")")
if(paranteze[nivel]!="("||nivel==-1)
throw i;
else
{
paranteze.pop_back();
nivel--;
}
}
if(nivel!=-1)
throw i;
}
catch (int eroare_parantezare)
{
cout<<"EROARE : Parantezare gresita a expresiei..."<<endl;
exit(1);
}
prioritati = new long[nivel_expr_formatata];
P = new long[nivel_expr_formatata];
long k = 0;
for(i = 0;i<=nivel_expr_formatata;i++)
{
if(expr_formatata[i]==")") k-=100;
else
if(expr_formatata[i]=="(") k+=100;
else
if(expr_formatata[i]=="+") prioritati[i] = k+1;
else
if(expr_formatata[i]=="-") prioritati[i] = k+1;
else
if(expr_formatata[i]=="*") prioritati[i] = k+10;
else
if(expr_formatata[i]=="/") prioritati[i] = k+10;
else
if(expr_formatata[i]=="^") prioritati[i] = k+100;
else
prioritati[i] = 10000;
}
k = -1;
nivel_expr_fara_paranteze = -1;
for(i = 0;i<=nivel_expr_formatata;i++)
if(expr_formatata[i]!="("&&expr_formatata[i]!=")")
{
expr_fara_paranteze.push_back(expr_formatata[i]);
nivel_expr_fara_paranteze++;
k++;
P[k] = prioritati[i];
}
c = new pNod;
c = gen_arb(0,nivel_expr_fara_paranteze,expr_fara_para nteze,P);
parc(c);
k = 1;
try
{
expr_finala.push_back(expr_poloneza[0]);
expr_finala.push_back(expr_poloneza[1]);
if(expr_finala[0]=="+"||expr_finala[0]=="-"||expr_finala[0]=="*"||expr_finala[0]=="/"||expr_finala[0]=="^") throw k;
if(expr_finala[1]=="+"||expr_finala[1]=="-"||expr_finala[1]=="*"||expr_finala[1]=="/"||expr_finala[1]=="^") throw k;
}
catch(int exceptie_de_operatori)
{
cout<<"EROARE : Parantezare gresita sau operatorii plasati in mod eronat..."<<endl;
exit(1);
}
for(i = 2;i<=nivel_expr_poloneza;i++)
{
try
{
if(k<0) throw k;
if(expr_poloneza[i]=="+")
{
f1 = StrToFloat(expr_finala[k]);
f2 = StrToFloat(expr_finala[k-1]);
expr_finala.pop_back();
expr_finala.pop_back();
expr_finala.push_back(FloatToStr(f1+f2));
k--;
}
else
if(expr_poloneza[i]=="-")
{
f1 = StrToFloat(expr_finala[k]);
f2 = StrToFloat(expr_finala[k-1]);
expr_finala.pop_back();
expr_finala.pop_back();
expr_finala.push_back(FloatToStr(f2-f1));
k--;
}
else
if(expr_poloneza[i]=="*")
{
f1 = StrToFloat(expr_finala[k]);
f2 = StrToFloat(expr_finala[k-1]);
expr_finala.pop_back();
expr_finala.pop_back();
expr_finala.push_back(FloatToStr(f1*f2));
k--;
}
else
if(expr_poloneza[i]=="/")
{
try
{
f1 = StrToFloat(expr_finala[k]);
f2 = StrToFloat(expr_finala[k-1]);
if(f1==0) throw f1;
expr_finala.pop_back();
expr_finala.pop_back();
expr_finala.push_back(FloatToStr(f2/f1));
k--;
}
catch(float divide_error)
{
cout<<"EROARE : Eroare la impartire, ilegala impartirea la 0!"<<endl;
exit(1);
}
}
else
if(expr_poloneza[i]=="^")
{
f1 = StrToFloat(expr_finala[k]);
f2 = StrToFloat(expr_finala[k-1]);
expr_finala.pop_back();
expr_finala.pop_back();
expr_finala.push_back(FloatToStr(pow(f2,f1)));
k--;
}
else
{
expr_finala.push_back(expr_poloneza[i]);
k++;
}
}
catch(int exceptie_parantezare)
{
cout<<"ERROR : Expresia este incorect parantezata..."<<endl;
exit(1);
}
}
try
{
if(k!=0)
throw k;
return StrToFloat(expr_finala[0]);
}
catch (int exceptie_nivel_stiva)
{
cout<<"EROARE : Expresia este incorect parantezata..."<<endl;
exit(1);
}
}
void main()
{
string expresie;
citeste_expresie(expresie);
cout<<expr_value(expresie)<<endl;
getch();
}
acehreli
01/06/2005, 20:28
Hizlica goz atarak yakaladigim bir kac nokta:
- pNod'un ogeleri genel erisime acik (public)
- kurucusundaki Text = "" satiri gereksiz
- bilinmez bir nedenle double yerine float kullanilmis
- void main olmaz... 'int main' olmali
- hata mesajlari geleneksel olarak cerr akimina gonderilir; cout'a degil
Ali
haciyasin
02/06/2005, 00:06
Sonuç olarak saat gibi borland builder ile çalışıyor.
Bu kadar hata kadı kızında da olur.
Arkadaşa yardım olsun diye verdim.
acehreli
02/06/2005, 00:50
Turkce bir forumdan C dilinde yazilmis kodlar isteyen memed'in C++ ile ve Ingilizce bile olmayan bir dilde yazilmis kodlar iceren yanlis bir programdan yararlanacagina inanmiyorum.
Tabii elestirmeden de durabilirdim ama "bana kod lazim" havasindaki sorulara hemen hazir program verilmesinden rahatsiz oldugum icin, hic olmazsa yazdigim noktalar belki bu forumda sohbet konusu olur diye elestirdim.
Bir kac tane daha:
- float'tan yaziya donusturmek icin ofstream yerine, ostringstream kullanmak daha uygun olur
Programi calistirdigimiz dizinde temp.tmp adinda onemli bir dosyaniz oldugunu dusunebiliyor musunuz :)
- try/catch bloklari amaclarinin tersine olarak kodu karmasiklastirmislar
- bir kac tane new ve new[] cagrisina karsilik delete ve delete[] cagrilari yok
Ali
Forum Yazılımı : vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.