文档章节

C语言写一个简单的计算器

MUTOU2012
 MUTOU2012
发布于 2017/01/05 11:45
字数 1132
阅读 17
收藏 0

#include<stdio.h>
#include<stdlib.h>
struct num //定义结构体保存字符串之后化为数
{
    int a;
    int b;
    int ab[25];
};
struct node //定义链表节点
{
    int pd;//1:符号,2:数;
    double m;
    char sign;
    struct node *last;
    struct node *next;

};
struct node* deal_with(char a[]);
double array_change_num(struct num x);
double cif(int n);
void calculate_1(struct node *head);
void calculate(struct node *head);
int main()
{
    int i=0;
    char a[100];
    struct node *pHead;
    printf("*****************************\n");
    printf("*       这是一个计算器      *\n");
    printf("*****************************\n");
    while(1)
    {
        printf("请输入表达式,回车键结束:\n");
        gets(a);
        printf("=");
        pHead=deal_with(a);
        while(pHead->next!=NULL)
        {
            calculate(pHead);
        }
        printf("%f",pHead->m);
        printf("\n");
        free(pHead);
    }

    return 0;

}
double cif(int n)//求10的n次方
{
    double result=1.0;
    int i;
    for(i=0;i<n;i++)
    {
        result*=10.0;
    
    }
    return result;

}
struct node* deal_with(char a[])  //处理表达式
{
    int i=0;
    int j;
    int k;
    struct num temp;
    struct node *t;
    struct node *head;
    struct node *end;
    head=end=(struct node*)malloc(sizeof(struct node));                        
    while(a[i]!='\0')//遍历a[]中的每一个字符,创建双向链表
    {
        if(a[i]=='+'||a[i]=='-')
        {
            if(i==0)
                i++;
            else
            {
                if(a[i-1]=='(')
                    i++;
                else
                {
                    t=(struct node*)malloc(sizeof(struct node));
                    t->pd=1;
                    t->sign=a[i];
                    t->last=end;
                    end->next=t;
                    end=t;
                    i++;
                }
            
            
            }
        }
        else if(a[i]=='*'||a[i]=='/')
        {
            t=(struct node*)malloc(sizeof(struct node));
            t->pd=1;
            t->sign=a[i];
            t->last=end;
            end->next=t;
            end=t;
            i++;
        
        }
        else if(a[i]=='('||a[i]==')')
        {
            t=(struct node*)malloc(sizeof(struct node));
            t->pd=1;
            t->sign=a[i];
            t->last=end;
            end->next=t;
            end=t;
            i++;
        
        }
        else
        {
            temp.a=0;
            temp.b=0;
            for(j=0;j<25;j++)
                temp.ab[j]=0;
            k=0;               //k记录实数的位数
            
            while(a[i]!='('&&a[i]!=')'&&a[i]!='+'&&a[i]!='-'&&a[i]!='*'&&a[i]!='/'&&a[i]!='\0')
            {
                k++;
                i++;
            
            }

            for(j=i-k;j<i;j++)//计算实数整数位数
            {
                if(a[j]=='.')
                    break;
                temp.a++;
            }
            if(temp.a!=k)
                temp.b=k-temp.a-1;//小数位数
            else
                temp.b=0;
            for(j=i-k;j<i-k+temp.a;j++)
            {temp.ab[j-i+k]=a[j]-48;}
            for(j=i-k+temp.a+1;j<i;j++)
            {temp.ab[j-i+k-1]=a[j]-48;}

            t=(struct node*)malloc(sizeof(struct node));
            t->pd=2;
            t->sign='#';
            if((i-k)>1)
            {
                if(a[i-k-1]=='-')
                {
                    if(a[i-k-2]=='(')
                        t->m=-array_change_num(temp);
                    else 
                        t->m=array_change_num(temp);
                }
                else if(a[i-k-1]=='+')
                    t->m=array_change_num(temp);
                else if(a[i-k-1]=='*')
                    t->m=array_change_num(temp);
                else
                    t->m=array_change_num(temp);
            }
            else if(i-k==1)
            {
                if(a[0]=='-')
                    t->m=-array_change_num(temp);
                else
                    t->m=array_change_num(temp);

            }
            else
            t->m=array_change_num(temp);
            t->last=end;
            end->next=t;
            end=t;

        }
        
    
    }
    head=head->next;
    head->last=NULL;
    end->next=NULL;
    return head;
}

