2019/12/19C语言程序设计1C语言程序设计张芳主编(王维强辅助设计)北京:电子工业出版社出版2019/12/19C语言程序设计2C语言程序设计CProgrammer数学信息科学学院副教授青岛大学张芳2019/12/19C语言程序设计3院楼二层软件教研室电话:13792871365EMAIL:zhangfang@qdu.edu.cn如何与老师联系?2019/12/19C语言程序设计4第一章程序设计与C语言1.1C语言概述1.2C语言的程序结构1.3术语1.4C语言的上机步骤1.5算法简介习题(一)及参考答案与解析2019/12/19C语言程序设计51.1C语言概述程序设计语言现在已经发展到了第四代。它的发展过程大体上是这样的:2019/12/19C语言程序设计6(1)机器语言也有的称为CPU的指令系统。大约在20世纪50年代,人们开始用由二进制数“0”、“1”构成的指令码编写程序。程序的可读性很差,并且难于修改、扩充和移植。因此,当时的编程人员只是极少数计算机专业技术人员,并且程序只用于特定类型的计算机和特定的用途。这也使得其运算效率是所有语言中最高的。人们习惯上把机器语言称为第一代程序语言。(2)汇编语言也称为符号语言,是用诸如:“ADD”(代表加法)、“MOV”(代表数据传送)等助记符号(一些简洁的英文字母、符号串)描述的指令系统。虽然与机器语言相比,有了较大的进步(减轻了使用机器语言编程的痛苦,人们很容易读懂并理解程序在干什么,纠错及维护都变得方便了),但仍未完全摆脱具体机型的限制,且程序的可读性比较差,也不容易修改、扩充和移植。而此时人们设计出的具有用一条指令来描述若干条指令功能的宏汇编,是程序语言发展史上的一个巨大进步。由于作为第二代程序语言的汇编语言和机器语言一样,都是面向计算机硬件的,所以它们又被称为面向机器的语言。(3)面向过程的高级语言也有人称之为算法语言,它主要面向解题的过程,这种语言接近于数学语言或人的自然语言,同时又不依赖于计算机硬件,编出的程序能在所有机器上通用。这些语言大约产生于20世纪60年代,主要有BASIC、C、FORTRAN、PASCAL和C++等,人们称之为第三代程序语言。(4)非过程化的高级语言使用过程化的语言解题。随着计算机图形学的发展,面向对象的程序设计方法和可视化软件开发越来越流行,这为非计算机专业人员提供了极大地方便。象用C语言开发的FOXBASE+等非过程化的高级语言,被称之为第四代程序语言。2019/12/19C语言程序设计7现在使用的大多数程序是用高级程序(过程)语言编写的,而C语言就是其中的“顶梁柱”。C语言是一种编译型程序语言,其前身是60年代开发的BSPC语言,当时就能够处理与机器本身数据类型相近的数据,而且具有与内存地址对应的指针处理方式。到了1970年在继承和发展BCPC语言这些特点的基础上,又提出了“B语言”,小型机的UNIX操作系统就是使用B语言记述和开发的。此后在进行UNIX操作系统的开发工作中,对B语言做了进一步完善,美国AT&T公司贝尔实验室的D.M.Ritchie在1972年推出了一种新型的程序语言,这就是C语言。自从C语言问世以来,就表现出了较强的生命力。它从最初的UNIX操作系统的记述语言,已迅速发展成为广泛应用的通用程序语言。过去仅在小型机领域中使用的C语言,随着16位和32位微机的发展和普及,正成长为微机的主要程序语言之一,当前某些机大中型中也在使用C语言。C语言有以下几个基本特点:2019/12/19C语言程序设计8(1)C语言是处于汇编语言和高级语言之间的一种记述性程序语言,又被称为中级计算机语言。中级语言并没有贬义,并不意味着它功能差,难以使用,或者比BASIC、PASCAL那样的高级语言原始,也不意味着它与汇编语言相似,会给使用者带来类似的麻烦。C语言之所以被称为中级语言,是因为它把高级语言的成分同汇编语言的功能结合起来了,也就是说C语言是比较靠近面向硬件和系统的语言,象汇编语言那样可以直接访问硬件的功能。允许对位,字节和地址这些计算机中的基本成分进行操作,又有高级语言面向用户,容易记忆,便于阅读和书写的优点。(2)C语言具有简洁的程序表示和书写格式,以及强大的功能。用C语言编写的程序往往短小精悍,功能强大,不仅可以用于科学计算、信息处理,还可以用于系统软件和应用软件的开发。(3)C语言程序具有较强的可移植性,也就是说可将编写的软件不需要做较大修改就可以从一种机型移到另一种机型上运行。由于C语言的语句中,没有依存于硬件的输入输出(I/O)语句。程序的I/O功能是通过调用I/O函数来实现的,而这些函数是由系统提供的独立于C语言的程序模块库。因此C语言本身并不依存于机器的硬件系统,从而便于在硬件结构不同的机型间实现程序的移植。(4)C语言是一种结构化的程序设计语言,即:程序的逻辑结构可以用顺序,选择和循环三种基本结构组成。(5)C语言是便于模块化软件设计的程序语言。C语言程序的函数结构,十分利于把整体程序分割成若干相对独立的功能模块,并且为程序模块间的相互调用以及数据传递提供了便利。这一特点也为把大型软件模块化,由多人同时进行集体性开发的软件工程技术方法提供了强大的支持。2019/12/19C语言程序设计9(6)C语言程序中可以使用如#define、#include等编译预处理语句,能够进行字符串或特定参数的宏定义,以及实现对外部文本文件的读取和合并。同时还具有#if、#else等条件编译预处理语句,提高了软件开发的工作效率,并为程序的组织和编译提供了便利。(7)C语言具有种类丰富的运算子。除一般高级语言中使用的“+”、“-”、“*”、“/”等四则运算以及“AND”、“OR”、“NOT”等逻辑运算符外,还可以实现以二进制位(bit)为单位的位与(&)、位或(|)、位非(~)、位异或(^)以及移位操作(,)等位运算,并且具有“a++”、“b--”等单项运算和“+=”、“-=”、“*=”、“/=”等复合运算功能。(8)C语言的数据类型丰富。基本类型有字节型(8bit),单精度整数(16bit),双精度整数(32bit)和单、双精度实数型,同时它还具有结构体和联合体(又称为共同体)两种数据类型。利用它们可以便利地处理包含着不同数据类型的复杂数据类型。因此,C语言具有较高的数据处理功能。(9)C语言程序执行效率高。试验证明,针对同一问题,用C语言编写的程序生成目标代码的质量以及执行的速度都比诸如FORTRAN、BASIC等其它高级语言编写的程序要好很多。C语言的以上特点使其得以广泛普及和应用。C语言又被称为“高级汇编语言”,使用它的趋势日益增强,最近呈现出C语言有可能取代汇编语言的发展趋向。2019/12/19C语言程序设计101.2C语言的程序结构C语言具有32个关键字(见表1.2),它们与标准C句法结合形成了程序设计语言C。表1.2C语言的关键字autobreakcasecharconstcontinutedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsightsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhileC的关键字都是小写的。在C语言中区分大、小写,如“else”是关键字,“ELSE”就不是关键字。在C语言中关键字不能用于其它目的,即不允许将关键字作为变量名或函数名使用。2019/12/19C语言程序设计11所有的C程序都是由一个或多个函数构成,其中必须只能有一个主函数“main()”,它是程序运行开始时被调用的第一个函数,无论它的位置如何。在编制完整的C代码中,“main()”实质上包含着程序要完成动作的轮廓,这个轮廓由函数调用组成。虽然从技术上讲,主函数不是C语言的一个成分,但它仍被看作是其一部分。这样,如果“main()”用作变量名,会给编译程序造成混乱。C语言程序的基本形式是:函数类型函数名(形式参数)形式参数说明;{数据说明部分;语句部分;}函数头包括函数说明、函数名和小括弧“()”中的形式参数。如果函数调用无参数传递,小括号中形式参数为空。形式参数说明指定函数调用传递参数的数据类型。函数体指大括号“{}”内的部分,包括其内使用的数据说明和执行函数功能的语句。大括号“{”和“}”表示函数体的开始和结束。C语言书写格式自由,允许一行内写若干个语句,每个语句和数据定义的后面必须跟上一个分号“;”。当然,也可以把一个语句写在若干行上。C语言中的注释语句要放在注释符“/*”与“*/”之间。在“/”与“*”之间不允许有空格,并且一般来说,注释部分允许出现在程序的任何位置。注释的目的是增加程序的可读性。因此,建议大家在编写程序时要写上必要的注释。2019/12/19C语言程序设计12例1.2.1,如下完整的C语言程序用于输出“WelcometolearningCprogram!”。/*文件名:print.c*/#includestdio.h/*插入标准I/O库的头文件*/main()/*主函数*/{printf(“WelcometolearningprogramC!\n”);/*输出语句*/}例1.2.2,如下完整的C语言程序用于输出所输入的两个在-32768到32767之间的整数中的最小者。#includestdio.h/*插入标准I/O库的头文件*/main()/*主函数*/{intx,y,z;/*声名部分,说明局部变量x,y为整型*/scanf(“%d,%d”,&x,&y);/*输入变量x,y的值*/z=min(x,y);/*调用函数min(),将得到的值赋给z*/printf(“Theminorbetween%dand%dis%d.\n”,x,y,z);/*输出结果*/}intmin(inta,intb)/*定义函数min(),返回值为整型,行参a,b为整型*/{intc;/*声明部分,说明局部变量c为整型*/if(ab);/*通过条件语句把a,b最小者赋给c*/c=b;elsec=a;return(c)/*文件名:min.c*//*返回c的值*/}2019/12/19C语言程序设计131.2.1函数库和链接从技术上讲,纯粹由程序员自己编写的语句构成C语言程序是可以的,但这也是罕见的。因为C语言在它的定义中没有执行输入、输出操作的任何方法。因此大多数C语言程序都含对C语言种种标准库函数的调用。所有的C编译程序都是和标准C函数库一起提供的,后者含有完成各种常用任务的函数。在C语言的某些实现中,函数库以一个大文件的形式出现;在另一些C语言的实现中,它却被分成几个小文件,以提高效率和实用性。为了简单起见,我们讨论函数库时,都采用单一文件形式。C编译程序的实现者已经编写了大部分常用的通用函数。当我们调用一个别人编写的函数时,编译程序“记忆”它的名字。随后,“链接程序”把我们编写的程序同标准函数库中找到的目标码结合起来,这个过程称“链接”。某些C编译程序带有自己的链接程序,有些则使用操作系统提供的标准链接程序。最初,C语言被用于系统程序设计,一个“系统程序”是一大类程序的一个部分,这一大类构成了计算机操作系统及其实用程序。通常被称之为系统程序的有:操作系统、翻译程序、编辑程序、汇编程序、编译程序和数据库管理程序。保存在函数库中的函数是可适定位的,这意味着其中机器码指令的内存地址并没绝对确定,只有偏移量是确定的,当把程序与标准函数库中的函数连接时,内存偏移量被用来产生实际地址。某些技术手册和参考书中更为详细地讲述了这一处理过程,但是,以上对适定位的了解对于运行C语言程序来说已经足够了。2019/12/19C语言程序设计141.2.2分别编译大部分以C语言编写的短程序都可以完全放于一个源文件中。然而随着程序长度的增加,编译时间也会增加,因此C允许将一个程序分解为若干块,每一个文件可单独编译,一旦所有的文件编译完毕,就可以将它们与库函数中的函数链