设为首页收藏本站

编程十万个为什么,属于程序员的编程论坛

 找回密码
 5秒快速注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 2982|回复: 1

[编程指导] win32控制台编写的计算器,新手不是很懂,求帮批注

[复制链接]
发表于 2015-12-8 21:48:58 | 显示全部楼层 |阅读模式
1BC币
#include<iostream.h>
#include<string.h>
#include<stdlib.h>
#include<fstream.h>
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<<"输入的表达式错误,请重新输入!"<<endl;
   return 0;
  }
       for(i=0;i<len;i++)
       {
         if(*c=='/'&&*(c+1)=='0')
         {
          cout<<"分母不能为零!"<<endl;
          return 0;
         }

      }
  if(*c=='(')
   k++;
  else if(*c==')')
   k--;

  C++;
}
if(k!=0)
{
cout<<"括号输入错误!"<<endl;
  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<len; 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;  

len=strlen(c);

if(c[0]=='-')
{
  start=1;
  f=-1;
}
for(i=start; i<len; i++)
{
  if(c[i]=='.')
  {
   p=i;
   break;
  }
  temp[tempi++]=c[i];
}
temp[tempi]='\0';

if(p!=0)
{
  for(i=p+1;i<len;i++)
{
   if(c[i]=='.')
  {
   cout<<"小数点输入错误!"<<endl;
    exit(0);
   }
   a=a*0.1;
   num+=(a*(c[i]-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)
{                  
char g[100],number[30];
char f[80];
int fi=0;
double s[80];
int si=0;
int k=0;
int num=0,i=0;
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<<"操作错误!"<<endl;
   break;
  }
}

return s[0];
}

int calculator::show()//输出函数
{
double sum=0;
sum=good(str);

ofstream fout("text");
if(!fout)
{
  cout<<"打不开该文件!"<<endl;
    return 1;
}
fout<<"输入的表达式:"<<str<<endl;
fout<<"sum="<<sum<<endl;
fout.close();
cout<<sum;
cout<<endl;
return 0;
}

void main()
{
char str1[100];
int p=1;
while(1)
{
cout<<"请输入表达式,退出请输入exit!"<<endl;
cin>>str1;
        p=strcmp(str1,"exit");
  if(p==0)
   break;
  calculator A(str1);
  p=A.check(str1);

  if(p==0)
   continue;
  A.show();
}
cout<<"再见!"<<endl;
}

发表于 2016-1-21 13:30:40 | 显示全部楼层
需要干嘛?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 5秒快速注册

本版积分规则

关闭

BcWhy推荐上一条 /1 下一条

QQ|关于我们|最新帖子|小黑屋|手机版|编程十万个为什么 ( 粤ICP备16108587号-2  

GMT+8, 2017-3-28 19:52 , Processed in 0.195800 second(s), 26 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表