1、计算机程序设计基础C语言,武汉理工大学计算机科学与技术学院主讲教师:王舜燕 教授 博士网络教学互动平台使用方法: 网络教学平台课程编号10020023,关于本课程的教学安排,本课程的教学目的:通过对C语言的学习,掌握使用计算机编程语言解决实际问题的基本理论、方法、技巧、以及常用的算法。 本课程的教学安排:教学36学时,实验20学时。 参考书: 写给大家看的C语言书 美:Greg Perry 著 谢晓刚 刘艳娟 译 人民邮电出版社 ISBN 978-7-115-21635-9 C语言教程(A Book on C) 美:Al Kelley Ira Pohl 著 徐波 译 机械工业出版社 ISBN
2、7-111-20213-9 C程序设计语言(The C Programming Language) 美 Brian W. Kernighan等著 机械工业出版社 ISBN 7-111-19626-0 C程序设计 谭浩强著 清华大学出版社 Thinking in C+ 机械工业出版社,Lets continue our C language journey !,The strategy of learning C is a step-by-step approach, first laying a sound foundation on programming concepts, flow of
3、 control, and functions. The fundamentals of C programming is a stepping stone that will prepare you to embark on the journey of learning C+ and JAVA.,You will begin to learn how to write simple C programs with primitive data types, control statements, functions, and arrays. Programming Exercises at
4、 the end of each chapter provide you with opportunities to apply the skills on your own.,The trick of learning programming is practice, practice, and practice.,第一章 概论,2011年10月 9 日,C语言之父,美国著名计算机专家Dennis Ritchie病逝,享年 70 岁。 在众多的国际互动论坛上,计算机爱好者们以特有的方式纪念这位编程语言的重要奠基人。许多网友的发帖中仅仅留下一个分号 ;,在C语言中,分号标志着一行指令语句的结束
5、。网友们以此来悼念Dennis Ritchie所引领的时代悄然远去。 虽然在C语言之后,C+、Java等各式各样计算机高级语言层出不穷,但不少程序员仍旧认为,C语言简洁、高效、灵活的特性令其具有独特魅力。“,3. 计算机语言所谓计算机语言是人类为了有效地与计算机进行信息的传递、沟通,并且能让计算机按照人类的意志进行工作而开发出的一种语言。人类使用它描述解决问题一系列步骤,计算机能够识别并执行它,以达到解决问题的目的。(1)机器语言(2)汇编语言(3)高级语言在此,请注意,计算机只能识别并执行二进制机器指令的特点并被有改变。要想计算机执行汇编程序或者高级语言程序就必须将该程序“转换”(编译或解释
6、)成机器指令程序,方可执行。,Language abstraction pyramid,1st Generation, Machine Language, 010101011,2nd G. Assembly Language,Human Language,3rd G. Structured Languages, C, Fortran,4th G. OOP Languages, C+, Java,4. 翻译方式编译程序或解释程序对高级语言程序(或汇编语言程序)进行“翻译”处理,使它成为机器指令程序,才能提交计算机执行。其核心是将高级语言(或汇编语言)转换成“机器指令程序”。下面分别介绍这两种处理
7、方式。(1)解释方式使用解释程序(Interpreter)将高级语言程序的语句逐条“翻译”成机器指令并逐条提交计算机执行,直至程序结束(如图1-5所示) 。,(2)编译方式 所谓编译方式是分两步进行的首先通过编译程序(Compiler)对整个高级语言程序进行编译,它包括翻译和查错(词法分析、语法和语义分析、生成和优化目标程序)。出现错误时,停止编译,报告错误,不生成目标程序,待修改源程序后,再进行编译,直到最终得到正确的目标程序。然后使用链接程序(Linker)对目标程序进行链接,得到可执行的程序,这时才能将可执行程序提交计算机执行(如图1-6所示)V C+ 和Turbo C 均是以编译方式进
8、行工作的。,1.2算法及其表示1.2.1算法的概念和特点 我们在使用计算机解决实际问题的时候,通常按如下步骤进行: 1. 分析问题,找出解决问题的模型。 2. 根据模型,设计出适合计算机特点的处理方法即算法。 3. 选择适合的计算机语言,进行编程以实现算法。 4. 上机编辑、调试、运行所编制的程序,得到结果。 5. 对结果进行分析,整理出文字材料即文档。,一个合理的算法具有以下特点:1. 有穷性:一个算法应该是“有限”个步骤的,而不能是“无限“个步骤的。也就是说经过有限个步骤的处理以后,算法应该结束。2. 确定性:算法中的每一个步骤的含义都是确定的、唯一的,不能具有其他的含义或可被理解成其他的
9、含义。3. 有输入:可有零个或多个输入。输入是用来在一个算法的执行过程中,向它提供处理对象(数据)或控制算法执行过程的信息的。4. 有输出:可有一个或多个输出。它是算法执行的结果的输出。没有输出的算法是一个无效的算法。5. 有效性:算法的每一步骤都可有效地执行。,1.2.2如何表示一个算法表示一个算法的方法很多,如自然语言法、传统流程图法、N-S流程图法、伪代码法等,理论上都可用来表示算法,但是效率上有很大差异。 例如:M=5!,要求M 的值。 自然语言法描述算法如下: 设定变量M,M置初值为1,设定变量I,置初值为1。 如果I的值小于6,则执行,否则执行。 将M乘以I并置于M中存放,将I中的
10、值加1并置于I中存放,再执行。 将M中的值输出。用传统流程图法描述算法如图1-7所示:用N-S流程图描述算法如图1-8所示:,结构化程序设计人们经过长期的实践,不断地总结经验,提出了结构化程序设计方法,将算法的描述归纳为三种基本结构的顺序组合,即顺序结构、选择结构、循环结构。它们的共同特点是:只有一个入口,只有一个出口,每个基本结构中的每一部分都有机会被执行,结构内部不存在死循环。使用三种基本结构描述的算法是结构化的算法,按照结构化算法编写出来的程序具有良好的可读性和可维护性。需要说明的是传统流程图使用几何图形、流程线、文字说明(见表1-1)来描述一个算法,美国学者I.Nassi和B.Shne
11、iderman在论文Flowchart techniques for structured programming提出了用N-S流程图又称盒图(三种基本结构对照表见表1-2)描述算法的方法。, Flowchart techniques for structured programming ,I.Nassi B.Shneiderman State University of New York University of Maryland,1.3 C语言基本知识 1.3.1 C语言的发展历史及特点1. C语言程序结构紧凑、语言简洁。2. C语言的数据类型丰富。3. C语言的运算符丰富,有多达44种
12、运算符,(见附录III)。4. C语言是一种结构化程序设计语言。5. C语言是处于汇编语言和高级语言之间的程序设计语言,即中级语言。6. C语言可移植性好7. C语言的语法限制不太严格。,1.3.2 C语言的标识符与关键字在C语言程序中,标识符和关键字都属于程序的基本语法单位。正确地使用标识符和关键字对于程序的编制是至关重要的。1. 标识符标识符一般是指用户或系统定义的符号名、变量名、数组名、类型名、函数名、文件名等。C语言规定标识符由字母、数字、下划线组成,必须以字母或下划线开头。大写字母小写字母被认为是不同的字符,在标识符中不能含有其它字符,也不能跨行书写。例如, 合法的标识符如下: a_
13、1 name _x123 worker World_1 _Wolf非法的标识符如下: 1abc name,1 x 123n &a12 To-me date1 Turbo C规定标识符长度不超过32个字符,超过32个字符的部分无效。,用户在定义标识符的时候应注意:不要与系统预定义的标识符或关键字相同。如:用户不要定义printf作为用户标识符,因为系统已经将其预先定义为格式输出函数的标识符,以免引起冲突。尽可能直观地定义标识符,也就是说,从所定义的标识符的字面上就能够了解其含义,以方便以后的使用。,2.关键字 C语言中的关键字又称保留字,它是由C的编译程序预定义的、具有特定含义的单词,用户不可将
14、其定义成自己的标识符使用。C的关键字有以下32个: auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while,1.3.3 C语言的基本结构1. C 语言程序由一个或多个函数组成,其中有且只有一个主函数,名为main()。2. 函数由函数说明和函数体组成。其中函数
15、名命名应符合标识符的规定,函数体应以花括弧“”开始,并以“”结束。3. 函数体由C语言的“语句”组成,每条语句必须以“;”结尾。4. C语言程序的语句书写格式自由,一行内可以写一条或多条语句,也可将一条语句 写在多行上,但关键字、标识符、字符串作为一个整体不能分写在两行上。 5. 在C语言程序中,可以在任何位置成对地使用/*和*/对程序进行注释,注释的作用是利用文字信息对程序进行说明或注解,以便人们在阅读程序时理解程序的功能,注释部分在程序的运行时不执行。 例1.3,在屏幕上显示“Hello,C!” 字符串。 main() /* 主函数 */ /* 函数体开始 */printf(Hello,
16、C!) ; /* 在屏幕上显示字符串 */ /* 函数体结束 */,main() /*主函数*/ /*主函数体开始*/int a,b,c; /*定义三个整型变量名*/printf(“Hello,C!”); /*屏幕输出字符串*/scanf(“%d%d”, /*将y的值返回*/ /*用户自定义函数的函数体结束*/,加强对C语言程序基本结构的理解,对今后的学习会有很大帮助。 建议:初学者除了注意对书本知识的学习以外,要多观察、多思考、多做自己的“作品”(不在于复杂程度,只要是自己的)、多做上机练习,坚持一段时间,培养起自己的兴趣,有了兴趣就意味着成功的开始。,第一章 C语言程序设计基础知识,1.1
17、 概述1.1.1 信息的表示1. 数制十进制:日常使用的数制。二进制、八进制、十六进制:计算机中使用的数制。,不同数制间的转换:二、八、十六进制转换成十进制的方法是-按位权法展开。例:二进制转换成八、十六进制的方法是 -分组法(三位、四位一组)。例:八、十六进制转换成二进制的方法是-直接法(直接将八、十六进制数字符号转换成二进制数字符号)。 例:十进制转换成二、八、十六进制间的方法是-整数部分除法取余,小数部分乘法取整。例:,(101.01)2=1 22+0 21+1 20+0 2-1+1 2-2=(5.25)10 小数点位置 (1a.2)16=1 161+10 160+2 16-1=(26.
18、125)10 小数点位置,(1010111.011)2=(001 010 111.011 )2 =(127.3)8(1010111.011)2=(0101 0111.0110 )2 =(57.6)16转换时应注意:分别对整数和小数部分进行分组。整数部分:从小数点开始,向左三位(四位)一组,不够三位(四位)时,高位充零。小数部分:从小数点开始,向右三位(四位)一组,不够三位(四位)时,低位充零。最后将各组数据转换成相应数制的符号即可。,(a5)16=(1010 0101 )2 建议:二、八、十六进制间的转换应利用二进制作为过渡,这样做来得简单。 例:求(a5)16的八进制表示。 (a5)16=(
19、1010 0101 )2=(010 100 101 )2=(245 )8,2 .0 最低位14,28,2 .07,2 .13,2 .11 最高位,0.125 2=0.25.0 最高位,0.25 2=0.5 .0,0.5 2=1.0 .1 最低位,数据,数值数据:二进制,非数值数据:编码,定点法,浮点法,西文:ASCII,BCD,汉字:国标码,图形,有符定点,无符定点,2. 数据的编码通常在计算机中用8个、16个、32个.等固定个数的二进制位来表示某一个数据。计算机中常见的数据分为两种即数值数据和非数值数据。,数值型数据:通常在计算机中用8个、16个、32个二进制位来表示数值型数据。小数点的位置
20、总是隐含的,以节省空间。但小数点的位置可以是固定的或可变的。前者称为定点数,后者称为浮点数。(1)定点数(在计算机中整数是按定点数格式存放的)定点数分为:有符定点数(signed)无符定点数(unsigned)。浮点数(在计算机中小数是按浮点数格式存放的),浮点数(在计算机中小数是按浮点数格式存放的)浮点数格式如下:Js jn jn-1. j2 j1 ds dm dm-1 .d2 d1 阶符 阶码 数符 尾数,字符型数据:常用的英文编码有ASCII码、BCD码ASCII 码ASCII码是英文American Standard Code for Information Interchange(美
21、国信息交换标准编码)的缩写。该编码已经国际标准化组织所采纳。目前国际上流行的是ASCII编码的七位版本,即用一个字节的低七位表示一个字符,高位充零。七个二进制位可表示128种状态,故可用来表示128个不同的字符,在ASCII编码的七位版本中表示的33个通用控制字符、95个可打印显示的字符(其中10个数字、52个大小写英文字母、33个标点符号和运算符号)。ASCII编码表(见附录I),字符型数据: 常用的中文编码有国家标准汉字编码(GB码)GB2312-80(国家标准汉字编码)是常用的汉字编码标准,它收录了6763个常用汉字。国标码使用连续的两个字节(十六位二进制位)表示一个汉字。根据这些汉字使
22、用频率的高低,分成两部分:一级汉字共3755个,即最常用的汉字。二级汉字共3008个,为次常用的汉字。 GB2312-80还收录了一些数字符号、图形符号、外文字母等。,数值数据的编码方法:前面讨论的是数值数据在计算机中的存放格式,下面讨论对数值数据进行编码的方法。原码表示法:(假定用八个二进制位表示)a=+51 (a)2=(+00110011)2 则 a原=00110011a=-127 (a)2=(-01111111)2 则 a原=11111111原码表示法在八个二进制位中的表示范围:-127a+127 +0原=00000000 -0原=10000000 要点:最高位作为符号位,若正数,则最高
23、位是0,若负数,则最高位是1。,反码表示法:(假定用八个二进制位表示)通过一个二进制整数的原码得到所谓反码:当a为正数时,a 原=a 反 ,当a为负数时,则保持a 原的符号位不变,其余各个二进制位逐位取反,即0变1,1变0。如: a=+51 a原=00110011 则 a 反 = a 原=00110011 a=-51 a原=10110011 则 a反=11001100 反码表示法在八个二进制位中的表示范围:-127a+127 +0反=00000000 -0反=11111111 要点:由原码得到反码。若正数,则反码与原码相同,若负数,则最高位不变,其余逐位取反。,补码表示法:(假定用八个二进制位
24、表示)通过一个二进制整数的反码得到所谓补码:当a0时,a 补=a 反 ,当a0时,则a 补=a 反+1,如: a=+51 a原=00110011 则 a补= a 反 = a 原=00110011 a=-51 a原=10110011 a反=11001100 则 a补=a 反+1 =11001101 补码表示法在八个二进制位中的表示范围:-128a+127 +0补=00000000 -128补=10000000 要点:由反码得到补码。若正数,则反码与补码相同,若负数,则补码等于反码加1。在补码表示法中,0的表示是唯一的,而最小值可达-128。,在上述介绍当中我们是以八位二进制位为例,同样,我们可以
25、将其推广到十六位,三十二位等二进制位中去,需要注意的是数值范围将发生变化。思考:以上介绍的原码、反码 、补码都是有符定点整数的编码方式 ,若以八位二进制位表示无符定点整数,则其范围是0到255。在Turbo C中:有符整数是按有符定点整数格式的补码表示的,无符整数是按无符定点整数格式表示的。,补码的加、减法补码的加法公式是:a 补+b 补=a+b 补补码的减法公式是:a-b 补=a 补-b 补=a 补+-b 补例1.1:a=1110=00001011原,b=510=00000101原,求a+b。因为a补=00001011, b 补=00000101补码 a+b补=00010000补 a+b反=
26、00010000反 a+b原=00010000原=1610,例1.2:-a=-1110=10001011原,b=510=00000101原,求b-a。因为-a 补=11110101, b 补=00000101补码b-a 补=b 补+-a 补=11111010补 b-a 反=11111001反 b-a 原=10000110原=-610,关于字符编码方法:要注意ASCII码和国标码应用对象的不同,ASCII码用来对英文字符编码而国标码用来对汉字进行编码。ASCII码使用一个字节(八位二进制位),国标码使用两个字节(十六位二进制位)。GB2312-80规定了用连续的两个字节来表示一个汉字,并且只用各
27、个字节的低7位,最高位未定义。这样以来就有可能与ASCII码字符产生冲突,就单个字节来说,两种编码方式都只用到字节的低七位,ASCII码规定高位充零,而国标码对高位未定义,因此,对单个字节而言,不能确定它到底是一个ASCII码字符还是一个汉字的一部分(低字节或高字节)。于是有很多为了解决这类问题的方案应运而生,变形国标码就是其中之一,并且得到了广泛的应用。它的主要特点是将国标码编码的各个字节的最高位置1,以达到区别于ASCII编码的目的。,如何理解存储在计算机中的信息计算机中各种信息都是以二进制形式存在,有的是数值,有的是ASCII码字符,有的是汉字,如何区分它们呢?这实际上取决于我们(或者程序)按照何种规则判读它们,例如:对于机器内存中连续两个字节,它们的低七位内容分别为0110000和0100001,如果它们的最高位均为1,则表示汉字“啊”,如果均为0则表示为两个ASCII码字符“0”和“!”。当然,我们还可根据不同的数值编码规则将它们判读成不同的数值。,Turbo C 集成环境的使用,Alt+Enter 全屏显示,