菜单

用c语言写的简要总结器,c语言总括器

2019年8月22日 - Java

C语言,轻易总计器【上】,c语言总括器

出于职业急需近些日子在斟酌PHP扩充,无可防止的涉嫌到了C语言。从出了全校现在C语言在骨子里专门的职业中还并未有用到过,所以必需求先举办一些复习职业。个人感到对于掌握一样东西说最佳的秘籍是右边实践。于是便回想了马上大学的时候老师铺排过的一道标题,用C语言完结简单数学表达式的分析和求值,比较可惜的是当时未能把标题完结。就想着从新试一试,算是补一下当场的课业。

 

还记得那时候的思绪是,循环C字符串。用链表将不相同的乘除项存款和储蓄到链表中。然后在开展循环求值。假诺碰到括号就递归调用。纪念并整理了须臾间那儿的笔触大约如下。

    1.输入 3+5*(2-6)/2

 

    2.解析为 

        

图片 1

    3.总结 通过五回巡回对两样优先级举办演算得出结果

       
第叁回对*/实行计算,拿当前节点,和节点的next节点,求值后将值赋给next节点,并删除自己节点

        第三遍对+-举行求值,直到遇到end

 

开始时期也希图按那个思路去贯彻的,之后开采解析的步骤会相比复杂,涉及到数次的字符串寻觅,比对。再增进C本人不帮衬正则表明式,所以就放任了当初的思绪。找了有的生死相依的素材后意识了一种更简单也更不错的法子,那正是将输入转变来后缀表达式再开展求值,那后缀表明式毕竟是什么吧,请继续看下来。

 

一、后缀表明式

