文档库 最新最全的文档下载
当前位置:文档库 › C变量与算术表达式

C变量与算术表达式

C变量与算术表达式
C变量与算术表达式

C变量与算术表达式

我们来看下一个程序,使用公式℃=(5/9)(℉-32)打印下列华氏温度与摄氏温度对照表:

1 -17

20 -6

40 4

60 15

80 26

100 37

120 48

140 60

160 71

180 82

200 93

220 104

240 115

260 126

280 137

300 148

此程序中仍然只包括一个名为main 的函数定义。它比前面打印“hello, world”的程序

长一些,但并不复杂。这个程序中引入了一些新的概念,包括注释、声明、变量、算术表达式、循环以及格式化输出。该程序如下所示:

#include

/* 当fahr=0,20,…,300时,分别

打印华氏温度与摄氏温度对照表*/

main()

{

int fahr, celsius;

int lower, upper, step;

lower = 0; /* 温度表的下限*/

upper = 300; /* 温度表的上限*/

step = 20; /* 步长*/

fahr = lower;

while (fahr <= upper) {

celsius = 5 * (fahr-32) / 9;

printf("%d\t%d\n", fahr, celsius);

fahr = fahr + step;

}

}

其中的两行:

/*当fahr=0,20,…,300时,分别

打印华氏温度与摄氏温度对照表*/

称为注释,此处,它简单地解释,该程序是做什么用的。包含在/*与*/之间的字符序列将

编译器忽略。注释可以自由地运用在程序中,使得程序更易于理解。程序中允许出现空格、制表符或换行符之处,都可以使用注释。

在C 语言中,所有变量都必须先声明后使用。声明通常放在函数起始处,在任何可执行

语句之前。声明用于说明变量的属性,它由一个类型名和一个变量表组成,例如:

int fahr, celsius;

int lower, upper, step;

其中,类型int表示其后所列变量为整数,与之相对应的,float表示所列变量为浮点数(即,可以带有小数部分的数)。int与float类型的取值范围取决于具体的机器。对于int类型,通常为16 位,其取值范围在-32768~32767 之间,也有用32 位表示的int 类型。float 类型通常是32位,它至少有6 位有效数字,取值范围一般在10-38~1038之间。

除int与float类型之外,C语高还提供了其它一些基本数据类型,例如:

char 字符——一个字节

short 短整型

long 长整型

double 双精度浮点型

这些数据类型对象的大小也取决于具体的机器。另外,还存在这些基本数据类型的数组、结构、联合,指向这些类型的指针以及返回这些类型值的函教。我们将在后续相应的章节中分别介绍。

在上面的温度转换程序中,最开始执行的计算是下列4 个赋值语句:

lower = 0;

upper = 300;

step = 20;

fahr = lower;

它们为变量设置初值。各条语句均以分号结束。

温度转换表中的各行计算方式相同,因此可以用循环语句重复输出各行。这是while循

环语句的用途:

while (fahr <= upper) {

...

}

while 循环语句的执行方式是这样的:首先测试圆括号中的条件;如果条件为真

(fahr<=upper),则执行循环体(括在花括号中的3 条语句);然后再重新测试圆括号中的

条件,如果为真,则再次执行循环体;当圆括号中的条件测试结果为假(fahr>upper)时,循环结束,并继续执行跟在while循环语句之后的下一条语句。在本程序中,循环语句后没有其它语句,因此整个程序的执行终止。

while 语句的循环体可以是用花括号括起来的一条或多条语句(如上面的温度转换程序),也可以是不用花括号包括的单条语句,例如:

while (i < j)

i = 2 * i;

在这两种情况下,我们总是把由while控制的语句缩进一个制表位,这样就可以很容易地看出循环语句中包含哪些语句。这种缩进方式突出了程序的逻辑结构。尽管C 编译器并不关心

程序的外观形式,但正确的缩进以及保留适当空格的程序设计风格对程序的易读性非常重

我们建议每行只书写一条语句,并在运算符两边各加上一个空格字符,这样可以使得运算的结合关系更清楚明了。相比而言,花括号的位置就不那么重要了。我们从比较流行的一些风格中选择了一种,读者可以选择适合自己的一种风格,并养成一直使用这种风格的好习惯。在该程序中,绝大部分工作都是在循环体中完成的。循环体中的赋值语句

celsius = 5 * (fahr - 32) / 9:

用于计算与指定华氏温度相对应的摄氏温度值,并将结果赋值给变量celsius。在该语句中,

之所以把表达式写成先乘5然后再除以9而不是直接写成5 / 9,其原因是在C语言及许多

其它语言中,整数除法操作将执行舍位,结果中的任何小数部分都会被舍弃。由于5 和9 都是整数,5 / 9相除后经截取所得的结果为0,因此这样求得的所有摄氏温度都将为0。

从该例子中也可以看出printf函数的一些功能。printf是一个通用输出格式化函数,

第7 章将对此做详细介绍。该函数的第一个参数是待打印的字符串,其中的每个百分号(%)表示其它的参数(第二个、第三个、……参数)之一进行替换的位置,并指定打印格式。例如,%d指定一个整型参数,因此语句

printf(" %d\t%d\n", fahr, celsius);

用于打印两个整数fahr与celsius的值,并在两者之间留一个制表符的空间(\t)。printf 函数的第一个参数中的各个%分别对应于第二个、第三个、……参数,它们在数

目和类型上都必须匹配,否则将出现错误的结果。

顺便指出,printf函数并不是C语言本身的一部分,C语言本身并没有定义输入/输出

功能。printf 仅仅是标准库函数中一个有用的函数而已,这些标准序函数在C 语言程序中

通常都可以使用。但是,ANSI标准定义了printf函数的行为,因此,对每个符合该标准的编译器和库来说,该函数的属性都是相同的。

为了将重点放到讲述C 语言本身上,我们在第7 章之前的各章中将不再对输入/输出做

