1、第1页,C语言程序设计教程,龙佑喜、彭三城主编,湖南教育出版社,第2页,第一章 C语言程序设计概述,C语言 既可作为系统软件的程序设计语言,又可作为应用软件的程序设计语言。,当今计算机应用极为广泛,软件的设计、编写质量要求高,经常与硬件部分打交道,所以用C语言编写是最理想的。因而C语言也是当前计算机语言中用得最广泛的语言之一。,第3页, 1.1 程序与程序设计语言,一、程序是用计算机语言描述的某一问题的解决步骤,是符合一定语法规则的符号序列.,第4页, 1.1 程序与程序设计语言,一、程序是用计算机语言描述的某一问题的解决步骤,是符合一定语法规则的符号序列.,编程并不神秘,与从小母语或自然语言
2、( 一门外语)的学习有许多相似之处。,计算机语言是一种跨国界的世界通用的语言, 通过编程可以表达自己的思想,互相交流!,高级程序员可以通过一个人编写程序的风格 判断出这个人的习惯、性格。,第5页,二、程序设计语言的几个阶段包括:,指机器能识别指令的集合 CPU指令系统,由0、1序列构成的指令码组成 如:10000000 加10010000 减,用助记符号描述的指令系统 如 ADD A, BSUB A, B,面向机器的语言,程序设计是数据被加工的过程,客观世界可以分类,对象是类的实例 对象是数据和方法的封装 对象间通过发送和接受消息发生联系,程序设计关键是定义类,并由类派生对象, 1.1 程序与
3、程序设计语言,对象是一个物体, 过程是一个事情,第6页, 1.1 程序与程序设计语言,三、程序设计语言分类 高级语言: BASIC,FORTRAN,COBOL,PASCAL,Ada等面向过程(算法)的语言;(面向各对象语言VB/VC/Delphi /C+/JAVA等) 中级语言: C; 低级语言: 汇编语言,机器语言,第7页,三、语言的发展过程, 1960年出现了Algol60语言,但该语言主要面向问题,与硬件较远,故英国剑桥大学推出了CPL(Combined Programming Language), 1967年,Matin Richards对CPL进行改进、简化、推出了BCPL (Bas
4、ic Combined Programming Language), 1970年,美国贝尔实验室Ken Thomson 以BCPL为基础,再次简化推出了B语言,并写了第一个UNIX系统。,第8页, 美国贝尔实验室D.M. Ritchie 在B语言基础上设计出了C语言,并用其将UNIX系统全部改写并实现。, 经进一步改进,至1977年出现了与具体机器无关的C编译文本,从而使C语言广泛应用,各种机器皆可使用。, 1978年,美国Brain W.Kernighan与Dennis. M. Ritchie 联合出版一书The C Programming Language成为 ANSI C之基础。,第9页
5、, 1983年,美国标准化协会(ANSI) 制定了ANSI C。, ANSI C 为基础:,不同机器有不同版本,尤其是函数均应参考相应的机器。,三、语言的发展过程,第10页,BCPL语言 英国剑桥大学 Martin Richards 1967年,B语言(无类型) 美国贝尔实验室Ken Thompson 1971年,C语言(实验室版) 美国贝尔实验室 D. M. Ritchie 1972-73年,C语言(标准版) 美国贝尔实验室 Brian W. Kernighan Dennis. M. Ritchie 1978-83年,一、C语言的发展,第11页,一、C语言的发展,目前广泛流行的各种版本C语言
6、编译系统虽然基本部分是相同的,但也有一些不同。在微型机上使用的有Microsoft C、 Turbo C、BORLAND C等,它们的不同版本又略有差异。因此,大家在学习时应了解所用的计算机系统所配置的C编译系统的特点和规定,上机指导书上 Visual C+6.0 Turbo C,第12页,直接对机器硬件进行操作,如直接访问物理地址,程序可移植性好。,语法限制不十分严格,易于编程。,C语言的特点,语言简练、紧凑,使用方便、灵活 。,是一种结构化程序设计语言。,运算符/数据类型丰富、数据结构丰富。,常用符号:标识符 关键字 常量字符串 操作符 分割符 关键字: 32个。 控制语句:9种。程序书写
7、形式自由,标识符的定义 非常灵活,支持 大小写敏感。,支持结构化程序设计程序结构:顺序结构选择结构循环结构,运算符:共有34种运算符。包括:算术、赋值、强制类型转换等 数据类型:整型、实型、字符型、数组 类型、指针类型、结构类型、联合类型。,二、特点,第13页, 1.2 C语言的发展及特点,二、C语言特点,1. 简洁、紧凑、方便、灵活32个关键字,9种控制语句,主要用小写字母,压缩一切不必要成分,2. 运算符丰富除了最基本的、%等运算外,还有+、-运算符,此外还将括号、赋值、类型强制转换等均作为运算符,共有34种运算符。,第14页,3. 数据结构丰富 具有现代化语言的各种数据结构。C的数据类型
8、有整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。,4. 具有结构化的控制语句 如ifelse语句、while语句、dowhile语句、switch语句、for语句。用函数作为程序的模块单位,便于实现程序的模块化。,5. 语法限制不太严格,程序设计自由度大 对变量的类型使用比较灵活,例如整型数据与字符型数据可以通用;又如对数组下标越界不做检查.,第15页,6. 可与机器硬件打交道,直接访问内存地址,具有“ 高”、“ 低”级语言之功能。 有人把C称为“高级语言中的低级语言” 或“中级语言”,意为兼有高级和低级语言的特点,7. 生成目标代码质量高,执行效率高。,8. 可移植性优于
9、汇编语言。,第16页,1.3 算法及其描述,买电视机的步骤:,考大学上大学的步骤:,第17页,1.3.1算法概念,算法:是指在有限步内解决一个具体问题而规定的意义明确的解题步骤的有限集合。算法是解决“做什么”和“怎么做”的问题。概括地说,算法是对特定问题求解步骤的一种描述。从程序来说,也可以说算法是一个有限条指令的集合,这些指令确定了解决某一特定类型问题的运算序列。,第18页,一个程序应包括以下两方面内容: (1) 对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构(data structure)。 (2) 对操作的描述。即操作步骤, 也就是算法(algorithm)。 著名计
10、算机科学家沃思(Nikiklaus Wirth)提出一个公式程序=数据结构 + 算法,算法概念,第19页,1、 简单算法举例,可先写出这样的算法: (1)先求12,得到结果2; (2)将步骤1得到的结果再乘以3,得到结果6; (3)将6再乘以4,得到24; (4)将24再乘以5,得到120。,例: 求12345,第20页,求12345,上述算法太繁琐,我们找一种通用的表示方法。 S1:设变量t作为被乘数,t=1; s2:设变量i,代表乘数,i=2; s3:使ti,乘积放在被乘数变量t中,可表示为:t i t; s4:使i的值加1,即i+1 i; s5:如果i不大于5,返回重新执行步骤s3以及其
11、后的s4、s5;否则,算法结束。最后得到的t就是5!的值。,第21页,求13579 11 99,上述算法稍作改动: s1: 1 t; s2: 3 i; s3: t i t; s4: i+2 i s5: 若i99,返回s3;否则,结束。,第22页,求13579 11,可以看出,用这种方法表示的算法具有通用性、灵活性。S3到s5 组成一个循环,在实现算法时,要反复多次执行s3、s4、s5等步骤,直到某一时刻,执行s5步骤时经过判断,乘数i已超过规定的数值而不返回s3步骤为止。计算机实现循环是轻而易举。,第23页,求13579 11,请同学们仔细分析循环结束的条件,即s5步骤,如果在求求13579
12、11时,将s5步骤写成:s5:若I11,返回s3。这样会有什么问题?会得到什么结果?,第24页,例1,有50个学生,要求将他们之中成绩在80分以上者打印出来。 解:用n表示学生学号,n1代表第一个学生学号,ni 代表第i 个学生学号。用g代表学生成绩,gi代表第i个学生成绩,算法表示如下:,第25页,例2,S1: 1 i; S2: 如果gi80,则打印ni和gi,否则不打印。 S3: i+1 i; S4: 如果i50,返回s2,继续执行,否则算法结束。 本例中,变量i作为下标,用它来控制序号(第几个学生,第几个成绩)。当 i超过50时,表示已对50个学生的成绩处理完毕,算法结束。,第26页,例
13、 3,判断2000年-2500年中的每一年是否闰年,将结果输出。解:闰年的条件是:(1)能被4整除,但不能被100整除的年份是闰年;如1996,2004年(2)能被100整除,又能被400整除的年份是闰年。如1600,2000年。不符合这两个条件的年份不是闰年。,第27页,算法如下:设y为被检测的年份,可采取以下步骤: s1: 2000 y; s2: 若y不能被4整除,则输出y “不是闰年”。然后转到s6. S3: 若y能被100整除,又能被400整除,输出y “是闰年”,否则输出“不是闰年”。然后转到s6。 S4: 若y 能被100整除,又能被400整除,输出y “是闰年”,然后转到s6。
14、S5: 输出 y “不是闰年”。 S6: y+1 y; s7: 当y2500时,转s2继续执行,如y2500,算法停止。,第28页,题目:商店结帐,要求将当天100笔收入累加,打印出总和。写出算法:,小练习,(200)打印出100笔收入的总和。,解(1)将第一笔收入输入给计算机;,(2)将第二笔收入输入给计算机;,(3)将以上两笔收入相加;,(4)将第三笔收入输入给计算机;,(5)将它和前二笔收入的和相加;,(198) 将第100笔收入输入给计算机;,(199)将它和前99笔收入之和相加;,第29页,以上算法计算机重复执行了一些操作,引入计算机“ 循环” 的概念,算法可改写为: (1) 设“
15、计数变量” N,使N的初值为零,即N=0; (2) 设“ 累加变量” T,初值为零(T=0); (3) 输入一个数给“ 收入变量” A; (4) 将A和T的值相加,和放在变量T中,即A+TT; (5)使N的值加1,即N+1 N(N的值表示已累加的数据的个数); (6)若N100,则返回(3)继续执行,否则执行(7); (7)打印出总和T的值。,算法说明,第30页,这个算法比上一个简单明确。如果收入不是100笔而是1000笔,只需将(6)中的N100改为N1000即可。 算法中变量T的值是不断改变的,在每次循环中以一个新的值(A+T的原值)代替它的原值,然后再以T的新值作为下一次运算的基础,再求
16、出T的下一次的值,如此一次次地求下去直到达到要求为止,这种方法称为“ 迭代”,即 A+TT 。T称为迭代变量。 计算机算法的最大特点就是“ 迭代”。利用计算机高速运算的特点,执行多次循环,通过“迭代”实现各种运算。,算法总结,第31页,(1)使S=0(S作为累加变量); (2)使N=1(N代表分母); (3)S+1/N S (执行迭代,S为迭代变量); (4)N+1 N; (5)若N100,转去执行(3)以及其后的各步骤;否则执行(6); (6)打印S的值(即所求之总和)。,求下列级数的值,可以写出下面的算法,第32页,思考? 有一桶油、一个容量为5斤和一个容量为3斤的壶(没有刻度),要求打4
17、斤油并不允许使用其他容器,应该采取哪些步骤来做?,第33页,六个步骤: 1、用5斤的壶打5斤油; 2、用5斤壶中的油装满3斤壶; 3、将3斤壶中的油倒光; 4、将5斤壶中剩下的2斤油倒入3斤壶中; 5、用5斤的壶打5斤油; 6、用5斤壶中的油装满3斤壶; 结果:5斤壶中剩4斤油。,第34页,2. 算法的特点,有穷性 算法必须在有限时间内完成,必须执行有限个步骤终止。,确定性 算法的每个步骤必须明确定义,不允许模棱两可的理解,也不允许有多义性。,有零个或多个输入 所谓输入是指在需要从外界取得必要的信息。一个算法可以有多个输入,也可没有输入。,有一个或多个输出 算法的目的就是为了求解,“解”就是输
18、出,有效性(可行性)算法的每个步骤都能实现,算法执行的结果能达到预期目的。如:计算X/0,第35页,1.3.2算法的描述方法,为了表示一个算法,可以使用不同的方法。,常用的算法有:,自然语言、,传统流程图、,结构化(N-S)流程图、,伪代码、,PAD图,第36页,(1) 用自然语言表示算法,自然语言就是人们常用的语言,可以是汉语、英语或其他语言。,用自然语言表示通俗易懂;,但文字冗长,容易出现“歧义”性;,而且,用自然语言描述包含分支和循环的算法,不很方便。,一般不使用自然语言描述算法,第37页,例如:描述计算并输出z=y/x的流程,可以用自然语言描述如下: (1)输入x,y。 (2)判断x是
19、否为0:若X=0,则输出错误信息;否则计算 y/x z。 (3)输出z。,自然语言描述举例,第38页,(2) 用流程图表示算法,流程图:用一些约定的几何图形来描述算法。,传统流程图(的符号及意义),第39页,数据 平行四边形表示数据,其中可注明数据名称、来源、用途或其他文字说明。 处理 矩形表示各种处理功能。矩形内可注明处理名称或其简要功能。 特定处理 带有双竖边线的矩形。矩形内可注明特定处理名称或简要功能,表示已命名的处理。该处理为在另外地方已得到详细说明的一个操作或一组操作。 判断 菱形表示判断。菱形内可注明判断的条件。它只有一个入口,但可以有若干个可供选择的出口。 循环界限 循环界限包含
20、循环的上界和下界,中间是要循环执行的处理内容,称为循环体。循环界限由去上角的矩形(表示上界限)和去下角的矩形(表示下界限)构成。 端点 扁圆形表示转向外部环境或外部环境转入的端点符。例如,程序流程的起始点。 注解 注解是程序的编写者向阅读者提供的说明。它用虚线连接到被注解的符号或符号组上。,第40页,例: 求5!,第41页,三种基本结构是: (1)顺序结构(一条指令)按指令的顺序依次执行 (2)判断选择结构:根据判别条件有选择地改变执行流程 (3)循环结构:有条件的重复地执行某个程序块,(3) 三种基本程序结构的流程图,第42页,顺序结构程序设计,依次顺序执行程序语句,例如,令a、b的值 分别
21、为5、10;a = 5;b = 10;,a = 5;,b = 10;,第43页,判别选择结构程序设计,首先判别条件,若条件满足,程序执行a块,否则,执行b块; 举例,求a、b两个数中的最大值;,第44页,循环结构程序设计,循环又分“当型循环”和“直到型循环”,举例,求1100的累加和。int i=1,sum=0;while(i =100) sum=sum+i;i=i+1; ,第45页,(4) 用N-S流程图表示算法,全部算法写在一个矩形框内,完全去掉了带箭头的流程线。 这种流程图称为N-S结构化流程图。,N-S流程图适于结构化程序设计,第46页,顺序结构程序设计,执行a块,执行b块,依次顺序执
22、行程序语句,第47页,判别选择结构程序设计,首先判别条件,若条件满足,程序执行a块,否则,执行b块;,第48页,循环结构程序设计,循环又分“当型循环”和“直到型循环”,当条件满足时,执行循环中指令,直到条件满足为止,执行循环中的指令,例:求5!的算法用N-S图表示,t=1,i=2,t=t*i,i=i+1,直到i5,输出t值,第49页,2009年9月全国计算机等级考试二级笔试试卷,(7)软件详细设计产生的图如下: 该图是 A) N-S图 B) PAD图 C) 程序流程图 D) E-R图,第50页, 用某种程序设计语言编写的程序本质上也是问题处理方案的描述,并且是最终的描述。在一般的程序设计过程中
23、,不提倡一开始就编写程序,特别是对于大型的程序。程序是程序设计的最终产品,需要经过每一步的细致加工才能得到,如果企图一开始就编写出程序,往往会适得其反,达不到预想的结果。,(5) 用计算机语言表示算法,第51页,例题,例1.3 求5!,用C语言表示,Main ( ) int I,t; t=1; I=2; while(I=5) t=t*I; I=I+1; printf(“%d”,t); ,第52页,最后编写的程序还需要进行测试和调试,只有经过调试后的程序才能正式运行。 测试:是指通过一些典型例子,尽可能多发现程序中的错误。 调试:是指找出程序中错误的具体位置,并改正错误。 结论:测试与调试往往是
24、交替进行的,通过测试发现程序中的错误,通过调试进一步找出错误的位置并改正错误。,调试与运行,第53页, 1.4 C语言程序的基本结构,为了更好、更快地掌握C程序,我们先看几个C语言程序:,例1.4 #include main() int num; num=1;printf(“我是一台简单的“);printf(“计算机。n“);printf(“我喜欢的数字是 %d, 因为它是第一的。n“,num);,main 表示“主函数”。每一个C程序都必须有一个 main 函数。,/*标准输入输出头文件*/,第54页,输出的结果是:我是一台简单的计算机。我喜欢的数字是 1, 因为它是第一的。,第55页,例2
25、.已知三个整型数8、12、6,按公式sa+bc计算,并显示结果。#include /*标准输入输出头文件*/main()int a,b,c,s; /*定义四个整型变量*/a=8;b=12;c=6; /*变量赋初值*/s=a+b*c; /*算术运算并赋值*/printf(“s=%dn”,s); /*输出结果*/,输出结果:S=80,第56页,例3. #include main( ) /* 主函数*/ int a, b, c; /*定义变量*/scanf(“%d, %d“, /*输出c的值*/,第57页,int max(int x,int y) int z; /*max函用到的变量z,也要加以定义
26、*/if (xy) z=x;else z=y;return (z); /*将z的值返回,通过max带回调用处*/,第58页,通过分析,初步看到: 1. C程序全部由一个一个的函数构成。至少有一个主函数main ( ), 其它函数可被主函数调用或相互调用。其它函数可为C 函数库中函数,也可为自己编的函数。,上述特点称为程序的模块化.,第59页,2. 函数的构成:函数说明+函数体,函数体:变量定义与执行语句,可允许空函数:dump ( ) ,函数说明包括: 函数名、类型、属性、参数等,int max (int x,int y) int z; z=y; if (xy) z=x;return (z); ,第60页,3. 函数的执行一定从main ( )开始。尽管main ( )函数位置可自由。,4. 书写自由,一个语句可多行,一行可多个语句。,5. 每一条语句必须有一个分号;,6. C语言的输入 / 出均以函数形式出现。scanf( ), printf( ).,7. 可用/ /对C语言加注释,