




已阅读5页,还剩509页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C程序设计,2010.2,目录,第1章C语言概述,第2章程序的灵魂算法,第3章数据类型、运算符与表达式,第5章选择结构程序设计,第4章最简单的C程序设计顺序程序设计,第6章循环控制,第7章数组,第8章函数,第9章指针,第10章预处理命令,第11章结构体与共同体,第12章位运算,第13章文件,教材、参考书与课时安排,教材C程序设计谭浩强著清华大学出版社参考书C程序设计解答与上机指导谭浩强编著清华大学出版社C语言程序设计教程谭浩强高等教育出版社C高级实用程序设计王士元清华大学出版社课时安排授课:34学时上机:34学时,学习要求及成绩构成,学习要求课前请做好预习,课后请做好复习保持课堂安静,头脑清醒,思维活跃认真、独立、按时完成并提交作业重视上机实践,有效利用宝贵的上机时间成绩构成平时考勤:10%平时作业:10%平时上机:10%期末考试:上机考10%+笔考60%,第1章C语言概述,1.1程序设计语言的发展及其特点,CPU指令系统,由0、1序列构成的指令码组成如:10000000加10010000减,用助记符号描述的指令系统如ADDA,B,程序设计是数据被加工的过程,客观世界可以分类,对象是类的实例对象是数据和方法的封装对象间通过发送和接受消息发生联系,程序设计关键是定义类,并由类派生对象,Ada,ALGOL60,ALGOL68,Pascal,Modula-2,CPL,BCPL,B,C,C+,Java,LISP,PROLOG,COBOL,FORTRAN77,FORTRAN,PL/1,Simula67,Smalltalk80,BASIC,ANSI-BASIC,QBASIC,VB,FORTRAN90,1.2C语言的发展及其特点、应用,C语言发展史,ALGOL60语言,CPL语言,CombinedProgrammingLanguage,1963年,剑桥大学,BCPL语言,1967年,剑桥大学的MatinRichards对CPL语言进行了简化,B语言,C语言,1970年,美国贝尔实验室的KenThompson将BCPL进行了修改,将CPL语言煮干,提炼出它的精华,1973年,B语言也给人“煮”了一下,美国贝尔实验室的D.M.RITCHIE在B语言的基础上最终设计出了一种新的语言,BCPL的第二个字母作为这种语言的名字,这就是C语言,C语言发展史,产生背景产生过程时间:19721973地点:美国贝尔实验室目的:UNIX操作系统设计人:Ken.Thompson和Dennis.M.RitchieC标准标准C:K,运行结果:TheisaCprogram!,在C程序中,注释由“/*”开始,由“*/”结束,可以实现多行注释。在C+程序中也可使用“/”进行单行注释。例如:/注释信息,C语言的预处理命令都是以“#”号开头。stdio.h是一个头文件,C程序中允许插入若干行空行,它不影响程序的功能,同注释一样。为了程序的易读性,在编写C程序时,根据需要可插入一定的空行,main是主函数名,一个C语言程序有且仅有一个main函数。C程序执行时就是从main函数开始,具体讲就是从“”开始,到“”结束。,printf是C语言的内部函数名,因为它后面跟着(),其功能是将“TheisaCprogram!n”显示在计算机的屏幕上(双引号和n不显示),C语言规定:语句以分号结束,1.3C语言程序的基本结构,【例2】计算输入的两个整数的和。,/*ThisisthesecondCprogram*/#includevoidmain()intx,y,z;scanf(%d%d,假设输入:1020运行结果:thesumoftwointegeris30,1.3C语言程序的基本结构,C语言程序的函数由两部分构成:一部分定义变量(变量代表数据),称为声明部分;另一部分代表操作,由C语句构成,称为执行部分。在C程序中,要求函数的声明部分在前面,执行在后面,它们的顺序不能颠倒,也不能交叉。但在C+程序中,声明部分和执行部分可以相互交叉,没有严格的界限,当然执行部分中所使用的变量只要在其之前进行定义即可。,/C语言程序voidmain()inta;a=10;intb;b=a+20;,/C+语言程序voidmain()inta;a=10;intb;b=a+20;,/C或C+语言程序voidmain()inta;a=10;b=a+20;intb;,再次强调:在C语言程序中,变量必须先定义,后使用,顺序不能颠倒!,1.3C语言程序的基本结构,【例3】计算输入的两个整数的最大值。,/*ThisisthethirdCprogram*/#includeintmax(inta,intb);voidmain()intx,y,z;scanf(%d%d,intmax(inta,intb)intc;if(ab)c=a;elsec=b;return(c);,自定义函数max,假设输入:1020运行结果:max=20,1.3C语言程序的基本结构,C语言的标识符,C语言中变量和函数都有自己的名字,它们都必须是合法的标识符。标识符就是一个名字,C语言规定标识符只能由字母、数字和下划线三种字符构成,并且第一个字符必须是字母或下划线。C语言是大小写敏感的语言,因此hello和Hello是不同的标识符。C语言中有一些特别的标识符,它们的用途已经事先规定好了,程序员不能再将它们另做它用。这些特别的标识符被称为关键字(也称保留字)。到目前为止,我们见过的关键字有void、int、main、if、else、return。以后随着学习的深入,我们将会遇到越来越多的关键字(C语言关键字可参考附录B)。,1.3C语言程序的基本结构,总结,C程序是由多个函数构成的。每个C程序中有且只有一个main函数。main函数是程序的入口和出口。不使用行号,无程序行的概念。程序中可使用空行和空格。C程序格式常用锯齿形书写格式。C程序中可加任意多的注释。引用C语言标准库函数,一般要用文件包含预处理命令将其头文件包含进来。用户自定义的函数,必须先定义后使用。变量必须先定义后使用。变量名、函数名必须是合法的标识符,标识符习惯用小写字母,大小写敏感。不能用关键字来命名变量和函数。函数包含两个部分:声明部分和执行部分,在C程序中,声明部分在前,执行部分在后,这两部分的顺序不能颠倒,也不能有交叉。C语言的语句都是以分号结尾。,1.4编制C语言程序的基本步骤,编辑,程序代码的录入,生成源程序*.c或*.cpp,编译,语法分析查错,翻译生成目标程序*.obj,链接,与其它目标程序或库链接装配,生成可执行程序*.exe,运行,编写C程序的步骤,习题:P12P133、4、5,第2章程序的灵魂算法,程序=数据结构+算法。算法:简而言之,就是解决问题的方法与步骤。算法是程序设计的灵魂,是问题求解过程中的精确描述,一个算法由有限条可以完全机械地执行的、有确定结果的指令组成。程序设计语言:是程序开发工具,即是将算法转化为程序的开发工具。程序:算法的具体实现。,学习C语言,不仅要熟练掌握其语言本身的特点、语法规则等以外,更重要的就是掌握分析问题、解决问题的方法,就是锻炼分析、分解,最终归纳整理出算法的能力。,2.1算法的概念,算法应具有下面五个特性:1)有穷性:算法中的每个步骤由计算机执行的次数及时间是有限的。2)确定性:算法中的每个步骤含义明确,无二义性。3)可行性:算法中描述的操作都可通过有限次的基本运算来实现。4)输入:一个算法应具有零个或多个输入。5)输出:一个算法应具有一个或多个输出。,2.2算法的特性,2.3算法举例,【例1】输入三个数,然后输出其中最大的数。总体思路:首先,得先有个地方装这三个数,我们定义三个变量A、B、C,将三个数依次输入到、B、C中,另外,再准备一个MAX装最大数。由于计算机一次只能比较两个数,我们首先把A与B比,大的数放入MAX中,再把MAX与C比,又把大的数放入MAX中。最后,把MAX输出,此时MAX中装的就是、C三数中最大的一个数。具体步骤:(1)输入A、B、C。(2)A与B中大的一个放入MAX中。(3)把C与MAX中大的一个放入MAX中。(4)输出MAX,MAX即为最大数。其中的(2)、(3)两步仍不明确,无法直接转化为程序语句,可以继续细化:(2)把A与B中大的一个放入MAX中,若AB,则MAXA;否则MAXB。(3)把C与MAX中大的一个放入MAX中,若CMAX,则MAXC。,算法最后可以写成:(1)输入A,B,C。(2)若AB,则MAXA;否则MAXB。(3)若CMAX,则MAXC。(4)输出MAX,MAX即为最大数,【例2】猴子吃桃问题:有一堆桃子不知数目,猴子第一天吃掉一半,觉得不过瘾,又多吃了一只,第二天照此办理,吃掉剩下桃子的一半另加一个,天天如此,到第十天早上,猴子发现只剩一只桃子了,问这堆桃子原来有多少个?总体思路:假设第一天开始时有a1只桃子,第二天有a2只,第9天有a9只,第10天是a10只,在a1,a2,,a10中,只有a10=1是知道的,现要求a1,而我们可以看出,a1,a2,,a10之间存在一个简单的关系:a9=2*(a10+1)a8=2*(a9+1)a1=2*(a2+1)也就是:ai=2*(ai+1+1)i=9,8,7,6,1这就是此题的数学模型。再考察上面从a9,a8直至a1的计算过程,这其实是一个递推过程,这种递推的方法在计算机解题中经常用到。另一方面,这九步运算从形式上完全一样,不同的只是ai的下标而已。由此,我们引入循环的处理方法,并统一用a0表示前一天的桃子数,a1表示后一天的桃子数。,算法最后可以写成:(1)a1=1第10天的桃子数,a1的初值i=9计数器初值为9(2)a0=2*(a1+1)计算当天的桃子数(3)a1=a0将当天的桃子数作为下一次计算的初值(4)i=i-1(5)若i=1,转(2)(6)输出a0的值其中(2)(5)步为循环,算法的描述方法常用的有自然语言、流程图、N-S图、伪代码等。1)自然语言例:编程求1+2+3+100。算法为:S1:设置一个累和变量sum和一个计数变量n;并设它们的初值都为0;S2:判断nsum,n+1=n;S4:转S2;S5:输出sum.。,2.4算法的表示方法,2)流程图,3)N-S图1973年,美国学者I.Nassi和B.Shneiderman提出了一种新的流程图形,并以他们的名字命名为结构化流程图。在这种流程图中,完全去掉了带箭头的流程线。全部算法写在一个矩形框内,在该框内还可以包含其他从属于它的框,利用N-S图表示算法就像堆积木一样,它十分适合结构化程序设计,因而很受欢迎。N-S图相比流程图方法来说主要特点是去掉了流程线,从而避免了设计出无规则任意转向的算法,更容易让学习的人养成利用结构化方法构造算法的习惯。,4)伪代码用传统的流程图和图表示算法,直观易懂,但画起来比较费事。由于在设计一个算法时,不可能一挥而就,常常需要反复修改,且修改流程图又比较麻烦。因此,为了表示算法的简便,常常采用伪代码。伪代码是用介于自然语言和计算机语言之间的文字(可以是中文)和符号来描述算法。,2.5流程图与算法的结构化描述,算法的结构化描述,2.4流程图与算法的结构化描述,流程图,结构化程序设计方法是学习程序设计必须掌握的基础。1)结构程序设计是避免用goto语句的一种程序设计;2)结构程序设计是自顶向下的程序设计;3)结构程序设计是一种组织和编制程序的方法,利用它编制的程序是容易理解和容易修改的;4)程序结构化的一个主要功能是使得正确性的证明容易实现;5)结构程序设计允许在设计过程中的每一步验证其正确性,即自动导致自我说明与自我捍卫的程序风格;6)结构程序设计讨论了如何将任何大规模的和复杂的流程图转换成一种标准的形式,使得它们能够用几种标准的控制结构(通常是顺序、分支和循环)通过重复和嵌套来表示。,2.6结构化程序设计方法,一般来说,只要在程序中能正确的使用“三种基本结构(顺序、分支和循环)”表示解题步骤(算法);使用“模块”来封装功能的思想,进而设计的程序,可以被界定为结构化程序设计。自顶向下;逐步细化;模块化设计;结构化编码。,2.6结构化程序设计方法,习题:P361、2、3、4,第3章数据类型、运算符与表达式,程序是解决某种问题的一组指令的有序集合。著名计算机科学家沃思(NikiklausWirth)提出一个公式:程序=数据结构+算法,程序是什么?,对数据的描述。在C语言中,体现为数据类型的描述!,对数据处理的描述。是为解决一个问题而采取的方法和步骤,是程序的灵魂!,结论:学好C语言首先就必须十分了解C语言的数据类型、运算符与表达式。,3.1C语言数据类型,数据类型决定:1.数据占内存字节数2.数据取值范围3.其上可进行的操作,本章所介绍的数据类型,3.2常量、变量和标识符1.标识符定义:用来标识变量、常量、函数等的字符序列组成:只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线C语言的关键字不能用作变量名大小写敏感长度:有效长度为32个字符。随系统而异,但至少前8个字符有效命名原则:变量名和函数名中的英文字母一般用小写,以增加可读性见名知意不宜混淆如l与I,o与0,在TC2.0及BC3.1中,变量名(标识符)的有效长度为个字符,缺省值为,但在VC中其长度可达到255,例:判断下列标识符号合法性sumSumM.D.JohndayDate3daysstudent_name#33lotus_1_2_3charab_above$123,M.D.John,3days,#33,char,$123,ab,.字符非法,数字3不可作首字符,#字符非法,char是关键字,字符非法,$不可作首字符,3.2常量、变量和标识符2.常量定义:程序运行时其值不能改变的量(即常数)常量的分类:直接常量(值常量)整型常量:10、15、-10、-30实型常量:12.5、30.0、-1.5字符常量:A、b、c字符串常量:“sum”、“A”、“123”符号常量用标识符来代表常量。其定义格式为:,#define符号常量常量,#defineNUM20#definePI3.1415926,#include#definePRICE30voidmain()intnum,total;num=10;total=num*PRICE;printf(total=%d,total);,运行结果:total=300,行尾不能有分号define前面一定要有#符号常量名最好使用大写符号常量名最好有意义,3.2常量、变量和标识符3.变量定义:程序运行时其值可以被改变的量变量的两要素:变量名、变量值变量的定义格式:变量的初始化:定义时赋初始值变量的使用:先定义,后赋值变量定义位置:一般放在函数开头,存储类型数据类型变量名1,变量名2,变量名n;,intx,y,z;floatradius,length,area;charch;,决定分配字节数和数的表示范围,合法标识符,例:inta=2,b,c=4;floatdata=3.67;charch=A;intx=1,y=1,z=1;intx=y=z=1;,例1:intstudent;stadent=19;/Undefinedsymbolstatentinfunctionmain,例2:floata,b,c;c=a%b;/Illegaluseoffloatingpointinfunctionmain,3.3简单数据类型与表示范围,1.整型数据,整型常量,十进制整数:由数字09和正负号表示.如:123,-456,0八进制整数:由数字0开头,后跟数字07表示.如:0123,011十六进制整数:由0 x或0X开头,后跟09,af,AF表示.如0 x123,0Xff,定义整数的符号常量#defineNUM120/十进制数20#defineNUM2020/八进制数(十进制16)#defineNUM30 x2a/十六进制数(十进制42),思考题:下列整型常量哪些是非法的?012,oX7A,00,078,0 x5Ac,-0 xFFFF,0034,7B。,首字符不能是字母o,八进制数中不能有数字8,十进制数中不能有字母B,2.整数在内存中的表示,整数的数值在内存中用补码的形式存放。求一个整数补码的方法:(假设用n个二进制位的内存单元来存储它),如果是正整数,采用符号-绝对值表示,即最高有效位(符号位)为0表示正,数的其余部分则表示数的绝对值;如果是负整数,则先写出与该负数相对应的正数的补码表示,然后将其按位求反,最后在末位(最低位)加1;然后将上述求得的补码的低n位存放于内存单元之中,就得到了该整数在内存中的表示,内存单元的最高位是符号位(0表示正,1表示负)。,在TC2.0或BC3.1下,一个整数默认情况下需要2个字节(16位)的内存单元存放;而在VC6.0下,则需要4个字节(32位)。,2.整数在内存中的表示,十进制整数,14:对于16位的内存单元:,符号位,十进制数+14两个字节的内存实际存放形式,(+14)补=0000000000001110,2.整数在内存中的表示,十进制整数,14:对于32位的内存单元:,十进制数+14四个字节的内存实际存放形式,(+14)补=00000000000000000000000000001110,符号位,记住:数据在内存中的存放位置是高字节放在高地址的存储单元中,低字节放在低地址的存储单元中。,2.整数在内存中的表示,十进制整数,14:对于16位的内存单元:,符号位,十进制数-14两个字节的内存实际存放形式,(+14)补=0000000000001110,(-14)补=1111111111110010,2.整数在内存中的表示,十进制整数,14:对于32位的内存单元:,十进制数-14四个字节的内存实际存放形式,(+14)补=00000000000000000000000000001110,符号位,(-14)补=11111111111111111111111111110010,2.整数在内存中的表示,十进制整数,65537:对于16位的内存单元:,(+65537)补=010000000000000001,(-65537)补=101111111111111111,十进制数-65537两个字节的内存实际存放形式,符号位,真值为:-1,不是-65537!,2.整数在内存中的表示,十进制整数,65537:对于32位的内存单元:,十进制数-65537四个字节的内存实际存放形式,(+65537)补=00000000000000010000000000000001,符号位,表示负,(-65537)补=11111111111111101111111111111111,真值为:-65537!,为什么-65537这个数在16位内存单元中的表示与在32位内存单元中的表示不相同呢?,这主要是因为-65537这个数超出了16位内存单元表示数的范围,所以实际存储的值(-1)与要表示的值(-65537)不同,但-32767并没有超出了32位内存单元表示数的范围,所以实际存储的值就是其本身。因此,我们在C语言中对数据处理时必须要注意数据的表示范围,以免引起不必要的错误。,2.整数在内存中的表示,八进制整数,034:对于16位的内存单元:034=(011100)2,符号位,八进制数034两个字节的内存实际存放形式,(034)补=0000000000011100,对于32位的内存单元:(034)补=00000000000000000000000000011100,八进制数034四个字节的内存实际存放形式,符号位,2.整数在内存中的表示,八进制整数,034:对于16位的内存单元:,符号位,八进制数-034两个字节的内存实际存放形式,(+034)补=0000000000011100,(-034)补=1111111111100100,对于32位的内存单元:(+034)补=00000000000000000000000000011100,(-034)补=11111111111111111111111111100100,八进制数-034四个字节的内存实际存放形式,符号位,2.整数在内存中的表示,十六进制整数,0X8AB6:对于16位的内存单元:0X8AB6=(1000101010110110)2,符号位表示负,十六进制数0X8AB6两个字节的内存实际存放形式,(0X8AB6)补=01000101010110110,真值为:-30026!,对于32位的内存单元:(0X8AB6)补=00000000000000001000101010110110,十六进制数0X8AB6四个字节的内存实际存放形式,符号位,真值为:+35510!,2.整数在内存中的表示,十六进制整数,0X8AB6:对于16位的内存单元:,(+0X8AB6)补=01000101010110110,(-0X8AB6)补=10111010101001010,十六进制数-0X8AB6两个字节的内存实际存放形式,符号位表示正,真值为:+30026!,对于32位的内存单元:(+0X8AB6)补=00000000000000001000101010110110,(-0X8AB6)补=11111111111111110111010101001010,十六进制数-0X8AB6四个字节的内存实际存放形式,符号位表示负,真值为:-35510!,3.整型变量,整型变量的定义,int变量名,变量名2,变量名n;,int必须小写,至少一个空格,必须为合法的标识符,以逗号,分隔,以分号;结尾,定义时可以赋初值,方法:在变量名后面增加“=数值”,例:inta;intx,y,z;intm=2,y=-3;,当程序中定义了一个变量时,计算机会为这个变量分配一个相应大小的内存单元。因此,这个变量是有值的,它的值就是对应内存单元的值。如果定义时没有赋初值,则这个值程序员是无法预知的。,整型变量的分类,修饰符控制变量是否有符号:signed(有符号)和unsigned(无符号)控制整型变量的值域范围:short(短)和long(长)。,有符号基本型(int)inta=-2;/定义一个有符号整型变量a,并赋初值-2占一个机器字大小的内存单元。TC或BC3.1下,变量占2个字节(16位)的内存单元;VC6.0下,变量占4个字节(32位)的内存单元。,如果定义变量时,不指定signed,也不指定unsigned,则默认为signed(有符号),符号位,变量a占用的内存单元(2字节),有符号整型变量在内存中的实际存放形式(假设在BC3.1下),无符号基本型(unsignedint或unsigned),unsignedinta=2;/定义一个无符号整型变量a,并赋初值2或unsigneda=2;占用的内存单元字节数同int类型。与inta=2;等价。,unsignedinta=-2;/定义一个无符号整型变量a,并赋初值-2或unsigneda=-2;,无符号整型变量在内存中的实际存放形式(假设在BC3.1下),数据位,变量a占用的内存单元(2字节),其值为:65534!,注意:对于有符号数也好还是无符号数也好,其实在计算机内存中表示是不加区分的,都是以其补码形式表示,只是我们怎样看待最高二进制位的问题,如果把最高位当成符号位看待,则为有符号数,如果把最高位当成数据位看待,则变为无符号数。例如:unsignedinta=-2;printf(“%d”,a);-有符号输出,则为-2printf(“%u”,a);-无符号输出,则为65534,有符号短整型(shortint或short),shortinta=2;/定义一个有符号短整型变量a,并赋初值2或shorta=2;占用的内存单元为2个字节,无论是TC、BC,还是VC。,无符号短整型(unsignedshortint或unsignedshort),unsignedshortinta=2;/定义一个无符号短整型变量a,并赋初值2或unsignedshorta=2;占用的内存单元字节数同short类型。,在TC2.0和BC3.1下,unsignedshort类型与unsignedint类型是等价的。,有符号长整型(longint或long),longinta=234567;/定义一个有符号长整型变量a,并赋初值234567或longa=234567;占用的内存单元为4个字节,无论是TC、BC,还是VC。,无符号长整型(unsignedlongint或unsignedlong),unsignedlonginta=2;/定义一个无符号长整型变量a,并赋初值2或unsignedlonga=2;占用的内存单元字节数同long类型。,在VC中long与int类型基本相同,均占四个字节的内存单元;但在TC或BC中,long类型与int类型只是所占字节不同外(long占4字节,int占2字节),其它数据处理方法是一样的。,【例】各种整型变量的定义,#include#defineSUM65535voidmain()inta,b=20;unsignedintc=0 xff;longD;a=SUM;D=301;printf(a=%dn,a);printf(b=%dn,b);printf(c=%dn,c);printf(“D=%dn”,D);,/文件包含,头文件说明,/定义符号常量SUM,值为65535,/定义两个int型变量a和b,b赋初值20,/定义无符号整型变量c,并赋初值0 xff,/定义长整型变量D,/对a赋值为SUM,这时a的值是65535,/对D赋值为301,/以有符号十进制形式(%d)显示a的值,/以有符号十进制形式(“%d”)显示b的值,/以有符号十进制形式(%d)显示c的值,/以有符号十进制形式(%d)显示D的值,变量定义部分,语句执行部分,在BC3.1下运行结果:a=-1b=20c=255D=301,在VC6.0下运行结果:a=65535b=20c=255D=301,对于16位的有符号整型变量a来说,因65535在内存中的形式为1111111111111111,最高位为1表示负,则其所对应的十进制数就为-1。,4.整数常量的分类,根据其值所在范围确定其数据类型。在TC2.0或BC3.1下,如果整型常量的值位于-3276832767之间,C语言认为它是int型常量;如果整型常量的值位于-21474836482147483647之间,C语言认为它是long型常量。整型常量后加字母l或L,认为它是longint型常量。比如123L、45l、0XAFL。无符号数也可用后缀表示,整型常数的无符号数的后缀为U或u。例如:358u,0 x38Au,235Lu均为无符号数。,前缀、后缀可同时使用以表示各种类型的数。如0XA5Lu表示十六进制无符号长整数A5,其十进制为165。其实整型常数这种表示无符号数意义不大,在机器内部它还是用其补码表示,例如-1U和-1在内存中表示是一样的,数据处理也一样,所以有的教科书上说“常量无unsigned类型”,其实有,但无意义。,5.实型数据,实型常量(实数或浮点数),十进制小数形式:由数字09和小数点组成.如:0.0,5.6,-5.指数形式:由十进制数,加阶码标志e或E以及阶码(只能为整数,可以带符号)组成.其一般形式为:aEn其中:a为十进制数,n为十进制整数,都不可缺少。其可表示为a10n,合法的实数表示:2.1E5表示2.1105,3.7E-2表示3.710-2。,非法的实数表示:345(无小数点),E7(阶码标志E之前无数字),-5(无阶码标志),50.-E3(负号位置不对),实型变量,单精度实型(float)floatf=3.14,g;这种定义的变量在内存中占4个字节(32位)的存储单元。双精度实型(double)doublex,y;这种定义的变量在内存中占8个字节(64位)的存储单元。长双精度实型(longdouble)longdoublex,y;在TC或BC下,这种定义的变量在内存中占10个字节(80位)的存储单元;在VC下则占8个字节(64位)。,注意:三种实数类型中,其精度是float*/%-+-(2)(3)(4)说明:“-”可为单目运算符时,右结合性两整数相除,结果为整数%要求两侧均为整型数据,例:5/2=-5/2.0=,例:5%2=-5%2=1%10=5%1=5.5%2,3.算术运算符、算术表达式,2,-2.5,1,-1,1,0,(),表达式和算术表达式,3.算术运算符、算术表达式,表达式:用运算符和括号将运算对象(常量、变量和函数等)连接起来的、符合语言语法规则的式子。算术表达式:表达式中的运算符都是算术运算符的表达式。,运算符优先级(到目前为止),例:3+5*8、(x+y)/2-1等,自增、自减运算符+-作用:使变量值加1或减1种类:前置+i,-i(先执行i=i+1或i=i-1,再使用i值)后置i+,i-(先使用i值,再执行i=i+1或i=i-1),例:j=3;k=+j;j=3;k=j+;j=3;printf(“%d”,+j);j=3;printf(“%d”,j+);a=3;b=5;c=(+a)*b;a=3;b=5;c=(a+)*b;,/k=4,j=4,/k=3,j=4,/4,/3,/c=20,a=4,/c=15,a=4,4.自增自减运算符、符号运算符,负号运算符(“-”)减号()既是一个算术运算符,又是一个负号运算符。负号运算符是单目运算符。例如:a=2,那么a的值就是2。负号运算符的优先级比较高,与强制类型转换符是同一个级别。,自增、自减运算符注意事项+和-运算符只能用于变量,不能用于常量和表达式。因为+和-蕴含着赋值操作。例如:5+、-(a+b)都是非法的表达式。负号运算符、+、-和强制类型转换运算符的优先级相同,当这些运算符连用时,按照从右向左的顺序计算,即具有右结合性。两个和之间不能有空格。在表达式中,连续使同一变量进行自增或自减运算时,很容易出错,所以最好避免这种用法。例如:+i+是非法的。自增、自减运算,常用于循环语句中,使循环控制变变量加(或减)-,以及指针变量中,使指针指向下(或上)一个地址。,4.自增自减运算符、符号运算符,例:intp,i=2,j=3;p=-i+;p=?i=?p=i+j;p=?i=?j=?p=i+-j;p=?i=?j=?p=i+-j;p=?i=?j=?p=i+i+;p=?i=?p=+i+(+i);p=?i=?,-2,3,5,3,3,4,2,2,4,3,2,4,4,8,4,5.算术运算符中数据类型转换规则,#includevoidmain()floata,b,c;a=7/2;/计算7/2得int型值3,因此a的值为3.0b=7/2*1.0;/计算7/2得int型值3,再与1.0相乘,因此b的值为3.0c=1.0*7/2;/先计算1.0*7得double型的结果7.0,然后再计算7.0/2,因此c的值是3.5printf(a=%f,b=%f,c=%f,a,b,c);,a=3.000000,b=3.000000,c=3.500000,6.逗号运算符、逗号表达式,位运算符:,逗号表达式:用逗号连接起来的表达式。其一般形式为:,表达式1,表达式2,表达式k,优先级:优先级最低。结合性:左结合性。即逗号表达式的求值顺序是从左向右依此计算用逗号分隔的各表达式的值。逗号表达式的值:最后一个表达式的值就是整个逗号表达式的值。用途:常用于循环for语句中。,例如:a+3,b=4,b+,例:a=3*5,a*4a=3*5,a*4,a+5例:x=(a=3,6*3)x=a=3,6*a例:a=1;b=2;c=3;printf(“%d,%d,%d”,a,b,c);printf(“%d,%d,%d”,(a,b,c),b,c);,/a=15,表达式值60,/a=15,表达式值20,/赋值表达式,表达式值18,x=18,/逗号表达式,表达式值18,x=3,/1,2,3,/3,2,3,例:#includevoidmain()intx,y=7;floatz=4;x=(y=y+6,y/z);printf(x=%dn,x);,运行结果:x=3,8.sizeof运算符、复合运算符,sizeof运算符功能:获取变量和数据类型所占内存大小(字节数)格式:,sizeof表达式sizeof(数据类型名或表达式),例:sizeof(int)其值为2(在TC2.0或BC3.1下)其值为4(在VC6.0下)sizeof(long)其值是4sizeof10L其值也是4unsignedlonga=2;sizeof(a)其值也是4,复合赋值运算符,种类:+=-=*=/=%=a+=a-=a*a;,/a=-264等价于a=a+(a=a-(a*a),例:inta=2;a%=4-1;a+=a*=a-=a*=3;,/a=0等价于a=a+(a=a*(a=a-(a=a*3),3.5运算符的优先级和结合性,判断表达式0XF0F0b=2;c=3;问:d=a!=c=abc;的值?,答:d的值为1。等价于:d=(a!=c)=(ab)=cb+cbf=abc,/表达式值1,/表达式值1,/表达式值0,/d=1,/f=0,关系运算注意:,例若a=0;b=0.5;x=0.3;则a78在C中是允许的,值为,0,例inti=1,j=7,a;a=i+(j%4!=0);则a=,2,例a0结果为A100结果为,1,0,例应避免对实数作相等或不等的判断如1.0/3.0*3.0=1.0结果为可改写为:fabs(1.0/3.0*3.0-1.0)y等价于:a=b|x=y等价于:!a|ab等价于:!ab等价于:c=a|b等价于:a|7b=5;!aa,例(a=b)?Y:N(x%2=1)?1:0(x=0)?x:-x(c=ax0,表达式值为axy?1:1.5/xy,值为1.0;xy,值为1.5,例:小写字母转盘。#include#includevoidmain()charch,ch1,ch2;/变量定义ch=getche();/读取一字符putchar(n);/换行ch1=ch=a?z:ch-1;/求前驱字符ch2=ch=z?a:ch+1;/求后继字符printf(ch1=%c,ch2=%cn,ch1,ch2);/显示结果,输出结果(假设输入为w):ch1=v,ch2=x,运算符总结:,总体上讲,单目运算符都是同等优先级的,具有右结合性,并且优先级比双目运算符和三目运算符都高。三目运算符的优先级比双目运算符要低,但高于赋值运算符和逗号运算符。逗号运算符的优先级最低,其次是赋值运算符。只有单目运算符、赋值运算符和条件运算符具有右结合性,其它运算符都是左结合性。双目运算符中,算术运算符的优先级最高,逻辑运算符的优先级最低。,到现在为止,我们已经学习了30多个运算符。掌握它们的优先级关系特别重要。优先级的记忆规则:,5.3选择结构的程序设计,1.if语句,简单if语句形式,if(表达式)语句;,格式:,执行流程:,例如:下面的程序段是输入两个整数,输出其中的大数。inta,b,max;printf(inputtwonumbers:);scanf(%d%d,if_else形式,if(表达式)语句1;else语句2;,格式:,执行流程:,例如:下面的程序段同样是输出两个整数中的最大数。inta,b;printf(inputtwonumbers:);scanf(%d%d,1.if语句,if_else_if形式,if(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;else语句n;,格式:,执行流程:,例如:下面的程序段是判断输入字符的种类。charc;printf(Enteracharacter:);c=getchar();if(c=0,if语句注意事项,(1)if语句后面的表达式必须用括号括起来。(2)表达式通常是逻辑表达式或关系表达式,但也可以是其它任何表达式,如赋值表达式等,甚至也可以是一个变量。只要表达式非零时,表达式的值就为真,否则就是假。(3)在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用括起来组成一个复合语句。但要注意的是在之后不能再加分号。(4)在if语句中,如果表达式是一个判断两个数是否相等的关系表达式,要当心不要将=写成了赋值运算符=。,if(a=5)语句;/表达式的值永远为非0,所以其后的语句总是要执行的if(b)语句;/等价于if(b!=0)语句;,运行结果:x=0,运行结果:x!=0,if语句嵌套:一般形式:,例输入两数并判断其大小关系,#includevoidmain()intx,y;printf(Enterintegerx,y:);scanf(%d,%d,运行结果:Enterintegerx,y:12,23XYEnterintegerx,y:12,12X=Y,语言规定,在缺省时,else总是和它上面离它最近的未配对的if配对,运行结果:a=0,运行结果:a=1,if_else配对原则,例:if(a=b)if(b=c)printf(“a=b=c”);elseprintf(“a!=b”);,修改:if(a=b)if(b=c)printf(“a=b=c”);elseprintf(“a!=b”);,实现ifelse正确配对方法:加,例:考虑下面程序输出结果:voidmain()intx=100,a=10,b=20;intv1=5,v2=0;if(ab)if(b!=15)if(!v1)x=1;elseif(v2)x=10;x=-1;printf(“%d”,x);,结果:-1,2.switch语句(开关分支语句)一般形式:,switch(表达式)caseE1:语句组1;break;caseE2:语句组2;break;.caseEn:语句组n;break;default:语句组;break;,执行过程:,使用switch语句注意事项,(1)switch后面的“表达式”,可以是int、char和枚举型中的一种,但不可为浮点型。,floata,b=4.0;scanf(%f,inta,b=4;scanf(%d,使用switch语句注意事项,(2)case后面语句(组)可加也可以不加,但一般不加。(3)每个case后面“常量表达式”的值,必须各不相同,否则会出现相互矛盾的现象。,switch(i)case1:b=b+1;break;/可加可不加case2:b=b-1;break;,使用switch语句注意事项,(4)每个case后面必须是“常量表达式”,表达式中不能包含变量。,例:按成绩分成A、B、C、D、E、F几个等级。charscore;printf(EnterScore:);scanf(%d,使用switch语句注意事项,(5)case后面的“常量表达式”仅起语句标号作用,并不进行条件判断。系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,所以必须加上break语句,以便结束switch语句。,#includevoidmain()charch;ch=getch();switch(ch)caseY:printf(Yesn);break;caseN:printf(Non);break;caseA:printf(Alln);break;default:printf(Yes,NoorAlln);,运行结果:No,/假设输入为:N,#includevoidmain()charch;ch=getch();switch(ch)caseY:printf(Yesn);break;caseN:printf(Non);caseA:printf(Alln);break;default:printf(Yes,NoorAlln);,/假设输入为:N,运行结果:NoALL,使用switch语句注意事项,(6)多个case子句,可共用同一语句(组)。,例:当a的值是1、2、3时,将b的值加2,当a的值是4、5、6时,将b的值减2。inta,b=4;scanf(%d,使用switch语句注意事项,(7)case子句和default子句如果都带有break子句,那么它们之间顺序的变化不会影响switch语句的功能。,#includevoidmain()charch;ch=getch();switch(ch)caseY:printf(Yesn);break;caseN:printf(Non);break;caseA:printf(Alln);break;default:printf(Yes,NoorAlln);break;,#includevoidmain()charch;ch=getch();switch(ch)caseY:printf(Yesn);break;default:printf(Yes,NoorAlln);break;caseN:printf(Non);break;caseA:printf(Alln);break;,使用switch语句注意事项,(8)case子句和default子句如果有的带有break子句,而有的没有带break子句,那么它们之间顺序的变化可能会影响输出的结果。,#includevoidmain()charch;ch=getch();switch(ch)caseY:printf(Yesn);break;caseN:printf(Non);break;caseA:printf(Alln);break;default:printf(Yes,NoorAlln);,#includevoidmain()charch;ch=getch();switch(ch)cas
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 供货合同范例
- 公路购沙合同范例
- 专家评审费劳务合同范例
- 保函补充协议合同范例
- 债务结清合同范例
- 交友相亲合同范例版
- 乡镇施工合同范例
- 公路造价咨询合同范例
- 审计过程中的报告反馈机制试题及答案
- 会承办合同范例
- 2025年摄影师职业技能鉴定试卷:摄影现场拍摄光线与色彩协调技巧试题
- 临床面试专业真题及答案
- 医药职业道德课程课件
- 2025-2030中国铍行业市场发展趋势与前景展望战略研究报告
- 绳索救援技术培训内容
- 甘肃省天水监狱招聘警务辅助人员笔试真题2024
- 2025年农村商业银行招聘考试笔试试题(含答案)
- 网络安全知识手册
- 医院财务笔试试题及答案
- 全国医师定期考核公共卫生考核试题500题-1
- 上饶城投笔试试题及答案
评论
0/150
提交评论