当前位置:编程学习 > C/C++ >>

C语言程序求助!

编写一个基于命令行的四则运算计算器

功能要求:

l         四则运算就是包含+、—、*、/、.(小数点)和数字的运算表达式,例如:3+2.9*(5-6/3)等

l         能够解释并执行四则运算表达式

l         能够对不符合语法的表达式给出相应的错误警告

l         能够实现科易做图算的功能,即当运算结果超过C语言本身的数据类型的表达范围时,要能够计算

l         能够做二进制、八进制、十进制、十六进制的互相转换

l         提供完善的帮助系统

l         要有良好的出错保护系统

答案:#include<stdio.h>
#include<math.h>
#include<bios.h>
#define ESC 0x11b
#define F1 0x3b00
#define MAX 256
struct fmla          //MAX 字符串表达式数组下标最大值
{                     //F1 ESC都是键码制
    char op;
    double data;
    struct fmla *right;
};
typedef struct fmla mla;   //装有表达式的链结构
typedef mla *fa;

struct f_op
{
    char op;
    struct f_op *right;
};
typedef struct f_op fpr;    // 栈 来存储表达式运算符
typedef fpr *fr;

struct f_pr
{
    double data;
    struct f_pr *right;     // 栈 来存储表达式数据
};
typedef struct f_pr pr;
typedef pr *fp;
char *fmla_data;
int fmla_len;
int opation(char op)      //函数功能判定是不是运算符
{
    switch(op)
    {
        case '+':
        case '-':
        case '*':
        case '/':
        case '(':
        case ')':
        case '=':return 1;
        default:return 0;
    }
}
int siztion(char op)
{
    switch(op)
    {
        case '*':             //比较运算符的大小
        case '/':return 2;
        case '+':
        case '-':
        case '=':return 1;
        default:return 0;
    }
}
double datation(char op,double pre1,double pre2)
{
    switch(op)
    {                                       //计算两位数其值
        case '+':return (pre1+pre2);
        case '-':return (pre1-pre2);
        case '*':return (pre1*pre2);
        case '/':
        {
            if(!pre2)
            printf("\nDivisor is not 0\n");
            else
            return (pre1/pre2);
        }
        default:return 0;
    }
}
fr crfop(fr cfra,char op)
{                              //创建栈存储运算符
    fr ctem;
    ctem=(fr)malloc(sizeof(fpr));
    ctem->op=op;
    ctem->right=NULL;
    if(cfra==NULL)
    return ctem;
    ctem->right=cfra;
    cfra=ctem;
    return cfra;
}

fp crfpr(fp cfra,double data)
{
    fp ctem;                         //创建栈存储数据
    ctem=(fp)malloc(sizeof(pr));
    ctem->data=data;
    ctem->right=NULL;
    if(cfra==NULL)
    return ctem;
    ctem->right=cfra;
    cfra=ctem;
    return cfra;
}

fr fprpop(fr fra,char *op)
{
    fr cfra;
    if(fra!=NULL)
    {                       //取出运算符栈
        cfra=fra;
        fra=fra->right;
        *op=cfra->op;
        free(cfra);
        return fra;
    }
    else
    *op=-1;
}

fp foppop(fp fpa,double *data)
{
    fp cfra;
    if(fpa!=NULL)
    {                          //取出数据栈
        cfra=fpa;
        fpa=fpa->right;
        *data=cfra->data;
        free(cfra);
        return fpa;
    }
    else
    *data=-1;
}

int bolfp(fr frop)
{
    if(frop!=NULL)        //检查栈是不是为空
    return 1;
    else
    return 0;
}

int mlation(char aformla,char *op,double *data)
{
    if(opation(aformla))
    {
        *op=aformla;                        //处理运算表达式返回 运算符 和数据
        *(fmla_data+fmla_len)='\0';
        *data=atof(fmla_data);
        fmla_data=NULL;
        fmla_len=0;
        return 1;
    }
    *(fmla_data+fmla_len)=aformla;
    fmla_len++;
    return 0;

}
fa crfmla(char *formla,int len)
{
    fa mlatem;
    fa a_mlatem;
    fa b_mlatem;                     //把表达式字符串形式 转换 链表形式  把字符数据形式转换 链表double形式
    int i;
    char op;
    double data;
    a_mlatem=(fa)malloc(sizeof(mla));
    a_mlatem->data=0;
    a_mlatem->op=0;
    a_mlatem->right=NULL;
    for(i=0;i<len;i++)
    {
        if(mlation(formla[i],&op,&data))
        {
            mlatem=(fa)malloc(sizeof(mla));
            mlatem->op=op;
         &nbs

上一个:求c语言程序
下一个:c 语言 链表问题

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,