C-C++ 语言中的表达式求值
- 格式:doc
- 大小:23.50 KB
- 文档页数:2
c语言算术表达式求值C语言是一种广泛应用的编程语言,其强大的算术表达式求值功能使其在科学计算、数据处理、游戏开发等领域有着重要的应用。
本文将介绍C语言中算术表达式求值的相关知识,包括运算符、运算符优先级、表达式求值的顺序等内容。
我们需要了解C语言中常用的算术运算符。
C语言支持的算术运算符包括加法(+)、减法(-)、乘法(*)、除法(/)和求余(%)等。
这些运算符用于对数值进行基本的加减乘除运算。
在C语言中,运算符的优先级决定了表达式求值的顺序。
常见的运算符优先级从高到低依次为:1. 括号(()):括号中的表达式具有最高的优先级,可以改变默认的运算次序。
2. 一元运算符:包括正号(+)和负号(-),用于表示正负数。
3. 乘法、除法和求余:乘法(*)、除法(/)和求余(%)的优先级相同,从左到右依次计算。
4. 加法和减法:加法(+)和减法(-)的优先级相同,从左到右依次计算。
在使用C语言进行算术表达式求值时,我们需要遵循这些运算符的优先级规则,以保证表达式的正确求值。
如果表达式中包含多个运算符,我们需要根据优先级确定运算的顺序,可以使用括号来改变默认的运算次序。
下面我们将通过几个例子来说明C语言中算术表达式求值的过程。
例1:求解一个简单的算术表达式假设我们需要计算表达式 3 + 4 * 2,根据运算符优先级规则,先计算乘法,再计算加法。
具体的求解过程如下:1. 计算4 * 2,得到8。
2. 计算3 + 8,得到11。
所以,表达式3 + 4 * 2的值为11。
例2:使用括号改变运算次序假设我们需要计算表达式(3 + 4) * 2,根据运算符优先级规则,先计算括号内的加法,再计算乘法。
具体的求解过程如下:1. 计算3 + 4,得到7。
2. 计算7 * 2,得到14。
所以,表达式(3 + 4) * 2的值为14。
通过以上两个例子,我们可以看到,C语言中的算术表达式求值是按照运算符优先级和运算次序进行的,遵循从左到右的计算规则。
C语言运算符和表达式C语言把除了控制语句和输入输出以外几乎所有的基本操作都作为运算符处理。
1自增(++)、自减(-一)运算符:自增(++)、自减(一)运算符的作用是使变量的值加1或减1,例如,++ii(在使用之前,先使的值加(减)1)i++,i-(在使用i之后,使i的值加(减)1)y++i和i++的不同之处在于:++i是先执行i=i+1,再使用i的值;而i++是先使用i的值,再执行i=i+lβ自增(减)运算符常用于循环语句中,使循环变量自动加1;也用于指针变量,使指针指向下一个地址。
2算术表达式和运算符的优先级与结合性用算术运算符和括号将运算对象连接起来的、符合C语法规则的式子称C 算术表达式。
运算对象包括常量、变量、函数等。
c语言规定了运算符的优先级(如先乘除后加减),还规定了运算符的结合性。
在表达式求值时,先按运算符的优先级别顺序执行,如果在一个运算对象两侧的运算符的优先级别相同,C语言规定了各种运算符的结合方向(结合性),算术运算符的结合方向都是〃自左至右〃,即运算对象先与左面的运算符结合。
算术运算符是自左至右(左结合性),赋值运算符是自右至左(右结合性)。
赋值运算符和赋值表达式赋值运算符就是二,表示〃存储〃,即把赋值号右边表达式的值存给左边的变量。
可以出现在赋值号左边的式子,称为左值(Ieftvalue)o左值必须有内存空间且允许赋值。
常用的左值是变量,但常变量不能作为左值。
赋值运算符的结合性,从右至左。
若有两个赋值号,要先执行右边的。
如:a=b=2相当于是a=(b=2).3不同类型数据间的混合运算在程序中经常会遇到不同类型的数据进行运算,如果一个运算符两侧的看据类型不同,则先自动进行类型转换,使二者成为同一种类型,然后进行运算。
整型、实型,字符型数据间可以进行混合运算。
规律为1)十、-\/运算的两个数中有一个数为float或double型,结果是double 型,因为系统将所有float型数据都先转换为double型,然后进行运算。
c语言算术表达式求值【实用版】目录1.引言2.C 语言算术表达式的基本概念3.C 语言算术表达式的求值方法4.实际应用示例5.总结正文【引言】在 C 语言编程中,算术表达式是用来进行数值计算的重要工具。
本篇文章将为大家介绍 C 语言算术表达式的求值方法。
【C 语言算术表达式的基本概念】C 语言中的算术表达式主要包括以下几种:1.一元运算符:例如+、-、*、/等,用于对一个数值进行操作。
2.二元运算符:例如+、-、*、/等,用于对两个数值进行操作。
3.关系运算符:例如<、>、<=、>=、==、!=等,用于比较两个数值的大小或相等性。
4.逻辑运算符:例如&&、||、! 等,用于进行逻辑判断。
【C 语言算术表达式的求值方法】C 语言中,算术表达式的求值主要遵循以下规则:1.先进行括号内的运算,再进行括号外的运算。
2.先进行乘除法运算,再进行加减法运算。
3.关系运算符和逻辑运算符的优先级较低,从左到右依次进行运算。
【实际应用示例】下面我们通过一个实际的 C 语言程序,来演示算术表达式的求值过程。
```c#include <stdio.h>int main() {int a = 10, b = 5;int result;result = a + b * (a - b) / (a * b);printf("The result is: %d", result);return 0;}```在这个程序中,我们定义了两个整数变量 a 和 b,并通过算术表达式计算 result 的值。
根据我们之前提到的算术表达式求值规则,我们可以将这个表达式分解为以下几个步骤:1.计算括号内的值:a - b = 10 - 5 = 52.计算乘法运算:b * (a - b) = 5 * 5 = 253.计算除法运算:(a * b) / (a * b) = 14.计算加法运算:a + 25 = 10 + 25 = 355.输出结果:printf("The result is: %d", result); 输出 35【总结】通过本篇文章的介绍,相信大家已经对 C 语言算术表达式的求值方法有了更加深入的了解。
一、表达式求值┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅〖第1题〗如果有变量定义:char ch='B';则程序段ch=(ch>='A'&&ch<='Z')?(ch+32):ch;printf("%c",ch)的输出结果为【1】〖第2题〗如果有变量定义:int a=2则表达式:a+=a-=a*a 的值为【1】〖第3题〗表达式:x=!3<(5==5)的值为【1】〖第4题〗如果有变量定义:int x=1,y=1,z=1则表达式:k=++x&&++y||++z 的值为_____〖第5题〗如果有变量定义:int x=5,则表达式:x>>1的值为【1】〖第6题〗如果有变量定义:int x=3,y=4,z=5;则表达式:x+=y-=z*=x的值为【1】〖第7题〗如果有变量定义:int x=3.5,a=7,y=6.7则表达式:k=a%3*(x+y)/2 的值为【1】〖第8题〗如果有变量定float x=5.0,y=4.0则表达式:x<y?1.0:1.5的值为【1】〖第9题〗如果有变量定义:int a=5,b=4则表达式:a>b?3:1.5的值为【1】〖第10题〗如果有变量定义:int a=15,则表达式:a=a<<2 的值为【1】〖第11题〗如果有变量定义:int a=4, b=3;float x=4.5, y=2.5则表达式:(float)(a+b)/2+(int)x%(int)y 的值为【1】〖第12题〗如果有变量定义:int i=2则表达式:j=i++的值为【1】〖第13题〗如果有变量定义:int a=1,b=4;则表达式:a>b? a : b+2 的值为【1】〖第14题〗如果有变量定义:int a=90则表达式:a+=a-=a*=a 的值为【1】〖第15题〗如果有变量定义:int a=1,b=2,c=1,x=4,y=5则表达式:!a&&b||x>y&&c 的值为【1】〖第16题〗如果有变量定义:int x=4.6,y=2.5则表达式:z=(int)x%(int)y 的值为【1】〖第17题〗如果有变量定义:int x,则表达式:x=-3*5%(14/5) 的值为【1】〖第18题〗如果有变量定义:float x=4,则表达式:sizeof(x)的值为【1】〖第19题〗如果有变量定义:int a=11则表达式:a%=(5%2) 的值为【1】〖第20题〗如果有变量定义:int a=5则表达式:a*=3+4 的值为【1】〖第21题〗表达式:x=(17+5)%4/2 的值为【1】〖第22题〗如果有变量定义:int i=1,j=9,a;则表达式:a=i+(j%4!=0) 的值为_【1】〖第23题〗如果有变量定义:int y;char x='b';则表达式:y=x+1 的值为【1】〖第24题〗如果有变量定义:double x=0.3,y=0.5,z=0.8;则表达式:x>y>z的值为【1】〖第25题〗如果有变量定义:int x=0,y=0,z=0则表达式:k=++x||++y&&++z 的值为______〖第26题〗如果有变量定义:int a=1,b=2,c=3,d=6则表达式:a>b?a:c>d?c:d 的值为【1】〖第27题〗如果有变量定义:int x=30,y=3,z=4则表达式:x=x=(y+z) 的值为____〖第28题〗如果有变量定义:int a=8,n=5则表达式:a/=(n%=2) 的值为【1】〖第29题〗如果有变量定义:int a,b则表达式:b=(a=3*2, a*4),a+5 的值为【1】〖第30题〗如果有变量定义:int x=0x12;则表达式:printf("%d",x++);的为【1】〖第31题〗如果有变量定义:int x=4,y=4,z=3则表达式:z>=y&&y>=x 的值为_____〖第32题〗如果有变量定义:int x=3,y=4,z=5则表达式:(z>=y>=x)?1:0 的值为____〖第33题〗如果有变量定义:int a=3,b=4则表达式:(!a)||(a>b) 的值为【1】〖第34题〗如果有变量定义:int a,b 则表达式:x=a=4,5*a的值为【1】〖第35题〗如果有变量定义:int x,则表达式:x=-3+4/3-7 的值为【1】〖第36题〗如果有变量定义:int x ,则表达式:x=3+7%5-7 的值为【1】〖第37题〗如果有变量定义:int i=2则表达式:j=++i的值为【1】〖第38题〗表达式:!(7<=6)&&(5<=6) 的值为【1】.二、填空1."字符常量'a'在内存中应占【1】字节,字符串""a""应占【2】字节." 1 22."在16位PC机环境下,int类型数据应占【1】字节,double类型数据应占【2】字节." 2 83"在16位PC机环境下,int类型数据的取值范围是–32768到【1】 327674 unsigned int类型数据的取值范围是0到【1】 ." 655355"若采用十进制数的表示方法,则0110是【1】 ." 726"若有说明char s1='\x77';,则s1中包含【1】字符" 1 中7"设x为float型变量,y为float型变量,a为int型变量,b为long型变量,c为char型变量,则表达式x+y*a/x+b/y+c 的结果为【1】类型." double8 "定义如下变量:int x=2.5,y=4.7; int a=7;表达式 x+a%3*(int)(x+y)%2/4的值为【1】 ." 29 "设a,c,x,y,z均为int型变量,请在下面对应的位置上写出各表达式的结果.① a=(c=5,c+6,c/2) 【1】② x=(y=(z=6)+2)/5 【2】" 2 110"下列程序的输出结果为__________.main(){ int unsigned x1; int b=-1;x1=b; printf("%u",x1);}" 6553511 "下列程序的输出结果为【1】.main(){ int a=5;printf("%d,", (3+5,6+9));a=(3*5,a+4); printf("a=%d\n",a);}15,a=912 下列程序的输出结果为【1】.main(){ int x, y, z;x=24; y=025; z=0x24;printf("%d,%d,%d", x, y, z);} 24,21,3613 "下列程序的运行结果为【1】.main(){ char c1='a',c2='b',c3='c';printf("a%cb%cc%c"",c1,c2,c3);} aabbcc14 "设有变量定义:int j; float y;,输入字符流行:12345a72当执行C语句scanf("%2d%f",&j,&y);和printf("%d,%.1f",j,y);后,输出是【1】." 12,345.015 "以下程序的输出结果是【1】.void main(){ unsigned int a=65535;int b;printf("%d\n",b=a);} -116"若有定义:int a=10,b=9,c=8;接着顺序执行下列语句后,变量c的值是【1】_.c=(a-=(b-5));c=(a%11)+(b=2);817 "以下程序执行后的输出结果是【1】.main(){ int a=5,b,c;a*=3+2;printf("%d",a);a*=b=c=5;printf("%d",a);} 2512518 "完善程序:判断输入的一个整数是否能被3或7整除,若能输出YES,若不能输出NO.main(){ int k;printf(""Enter a int number:""); scanf(""%d"",&k);if(【1】) printf(""YES\n"");else printf(""NO\n"");}k%3==0 || k%7==019"设i为int型变量,则下面程序段的输出结果是【1】.for(i=1; i<=2; i++) printf("OK");OKOK20 "在C语言的文件系统中,最重要的概念是"文件指针",文件指针的类型只能是_______ 类型. FILE21 "C语言调用【1】函数打开文件,调用【2】函数关闭文件.fopen fclose。
C语⾔详解-表达式和语句1. 什么是表达式?C语⾔中的表达式⼀种有值的语法结构,它由运算符将变量、常量、函数调⽤返回值结合⽽成。
1.1 变量变量名本⾝是⼀个表达式,表达式的值是变量当前的值。
复杂的表达式由[], ->, ., 和单⽬运算符*构成。
1.2 常量常量名本⾝是⼀个表达式,字⾯常量也是表达式。
对于这两者,表达式的值是常量当前的值。
1.3 函数调⽤对于返回值不为void的函数,对它的正确调⽤也是表达式。
表达式的值为函数的返回值。
1.4 操作符运算符⽤于连接表达式中的值。
以下是C语⾔中的运算符,运算符的优先级,及运算符的结合顺序OrderCategory Operator Operation Associativity1Highest precedence( )[ ]→: :.Function call L → RLeft to Right2Unary!~+-++- -&*Size of Logical negation (NOT)Bitwise 1’s complementUnary plusUnary minusPre or post incrementPre or post decrementAddressIndirectionSize of operant in bytesR → LRight -> Left3Member Access.*→*DereferenceDereferenceL → R4Multiplication*/%MultiplyDivideModulusL → R5Additive+-Binary PlusBinary MinusL → R6Shift<<>>Shift LeftShift RightL → R7Relational<<=>>=Less thanLess than or equal toGreater thanGreater than or equal toL → R8Equality==!=Equal toNot Equal toL → R9Bitwise AAND&Bitwise AND L → R 10Bitwise XOR^Bitwise XOR L → R 11Bitwise OR|Bitwise OR L → R 12Logical AND&&Logical AND L → R 14Conditional? :Ternary Operator R → L15Assignment=*=%=/=+=-=&=^=|=<<=>>=AssignmentAssign productAssign reminderAssign quotientAssign sumAssign differenceAssign bitwise ANDAssign bitwise XORAssign bitwise ORAssign left shiftAssign right shiftR → L>>=Assign right shift16Comma,Evaluate L → R1.5 实例/* 变量常量表达式 */asum10.5PI/* 算术表达式 */a + ba -b + ca *b + 'A'a /b -c + 10i++ + i++ + ++i/* 赋值表达式 */a = ba *=b += 20a =b =c = 10a = (b=4) / (c=2)/* 逗号表达式 */1+2, 3+4(10, a*5), a+10/* 关系表达式 */x == yx <= yx != y/* 逻辑表达式 */10 && 200 || 1(a>b) && (!0)/* 复合表达式 */x = ( y = (a + b), z=10)/* 表达式的应⽤ */if( !100 ) //!100为逻辑表达式printf("expression show!");for(int i=10; i<10; i++)//for包含3个表达式,分别为i=10 i<10 i++printf("expression show!");while( 1 ) //1也是⼀个表达式{printf("death loop!");}2. 语句语句指的是当程序运⾏时执⾏某个动作的语法结构。
表达式求值c语言程序#include <stdio.h>#include <stdlib.h>#include <ctype.h>char expression[100];int pos = 0;int num1, num2;char op;int parse_expr() {int i;num1 = parse_term();while (expression[pos] != '\0') {op = expression[pos];pos++;num2 = parse_term();switch (op) {case '+':num1 += num2;break;case '-':num1 -= num2;break;case '*':num1 *= num2;break;case '/':num1 /= num2;break;default:printf("Invalid operator: %c\n", op); exit(1);}}return num1;}int parse_term() {int i, n = 0;while (isdigit(expression[pos])) {n = n * 10 + (expression[pos] - '0'); pos++;}return n;}int main() {printf("Enter an expression: ");fgets(expression, 100, stdin);pos = 0;printf("Result: %d\n", parse_expr());return 0;}该程序使用递归下降解析算法来解析表达式。
在解析表达式时,程序从左到右依次扫描表达式中的每个字符,并使用递归函数来解析每个子表达式和操作数。
数据结构课程设计四则运算表达式求值(C语⾔版) 明⼈不说暗话,直接上,输⼊提取码z3fy即可下载。
⽂件中包含程序,程序运⾏⽂件,设计报告和测试样例,应有尽有,欢迎⼩伙伴们在中下载使⽤。
本课程设计为四则运算表达式求值,⽤于带⼩括号的⼀定范围内正负数的四则运算标准(中缀)表达式的求值。
注意事项:1、请保证输⼊的四则表达式的合法性。
输⼊的中缀表达式中只能含有英⽂符号“+”、“-”、“*”、“/”、“(”、“)”、“=”、数字“0”到“9”以及⼩数点“.”,输⼊“=”表⽰输⼊结束。
例如9+(3-1)*3.567+10/2=,特别是请勿输⼊多余空格和中⽂左右括号。
2、输⼊的中缀表达式默认限定长度是1001,可根据具体情况调整字符串数组的长度。
3、请保证输⼊的操作数在double数据类型范围内,单个数字有效数字长度不可超过15位。
本课程设计中操作数是C语⾔中的双精度浮点数类型。
4、本课程设计中的运算数可以是负数,另外如果是正数可直接省略“+”号(也可带“+”号)。
下⾯的程序正常运⾏需要在上⾯的百度⽹盘中下载相应⽂件,否则⽆法正常使⽤哦。
1/*本程序为四则运算表达式求值系统,⽤于计算带⼩括号的四则运算表达式求值。
2具体算法:3先将字符串处理成操作单元(操作数或操作符),再利⽤栈根据四则运算4的运算法则进⾏计算,最后得出结果。
*/56 #include<stdio.h>7 #include<ctype.h>8 #include<stdlib.h>9 #include<string.h>10 #include<stdlib.h>11 #include<ctype.h>1213const int Expmax_length = 1001;//表达式最⼤长度,可根据适当情况调整14struct Ope_unit15 {//定义操作单元16int flag;//=1表⽰是操作数 =0表⽰是操作符 -1表⽰符号单元17char oper;//操作符18double real;//操作数,为双精度浮点数19 };2021void Display();//菜单22void Instru(); //使⽤说明23int Check(char Exp_arry[]);24void Evalua(); //先调⽤Conver操作单元化,再调⽤Calculate函数计算结果并输出25int Conver(struct Ope_unit Opeunit_arry[],char Exp_arry[]);//将字符串处理成操作单元26int Isoper(char ch);//判断合法字符(+ - * / ( ) =)27int Ope_Compar(char ope1,char ope2);//操作符运算优先级⽐较28double Calculate(struct Ope_unit Opeunit_arry[],int Opeunit_count,int &flag);//⽤栈计算表达式结果29double Four_arithm(double x,double y,char oper);//四则运算3031int main()32 {33int select;34while(1)35 {36 Display();37 printf("请输⼊欲执⾏功能对应的数字:");38 scanf("%d",&select);39 printf("\n");40switch(select)41 {42case1: Evalua(); break;43case2: Instru(); break;44case0: return0;45default : printf("⽆该数字对应的功能,请重新输⼊\n");46 system("pause");47 }48 }49return0;50 }5152int Check(char Exp_arry[])53 {//检查是否有⾮法字符,返回1表⽰不合法,0表⽰合法54int Explength=strlen(Exp_arry),i;55for(i=0;i<Explength;i++)56 {57if(!Isoper(Exp_arry[i]) && Exp_arry[i] != '.' && !isdigit(Exp_arry[i]))58return1;59if(isdigit(Exp_arry[i]))60 {61int Dig_number=0,Cur_positoin=i+1;62while(isdigit(Exp_arry[Cur_positoin]) || Exp_arry[Cur_positoin]=='.')63 {64 Dig_number++;65 Cur_positoin++;66 }67if(Dig_number >= 16)//最多能够计算15位有效数字68return1;69 }70 }71return0;72 }7374void Evalua()75 {//先调⽤Conver函数将字符串操作单元化,再调⽤Calculate函数计算结果并输出76char Exp_arry[Expmax_length];77int flag=0;//假设刚开始不合法,1表达式合法,0不合法78struct Ope_unit Opeunit_arry[Expmax_length];7980 getchar();//吃掉⼀个换⾏符81 printf("请输⼊四则运算表达式,以=结尾:\n");82 gets(Exp_arry);83 flag=Check(Exp_arry);84if(flag)85 printf("该表达式不合法!\n");86else87 {88int Opeunit_count = Conver(Opeunit_arry,Exp_arry);89double ans = Calculate(Opeunit_arry,Opeunit_count,flag);90if(flag)91 {92 printf("计算结果为:\n");93 printf("%s%lf\n",Exp_arry,ans);94 }95else96 printf("该表达式不合法!\n");97 }98 system("pause");99 }100101int Conver(struct Ope_unit Opeunit_arry[],char Exp_arry[])102 {//将字符串操作单元化103int Explength=strlen(Exp_arry);104int i,Opeunit_count=0;105for(i=0;i<Explength;i++)106 {107if(Isoper(Exp_arry[i]))//是操作符108 {109 Opeunit_arry[Opeunit_count].flag=0;110 Opeunit_arry[Opeunit_count++].oper=Exp_arry[i];111 }112else//是操作数113 {114 Opeunit_arry[Opeunit_count].flag=1;115char temp[Expmax_length];116int k=0;117for(; isdigit(Exp_arry[i]) || Exp_arry[i]=='.' ;i++)118 {119 temp[k++]=Exp_arry[i];120 }121 i--;122 temp[k]='\0';123 Opeunit_arry[Opeunit_count].real=atof(temp);//将字符转化为浮点数124125//负数126if(Opeunit_count == 1 && Opeunit_arry[Opeunit_count-1].flag==0127 && Opeunit_arry[Opeunit_count-1].oper=='-')128 {129 Opeunit_arry[Opeunit_count-1].flag = -1;130 Opeunit_arry[Opeunit_count].real *= -1;131 }// -9132if(Opeunit_count >= 2 && Opeunit_arry[Opeunit_count-1].flag==0133 && Opeunit_arry[Opeunit_count-1].oper=='-' && Opeunit_arry[Opeunit_count-2].flag==0 134 && Opeunit_arry[Opeunit_count-2].oper !=')')135 {136 Opeunit_arry[Opeunit_count-1].flag = -1;137 Opeunit_arry[Opeunit_count].real *= -1;138 }// )-9139140//正数141if(Opeunit_count == 1 && Opeunit_arry[Opeunit_count-1].flag==0142 && Opeunit_arry[Opeunit_count-1].oper=='+')143 {144 Opeunit_arry[Opeunit_count-1].flag = -1;145 }// +9146if(Opeunit_count >= 2 && Opeunit_arry[Opeunit_count-1].flag==0147 && Opeunit_arry[Opeunit_count-1].oper=='+' && Opeunit_arry[Opeunit_count-2].flag==0148 && Opeunit_arry[Opeunit_count-2].oper !=')')149 {150 Opeunit_arry[Opeunit_count-1].flag = -1;151 }// )+9152 Opeunit_count++;153 }154 }155/*for(i=0;i<Opeunit_count;i++)156 {//查看各操作单元是否正确,1是操作数,0是操作符157 if(Opeunit_arry[i].flag == 1)158 printf("该单元是操作数为:%lf\n",Opeunit_arry[i].real);159 else if(Opeunit_arry[i].flag == 0)160 printf("该单元是操作符为:%c\n",Opeunit_arry[i].oper);161 else162 printf("该单元是负号符为:%c\n",Opeunit_arry[i].oper);163 }*/164return Opeunit_count;165 }166167double Calculate(struct Ope_unit Opeunit_arry[],int Opeunit_count,int &flag)168 {//根据运算规则,利⽤栈进⾏计算169int i,dS_pointer=0,oS_pointer=0;//dS_pointer为操作数栈顶指⽰器,oS_pointer为操作符栈顶指⽰器170double Dig_stack[Expmax_length];//操作数栈(顺序存储结构)171char Ope_stack[Expmax_length];//操作符栈172173for(i=0;i<Opeunit_count-1;i++)174 {175if( Opeunit_arry[i].flag != -1 )176 {177if(Opeunit_arry[i].flag)//是操作数178 {179 Dig_stack[dS_pointer++]=Opeunit_arry[i].real;//⼊操作数栈180//printf("%lf\n",Digit[dS_pointer-1]);181 }182else//是操作符 + - * / ( )183 {184//操作符栈为空或者左括号⼊栈185if(oS_pointer==0 || Opeunit_arry[i].oper=='(')186 {187 Ope_stack[oS_pointer++]=Opeunit_arry[i].oper;188//printf("%oS_pointer\Ope_u_count",Operator[oS_pointer-1]);189 }190else191 {192if(Opeunit_arry[i].oper==')')//是右括号将运算符⼀直出栈,直到遇见左括号193 {194 oS_pointer--;//指向栈顶195 dS_pointer--;//指向栈顶196while(Ope_stack[oS_pointer] != '(' && oS_pointer != 0)197 {198 Dig_stack[dS_pointer-1] = Four_arithm(Dig_stack[dS_pointer-1],Dig_stack[dS_pointer], 199 Ope_stack[oS_pointer--]);//oS_pointer--为操作符出栈200201 dS_pointer--;//前⼀个操作数出栈202//printf("操作数栈顶元素等于%lf\n",Digit[dS_pointer]);203 }204 oS_pointer--;//左括号出栈205206 oS_pointer++;//恢复指向栈顶之上207 dS_pointer++;208 }209else if(Ope_Compar(Opeunit_arry[i].oper,Ope_stack[oS_pointer-1]))//和栈顶元素⽐较210 {211 Ope_stack[oS_pointer++]=Opeunit_arry[i].oper;212//printf("%oS_pointer\Ope_u_count",Operator[oS_pointer-1]);213 }214else//运算符出栈,再将该操作符⼊栈215 {216 oS_pointer--;//指向栈顶217 dS_pointer--;//指向栈顶218while(Ope_Compar(Opeunit_arry[i].oper,Ope_stack[oS_pointer])==0 && oS_pointer != -1) 219 {//当前操作符⽐栈顶操作符优先级⾼220 Dig_stack[dS_pointer-1]=Four_arithm(Dig_stack[dS_pointer-1],Dig_stack[dS_pointer], 221 Ope_stack[oS_pointer--]);222 dS_pointer--;223//printf("操作数栈顶元素等于%lf\n",Digit[dS_pointer]);224 }225 oS_pointer++;//恢复指向栈顶之上226 dS_pointer++;227 Ope_stack[oS_pointer++]=Opeunit_arry[i].oper;228 }229 }230 }231 }232 }233/*for(i=0;i<oS_pointer;i++)234 printf("操作符栈%oS_pointer\Ope_u_count",Operator[i]);235 for(i=0;i<dS_pointer;i++)236 printf("操作数栈%lf\n",Digit[i]);*/237 oS_pointer--;//指向栈顶元素238 dS_pointer--;//指向栈顶元素239while(oS_pointer != -1)240 {241 Dig_stack[dS_pointer-1]=Four_arithm(Dig_stack[dS_pointer-1],Dig_stack[dS_pointer], 242 Ope_stack[oS_pointer--]);//oS_pointer--为操作符出栈243 dS_pointer--;//前⼀个操作数出栈244//printf("操作数栈顶元素为%lf\Ope_u_count",Digit[dS_pointer]);245 }246//printf("%dS_pointer,%dS_pointer\n",oS_pointer,dS_pointer);247if(oS_pointer==-1 && dS_pointer==0)248 flag=1;//为1表⽰表达式合法249return Dig_stack[0];250 }251252int Ope_Compar(char ope1,char ope2)253 {//操作符运算优先级⽐较254char list[]={"(+-*/"};255int map[5][5]={//先⾏后列,⾏⽐列的运算级优先级低为0,⾼为1256// ( + - * /257/* ( */1,0,0,0,0,258/* + */1,0,0,0,0,259/* - */1,0,0,0,0,260/* * */1,1,1,0,0,261/* / */1,1,1,0,0 };262int i,j;263for(i=0;i<5;i++)264if(ope1==list[i]) break;265for(j=0;j<5;j++)266if(ope2==list[j]) break;267return map[i][j];268 }269270double Four_arithm(double x,double y,char oper)271 {//四则运算272switch(oper)//保证不含其它运算符273 {274case'+': return x+y;275case'-': return x-y;276case'*': return x*y;277case'/': return x/y;//y不能为0278default : return0;279 }280 }281282int Isoper(char ch)283 {//判断合法字符 + - * / ( ) =284if(ch=='+' || ch=='-' || ch=='*' || ch=='/' || ch=='(' || ch==')' || ch=='=')285return1;286return0;287 }288289void Display()290 {//打印菜单291 system("cls");292 printf("/******************************************************************************/\n");293 printf("\t\t 欢迎使⽤本四则运算表达式求值系统\n");294 printf("\n\t说明:建议请您先阅读使⽤说明,再输⼊相应的数字进⾏操作,谢谢配合!\n"); 295 printf("\n\t\t1 四则运算表达式求值\n");296 printf("\n\t\t2 使⽤说明\n");297 printf("\n\t\t0 退出\n");298 printf("/******************************************************************************/\n");299 }300301void Instru()302 {//打印使⽤说明303 FILE *fp;304char ch;305if( ( fp=fopen("使⽤说明.txt","r") ) == NULL)306 {307 printf("⽂件打开失败!\n");308 exit(0);309 }310for(; (ch = fgetc(fp)) != EOF; )311 putchar(ch);312 fclose(fp);313 printf("\n");314 system("pause");315 }。
第2章 C语言的数据和运算[目的要求]1. 了解C语言的数据类型;2. 掌握常量与变量的概念;3. 掌握整型、实型、字符型数据的常量和变量的引用方法;4. 掌握简单的输入和输出;5. 掌握变量赋初值的方法;6. 掌握各类数据的混合运算;7. 掌握算术、关系、逻辑运算符和算术、关系、逻辑表达式;8. 掌握赋值运算符和赋值表达式、逗号运算符和逗号表达式。
[基本内容]1. C语言的数据类型;2. 常量与变量;3. 简单的输入(scanf())和输出(printf());4. 运算符和表达式。
[重点难点]1.重点:数据类型、表达式。
2.难点:变量、表达式。
[课时安排]4学时。
2.1 程序设计概述一个程序应包括对数据的描述和对数据处理的描述。
1.对数据的描述,即数据结构。
2.对数据处理的描述,即电脑算法。
算法是为解决一个问题而采取的方法和步骤,是程序的灵魂。
为此,著名电脑科学家沃思〔Nikiklaus Wirth〕提出一个公式:数据结构 + 算法 = 程序2.2 C语言的数据类型C语言提供的数据结构,是以数据类型形式出现的。
具体分类如下:1. 基本类型分为整型、实型〔又称浮点型〕、字符型和枚举型四种。
2. 构造类型分为数组类型、结构类型和共用类型三种。
3. 指针类型。
4. 空类型C 语言中的数据,有常量和变量之分,它们分别属于上述这些类型。
本章将介绍基本类型中的整型、实型和字符型三种数据。
2.3 常量和变量2.3.1 常量1. 常量的概念在程序运行过程中,其值不能被改变的量称为常量。
2. 常量的分类〔1〕整型常量〔2〕实型常量〔3〕字符常量。
〔4〕符号常量。
2.3.2 变量1. 变量的概念在程序运行过程中,其值可以被改变的量称为变量。
2. 变量的两个要素〔1〕变量名。
每个变量都必须有一个名字──变量名,变量命名遵循标识符命名规则。
〔2〕变量值。
在程序运行过程中,变量值存储在内存中。
在程序中,通过变量名来引用变量的值。
C/C++ 语言中的表达式求值
C语言已被广泛地应用于系统软件和应用软件的开发中。
以下是小编为大家搜索整理的C语言的应用,欢迎阅读!更多相关信息请关注相关栏目!
1.数据库管理和应用程序方面
C语言的非数值处理功能很强,因此它被广泛地应用于数据库管理系统和应用软件。
大多数的关系数据库管理系统,如dBASE,Fox$ASE, ORACLE等,都是由C语言编写的。
各种不同部门的应用软件也大都是用G语言开发的,C语言在开发数据库应用软件方面应用很广,深受开发者的欢迎。
2.图形图像来统的应用程序方面
C语言在图形图像的开发中也有着广泛的市场。
很多图形图像系统,如AutoCAD通用图形系统等,就是使用C语言开发的,并且在这些图形系统中可以直接使用C语言编程,实现某些功能。
C语言编译系统带有许多绘图功能的函数,利用这些函数开发图形应用软件十分方便。
所开发的应用程序常用C语言编写接口界面,这样既方便又灵活,效果很好。
这是因为该语言提供有图形处理功能,便于实现图形图像的各种操作。
因此,C语言在图形图像的应用方面很好地发挥了它的作用。
3.编写与设备的接。
程序方面
C语言不仅在建立友好界面方面有着广泛应用,如下拉式菜
单、弹出菜单、多窗口技术等;而且在编写与设备的接口程序方面也有着广泛应用。
这是因为C语言不仅具有高级语言的特性还具有低级语言的功能,因此,在编写接口程序方面十分方便,有时它与汇编语言一起使用,会显示出更高的效率。
4.数据结构方面
由于C语言提供了十分丰富的数据类型,不仅有基本数据类型还有构造的数据类型,如数组、结构和联合等,把它们用于较复杂的数据结构〔例如,链表、队列、伐、树等)中显得十分方便,这方面已有许多成熟的例程供选择使用。
5.排序和检索方面
排序和检索是数据处理中最常遇到并较为复杂的间题。
使用C语言来编写排序和检索各种算法的程序既方便又简洁。
特别是有些排序算法采用了递归方法进行编程,更显得清晰明了。
因此、人们喜欢使用G语言来编写这方面的程序。
上述列举了五个方面的应用,但绝不是说C语言的应用仅限如此,而是说在这几个方面目前使用得更多些。
C,语言可以说在各个领域中都可以倪用,并且都会有较好的效果。
所以,C语言是当前被用于编程的最广泛的语言之一。
另外,C语言是一种结构化程序设计语言,在编写大型程序中也很方便,特别是该语言又提供了预处理功能,其中文件包含在多人同时开发一个大程序时将带来减少重复和提高效率等好处,因此,越来越多的人喜欢用C语言来开发大型程序。