21天学通C语言(第4版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-15 06:12:58

点击下载

作者:刘蕾

出版社:电子工业出版社

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

21天学通C语言(第4版)

21天学通C语言(第4版)试读:

前言

千里之行,始于足下!——老子“21天学编程系列”自2009年1月上市以来一直受到广大读者的青睐。该系列中的大部分图书从一上市就登上了编程类图书销售排行榜的前列,很多大、中专院校也将该系列中的一些图书作为教材使用,目前这些图书已经多次印刷、改版。可以说,“21天学编程系列”是自2009年以来,国内原创计算机编程图书最有影响力的品牌之一。

为了使该系列图书能紧跟技术和教学的发展,更加适合读者学习和学校教学,我们结合最新技术和读者的建议,对该系列图书进行了改版(即第4版)。本书便是该系列中的C语言分册。本书有何特色

1. 细致体贴的讲解

为了让读者更快地上手,本书特别设计了适合初学者的学习方式,用准确的语言总结概念、用直观的图示演示过程、用详细的注释解释代码、用形象的比方帮助记忆。效果如下图所示。

① 知识点介绍 准确、清晰是其显著特点,一般放在每一节开始的位置,让零基础的读者了解相关概念,顺利入门。

② 范例 书中出现的完整实例,以章节顺序编号,便于检索和循序渐进地学习、实践,放在每节知识点介绍之后。

③ 示例代码 与范例编号对应,层次清楚、语句简洁、注释丰富,体现了代码优美的原则,有利于读者养成良好的代码编写习惯。对于大段程序,均在每行代码前设定编号,便于学习。

④ 运行结果 对范例给出运行结果和对应图示,帮助读者更直观地理解示例代码。

⑤ 代码解析 将范例代码中的关键代码行逐一进行解释,有助于读者掌握相关概念和知识。

⑥ 贴心的提示 为了便于读者阅读,全书还穿插着一些技巧、提示等小贴士,体例约定如下:● 提示:通常是一些贴心的提醒,让读者加深印象,提供建议或者

解决问题的方法。● 注意:提出学习过程中需要特别注意的一些知识点和内容,或者

相关信息。● 警告:对操作不当或理解偏差将会造成的灾难性后果给出警示,

以加深读者印象。

⑦ 习题 每章最后提供专门的测试习题,供读者检验所学知识是否牢固掌握。

经作者多年的培训和授课证明,以上讲解方式是最适合初学者学习的方式,读者按照这种方式学习会非常轻松、顺利地掌握本书知识。

在本书中,大部分的内容是基于Turbo C 2.0编译器实现的,但是为了适应最新的C99语言标准,本书部分章节是基于Visual C++编译器实现的(两者主要的差别在于内存空间不同)。使用Visual C++编译器的章节是第3~5章、第8、9章,以及第14~19章。

2. 实用超值的DVD光盘

为了帮助读者比较直观地学习,本书附带DVD光盘,内容包括多媒体视频、电子教案(PPT)和实例源代码等。

• 多媒体视频

本书配有长达14小时的教学视频,讲解关键知识点界面操作和书中的一些综合练习题。作者亲自配音、演示,手把手教会读者使用。

• 电子教案(PPT)

本书可以作为高校相关课程的教材或课外辅导书,所以作者特别为本书制作了电子教案(PPT),以方便老师教学使用。

• 职场面试法宝

本书附赠“职场面试法宝”,含常见的职场经典面试题及解答。

3. 提供完善的技术支持

本书的技术支持论坛为http://www.rzchina.net,读者可以在上面提问交流。另外,论坛上还有一些小的教程、视频动画和各种技术文章,可帮助读者提高开发水平。推荐的学习计划

本书作者在长期从事相关培训或教学实践过程中,归纳了最适合初学者的学习模式,并参考了多位专家的意见,为读者总结了合理的学习时间分配方式,列表如下:本书适合哪些读者阅读

本书非常适合以下人员阅读:● 从未接触过C语言的自学人员;● 有一定C语言基础,但还需要进一步学习的人员;● 其他编程爱好者。第一篇C语言入门篇第1章 C语言与程序概述

C语言是现在世界上应用最广泛、最受欢迎的计算机语言之一。C语言从诞生到现在已经经历了30多年的发展,并且仍在继续进步。本章将为学习C语言做一些知识铺垫和准备工作。通过本章的学习,可以了解C语言的诞生及其标准化过程,同时,可以学习到程序设计的一些基本知识。在本章的学习中需要掌握以下知识点:● 数据结构的概念和作用;● 算法的概念和作用;● 结构化程序设计的方法;● 三种基本结构;● 程序流程图和N-S流程图。1.1 C语言的历史沿革

C语言已经经历了几十年的发展。在学习C语言之前,应该要先了解C语言是如何诞生的,它的历史是怎么样的。本节将介绍C语言的诞生、标准化过程及其重要特点,最后还将展示一个标准的“Hello, world!”程序。1.1.1 C语言的诞生

C语言是由著名的计算机科学家Dennis Ritchie创造的,其历史可以追溯到ALGOL 60。ALGOL 60,也称为A语言,是纯粹的面向描述计算过程的语言。虽然A语言并没有被广泛使用,但它引入的分程序结构、递归、动态、局部性概念等思想,对后来的程序设计语言影响深远。1963年,英国剑桥大学在A语言的基础上设计了CPL(Combined Programming Language)语言。CPL语言比ALGOL 60更接近硬件,但由于过于复杂而难以实现。1967年,剑桥大学的Martin Richards简化了CPL,设计了BCPL(Basic Combined Programming Language)语言。

C语言的直接前身B语言就是从BCPL发展而来的。1969年,Dennis Ritchie和另一名计算机科学家Ken Thompson在贝尔实验室从事DEC PDP-7计算机的研究。Ken Thompson为DEC PDP-7计算机设计了一个操作系统软件,也就是最早的UNIX操作系统。当时,在DEC PDP-7上写程序很困难,只能用很底层、很高深的汇编语言。汇编语言依赖于计算机硬件,编写的程序不具可读性和可移植性,而且难以调试。

Ken Thompson最初设计的UNIX操作系统就是用汇编语言编写的。为了克服汇编语言编写效率低下的缺点,Ken Thompson在BCPL的基础上设计了一种高级程序语言,并把它命名为B语言。B语言是一种无类型的语言,更加便于编写系统软件,它直接对机器码操作,这一点和后来的C语言有很大不同。作为系统软件编程语言的第一个应用,Ken Thompson还使用B语言重写了其自身的解释程序。但是B语言仍然过于简单,因为它采用解释模式而非编译模式。这些设计缺陷,使它在内存的限制面前一筹莫展。

在1972年至1973年间,Dennis Ritchie改进了B语言,为其添加了数据类型的概念,他将原来的解释程序改写为可以直接生成机器代码的编译程序,并将其命名为C语言。C语言既保持了BCPL语言和B语言精练、接近硬件的优点,又克服了它们过于简单、缺少数据类型等缺点。最初的C语言只是为了描述和实现UNIX操作系统而设计的。1973年,Ken Thompson和Dennis Ritchie在PDP-11机上用C语言重新改写了UNIX操作系统的内核,即UNIX第5版。

此后,随着UNIX操作系统的日益推广,C语言的突出优势引起了人们的广泛重视,开始有人研究如何把C语言从UNIX操作系统移植到其他系统中。1977年,不依赖于具体机器的C语言编译文本《可移植C语言编译程序》的面世,大大简化了C语言移植到其他系统的工作。C语言的易移植性也进一步推动了UNIX操作在其他机器上的实现。随着UNIX操作的广泛使用,C语言也得到更快的发展。现在,C语言已成为用途最为广泛的计算机高级语言,不仅可以用于编写系统软件,还可以用于构建各个领域的应用软件。1.1.2 C语言的发展历程

C语言发展到现在已经经历了三个标准,分别为K&R C、C89或ANSI C和C99。

1. K&R C

最初,C语言没有统一的官方标准可供遵循。1978年,Brian Kernighan和Dennis Ritchie完成了影响深远的《The C Programming Language》(第一版)的写作,该书的附录中提供了C语言参考手册。在以后的几年里,该书一直被广泛作为C语言的实现规范,成为非官方的C语言标准。这本书提出的C语言标准通常被简称为“K&R C”,其中,“K”和“R”是两个作者名字的首字母。

2. C89或ANSI C

C语言在随后短短几年的应用中得到了很快的发展。实际上使用的C语言早已超越了K&R C描述的范围,同时,K&R C在语言的许多细节上也没有达到足够精确的要求,这使标准化C语言成为迫切的要求。于是,在1983年夏天,美国标准化组织(ANSI)成立了一个C语言工作小组,开始了C语言的标准化工作。小组主要负责确认C语言的常用特性,但也对语言本身做了一些修改,并引入了一些新的特性。

1989年12月,ANSI发布了ANSI 89报告,由其规定的C语言标准被称为ANSI C,也称为C89。随即,该标准被国际标准化组织(ISO)略做修改后接纳为ISO标准,即ISO/IEC9899:1990。由于ISO是一个更为权威的国际性组织,于是在1990年,ANSI重新采纳了ISO/IEC9899:1990作为新的ANSI C。因此,ANSI C实际上就是ISO C。

3. C99

在ANSI标准化后,C语言的标准在相当长的一段时间内都保持不变,直到1999年,ISO的第14小组(WG 14)在C89的基础上进行了修改,并加入了一些新的特性,发布了ISO9899:1999。这个版本就是通常提及的C99。但是各个公司对C99所表现出来的兴趣不同,一些公司最新的编译器并没有支持一些新的特性。

提示

若无特殊说明,本书的讲解都遵循C99的标准。1.1.3 C语言的特点

C语言之所以得到如此迅速的发展,并成为应用最广泛、最受欢迎的计算机语言之一,主要是因为它语法灵活、使用方便,并能实现高效而强大的功能。总结起来,C语言具有以下特点。

1. 使用方便,功能强大

C语言只定义了32个关键字,C程序书写形式自由、结构严整。同时,C语言含有丰富的操作符和数据类型,并且允许用户自定义数据类型,使程序能够处理各种复杂数据,完成各种复杂功能。

2. 便于结构化编程

使用函数作为程序的基本模块,使C语言的结构化设计十分方便,使程序层次分明、便于维护。同时,C语言的几个使用简单但相当灵活的控制语句大大加强了其实现复杂功能的能力。

3. C语言是中级语言

C语言中的位运算功能使C程序可以直接访问物理内存,对硬件进行操作,能实现汇编语言的大部分功能。同时,它还具有高级语言程序可读性强、便于结构化编程等优点。因此,C语言结合了低级语言和高级语言的优点。

4. 执行效率高

由于C语言贴近低级语言,其生成的代码质量高;同时,C语言还允许对代码做位级操作,大大提高了C程序的执行效率。

5. C程序可移植性好

设计良好的C程序,基本上不做修改就能用于各种不同的计算机和不同的操作系统。这个特点使C语言十分适用于跨平台的程序开发。1.1.4 第一个C程序——Hello, world!

作为结构性语言,C程序的结构十分严整。下面来认识一下第一个C程序——十分著名的“Hello, world!”程序。这个程序经常被用做介绍各种语言的第一个程序,其功能是向屏幕打印一个字符串“Hello, world!”。【范例1-1】本范例实现了向屏幕打印“Hello,world!”,实现方法如示例代码1-1所示。

示例代码1-101 #include 02 03 int main(void) { /* main函数 */04 printf("Hello, world!\n"); /* 输出"Hello, world!" */05 return 0;06 }

提示

每行代码开头的数字为行号,为方便程序说明而添加,不是程序的内容。程序分析中所说的行首都不包括前面的序号。【运行结果】程序输出结果如图1-1所示。图中第一行是输出结果,最后一行“请按任意键继续…”是编译器自动添加的内容。图1-1 “Hello, world!”的结果

提示

本书中其他程序输出的截图中,如果最后一行有“请按任意键继续…”或“Press any key to continue…”字样,它们均不是输出结果,而是编译器自动添加的,请忽略。【代码解析】这是一个简单的C语言源程序,一般简称为C程序。它必须要在一个编译环境中编译链接后才能运行。关于编译、链接,以及运行的方法,在后面内容中会详细介绍。

所有的C程序都有一个main函数,即程序第3行。其后包含在大括号中的是main函数的内容。main函数是程序的入口,程序运行后,先进入main函数,然后依次执行main函数体中的语句。在范例1-1中,进入main函数后,先执行第4行语句调用printf函数,输出字符串“Hello, world!”;再执行第5行return语句,return语句会导致函数结束,程序随之结束。

功能复杂的程序还会包括其他要素,如判断语句、选择结构、各种特定功能的操作符、复杂的数据类型、繁多的处理数据等,在后面的学习中,会逐渐接触到C语言编程的各个方面,本书将进行详细的讲解。在后面两节中,先为编写程序预备一些需要了解的基本知识。1.2 数据结构与算法

一般来说,程序由数据结构和算法两个部分组成。数据结构是一个个的实体,而算法是将它们联系在一起的各种手段。学习C程序首先要了解数据结构和算法的概念,以及它们之间的关系。由于篇幅有限,本节只是简要地介绍数据结构和算法的一些基本知识,要想深入了解数据结构和算法,还需要读者去学习其他专门的资料。1.2.1 什么是数据结构

数据结构是程序存储、组织数据的方式。一个数据结构是由程序中的数据元素按照某种逻辑关系组织起来的,是若干个数据元素的组合。数据结构描述了数据元素之间的逻辑关系,数据必须存储在内存中,数据在内存中的存储结构是数据结构的实现形式,是数据结构在内存中的物理表示。

数据结构是程序中处理数据的基本单位,在程序中作为一个整体来使用。有如下所示的三类数据结构。● 第一类是不可分割的单个数据。例如:整数“12”、字符“C”

等。● 第二类由多个数据构成。例如:“2008年3月21日12时12分12

秒”,该数据结构描述了一个具体的时刻,它由6个部分组成,

分别为年、月、日、时、分和秒。● 第三类由多个第一类数据和第二类数据组成。例如,一个人的信

息也可以是一个数据结构,内容如下:{ 张三 /* 姓名 */ 男 /* 性别 */ 1980年12月12日 /* 生日 */ 北京邮电大学 /* 毕业学校 */}

该数据结构由姓名、性别、生日和毕业学校4部分组成,其中,生日属于第二类数据结构,即由多个数据组成的数据结构。

在许多类型的程序设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重依赖于是否选择了最优的数据结构。合理选择和精心设计的数据结构可以有效地提高程序的运行效率,同时,还能节约存储空间的使用。下面讨论如何以数组结构和链表结构来处理学生信息,通过这两种数据结构的优劣性比较,来体现数据结构选择的重要性。

数组是一种可以存放数据的容器,其数据在内存中连续存放,访问数组元素时,可以直接使用数组名加下标的方式。例如,要处理一个有42个学生的班级的学生信息,将其存储在数组中,其内存组织形式如图1-2所示。其中,数组序号从0开始排,即序号为n的元素实际为n+1个学生。图1-2 数组的存储形式

将该数组数据结构名命名为stuArray,它一般包含数组第一个元素的地址信息,因为数组是连续存放的,因此,只要把第一个元素地址加上N,即可得到第N+1个元素的地址。若要访问第三个学生王五的信息,只需使用stuArray[2](等效于stuArray+2,把第一个元素的地址加上2)即可。类似地,要访问数组序号为n的学生信息,只需使用stuArray[n-1]即可,只需要一步操作。

链表也是一种可以存放数据的容器,但是其数据在内存中是分散存放的。链表中的相邻元素间存在一些关系,这种关系有很多种形式,最典型的一种是每个链表元素都包含下一个元素的地址信息,通过该元素的信息就可以查找到下一个元素。同样,如果把上面所说的班级学生的信息存储在链表中,其内存的组织形式如图1-3所示。图1-3 链表的存储形式

将该链表数据结构命名为stuLink,一个链表的已知信息只有链表头的地址。如果要在该链表中访问第三个学生王五的信息,需要先访问第一个学生张三的信息,从中获得第二个学生李四的地址信息,然后才能访问李四的内存,再从中得到第三个学生王五的地址信息,之后才能访问王五的内存。也就是说,在数组中访问一个元素,必须先按顺序从第一个元素往后依次访问,直至得到要访问的元素。

由此可以知道,访问数组的效率远远高于访问链表。因此,如果程序的任务需要频繁地访问容器中的元素时,比如,一个用于查询学生数据的系统,需要频繁地读取数据,应该选择数组来存储学生信息,其运行效率要远远高于使用链表结构。

但是,数组增删元素时的效率远远不如链表。例如,李四同学由于过度沉迷C语言而旷课过多,被学校勒令退学。因此,班级信息中要删除李四的资料。如果使用数组stuArray存储学生信息的话,删除操作必须先删除stuArray[1],再将其后面的stuArray[2]到stuArray[41]都向前移一个位置,这样共需要41步操作。删除后,stuArray的内存组织形式如图1-4所示。图1-4 删除李四后stuArray的内存组织形式

如果使用链表stuLink存储学生信息的话,操作就相对简单。首先,删除李四的信息,同时,只要修改李四前面的学生张三的相邻元素信息即可。在删除李四前,张三中保存的下一个元素的地址是李四的地址;删除时,将其修改为王五的地址。整个过程总共只需要两步操作。删除李四的信息后,stuLink的内存组织形式如图1-5所示。图1-5 删除李四后stuLink的内存组织形式

使用数组和链表处理信息还有其他方面的不同,在此不多做比较。

提示

没有十全十美的数据结构,每种数据结构都是有其局限性的,要根据程序任务的需求来选择合适的数据类型。1.2.2 什么是算法

简单地讲,算法就是解决一个问题的完整的步骤描述,是指完成一个任务准确而完整的步骤描述。也就是说,给定初始状态或输入数据,按照算法描述的步骤进行运算,能够得出所要求或期望的终止状态或输出数据。

解决一个问题的方法有高明的,也有糟糕的。同样,同一个问题的算法也存在优劣之分。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。算法的时间复杂度是指执行算法需要消耗的时间资源,其表征了算法执行的效率问题,即解决问题的速度。算法的空间复杂度是指执行算法需要占用的内存空间,其表征了算法执行需要的资源,也就是解决问题付出的代价。很显然,算法的效率越高、代价越小,其性能越优异。

下面以数组排序方法为例,来讨论一下如何得到一个解决问题的算法。要求将一个序列的数值从小到大排序。为了描述方便,将要排序的序列具体化为一个含有10个元素的整数数列,内容为:{31, 72, 4, 13, 42, 8, 56, 4, 9, 2}

由于排序时,需要频繁地访问序列元素,但无须增删元素,且不会改变元素数目,因此,使用数组作为数据结构来存储数据是比较合适的。

对序列排序,可以很容易想到一种最直接、最简单的解决方案,具体操作如下所示:● 第1步,先选出所有数中的最小值,将其放在第1个位置;● 第2步,选出第2小的数,将其放在第2个位置;● ……● 第9步,选出第9小的数,将其放在第9个位置;● 第10步,剩下的数放在第10个位置。

这种排序算法一般被称为直接排序法。将该思想整理为算法,同时,推广到任意N个元素的序列,可得按如下的步骤操作:(1)访问序列中的所有元素,找到最小值,将其位置与第1个元素互换;(2)从剩余的N-1个元素中找到最小值,将其位置与第2个元素交换;

……(n)从剩余的N-n+1个元素中找到最小值,将其位置与第n个元素交换;

……(N-1)从剩余的两个元素中找到最小指,将其与第N-1个元素交换;(N)排序完毕。

在以上算法中,每一步执行需要的操作为:(1)N-1次比较,1次交换。如果最小值本来就在第一个位置,便无须交换;(2)N-2次比较,1次交换;

……(n)N-n次比较,1次交换;

……(N-1)1次比较,1次交换。

因此,共需要的操作为1+2+…+(N-1),即N(N-1)/2,为N的平方级别。因此,其时间复杂度可以记为O(N2)。同时,该算法只需在交换元素时需要额外的一个空间,因此,其空间复杂度为常数级别,记为O(1)。

提示

算法的设计很多时候需要取决于数据结构,而算法的实现更依赖于采用的存储结构。思考一下,如果上述算法选择的是链表作为存储结构,那么,这种算法的时间复杂度是否会发生改变?

从以上案例可以得到,提出一个问题的算法是一个从具体到抽象的过程,一般有以下步骤:

① 分析问题,选择需要的数据结构,得出初步的解决方法。有的问题中,可以先得出算法后再决定需要采用的数据结构;

② 将解决方法合理地拆分,整理成多个步骤;

③ 为重复执行的步骤合理地选择循环变量;

④ 使用易转化为程序实现的自然语言简练地描述算法。

有了解决问题的算法后,编程实现才有章可循。1.3 程序设计概述

如本章1.1.3节所述,C语言是一门便于结构化编程的语言。结构化编程,也就是结构化程序设计。那么,什么是结构化程序设计呢?结构化程序设计有什么好处?通过本节的学习,读者可以得到这些问题的答案,同时,会为学习以结构化程序设计为指导思想的C语言程序设计做一个良好的铺垫。1.3.1 结构化程序设计

结构化程序设计是荷兰科学家E.W. Dijikstra在1965年提出的,其主要思想是通过分解复杂问题为若干简单问题的方式,从而降低程序的复杂性。它的主要观点是采用自顶向下、逐步细化的程序设计方法,同时,严格使用三种基本控制结构来构造程序。

所谓自顶向下、逐步细化的程序设计方法,是指先把一个问题分解为几个子问题,然后依次针对每个子问题再进行分析。如果子问题仍然过于复杂、庞大,就需要继续将其分解,细化为几个小问题,如此一步一步向下分解,直至每个小问题足够清晰。把自顶向下、逐步细化的设计方法与模块化设计方法结合在一起能得到更好的程序结构。模块化设计方式的主要思想,是把程序分解为多个单一、独自的模块依次解决。例如,由于C语言的知识点众多,而各个知识点之间独立性较强,因此,写一本C语言书的过程也可以说是一个自顶向下、逐步细化的模块化过程,一般有以下步骤:

① 要根据写作目标确定这本书需要写哪方面的内容,可以将书的内容分为三部分:C语言基础知识、C语言的特性和C语言的一些专题应用。

② 很显然,这三个部分仍然显得过于庞大,因此,需要继续分解。C语言的基础知识有很多,可以细分为数据类型、操作符与表达式、程序控制结构、数组、字符串、函数等,其中,程序控制结构还可以继续分为选择结构和循环结构;C语言的特性和C语言的专题应用也同样可以分为多个章节。

③ 对每一章需要继续分解,罗列各个章节的知识点,确定每个章节中知识点的讲解顺序。这一步完成后就可以得到这本C语言书的目录,整本书的框架就十分清晰了。

④ 按各个章节的顺序依次往里面填内容。

按照这种方式组织书写的方法,其中一个显著的好处是,当写一个章节的时候,可以几乎忘记其他章节的内容,同时,还可以任意挑选中间章节先行编写。这种好处在程序上就体现为程序的结构清晰、易于调试和维护。

三种基本控制结构是指顺序结构、选择结构和循环结构。所有的程序结构都可以分解为这三个基本控制结构。1.3.2节将详细介绍。1.3.2 三种基本结构

按照操作的执行顺序,程序可以分为三类基本结构:顺序结构、选择结构和循环结构。1996年,计算机科学家Bohm和Jacopini证明:任何简单或复杂的算法都可以由顺序结构、选择结构和循环结构这三种结构组合而成。所以,这三种结构就被称为程序设计的三种基本结构,也是结构化程序设计建议采用的结构。

1. 顺序结构

在顺序结构的程序里,各操作是按照它们出现的先后顺序执行的。如图1-6所示,操作1和操作2按自上而下的顺序执行。这是最简单的一种基本结构。这个结构里只有一个入口点A和一个出口点B,其特点是从入口点A开始,按顺序执行所有操作,直至出口点B处。事实上,所有程序的总流程都是一个顺序结构。图1-6 顺序结构

2. 选择结构

选择结构,也叫分支结构。选择结构的程序里存在一些分支,程序通过对一些条件的判断选择执行的分支。按照分支数,选择结构又可以分为单选择、双选择和多选择三种形式。● 单选择结构如图1-7所示,当双选择结构中某个分支为空时,就

称为单选择结构。图1-7 单选择结构● 双选择结构是最常见的,如图1-8所示,结构中有两个分支,必

须要执行其中一支;如果满足条件则执行操作1,否则,执行操

作2。图1-8 双选择结构● 多选择结构如图1-9所示,有多个分支共存,程序根据Type值选

择其中之一来执行。图1-9 多选择结构

从上述三种结构的示意图中可以看到:不管是哪一种选择结构,都只有一个入口点和一个出口点。

3. 循环结构

循环结构是反复地执行一系列操作,直到某条件为假(或为真)时才终止的结构。按照判断条件出现的位置,可以分为while循环结构和until循环结构。● while循环结构中,先判断条件,如图1-10所示。如果A不大于

1,则直接退出循环体到达流程出口处;如果满足A大于1,执行

操作1,并且在操作1结束后返回到循环入口,重新判断条件;

如果A还是大于1,再次执行操作1,再返回结构入口……如此反

复。图1-10 while循环结构● until循环结构中,在结构入口处先执行循环体,然后再判断条件,

如图1-11所示。当程序执行完操作1后,判断A是否大于1。如果“是”,则返回循环入口再执行操作1,然后再次判断A是否大于1;

如果结果仍然“是”,则再次返回循环入口执行操作1……图1-11 until循环结构

在这两种结构中,操作1都可能被反复执行,直到A的值不大于1,才结束程序。同样,循环结构也只有一个入口点A和一个出口点B。

合理地使用这三种基本结构,可以组合成复杂的高级结构;而所有的复杂结构都可以分解为这三种基本结构。1.3.3 算法描述方法

当算法过程比较复杂时,单靠自然语言来描述算法将显得十分困难,让人难以准确理解。此时,需要借助其他的算法描述手段,主要有:● 算法语言,有伪代码、各种程序设计语言、计算机语言等;● 图形描述,如流程图和N-S图,图的描述应与算法语言的描述对

应;● 形式语言,用数学的方法,可以避免自然语言的二义性。

1. 伪代码

伪代码是介于程序语言和自然语言之间的算法描述,既要具有自然语言通俗易懂的特点,还要能很容易地被转换为程序语言,这就要求伪代码具有清晰的逻辑结构,并且有准确的算法步骤。伪代码的形式有很多种,没有通用的规则,可以根据需要自行决定伪代码的形式。本书使用的伪代码一般为类C伪代码,书写注重可读性和逻辑性。下面是1.3.2节直接排序算法的伪代码。该段伪代码已经细化到编程的每一小步,可以很容易地使用C语言代替。算法开始: 设i值为0; 当i < N – 1 { 设j值为i+1; 设min等于i; 当j < N { 如果 stuArray[min] > stuArray[j] { 设min的值为j; } j自增1; } 交换第i个元素和第min个元素; i自增1; }算法结束

技巧

在编程时,当设计好一个算法后,都要先将它们使用伪代码描述出来,再使用程序语言来实现。这样有利于更有条理、有逻辑地书写程序语言,其作用就像写文章要先列好提纲一样。

2. 程序流程图

程序流程图是算法的图形描述方式。它使用一些简单的几何图形来表示各种不同性质的程序操作,使用流程线将各个图形连接起来,指示算法的执行过程。由于流程图的符号统一,且画法简单、结构清晰、逻辑性强、便于理解,因此,程序流程图成为描述程序流程的主要方法。图1-12所示为流程图中常用的一些标志。图1-12 流程图常用的图形标志

在1.3.2节介绍三种基本程序结构时,已经接触了流程图的部分图形。将1.2.2节中的直接排序算法使用流程图来表示,如图1-13所示。图1-13 直接排序算法的程序流程图

由于本书中的程序都较短小,而程序流程图描述小型程序时,能够发挥其简单灵活的优势,因此,本书主要使用程序流程图来描述算法流程。

3. N-S流程图

程序流程图是使用流程线的导向来引导程序流程的。当程序流程较复杂时,框图中常常会有很多流程线,导致逻辑杂乱无章,失去了流程图简洁清晰的优点。后来,当结构化程序设计方法日益流行后,美国学者I. Nassi和B. Shneiderman基于结构化思想,提出了一种新的流程图形式,被称为N-S流程图,“N”和“S”是两个发明人名字的首字母。按照结构化设计的思想,所有的程序都可以分解成三种基本结构的组合。N-S流程图为三种基本结构设计了特殊的结构图,并以它们为基础来描述其余所有的算法。● 图1-14为顺序结构的N-S表示图。先执行操作1,再执行操作2;

操作1的方框上方为结构入口,操作2的方框下方为结构出口。图1-14 N-S顺序结构● 图1-15为双选择结构,省略其中之一即可得到单选择结构。图1-15 N-S双选择结构● 图1-16为until循环结构。图1-16 N-S until循环结构● 图1-17为while循环结构。图1-17 N-S while循环结构

使用这几种图形的组合便可以得到所有算法的N-S流程图。所以,N-S流程图中去掉了程序流程图中眼花缭乱的流程线,并将整个程序流程放在一个大方框内,使程序流程更清楚。图1-18是直接排序算法的N-S流程图。图1-18 直接排序算法的N-S流程图1.4 小结

本章介绍了C语言的历史,包括C语言的诞生和C语言的标准化过程。同时,为学习C语言预备了一些基本知识,包括数据结构、算法和结构化程序设计等。但是,对于这些知识的学习,只限于本书的介绍是不够的,需要读者去参考其他一些相关资料。1.5 习题

一、常见面试题

1. 关于程序的结构。【考题】编写一个简单的C语言程序,在用户屏幕上出现“Welcome To C”字样。【解析】该试题与示例1-1类似,也是在屏幕上打印输出某些字符串,根据“Hello, world!”程序的结构,编写如下程序。#include int main(void) { /* main函数 */ printf("Welcome To C\n"); /* 输出"Welcome to c" */ return 0;}

2. 关于算法的描述。【考题】试着描述一个问题的解决步骤,该问题从键盘上输入三个整型数值,然后输出其中最大的数。【解析】该问题首先要先有个地方存储这三个数,可以定义三个变量A、B、C,将三个数依次输入到A、B、C中,另外,再准备一个变量MAX来存储最大的数,即结果。问题的解决步骤可以描述如下:(1)输入A、B、C。(2)将A与B进行比较,其中较大的一个数放入变量MAX中。(3)将C与MAX进行比较,其中较大的一个数放入变量MAX中。(4)输出变量MAX,此时MAX即为最大数。

3. 关于C语言的定位。【考题】在程序设计语言中,有诸如JAVA、Pascal等高级语言,也有诸如汇编等低级语言,那么C语言属于哪一类呢?将其划分为该类的依据是什么?【解析】确切地说,C语言是中级语言,它把高级语言的基本结构和语句与低级语言的实用性结合起来。C语言可以像汇编语言一样对位、字节和地址进行操作,也提供了高级语言的基本结构。

二、简答题

1. 简述算法的概念,并举例说明它在程序中的作用。

2. 简述数据结构的概念,并举例说明它在程序中的作用。

3. 简述三种基本结构是什么,并说明它们的异同点。

三、综合练习

1. 建立一个解决猴子吃桃问题的数学模型。即有一堆不知数目的桃子,猴子第一天吃掉一半,觉得不过瘾,又多吃了一个;第二天照旧,吃掉剩下桃子的一半另加一个;天天如此,到第十天早上,猴子发现只剩一个桃子了,问这堆桃子原来有多少个?【提示】假设第一天开始时有a1个桃子,第二天有a2个,……,第9天有a9个,第10天是a10个,在a1,a2,…,a10中,只有a10=1是知道的,现在要计算a1,而我们可以看出,a1,a2,…,a10之间存在一个简单的关系:

a9=2*(a10+1)

a8=2*(a9+1)

a1=2*(a2+1)

这是一个递推关系,计算机经常处理此类问题,可以将该问题通过如下步骤来解决:(1)a1=1;{第10天的桃子数,a1的初值},i=9;{计数器初值为9}(2)a0=2*(a1+1);{计算当天的桃子数}(3)a1=a0;{将当天的桃子数作为下一次计算的初值}(4)i=i-1;(5)如果i>=1,转到步骤(2);(6)输出a0的值。

2. 用伪代码来描述使用冒泡排序法将序列从小到大排序。所谓冒泡排序,是指对尚未排序的各元素从头到尾依次比较相邻的两个元素是否逆序(与欲排顺序相反),若逆序就交换这两个元素。经过第一轮比较排序后便可把最大(或最小)的元素排好,然后再用同样的方法把剩下的元素逐个进行比较,就得到了要求的顺序。【提示】算法的伪代码描述如下:算法开始: 设i值为N-1; 当i > 0 { 设j值为0; 当j < i { 如果 array[j] > array[j+1] { 交换第j个元素和第j+1个元素; } j自增1; } i自减1; }算法结束

四、画图题

1. 用程序流程图描述冒泡排序的实现步骤。【提示】程序流程图使用一些简单的几何图形来表示各种不同性质的程序操作,使用流程线将各个图形连接起来,指示算法的执行过程。图1-19是冒泡法的程序流程图。图1-19 冒泡法的程序流程图

2. 用N-S流程图描述冒泡排序算法的实现。【提示】N-S流程图通过几种结构的组合而成,去除了流程线。图1-20是冒泡法的N-S流程图。图1-20 冒泡法的N-S流程图第2章 C语言编程准备

第1章介绍了C语言的历史和程序设计的一些知识,这些对于学习C语言编程都是十分重要的。本章将更进一步地介绍C程序的特点。C程序由许许多多的标识符、关键字和操作符等组成。C语言规定了简单有效的语法规则并将它们组合在一起,串成一个个有丰富功能的程序。在学习本章时,要重点关注以下知识点:● C程序的一些特点;● 标识符的概念;● 关键字的概念;● 编译、链接和运行的概念及作用;● C程序开发流程;● 学会至少一种环境下的C程序开发。2.1 C程序简介

从本节开始,读者将见识到C语言的真实面貌。本节将通过两个简单的C程序的讲解,使读者对C语言的特点有一个初步的印象,同时,讨论标识符和关键字的概念,最后还介绍了C程序的编译、链接和运行。2.1.1 简单C程序示例

在第1章中,读者已经认识了第一个C程序“Hello, world!”,知道了C程序都会有一个main函数,也知道了C程序简单的执行过程。但是,对于该程序的讲解十分简略。本节将再通过两个简单的程序使读者了解C程序更多的特点,建立起C程序更丰满的轮廓。

注意

在本节中,读者会看到很多新鲜的C语言专用名词,但是不必查阅每个名词的意思,只需有个大概的印象即可。本节抛出这些新名词的用意也只是让读者有个初步的印象,本节出现的名词在后面的章节都会详细地讨论。【范例2-1】输出一个正方形,实现方法如示例代码2-1所示。

示例代码2-101 #include /* 包含文件 */02 /* 空行 */03 int main(void) { /* main函数的声明,下面都为main函数的函数体 */04 /* 使用printf语句逐行输出正方形 */05 printf("* * * * *\n"); /* 输出第1行 */06 printf("* *\n"); /* 输出第2行 */07 printf("* *\n"); /* 输出第3行 */08 printf("* *\n"); /* 输出第4行 */09 printf("* * * * *\n"); /* 输出第5行 */10 /* 空行 */11 return 0; /* 返回语句 */12 }【运行结果】程序运行后,得到输出结果如图2-1所示。图2-1 输出正方形的结果【代码解析】本程序实现了打印出一个正方形的功能。● 第5~9行是函数体的内容,是程序功能的实现主体。每一行都是

一个函数调用语句,调用了printf函数,其功能为打印字串。第5

行打印的字串内容为“*****\n”,这个字串输出到屏幕时会将其

中的\n处理为换行,其余字符按原样输出。最后打印的结果如图

2-1的第1行所示。第6~9行打印的结果分别如图2-1中第2~5行所

示。● 第10行与第2行一样,也是一个空行。同样也是为了隔开功能不

同的两个程序段而设置的。

警告

C99标准规定无形参的main函数的声明要写为“int main(void)”,且要有“return 0;”语句。在第10章函数中会介绍一种带形参的main函数声明。【范例2-2】本范例简单地展示了C语言中一些操作符、变量和数据类型,实现方法如示例代码2-2所示。

示例代码2-201 #include /* 包含文件 */02 /* 空行 */03 int main(void) { /* main函数声明 */04 /* 定义两个整型变量 */05 int a = 3; /* 定义并初始化a */06 int b = 7; /* 定义并初始化b */07 08 /* 定义两个浮点型变量 */09 double c = 2.4; /* 定义并初始化c */10 double d = 7.4; /* 定义并初始化d */11 12 /* 使用操作符进行计算 */13 b = b + a; /* 对b赋值 */14 d = c * d; /* 对d赋值 */15 16 /* 输出各个变量的值 */17 printf("a = %d\n", a); /* 输出a的值 */18 printf("b = %d\n", b); /* 输出b的值 */19 printf("c = %d\n", c); /* 输出c的值 */20 printf("d = %f\n", d); /* 输出d的值 */21 22 return 0;23 }【运行结果】本程序的运行结果如图2-2所示。图2-2 C语言简单范例的运行结果【代码解析】本程序定义了几个变量,在对它们做简单操作后使用printf函数输出其值。● 第9行和第10行定义了两个double型变量c和d,并分别赋值为2.4

和7.4,其中,2.4和7.4为两个double型常量。● 第17行~20行的功能为调用printf函数,输出4个变量的值,在这

里,printf函数用字符串外的数值替换字符串中的内容后输出,

其输出结果如图2-2所示。● 第4、8、12行和第16行都是注释语句,用来说明其后C语句的简

要功能,以提高程序可读性。

范例2-1和范例2-2一样,都是简单的顺序结构。2.1.2 C程序的特点

从以上两个程序可以看到C程序的一些简单特点。

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载