| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 387 人关注过本帖
标题:大家看看哦,提提意见,第一次做课程设计,简单计算机软件
只看楼主 加入收藏
doublecc
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-12-22
收藏
 问题点数:0 回复次数:2 
大家看看哦,提提意见,第一次做课程设计,简单计算机软件
#include<stdio.h>
#include<stdlib.h>
#define MAX 100

typedef struct
    {   
    char s[20];
    int top;
    }fustack;//运算符栈
typedef struct
    {   float s[20];
        int top;
    }shustack;//运算数栈

void push_fu(fustack *a,char x)//运算符栈进栈
{
     a->top++;
     a->s[a->top]=x;
}

void push_shu(shustack *a,float x)//运算数栈进栈
{
    a->top++;
    a->s[a->top]=x;
}

float pop_shu(shustack *a)//运算数栈出栈
{
    float x;
    x=a->s[a->top];
    a->top--;
    return x;
}

char top_fu(fustack *a)//运算符栈取栈顶元素
{
    char x;
    x=a->s[a->top];
    a->top--;
    return x;
}

void trans(char *exp,char postexp[],fustack *op)//转换函数,把中缀表达式转换为后缀表达式
{   
    op=(fustack *)malloc(sizeof(fustack));
    int i=0;
    op->top=-1;
    while(*exp!='\0')
    {
        switch (*exp)
        {   
        case '(':
            push_fu(op,*exp);//运算符进栈
            exp++;
            break;
        case ')':
            while(op->s[op->top]!='(')
            {
                postexp[i++]=top_fu(op);
            }
            op->top--;
            exp++;
            break;
        case '+':
        case '-':
            while(op->top!=-1&&op->s[op->top]!='(')
            {
            postexp[i++]=top_fu(op);
            }
            push_fu(op,*exp);//运算符进栈
            exp++;
            break;
        case '*':
        case '/':
            while(op->s[op->top]=='*'||op->s[op->top]=='/')
            {
            postexp[i++]=top_fu(op);
            }
            push_fu(op,*exp);
            exp++;
            break;
        case ' ':
            exp++;
            break;
        case '=':
            exp++;
            break;
        default:
            while(*exp>='0'&&*exp<='9')
            {
                postexp[i++]=*exp;
                exp++;
            }
            postexp[i++]='#';
        }
    }
    while(op->top!=-1)
    {
        postexp[i++]=top_fu(op);
    }
    postexp[i]='@';
}

float compvalue(char *postexp,shustack *st)//计算函数,计算中缀表达式   
{   
    st=(shustack *)malloc(sizeof(shustack));
    float d,a,b,c;
    st->top=-1;
    while(*postexp!='@')
    {
        switch (*postexp)
        {
        case '+':
            a=pop_shu(st);//运算数出栈
            b=pop_shu(st);//运算数出栈
            c=a+b;
            push_shu(st,c);//运算栈进栈
            break;
        case '-':
            a=pop_shu(st);//运算数出栈
            b=pop_shu(st);//运算数出栈
            c=b-a;
            push_shu(st,c);//运算栈进栈
            break;
        case '*':
            a=pop_shu(st);//运算数出栈
            b=pop_shu(st);//运算数出栈
            c=a*b;
            push_shu(st,c);//运算栈进栈
            break;
        case '/':
            a=pop_shu(st);//运算数出栈
            b=pop_shu(st);//运算数出栈
            if(a!=0)
            {
                c=b/a;
                push_shu(st,c);//运算栈进栈

            }
            else
            {
                printf("除数为0,请检查输入的表达式\n");
            }
            break;
        default:
            d=0;
            while(*postexp>='0' && *postexp<='9')
            {
                d=10*d+*postexp-'0';
                postexp++;
            }
            push_shu(st,d);//运算栈进栈
            break;
        }   
        postexp++;
    }
   
   
        return (st->s[st->top]);
}

int main()
{
    fustack *m;
    shustack *n;
    m=(fustack *)malloc(sizeof(fustack));
    n=(shustack *)malloc(sizeof(shustack));
    char exp[MAX];
    char postexp[MAX];
    int a;
    int count=0;
    int i=1;
    int z;
    printf("*********欢迎使用*********\n");
    printf("进入请按1\n");
    printf("退出请按2\n");
    printf("使用说明请按3\n");
    scanf("%d",&a);
    while(a!=1&&a!=2&&a!=3)
    {
        printf("输入错误,请重新输入:");
        scanf("%d",&a);
    }
    switch(a)
    {
    case 1:   
        do{
            printf("请输入需要运算的字符串:\n");
            getchar();
            gets(exp);while(exp[count]!='\0') {count++;;}
            for(i=0;i<count-1;i++)
            {        
                if(exp[i]=='=')
                {
                    printf("输入的字符错误,请检查输入的字符\n");
                    exit(0);
                }
            }
            trans(exp,postexp,m);//调用转换函数
            printf("%.2f\n",compvalue(postexp,n));//调用计算函数
            printf("继续请按1\n退出请按2\n");
            scanf("%d",&z);}while(z==1);
            if(z==2)
                exit(0);
            return 0;
            break;
    case 2:
        return 0;
        exit(0);
        break;
    case 3:
        printf("对简单的算术表达式进行求值(包括加减乘除功能);\n");
        printf("要求单字符输入,即输入的数字或符号不需要回车键;\n");
        printf("按回车键或等号键则显示计算结果。\n");   
        printf("输入3*(14+6)= \n输出:60\n");               
        return 0;
        break;     
    default:   
        return 0;
    }
}


搜索更多相关主题的帖子: 计算机 软件 
2010-12-28 09:17
逐渐学习
Rank: 6Rank: 6
等 级:侠之大者
帖 子:113
专家分:454
注 册:2010-9-26
收藏
得分:0 
*********欢迎使用*********
进入请按1
退出请按2
使用说明请按3
1
请输入需要运算的字符串:
2*3+4-(22-11)
-1.00
继续请按1
退出请按2
2/0
Press any key to continue

挺不错的,m=(fustack *)malloc(sizeof(fustack));
    n=(shustack *)malloc(sizeof(shustack));
既然用malloc申请内存,对应的释放free()应该加上的。

[ 本帖最后由 逐渐学习 于 2010-12-28 10:46 编辑 ]

帮人《---》帮己
2010-12-28 10:42
w238390
Rank: 1
来 自:%E6%B4%9B%E6%9D%89%E7%9F%B6
等 级:新手上路
帖 子:29
专家分:7
注 册:2016-3-21
收藏
得分:0 
顶一个

富强、民主、文明、和谐、自由、平等、
公正、法治,爱国、敬业、诚信、友善。
2016-07-05 11:32
快速回复:大家看看哦,提提意见,第一次做课程设计,简单计算机软件
数据加载中...
 
   



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

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