double array_change_num(struct num x)//结构体化为实数
{
    int i;
    int temp;
    double result=0;
    for(i=0;i<x.a;i++)
    {temp=x.ab[i];result+=(double)temp*cif(x.a-1-i);}
    for(i=0;i<x.b;i++)
    {temp=x.ab[x.a+i];result+=(double)temp/cif(i+1);}
    return result;

}
void calculate_1(struct node *head)//计算没有括号的表达式
{
    struct node *t,*result;
    t=head;    
    while(t->sign!='*'&&t->sign!='/'&&t->next!=NULL)
        t=t->next;        
    if(t!=NULL&&t->sign=='*')
    {
        if(t->last->last!=NULL)
        {
            result=(struct node*)malloc(sizeof(struct node ));
            result->pd=2;
            result->m=t->last->m*t->next->m;
            result->last=t->last->last;
            result->next=t->next->next;
            t->last->last->next=result;
            if(t->next->next!=NULL)
                t->next->next->last=result;
            free(t->last);
            free(t->next);
            free(t);

        }
        else
        {
            head->m=(t->last->m)*(t->next->m);
            head->next=t->next->next;
            if(t->next->next!=NULL)
                t->next->next->last=head;
            free(t->next);
            free(t);
        
        }
                
    }
    else if(t!=NULL&&t->sign=='/')
    {
        if(t->last->last!=NULL)
        {
            result=(struct node*)malloc(sizeof(struct node ));
            result->pd=2;
            result->m=(t->last->m)/(t->next->m);
            result->last=t->last->last;
            result->next=t->next->next;
            t->last->last->next=result;
            if(t->next->next!=NULL)
                t->next->next->last=result;
            free(t->last);
            free(t->next);
            free(t);    
        }
        else
        {
            head->m=t->last->m/t->next->m;
            head->next=t->next->next;
            if(t->next->next!=NULL)
                t->next->next->last=head;
            free(t->next);
            free(t);    
        }
    
    }
    else 
    {
        t=head;
        while(t->next!=NULL&&t->sign!='+'&&t->sign!='-')
        {
            t=t->next;        
        }
        if(t!=NULL&&t->sign=='+')
        {
            if(t->last->last!=NULL)
            {
                result=(struct node*)malloc(sizeof(struct node ));
                result->pd=2;
                result->m=(t->last->m)+(t->next->m);
                result->last=t->last->last;
                result->next=t->next->next;
                t->last->last->next=result;
                if(t->next->next!=NULL)
                    t->next->next->last=result;
                free(t->last);
                free(t->next);
                free(t);
            }
            else
            {
                head->m=t->last->m+t->next->m;
                head->next=t->next->next;
                if(t->next->next!=NULL)
                    t->next->next->last=head;
                free(t->next);
                free(t);
            }
        }

        else //if(t!=NULL&&t->sign=='-')
        {
            if(t->last->last!=NULL)
            {
                result=(struct node*)malloc(sizeof(struct node ));
                result->pd=2;
                result->m=(t->last->m)-(t->next->m);
                result->last=t->last->last;
                result->next=t->next->next;
                t->last->last->next=result;
                if(t->next->next!=NULL)
                    t->next->next->last=result;
                free(t->last);
                free(t->next);
                free(t);

            }
            else
            {
                head->m=t->last->m-t->next->m;
                head->next=t->next->next;
                if(t->next->next!=NULL)
                    t->next->next->last=head;
                free(t->next);
                free(t);
            }
        }
    
    }
    
    
}
void calculate(struct node *head)            //一般的表达式计算
{
    struct node *t1,*t2,*tHead;    
    t2=head;
    while(t2->next!=NULL&&t2->sign!=')')
        t2=t2->next;
    if(t2->sign==')')
    {
        t1=t2;
        while(t1->sign!='(')
            t1=t1->last;
        if(t1->last!=NULL)
        {
            tHead=t1->next;
            t2->last->next=NULL;
            tHead->last=NULL;
            while(tHead->next!=NULL)
            {
                calculate_1(tHead);
            }
            tHead->last=t1->last;
            t1->last->next=tHead;
            tHead->next=t2->next;
            if(t2->next!=NULL)
                t2->next->last=tHead;
            free(t1);
            free(t2);
        }
        else
        {
            
            tHead=head->next;
            tHead->last=NULL;
            t2->last->next=NULL;            
            if(t2->next!=NULL)
                t2->next->last=head;
            
            while(tHead->next!=NULL)
            {
                calculate_1(tHead);
            }
            head->pd=2;
            head->sign='#';
            head->next=t2->next;
            if(t2->next!=NULL)
                t2->next->last=head;
            head->m=tHead->m;
            free(tHead);
            free(t2);
        }
    }
    else
    {
        while(head->next!=NULL)
            calculate_1(head);    
    
    }
        
}