更多的介绍,并且,特别将格式化输入推后到第7 章讲解。如果读者想了解数据输入,可以先阅读7.4 节中对scanf函数的讨论部分,scanf函数类似于printf函数,但它用于读输入数据而不是写输出数据。

上述的温度转换程序存在两个问题。比较简单的问题是,由于输出的数不是右对齐的,

所以输出的结果不是很美观。这个问题比较容易解决:如果在printf 语句的第一个参数的

%d中指明打印宽度,则打印的数字会在打印区域内右对齐。例如,可以用语句

printf(" %3d %6d\n", fahr, celsius);

打印fahr与celsius的值,这样,fahr的值占3个数字宽,celsius的值占6 个数字宽,输出的结果如下所示:

0 -17

20 -6

40 4

60 15

80 26

100 37

...

另一个较为严重的问题是,由于我们使用的是整型算术运算,因此经计算得到的摄氏温

度值不太精确,例如,与0℉对应的精确的摄氏温度应该为-17.8℃,而不是-17℃。为了得到

更精确的结果,应该用浮点算术运算代替上面的整型算术运算。这就需要对程序做适当修改。下面是该程序的又一种版本

#include

/* print Fahrenheit-Celsius table

for fahr = 0, 20, ..., 300; floating-point version */

main()

{

float fahr, celsius;

float lower, upper, step;

lower = 0; /* lower limit of temperatuire scale */

upper = 300; /* upper limit */

step = 20; /* step size */

fahr = lower;

while (fahr <= upper) {

celsius = (5.0/9.0) * (fahr-32.0);

printf("%3.0f %6.1f\n", fahr, celsius);

fahr = fahr + step;

}

}

这个程序与前一个程序基本相同,不同的是,它把fahr 与celsius 声明为float 类型,转换公式的表述方式也更自然一些。在前一个程序中,之所以不能使用5 / 9的形式,是因为按整型除法的计算规则,它们相除并舍位后得到的结果为0。但是,常数中的小数点表

明该常数是一个浮点数,因此,5.0 / 9.0是两个浮点数相除,结果将不被舍位。

如果某个算术运算符的所有操作数均为整型,则执行整型运算。但是,如果某个算术运

算符有一个浮点型操作数和一个整型操作数,则在开始运算之前整型操作数将会被转换为浮点型。例如,在表达式fahr –32中,32在运算过程中将被自动转换为浮点数再参与运算。不过,即使浮点常量取的是整型值,在书写时最好还是为它加上一个显式的小数点,这样可以强调其浮点性质,便于阅读。

第2 章将详细介绍把整型数转换为浮点型数的规则。在这里需要注意,赋值语句

fahr = lower;

与条件测试语句

while (fahr <= upper)

也都是按照这种方式执行的,即在运算之前先把int类型的操作数转换为float类型的操作数。

printf中的转换说明%3.0f表明待打印的浮点数(即fahr)至少占3个字符宽,且不

带小数点和小数部分;%6.1f表明另一个待打印的数(celsius)至少占6个字符宽,且小数点后面有1位数字。其输出如下所示:

0 -17.8

20 -6.7

40 4.4

...

格式说明可以省略宽度与精度,例如,%6f表示待打印的浮点数至少有6个字符宽;%.2f 指定待打印的浮点数的小数点后有两位小数,但宽度没有限制;%f 则仅仅要求按照浮点数

印该数。

%d 按照十进制整型数打印

%6d 按照十进制整型数打印,至少6个字符宽

%f 按照浮点数打印

%6f 按照浮点数打印,至少6个字符宽

%.2f 按照浮点数打印,小数点后有两位小数

%6.2f 按照浮点数打印,至少6个字符宽,小数点后有两位小数

此外,printf 函数还支持下列格式说明:%o 表示八进制数;%x 表示十六进制数;%c 表示字符;%s表示字符串;%%表示百分号(%)本身。

练习1-3 修改温度转换程序,使之能在转换表的顶部打印一个标题。

练习1-4 编写一个程序打印摄氏温度转换为相应华氏温度的转换表。

C语言运算符大全 (2)

C语言运算符大全C语言的内部运算符很丰富,运算符是告诉编译程序执行特定算术或逻辑操作的符号。C语言有三大运算符:算术、关系与逻辑、位操作。另外,C还有一些特殊的运算符,用于完成一些特殊的任务。 表2-5列出了C语言中允许的算术运算符。在C语言中,运算符“+”、“-”、“*”和“/”的用法与大多数计算机语言的相同,几乎可用于所有C语言内定义的数据类型。当“/”被用于整数或字符时,结果取整。例如,在整数除法中,10/3=3。 一元减法的实际效果等于用-1乘单个操作数,即任何数值前放置减号将改变其符号。模运算符“%”在C 语言中也同它在其它语言中的用法相同。切记,模运算取整数除法的余数,所以“%”不能用于float和double类型。 最后一行打印一个0和一个1,因为1/2整除时为0,余数为1,故1%2取余数1。 C语言中有两个很有用的运算符,通常在其它计算机语言中是找不到它们的—自增和自减运算符,++和--。运算符“++”是操作数加1,而“--”是操作数减1,换句话说:x=x+1;同++x;x=x-1;同--x; 自增和自减运算符可用在操作数之前,也可放在其后,例如:x=x+1;可写成++x;或x++;但在表达式中这两种用法是有区别的。自增或自减运算符在操作数之前,C语言在引用操作数之前就先执行加1或减1 操作;运算符在操作数之后,C语言就先引用操作数的值,而后再进行加1或减1操作。请看下例: x=10; ;y=++x;

