第3章 最简单的C程序设计顺序结构程序设计.ppt
《第3章 最简单的C程序设计顺序结构程序设计.ppt》由会员分享,可在线阅读,更多相关《第3章 最简单的C程序设计顺序结构程序设计.ppt(88页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、第3章 最简单的C程序设计顺序结构程序设计3.1 程序的三种结构1966年,Bohra和Jacopini提出了以下三种基本结构:顺序结构、选择结构、循环结构,用这三种基本结构作为表示一个良好算法的基本单元。(1)顺序结构:如右图,虚线框内是一个顺序结构。其中A和B两个框是顺序执行的。即在执行完A框所指定的操作后,必然接着执行B框所指定的操作。顺序结构是最简单的一种基本结构。(2)选择结构:或称分支结构,如下图所示,虚线框内是一个选择结构。此结构中必包含一个判断框。根据给定的条件p是否成立而选择执行A框或B框。(a)请注意:无论p条件是否成立,只能执行A框或B框之一,不可能既执行A框又执行B框。
2、无论走哪一条路径,在执行完A或B之后,都经过b点,然后脱离本选择结构。A或B两个框中可以有一个是空的,即不执行任何操作,如下图。(b)(3)循环结构:即反复执行某一部分的操作。有两类循环结构。当型(While型)循环结构 直到型(Until型)循环 当型(While型)循环结构如(a)图,它的功能是当给定的条件p1成立时,执行A框操作,执行完A后,再判断条件p1是否成立,如果仍然成立,再执行A框,如此反复执行A框,直到某一次p1条件不成立为止,此时不执行A框,而从b点脱离循环结构。直到型(Until型)循环结构如(b)图,它的功能是先执行A框,然后判断给定的p2条件是否成立,如果p2条件不成立
3、,则再执行A,然后再对p2条件作判断,如果p2条件仍然不成立,又执行A.如此反复执行A,直到给定的p2条件成立为止,此时不再执行A,从b点脱离本循环结构。三种基本结构的共同特点:三种基本结构的共同特点:(1)只有一个入口。(2)只有一个出口。(请注意:一个菱形判断框有两个出口,而一个选择结构只有一个出口。不要将菱形框的出口和选择结构的出口混淆。)(3)结构内的每一部分都有机会被执行到。(4)结构内不存在“死循环”(无终止的循环)。小小 结结由三种基本结构顺序组成的算法结构,可以解决任何复杂的问题。由基本结构所构成的算法属于“结构化”的算法,它不存在无规律的转向,只在本基本结构内才允许存在分支和
4、向前或向后的跳转。不正确的流程表示:流程内的死循环图中没有一条从入口到出口的路径通过A框扩展扩展 只要具有上述四个特点的都可以作为基本结构。可以自己定义基本结构,并由这些基本结构组成结构化程序。此图符合基本结构的特点 这是一个多分支选择结构,根据表达式的值决定执行路线。虚线框内的结构是一个入口一个出口,并且有上述全部的四个特点。由此构成的算法结构也是结构化的算法。可以认为这是由三种基本结构所派生出来的。3.2 C语句概述C程序程序源程序文件源程序文件1源程序文件源程序文件2源程序文件源程序文件n预处理命令预处理命令函数函数n函数函数1数据声明数据声明函数首部函数首部函数体函数体数据声明数据声明
5、执行语句执行语句C语句:程序的执行部分是由C语句组成的,程序的功能也是由执行语句实现的。C语句以“;”作分隔符,编译后产生机器指令。一个c程序可以由若干个源程序文件组成;一个源文件可以由若干个函数和预处理命令以及全局变量(第七章)声明部分组成;一个函数由函数首部和函数体组成;函数体由数据声明和执行语句组成。C语句分类:1、控制语句:用于完成一定的控制功能,以实现程序的各种结构方式,它们由特定的语句定义符组成。语言有9种控制语句,可分成以下三类:(1)条件判断语句:条件选择语句:if else ;(或?:)多分支条件选择语句(开关语句)switch()case.;(2)循环执行语句:条件循环语句
6、:for ;条件循环(当型)语句:while ;条件循环(直到型)语句:do while ;(3)转向语句:结束本次循环语句:continue终止循环或switch语句:break无条件转向语句:goto从函数返回语句:return 2、函数调用语句:用于完成一次函数调用。组成:由一次函数调用加“;”构成。其一般形式为:函数名(实际参数表);执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求取函数值。(在第7章函数中再详细介绍)例如:printf(“This is a C statement!”);/*调用库函数,输出字符串*/3、表达式语句:用于完
7、成一次表达式操作。组成:由一个表达式加“;”构成。其一般形式为:表达式;执行表达式语句就是计算表达式的值。例如:x=y+z;/*赋值语句*/y+z;/*加法运算语句,但计算结果不能保留,无实际意义*/i+;/*自增1语句,i值增1*/4、空语句:组成:只由一个“;”构成,在程序中空语句可用来作流程的转向点或循环语句中的空循环体。程序执行时空语句不产生任何动作。程序设计中有时需要加一个空语句来表示存在一条语句,但随意加分号也会导致逻辑上的错误,需要慎用。例如:while(getchar()!=n);/*本语句的功能是,只要从键盘输入的字符不是回车则重新输入。这里的循环体为空语句,什么也不做。*/
8、5、复合语句:用 括起来的一组语句,完成一些特定的操作功能,语法上和单一语句相同,在程序中应把复合语句看成是单条语句,而不是多条语句。一般形式:数据说明部分;执行语句部分;例如:x=y+z;a=b+c;printf(“%d%d”,x,a);是一条复合语句。复合语句内的各条语句都必须以分号“;”结尾,在括号“”外不能加分号。复合语句可嵌套:例如:void main()z=x+y;t=z/100;printf(%f,t);3.3 赋值表达式和赋值语句3.3.1 赋值表达式1、赋值运算符1)含义:将赋值号“=”右边的运算对象之值赋给左边的运算对象。格式:变量标识符=表达式 如:x=1;x=x+1;2
9、)使用要点:当“=”两边数据类型不同时,将进行数据类型的自动转换,转换规则:使赋值号右边表达式值自动转换成左边变量的类型。例如:int x;float y=3.5;x=y;/*则运行结果为int型3*/例如:int i;i=2.56;/*结果i=2;*/2、复合赋值运算符(自反运算符)1)含义:在赋值运算符“=”之前加上其它运算符构成的运算符。2)一般形式:表达式1 运算符=表达式2 等价于:表达式1=表达式1 运算符 表达式2 如:a+=3 等价于 a=a+3 x*=3 等价于 x=x*3 x%=3 等价于 x=x%3 x/=y+3 等价于 x=x/(y+3)3)使用要点:凡是二目(二元)运
10、算符,都可以与“=”组合成复合赋值符。C语言规定的10种复合赋值运算符如下:+=、-=、*=、/=、%=/*复合算术运算符(5个)*/=、&=、|=、=/*复合位运算符(5个)*/使用复合赋值符的目的:简化程序;提高编译效率。左侧必须是变量,不能是常量或表达式。例如:3=x-2*y;a+b=3;赋值表达式的值与变量值相等,且可嵌套。例例:a=b=c=5 a=(b=5)a=5+(c=6)a=(b=4)+(c=6)a=(b=10)/(c=2)/*表达式值为5,a,b,c值为5*/*b=5;a=5*/*表达式值11,c=6,a=11*/*表达式值10,a=10,b=4,c=6*/*表达式值5,a=5
11、,b=10,c=2*/例例:int a=2;a%=4-1;a+=a*=a-=a*=3;例例:a=12;a+=a-=a*a/*a=0 等价于a=a+(a=a*(a=a-(a=a*3)*/*a=-264 等价于a=a+(a=a-(a*a)*/赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型例例 float f;int i;i=10;f=i;则则 f=10.0例例 int i;i=2.56;/*结果结果i=2*/3、赋值表达式1)含义:由一个赋值运算符将一个变量和表达式连接起来的式子。2)一般形式:变量=表达式3)求解过程:赋值运算符按照“右结合”顺序运算,将“=”右边表达式的值赋值给左
12、边的变量。求赋值运算符右侧的“表达式”的值;赋给赋值运算符左侧的变量。例如:赋值表达式“=3*5”的值为15,执行表达式后,变量a的值也是15。注意:一个表达式应该有一个值 左值(lvalue):赋值运算符左侧的标识符变量可以作为左值;而表达式就不能作为左值(如a+b);常量也不能作为左值。右值(rvalue):出现在赋值运算符右侧的表达式 左值也可以出现在赋值运算符右侧,因而左值 都可以作为右值。4、使用举例1)赋值表达式中的“表达式”,又可以是一个赋值表达式。例如:a=(b=5)分析:括弧内的“b=5”是一个赋值表达式,它的值等于5。执行表达式“a=(b=5)”相当于执行“b=5”和“ab
13、”两个赋值表达式。赋值运算符按照“自右而左”的结合顺序,因此,“(b5)”外面的括弧可以不要,即“a=(b=5)”和“a=b=5”等价。a=b=c=3/*表达式值为3,a,b,c值均为3*/a=5+(c=2)/*表达式值为7,a值为7,c为2*/a=(b=4)+(c=6)/*表达式值为10,a=10,b=4,c=6*/a=(b=10)/(c=2)/*表达式值为5,a=5,b=10,c=2*/请分析下面的赋值表达式(a=3*5)=4*3分析:先执行括弧内的运算,将15赋给a,然后执行4*3的运算,得12,再把12赋给a。最后a的值为12,整个表达式的值为12。可以看到:(a=3*5)出现在赋值运
14、算符的左侧,因此赋值表达式(a=3*5)是左值。注意:在对赋值表达式(a=3*5)求解后,变量a得到值15执行(a=3*5)=4*3时,实际上是将4*3的积12赋给变量a,而不是赋给3*5。不能写成:a=3*5=4*32)赋值表达式也可以包含复合的赋值运算符。例如:若a=12,求a+=a-=a*a 分析:此赋值表达式的求解步骤如下 先进行“a-=a*a”的运算,它相当于=-*,a的值为12-144=-132。再进行“a+=-132”的运算,相当于a=a+(-132),a的值为-132-132=-264。3)将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式形式出
15、现在其他语句(如输出语句、循环语句等)中。例如:printf(%d,a=b);分析:如果b的值为3,则输出a的值(也是表达式a=b的值)为3。在一个语句中完成了赋值和输出双重功能。3.3.2 赋值过程中的类型转换如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。1、将浮点型数据(包括单、双精度)赋给整型变量时,舍弃浮点数的小数部分,取整数部分赋给整型变量。即:int=float的结果为int型。如:i为整型变量,执行“i=3.56”的结果是使的值为,以整数形式存储在整型变量中。如:float a;int s;a=12.34;s=a;这时s的值为12。2、将整型数据
16、赋给单、双精度浮点型变量时,数值不变,但以浮点数形式存储到变量中。如:将23赋给float变量f,即执行f=23,先将23转换成23.00000,再存储在f中。即:float=int的结果为float型。将23赋给double型变量d,即执行d=23,则将23补足有效位数字为23.00000000000000,然后以双精度浮点数形式存储到变量d中。即:double=int的结果为double型。3、将一个double型数据赋给float变量时,截取其前面7位有效数字,存放到float变量的存储单元(4个字节)中。但应注意数值范围不能溢出。如:float f;double d=123.45678
17、9e100;f=d;就出现溢出的错误。如果将一个float型数据赋给double变量时,数值不变,有效位数扩展到16位,在内存中以8个字节存储。4、字符型数据赋给整型变量时,由于字符只占1个字节,而整型变量为2个字节,因此将字符数据(8个二进位)放到整型变量存储单元的低8位中:。即:int=char 第一种情况:如果所用系统将字符处理为无符号的字符类型,或程序已将字符变量定义为unsigned char型,则将字符的8位放到整型变量低8位,高8位补零。例如:将字符376赋给int型变量iunsigned char c;int i;c=376;i=c;则i的值为254。1 1 1 1 1 1 1
18、 01 1 1 1 1 1 1 01 1 1 1 1 1 1 01 1 1 1 1 1 1 00 0 0 0 0 0 0 00 0 0 0 0 0 0 0 第二种情况:如果所用系统(如Turbo C)将字符处理为带符号的(即signed char),若字符最高位为0,则整型变量高8位补0;若字符最高位为1,则高8位补1。这称为“符号位扩展”,这样做的目的是使数值保持不变。例如:变量(字符376)以整数形式输出为-2,i的值也是-2。char c;int i;c=376;i=c;则i的值为-2。1 1 1 1 1 1 1 11 1 1 1 1 1 1 11 1 1 1 1 1 1 01 1 1
19、1 1 1 1 01 1 1 1 1 1 1 01 1 1 1 1 1 1 0376代表ASACII为254的那个字符,转换成二进制就为11111110;因为首位为1,所以它为负数。即为:-(1111110)2(补码)转换成原码为:-(0000001+1)2=-(10)2=-2;所以char c=254和char c=-2是一样的5、将一个int、short、long型数据赋给一个char型变量时,只将其低8位原封不动地送到char型变量(即截断)。例如:int i=289;char c=a;c=i;赋值情况:c的值为33,如果用“%c”输出c,将得到字符“!”(其ASCII码为33)。0 0
20、 0 0 0 0 0 10 0 0 0 0 0 0 10 0 1 0 0 0 0 10 0 1 0 0 0 0 10 0 1 0 0 0 0 10 0 1 0 0 0 0 1c=33c=33i=2896、将带符号的整型数据(int型)赋给long型变量时,要进行符号扩展,将整型数的16位送到long型低16位中:如果int型数据为正值(符号位为0),则long型变量的高16位补0;如果int型变量为负值(符号位为1),则long型变量的高16位补1,以保持数值不改变。反之,若将一个long型数据赋给一个int型变量,只将long型数据中低16位原封不动地送到整型变量(即截断)。7、将signe
21、d型数据赋给长度相同的unsigned型变量,按原样照赋(连原有的符号位也作为数值一起传送)。例3.1 有符号数据传送给无符号变量。#include void main()unsigned a;int b=-1;a=b;printf(%un,);赋值情况见图P.47 图3-7说明:“%u”是输出无符号数时所用的格式符。如果b为正值,且在032767之间,则赋值后数值不变。运行结果:运行结果:65535655358、将unsigned int型数据赋给long int型变量时,不存在符号扩展问题,只需将高位补即可。将一个unsigned类型数据赋给一个占字节数相同的signed型整型变量(例如:
22、unsigned int int,unsigned longlong,unsigned shortshort),将unsigned型变量的内容原样送到signed型变量中,但如果数据范围超过相应整型的范围,则会出现数据错误。例3.2 unsigned int a=65535;int b;b=a;此时b的值为-1。(补码)将a整个送到b中,由于b是int,第位是符号位,因此b成了负数。根据补码知识可知,b的值为-1,可以用printf(%d,b);来验证。111111111111111111111111111111113.3.3 赋值语句 赋值语句是由赋值表达式再加上分号构成的表达式语句。其一般
23、形式为:变量=表达式;赋值语句的功能和特点都与赋值表达式相同。它是程序中使用最多的语句之一。在赋值语句的使用中需要注意以下几点:1、由于在赋值符“=”右边的表达式也可以又是一个赋值表达式,因此,下述形式 变量=(变量=表达式);是成立的,从而形成嵌套的情形。其扩展之后的一般形式为:变量=变量=表达式;例如:a=b=c=d=e=5;按照赋值运算符的右结合性,因此实际上等效于:e=5;d=e;c=d;b=c;a=b;2、注意在变量说明中给变量赋初值和赋值语句的区别:给变量赋初值是变量说明的一部分,赋初值后的变量与其后的其它同类变量之间仍必须用逗号间隔,而赋值语句则必须用分号结尾。3、在变量说明中,
24、不允许连续给多个变量赋初值。如说明int a=b=c=5是错误的,必须写为int a=5,b=5,c=5;而赋值语句允许连续赋值。4、注意赋值表达式和赋值语句的区别:赋值表达式是一种表达式,它可以出现在任何允许表达式出现的地方,而赋值语句则不能。如:语句if(x=y+5)0)z=x;是合法的,语句的功能是,若表达式x=y+5大于0则z=x。如:语句if(x=y+5;)0)z=x;是非法的,因为x=y+5;是语句,不能出现在表达式中。5、条件中不能含有赋值符号,但是赋值表达式可以包含于条件表达式中例:if(a=b)t=a;错误 if(a=b)0)t=a;正确 问题:c语言中的赋值语句于其他高级语
25、言的赋值语句有什么不同点?1)C语言中的赋值号“=”是一个运算符,在其他大多数语言中赋值号不是运算。2)其他大多数高级语言没有“赋值表达式”这一概念。3.3.4 变量赋初值 1、语言允许在定义变量的同时使变量初始化。如:int a=3;/*指定为整型变量,初值为*/float f=3.56;/*指定为浮点型变量,初值为.56*/char c=a;/*指定为字符变量,初值为a*/2、可以使被定义的变量的一部分赋初值。如:int a,b,c=5;表示指定、为整型变量,但只对初始化,c的初值为3、如果对几个变量赋以同一个初值,如:表示、的初值都是,应写成:int a=3,b=3,c=3;不能写成:i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第3章 最简单的C程序设计顺序结构程序设计 简单 程序设计 顺序 结构
限制150内