| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1024 人关注过本帖
标题:小弟做了个计算器,有个问题,请各位高手解答
只看楼主 加入收藏
C语初学者
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2009-7-23
结帖率:100%
收藏
 问题点数:0 回复次数:9 
小弟做了个计算器,有个问题,请各位高手解答
做了个计算器,用栈,能进行复合运算,但只能实现一位数运算,怎么扩展到多位数运算?代码如下:
// counter2.cpp : Defines the entry point for the console application.
// 实现计算器,+,- * / 小数

#include "stdafx.h"
#define MAXSIZE 100
#define END '\n'
#include "stdio.h"
#include "stdlib.h"
#include "math.h"

char ops[MAXSIZE];   //自定义运算符栈
int  ops_top;        //自定义运算符栈顶标识
double ovs[MAXSIZE];  //自定义操作数栈
int  ovs_top;         //自定义操作数栈顶标识

void push_ops(char x); //运算符进栈(用void说明次函数无返回值)
void push_ovs(double x); //操作数进栈(同上)
char pop_ops(); //运算符出栈(有返回值)
double pop_ovs();//操作数出栈(有返回值)

char gettop_ops();  //取出运算符栈顶元素
double gettop_ovs();  //取出操作数栈顶元素
void inistack_ops();  //初始化运算符栈
void inistack_ovs(); //初始化操作数栈
char Precede(char t1,char t2);  //判断t1与t2的优先级别
int char_In(char c); //判断c是否为运算符
double Operate(double a,char theta,double b); //对出栈的两个数计算
double  EvaluateExpression( );//使用算符优先算法进行算术表示式求值
                           //ops[]为运算符栈,ovs[]为操作数栈

int main(int argc, char* argv[])
{
    printf("请输入算术表达式,以回车结束\n");
    printf("%f\n",EvaluateExpression( ));
    getchar();
}

void push_ops(char x) //运算符进栈
{
    if(ops_top==MAXSIZE-1)
    {
     printf("运算符栈已满!上溢\n");
     exit(1);//exit()即退出,0表示正常退出,其他表示非正常退出,为系统自带函数
       }
    else

        {
            ops_top++;
            ops[ops_top]=x;
        }

}


void push_ovs(double x) //操作数进栈
{
  if(ovs_top==MAXSIZE-1)
  {
      printf("操作数栈已满!上溢\n");
      exit(1);
  }
  else
  {
      ovs_top++;
      ovs[ovs_top]=x;
  }
}


char pop_ops()  //运算符出栈
{
 char y;
 if(ops_top==-1)
 {
     printf("运算符栈空!下溢\n");
     exit(1);
 }
 else
 {
     y=ops[ops_top];
     ops_top--;
 }
 return y;
}
 
 
double pop_ovs()  //操作数出栈
{
 double y;
 if(ovs_top==-1)
 {
     printf("操作数栈空!下溢\n");
     exit(1);
 }
 else
 {
     y=ovs[ovs_top];
     ovs_top--;
 }
 return y;
}
void inistack_ops()  //初始化运算符栈
{
  ops_top=-1;
}

void inistack_ovs() //初始化操作数栈
{
 ovs_top=-1;
}

char gettop_ops()  //取出运算符栈顶元素
{
    if (ops_top!=-1)
    return ops[ops_top];
    else
    {
        printf("取数时运算符栈已空\n");
        exit(1);
    }
}




double gettop_ovs()  //取出操作数栈顶元素
{
    if (ovs_top!=-1)
        return ovs[ovs_top];
    else
    {
        printf("取数时操作数栈已空\n");
        exit(1);
    }
}

char Precede(char t1,char t2)  //判断t1与t2的优先级别
{
    char f;
    switch(t2)
    {
    case '+':
    case '-':
        if (t1=='('||t1==END)
            f='<';
        else
            f='>';
        break;
    case '*':
    case '/':
        if (t1=='*'||t1=='/'||t1==')')
            f='>';
        else f='<';
        break;
    case '(':
        if (t1==')')
        {
            printf("运算符error1\n");
            exit(1);
        }
        else
            f='<';
        break;
    case ')':
        switch(t1)
        {
        case '(':
            f='=';
            break;
        case END://END即\n,即回车
            printf("运算符错误2\n");
            exit(1);
        default:
            f='>';
        }
        break;
    case END:
        switch(t1)
        {
        case END:f='=';
            break;
        case '(':
            printf("运算符错误3\n");
            exit(1);
        default:
            f='>';
        }
    }
    return f;//返回f值至Precede函数
}

int char_In(char c) //判断c是否为运算符
{
    switch(c)
    {
    case '+':
    case '-':
    case '*':
    case '/':
    case '(':
    case ')':
    case END:
        return 1;//返回值为1,成立
    default :
        return 0;//返回值为0,不成立
    }
}



double Operate(double a,char theta,double b) //对出栈的两个数计算
{
    double c;
    switch(theta) //theta为运算符
    {
    case '+':
        c=a+b; //输出0-9的ASCII码
        break;
    case '-':
        c=a-b;
        break;
    case '*':
        c=a*b;
        break;
    case '/':
        c=a/b;
    }
    return c;
}

double EvaluateExpression( )
{
//使用算符优先算法进行算术表示式求值
//ops[]为运算符栈,ovs[]为操作数栈

double a,b,temp1,temp2,temp3;
char stack_x,theta,input_c;
inistack_ops();  //初始化运算符栈
push_ops(END);   //使结束符进栈,相当于标识符,在下一个到来时结束运算
inistack_ovs(); //初始化操作数栈
input_c=getchar();//输入一个字符
stack_x=gettop_ops();//将栈顶元素赋给stack_x
while(input_c!=END||stack_x!=END) //判断计算是否结束
{
    if (char_In(input_c)) //若输入的字符是7种运算符之一
    {
        switch (Precede(stack_x,input_c))
        {
            case '<':
            push_ops(input_c); //若栈顶(x)优先级<输入则输入进栈
            input_c=getchar();
            break;
        case '=':
            stack_x=pop_ops();//相等则出栈,即脱括号接受下一个字符
            input_c=getchar();
            break;
        case '>':
            theta=pop_ops();
            b=pop_ovs();
            a=pop_ovs();
            push_ovs(Operate(a,theta,b));//
            break;
        }
        
    }
    else if(input_c>='0'&&input_c<='9')//input_c是操作数
    {
    input_c=input_c-'0';
    push_ovs(input_c);   
    input_c=getchar();
    }   
    else
    {
        printf("非法字符\n");
        exit(1);
    }
    stack_x=gettop_ops();
}
return(gettop_ovs());
}



        


搜索更多相关主题的帖子: 计算器 解答 
2010-04-20 17:14
C语初学者
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2009-7-23
收藏
得分:0 
虽然代码很长,但我感觉思路还是清晰的,麻烦各位了,多谢哦
2010-04-20 17:21
woaiqiufeng
Rank: 2
等 级:禁止访问
帖 子:38
专家分:29
注 册:2010-3-13
收藏
得分:0 
呵呵  真的好长
2010-04-20 19:00
skyhe1a
Rank: 2
等 级:论坛游民
帖 子:55
专家分:62
注 册:2010-4-10
收藏
得分:0 
我的也是计算器!!为什恶魔这么短的  晕!!!!

#include <stdio.h>
main()
{
float a,b,c,d;
int i;
char P;
  scanf("%f",&a);
  for(i=0;i>=0;i++)
  {   scanf("%c",&P);

  switch(P)
   {case '+':  scanf("%f",&b);a=a+b;break;
    case '*':  scanf("%f",&b);a=a*b;break;
    case '/':  scanf("%f",&b);a=a/b;break;
    case '-':  scanf("%f",&b);a=a-b;break;
    default:  printf("=%f",a);break;
     } }


    getch();
}
2010-04-20 21:29
skyhe1a
Rank: 2
等 级:论坛游民
帖 子:55
专家分:62
注 册:2010-4-10
收藏
得分:0 
我的短吧!!!还很好用
2010-04-20 21:31
qiaoge
Rank: 1
等 级:新手上路
帖 子:2
专家分:1
注 册:2010-4-20
收藏
得分:0 
好羡慕
2010-04-20 22:31
冥卫
Rank: 8Rank: 8
来 自:深山老林
等 级:蝙蝠侠
帖 子:280
专家分:772
注 册:2010-4-20
收藏
得分:0 
#include<stdio.h>
#include<stdlib.h>
void  main()
{
double  dl0per,db0per,dResult;
/*以下不区分大下写*/
int nfun;
printf("一一一一一\n");
printf("加法运算一一\n");
printf("减法运算一一\n");
printf("除法运算一一\n");
printf("乘法运算一一\n");
printf("一一一一一一\n");
scanf("%d".&nfun);
if(nfun>4||nfun<1)
  printf("输入错误")\n");
else
{
printf("输入两个操作数:");
scanf("%lf%lf".&dl0per,&dR0per);
swith(nfun)
{
case1: dResult=dl0per+dR0per; break;
case2: dResult=dl0per-dR0per; break;
case3: if(0.0==dR0per)
{
pintf("右操作数不能为 0\n");
return;
}
else
   dResult=dl0per/dR0per;
break;
default:  dResult=dl0per*dR0per;
}
printf("结果:%8.3lf\n".dResult);
}
}
     /*各位不好意思,我用手机上的,并且也是手机打的,有什么打错的,包涵一下,终于打完了…*/
2010-04-23 17:28
baqanss
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2010-4-19
收藏
得分:0 
几公里的代码!
2010-04-26 08:45
jmjy
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:44
专家分:146
注 册:2010-1-7
收藏
得分:0 
不错~~
2010-04-26 12:19
azenis
Rank: 1
等 级:新手上路
帖 子:14
专家分:7
注 册:2010-4-24
收藏
得分:0 
真的好长啊!!!!
2010-04-26 19:20
快速回复:小弟做了个计算器,有个问题,请各位高手解答
数据加载中...
 
   



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

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