此时,y=11。如果程序改为: x=10;y=x++; 则y=10。在这两种情况下,x都被置为11,但区别在于设置的时刻,这种对自增和自减发生时刻的控制是非常有用的。在大多数C编译程序中,为自增和自减操作生成的程序代码比等价的赋值语句生成的代码 要快得多,所以尽可能采用加1或减1运算符是一种好的选择。 。下面是算术运算符的优先级: :最高++、- -- -(一元减) *、/、%最低+、-编译程序对同级运算符按从左到右的顺序进行计算。当然,括号可改变计算顺序。C语言 处理括号的方法与几乎所有的计算机语言相同:强迫某个运算或某组运算的优先级升高。 关系运算符中的“关系”二字指的是一个值与另一个值之间的关系,逻辑运算符中的“逻辑”二字指的是连接关系的方式。因为关系和逻辑运算符常在一起使用,所以将它们放在一起讨论。关系和逻辑运算符概念中的关键是True(真)和Flase(假)。C语言中,非0为True,0为Flase。使用关系或逻辑运算符的表达式对Flase和Ture分别返回值0或1(见表2-6)。 表2-6给出于关系和逻辑运算符,下面用1和0给出逻辑真值表。关系和逻辑运算符的优先级比算术运算符低,即像表达式10>1+12的计算可以假定是对表达式10>(1+12)的计算,当然,该表达式的结果为Flase。在一个表达式中允许运算的组合。例如: 10>5&&!(10<9)||3<=4 这一表达式的结果为True。

数据结构实验二——算术表达式求值实验报告

《数据结构与数据库》 实验报告 实验题目 算术表达式求值 学院:化学与材料科学学院 专业班级:09级材料科学与工程系PB0920603 姓名:李维谷 学号:PB09206285 邮箱:liwg@https://www.wendangku.net/doc/3f13956470.html, 指导教师:贾伯琪 实验时间:2010年10月10日 一、需要分析 问题描述:

表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。 问题分析: 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。 在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。 算法规定: 输入形式:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。 输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。 程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。 测试数据:正确输入:12*(3.6/3+4^2-1)# 输出结果:194.4

算术表达式求值演示程序

数理学院 课程设计报告书 课程名称数据结构课程设计 设计题目算术表达式求值演示 专业班级 学号 姓名 指导教师

2014 年12 月

4.2.2 基本操作: InitStack(&S) 操作结果:构造一个空栈S。 GetTop(S) 初始条件:栈S 已存在。 操作结 果: 用P 返回S的栈顶元素。Push(&S 初始条 件:,ch) 栈S 已存在。 操作结 果:插入元素ch 为新的栈顶元素。 Pop(&S) 初始条件:栈S 已存在。 操作结 果:删除S 的栈顶元素。 In(ch) 操作结果:判断字符是否是运算符,运算符即返回1 Precede(c1, c2) 初始条件:c1,c2 为运算符。操作结果:判断运算符优先权,返回优先权高的。Operate(a,op,b) 初始条件:a,b 为整数,op为运算符。操作结果: a 与 b 进行运算,op 为运算符,返回其值。num(n) 操作结果:返回操作数的长度。EvalExpr() 初始条件:输入表达式合法。操作结果:返回表达式的最终结果。}ADT Stack 主程序的流程:

EvaluateExpression() 函数实现了对表达式求值的功能,main() 函数直接调用EvaluateExpression() 对输入的表达式求值输出。 4.2.3 函数的调用关系图