百度百科介绍:
不包涵括号,运算符放在多个运算对象的前边,全数的盘算按运算符出现的逐个,严厉从左向右进行(不再思念运算符的先行准绳,如:(2

 

打探了后缀说明式才精通,原本大家习贯的数学表明式被堪称中缀表达式。花了点时间研商了一晃意识后缀表明式的计量还蛮简单的,也更符合Computer运算。

 

计量办法,从左往右举行测算。取运算符号前两位数字进行演算,运算结果代替运算符以及前两位数字,持续运算到最左边得出结果。

    这么聊到来或者相比难领悟,我们看多少个例子

最简便易行的  21+

  1. 计算进度为 2 + 1 = 3

  2. 值为 3

普通的 325-2*+

  1. 算算进度 从左往右先总括 2-5=-3,-3代表前边的25-之后为
    3-32*+,完整的持筹握算步骤如下

  2. 计量2-5=3    总计完之后表达式为 3 -3 2 *+

  3. 计算-3*2=-6  总计完之后表达式为 3 -6 +

  4. 算算3+-6=-3  计算完之后表达式为 -3

  5. 值为 -3

多少复杂一点的  21+3*5387-/*-

  1. 计量进程 从左往右先计算 2+1 = 3,4代表前面包车型地铁21+之后为 33*5387-/*-
    完整的揣摸步骤如下

  2. 算算2+1=3    总结完之后表明式为 3  3 *5 3 8 7 -/*-

  3. 计算3*3=9     总括完之后表达式为 9  5  3  8 7 -/*-

  4. 计算8-7=1     总括完以往表达式为 9  5  3  1 /*-

  5. 算算3/1=3     总结完之后表明式为 9  5 3  *-

  6. 计算5*3=15   总计完之后表达式为 9 15 –

  7. 计算9-15=-6 结果为 -6

  8. 值为 -6

 

 

看完了上述结果,我们会开掘每二次踏足计算的数字,都是最临近运算符号的两位数字。然后由运算出来的结果替代参预运算的数字和平运动算符,直到表明式只剩余二个值,总计实现。

 

 依照那样的规律,程序管理起来就回顾了。        

        1.从左往右的循环整个输入。

       
2.论断是还是不是是数字,假如是数字就保存起来。假设遭受符号,则把保存的前多少个值抽取来,计算后把本次总结结果存回去

        3.巡回实现以往,剩下的表达式就是测算结果了

   
依照如上准绳轻松窥见每一趟到场计算的八个数字都以最终存进去的,那样一来大家便能够用栈轻易的实现如此一个主次了,下边跟我们简介一下栈。

 

二、栈

   
百度健全的解说比较复杂,就不摘抄了。其实栈可以大约的接头为一个贮存数据的半空中,数据根据后进先出的标准化开展存取。对数据的操作有push和pop,分小名称叫压入,弹出。

 

    由于比较简单,所以直接用代码完成了多个简约的栈,满含如下多少个办法。

    图片 2

 

图片 3

 

    轻易的张开测验,输入结果为

    item is : 1.120000

    item is : 2.800000

    2.800000

    1.120000

    达成了预想输出,一个粗略的栈就化解了,接下去就足以应用全体大致的栈来完结求值的函数了。

 

三、后缀表明式求的有血有肉落实

 

   
由于栈已经落到实处了,所以只供给根据后缀表明式求值的逻辑进行演算在协作栈就足以兑现全部总括进度了。方法比较简单,用while循环整字符串,在非常switch对数字和平运动算符做差别的管理就能够一气浑成贰个简短的后缀表明式求值函数了。以下是率先版的兑今世码

    图片 4

 

图片 5

 

    

    在首先个本子的历程中,碰着三个C语言知识点是
C语言的字符串指针指向的地址是字符串第多少个字符的地点。 

    所以当i为0的时候,&str[i] = &str, atof
接收的是二个字符串指针,如若采用STACKpush(atof(&str[i])),i为0时,会将全方位字符串传入进去调换。接纳了三个char变量,讲str[i]拷贝出来,然后传入&num,则能够解决那几个标题。

 

   
其实这段程序里还涉及到三个指南针运算的知识点,然而这里的顺序里关系还相比轻松易懂,后续还会有更难的地点论及到这几个知识点,所以先松手后面再跟我们享用。

 

    对地方的点子实行了测量试验,输入大家事先剖析的七个表明式,得出结果如下

    printf(“%f\n”, calculate(“21+”)); //3

    printf(“%f\n”, calculate(“325-2*+”)); //-3

    printf(“%f\n”, calculate(“21+3*5387-/*-“)); //-6

 

   
测量检验通过,跟在此以前的企图结果直接。以上就是一个简练的后缀说明式的计量程序了。进行了多五遍的测验开采了一个小标题,正是当下不可能张开多位数的辨认。因为程序没三回都将一个人数压入站内了。思考了一晃在表达式的各种计算项上加了贰个空格符作为数字的分别。变为
 21 3 +这种方式,于是入手将代码做了一些小更动

 

    在 switch 中加入了对空格的拍卖,以及多位数的管理

 

    //尽管遭遇空格,则重新恢复设置标识位

   

图片 6

    那样一来即可识别多位数了。经测量试验 

    printf(“%f\n”, calculate(“21 1+”)); //22

    printf(“%f\n”, calculate(“2 11+”)); //13

    获得了科学的结果,整个差相当少总计器的率先步总括后缀表明式达成。

    风乐趣的能够测验一下上的代码,假设遇上什么样难题得以由此微信大伙儿号报告给自家。

   
当然那一个程序还大概有部分有待健全的地方。如表明式合法性检查,对小数的管理,以及对负数的拍卖等,一时半刻先预留着持续再跟大家大快朵颐怎么样落到实处以及会用到的知识点。

   
下一篇将为大家介绍轻易数学表达式总括的第二步,怎样促成将中缀表明式转变为后缀表明式。

  

  迎接大家关注微信徒人号~

 

  图片 7

 

http://www.bkjia.com/Cyy/1213869.htmlwww.bkjia.comtruehttp://www.bkjia.com/Cyy/1213869.htmlTechArticleC语言,简单计算器【上】,c语言计算器
由于工作须要近期在商量PHP扩大,无可制止的关联到了C语言。从出了学堂之后C语言在实际上职业中…

用c语言写的轻松总括器,c语言总结器

最早版本:

#include<stdio.h>

int checkPassword();

int add(int x,int y);

int sub(int x,int y);

int multi(int x,int y);

float quo(float x1,float y1);

int com(int x,int y);

int x,y;

int result;

int select;

float result1;

float x1,y1;

int success,psw;

int a;

int i;

int t;

 

 

void main()

{

         printf(“请输入密码:\n”);

         i=0;

         do{

        

                   scanf(“%d”,&a);

 

                   if( a!=1234  && i<2)

                            printf(“请重新输入密码:\n”);

                   else

                            i=3;

                   i++;

}while( i<=2);

         if(a==1234)

         {

                            for(t=1;t!=6;t=select)

         {

        

        

 

         printf(“+=============================+\n”);

         printf(“+======计=算=器=主=菜=单======+\n”);

         printf(“+=============================+\n”);

         printf(“+==========1、  加法==========+\n”);

         printf(“+==========2、  减法==========+\n”);

         printf(“+==========3、  乘法==========+\n”);

         printf(“+==========4、  除法==========+\n”);

         printf(“+==========5、  求余==========+\n”);

         printf(“+==========6、  退出==========+\n”);

         printf(“+=============================+\n”);

 

 

         printf(“请输入你的选项:\n”);

         scanf(“%d”,&select);

 

         switch(select)

         {

        

         case 1:

                   printf(“请输入多少个数:\n”);

                   scanf(“%d%d”,&x,&y);

                   result=add(x,y);

                   printf(“%d+%d=%d\n”,x,y,result);

                   break;

         case 2:

                   printf(“请输入八个数:\n”);

                   scanf(“%d%d”,&x,&y);

                   result=sub(x,y);

                   printf(“%d-%d=%d\n”,x,y,result);

                   break;

         case 3:

                   printf(“请输入多少个数:\n”);

                   scanf(“%d%d”,&x,&y);

                   result=multi(x,y);

                   printf(“%d*%d=%d\n”,x,y,result);

                   break;

         case 4:

                   printf(“请输入五个数:\n”);

                   scanf(“%f%f”,&x1,&y1);

                   result1=quo(x1,y1);

                   printf(“%f/%f=%f\n”,x1,y1,result1);

                   break;

         case 5:

                   printf(“请输入五个数:\n”);

                   scanf(“%d%d”,&x,&y);

                   result=com(x,y);

                   printf(“%d/%d=%d\n”,x,y,result);

                   break;

         case 6:

                   break;

         default:

                   printf(“请输入1~5之间的数\n”);

                   break;

 

 

         }

         }

         }

}

int add(int x,int y)

{

         int sum;

         sum=x+y;

         return sum;

}

int sub(int x,int y)

{

         int sub;

         sub=x-y;

         return sub;

}

int multi(int x,int y)

{

         int multi;

         multi=x*y;

         return multi;

}

float quo(float x,float y)

{

         float quo;

         quo=x/y;

         return quo;

}

int com(int x,int y)

{

         int com;

         com=x%y;

         return com;

}

int checkPassword( int psw)

{

         if(psw==1234)

                   success=1;

         else

                   success=-1;

         return success;

}

 

 

 

 

 

改版后:

 

 

#include<stdio.h>

int yanzheng(int );

void caidan();

void jiafa(int,int);

void jianfa(int,int);

void chengfa(float,float);

void chufa(float,float);

void mo(int,int);

 

void main(){

         int x,m;

         int y;

         float a,b;

         printf(“请输入密码:\n”);

         scanf(“%d”,&x);

         m=yanzheng(x);

         if(m==1){

                   caidan();

                   //int y;

                   //float a,b;

                   for(;y!=6;){

                   printf(“请输入选项:\n”);

                   scanf(“%d”,&y);

                   if(y>=1 && y<6){

                   printf(“请输入要运算的四个数:\n”);

                   scanf(“%f%f”,&a,&b);

                   }

 

                   switch(y){

                   case 1 :jiafa(a,b);break;

                   case 2 :jianfa(a,b);break;

                   case 3 :chengfa(a,b);break;

                   case 4 :chufa(a,b);break;

                   case 5 :mo(a,b);break;

                   case 6 :break;

                   default : printf(“选项输入错误!请重试\n”);break;

                   }

                   }

         }

}

 

 

int yanzheng(int x){

         int i,m;

         for(i=1,m=0;i<3;i++){

                   if(x==1234){

                            m=1;

                            break;

                   }

                   printf(“请重新出入密码:”);

                   scanf(“%d”,&x);

                  

         }

         return m;

}

 

void caidan(){

         printf(“+=============================+\n”);

         printf(“+======计=算=器=主=菜=单======+\n”);

         printf(“+=============================+\n”);

         printf(“+==========1、  加法==========+\n”);

         printf(“+==========2、  减法==========+\n”);

         printf(“+==========3、  乘法==========+\n”);

         printf(“+==========4、  除法==========+\n”);

         printf(“+==========5、  求余==========+\n”);

         printf(“+==========6、  退出==========+\n”);

         printf(“+=============================+\n”);

}

 

void jiafa(int x,int y){

         int sum;

         sum=x+y;

         printf(“%d\n”, sum);

}

 

void jianfa(int x,int y){

         int cha;

         cha=x-y;

         printf(“%d\n”, cha);

}

 

void chengfa(float x,float y){

         float ji;

         ji=x*y;

         printf(“%f\n”, ji);

}

 

void chufa(float x,float y){

         float shang;

         shang=x/y;

         printf(“%f\n”, shang);

}

 

void mo(int x,int y){

         int mo;

         mo=x%y;

         printf(“%d\n”, mo);

}

 

http://www.bkjia.com/Cyy/1129622.htmlwww.bkjia.comtruehttp://www.bkjia.com/Cyy/1129622.htmlTechArticle用c语言写的简单计算器,c语言计算器 最早版本:
#includestdio.h int checkPassword(); int add(int x,int y); int sub(int
x,int y); int multi(int x,int y); float qu…

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图