C语言程序设计课件完整版PPT推荐.pptx
《C语言程序设计课件完整版PPT推荐.pptx》由会员分享,可在线阅读,更多相关《C语言程序设计课件完整版PPT推荐.pptx(176页珍藏版)》请在冰点文库上搜索。
,第7页/共174页,保留字:
32个,有特殊含义,主要用于构成语句,进行存储类型和数据类型的定义,不允许用户作为自定义标识符使用;
词类:
常量、变量、运算符、函数、表达示、保留字;
语句:
完成特定的操作,语句的有机组合序列完成指定的功能;
第8页/共174页,语句的种类,赋值语句;
函数调用语句;
表达式语句;
流程控制语句;
复合语句;
空语句;
第9页/共174页,1.7算法,著名计算机科学家沃思提出公式:
程序=数据结构+算法数据结构:
对数据的描述即指定数据的类型和数据的组织形式;
算法:
对操作的描述即操作步骤。
第10页/共174页,1.7.1简单算法举例,判定2000-2500年中的每一年是否闰年。
设定y为被检测的年份。
算法如下:
S1:
2000=yS2:
若y不能被4整除,则输出y“不是闰年”,然后转至S6S3:
若y能被4整除,不能被100整除,则输出y“是闰年”,然后转至S6S4:
若y能被100整除,又能被400整除,输出y“是闰年”;
否则输出y“不是闰年”,然后转至S6S5:
输出y“不是闰年”S6:
y+1=yS7:
当y2500,算法停止;
第11页/共174页,1.7.2算法的特点,有穷性;
确定性;
有零个或多个输入;
有一个或多个输出;
有效性,第12页/共174页,1.7.3算法的表示,用流程图表示算法;
用伪代码表示算法;
用计算机语言表示算法。
第13页/共174页,第二章C语言的数据类型、运算符与表达式,C语言的数据类型;
C语言的运算符与表达式;
第14页/共174页,2.1C语言的数据类型,数据类型,第15页/共174页,2.2常量,在程序运行过程中,其值不能被改变的量称为常量。
C语言中规定的常量类型有以下五种:
整型常量、实型常量、字符常量、字符串常量和符号常量。
第16页/共174页,2.2.1整型常量,1.整型常量的表示方法:
十进制整数:
无前缀,数码取值为09,如123,-456。
八进制整数:
前缀为0,数码取值为07,如0123,-011。
八进制数与十进制数的转换方法如下:
(0123)8=1*82+2*81+3*80=64+16+3=(83)10,第17页/共174页,十六进制整数:
前缀0X或0x,数码取值为09,AF或af,如0x2A,-0x12。
十六进制数与十进制数转换方法:
(-0x12)16=-(1*161+2*160)=-(16+2)=(-18)102.整型常量的后缀:
加后缀L或l,表示长整型数。
加后缀u,表示无符号数。
第18页/共174页,2.2.2实型常量,实型常量即实数又称为浮点数,C语言中实数只采用十进制,有两种表示形式:
小数形式:
由数码09和小数点组成(注意必须有小数点),如.123,-123.4567;
指数形式:
由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数),如-2.1e2,2.1e-2。
第19页/共174页,2.2.3字符常量,C语言中,字符常量是用单引号括起来的单个字符,如a,$等。
转义字符是一种特殊形式的字符常量,它是以一个“”开头的字符序列。
第20页/共174页,表2.1转义字符及其含义,第21页/共174页,例2.1转义字符的使用,main()printf(“abctderftgn”);
printf(“htibbjk”);
第22页/共174页,例2.1结果,程序运行后在打印机上得到以下结果:
fabcgdehjik注意在显示屏上最后看到结果以与上述打印结果不同,是:
fgdehjk,第23页/共174页,2.2.4字符串常量,C语言中,字符串变量是由一对双引号括起来的字符序列,如“China”,“$3.232”。
注意:
不要将字符常量与字符串常量混淆。
第24页/共174页,字符常量与字符串常量的区别,字符常量是由单引号括起来的,字符串常量是由双引号括起来的;
字符常量只能是单个字符,字符串常量则可是零个或多个字符;
可把一个字符常量赋予一个字符变量,但不能把一个字符串变量赋予一个字符变量,C语言中没有相应的字符串变量,可用字符数组来存放字符串常量;
字符常量占一个字节的内存,字符串常量占的内存字节数等于字符串中字节数加1,最后一个字节存放字符0作为字符串结束标志。
第25页/共174页,2.2.5符号常量,C语言中,可用一个标识符来表示一个常量,称为符号常量又称为宏定义,使用前须先定义,其定义规则为:
#define标识符常量,第26页/共174页,例2.2符号常量的使用,#definePRICE30main()intnum,total;
num=10;
total=num*PRICE;
printf(“total=%d”,total);
使用符号常量的好处:
含义清楚;
在需要改变一个常量时能做到“一改全改”;
第27页/共174页,2.3变量,变量是指在程序运行中其值是变化的量。
一个变量应该有一个变量名,在内存中占据一定的存储单元,在该存储单元中存放变量的值。
图2.1,第28页/共174页,语言中,要求对变量作强制定义,即“先定义,后使用”。
便于发现错误;
为每一个变量指定确定类型,在编译时就能为其分配相应的存储单元。
第29页/共174页,整型数据在内存中的存储方式,整型数据在内存中是以二进制形式存放的。
若定义了一个整型变量i:
inti=10;
图3.2(a)是数据存放的示意图,图3.2(b)是数据在内存中实际存放的情况;
i,10,(a),i,(b),图2.2,第30页/共174页,实际上,整型数值是以补码表示的。
一个正数的补码与其原码相同,求负数的补码方法:
将该数的绝对值的二进制形式按位取反再加1。
例如求-10的补码:
10的原码,取反,再加1得-10的补码,第31页/共174页,.3.1整型变量,有符号基本整型signedint有符号短整型signedshortint有符号长整型signedlongint无符号基本型unsignedint无符号短整型unsignedshortint无符号长整形unsignedlongint,.整型变量的分类:
第32页/共174页,表2.1整型数据的所占的内存字节数与取值范围,第33页/共174页,2.整型变量的说明,类型说明符变量名标识符,变量名标识符,.;
如:
inta,b,c;
unsignedshortx,y;
第34页/共174页,例2.3整型变量的定义和运算,见教材P34例2.3,第35页/共174页,2.3.2实型变量,单精度型float占4个字节内存,提供7位有效数字,双精度型double占8个字节内存,提供16位有效数字。
整数没有误差,实数有精度,有误差,提供6位小数,7位有效数字。
第36页/共174页,2.实型变量的说明,格式和书写规则同整型变量说明相同,如:
floats,t;
doubleh,k;
第37页/共174页,例2.4实型数据的舍入误差,main()floata,b;
a=123456.789e5;
b=a+20;
printf(“%f,%f”,a,b);
结果:
12345678848.000000,12345678848.000000,第38页/共174页,误差原因分析,b的理论值应是12345678920,而一个实型变量只能保证的有效数字是7位有效数字,后面的数字是无意义的,并不准确表示该数,从结果看出,把20加在后几位上,是无意义的,应当避免将一个很大的数与一个很小的数直接相加减,否则就会“丢失”小的数。
与此类似,用程序计算1.0/3*3的结果并不等于1。
第39页/共174页,2.3.3字符变量,字符变量用来存放字符常量,只能存放一个字符,占用1个字节内存。
字符变量定义如下:
charc1,c2;
第40页/共174页,1.字符数据在内存中的存储,将一个字符常量放到一个字符变量中,不是把该字符本身放到内存单元中,而是将该字符的相应的ASC代码存放在存储单元中,如字符a的ASC代码为97,b为98,,97,98,c1,c2,c1,c1,图2.3,第41页/共174页,在内存中,字符数据以ASC码存储,它的存储形式与整数存储形式类似,C语言允许对整型变量赋以字符值,也允许对字符变量赋以整型量。
在输出时,允许把字符变量按整型量输出,也允许把整型变量按字符型量输出。
注意:
当整形变量按字符型量处理时,只有低八位参与处理。
第42页/共174页,例2.5向字符型变量赋以整型值,main()charc1,c2;
c1=97;
c2=98;
printf(“%c,%cn”,c1,c2);
printf(“%d,%dn”,c1,c2);
结果:
a,b97,98,第43页/共174页,2.补充,TurboC将字符变量中的最高位作为符号位,也就是将字符处理成带符号的整数,即signedchar型。
它的取值范围是-128127。
如果使用ASC码为0127间的字符,由于字节中最高位为0,因此用%d输出时,输出一个正整数。
如果使用ASC码为128255间的字符,由于在字节中最高位为1,用%d格式符输出时,就会得到一个负整数。
例如:
main()charc=130;
printf(“%d”,c);
得到-126。
如果不想按有符号处理,可以将变量定义为unsignedchar类型,这时其取值范围是0255。
signedchar和unsignedchar相仿,但它只有一个字节。
第44页/共174页,例2.6,main()charc1=130;
unsignedcharc2=130;
printf(“c1=%d,c2=%dn”,c1,c2);
c1=-126,c2=130,第45页/共174页,2.3.4变量赋初值,程序中常需要对一些变量预先设置初值。
C语言允许在定义变量的同时使变量初始化,如inta=3;
floatf=3.56;
charc=a;
第46页/共174页,也可以使被定义的变量的一部分赋初值,如:
inta,b,c=5;
如果对几个变量赋予初值3,应写成inta=3,b=3,c=3;
不能写成:
inta=b=c=3;
inta=3;
相当于:
inta;
a=3;
第47页/共174页,2.4运算符和表达式,运算符是一些特定的符号,它用来对数据进行某些特定的操作;
运算对象(操作数)是用来进行运算的数据,包括常量、变量等;
表达式是用运算符将运算对象连接起来的式子。
如1+2,1和2为运算对象,而1+2就是表达式。
第48页/共174页,2.4.1运算符种类、优先级和结合性,算术运算符用于各类数值计算。
运算符有:
加(+)、减(-)、乘(*)、除(/)、求余(或称模运运算,%)、自增(+)、自减(-)。
关系运算符用于比较运算。
运算符主要有:
大于()、小于(=)、小于等于(=)和不等于(!
=)。
1.运算符的种类,第49页/共174页,逻辑运算符用于逻辑运算。
与(&
)、或(|)、非(!
)。
位操作运算符参与运算的量,按二进制位进行运算。
按位与(&
)、按位或(|)、取反()、按位异或()、左移()。
赋值运算符用于赋值运算。
赋值运算符有:
简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)、复合位运算赋值(&
=,|=,=,=)等三类。
第50页/共174页,条件运算符是一个三目运算符,用于条件求值。
(?
:
逗号运算符用于把若干表达式组合成一个表达式。
(,)。
指针运算符用于取内容(*)和取地址(&
)两种运算。
求字节运算符用于数据类型所占的字节数(sizeof)。
第51页/共174页,强制类型转换运算符可以利用强制类型转换运算符将一个表达式转换成所需类型。
其一般形式为:
(类型名)(表达式)如(double)a;
(int)(x+y);
(float)(5%3)其他运算符其他运算符有:
括号()、数组下标、成员运算符.和用指针访问结构体成员的指向运算符-。
第52页/共174页,2.运算符的运算优先级,C语言中,运算符的运算优先级共分为15级。
1级最高,15级最低。
在表达式中,优先级较高的先于优先级低的进行运算。
如求表达式x+y*z的值:
y的值左侧为加号,右侧为乘号,而乘号优先于加号,因此相当于x+(y*z),即先进行乘法运算,然后再进行加法运算。
第53页/共174页,3.运算符的结合性,C语言的运算符不仅具有不同的优先级,还有结合性的问题。
在表达式的运算过程中,各运算对象参与运算的先后顺序不仅要遵循运算符优先级别的规定,还要受运算符结合性的制约,当一个运算对象两侧的运算符优先级别相同时,需按运算符的结合性来处理,以便确定是自左向右进行运算还是自右向左进行运算。
第54页/共174页,C语言中运算符的结合性分为两种:
即左结合性(自左向右)和右结合性(自右向左)。
算术运算符就是左结合性的运算符表达式:
x-y+z,运算对象y的左侧运算符“-”和右侧运算符“+”优先级相同,应按结合性来进行自左向右的运算,即先执行x-y运算,再执行+z的运算。
赋值运算符是右结合性的运算符表达式:
x=y=z,由于赋值运算符“=”的右结合性,所以先执行y=z运算,再执行x=(y=z)运算。
第55页/共174页,表2.2C语言各运算符的优先级别与结合方向,第56页/共174页,续表,第57页/共174页,同一优先级的运算符优先级别相同,运算次序由结合方向决定;
不同的运算符要求有不同的运算对象个数如+(加)和-(减)为双目运算符,要求在运算符运算符两侧各有一个运算对象(如3+5、8-3等);
而+(自增)和-(负号)运算符为单目运算符,只能在运算符的一侧出现一个运算对象(如-a、i+、-i、(float)i、sizeof(int)、*p等);
条件运算符是C语言中唯一的三目运算符,如x?
a:
b。
从上述表中可以大致归纳出各类运算符的优先级:
表2.2说明:
第58页/共174页,特殊运算符().-,单目运算符,算术运算符,关系运算符,逻辑运算符(不包括!
),条件运算符,赋值运算符,逗号运算符,优先级别由上到下递减。
特殊运算符优先级最高,逗号运算符优先级最低。
位运算符的优先级比较分散(有的在算术运算符之前(如),有的在关系运算符之前(如),有的在关系运算符之后(如&
、|)。
第59页/共174页,2.4.2算术运算符和算术表达式,1.基本的算术运算符基本的算术运算符有:
加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)五种。
两个整数相除的结果为整数,如5/3的结果为1,舍去小数部分。
但是,如果除数或被除数中有一个为负值,多数机器采取“向零取整”的方法,即5/3=1,-5/3=-1,取整后向零靠拢。
求余运算符“%”要求参与运算的量均为整型,运算结果等于两数相除后的余数,余数的符号取决于被除数的符号,如-100%3余数为-1,100%-3余数为1。
第60页/共174页,2.自增自减运算符,+i,-i在使用i之前,先使i的值加(减)1i+,i-在使用i之后,再使i的值加(减)1粗略地看,+i和i+的作用相当于i=i+1,但+i和i+不同之处在于+i是先执行i=i+1后,再使用i的值;
而i+是先使用i的值后,再执行i=i+1。
第61页/共174页,例2.6,如果i的原值等于3,执行下面的赋值语句:
j=+i;
(i的值先变为4,再赋给j,j的值为4)j=i+;
(先将i的值3赋给j,j的值变为3,然后i的值变为4),第62页/共174页,例2.7,P35例2.5main()intc=5;
printf(“%d,%d,%dn”,c+=c+,c+8,+c);
printf(“%dn”,c+=c+,c+8,+c);
TurboC规定,printf()函数中出现多个表达式输出项时,先按从右到左的顺序计算各表达式的值,然后再从左到右输出结果。
本例中先计算+c,得c=6,然后计算c+8得14,最后计算c+=c+,得c=13。
第63页/共174页,1.有如下两个程序,试比较结果main()inti=3;
printf(“%d,%dn”,(i+)+(i+)+(i+),i);
main()inti=3,k;
k=(i+)+(i+)+(i+);
printf(“%d,%dn”,k,i);
补充:
12,3,结果:
9,6,第64页/共174页,2.当出现难以区分的若干个+或-组成运算符串时,C语言规定,自左向右取尽可以多的符号组成运算符。
设整型变量x,y均为3,则:
x+y应理解为(x+)+y,结果为6,x值为4,y值不变x-y应理解为(x-)-y,结果为0,x值为2,y值不变,第65页/共174页,3.算术运算符的优先规则,单目算术运算符(-、+、-)优先于*、/、%算术运算符优先于+、-算术运算符;
同级单目算术运算符的结合性自右向左;
同级双目算术运算符的结合性自左向右。
第66页/共174页,4.算术表达式,用算术运算符和括号将运算对象连接起来的式子,称为算术表达式。
例如下面的表达式为算术表达式:
a*b/c-1.5+a如果一个算术运算符的两侧的数据类型不同,则按下面所述的内容先自动进行类型转换,使二者具有同一类型,然后再进行运算。
第67页/共174页,各类数值型数据间的混合运算,整型(包括int,short,long,unsignedint,unsignedshort,unsignedlong)和实型(包括float,double)数据可以混合运算。
而字符型数据可以与整型通用,因此整型、实型和字符型数据间可以混合运算,在进行运算时,不同类型的数据要先换成同一类型,然后进行运算,转换规则如下图所示:
第68页/共174页,图中横向向左的箭头表示必须的转换,如字符数据必须先转换为整数,short型转换为int,float型数据在运算时一律先转换为double型,以提高精度(即使是两个float型数据相加,也先都化成double型,然后再相加)。
纵向的箭头表示当运算为不同类型时转换的方向。
例如int型与double型数据进行运算,先将int型数据转换为double型,然后在两个同类型(double型)数据间进行运算,结果为double型。
注意箭头方向只表示数据类型级别的高低,由低向高转换。
不要理解为int型先转换为unsignedint型,再转成long型,再转成double型。
如果一个int型数据与一个double型数据运算,是直接将int型转换成double型。
第69页/共174页,例2.8,假设已指定i为int型变量,f为float型变量,d为double型变量,e为long型变量,有以下式子:
10+a+i*f-d/e,在计算机执行时从左至右扫描,运算次序为:
进行10+a的运算,先将a转换为整数97,运算结果为107;
由于“*”比“+”优先,先进行i*f的运算。
先将i与f都转换成double型,运算结果为double型;
整数107与i*f的结果相加。
先将整数107转换成double型,再相加,结果为double型;
将变量e化为double型,d/e结果为double型;
将10+a+i*f的结果与d/e的商相减,结果为double型。
第70页/共174页,main()floatx;
inti;
x=3.6;
i=(int)x;
printf(“x=%f,i=%d”,x,i);
x=3.600000,i=3,上述类型转换由系统自动进行的,另一种类型转换为强制类型转换。
需要说明的是在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。
(int)x;
如果x原来指定为float型,进行强制类型运算后得一一个int型的中间变量,它的值等于x的整数部分,而x的类型不变(仍为float型)。
见下例2.9:
第71页/共174页,2.4.3关系运算符和关系表达式,所谓“关系运算”实际上是“比较运算”。
将两个值进行比较,判断其比较的结果是否符合给定的条件。
例如,a3是一个关系表达式,大于号()是一个关系运算符,如果a的值为5,则满足给定的“a3”条件,因此关系表达式的值为逻辑值“真”(即“条件满足”),用整数“1”来表示;
如果a的值为2,不满足“a3”的条件,则称关系表达式的值为逻辑值“假”,用整数“0”来表示。
第72页/共174页,1.关系运算符及其优先次序,C语言提供下面6种关系运算符:
(大于)=(大于等于)=(等于)!
=(不等于),优先级相同(高),优先级相同(低),关于优先顺序:
前4种关系运算符(、=)的优先级别相同,后2种也相同。
前4种高于后2种;
关系运算符的优先级低于算术运算符;
关系运算符的优先级高于赋值运算符。
第73页/共174页,例2.10,例如:
ca+b等效于c(a+b)ab=c等效于(ab)=ca=bc等效于a=(bc),第74页/共174页,用关系运算符将两个表达式(可以是算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称为关系表达式。
关系表达式的值是一个逻辑值,即“真”或“假”。
例如,关系表达式“5=3”的值为“假”,“5=0”的值为“真”。
C语言没有逻辑型数据类型,以1代表“真”,以0代表“假”。
2.关系表达式,第75页/共174页,例2.11,a=3,b=2,c=1,则:
关系表达式“ab”的值为“真”,表达式的值为1;
关系表达式“(ab)=c”的值为“真”(因为ab的值为1,等于c的值),表达式的值为1;
关系表达式“b+cbd的值为1f=abcf的值为0(因为“”运算符是自左向右的结合方向,先执行“ab”得值为1,再执行关