4.3 详细设计 4.3.1 ① . Precede(char c1,char c2)判断运算符优先权,返回优先权高的 算符间的优先关系 如下: 算法伪代码如下: char Precede(char c1,char c2) { static char array[49]={ >', '>', '<', '<', '<', '>', '>', >', '>', '<', '<', '<', '>', '>', >', '>', '>', '>', '<', '>', '>', >', '>', '>', '>', '<', '>', '>', <', '<', '<', '<', '<', '=', '!', >', '>', '>', '>', '!', '>', '>', <', '<', '<', '<', '<', '!', '='}; // 用一维数组存储 49 种情况 switch(c1) { /* i 为下面 array 的横标 */ case '+' : i=0;break; case '-' : i=1;break; case '*' : i=2;break;

C语言试题:数据类型、运算符与表达式

3 数据类型、运算符与表达式 一、单项选择题 1、以下选项中,不正确的 C 语言浮点型常量是( C )。 A. 160. B. 0.12 C. 2e4.2 D. 0.0 分析:e 后面的指数必须为整数。 2、以下选项中,( D )是不正确的 C 语言字符型常量。 A. 'a' B. '\x41' C. '\101' D. "a" 分析:在C 语言中,’a ’表示字符常量,”a ”表示字符串。 3、 在 C 语言中,字符型数据在计算机内存中,以字符的(C )形式存储。 A.原码 B.反码 C. ASCII 码 D. BCD 码 分析:将一个字符常量放入一个字符变量中,实际上并不是将字符本身放到内存单元中,而是将字符的对应的ASCII 码放到储存单元中。 4、若x 、i 、j 和k 都是int 型变量,则计算下面表达式后,x 的值是( C )。 x=(i=4,j=16,k=32) A. 4 B. 16 C.32 D.52 分析:(i=4,j=16,k=32)的值为最后一个表达式的值,即为32,所以x=32. 5、算术运算符、赋值运算符和关系运算符的运算优先级按从高到低依次为(B )。 A. 算术运算、赋值运算、关系运算 B. 算术运算、关系运算、赋值运算 C. 关系运算、赋值运算、算术运算 D. 关系运算、算术运算、赋值运算 分析:算术运算符包括加法运算“+”符减法运算“-”符乘法运算符“*”以及除法运算符“/”,赋值运算符包括“=、+=、-=、*=、/=、……”,关系运算符包括“<、<=、>、>=”。 6、若有代数式bc ae 3 ,则不正确的C 语言表达式是( C )。 A.a/b/c*e*3 B. 3*a*e/b/c C.3*a*e/b*c D. a*e/c/b*3 分析:C 选项表达的是3ace/b 。 7、表达式!x||a==b 等效于( D )。 A. !((x||a)==b) B. !(x||y)==b C. !(x||(a==b)) D. (!x)||(a==b) 分析:由符优先级先后顺序在!x||a==b 中应先算“||”再算“!”,最后算“==”。选项B 不影响运算顺序。 8、设整型变量 m,n,a,b,c,d 均为1,执行 (m=a>b)&&(n=c>d)后, m,n 的值是( A )。 A. 0,0 B. 0,1 C. 1,0 D. 1,1 分析:先算括号里面的,a 不大于b ,则m=0,c 不大于d ,则n=0. 9、 设有语句 int a=3;,则执行了语句 a+=a-=a*=a;后,变量 a 的值是( B )。 A. 3 B. 0 C. 9 D. -12 分析:从后往前算,a*=a 即a=a*a ,a=9;然后a-=a=9,a=a-9,=0;a+=0,a=a+a=0. 10、在以下一组运算符中,优先级最低的运算符是( D )。

c语言34种运算符

C语言运算符 算术运算符 TAG:运算符,数据类型 TEXT:算术运算符对数值进行算术运算,其中:加、减、乘、除、求余运算是双目运算。其结果可以是整数、单精度实数和双精度实数。自增、自减运算是单目运算,其操作对象只能使整型变量,不能是常量或表达式等其他形式。 REF:.TXT,+运算符.txt,-运算符.txt,*运算符.txt,/运算 符.txt,%运算符,++运算符,--运算符 加+ TAG:算术运算符,运算符,数据类型 TEXT:双目运算符,算数加法。单目运算符,表示正数。REF:.TXT,算数运算符.txt 减- TAG:算术运算符,运算符,数据类型 TEXT:双目运算符,算数减法。单目运算符,表示负数。REF:.TXT,算数运算符.txt 乘* TAG:算术运算符,运算符,数据类型 TEXT:*,双目运算符,算数乘法。 REF:.TXT,算数运算符.txt

除/ TAG:算术运算符,运算符,数据类型 TEXT:/,双目运算符,算数除法;如果两个参与运算的数是整数,表示整除,舍去小数部分。 如5.0/2等于2.5,而5/2等于2。 REF:.TXT,算数运算符.txt 取余% TAG:算术运算符,运算符,数据类型 TEXT:/,双目运算符,算数除法;如果两个参与运算的数是整数,表示整除,舍去小数部分。 如5.0/2等于2.5,而5/2等于2。 REF:.TXT,算数运算符.txt 自加++ TAG:算术运算符,运算符,数据类型 TEXT:单目运算符,针对整数运算,可以放在运算数的两侧,表示运算数增1。 REF:.TXT,算数运算符.txt 自减-- TAG:算术运算符,运算符,数据类型 TEXT:单目运算符,针对整数运算,可以放在运算数的两侧,表示运算数减1。

算术表达式求值课程设计报告

课程设计 教学院 课程名称 题目 专业 班级 姓名 同组人员 指导教师 2013 年 6 月22 日 (完成时间)

目录 一.概述 (2) 二.总体方案设计 (4) 三.详细设计 (6) 四.程序的调试与运行结果说明 (14) 五.课程设计总结 (14) 六.附录 (16) 参考文献 (3233) (“目录”要求必须自动生成)

一概述(宋体,三号,加粗,居中) 1.课程设计的目的(小标题,宋体,四号,加粗,左对齐顶格) (1).理解和掌握该课程中的有关基本概念,程序设计思想和方法。 (2).培养综合运用所学知识独立完成课题的能力。 (3).培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。 (4).掌握从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。 2.课程设计的要求 算术表达式求值程序实现以下功能: (1)构造一个空栈S,初始条件:栈S已存在 (2)用P返回S的栈顶元素 (3)插入元素ch为新的栈顶元素 (4)删除S的栈顶元素 (5)判断字符是否是运算符,运算符即返回1 (6)判断运算符优先权,返回优先权高的 (7)输入表达式 (8)返回表达式的最终结果。

二总体方案设计 a)需求分析 该程序能实现算术四则运算表达式的求值,显示运算过程。 输入的形式:表达式,例如5*(3+7)#。 包含的运算符只能有'+'、 '-'、'*'、 '/'、 ' (' ') '; 程序所能达到的功能:对表达式求值并输出。 b)总体设计 本程序使用的是编程工具是Visual c++ 6.0,实现了运算器的功能和仿真界面(大体界面如下图所示)。在基本要求的基础上,运算数可以是实数类型,同时增加了乘方运算的功能;可以实现对负数的运算,例如用户输入表达式6* (-0.25),则程序会在负号的前面自动加上一个0。 1)算符包括加(+)、减(-)、乘(*)、除(/)、乘方(^);另一个称作 OPND,用以寄存操作数和运算结果,操作数可以是float型的浮点数。 算法的基本思想是: 2)首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素; 依次读入表达式中的每个字符,若是操作数(浮点数)则进OPND栈, 若是运算符(+、—、*、/、^)则和OPTR栈的栈顶运算符比较优先权 后作相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当 前读入的字符均为“#”)。 3)编写一个原型为void strtofloat(char str[ ],int n,int i),把一 个数字串转换为一个实型数,并压入运算数栈中。(整个程序的源代码 见附录,并有具体解释)

C语言运算符大全

C语言运算符大全 C语言的内部运算符很丰富,运算符是告诉编译程序执行特定算术或逻辑操作的符号。C语言有三大运算符:算术、关系与逻辑、位操作。另外,C还有一些特殊的运算符,用于完成一些特殊的任务。 2.6.1算术运算符 表2-5列出了C语言中允许的算术运算符。在C语言中,运算符“+”、“-”、“*”和“/”的用法与大多数计算机语言的相同,几乎可用于所有C语言内定义的数据类型。当“/”被用于整数或字符时,结果取整。例如,在整数除法中,10/3=3。 一元减法的实际效果等于用-1乘单个操作数,即任何数值前放置减号将改变其符号。模运算符“%”在C语言中也同它在其它语言中的用法相同。切记,模运算取整数除法的余数,所以“%”不能用于float和double类型。 最后一行打印一个0和一个1,因为1/2整除时为0,余数为1,故1%2取余数1。 2.6.2自增和自减 C语言中有两个很有用的运算符,通常在其它计算机语言中是找不到它们的—自增和自减运算符,++和--。运算符“++”是操作数加1,而“--”是操作数减1,换句话说:x=x+1;同++x;x=x-1;同--x; 自增和自减运算符可用在操作数之前,也可放在其后,例如:x=x+1;可写成++x;或x++;但在表达式中这两种用法是有区别的。自增或自减运算符在操作数之前,C语言在引用操作数之前就先执行加1或减1操作;运算符在操作数之后,C语言就先引用操作数的值,而后再进行加1或减1操作。请看下例: x=10; ;y=++x; 此时,y=11。如果程序改为: x=10;y=x++; 则y=10。在这两种情况下,x都被置为11,但区别在于设置的时刻,这种对自增和自减发生时刻的控制是非常有用的。在大多数C编译程序中,为自增和自减操作生成的程序代码比等价的赋值语句生成的代码 要快得多,所以尽可能采用加1或减1运算符是一种好的选择。 。下面是算术运算符的优先级: :最高++、- -- -(一元减) *、/、%最低+、-编译程序对同级运算符按从左到右的顺序进行计算。当然,括号可改变计算顺序。C语言 处理括号的方法与几乎所有的计算机语言相同:强迫某个运算或某组运算的优先级升高。 2.6.3关系和逻辑运算符 关系运算符中的“关系”二字指的是一个值与另一个值之间的关系,逻辑运算符中的“逻辑”二字指的是连接关系的方式。因为关系和逻辑运算符常在一起使用,所以将它们放在一起讨论。关系和逻辑运算符概念中的关键是True(真)和Flase(假)。C语言中,非0为True,0为Flase。使用关系或逻辑运算符的表达式对Flase和Ture分别返回值0或1(见表2-6)。

C语言_算术表达式求值_代码

源代码: //用来存储字符的结点类型 typedef struct CharNode { char c; struct CharNode *next; }CharNode; //用来存储数的结点类型 typedef struct IntNode { long double i; struct IntNode *next; }IntNode; //用来存储数的结点类型 typedef struct Node { long double n; struct Node_ys_char *next; }Node; //用来存储运算符的结点类型 typedef struct Node_ys_char { char c; struct Node_ys_char *next_c; struct Node *next; }Node_ys_char; char Precede(char x,char y)//运算符优先级判断{ int i,j; int from[5][5] ={ {0,0,-1,-1,0}, {0,0,-1,-1,0}, {1,1,0,0,1},

{1,1,0,0,1}, {0,0,-1,-1,0} };//定义一个二维数组存放算术符号的优先级 switch(x) { case '+':i=0;break; case '-':i=1;break; case '*':i=2;break; case '/':i=3;break; case '#':i=4;break; } switch(y) { case '+':j=0;break; case '-':j=1;break; case '*':j=2;break; case '/':j=3;break; case '#':j=4;break; } if(from[i][j]==1)//说明运算符i的优先级比j的优先级高return '>'; if(from[i][j]==-1) return '<'; else return '='; } //输入表达式,并对特殊情况做处理 CharNode *CreatRegister() { CharNode *top,*p,*q,*e; top=(CharNode *)malloc(sizeof(CharNode)); p=q=top; scanf("%c",&p->c); scanf("%c",&p->c);

