| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1312 人关注过本帖
标题:一个C++编的简单计算器源码,有几个疑问
只看楼主 加入收藏
shenyulv
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:166
专家分:150
注 册:2009-3-8
结帖率:96.43%
收藏
已结贴  问题点数:0 回复次数:5 
一个C++编的简单计算器源码,有几个疑问


#include<iostream.h>
#include<stdio.h>
#include<string>
#include<cmath>
struct shuju//数据的每一个节点
{double a;shuju * next;};
struct yunsuan  //元算符的每一个节点
{char a;yunsuan * next;};//设计的是链栈程序
shuju * tops;yunsuan * topc;int i;
///字符串到浮点型的转换///..只保留6位有效数字
////在字符串中提取数字?下面的这几行怎么解释啊?
double ftd(char * a)
{double sj;double j=-1.0;sj=0;
while(*a>=48 && *a<=57){sj=10*sj+*a-48;a++;i=i+1;}
 if(*a==46){a+=1;i=i+1;while(*a>=48 && *a<=57){
sj+=(*a-48.0)*(pow(10.0,j));a+=1;i=i+1;j-=1.0;}}
return sj;}
 void pushs(double x) //数据的进出栈是用来干什么的?
{shuju * p;p=new shuju;p->a=x;//数据的进出“栈”
p->next=tops;tops=p;}
double pops(shuju * a)
{
   shuju * q; double pq;
   q=tops;pq=q->a ;
   tops=tops->next;
   free(q); return pq;
}
void push(char x)
{ yunsuan * p;p=new yunsuan;
p->a=x;p->next=topc;topc=p; }
char pop(yunsuan * a)//运算符的进出“栈”
{yunsuan * q;char ss ;q=topc;ss=q->a;
 topc=topc->next; free(q); return ss ;}
double zz(double a,char b,double c)
{switch(b){
case 42:return a*c;
case 43:return a+c;
case 45:return c-a;
case 47:{if(a==0){cout<<"输入有错!"<<endl;}else return c/a;}
}}//判断现在的字符是数字还是符号
 int pan(char * a)
 {if(*a>=48 && *a<=57)return 1;//数据
if(*a>=40 && *a<=43||*a==45||*a==47)return 2;//符号
     return 0;///错误、、、输入的不是规定的字符
 }
///////比较现在的两个运算符比判断下一步的计划
 char bijiao(char a,char b)
 {    char pq;
   if(b==41||a==42&&b!=40||a==47&&b!=40||(b==43||b==45)&&(a==43||a==45))
        pq=60;//将前一个运算运算
   if(b==40||a==40||(b==42||b==47)&&(a==43||a==45))
       pq=62;///将刚刚进去的运算进栈
      return pq;}
int main()
{  double mm=0;i=0;tops=new shuju;topc=new yunsuan;tops->next=NULL;
topc->next=NULL;char  as[100];
cout<<"*******************************************************************************"<<endl<<endl;
    cout<<"************************************作品简介***********************************"<<endl<<endl;
    cout<<"         该软件用于简单的加、 减、乘、除四则运算!"<<endl<<endl;
    cout<<"     允许输入 0、1、2、3、4、5、6、7、8、 9、 (、)、*、/、+、-。"<<endl<<endl;  
    cout<<" 请输入要计算的算式:(比如输入 4+(1+2*3)/5-6 回车 ,输出 :其数值为: -0.6"<<endl;
    cout<<"      直接输入  任意非法字符  结束程序!"<<endl;
    scanf("%s",as);
    while(pan(&as[0])!=0)
    {  i=0;
    while(as[i]!=0)/////////////////////////////////jisuan
//下面这些是什么意思啊。。不懂,实现什么的
       switch(pan(&as[i]))
    {
        case 1:{pushs(ftd(&as[i]));break;}
        case 2:
            {   if(topc->next==NULL){push(as[i]),i=i+1;}
                else
                switch(bijiao(topc->a,as[i]))
            {
                  case  60:
                      {  double l=pops(tops);
                          mm=zz(l,pop(topc),pops(tops));
                          pushs(mm);
                       if(char(as[i])==41)
                       {      char zl;
                              zl=pop(topc);
                           while(char(zl)!=40)
                           {   double l=pops(tops);
                               mm=zz(l,zl,pops(tops));
                               pushs(mm);zl=pop(topc);
                           }
                       }
                       else  push(as[i]);   
                       while(topc->next!=NULL&&topc->next->next!=NULL&&bijiao(topc->next->a,topc->a)==60)
                       {
                            char ls;double l=pops(tops);
                            ls=pop(topc);
                            mm=zz(l,pop(topc),pops(tops));
                            pushs(mm);push(ls);
                       }
                        i=i+1;break;}
                 case 62:{push(as[i]);i=i+1;break;}
            }
            break;}
        default:{cout<<"输入有误!"<<endl;break;}
    }   
   
        while(topc->next!=NULL)    {double l=pops(tops);mm=zz(l,pop(topc),pops(tops));pushs(mm);}
        cout<<"其数值为: "<<pops(tops)<<endl<<endl<<endl;
        cout<<"      直接输入  任意非法字符  结束程序!  或者继续输入要计算的算式!"<<endl;
        scanf("%s",as);
    }
    return 0;
}

我想把这个源码,改为能够体现 面对对象的程序设计,就是有体现类,多态,继承,运算符重载等要素的。。。

好新人帮帮忙吧。。小弟愚钝。。指导一二吧!!!
搜索更多相关主题的帖子: 疑问 源码 计算器 
2009-12-22 12:52
shenyulv
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:166
专家分:150
注 册:2009-3-8
收藏
得分:0 
高手啊。高手何在?

叶的离去,是风的过错,还是树的不挽留?
2009-12-24 13:00
英英
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:29
专家分:133
注 册:2009-3-3
收藏
得分:50 
这个程序我以前用C编过,具体有些语句不太一样,到时思想应该是一样的吧。如果你是看不懂代码的话,可以去查阅一下数据结构的书,我记得是讲栈的应用的时候说的。其实整个程序就是栈的应用的一个典型,你的理解栈的用图,至于判断运算符的优先集,按着优先集表编就行,其次就是提取字符串中的数字,还有一些小细节,你动手编就知道了,如果这些都明白了就没啥问题了。至于你说的要体现的那些特征,我感觉有些根本就不用,这个不用继承,多态,也不用重载运算符。嘻嘻,我说的仅供参考哈,也不知道对你有用不。快考试了,所以就不去编了
2009-12-24 14:47
shenyulv
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:166
专家分:150
注 册:2009-3-8
收藏
得分:0 
回复 3楼 英英
终于有个人同情我了,感动ing,其实我也是不想搞多态性,继承,运算符重载的。。只是我们C++老师需要。。哎。。总之谢谢咯

叶的离去,是风的过错,还是树的不挽留?
2009-12-24 15:55
英英
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:29
专家分:133
注 册:2009-3-3
收藏
得分:0 
呵呵,都没帮上你的忙啊。加油吧,要不你和同学商量商量吧。我今天晚上也要写C++的实验报告,9份啊,明天就得交,我先撤了
2009-12-24 19:54
shenyulv
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:166
专家分:150
注 册:2009-3-8
收藏
得分:0 
回复 5楼 英英
我那个是课程设计,难啊。

叶的离去,是风的过错,还是树的不挽留?
2009-12-25 00:05
快速回复:一个C++编的简单计算器源码,有几个疑问
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016568 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved