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



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

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