算术表达式求值系统

数据结构课程设计报告 课设题目:算式表达式求值系统 班级: 软件1202 姓名: 学号: 指导教师: 李斌 成绩: 2013 年1月

目录 一、需求分析 (2) 二、概要设计 (2) (一)设计思想 (2) (二)实现方法 (2) (三)模块整体设计图 (3) (四)函数功能介绍 (3) 三、详细设计 (4) (一)数据结构设计 (4) (二)模块接口设计 (4) (三)盒图 (5) 四、调试分析 (7) 五、用户手册 (7) 六、测试结果 (8) 七、附录 (9) 附录一设计体会 (9) 附录二源程序 (9)

一、需求分析 算式表达式求值是程序设计语言编译中一个最基本的问题。本次任务要求完成一个四则算式表达式求值系统。具体需求为:当用户输入一个四则算式(包括加、减、乘、除和括号),如(12+3)*2+9*4,输出其计算结果。具体要求如下:(一)要实现栈的基本操作算法,包括初始化栈、进栈、出栈等。 (二) 在本程序中,表达式中的元素限定为char型,表达式长度不超过100,表达式以“#”号为结束标志。 (三)要求程序输出表达式的计算结果。 二、概要设计 (一)设计思想 本次四则算式表达式求值的程序采用的是中缀表达式的求值的方法。所谓中缀表达式,就是指每个二目运算符在两个运算量的中间,假设所讨论的算术运算符包括:+ 、- 、*、/、%、^(乘方)和括号()。而本次程序的编写只涉及四则运算(+、-、*、/)和括号()。 设运算规则为: .运算符的优先级为:()> *、/> +、- ; .有括号出现时先算括号内的,后算括号外的,多层括号,由内向外进行; 表达式作为一个满足表达式语法规则的串存储,如表达式“3*2^(4+2*2-1*3)-5”,它的的求值过程为:自左向右扫描表达式,当扫描到3*2时不能马上计算,因为后面可能还有更高的运算,正确的处理过程是:需要两个栈:对象栈s1和算符栈s2。当自左至右扫描表达式的每一个字符时,若当前字符是运算对象,入对象栈,是运算符时,若这个运算符比栈顶运算符高则入栈,继续向后处理,若这个运算符比栈顶运算符低则从对象栈出栈两个运算量,从算符栈出栈一个运算符进行运算,并将其运算结果入对象栈,继续处理当前字符,直到遇到结束符“#”。 根据运算规则,左括号“(”在栈外时它的级别最高,而进栈后它的级别则最低了; 乘方运算的结合性是自右向左,所以,它的栈外级别高于栈内; 就是说有的运算符栈内栈外的级别是不同的。当遇到右括号“)”时,一直需要对运算符栈出栈,并且做相应的运算,直到遇到栈顶为左括号“(”时,将其出栈,因此右括号“)”级别最低但它是不入栈的。对象栈初始化为空。根据以上分析,每个运算符栈内、栈外的级别如下: 算符栈内级别栈外级别 ^ 3 4 *、/、% 2 2 +、- 1 1 ( 0 4 ) -1 -1 (二)实现方法

