Chinaunix首页 | 论坛 | 博客
  • 博客访问: 74166
  • 博文数量: 46
  • 博客积分: 560
  • 博客等级: 下士
  • 技术积分: 386
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-22 22:14
文章分类

全部博文(46)

文章存档

2013年(4)

2012年(42)

我的朋友

分类: C/C++

2012-03-23 17:07:21

#include
#include
#include
#include
class  calculator
{
public:
calculator(char str1[100]);
~calculator();
 int check(char *c);//判断输入的表达式是否正确
 void  move(char *f, double *s,int p);//f存放字符,s存放数字 p:当前运算符数组的位置
 double convnum(char *c);//c 是由小数或正负数组成的表达式
 double good(char *c);  /*可递归函数*/
 int show();//输出函数
private:
 char str[100];
};
/*******************************************************/
calculator::calculator(char str1[100])
{
    strcpy(str,str1);
}
/*******************************************************/
calculator::~calculator()
{
}
/*******************************************************/
int calculator::check(char *c)//判断输入的表达式是否正确
{
 int k=0;
 int i=0;
 int len=strlen(c);
 while(*c!='\0')
 {
  if((*c>='0' && *c<='9') || *c=='+' ||
   *c=='-' || *c=='*' || *c=='/' ||
   *c=='.' || *c=='(' ||  *c==')' )
  {
  }
  else
  {
  cout<<"输入的表达式错误,请重新输入!"<   return 0;
  }
       for(i=0;i       {
         if(*c=='/'&&*(c+1)=='0')
         {
          cout<<"分母不能为零!"<          return 0;
         }
        
      }
  if(*c=='(')
   k++;
  else if(*c==')')
   k--;
  
  c++;
 }
 if(k!=0)
 {
 cout<<"括号输入错误!"<  return 0;
 }
 return 1;
}
/*************************************************************************/
void calculator::move(char *f, double *s,int p)//f存放字符,s存放数字 
{
 int i=0,len=strlen(f);
 for(i=p; i {                      /*即把乘和除号的位置用后面的加和减号填充*/
  f[i]=f[i+1];
  s[i]=s[i+1];
 }
 s[i]=s[i+1];
 f[len-1]='\0';
 
}
/***********************************************************************/
double calculator::convnum(char *c)//c 是由小数或正负数组成的表达式
{
 double num=0.0;//返回转换好的值。
 double a=1.0;
 int i=0,p=0,len=0;
 char temp[100];//存放小数点前的数据
 int tempi=0;
 int start=0;
 int f=1;   /*正负符号指示器,若为1则为正数,为-1,此数为负数*/
 
len=strlen(c);
 
 if(c[0]=='-')
 {
  start=1;
  f=-1;
 }
 for(i=start; i {
  if(c[i]=='.')
  {
   p=i;
   break;
  }
  temp[tempi++]=c[i];  /*将整数部分复制到temp[]中*/
 }
 temp[tempi]='\0';
 
 if(p!=0)
 {
  for(i=p+1;i {
   if(c[i]=='.')  /*如果有多余的小数点,则表示输入错误*/
  {
   cout<<"小数点输入错误!"<    exit(0);
   }
   a=a*0.1;
   num+=(a*(c[i]-48));/*数组temp每个存放了一位数字,并且是存放字符的(如果是数字,存放他的的ASCII码),其中0的ASCII码是48,1的ASCII码是49......为了把字符转回成数字,就要在它的ASCII码里减去48。*/
  }
 }
 a=1.0;
 len=strlen(temp);           /*计算整数部分*/
 for(i=len-1;i>=0; i--)
 {
  num=num+(a*(temp[i]-48));
  a*=10;
 }
 
 num=num*f;
 return num;
}
/***********************************************************************/
double calculator::good(char *c)  /*可递归函数*/ /*取得数值字符串,并调用convnum转换成double*/
{                   
 char g[100],number[30];  /*g,保存当前括号内的表达式串,number保存一个数的所有字符*/
 char f[80]; /*保存所有的符号的堆栈*/
 int fi=0; /*保存符号的位置指针*/
 double s[80]; /*保存当前所有的数的一个堆栈*/
 int si=0; /*保存数字位置指针*/
 int k=0; /* 若k=1则表示有两对括号*/
 int num=0,i=0; /*num保存新括号内的字符数,i 保存number里的字符位置*/
 int cc=0; /*乘除符号数量*/
 int jj=0; /*加减符号数量*/
 
    while(*c!='\0')
    {
       num=0;
    k=0;
     switch(*c)
     {
     case '*':
     case '/':
     case '+':
     case '-':
           f[fi++]=*c;
     if(*c=='*'||*c=='/')
                cc++;
     else
             jj++;
     if(*(c-1)!=')')
     {
         number[i]='\0';
      i=0;
      s[si++]=convnum(number);
     }
                 break;
     case '(':
      k++;
      while(k>0)
      {
         c++;
      g[num]=*c;
      num++;
      if(*c==')')
      {
       k--;
      }
                     else if(*c=='(')
      {
         k++;
      }
      }
        g[num-1]='\0';
     num=0;
     s[si++]=good(g);
     break;
     default:
      number[i++]=*c;
      if(*(c+1)=='\0')
      {
         number[i]='\0';
      s[si++]=convnum(number);
      }
       break;
     }
         c++;
    }
  
 
 f[fi]='\0';
 
 i=0;
 while(cc>0)
 {
  switch(f[i])
  {
  case '*': cc--;
   s[i+1]=s[i]*s[i+1];
   move(f,s,i);
   break;
  case '/': cc--;
   s[i+1]=s[i]/(float)s[i+1];
   move(f,s,i);
   break;
  default:
   i++;
   break;
  }
 }
 
 i=0;
 while(jj>0)
 {
  switch(f[i])
  {
  case '+': s[i+1]=s[i]+s[i+1];
   jj--;
   move(f,s,i);
   break;
  case '-': s[i+1]=s[i]-s[i+1];
   jj--;
   move(f,s,i);
   break;
  default:
  cout<<"操作错误!"<   break;
  }
 }
 
 return s[0];
}
/***************************************************************/
int calculator::show()//输出函数
{
 double sum=0;
 sum=good(str);
 
ofstream fout("text");
 if(!fout)
 {
  cout<<"打不开该文件!"<    return 1;
 }
 fout<<"输入的表达式:"< fout<<"sum="< fout.close();
 cout< cout< return 0;
}
/*************************************************************/
void main()
{
 char str1[100];
 int p=1;
 while(1)
 {
 cout<<"请输入表达式,退出请输入exit!"< cin>>str1; 
        p=strcmp(str1,"exit");
  if(p==0)
   break;
  calculator A(str1);
  p=A.check(str1);
  
  if(p==0)
   continue;
  A.show();
 }
cout<<"再见!"<}
阅读(1969) | 评论(1) | 转发(0) |
0

上一篇:字符串String

下一篇:内存分配方式

给主人留下些什么吧!~~

何本俊夫2012-09-20 17:07:28

该程序在计算时分母为零的情况下不能做出判断