arkadaşlar c++ builder 6 ile yaptım c++ da önemli olan uygun veri yapısını kullanarak sorunu optimize edip çözmektir.
bu problem ise a+b*c gibi normal aritmetik ifadeleri ab+c* şekline çevirmektedir.
bunun amacı ise mikroişlemcinin bu ifadenin üzerinden bir kez geçerek hesaplamasını sağlamak için yapılan bir modellemedir.yığın veri yapısını kullandım.yorum ve soruları bekliyorum.ayrıca program cmd den ifade almaktadır.
örn cmd yi açıp c:\project1.exe a+b
verildiğinde sonuç yazılır.
eğer ifade hardiskten alınacaksa
örn c:\project1.exe c:\a.txt c:\sonuc.txt
verildiğinde ise a.txt deki infix ifadeyi alır ve sonuçları c:\sonuc.txt ye kaydeder.
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#include "Unit2.h"
#pragma argsused
#include <iostream>
#include <fstream>
#include <conio.h>
#include <string>
using namespace std;
//---------------------------------------------------------------------------
class post{
public:
bool operator_(char);
int oncelik(char,char);
int push(char);
char pop();
char ustdeger();
bool kontrol();
bool operand(char);
**** yazdir();
**** postal();
bool yertahsis();
char *ortaek;
int k,m;
char *sonek;
string gecici;
post();
~post();
char *yigin;
int l,w,ac,bc;
};
int main(int argc, char* argv[])
{
post B;
ifstream oku;
ofstream yaz;
if(argv[2]==NULL){B.ortaek=argv[1]; B.k=strlen(B.ortaek);
for(int i=0;i<B.k;i++)cout<<B.ortaek;B.postal();}
else {oku.open(argv[1]);
if(!oku){cout<<"Dosya acilamadi";exit (0);}
else {
B.k=0;
oku>>B.gecici;
B.k=(B.gecici).length();
B.ortaek=new char [B.k];
for(int i=0;i<B.k;i++)
B.ortaek=B.gecici;
for(int i=0;i<B.k;i++)cout<<B.ortaek;
B.postal();
yaz.open(argv[2]);
if(!yaz){cout<<"beklenmedik bir hata olustu";system("pause");exit (1);}
for(int i=0;i<B.m;i++)
yaz<<B.sonek;
return (0);
}
}
return 0;
}
//---------------------------------------------------------------------------
bool post:
perator_(char ch8){
if(ch8=='+' || ch8=='-' || ch8=='*' || ch8=='/' || ch8=='^')
return true;
return false;
}
//-------------
int post:
ncelik(char operator1,char operator2){
int oncelik1,oncelik2;
if(operator1=='^')
oncelik1=3;
if(operator2=='^') oncelik2=3;
if( operator1=='/' || operator1=='*')
oncelik1=2 ;
if( operator2=='/' || operator2=='*')
oncelik2=2;
if(operator1=='+' || operator1=='-' )
oncelik1=1;
if(operator2=='+' || operator2=='-' )
oncelik2=1;
if(oncelik1<oncelik2)
return -1;
else if(oncelik1==oncelik2)
return 0;
else if(oncelik1>oncelik2)
return 1;
return -3;
}
//-----------------------
int post:
ush(char x){
if( l==ac+1){
cout<<"yigin tasmasi olustu";
return(-1);
}
else{++l;
yigin[l]=x;
} return 1;}
//---------------------------
char post:
op(){
char chg;
if(l-1 < -1 ) {
cout<<"yigin alt taşması";
}
else{
chg=yigin[l];
yigin[l]='0';
--l;
}
return chg;
}
//-------------------------------
char post::ustdeger(){
return (yigin[l]);
}
bool post::kontrol(){
int a=0,b=0,c=0,d=0;
bool state=true;
for(int i=0;i<k;i++)
{
//if(i+1==k)break;
if(!(operator_(ortaek)||operand(ortaek)||ortaek=='('||ortaek==')')){
cout<<"\n Infix ifadede"<<i+1<<". karakter '"<<ortaek<<"'gecersiz karakter\n";
state=false;}
else if((operator_( ortaek) && operator_(ortaek[i+1]))&&i+1!=k)
{state=false;
cout<<endl<<i+1<<"ve"<<i+2<<". karakterlerde operator-operator ardarda yazilma hatasi var\n";
}
else if(((operator_( ortaek[i+1])&& ortaek=='(') || (operator_(ortaek)&& ortaek[i+1]==')'))&&i+1!=k)
{state=false;
cout<<endl<<i+1<<"ve"<<i+2<<". karakterlerde operator parantez ardarda yazilma hatasi var\n";
}
else if((operand( ortaek)&&operand(ortaek[i+1]))&&i+1!=k){
cout<<endl<<i+1<<"ve"<<i+2<<". karakterlerde"<<" operandlarin yanyana yazilma hatasi\n";
state=false;
}
else if(((ortaek=='(' && ortaek[i+1]==')')||(ortaek==')'&&ortaek[i+1]=='('))&&i+1!=k){
cout<<i+1<<"ve"<<i+2<<". karakterlerde bitisik parantezler kullanmak yazim hatasi\n";state=false;}
else if(((operand( ortaek)&&ortaek[i+1]=='(')||(operand(ortaek[i+1])&&ortaek==')'))&&i+1!=k){
cout<<endl<<i+1<<"ve"<<i+2<<". karakterlerde"<<" operand parantez ardarda yazilma hatasi var\n";
state=false;
}
}
for(int i=0;i<k;i++){
if(operand(ortaek))c++;
if(operator_(ortaek))d++;
if(ortaek=='(')a++;
if(ortaek==')')b++;
}
if(a!=b){cout<<"\nİnfix ifadede sag ve sol parantez sayilari esit degil ..\n";
state=false;
}
if(c%2==0)if(d%2!=1){cout<<"\nOperand sayisi ciftken operator sayisi tek olmali..\n";state=false;}
if(c%2==1)if(d%2!=0){cout<<"\nOperand sayisi tek iken operator sayisi cift olmali..\n";state=false; }
if(c==0){cout<<"\nhic operand kullanilmamis ";state=false;}
if(d==0){cout<<"\nhic operator kullanilmamis ";state=false;}
if(c==0&&d==0)cout<<"hic operand ve operator yok";
return (state);
}
bool post:
perand(char ch5){
if((ch5>=65&&ch5<=90)||(ch5>=97&&ch5<=122)||(ch5>=48&&ch5<=57) )
return true;
return false;
}
**** post::yazdir(){
cout<<"Postfix : ";
for(int i=0;i<m;i++)
cout<<sonek;
}
bool post::yertahsis(){
for(int i=0;i<k;i++){
if(operator_(ortaek)||ortaek=='(')ac++;
if(operand(ortaek)||operator_(ortaek))bc++;
}
yigin=new char [ac+1];
sonek=new char [bc];
return true;
}
**** post:
ostal(){
char ch1,ch2;
ortaek[k]=')';
if(!(kontrol())){system("pause");exit (0);}
cout<<endl;
yertahsis();
push('(');
for(int i=0;i<=k;i++)
{ ch1=ortaek;
if(ch1=='(')push(ch1);
else if(operand(ch1))
{ sonek[m]=ch1;
m++;
}
else if(ch1==')'){
do{
ch2=pop();
if(ch2=='(')break;
sonek[m]=ch2;
m++; }while((ch2)!='(') ;
}
else if(operator_(ch1))
{
ch2=ustdeger();
if(operator_(ch2))
{ w=oncelik(ch2,ch1) ;
if(w==1||w==0)
{
ch2=pop();
sonek[m]=ch2;
m++;
}
}
push(ch1);
}
}
yazdir();
cout<<endl; }
post:
ost(){
sonek=NULL,yigin=NULL;
ortaek=NULL;
k=0;l=0;m=0;w=0,ac=0,bc=0;
}
post::~post(){
delete []sonek;delete []yigin;
delete []ortaek;
}
bu problem ise a+b*c gibi normal aritmetik ifadeleri ab+c* şekline çevirmektedir.
bunun amacı ise mikroişlemcinin bu ifadenin üzerinden bir kez geçerek hesaplamasını sağlamak için yapılan bir modellemedir.yığın veri yapısını kullandım.yorum ve soruları bekliyorum.ayrıca program cmd den ifade almaktadır.
örn cmd yi açıp c:\project1.exe a+b
verildiğinde sonuç yazılır.
eğer ifade hardiskten alınacaksa
örn c:\project1.exe c:\a.txt c:\sonuc.txt
verildiğinde ise a.txt deki infix ifadeyi alır ve sonuçları c:\sonuc.txt ye kaydeder.
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#include "Unit2.h"
#pragma argsused
#include <iostream>
#include <fstream>
#include <conio.h>
#include <string>
using namespace std;
//---------------------------------------------------------------------------
class post{
public:
bool operator_(char);
int oncelik(char,char);
int push(char);
char pop();
char ustdeger();
bool kontrol();
bool operand(char);
**** yazdir();
**** postal();
bool yertahsis();
char *ortaek;
int k,m;
char *sonek;
string gecici;
post();
~post();
char *yigin;
int l,w,ac,bc;
};
int main(int argc, char* argv[])
{
post B;
ifstream oku;
ofstream yaz;
if(argv[2]==NULL){B.ortaek=argv[1]; B.k=strlen(B.ortaek);
for(int i=0;i<B.k;i++)cout<<B.ortaek;B.postal();}
else {oku.open(argv[1]);
if(!oku){cout<<"Dosya acilamadi";exit (0);}
else {
B.k=0;
oku>>B.gecici;
B.k=(B.gecici).length();
B.ortaek=new char [B.k];
for(int i=0;i<B.k;i++)
B.ortaek=B.gecici;
for(int i=0;i<B.k;i++)cout<<B.ortaek;
B.postal();
yaz.open(argv[2]);
if(!yaz){cout<<"beklenmedik bir hata olustu";system("pause");exit (1);}
for(int i=0;i<B.m;i++)
yaz<<B.sonek;
return (0);
}
}
return 0;
}
//---------------------------------------------------------------------------
bool post:
if(ch8=='+' || ch8=='-' || ch8=='*' || ch8=='/' || ch8=='^')
return true;
return false;
}
//-------------
int post:
int oncelik1,oncelik2;
if(operator1=='^')
oncelik1=3;
if(operator2=='^') oncelik2=3;
if( operator1=='/' || operator1=='*')
oncelik1=2 ;
if( operator2=='/' || operator2=='*')
oncelik2=2;
if(operator1=='+' || operator1=='-' )
oncelik1=1;
if(operator2=='+' || operator2=='-' )
oncelik2=1;
if(oncelik1<oncelik2)
return -1;
else if(oncelik1==oncelik2)
return 0;
else if(oncelik1>oncelik2)
return 1;
return -3;
}
//-----------------------
int post:
if( l==ac+1){
cout<<"yigin tasmasi olustu";
return(-1);
}
else{++l;
yigin[l]=x;
} return 1;}
//---------------------------
char post:
char chg;
if(l-1 < -1 ) {
cout<<"yigin alt taşması";
}
else{
chg=yigin[l];
yigin[l]='0';
--l;
}
return chg;
}
//-------------------------------
char post::ustdeger(){
return (yigin[l]);
}
bool post::kontrol(){
int a=0,b=0,c=0,d=0;
bool state=true;
for(int i=0;i<k;i++)
{
//if(i+1==k)break;
if(!(operator_(ortaek)||operand(ortaek)||ortaek=='('||ortaek==')')){
cout<<"\n Infix ifadede"<<i+1<<". karakter '"<<ortaek<<"'gecersiz karakter\n";
state=false;}
else if((operator_( ortaek) && operator_(ortaek[i+1]))&&i+1!=k)
{state=false;
cout<<endl<<i+1<<"ve"<<i+2<<". karakterlerde operator-operator ardarda yazilma hatasi var\n";
}
else if(((operator_( ortaek[i+1])&& ortaek=='(') || (operator_(ortaek)&& ortaek[i+1]==')'))&&i+1!=k)
{state=false;
cout<<endl<<i+1<<"ve"<<i+2<<". karakterlerde operator parantez ardarda yazilma hatasi var\n";
}
else if((operand( ortaek)&&operand(ortaek[i+1]))&&i+1!=k){
cout<<endl<<i+1<<"ve"<<i+2<<". karakterlerde"<<" operandlarin yanyana yazilma hatasi\n";
state=false;
}
else if(((ortaek=='(' && ortaek[i+1]==')')||(ortaek==')'&&ortaek[i+1]=='('))&&i+1!=k){
cout<<i+1<<"ve"<<i+2<<". karakterlerde bitisik parantezler kullanmak yazim hatasi\n";state=false;}
else if(((operand( ortaek)&&ortaek[i+1]=='(')||(operand(ortaek[i+1])&&ortaek==')'))&&i+1!=k){
cout<<endl<<i+1<<"ve"<<i+2<<". karakterlerde"<<" operand parantez ardarda yazilma hatasi var\n";
state=false;
}
}
for(int i=0;i<k;i++){
if(operand(ortaek))c++;
if(operator_(ortaek))d++;
if(ortaek=='(')a++;
if(ortaek==')')b++;
}
if(a!=b){cout<<"\nİnfix ifadede sag ve sol parantez sayilari esit degil ..\n";
state=false;
}
if(c%2==0)if(d%2!=1){cout<<"\nOperand sayisi ciftken operator sayisi tek olmali..\n";state=false;}
if(c%2==1)if(d%2!=0){cout<<"\nOperand sayisi tek iken operator sayisi cift olmali..\n";state=false; }
if(c==0){cout<<"\nhic operand kullanilmamis ";state=false;}
if(d==0){cout<<"\nhic operator kullanilmamis ";state=false;}
if(c==0&&d==0)cout<<"hic operand ve operator yok";
return (state);
}
bool post:
if((ch5>=65&&ch5<=90)||(ch5>=97&&ch5<=122)||(ch5>=48&&ch5<=57) )
return true;
return false;
}
**** post::yazdir(){
cout<<"Postfix : ";
for(int i=0;i<m;i++)
cout<<sonek;
}
bool post::yertahsis(){
for(int i=0;i<k;i++){
if(operator_(ortaek)||ortaek=='(')ac++;
if(operand(ortaek)||operator_(ortaek))bc++;
}
yigin=new char [ac+1];
sonek=new char [bc];
return true;
}
**** post:
char ch1,ch2;
ortaek[k]=')';
if(!(kontrol())){system("pause");exit (0);}
cout<<endl;
yertahsis();
push('(');
for(int i=0;i<=k;i++)
{ ch1=ortaek;
if(ch1=='(')push(ch1);
else if(operand(ch1))
{ sonek[m]=ch1;
m++;
}
else if(ch1==')'){
do{
ch2=pop();
if(ch2=='(')break;
sonek[m]=ch2;
m++; }while((ch2)!='(') ;
}
else if(operator_(ch1))
{
ch2=ustdeger();
if(operator_(ch2))
{ w=oncelik(ch2,ch1) ;
if(w==1||w==0)
{
ch2=pop();
sonek[m]=ch2;
m++;
}
}
push(ch1);
}
}
yazdir();
cout<<endl; }
post:
sonek=NULL,yigin=NULL;
ortaek=NULL;
k=0;l=0;m=0;w=0,ac=0,bc=0;
}
post::~post(){
delete []sonek;delete []yigin;
delete []ortaek;
}

