科学计算器——大一数据结构课设

来源:互联网 发布:安卓手游辅助软件 编辑:程序博客网 时间:2024/06/07 07:25

苦逼信息学院大学狗一枚
读大二ing。。。

单纯找个地方记录一下自己的代码
这是大一时候写的数据结构课设
C语言的科学计算器
当时查了很多资料
算是自己写的第一个比较有意思的小程序
时间原因没有做成MFC

第一次发博客
请多指教
估计也不会被人看到【哀怨脸】

#include "stdlib.h"#include "stdio.h"typedef     int     Status;typedef     char    OPTRType;typedef     int     OPNDType;#define MAXSIZE     100#define OK          1#define ERROR       0#define TRUE        1#define FALSE       0typedef struct _OPTRSTACK_                //字符结点{    OPTRType Data;                        //结点数据    _OPTRSTACK_* Next;                    //结点链指针}OPTRStack;typedef struct _OPNDSTACK_                //整数结点{    OPNDType Data;                        //结点数据    _OPNDSTACK_* Next;                    //结点链指针}OPNDStack;OPTRStack* OPTRInitStack(void);Status OPTRPush (OPTRStack** ppTop, OPTRType x);Status OPTRStackEmpty(OPTRStack* pTop);Status OPTRPop(OPTRStack** ppTop, OPTRType* x);OPTRType OPTRGetTop (OPTRStack* pTop);//运算数栈操作OPNDStack* OPNDInitStack(void);Status OPNDPush(OPNDStack** ppTop, OPNDType x);Status OPNDStackEmpty(OPNDStack* pTop);Status OPNDPop(OPNDStack** pTop, OPNDType* x);OPNDType OPNDGetTop(OPNDStack *pTop);//运算符栈操作Status ReBuild(char* ch, char** p_szFomula);Status Calculate(char* szFomula, int* p_iAnswer);//计算操作Status main(){    char* ch = (char*)malloc(MAXSIZE * sizeof(char));//分配输入字符的存储空间    char* szFomula = (char*)malloc(MAXSIZE * sizeof(char));    int iAnswer;    printf("使用须知:输入法必须为英文,且光标必须移动到算式最后!\n");    while(1)    {        printf("请输入算式:\n");        scanf("%s", ch);        ReBuild(ch, &szFomula);        Calculate(szFomula, &iAnswer);        if (Calculate(szFomula, &iAnswer) && ReBuild(ch, &szFomula))        {            //printf("%s\n", szFomula);            printf("%s = %d\n", ch, iAnswer);        }        else        {            printf("算式有误!\n");        }    }    return OK;}OPTRStack* OPTRInitStack(void){    OPTRStack* pTop;//新建结构体型指针pTop    pTop = NULL;//置空    return pTop;//返回栈的地址}Status OPTRPush (OPTRStack** ppTop, OPTRType x)//此处二维指针用来传参(因为pTop本身是个指针所以再套一个指针){    OPTRStack* p = (OPTRStack*)malloc(sizeof(OPTRStack));//动态分配一个栈大小的空间,返回首地址给p    if (ppTop == NULL)//如果栈空    {        *ppTop = p;//pTop等于所输入的p        p->Data = x;//p的数据域等于输入的x        p->Next = NULL;//p的next指针指向空    }    else//如果指向pTop的指针不为空    {        p->Data = x;//p的数据域等于x        p->Next = *ppTop;//p的next指针指向栈顶        *ppTop = p;//栈顶指向p    }    return OK;}Status OPTRStackEmpty(OPTRStack* pTop){    if (pTop == NULL)    {        return TRUE;    }    else    {        return FALSE;     }//如果pTop等于NULL,返回真,不然返回false}Status OPTRPop(OPTRStack** ppTop, OPTRType* x){    if (OPTRStackEmpty(*ppTop))    {        return ERROR;    }    else//如果栈不空    {        OPTRStack* p = *ppTop;//定义一个p指向栈顶        *ppTop = p->Next;//栈顶指针指向p的下一个        (*x) = p->Data;//x等于p的数据域        free(p);        return OK;    }}OPTRType OPTRGetTop (OPTRStack* pTop){    OPTRType x;    if(OPTRStackEmpty(pTop))    {        return 0;    }    x = pTop->Data;    return x;}OPNDStack* OPNDInitStack(void) {    OPNDStack* pTop;    pTop = NULL;    return(pTop);}Status OPNDPush(OPNDStack** ppTop, OPNDType x) {    OPNDStack* p = (OPNDStack*)malloc(sizeof(OPNDStack));    if(ppTop == NULL)    {        *ppTop = p;        p->Data = x;          p->Next = NULL;    }    else    {        p->Data = x;          p->Next = *ppTop;        *ppTop = p;      }    return OK;}Status OPNDStackEmpty(OPNDStack* pTop){    if (pTop == NULL)    {        return TRUE;    }    else    {        return FALSE;     }}Status OPNDPop(OPNDStack** pTop, OPNDType* x) {    if (OPNDStackEmpty(*pTop))    {        return ERROR;    }    OPNDStack * p = (*pTop);    *pTop = p->Next;    (*x) = p->Data;    free (p);    return OK;}OPNDType OPNDGetTop(OPNDStack *pTop) {    OPNDType x;    if (OPNDStackEmpty(pTop))    {        return 0;    }    x = pTop->Data;    return x;}Status ReBuild(char* ch, char** p_szFomula)//把所有的数字和加减乘除输入到pTmp里面,数字间用空格隔开{    OPTRType x;//定义运算符变量    OPTRStack* pTop;//定义运算符栈    pTop = OPTRInitStack();//运算符栈初始化    char* pTmp = (char*)malloc(MAXSIZE * sizeof(char));    *p_szFomula = pTmp;    while(*ch != '\0')    {        if (*ch >= '0' && *ch <= '9')//如果是数字        {            while (*ch >= '0' && *ch <= '9')//如果是多位数字,就会连在一起            {                *pTmp = *ch;//把数字赋值给pTmp                pTmp++;                ch++;//指针向下走            }            *pTmp = ' ';            pTmp++;        }        else if (*ch == '(')        {            OPTRPush(&pTop, *ch);//左括号,进运算符栈            ch++;//继续向下读        }        else//如果读到的不是左括号        {            if (OPTRStackEmpty(pTop) && *ch == ')')            {                return ERROR;            }            else if (OPTRStackEmpty(pTop))//如果运算符栈空            {                OPTRPush(&pTop, *ch);//入栈                ch++;//继续向下读            }            else if (*ch == ')')            {                OPTRPop(&pTop, &x);//出栈                if (x != '(')//如果弹出的不是左括号                {                    *pTmp = x;//进入pTmp                    pTmp++;//指针向下                }//注意此处没有ch++,因为要下一次循环然后把()内的东西弹完                else                {                    ch++;//如果弹出的是左括号,继续向下读取                }            }            else//如果不是右括号            {                while (OPTRGetTop(pTop) == '*' || OPTRGetTop(pTop) == '/' || ((OPTRGetTop(pTop) == '+' || OPTRGetTop(pTop) == '-') && (*ch == '+' || *ch == '-')))                {                    OPTRPop(&pTop, &x);//运算符出栈                    *pTmp = x;//运算符进入pTmp                    pTmp++;                    *pTmp = ' ';                    pTmp++;                }                OPTRPush(&pTop, *ch);                ch++;            }        }    }    while (!OPTRStackEmpty(pTop))//当运算符栈不空    {        OPTRPop(&pTop, &x);        *pTmp = x;        pTmp++;    }    *pTmp = '\0';//以换行符结束}Status Calculate(char* szFomula, int* p_iAnswer){    OPNDType v1 = 0;    OPNDType v2 = 0;    OPNDType v3 = 0;    OPNDStack* pTop;//创建运算数栈    pTop = OPNDInitStack();    while (*szFomula != '\0')    {        if (*szFomula >= '0' && *szFomula <= '9')//如果是数字        {            v1 = v1 * 10 + (*szFomula - '0');//转换多位数            szFomula++;            if (*szFomula == ' ')            {                OPNDPush(&pTop, v1);                v1 = 0;                szFomula++;            }        }        else if (*szFomula == ' ')//如果读到不是数字        {            szFomula++;//如果读到空格则继续        }        else//如果不是空格        {            switch(*szFomula)            {                case('+'):                    {                        OPNDPop(&pTop, &v3);                        OPNDPop(&pTop, &v2);                        v2 = v2 + v3;                        OPNDPush(&pTop, v2);                        break;                    }                case('-'):                    {                        OPNDPop(&pTop, &v3);                        OPNDPop(&pTop, &v2);                        v2 = v2 - v3;                        OPNDPush(&pTop, v2);                        break;                    }                case('*'):                    {                        OPNDPop(&pTop, &v3);                        OPNDPop(&pTop, &v2);                        v2 = v2 * v3;                        OPNDPush(&pTop, v2);                        break;                    }                case('/'):                    {                        OPNDPop(&pTop, &v3);                        OPNDPop(&pTop, &v2);                        v2 = v2 / v3;                        OPNDPush(&pTop, v2);                        break;                    }                default:                    {                        return ERROR;                    }            }            szFomula++;        }    }    OPNDPop(&pTop, &v1);    *p_iAnswer = v1;    return OK;}
0 0
原创粉丝点击