© 著作权归作者所有

MUTOU2012
粉丝 1
博文 4
码字总数 3794
作品 0
惠州
私信 提问
一步一步实现一个简单的解释器

一个简单的计算器的实现。通过这个来了解编程语言背后是如何工作的。 编程语言 机器语言 汇编语言 C语言 python语言 由于有了这样一次次的抽象,现在写一些程序比以前容易很多了。 py3 如果把...

彩色系
2017/11/09
0
0
介绍一个可以在TI-89T计算器上运行的C语言集成开发环境GTC

介绍一个可以在TI-89T计算器上运行的C语言集成开发环境GTC GTC是这样一个微型的IDE,可以直接运行在TI-89T计算器上,支持完整的C语言编程,当然编译出来的目标文件也是在TI-89T下执行的,换句...

FreeBlues
2012/06/25
529
0
10个经典的C语言面试基础算法及代码

算法是一个程序和软件的灵魂,作为一名优秀的程序员,只有对一些基础的算法有着全面的掌握,才会在设计程序和编写代码的过程中显得得心应手。本文是近百个C语言算法系列的第二篇,包括了经典...

天蚕宝衣
2016/03/14
58
0
TI-89T 教你在C程序里调用TI-BASIC程序,看看是否有人对这个感兴趣

教你在C 程序里调用TI-BASIC程序,看看是否有人对这个感兴趣 昨天翻TIGCC的文档,先瞅了瞅FAQ,话说我看文档有个习惯,就是先看目录,再看FAQ,因为FAQ汇集了很多人曾经遇到过的问题、犯过的...

FreeBlues
2012/06/19
411
0
想做程序员,C语言可以开发哪些项目?

(1)C语言是面向过程的,而C++是面向对象的 (2)C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运...

小辰GG
2017/12/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JS实现使用Math.random()函数生成n到m间的随机数字

Math.random()函数返回0和1之间的伪随机数,可能为0,但总是小于1,[0,1) 生成n-m,包含n但不包含m的整数: 第一步算出 m-n的值,假设等于w 第二步Math.random()*w 第三步Math.random()*w+n...

张兴华ZHero
16分钟前
3
0
入门了解Service Mesh + Istio?从本文开始

下周六,深圳,阔别已久的线下技术沙龙要和你见面啦! 现场有Rancher Labs研发经理demo刚刚发布的Rancher 2.3中的Istio、Windows容器、集群模板等功能及使用,还有k3s首次线下workshop,由R...

RancherLabs
18分钟前
3
0
Gradle 发布 Jar 到 Archiva 时提示不能 Overwriting released artifacts is not allowed

系统提示错误信息: Received status code 409 from server: Overwriting released artifacts is not allowed. 这是在 Archiva 默认的配置下如果你不是使用 snapshot 配置的话,是不允许对仓...

honeymoose
19分钟前
3
0
二维码插件之qrcode.min.js

文件链接百度云地址 https://pan.baidu.com/s/1nWiBuT4Z7WOAMoUEFL8PZg 入门 http://www.jq22.com/jquery-info294 使用jquery.qrcode.min.js实现前台二维码生成(带Logo) https://blog.csd......

木九天
29分钟前
3
0
开源 java CMS - FreeCMS2.8 自定义标签 commentPage

项目地址:http://www.freeteam.cn/ commentPage 根据参数提取评论对象。 参数 说明 siteid 站点id objtype 评论对象类型 objid 评论对象id membername 会员名称 isanonymous 是否匿名 1是 ...

freeteam
29分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部