北航的C语言课件.ppt
- 文档编号:18847870
- 上传时间:2024-01-22
- 格式:PPT
- 页数:331
- 大小:2.26MB
北航的C语言课件.ppt
《北航的C语言课件.ppt》由会员分享,可在线阅读,更多相关《北航的C语言课件.ppt(331页珍藏版)》请在冰点文库上搜索。
高级语言程序设计
(一)(CProgramming),北京航空航天大学计算机学院软件所晏海华,2,作业及参考书,教师:
晏海华联系方式:
柏彦大厦708,Tel:
82328212,Email:
参考书:
C程序设计语言,B.W.Kernighan,D.M.Ritchie,机械工业出版社,徐宝文等译从问题到程序程序设计与C语言引论,裘宗燕编著,机械工业出版社C语言教程,孙玉芳,孟庆昌编著课程信息、作业及答疑:
http:
/考核方式:
作业占10%,期中考试占30%,期末占60%,3,忠告,掌握C语言程序设计的唯一途径:
上机实践(编程)!
(Try!
),高级语言程序设计
(一)(CProgramming),第一讲:
C语言基础,5,本章目标,了解C语言的历史及现状;初步了解C程序的结构知道在某个操作系统环境下(Windows)一个C程序的编写过程;掌握变量、常量、简单数据类型、类型转换、表达式及部分C语言运算符;知道运算符优先级及结合律,6,程序设计与程序设计语言,程序设计(Programming):
为计算机解决问题所需的分析、设计、编写及调试程序过程。
(Theprocessofplanning,writing,testing,andcorrectingthestepsrequiredforacomputertosolveaproblemorperformanoperation.)程序设计语言(ProgrammingLanguage):
用来表达程序的计算机能够执行的人工语言。
7,为什么要学C程序设计,C语言仍是目前广泛使用的编程语言,主要特点:
表达能力强,支持结构化程序设计;语言简洁;代码效率高:
C编写的程序仅比用汇编语言编写的程序相差20%;可移植性好;特别适合编写操作系统、编译程序、数据库系统、嵌入式软件及图形/图象处理等对性能要求高的软件;C语言是目前广泛流行的面向对象语言C+、C#及Java的基础,8,C语言历史,C语言的产生与UNIX操作系统是密不可分的:
UNIX由BellLab的K.Thompson和D.M.Ritchie最先在1969年开发的O.S.(它的前身是MIT和AE开发的Multies)。
1970年,V1,V2版在PDP-7机上用汇编语言实现1971年V3PDP11/23;1972年V4PDP11/451972年,D.M.Ritchie开发出新语言C。
(CBBCPLCPL单数据型语言)1973年,Ritchie和Thompson用C改写了UNIX核心(90%)即V5,9,C语言历史(续),C语言的发展经历三个阶段:
第一阶段:
78年以前,C称为UNIXC,即C被看成UNIX的一部分。
第二阶段:
78年D.Ritchie的C程序设计语言出版到88年ANSIC(标准C)标准出现。
此C又称为K&RC。
第三阶段:
88年ANSIC标准(89年3月批准)。
CPL1968C.Strachey,10,一个简单的C程序:
在屏幕上显示一行正文,例1-1/*file:
hello.c*/#includemain()printf(“hello,worldn”);,/*/为注释,不可嵌套,#include为一条预处理指令,当程序中用到输入/输出函数时,应在文件开始处加上该指令。
main为一函数名。
由括起来的部分为函数体。
函数名为一标识符。
printf为一条输出语句,在C语言中分号(;)为语句的结束符。
printf为标准I/O库中标准输出函数。
“”为一字符串常量。
n为C语言转义字符,表示回车。
11,标识符,在C语言中标识符定义为:
”由字母(或_)开头的字母(_)数字串“。
标识符在C语言中可作为变量名、常量名、函数名、参数名、类型名、枚举名和标号等。
12,C程序结构,一个C程序由一系列外部说明和函数组成;一个函数则由局部变量说明及语句序列组成;一个C程序可由一个或多个函数组成,但其中必有一个(也只能有一个)命名为main(主函数),其它函数可由用户任取名字。
程序运行时必需从main开始,但main函数在程序中的前后位置没有关系;组成C程序的各个函数可在一个源文件上,也可以分放在多个文件上(函数不能跨文件),每个源文件可单独编译。
C源文件必须以.c作后缀(.h为C程序的头文件);,13,C程序的编辑、编译和运行,14,在Windows下使用VC编写及运行C程序,项目名,15,16,17,给出C源文件名,18,编辑C程序,19,编译Compile,编译及连接Build,编译及连接信息,运行Execute,20,运行结果,21,在UNIX(Linux)下编写及运行一个C程序,cc-o执行文件名c文件名o:
指定执行文件名,缺省为a.outc:
产生.o文件如:
s1.c,s2.cs3.c组成一个C程序,则有:
cccs1.ccccs2.cccoss1.os2.os3.c,22,另一个简单的C程序:
整数求和,int为数据类型说明符,其为一个关键字。
a,b,c,sum为变量,其为标识符。
例1-2#includemain()/*c1_2.c*/inta,b,c,sum;a=1;b=2;scanf(“%d”,a=1;为赋值语句,其中1为数字常量,=为赋值运算符。
scanf为标准输入函数,在此从键盘上读入一个整数存入变量c中。
在此,printf将变量sum内容显示到屏幕上。
+为算术运算符。
23,关键字,intautogotoiffloatstaticreturnelsecharexternbreakwhileshortregistercontinueforlongdounsignedswitchdoublecasestructdefaultunionvoidenumtypedefsizeofconstsigneddefine,undef,include,ifdef,ifndef,endif,及line,虽不是关键字,但是最好把它们看作关键字,它们主要用于C预处理程序中。
24,标准输入及输出函数:
scanf&printf,在scanf和printf中,%号开始的为格式转换控制字符,用来控制输入/出数据的格式,常用的有:
scanfprintf%d%d十进制整数%f%f十进制浮点数%c%c单个字符%s%s字符串%o八进制整数%x十六进制整数%本身在控制字符前还可以加数字,如:
%4d:
输出最小域宽为4个字符的整数。
%6.2f:
输出最小域宽为6个字符的浮点数,并且小数点占两位。
25,一个例子:
计算圆的面积及周长,例1-3#includemain()doubleradius,area,perimeter;scanf(“%f”,浮点数据类型,26,变量与变量说明,在C中,所有变量必须先说明(定义)后使用;说明方式:
存贮类类型变量(列)表;例:
intlower,upper,step;charc,line100;externdoublex;constdoublePI=3.1415926;constcharmsg=“Warning”;,27,变量属性,doublesalary=1500.23;,变量的类型,变量的名字,变量的值,变量的存储位置地址:
0x00222000,28,常量,整型常量(十进制、八进制、十六进制、long整型常量),如:
1275,0127,0x19a,0xABD,123l,89L浮点常量,如:
23.15,-8E-3,-125e+4字符常量,用一对单引号括起来字符称为字符常量,如:
A,b,?
一个字符常量的值是该字符在机器字符集(通常是ASCII字符集,但某些IBM大型机用EBCDIC码)中的编码值,它是一个整数值。
如上,在ASCII字符集中A的值为65,b的值为98,?
的值为63。
转义字符常量,如:
0,n,t,b,r,f,ddd(位模式,ddd为八进制数,其值为ddd)字符常量可像其它数一样参与数值运算,主要用于同其它字符作比较,如:
if(c=A,29,常量(续),字符串常量,用一对双引号括起来的字符串称为字符串常量,如:
“TheCProgrammingLanguage”注意:
所有字符串均以0结束(代码值为0的字符),因此,“x”和x不同,末尾的0由编译程序自动添加。
30,常量定义,所有常量可以用#define来定义,即可以给一个常量命名。
如:
#definePI3.14156使用常量定义的好处:
可提高程序的可读性程序的可移植性更好,可维护性更好,#include#definePI3.14159main()doubleradius,area,perimeter;scanf(“%f”,31,基本数据类型,注意:
在C语言中,没有Bool(布尔)类型,它用非0值表示真(True),用0表示假(False)。
在ANSIC中,类型修饰符:
const-其变量值在程序执行中不可以通过赋值等方法对它进行修改(是定义常量的另一种方法,用#define定义的常量无类型,而用const定义的常量有类型)。
如:
constfloatPI=3.14159;,#includeconstfloatPI=3.14159;main()doubleradius,area,perimeter;scanf(“%f”,32,类型转换,C语言类型转换通常是自动的-隐式(自动)类型转换1)字符与整数可以用整数的地方就可以用字符。
而整数转换成字符时,超出8位就将高位丢掉。
2)浮点数与整数3)无符号整数一般整数(int)和无符号整数(unsigned)混合使用,则简单整数转换成无符号整数。
33,类型转换(续),4)算术转换如果一个运算符,有不同类型的运算对象,那么“较低”类型会自动转换成“较高”类型。
此外,赋值号右边表达式的类型会自动转换为赋值号左边变量类型。
如,n+1.5结果将为double类型,34,类型转换(续),强制类型转换(cast)-显式类型转换()如:
x=sqrt(double)n);,35,表达式与运算符,在C语言中,由运算符(operators)及运算对象(operands)构成的式子称为表达式(expression),如:
x+y*z在C语言中,一个表达式后跟一个分号可构成一条语句:
;称为表达式语句如:
x+;n=5;a=b=c=0;,36,算术运算符,算术运算符:
+,-,*,/,%在算术运算时,注意整除问题,如:
doublef;f=3/2;,f=?
f值为1而不是1.5,若要f为1.5,则应写为:
f=(double)3/2;,37,赋值运算符,赋值运算符:
=,+=,-=,/=,%=,*=,=,=,注意:
这种等价关系并不是完全正确的,因为在(e1)op=(e2)中,e1只计算一次,而在(e1)=(e1)op(e2)中却计算两次,例如:
a+i*=n与a+i=a+i*n不同,后者跟计算次序有关。
38,赋值运算符(续),赋值运算符优点:
表达式简明扼要,如:
bfreelist_frow-b_back+=2;编译程序产生效率高(其用一个运算符完成其它语言中须多个运算符才能完成的功能。
如:
x+=n只有一个运算符,而x=x+n则有两个运算符)注意:
y*=n+1;等价于y=y*(n+1);,而不是y=y*n+1;,39,增(减)量运算符,增(减)量运算符:
+,-依据运算符与运算对象间的位置,分为前置和后置运算前置运算是先进行增减量,再取其值。
后置运算是先取其值,再进行增减量运算。
如:
n=5;n=5;x=+n;x=n+;结果:
?
结果:
?
x:
6,n:
6,x:
5,n:
6,像+,-这类只要求一个运算对象的运算符又称为单目运算符(unaryoperators)。
+,-运算符在有些书中称为自增(减)运算符。
40,例1_4给出下列程序的输出结果#includemain()inta,b,c;a=b=c=0;a=+b+c;printf(“%d%d%dn”,a,b,c);a=b+c+;printf(“%d%d%dn”,a,b,c);a=+b+c+;printf(“%d%d%dn”,a,b,c);a=b-+-c;printf(“%d%d%dn”,a,b,c);a=+c+c;printf(“%d%d%dn”,a,b,c);,/*211*/,/*222*/,/*533*/,/*522*/,/*不确定,取决于机器实现*/,增(减)量运算符(续),41,运算符优先级及结合律,42,运算符优先级及结合律(续),可以使用()运算符来改变表达式中运算符的计算次序。
如:
(x+y)/12if(x=n)0)while(c=getchar()!
=EOF),高级语言程序设计
(一)(CProgramming),第二讲:
C程序设计入门,44,本章目标,了解算法及控制结构了解关系运算符及逻辑运算符掌握使用选择及循环结构进行简单程序设计掌握C程序的简单测试与调试方法了解C程序的编程风格,45,程序设计,程序设计过程就是解决问题的过程。
程序设计通常包括如下五个步骤:
分析问题:
功能:
需要弄清楚软件要完成的功能;输入:
如果问题有输入,分析输入是什么及输入数据的类型;处理:
对输入数据做什么处理;输出:
如果有输出,输出什么数据及输出数据的格式;对于复杂问题,可将问题分解为若干子问题,然后再进行上面的分析。
算法设计:
设计解决问题的具体方案(步骤)。
编码:
将算法用高级语言实现。
测试:
运行编译连接后得到的执行程序,以验证程序是否按要求解决了问题,并没有产生副作用。
即程序是否做了该做的事,同时没有做不该做的事。
调试:
如果程序经测试发现问题,则通过调试手段找到产生错误的代码并修复它。
46,结构化程序设计(structuredprogramming),将复杂问题分解为简单问题的程序设计方法称为结构化程序设计,其特点为:
自顶向下(top-down);逐步细化(stepwiserefinement);模块化(modular);,47,算法,任何计算问题的解决都是按指定的顺序执行一系列动作的结果。
解决问题的动作及动作之间的顺序称为算法(algorithm)。
48,问题2.1,问题:
“判断某学生成绩是否及格”,49,问题2.1:
问题分析,输入:
学生成绩;类型:
整型;处理:
学生成绩值与60进行比较,大于或等于60,则及格,否则不及格;输出:
字符串“Pass”或“Fail”;变量:
需要一个整型变量用于存放输入的学生成绩。
50,问题2.1:
算法设计,解决问题2.1的步骤可描述为(算法):
读入学生成绩值如果该成绩值大于或等于60输出信息“Pass”否则输出信息“Fail”,51,算法表示,算法即可以用自然语言表述(如前),也可用用半结构化语言或结构化图形表示,如:
read学生成绩值if成绩值=60print“Pass”elseprint“Fail”,52,控制结构,计算机语言提供三种方式来控制算法的执行:
顺序(Sequence)、选择(Selection)和循环(Loop)。
循环,53,条件:
关系运算符及逻辑运算符,关系运算符:
=,=,=,!
=逻辑运算符:
&,|,!
注意:
在C语言中,没有Bool(布尔)类型,它用非0值表示真(True),用0表示假(False)。
因此,在C中,任何一个表达式都可用为条件。
A&B若A为0,则B不必求值,结果一定为0。
A|B若A为非0,则B不必求值,结果一定为非0。
例如:
(5=3)|(x=5)(2=3)&(x=7),54,条件(续),一些常见的条件例子:
判断整形变量n的值为一个0到10之间的值:
(0=n&n=10)判断字符变量c是字母:
(a=c&c=z)|A=c&c=Z)判断某年是平年还是闰年(闰年为能被4整除但不能被100整除,或能被400整除):
(y%4=0)&(y%100!
=0)|(y%400=0),注意:
条件表达式“0=n=10”不能得到预期结果,运算符优先级,55,语句,C语言语句分成简单语句和构造语句两类。
简单语句1)表达式语句赋值表达式语句,如:
*x+=y*=z+3;其它表达式语句,如:
+x;-y;函数调用语句等。
2)转移语句goto标号;break;间断语句continue;继续语句return;return(表达式);3)空语句;,56,语句(续),构造语句1)复合语句(分程序)*注意:
后没有分号(;),这与单个语句不同。
2)选择(条件)语句if语句,if_else语句3)循环语句for语句while语句do_while语句4)开关语句switch语句(包括case语句),57,问题2.1:
代码实现与测试,根据其算法描述,我们很容易将问题“判断学生成绩是否及格”的解决转换为相应的程序。
程序设计的常用方法为首先给出问题的算法描述,然后将其编程序实现。
如何判断程序解决了相应问题?
可用下面输入数据来测试(检验):
75(输出应为“Pass”)30(输出应为“Fail”)60(输出应为“Pass”)-特殊数据,58,选择结构:
if语句,if(表达式)语句if(表达式)语句1else语句2,59,选择结构:
if语句(续),注意:
在if嵌套中,省略else会产生二义性。
如:
if(n0)if(ab)z=a;elsez=b;即else与前面最接近的不带else的if相对应。
若要使上面的else与第一个if相匹配,可使用。
如:
if(n0)if(ab)z=a;elsez=b;,60,条件运算符(?
:
)与条件表达式,条件运算符(三目运算符):
?
:
条件表达式:
?
:
先计算表达式1,若其值为非零,则整个表达式结果为表达式2的值,否则就为表达式3的值。
例:
计算a和b的最大值if(ab)z=a;elsez=b;等价于:
z=(ab)?
a:
b;,例2-1a/*判断学生成绩是否及格*/#includemain()intscore;scanf(“%d”,61,问题2.2,问题:
“判断某学生成绩对应的五级评分成绩”问题分析:
输入:
学生成绩;类型:
整型;处理:
学生成绩值分别与90,80,70,60进行比较,以判断其为优、良、中、及格和不及格中哪一等级;输出:
A(优)、B(良)、C(中)、D(及格)、F(不及格);变量:
需要一个整型变量用于存放输入的学生成绩。
62,问题2.2:
算法设计,解决该问题的算法如下:
得到学生成绩值如果该成绩值大于或等于90输出信息“优”否则如果该成绩值大于或等于80输出信息“良”否则如果该成绩值大于或等于70输出信息“中”否则如果该成绩值大于或等于60输出信息“及格”否则输出信息“不及格”,63,问题2.2:
代码实现与测试,得到学生成绩值如果该成绩值大于或等于90输出信息“优”否则如果该成绩值大于或等于80输出信息“良”否则如果该成绩值大于或等于70输出信息“中”否则如果该成绩值大于或等于60输出信息“及格”否则输出信息“不及格”算法,例2-2/*判断学生成绩对应的五级评分*/#includemain()intscore;scanf(“%d”,嵌套if结构,测试数据为:
959085807570656055,64,多路选择:
if_elseif,例2-2a/*判断学生成绩对应的五级评分*/#includemain()intscore;scanf(“%d”,一种更好的风格!
65,多路选择:
if_elseif(续),注意:
不当的判断顺序可能造成程序错误的执行结果,如:
#includemain()intscore;scanf(“%d”,下面程序实现与例2-2a程序完成一样的功能,但效率要低。
/*判断学生成绩对应的五级评分*/#includemain()intscore;scanf(“%d”,66,多路选择:
switch语句,基本形式:
switch(表达式)case常量表达式1:
语句1或空;case常量表达式2:
语句2或空;case常量表达式n:
语句n或空;default:
语句n+1或空;语义动作为:
先计算表达式的值;该值与每一个case后的常量进行比较;若匹配,则控制就转向该常量后的语句;若不匹配,若有default,则转向default后的语句,否则什么也不做;,67,多路选择:
switch语句(续),注意:
常量表达式必须是整型(if_elseif可能根据任意条件来进行多路选择);在同一个switch中不应出现两个具有同样的情况常量;default语句如果有,只允许出现一次,default可出现在switch中的任何位置,通常放在最后;case和default本身不改变控制流(这与pascal中的case语句不同),中断离开switch要用break;case后的语句可以是单个语句,也可以是复合语句(但不带开头和结尾的花括号)C中switch语句与Pascal中case一个不同是:
C有default语句。
因此,switch语句特别适合于依据一组常量值来进行判断的多路选择。
68,多路选择:
switch语句(续),例如:
打印学生成绩#includemain()charscore;score=getchar();switch(score)caseF:
printf(“nopassn”);break;caseD:
printf(“passn”);break;caseC:
printf(“bettern”);break;caseB:
printf(“rightn”);break;caseA:
printf(“allrightn”);break;default:
printf(“inputerror!
n”);break;,caseC:
printf(“bettern”);,将出现什么问题?
如果输入为C,则输出为:
betterright,69,多路选择:
switch语句(续),问题2.2的另一种解决方式。
例2-2b/*判断学生成绩对应的五级评分*/#includemain()intscore;scanf(“%d”,70,问题2.3,问题:
“某班有30名学生,输入每个学生成绩并判断其是否及格”。
问题分析:
输入:
学生成绩;类型:
整型;处理:
学生成绩值与60进行比较,大于或等于60,则输出及格(”Pass”),否则输出不及格(”Fail”);输出:
字符串“Pass”或“Fail”;依次对每个学生重复上面步骤,重复次数为30次。
变量:
需要一个整型变量用于存放输入的学生成绩,一个整型变量用于记录重复次数。
71,问题2.3:
算法设计,算法:
1.设置变量n为02.读入一学生成绩值到变量score中3.判断score值,如果大于或等于60,则输出“Pass”,否则输出”Fail”;4.变量n加15.重复步骤2至4,直到n等于30,72,问题2.3:
算法设计(续),算法流程图,73,问题2.3:
代码实现,程序:
例2-3/*判断某班学生成绩是否及格*/#includemain()intn,score;n=0;while(n=60)printf(“Passn”);elseprintf(“Failn”);n+;,算法:
1.设置变量n为02.读入一学生成绩值到变量score中3.如果score=60输出”Pass”否则输出“Fail”4.变量n加15.重复步骤2至4,直到n等于30,while循环语句,测试数据考虑:
依次输入30个成绩值,这些值中应包括100,60,0等特殊值。
74,循环结构:
while语句,while(表达式)语句,75,循环结构:
while语句(续),例:
从键盘读入字符并输出#defineEOF1main()intc;while(c=getchar()!
=EOF)putchar(c);,算法分析:
读入一个字符while不是输入结束符输出字符;读入下一个字符;,1)程序如何结束?
Ctr-z2)为何程序运行:
hellohello,76,循环结构:
for语句,for(表达式1;表达式2;表达式3)语句其等价于:
表达式1;while(表达式2)语句;表达式3;,77,循环结构:
for语句(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北航 语言 课件