《大数据结构》算术表达式求值

实用标准文档 二课程设计2——算术表达式求值 一、需求分析 二、程序的主要功能 三、程序运行平台 四、数据结构 五、算法及时间复杂度 六、测试用例 七、程序源代码 三感想体会与总结 算术表达式求值 一、需求分析 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。 二、程序的主要功能 (1)从键盘读入一个合法的算术表达式,输出正确的结果。 (2)显示输入序列和栈的变化过程。 三、程序运行平台

Visual C++ 6.0版本 四、数据结构 本程序的数据结构为栈。 (1)运算符栈部分: struct SqStack //定义栈 { char *base; //栈底指针 char *top; //栈顶指针 int stacksize; //栈的长度 }; int InitStack (SqStack &s) //建立一个空栈S { if (!(s.base = (char *)malloc(50 * sizeof(char)))) exit(0); s.top=s.base; s.stacksize=50; return OK; } char GetTop(SqStack s,char &e) //运算符取栈顶元素 { if (s.top==s.base) //栈为空的时候返回ERROR { printf("运算符栈为空!\n"); return ERROR; } else e=*(s.top-1); //栈不为空的时候用e做返回值,返回S的栈顶元素,并返回OK return OK; }

c语言实现一.二叉树操作 二.用栈实现算术表达式求值 课设报告

目录 题目一.二叉树操作(1)二.算术表达式求 (1) 一、课程设计的目的 (1) 二、课程设计的内容和要求 (1) 三、题目一设计过程 (2) 四、题目二设计过程 (6) 五、设计总结 (17) 六、参考文献 (18)

题目一.二叉树操作(1)二.算术表达式求 一、课程设计的目的 本学期我们对《数据结构》这门课程进行了学习。这门课程是一门实践性非常强的课程,为了让大家更好地理解与运用所学知识,提高动手能力,我们进行了此次课程设计实习。这次课程设计不但要求学生掌握《数据结构》中的各方面知识,还要求学生具备一定的C语言基础和编程能力。 (1)题目一的目的: 1、掌握二叉树的概念和性质 2、掌握二叉树的存储结构 3、掌握二叉树的基本操作 (2)题目二的目的: 1、掌握栈的顺序存储结构和链式存储结构 2、掌握栈的先进后出的特点 3、掌握栈的基本运算 二、课程设计的内容和要求 (1)题目一的内容和要求: 1、编写已知二叉树的先序、中序序列,恢复此二叉树的程序 2、编写求二叉树深度的程序 (2)题目二的内容和要求: 1、算术表达式由操作数、运算符和界限符组成。操作数是正整数,运算符为 加减乘除,界限符有左右括号和表达式起始 2、将一个表达式的中缀形式转化为相应的后缀形式 3、依据后缀表达式计算表达式的值

三、题目一设计过程 1、题目分析 现已知一棵二叉树的先序遍历序列和中序遍历序列,依次从先序遍历序列中取结点,由先序序列确定根结点(就是第一个字母),每次取出一个结点就与中序遍历的序列进行比较,当相等的时候,中序遍历序列就被分成以该结点为根的二叉树子树,该结点左部分为左子树,右部分为右子树,直到取完先序列里的所有结点,则二叉树构造完毕(树用链式存储结构存储),用递归实现! 由建好的二叉树,先判断这棵树是否为空,若不为空则找数的左子树,统计它的高度,然后找树的右子树,统计它的高度,比较左子树和右子树的高度,然后返回其中大的那个值加一,则求出数的高度。这里用递归实现! 2、算法描述 main ( )(主函数) 先构造一颗二叉树,初始化为空,用来存储所构造的二叉树,并输入一棵树的先序序列和中序序列,并统计这个序列的长度。然后调用实现功能的函数。 void CreateBiTree(BiTree *T,char *pre,char *in,int len)(由先序序列和中序序列构造二叉树) 根据前序遍历的特点, 知前序序列(pre)的首个元素(pre[0])为根(root), 然后在中序序列(in)中查找此根(pre[0]), 根据中序遍历特点, 知在查找到的根(root) 前边的序列为左子树, 后边的序列为右子树。设根前边有n个元素,则又有, 在前序序列中,紧跟着根(root)的n个元素序列(即pre[1...n]) 为左子树, 在后边的为右子树,而构造左子树问题其实跟构造整个二叉树问题一样,只是此时前序序列为pre[1...n]), 中序序列为in[0...n-1], 分别为原序列的子串, 构造右子树同样。这里用递归实现! int Depth(BiTree T)(求树的深度) 当所给的参数T是NULL时,返回0。说明这个树只有一个叶子节点深度为0,当所给的参数不是NULL时,函数调用自己看看这个参数的左分支是不是NULL,

算术表达式求值(c++)数据结构实验

