C语言程序设计(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-18 12:55:21

点击下载

作者:方连众

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

C语言程序设计

C语言程序设计试读:

前言

计算机应用能力是21世纪人才不可缺少的基本素质。程序设计是各专业计算机应用能力培养的重要技术基础,C语言是目前国内外广泛使用的一种程序设计语言,是国内外大学讲述程序设计方法的首选语言。

全国计算机等级考试、全国计算机应用技术证书考试和全国各地区组织的大学生计算机等级考试,都已将C语言列入了考试范围。学习C语言已成为广大计算机应用人员和青年学生的迫切愿望与要求。

教材是知识传播和能力培养的基础。本书从程序设计的实际能力培养出发,由浅入深、深入浅出,将理论与实践有机结合,融知识传播和能力培养为一体。本书内容丰富、注重实践;突出重点、分散难点;例题广泛、结合实际。此外,本书还配有相关的教育资源,读者可自华信教育资源网(www.hxedu.com.cn)免费注册下载。

本书共分10章,主要介绍了C语言程序设计基础知识、数据的存储与运算、三种结构化程序设计方法、数组、函数、指针、用户自定义数据类型和文件系统等。每章均配有典型习题,突出了实用性,强调理论与实践相结合,培养了学生的编程能力。

本书不仅可以作为本科、高职高专等高校学生C语言程序设计的教材,而且可以作为计算机等级考试的参考书和编程爱好者自学C语言的自学教材。

本书由耿姝、方连众主编,各章节的编写分工如下:第1章由吴玲编写;第2章由逯柳编写;第3章由孙毅编写;第4章由耿姝编写;第5章由王树芬编写;第6章由陈刚编写;第7章由孙玲编写;第8章由朱佳梅编写;第9章、第10章由哈尔滨理工大学刘鑫老师编写。附录由刘玉兰编写。

由于作者水平有限,书中难免存在疏漏与不妥之处,恳请同行与广大读者批评指正。

编 者

第1章 C语言概述

学习目标

● 掌握C语言程序的基础知识

● 了解C语言的结构特点

● 分析C程序的运行步骤及方法

本章重点

● 程序设计语言的相关概念

● C语言程序的结构特点

● C程序的运行步骤及方法

本章难点

● 简单C语言程序的编写

关键字

● C语言

● 系统软件

● 应用软件

● 结构特点

● 运行步骤

1.1 引言

1.1.1 计算机工作过程

世界上第一台电子数字计算机ENIAC(Electronic Numerical Integrator And Computer),由美国宾夕法尼亚大学于1946年研制成功并投入使用。

计算机的基本工作原理是存储程序和程序控制。首先需要把指挥计算机如何进行操作的指令序列(称为程序)和原始数据通过输入设备输送到计算机内的存储器中。所输入的每一条指令中明确规定了计算机从哪个地址取数、进行什么操作、送到什么地址去等信息。

计算机运行时,首先从内存中取出第一条指令,通过控制器的译码,按照指令要求,从存储器中取出数据进行指定的运算加工,然后把结果送到指定的地址中去。第一条指令完成后,接着取出第二条指令,在控制器的指挥下完成规定操作。如此,依次进行下去,直至遇到停止指令。

程序与数据一样存储在内存储器中,计算机运行时,按指令编排的顺序,一步一步地取出指令。自动地完成指令规定的操作是计算机最基本的工作原理。这一原理最初是由美籍匈牙利数学家约翰冯·诺依曼(John Von Neumann)于1945年提出来的,故被称为冯·诺依曼原理。

计算机系统由硬件系统和软件系统两大部分组成。冯·诺依曼奠定了现代计算机的基本结构,这一结构又称冯·诺依曼结构,如图1-1所示。其特点是:(1)使用单一的处理部件来完成计算、存储及通信工作。(2)存储单元是定长的线性组织。(3)存储空间的单元是直接寻址的。(4)使用低级机器语言,指令通过操作码来完成简单的操作。(5)对计算进行集中的顺序控制。(6)计算机硬件系统由运算器、存储器、控制器、输入设备和输出设备五大部件组成,并规定了它们的基本功能。(7)采用二进制形式表示数据和指令。(8)在执行程序和处理数据时,必须将程序和数据从外存储器装入主存储器中,这样计算机在工作时,才能够自动地从存储器中取出指令并加以执行。图1-1 冯·诺依曼结构1.1.2 程序设计语言概述

程序是为解决特定问题,由用某种计算机语言编写的指令构成的序列。如果把解决每一个问题的“解决方案及其实施方法”视为一篇文章,那么这篇文章的计算机语言表达就是程序。

程序设计语言是人与计算机进行信息交流的一种工具。程序设计语言的发展过程如 图1-2所示。图1-2 程序设计语言的发展

计算机程序是表达计算机解决问题的步骤方案,它的表现形式为计算机指令序列。机器语言程序是计算机机器指令序列。CPU指令系统由二进制代码0和1按一定规则构成的指令码的集合,如10000000表示加,10010000表示减。

汇编语言程序是汇编指令序列,用助记符号来描述,如ADD A,B。机器语言和汇编语言都是面向机器的语言,属于低级语言;而高级语言又分为面向过程和面向对象两种,前一种程序设计是数据被加工的过程,后一种程序设计的关键是定义类,并由类派生对象。对象是类的实例,是数据和方法的封装,对象间通过发送和接收消息产生联系。

C语言程序是用C语句描述的计算机解决问题的步骤方案。表达形式为C语句序列。

1.2 C语言简介

1.2.1 C语言的发展史

C语言源自BCPL语言。

1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是产生了BCPL(Basic Combined Programming Language)语言。

1970年,美国贝尔实验室的Ken Thompson以BCPL语言为基础,设计出了很简单且很接近硬件的B语言(取BCPL的首字母),并且他用B语言编写了第一个UNIX操作系统。

1972年,美国贝尔实验室的 D.M.Ritchie在B语言的基础上,最终设计出了一种新的语言,他取BCPL的第二个字母作为这种语言的名字,即C语言。

为了使UNIX操作系统得以推广,1977年Dennis M.Ritchie发表了不依赖于具体机器系统的C语言编译论文——《可移植的C语言编译程序》。

1978年,C语言由美国电话电报公司(AT&T)贝尔实验室正式发布。同时,B.W.Kernighan和D.M.Ritchie合著了著名的The C Programming Language一书,通常简称为K&R,也有人称之为K&R标准。但是,在K&R中并没有定义一个完整的C语言标准,后来由美国国家标准学会(American National Standards Institute)在此基础上制定了一个C语言标准,于1983年发布,人们通常称之为ANSI C。

K&R的第一版在很多语言细节上也不够精确,对于pcc这个“参照编译器”来说,它日益显得不切实际;K&R甚至没能很好表达它所要描述的语言,把后续扩展扔到了一边。C在早期项目中的使用受商业和政府共同支配,这就意味着一个认可的正式标准是必需的。因此,在M.D.Mcllroy的催促下,ANSI于1983年夏天,在CBEMA的领导下建立了X3J11委员会,目的是制定一个C标准。X3J11在1989年末提出了一份报告[ANSI 89],后来这个标准被ISO接受为ISO/IEC 9899-1990。1994年,ISO又修订了C语言的标准。

1995年,ISO对C 90做了一些修订,即“1995基准增补1(ISO/IEC/9899/AMD1:1995)”。1999年,ISO再次对C语言标准进行修订,在基本保留原来C语言特征的基础上,根据需要,增加了C++中的一些功能,命名为ISO/IEC9899:1999。2001年和2004年又先后进行了两次技术修正。

目前流行的C语言编译系统大多是以ANSI C为基础进行开发的,但不同版本的C编译系统所实现的语言功能和语法规则又略有差别。

2011年12月,ISO正式公布了C语言新的国际标准草案ISO/IEC 9899:2011。新的标准草案提高了对C++的兼容性,并将新的特性增加到了C语言中。新功能包括支持多线程,基于ISO/IEC TR 19769:2004规范下支持Unicode,提供更多用于查询浮点数类型特性的宏定义和静态声明。1.2.2 C语言的特点

C语言之所以发展如此迅速,并且成为最受欢迎的语言之一,主要是因为它具有强大的功能。许多著名的系统软件,如DBASE III PLUS、DBASE IV 都是用C 语言编写的。使用C 语言时,加入一些汇编语言子程序,更能显示C语言的优势,如PC-DOS、WORDSTAR等就是用这种方法编写的。归纳起来,C语言具有下列特点。(1)C语言是中级语言

C语言通常称为中级计算机语言,它将高级语言的语句和基本结构与低级语言的实用性结合起来。中级语言没有贬义,不意味着它功能差、难以使用,或者比BASIC、Pascal那样的高级语言原始,也不意味着它与汇编语言相似,会给使用者带来类似的麻烦。C语言之所以被称为中级语言,是因为它把高级语言的成分同汇编语言的功能结合起来了。

作为中级语言,C允许对位、字节和地址这些计算机功能中的基本成分进行操作。C语言程序非常容易移植。可移植性是指某种计算机写的软件可以用到另一种机器上。举例来说,如果为苹果机写的一个程序能够方便地在IBM PC上运行,则称这个程序是可移植的。

所有的高级语言都会使用到丰富的数据类型。一个数据类型定义了一个变量的取值范围和可对其进行操作的一组运算。常见的数据类型有整型、字符型和实数型。虽然C语言有五种基本数据类型,但与Pascal或Ada相比,它却不是强类型语言。C程序允许几乎所有的类型相互之间进行转换。例如,字符型和整型数据能够自由地混合在大多数表达式中进行运算。这在强类型高级语言中是不允许的。

C语言的另一个重要特点是,构成其命令的关键字仅有32个,而IBM PC的BASIC包含的关键字多达159个。(2)C语言是结构式语言

虽然从严格的学术观点上看,C语言是块结构(block-structured)语言,但是它还是通常被称为结构化语言,这是因为它在结构上类似于ALGOL、Pascal和Modula-2。从技术上讲,块结构语言允许在过程和函数中定义过程或函数。用这种方法,全局和局部的概念可以通过“作用域”规则加以扩展,“作用域”管理变量和过程的可见性。因为C语言不允许在函数中定义函数,所以不能称之为通常意义上的块结构语言。

结构化语言的显著特征是,代码和数据分离。这种语言能够把执行某个特殊任务的指令和数据从程序的其余部分分离出去,隐藏起来。获得隔离的一种方法是调用使用局部(临时)变量的子程序。通过使用局部变量,我们能够写出对程序其他部分没有副作用的子程序。这使得编写共享代码段的程序变得十分简单。如果开发了一些分离很好的函数,在引用时我们就仅需要知道函数做什么,而不必知道它如何做。切记:过度使用全局变量(可以被全部程序访问的变量)会由于意外的副作用而在程序中引入错误。

结构化语言比非结构化语言更易于程序设计,用结构化语言编写的程序的清晰性使得它们更易于维护,这已是人们普遍接受的观点。C语言的主要结构成分是函数——C的独立子程序。

在C语言中,函数是一种构件(程序块),是完成程序功能的基本构件。函数允许一个程序的诸多任务被分别定义和编码,使程序模块化。可以确信,一个好的函数不仅能正确工作,而且不会对程序的其他部分产生副作用。(3)C语言功能齐全

C语言具有各种各样的数据类型,并引入了指针的概念,可使程序效率更高。另外,C语言也具有强大的图形功能,支持多种显示器和驱动器。而且计算功能、逻辑判断功能也比较强大,可以实现决策目的。

指针是C语言的一大特色,可以说是C语言优于其他高级语言的一个重要原因。因为C语言中有指针,所以可以直接进行靠近硬件的操作,但因为C语言的指针操作不做保护,因此也给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针操作的同时,又增强了安全性,所以受到了一些用户的支持,但由于这些改进增加了语言的复杂度,因此也为另一部分用户所诟病。Java则吸取了C++的教训,取消了指针操作,也取消了C++改进中的一些备受争议的地方,在安全性和适合性方面均取得了良好的效果,但其本身的解释在虚拟机中运行,运行效率低于C/C++。一般而言,C、C++、Java被视为同一系的语言,它们长期占据着程序使用语言榜的前三名。(4)C语言适用范围广

C语言还有一个突出的优点,即适用于多种操作系统,如DOS、UNIX,也适用于多种机型。1.2.3 C语言的应用

C语言是一种计算机程序设计语言,既具有高级语言的特点,又具有汇编语言的特点。它由美国贝尔实验室的D.M.Ritchie于1972年推出。1978后,C语言已先后被移植到大、中、小及微型机上。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖于计算机硬件的应用程序。它的应用范围广泛,具有很强的数据处理能力,不仅适用于软件开发,而且适用于在各类科研中编写系统软件,绘制二维或三维图形并制作动画等,同时,还适用于类似单片机及嵌入式系统等的具体开发。

1.3 简单的C程序

1.3.1 简单的C程序举例

为了说明C语言源程序结构的特点,先看以下几个程序。这几个程序由简到难,表现了C语言源程序在组成结构上的特点。虽然有关内容还未介绍,但可从这些例子中了解到组成一个C语言源程序的基本部分和编写程序时所应遵循的书写格式。【例1.1】

〖运行结果〗

程序分析main是主函数的函数名,表示这是一个主函数。每一个C语言源程序都必须有且只能有一个主函数(main函数);printf函数是一个由系统定义的标准函数,可在程序中直接调用,它的功能是把要输出的内容输出并显示在显示器上。【例1.2】

〖运行结果〗

程序分析该程序的功能是从键盘输入两个整数x和y,并对其求和,然后输出结果。在main()之前的一行称为预处理命令。预处理命令还有其他几种,这里的include称为文件包含命令,其意义是把尖括号<>或引号""内指定的文件包含到本程序中,成为本程序的一部分。被包含的文件通常是由系统提供的,其扩展名为.h,因此也称为头文件或首部文件。C语言的头文件中包括了各个标准库函数的函数原型。因此,程序调用一个库函数时,必须包含该函数原型所在的头文件。在本例中,使用了两个库函数:输入函数scanf和输出函数printf。scanf和printf是标准输入/输出函数,其头文件为stdio.h,在主函数前用include命令包含了stdio.h文件。

需要说明的是,C语言规定对scanf和printf这两个函数可以省去对其头文件的包含命令。所以在本例中,也可以删去第一行的包含命令#include。同样,例1.1中虽然使用了printf函数,但也省略了包含命令。

本例的主函数又分为两部分,一部分为说明部分,另一部分为执行部分。说明部分是指变量的类型说明。例1.1中未使用任何变量,因此无说明部分。C语言规定,源程序中所有用到的变量都必须先说明后使用,否则将会出错。这是编译型高级程序设计语言的一个特点,与解释型的BASIC语言有所不同。说明部分是C语言源程序结构中很重要的组成部分。本例中使用了三个变量x、y、s,用来表示输入的自变量和输出的值。执行部分的第一行是输出语句,调用printf函数在显示器上输出提示字符串,请操作人员输入自变量x和y的值。第二行为输入语句,调用scanf函数,接受键盘上输入的数并存入变量x和y中。第三行是求x和y的和并将结果送到变量s中。第四行是用printf 函数输出变量s的值,即x和y的和。程序结束。【例1.3】

〖运行结果〗

程序分析:程序由两个函数组成:主函数和max函数。函数之间是并列关系,可从主函数中调用其他函数。max函数的功能是比较两个数,然后把较大的数返回给主函数。max 函数是一个用户自定义函数。因此在主函数中要给出说明(程序第三行)。可见,在程序的说明部分中,不仅可以有变量说明,还可以有函数说明。关于函数的详细内容,将在后面的章节中详细介绍。在程序的每行后用/*和*/括起来的内容为注释部分;注意,程序不执行注释部分。

程序的执行过程是,首先在屏幕上显示提示串,请用户输入两个数,回车后由scanf函数语句接收这两个数并送入变量x、y中,然后调用max函数,并把x、y 的值传送给max函数的参数a、b。在max函数中比较a和b的大小,把大者返回给主函数的变量z,最后在屏幕上输出z的值。1.3.2 C程序的格式和结构特点

综合上述三个例子,我们对C语言程序的程序结构有了一个初步了解。(1)C程序由函数构成,C是函数式的语言,函数是C程序的基本单位。

① 一个C语言源程序可以包含一个main函数和若干其他函数,也可以只包含一个main函数。函数是C程序的基本单位。

② 被调用的函数可以是系统提供的库函数,也可以是用户根据需要而设计编写的函数。C是函数式的语言,程序的全部工作都是由各个函数来完成的。编写C程序就是编写一个个函数。

③ C函数库非常丰富,ANSI C提供100多个库函数,Turbo C提供300多个库函数。(2)main函数(主函数)是每个程序执行的起始点。

一个C程序总是从main函数开始执行,而不论main函数在程序中的位置。main函数可以出现在程序的任意地方。(3)源程序中可以有预处理命令,预处理命令通常应放在源文件或源程序的最前面。(4)一个函数由函数首部和函数体两部分组成。

① 函数首部:一个函数的第一行。

返回值类型 函数名([函数参数类型1 函数参数名1],[函数参数类型2,函数参数名2])

注意:函数可以没有参数,但是函数名后面的一对()不能省略,这是规定的格式。

② 函数体:函数首部以下用{}括起来的部分。如果函数体内有多个{},则最外层是函数体的范围。函数体一般包括声明和执行两部分。(5)C程序书写格式自由

① 一行可以写几条语句,一条语句也可以写在多行上。

② C程序没有行号,也不像FORTRAN、COBOL那样严格规定语句必须从某一列开始。

③ 每条语句的最后必须有一个分号,表示语句的结束。(6)为提高程序的可读性,可以使用/*…*/(可换行写)或者//…(不可换行写)对C程序中的任何部分进行注释,编程人员应该养成使用注释的良好习惯。

① 实践中,一个好的程序往往是需要经过多次修改和完善的。很多人会发现自己编写的程序由于缺乏必要的文档和注释,过一段时间后,连自己都需要花费大量时间去重新思考和理解原来的程序。如果一开始就养成对程序进行注释的良好习惯,会为日后节省大量的时间。

② 一个实际的系统往往是由多人合作共同开发的,程序的文档和注释是相互之间交流的重要工具。(7)C语言本身不提供输入/输出语句,输入/输出操作是通过调用库函数scanf和printf来完成的。

输入/输出操作与具体计算机硬件有关,把输入/输出操作放在函数中处理,可以简化C语言和C的编译系统,便于C语言在各种计算机上实现。不同的计算机系统需要对函数库中的函数做不同的处理,以便实现同样或类似的功能。

不同的计算机系统除了提供函数库中的标准函数外,还按照硬件的情况提供一些专门的函数。因此不同计算机系统提供的函数数量和功能会有一定差异。(8)在C语言中,大小写字母是有区别的,C 语言通常使用小写字母。(9)从书写清晰,便于阅读、理解和维护的角度出发,在书写程序时一般应遵循以下规则:

① 一个说明或一条语句占一行。

② 用{}括起来的部分,通常表示程序的某一层次结构。{}一般与该结构语句的第一个字母对齐,并单独占一行。

③ 低一层次的语句或更低层次的语句缩进若干格后书写,以便看起来更加清晰,增加程序的可读性。

1.4 运行C程序的步骤与方法

1.4.1 Turbo C 2.0简介

1.Turbo C的产生与发展

Turbo C是美国Borland公司的产品,Borland公司是一家专门从事软件研制和开发的大公司。该公司相继推出了一系列很受用户欢迎的Turbo软件,如TurboBASIC、Turbo Pascal、Turbo Prolog。该公司在1987年首次推出产品Turbo C 1.0,其使用了全新的集成开发环境,所使用的一系列下拉式菜单和对文本编辑、程序编译、连接以及程序运行进行的一体化设计等,都大大地方便了程序的开发。1988年,Borland公司又推出Turbo C 1.5版本,增加了图形库和文本窗口函数库等。Turbo C 2.0是该公司于1989年推出的。Turbo C 2.0在原来集成开发环境的基础上,增加了查错功能,并实现了在Tiny模式下直接生成.COM文件的功能。在Turbo C 2.0环境下,还可对数学协处理器进行仿真。

Borland公司后来又推出了面向对象的程序软件包Turbo C++,它继承和发展了Turbo C 2.0的集成开发环境,并融入了面向对象的基本思想和设计方法。

1991年,为了适用于Microsoft公司的Windows 3.0版本,Borland公司又将Turbo C++进行了更新,不久,Turbo C 的新一代产品Borland C++也问世了。

2.Turbo C 2.0的基本配置要求

Turbo C 2.0可运行于IBM-PC系列微机上,包括XT、AT和IBM 兼容机。但需要DOS 2.0或更高版本的支持,并需要至少448 KB的RAM。Turbo C 2.0可在任何彩色或单色80列监视器上运行。Turbo C 2.0还支持数学协处理器芯片,可进行浮点仿真,加快了程序的执行速度。

3.Turbo C 2.0内容简介

Turbo C 2.0包括以下主要文件:

INSTALL.EXE 安装程序文件

TC.EXE 集成编译

TCINST.EXE 集成开发环境的配置设置程序

TCHELP.TCH 帮助文件

THELP.COM 读取TCHELP.TCH的驻留程序

README 关于Turbo C的信息文件

TCCONFIG.EXE 配置文件转换程序

MAKE.EXE 项目管理工具

TCC.EXE 命令行编译

TLINK.EXE Turbo C系列连接器

TLIB.EXE Turbo C系列库管理工具

C0?.OBJ 不同模式启动代码

C?.LIB 不同模式运行库

GRAPHICS.LIB 图形库

EMU.LIB 8087仿真库

FP87.LIB 8087库

*.H Turbo C头文件

*.BGI 不同显示器图形驱动程序

*.C Turbo C例行程序(源文件)

其中,上面的?分别为:

T Tiny(微型模式)

S Small(小模式)

C Compact(紧凑模式)

M Medium(中型模式)

L Large(大模式)

H Huge(巨大模式)1.4.2 Turbo C环境下C程序的运行

为了使计算机能按照人们的意志工作,就需要根据问题的要求,编写相应的程序。程序是一组计算机可以识别和执行的指令,每一条指令指使计算机执行特定的操作。程序可以用高级语言或汇编语言编写,用高级语言或汇编语言编写的程序称为源程序。C语言源程序的扩展名为“.c”。事实上,我们编写的程序,不管采用什么计算机语言,都是源程序,现在很少有人用机器语言去编程!源程序不能直接在计算机上执行,需要用“编译程序”将源程序翻译为二进制形式的代码。

源程序经过“编译程序”翻译所得到的二进制代码称为目标程序。目标程序的扩展名为“.obj”。目标代码尽管已经是机器指令,但还不能运行,因为目标程序还没有解决函数调用问题,需要将各个目标程序与库函数连接,才能形成完整的可执行程序。

目标程序与库函数连接后,形成的完整的可在操作系统下独立执行的程序称为可执行程序。可执行程序的扩展名为“.exe”(在DOS/Windows环境下)。

1.启动TC(执行TC.exe文件)

进入Turbo C 2.0集成开发环境后,显示如图1-3所示的界面。图1-3 Turbo C 2.0集成开发环境

2.建立与编辑C源程序

选择主菜单中File,或直接使用快捷键Alt+F,可打开编辑窗口。在编辑窗内建立一个名为“NONAME.c”的空白文件;选择Load或直接按F3键,会在屏幕上弹出一个文件名框,输入要打开的文件名后,系统便可依据文件名打开指定的文件,若磁盘上保存有该文件,则直接打开;若磁盘上没有以该文件名命名的文件,系统便会以该文件名建立一个新文件。如果在文件名框中输入的文件名是“*.c”,屏幕上就会出现一个列表框,其中会列出当前目录下所有扩展名为“.c”的文件,使用光标移动键可以从中方便地选取所需打开的文件。

编辑好的程序可以作为磁盘文件保存到磁盘中,保存文件时可选用File菜单中的Save命令,或直接使用F2键来实现。

3.编译和连接C程序

编译源程序应选择编译菜单中的Compile to OBJ,它可以对编辑窗内的源程序进行编译,生成与源程序同名的目标文件(扩展名为.obj)。接着再选择Link EXE file,将当前编译生成的目标文件与库文件等连接,生成与目标文件同名的可执行文件(扩展名为.exe)。

还可以直接选择编译菜单中的Make EXE file,将编译、连接操作过程合并,一次性地连续完成编译、连接过程,直接生成可执行文件。

4.运行程序

选择Run菜单中的Run命令,或直接使用Ctrl+F9组合键,即可运行上述可执行文件。如果源程序正确,这时即可得到其执行结果,查看程序执行结果可直接使用Alt+F5组合键。

5.查找与修改错误

在编译、连接过程中,C编译系统会自动进行语法检查。如果发现程序中存在错误,就会在信息窗口中显示出有关出错信息。它不仅指出错误的位置,还说明错误的性质和原因。

按照窗口下部的提示,运用相应的命令对源程序进行编辑并修正程序错误,然后重复步骤2,如此循环反复,直至得出正确结果。

以上过程如图1-4和图1-5所示。图1-4 C程序执行步骤图1-5 C程序运行过程1.4.3 VC 6.0的启动

可以用任何一种编译系统对C语言程序进行编辑、编译和运行,依用户方便而行。Turbo C 2.0的集成开发环境是用于DOS环境的,功能精简,使用简单,但是界面相对比较单一。而Microsoft的Visual Studio中提供的Visual C++(通常简称VC)是一个可视化的集成开发环境,使用方便,功能强大,也是当前商业应用的首选开发环境。

启动VC++的方法如下。选择“开始”→“程序”→“Microsoft Visual Studio 6.0”→“Microsoft Visual C++6.0”,打开VC的环境界面,如图1-6所示。图1-6 VC环境界面

新建文件窗口如图1-7所示。图1-7 新建文件

编译、连接、运行程序菜单如图1-8所示。图1-8 编译、连接及运行

本章所有程序都是在Turbo C 2.0环境下运行的,若要在VC环境下运行,请读者自行完成。

本章小结

本章主要是C语言程序的入门学习,总结了C语言程序的发展史、特点及应用,并且通过三个简单的程序来熟悉理解C语言程序的结构特点,最后分析了C程序常用的Turbo C 和VC两种运行方法。

习题

一、填空题

1.C程序是由()构成的,一个C程序中至少包含()。

2.C程序注释是由()和()所界定的文字信息组成的。

3.函数体一般包括()和()。

二、判断题

1.一个C程序的执行总是从该程序的main函数开始,在main函数最后结束。()

2.main函数必须写在一个C程序的最前面。()

3.一个C程序可以包含若干函数。()

4.C程序的注释部分可以出现在程序的任何位置,它对程序的编译和运行不起任何作用,但是可以增加程序的可读性。()

5.C程序的注释只能是一行。()

6.C程序的注释不能是中文文字信息。()

7.C程序的一条语句只能写在一行上。()

8.可以使用Turbo C来编译、连接和运行一个C程序。()

9.只能使用Turbo C来运行一个C程序。()

10.Turbo C环境下查看运行结果要使用Ctrl+F9键。()

三、简答题

1.解释以下名词:

冯·诺依曼原理 程序设计语言 计算机程序 机器语言 汇编语言

C语言 源程序 目标程序 可执行程序

2.简要叙述使用Turbo C 2.0编译和运行一个程序的步骤。

四、编程题

1.参照例1.1,试编写一个C程序,并运行输出如下信息:“This is my first”。

2.参照例1.3,试编写一个C程序,比较三个数的大小,输出其最大值。

第2章 数据的存储与运算

学习目标

● 重点掌握数据在计算机中是怎样存储的及数据的类型

● 熟练运用各种运算符及表达式

本章重点

● 数据类型、算术运算符和算术表达式

● 各种C运算符与表达式

本章难点

● 数据类型的区分

● 运算符的优先级别

关键字

● int

● float

● char

● define

2.1 数据的表现形式

在C语言中,数据用不同的类型来表示,高级语言中提供了丰富的数据类型。那么为什么要区分数据的类型呢?就像人要区分性别一样,数据也要区分类型。数据区分类型的主要目的是,便于对它们按不同的方式和要求进行处理。在C语言源程序中,每个数据有着单一的、确定的、具体的类型。程序的最终目的是处理数据,而数据是以特定的形式(如整数、实数、字符等)存在的,不同的数据之间还存在着某种联系(如一个整数数组是由若干整数组成的),我们所说的数据结构就是数据的各种特定形式(数据的组织形式)。而数据类型就是各种数据结构的表现形式。不同类型的数据在表示的形式、合法的取值范围、占用的存储空间等方面不同(占用存储空间与所使用的计算机的类型相关)。

2.1.1 常量和变量

在C语言中,数据有两种表现形式:常量和变量。

常量的意思就是不可改变的量,是一个常数。变量用一个名字代表,具有一定的属性且占用一定的存储单元。常量同变量一样,分为整型、浮点型、字符型,还有字符串、转义字符和地址。下面让我们具体了解常量与变量。(1)常量

在C程序的执行过程中,常量的值不能改变。实际上,常量即常数。

例如,下面的数据都是常量:

67、0、-15、3.14(2)符号常量

有时,为了使程序更加清晰及便于修改,或者数值过长,影响代码长度,就可以用一个标识符来代表常量,也就是给某个常量取一个有意义的名字,这种常量称为符号常量。

符号常量在使用前必须先定义,定义的形式是:

#define 符号常量名 常量

这里用#define指令指定一个符号名称代表一个常量。#define是C语言的预处理命令,它表示经定义的符号常量在程序运行前将由其对应的常量替换。【例2.1】宏定义。

程序分析:

这里定义PI、TRUE、FALSE、STAR为符号常量,其值分别为3.1415926、1、0、‘*’。例如第一条指令,经过这样的指定后,此后程序中出现的PI都代表数值3.1415926,它可以和常量一样进行运算,实际上在编译之后,符号常量就全部变成字面常量3.1415926。这种用一个标识符代表的一个常量符号,称为符号常量。需要注意的是,符号常量也是常量,它的值在其作用域内不能再改变或赋值。如果出现下列语句给PI赋值:

就为错误的形式。

使用符号常量对程序的编写及运用有一定的优点:

●“见名知意”。在定义符号常量名时,应考虑增强程序的可读性,例如:

很容易让读者明白其中的PI代表圆周率。

●“一改全改”。当程序中多处要用到同一个常量时,可以只改一处,其他都会全部改变,而不用一一去改。例如在程序中要多次用到某商场的购物金额,如果金额用常数 100 来表示,当购物金额改变为200 时,我们就需要在程序中多处进行修改。若用符号常量AMOUNT来表示金额,这样便只须修改一处即可。

定义符号常量的几点注意事项:

● 符号常量遵循标识符的命名规则。一般情况下,我们习惯将符号常量用大写字母来表示,变量名用小写字母表示,以示区分。

● 宏定义预处理命令,不是C语句,不必在末尾加分号(在C语言中由#开头的都是命令)。(3)变量

什么是变量?简而言之,变量是存储数据的值的空间。

变量名字实际上是一个符号地址,在对程序进行编译连接时由系统给每一个变量名分配一个内存地址,在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。

由于数值的类型有多种,有整数、小数(浮点数)、字符等,那么对应的变量就有整型变量、浮点型变量、字符型变量。变量还有其他的具体分类,整型变量还可具体分为无符号型、长整型和短整型。浮点型变量也可分为单精度型、双精度型和长双精度型。此外还可以分为静态变量、外部变量、寄存器变量和自动存储变量。这些数据类型我们在本节和后面的章节中都会陆续介绍。

① 变量的说明形式

C程序中规定所有变量在使用前都必须加以说明。在定义变量时,要指定该变量的名字和类型。每个变量都应该有名字,在内存中占据一定的存储单元,以便被引用,变量一般放在函数体的开头部分。要区分变量名和变量值是两个不同的概念。我们可以把变量理解成教学楼内的一间教室,教室门牌号就是变量名,教室内的学生可以理解为变量值,如图2-1所示。图2-1 变量存储示意图

一条变量说明语句由数据类型和其后的一个或多个变量名组成。变量说明的形式如下:

类型说明符 变量名;

也可以是

类型说明符 变量1, 变量2,…,变量n;【例2.2】定义变量。

因为变量要先定义再使用,所以我们将变量的说明部分放在使用变量之前,而且使用变量名必须与所定义变量名一致,如下例所示。【例2.3】定义及使用变量。

程序分析:

系统会这样提示“Undefined symbol‘sam’in function main”错误。

从上述内容我们知道,要给每个变量起名字,起名时有一定的要求。这个名字我们叫做标识符。

② 标识符

在程序中使用的变量名、函数名、标号等统称为标识符。除了库函数的函数名由系统定义外,其余都由用户自定义。也就是说,标识符分为系统预定义标识符(特定字)和用户自定义标识符。

系统预定义标识符是系统预先定义好的表示一定意义的标识符。在后面章节的学习中,将讲到系统提供的系统函数,系统函数名就是典型的系统预定义标识符,如我们之前介绍的主函数名main、输入/输出库函数名等。

用户自定义标识符(人们习惯称为标识符,在本书提到的标识符都为用户自定义标识符),是用户自己定义用来标示变量、常量、数据类型和函数的字符序列。它有着一定的命名规则。

C语言中规定标识符的命名规则如下:

● 标识符只能由字母、数字和下画线三类字符组成。

● 第一个字符必须是字母或下画线。

● 大写字母和小写字母被认为是两个不同的字符,如A和a是两个不同的标识符。

● 标识符可以任意长,但只有前32位有效。

● 标识符不能是C的关键字。

以下标识符是合法的,可以作为变量名:

a,max,Max,average,student_name,X3,_above

以下标识符是非法的,不能作为变量名:

7s 以数字开头

S#v 出现非法字符#

-x3 以减号开头

Boy-1 出现非法字符减号

n.y 出现非法字符.

需要注意的几点如下:

系统将区分大写字母和小写字母,将它们定义为不同的字符。因此,上面的max和Max是两个不同的变量名。

标识符虽然可以由程序员随意定义,但标识符用于表示某个量的符号,因此命名应尽量有相应的意义,以便于阅读理解。为增加可读性,变量名一般用小写字母表示。

③ 关键字

上面的规则中,有个关键字的概念。什么叫关键字呢?

关键字又称为保留字,是C语言设计开发时保留一部分单词表示特定的含义。关键字是C语言本身某些特性的一个表示,是唯一代表某一个意思的。例如关键字int表示整型。

下面列出C语言中的关键字,这些关键字在以后的学习中基本上都会用到,后续章节将会详细介绍。

auto_bool break case char_complex const continue default

do double else enum extern float for goto if_Imaginary inline

int long register restrict return short signed sizeof static

struct switch typedef union unsigned void volatile while

标识符不能是C语言中的关键字,所以在以后的学习中,在给变量命名时要避开这些关键字。

2.2 数据类型

上述内容体现了在定义变量时需要指定变量的类型。例如,前面例题中指出的int表示数据是整型,float表示数据是单精度实型。C语言中要求在定义变量时都要指定变量的类型,无论是常量还是变量都要区分数据类型。

C语言中允许使用的数据类型如图2-2所示。其中,整型、字符型、浮点型和空类型由系统预定义,又称为标准类型。图2-2 C语言的数据类型

基本类型的数据又可分为常量和变量,它们与数据类型结合起来进行分类。本章主要介绍基本数据类型,其他数据类型将在后续章节中详细介绍。2.2.1 整型数据(1)整型常量

整型常量就是整型常数,也称为直接常量。在计算机中,数据是以二进制补码形式存储的。在C语言中,为了方便地表示与使用数据,采用十进制、八进制、十六进制三种形式。编译系统会自动将各种进制的数据转换为二进制的形式进行存储。

十进制整型常量与我们日常生活中所使用的形式基本相同,数码由0~9组成,数字前可以带正负号。

八进制整型常量必须以数字0开头,数码由0~7组成,例如0321表示八进制数321。

十六进制整型常量以数字0和字母X即0X或0x开头,数码由0~9、A~F(大小写均可)组成,例如0Xb6、0x12分别表示十六进制数b6、12。(2)整型变量

整型变量分为有符号整型和无符号整型两种。根据变量在计算机中所在占存储空间的不同,分为基本整型、长整型和短整型。图2-3所示为整型变量类型说明符。图2-3 整型变量类型说明符

在C语言中,无符号数signed通常被省略,其中长整型、短整型的int也可以省略。不同的数据类型在计算机中所占的存储空间不同,数据所表示的范围也不同。表2-1列出了各类整型量所分配的内存字节数及数的表示范围。表2-1 整型变量的字节数及数的表示范围

如表2-1所示,不同编译系统给不同类型分配了不同的存储空间。例如,系统在编译时,分配给int型数据2个字节或4个字节,这由具体的C编译系统决定,例如Turbo C 2.0为每个整型数据分配2个字节,Visual C++为每个整型数据分配4个字节。编写程序时需要注意,当整型变量的实际数值大于其所能容纳的最大数值时,就会发生“溢出”,但运行时并不报错。2.2.2 字符型数据

字符型数据包括字符常量、字符串常量和字符变量。(1)字符常量

字符常量是指用一对单引号括起来的一个字符。如'a'、'b'、'A'、'-'、'!'都是合法的字符常量。字符常量中的单引号只起定界作用,而并不表示字符本身。单引号括起来的只能是单个字符,不能是字符串。

注意字符'5'和数字5的区别,前者是字符常量,后者是整型常量,它们的含义及在计算机中的存储方式都截然不同,字符常量'5'所表示的常量需要对照ASCII码表。下面详细介绍它们之间的区别。

除了用单引号括起来的字符表示字符常量外,还有一种字符常量,即转义字符。转义字符以反斜杠“\”开头,后面跟一个或几个字符,转义字符有特定含义,与原字符意义不同,故称之为转义字符。例如,之前例题中的输出函数printf()的格式控制部分用到的“\n”就是一个转义字符,其意思是“回车换行”。转义字符所对应的整型常量也同样需要对照ASCII码表。

也就是说,实际上这些字符不是以原始形态进行存放的,而是每个字符在计算机中对应着一个ASCII值。常见的转义字符详见表2-2。表2-2 常见的转义字符表【例2.4】输出a、b、c的值。

〖运行结果〗

程序分析:

其中“︼”代表空格,程序在第一列输出a的值1,之后是“\n”换行,接着是“\t”,跳到下一制表位,再输出b的值2。空两格再输出c的值3,然后是“\n”换行,再空两格输出a的值1,空两格再输出b的值2。再遇到“\t”跳到下一制表位置,但下一转义字符“\b”又退回一格,所以在2之后接着输出3。(2)字符串常量

字符串常量是由一对双引号括起来的字符序列。例如,"CHINA"、"very good"都是合法的字符串常量。可以对一个字符串进行输出。例如,printf("Welcome to Beijing!");。

要注意字符常量与字符串常量的区分。例如'a'和"a",前者是字符常量,后者是字符串常量,且它们所占的内容空间不同。因此,在编写程序时,一定要注意使用要求。

'a'是字符变量,只分配一个存储空间,只占一个字节;而"a"是字符串常量,内存对它分配两个存储空间,包括a及'\0',占两个字节。

在C语言中,规定以字符'\0'作为字符串的结束标志。'\0'是ASCII码为0的字符,即“空操作字符”,也就是不起任何控制作用也不可以显示的字符。例如,字符串"CHINA"在内存中的存储形式是

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载