数据结构实验报告 实验名称:实验2 栈和队列及其应用 实验目的:通过上机实验,加深理解栈和队列的特性;能根据实际问题的需要灵活运用栈和队列; 掌握栈和队列的应用。 实验内容:(2选1)内容1:算术表达式求值问题;内容2:航空客运订票系统。 实验要求:1)在C++系统中编程实现;2)至少实现两种以上操作算法;3)写出算法设计的基本原理或画出流程图;4)算法实现代码简洁明了;关键语句要有注释;5)给出调试和测试 结果;6)完成实验报告。 实验步骤: (1)算法设计 为了实现算符优先算法。可以使用两个工作栈。一个称为OPTR,用以寄存运算符,另一个称做OPND,用以寄存操作数或运算结果。 1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素; 2.依次读入表达式,若是操作符即进OPND栈,若是运算符则和OPTR栈的栈顶运算符比较优先权后 作相应的操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均 为”#”)。 (2)算法实现 typedef struct{ int stacksize; char *base; char *top; } Stack; typedef struct{ int stacksize; int *base; int *top; } Stack2; int InitStack(Stack *s) //构造运算符栈 { s->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char)); if(!s->base) return ERROR; s->top=s->base; s->stacksize=STACK_INIT_SIZE; return OK; } int InitStack2(Stack2 *s) //构造操作数栈 { s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int)); if(!s->base) return ERROR; s->stacksize=STACK_INIT_SIZE; s->top=s->base; return OK; } int In(char ch) //判断字符是否是运算符,运算符即返回1 { return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#'); } int Push(Stack *s,char ch) //运算符栈插入ch为新的栈顶元素{ *s->top=ch; s->top++; return 0; } int Push2(Stack2 *s,int ch)//操作数栈插入ch为新的栈顶元素 { *s->top=ch; s->top++; return 0; } char Pop(Stack *s) //删除运算符栈s的栈顶元素,用p返回其值{ char p;s->top--; p=*s->top; return p;} int Pop2(Stack2 *s) //删除操作数栈s的栈顶元素,用p返回其值{ int p;s->top--; p=*s->top; return p;} char GetTop(Stack s) //用p返回运算符栈s的栈顶元素

数据结构课程设计算术表达式求值计算器.doc

高级语言程序设计 《算术表达式求值》 课程设计报告

算术表达式求值 系统可以实现实现对算术四则混合运算表达式求值,并打印求值过程中运算符栈、操作数栈的变化过程。 第二章系统分析 开始运行时界面如下: 你可以输入一个表达式,按E对其进行求值。

第四章系统实现 #include #include #include #include #define N 100 double numStack[N]={0};//操作数栈 int numTop; char opStack[N];//运算符栈 int opTop; void print_num(double str1[],int n) { int i; printf("\n操作数栈:\n"); for(i=0;i

if(ch=='+'||ch=='-') return 2; if(ch=='*'||ch=='/') return 3; if(ch=='(') return -1; return 0; } double result(double num1,char op,double num2)//计算 { if(op=='+') return num1+num2; if(op=='-') return num1-num2; if(op=='*') return num1*num2; if(op=='/') return num1/num2; return 0; } int compute(char str[]) { double num=0; int i=0,j=1,k=1; numTop=opTop=0; while(str[i]!='\0'||opTop>0) { if(str[i]>='0'&&str[i]<='9') num=num*10+str[i]-'0'; else if( k==1&&str[i]=='-'&&(i==0||op(str[i-1])) ) k=-1; else { if(i>0&&!op(str[i-1])&&str[i]!='('&&str[i-1]!=')')

算术表达式求值-数据结构实验报告

清华大学数据结构课程实验报告(20 -20 学年第学期) 报告题目:算术表达式求值 任课老师: 专业: 学号: 姓名: 二0一年月日

摘要:现代科学技术高速发展,各种高科技产品频频问世,而各种技术的基础都离不开基本的表达式求值,它虽然简单,但却是任何复杂系统的基本执行操作。栈是一种重要的线性结构,从数据结构的角度看,它是一种特殊的线性表,具有先入先出的特点。而算符优先法的设计恰巧符合先入先出的思想。故我们基于栈这种数据结构,利用算符优先法,来实现简单算术表达式的求值。 关键字:算符优先法;算术表达式;数据结构;栈 一、课题概述 1、问题描述 一个算术表达式是由运算数、运算符、界限符组成。假设操作数是正整数,运算符只含有加“+”、减“-”、乘“*”、除“/”四种二元运算符,界限符有左括号“(”、右括号“)”和表达式起始、结束符“#”。利用算符优先法对算术表达式求值。 2、设计目的 (1)通过该算法的设计思想,熟悉栈的特点和应用方法; (2)通过对算符优先法对算术表达式求值的算法执行过程的演示,理解在执行相应栈的操作时的变化过程。 (3)通过程序设计,进一步熟悉栈的基本运算函数; (4)通过自己动手实现算法,加强从伪码算法到C语言程序的实现能力。3、基本要求: (1)使用栈的顺序存储表示方式; (2)使用算符优先法; (3)用C语言实现; (4)从键盘输入一个符合要求的算术表达式,输出正确的结果。 4、编程实现平台 Microsoft Visual C++ 6.0 二、设计思路及采取方案 1、设计思路: 为了实现算符优先法,可以使用两个工作栈。一个称做OPTR,用以寄存运

数据结构算术表达式求值实验报告

软件技术基础实验报告 实验名称:表达式计算器 系别:通信工程 年级: 班级: 学生学号: 学生姓名: 1

《数据结构》课程设计报告 题目简易计算表达式的演示 【题目要求】 要求:实现基本表达式计算的功能 输入:数学表达式,表达式由整数和“+”、“-”、“×”、“/”、“(”、“)”组成 输出:表达式的值 基本操作:键入表达式,开始计算,计算过程和结果记录在文档中 难点:括号的处理、乘除的优先级高于加减 1.前言 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为简化,规定操作数只能为正整数,操作符为+、-*、/、=,用#表示结束。 算法输出:表达式运算结果。 算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。在读入表达式的字符序列 2

3 的同时,完成运算符和运算数的识别处理,以及相应运算。 2.概要设计 2.1 数据结构设计 任何一个表达式都是由操作符,运算符和界限符组成的。我们分别用顺序栈来寄存表达式的操作数和运算符。栈是限定于紧仅在表尾进行插入或删除操作的线性表。顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top 指示栈顶元素在顺序栈中的位置,base 为栈底指针,在顺序栈中,它始终指向栈底,即top=base 可作为栈空的标记,每当插入新的栈顶元素时,指针top 增1,删除栈顶元素时,指针top 减1。 2.2 算法设计 为了实现算符优先算法。可以使用两个工作栈。一个称为OPTR ,用以寄存运算符,另一个称做OPND ,用以寄存操作数或运算结果。 1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素; 2.依次读入表达式,若是操作符即进OPND 栈,若是运算符则和OPTR 栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR 栈的栈顶元素和当前读入的字符均为”#”)。 2.3 ADT 描述 ADT Stack{ 数据对象:D={i a |i a ∈ElemSet,i=1,2,…,n, n ≧0} 数据对象:R1={<1,-i i a a >|1-i a ,D a i ∈,i=2,…,n} 约定n a 端为栈顶,i a 端为栈底。 基本操作: InitStack(&S) 操作结果:构造一个空栈S 。 GetTop(S) 初始条件:栈S 已存在。

算术表达式求值

题目:算术表达式求值问题 内容: 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。要求:(1)从键盘读入一个合法的算术表达式,输出正确的结果。(2)显示输入序列和栈的变化过程。选作内容:操作数类型扩充到实数。 一:问题分析和任务定义 1.问题分析: 分析题目并参考书目可以基本了解完成一个算术表达式所存在的问题。对一个表达式来说,由于各种运算符和界限符的运用,运算符和界限符的优先级决定了算术表达式不是简单的从左往右的运算。因此设计算法完成算术表达式时就要考虑各运算符和界限符的优先级,同时还要注意操作数与算符的判断。在算法中要求完成操作数、运算符和界限符的出入栈,运算符和界限符的优先级比较和操作数之间的运算。最后完成的算法要求输入一个算术表达式,能够正确的计算出来它的最后结果并输出。为了不用考虑算符优先级,将输入的中缀表达式转换成后缀表达式。 这样就可以知道实现本程序需要进行的操作: 1)建立空栈,存储信息; 2)运用函数实现出入栈和取栈顶元素操作。 3)将中缀表达式转换成后缀表达式。 4)实现后缀表达式的求解。 5)建立一个函数使中缀表达式能够被有效输入。 本程序的关键是中缀表达式转换成后缀表达式 对于栈的操作(1)建空栈setStack() 运算的结果是将栈顶元素返回。(2)清空栈EmptyStack(),可以用于判断栈内元素的有无,在栈顶元素的输出被使用。(3)入栈push(),出栈pop()和取栈顶元素top()。 2.任务定义 1).本演示程序中,利用栈将输入的中缀表达式转换成后缀表达式,并完成其求解过程来 达到计算表达式的目的。 2).演示程序以用户和计算机的对话方式执行,即在计算机终端上显示"提示信息"之后, 由用户在键盘上输入演示程序中需要输入的数据,以“回车符”为结束标志。相应的输入数据和运算结果显示在其后。 3).程序执行的命令包括: 1)输入任意一个整数表达式;2)是否继续。 4).测试数据 输入一个整数表达式:3+(5*8-9) 输出: 后缀表达式:3 5 8 *9 -+ 结果为:34 继续?(y/n) 二、数据结构的选择和概要设计 算术表达式中各数据元素间存在一种线性关系,设计的数据类型如下:

C语言全部的运算符

整理自网络 C语言运算符 C语言的内部运算符很丰富,运算符是告诉编译程序执行特定算术或逻辑操作的符号。C语言有三大运算符:算术、关系与逻辑、位操作。另外,C还有一些特殊的运算符,用于完成一些特殊的任务。 2.6.1算术运算符 表2-5列出了C语言中允许的算术运算符。在C语言中,运算符“+”、“-”、“*”和“/”的用法与大多数计算机语言的相同,几乎可用于所有C语言内定义的数据类型。当“/”被用于整数或字符时,结果取整。例如,在整数除法中,10/3=3。 一元减法的实际效果等于用-1乘单个操作数,即任何数值前放置减号将改变其符号。模运算符“%”在C语言中也同它在其它语言中的用法相同。切记,模运算取整数除法的余数,所以“%”不能用于float和double类型。

最后一行打印一个0和一个1,因为1/2整除时为0,余数为1,故1%2取余数1。 2.6.2自增和自减 C语言中有两个很有用的运算符,通常在其它计算机语言中是找不到它们的—自增和自减运算符,++和--。运算符“++”是操作数加1,而“--”是操作数减1,换句话说:x=x+1;同++x;x=x-1;同--x; 自增和自减运算符可用在操作数之前,也可放在其后,例如:x=x+1;可写成++x;或x++;但在表达式中这两种用法是有区别的。自增或自减运算符在操作数之前,C语言在引用操作数之前就先执行加1或减1操作;运算符在操作数之后,C语言就先引用操作数的值,而后再进行加1或减1操作。请看下例: x=10; ;y=++x; 此时,y=11。如果程序改为: x=10;y=x++; 则y=10。在这两种情况下,x都被置为11,但区别在于设置的时刻,这种对自增和自减发生时刻的控制是非常有用的。在大多数C编译程序中,为自增和自减操作生成的程序代码比等价的赋值语句生成的代码 要快得多,所以尽可能采用加1或减1运算符是一种好的选择。 。下面是算术运算符的优先级: :最高++、- -- -(一元减) *、/、%最低+、-编译程序对同级运算符按从左到右的顺序进行计算。当然,括号可改变计

相关文档
相关文档 最新文档