C语言从入门到精通(第4版)

978-7-115-54835-1
作者: 李岚
译者:
编辑: 张天怡
分类: C语言

图书目录:

详情

本书以零基础入门为宗旨,用范例引导读者学习,深入浅出地介绍了C语言的相关知识和实战技能。 本书第Ⅰ篇【基础知识】主要讲解步入C语言的世界—Hello C、C程序的结构、C语言的基本构成元素、变量、数制、数据类型、运算符和表达式、算法、顺序结构与选择结构、循环结构与转向语句、数组以及字符数组和字符串等;第Ⅱ篇【核心技术—函数】主要讲解函数、变量的作用范围和存储类型、库函数、结构体和联合体、枚举等;第Ⅲ篇【高级应用—指针及文件】主要介绍指针、指针与数组、指针与函数、指针与字符串、指针与结构体、指针的高级应用与技巧以及文件等;第Ⅳ篇【数据结构及C语言中的常用算法】主要介绍数据结构、C语言中的高级算法、数学问题算法、排序问题算法、查找问题算法以及算法竞赛实例等;第Ⅴ篇【趣味解题】主要介绍歌手比赛评分系统、哥德巴赫猜想、打印日历、背包问题、火车车厢重排、商人过河以及K阶斐波那契数列的实现等。 本书提供了与图书内容全程同步的教学录像。此外,还赠送了大量相关的学习资料,以便读者扩展学习。 本书适合任何想学习C语言的读者,无论你是否从事计算机相关行业、是否接触过C语言,均可通过学习本书快速掌握C语言的开发方法和技巧。

图书摘要

异步图书

C语言从入门到精通:第4版

李岚 编著

人民邮电出版社

北京

图书在版编目(CIP)数据

C语言从入门到精通:第4版/李岚编著.--北京:人民邮电出版社,2021.7

ISBN 978-7-115-54835-1

Ⅰ. ①C… Ⅱ. ①李… Ⅲ.①C语言―程序设计 Ⅳ. ①TP312.8

中国版本图书馆CIP数据核字(2020)第169938号

◆编 著 李岚

责任编辑 张天怡

责任印制 陈犇

◆ 人民邮电出版社出版发行 北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

大厂回族自治县聚鑫印刷有限责任公司印刷

◆ 开本:787×1092 1/16

印张:28  2021年7月第1版

字数:863千字  2021年7月河北第1次印刷

定价:89.90元

读者服务热线:(010)81055410 印装质量热线:(010)81055316

反盗版热线:(010)81055315

广告经营许可证:京东市监广登字20170147号

本书以零基础入门为宗旨,用范例引导读者学习,深入浅出地介绍了C语言的相关知识和实战技能。

本书第Ⅰ篇【基础知识】主要讲解步入C语言的世界——Hello C、C程序的结构、C语言的基本构成元素、变量、数制、数据类型、运算符和表达式、算法、顺序结构与选择结构、循环结构与转向语句、数组以及字符数组和字符串等;第Ⅱ篇【核心技术——函数】主要讲解函数、变量的作用范围和存储类型、库函数、结构体和联合体、枚举等;第Ⅲ篇【高级应用——指针及文件】主要介绍指针、指针与数组、指针与函数、指针与字符串、指针与结构体、指针的高级应用与技巧以及文件等;第Ⅳ篇【数据结构及C语言中的常用算法】主要介绍数据结构、C语言中的高级算法、数学问题算法、排序问题算法、查找问题算法以及算法竞赛实例等;第Ⅴ篇【趣味解题】主要介绍歌手比赛评分系统、哥德巴赫猜想、打印日历、背包问题、火车车厢重排、商人过河以及K阶斐波那契数列的实现等。本书提供了与图书内容全程同步的教学录像。此外,还赠送了大量相关的学习资料,以便读者扩展学习。

本书适合任何想学习C语言的读者,无论你是否从事计算机相关行业、是否接触过C语言,均可通过学习本书快速掌握C语言的开发方法和技巧。

“从入门到精通”系列是专为初学者量身打造的一套编程学习用书,由知名计算机图书策划机构“龙马高新教育”精心策划。

本书主要面向C语言初学者和爱好者,旨在帮助读者掌握C语言基础知识、了解开发技巧并积累一定的项目实战经验。

为什么要写这样一本书

荀子曰:不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之。

实践对于学习的重要性由此可见。本书立足于实战,从项目开发的实际需求入手,将理论知识与实际应用相结合。本书的目的就是让初学者能够快速成长为初级程序员,并拥有一定的项目开发经验,从而在职场中拥有一个高起点。

C语言的学习路线

本书作者总结了多年的教学实践经验,为读者设计了学习路线。

本书特色

·零基础、入门级的讲解

无论读者是否从事计算机相关行业,是否接触过C语言,是否使用C语言开发过项目,都能从本书中获益。

·实用、专业的范例和项目

本书结合实际工作中的范例,逐一讲解C语言的各种知识和技术。最后,还以实际开发的项目来总结本书所学内容,帮助读者在实战中掌握知识,轻松拥有项目经验。

·随时检测自己的学习成果

每章首页给出了“本章要点”,以便读者明确学习方向。每章最后的“实战练习”则根据所在章的知识点精心设计而成,读者可以随时通过它们进行自我检测,巩固所学知识。

·细致入微、贴心提示

本书在讲解过程中使用了“提示”“注意”“技巧”等小栏目,帮助读者在学习过程中更清楚地理解基本概念、掌握相关操作,并轻松获取实战技巧。

超值电子资源

·全程同步教学录像

涵盖本书所有知识点,详细讲解每个范例及项目的开发过程及关键点,帮助读者更轻松地掌握书中所有的C语言程序设计知识。

·超多资源大放送

赠送大量资源,包括C语言标准库函数查询手册、C语言常用信息查询手册、10套超值完整源代码、全国计算机等级考试二级C语言考试大纲及应试技巧、C语言常见面试题、C语言常见错误及解决方案、C语言开发经验及技巧大汇总、C语言程序员职业规划、C语言程序员面试技巧、Java和Oracle项目实战教学录像。

读者可以申请加入编程语言交流学习群(QQ:829094243),可在群中获得本书的学习资料,并和其他读者进行交流,帮助你无障碍地快速学习本书中的知识和技能。

读者对象

·没有任何C语言基础的初学者。

·已掌握C语言的入门知识,希望进一步学习核心技术的人员。

·具备一定的C语言开发能力,缺乏C语言实战经验的人员。

·各类院校及培训学校的老师和学生。

二维码视频教程学习方法

为了方便读者学习,本书提供了大量视频教程。读者使用微信、QQ的“扫一扫”功能扫描书中二维码,即可通过手机观看视频教程。

如图所示,扫描标题旁边的二维码即可观看本节视频教程。

创作团队

本书由河南工业大学李岚主编,其中第4~5章由胡江汇编写,第7、第9章由张猛编写,第13~14章由李永刚编写。在此书的编写过程中,我们竭尽所能地将最好的内容呈现给读者,但书中也难免有疏漏之处,敬请广大读者不吝指正。若读者在阅读本书时遇到困难或疑问,或有任何建议,可发送邮件至zhangtianyi@ptpress.com.cn。

编者

❶ C语言标准库函数查询手册

❷ C语言常用信息查询手册

❸ 10套超值完整源代码

❹ 全国计算机等级考试二级C语言考试大纲及应试技巧

❺ C语言常见面试题

❻ C语言常见错误及解决方案

❼ C语言开发经验及技巧大汇总

❽ C语言程序员职业规划

❾ C语言程序员面试技巧

❿ Java和Oracle项目实战教学录像

在学习任何一门编程语言之前,都应该对这门语言的用途和应用领域有一个比较清楚的认识。只有这样,才能有目的、有方向地去学习。

本章要点(已掌握的在方框中打钩)

□C语言的起源及特点

□C语言的用途

□C语言的学习方法

0.1 编程的魔力

提到计算机编程,大家第一反应就是,烦琐的代码和复杂的指令。实际上,编程是一件神奇的、具有魔力的事情。

首先不妨看下2147 483 647这个数字,2147 483 647仅可以被1及其本身整除,因此也被称为质数(素数)。它在1772年被欧拉发现,在当时堪称世界上已知的最大的质数,由于证明过程复杂,欧拉也就被冠以“数学英雄”的美名。但是,现在通过简单的程序,不到1秒就可以证明2147 483 647是质数。

下面我们再来看一下八皇后问题。八皇后问题是一个古老而著名的数学问题,该问题是国际象棋棋手马克斯·贝瑟尔于1848年提出的。在8×8格的国际象棋上摆放8个“皇后”,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?

上图所示的就是其中的一种摆法,但是有没有其他方案呢?一共有92种摆法,想知道通过程序多久能计算出来吗?可以告诉你,不到1秒就可以。

相信很多读者都玩过“数独”这个经典的数字游戏(如果没有玩过这个游戏,不妨在网上先了解一下游戏的背景和规则),题目很多,而每一个题目都会对应很多种解法,有的甚至会有几万种。如果想在纸上解出所有方法,是很难实现的,但是通过程序,只需1秒,甚至不到1秒,就可以轻松计算出有多少种解法。

除了上面提到的问题外,还有猴子选大王、迷宫求解、商人过河、哥德巴赫猜想及选美比赛等很多趣味问题。读者既可以了解每个问题背后有趣的故事,又可以自己动手编程获得问题的解决方法;既能开阔眼界,又能学习知识。这也算是编程的特殊魔力吧!

0.2 C语言的起源及特点

C语言是一种计算机程序设计语言,它既有高级语言的特点,又有低级语言的特点。它可以作为系统设计语言来编写系统软件,如MySQL、Windows操作系统等软件的内核都是用C语言编写的;也可以作为应用程序设计语言来编写不依赖计算机硬件的应用软件,很多经典小游戏就是用C语言编写的。因此,它的应用范围非常广泛。下面就来了解一下C语言的起源及特点。

01 C语言的起源

C语言的诞生及发展历程如图所示。

(1)第1阶段:A语言。

C语言的发展颇为有趣,它的原型是ALGOL 60语言(也就是算法语言60),也称A语言。ALGOL 60是一种面向问题的高级语言,它“离硬件比较远”,不适合用于编写系统程序。ALGOL 60是程序设计语言“由技艺转向科学”的重要标志,具有局部性、动态性、递归性和严谨性等特点。

(2)第2阶段:CPL语言。

1963年,剑桥大学将ALGOL 60语言发展成为CPL(Combined Programming Language),CPL在ALGOL 60的基础上与硬件接近了一些,但规模仍然比较宏大,难以实现。

(3)第3阶段:BCPL语言。

1967年,剑桥大学马丁·理查兹对CPL进行了简化,推出了BCPL(Basic Combined Programming Language)。BCPL是计算机软件人员在开发系统软件时作为记述语言使用的一种结构化程序设计语言,它能够直接处理与计算机本身数据类型相近的数据,具有与内存地址对应的指针处理方式。

(4)第4阶段:B语言。

在20世纪70年代初期,美国贝尔实验室的肯·汤普森对BCPL进行了修改,设计出比较简单而且“很接近硬件”的语言,取名为B语言。B语言还包括了汤普森的一些个人偏好,比如在一些特定的程序中减少非空格字符的数量。和BCPL以及FORTH类似,B语言只有一种数据类型——计算机字。大部分的操作将其作为整数对待,例如进行+、-、*、/操作;但进行其余的操作时,则将其作为一个复引用的内存地址。在许多方面,B语言更像是一种早期版本的C语言,它还包括了一些库函数,其作用类似于C语言中的标准输入/输出函数库。

(5)第5阶段:C语言。

由于B语言过于简单,数据没有类型,功能也有限,所以美国贝尔实验室的丹尼斯·M·里奇在B语言的基础上设计出了一种新的语言,取名为C语言,并试着以C语言编写UNIX操作系统。1972年,丹尼斯·M·里奇完成了C语言的设计,并成功地利用C语言编写出了操作系统,从而降低了操作系统的修改难度。

1978年,C语言先后被移植到大、中、小、微型计算机上,风靡世界,成为应用最广泛的几种计算机语言之一。

1989年,美国国家标准协会(American National Standard Institute,ANSI)发布了第一个完整的C语言标准——ANSI X3.159-1989,简称C89,1994年,国际标准化组织(International Organization for Standardization,ISO)修订了C语言的标准。C语言标准C99是在1999年颁布、在2000年3月被ANSI采用的,正式名称是ISO/IEC 9899:1999。

02 C语言的特点

每一种语言都有自己的优缺点,C语言也不例外,所以才有了语言的更替,有了不同语言的使用范围。下面列举C语言的一些特点。

(1)功能强大、适用范围广、可移植性好。

许多著名的系统软件都是由C语言编写的,而且C语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机的基本工作单元。

C语言适合于多种操作系统,如DOS、Windows、UNIX等。对于操作系统以及需要对硬件进行操作的场合,使用C语言明显优于使用其他解释型高级语言。

(2)运算符丰富。

C语言的运算符包含的范围广泛,共有34种运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理,从而使C语言的运算类型极其丰富,表达式类型多样。灵活地使用各种运算符可以实现在其他高级语言中难以实现的运算。

(3)数据结构丰富。

C语言的数据类型有整型、实型、字符型、指针类型、结构体类型、共用体类型等,能用来实现各种复杂的数据结构的运算。C语言还引入了指针的概念,从而使程序的效率更高。

(4)C语言是结构化语言。

结构化语言的显著特点是代码和数据的分隔化,即程序的各个部分除了必要的信息交换外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C语言是以函数形式提供给用户的,因此用户可以方便地调用这些函数,通过多种循环和条件语句来控制程序的流向,从而使程序结构化。

(5)C语言可以进行底层开发。

C语言允许直接访问物理地址,可以直接对硬件进行操作,因此可以使用C语言来进行计算机软件的底层开发。

(6)其他特点。

C语言对语法的限制不太严格,其语法比较灵活,程序编写者有较大的自由度。另外,C语言生成的目标代码质量高,程序执行效率高。

0.3 C语言的用途

C语言应用范围极为广泛,不仅仅是在软件开发上,各类科研项目也都要用到C语言。下面列举了C语言一些常见的用途。

(1)应用软件。Linux操作系统中的应用软件有许多是用C语言编写的,这样的应用软件安全性非常高。

(2)对性能要求严格的领域。许多对性能有严格要求的程序都是用C语言编写的,比如网络程序的底层、网络服务器端的底层和地图查询等软件。

(3)系统软件和图形处理。C语言具有很强的绘图能力、数据处理能力和可移植性,可以用来编写系统软件、制作动画、绘制二维图形和三维图形等。

(4)数字计算。与其他编程语言相比,C语言是数字计算能力较强的高级语言。

(5)嵌入式开发。手机、个人数字助理(又称掌上电脑)等电子产品内部的应用软件、游戏等很多都是采用C语言进行嵌入式开发的。

(6)游戏软件开发。利用C语言可以开发很多游戏,例如推箱子、贪吃蛇等。

0.4 C语言实现的人机交互

计算机是用来帮助人类改变生活的工具,如果希望计算机帮助你做事情,首先需要做什么?当然是与计算机进行沟通,那么沟通就需要一门语言。人与人之间可以用肢体动作、语言进行沟通,而如果要与计算机沟通,就需要使用计算机能够“听懂”的语言。其中,C语言便是人类与计算机沟通的一种语言。

既然计算机是人类制造出来的、帮助人类的工具,显然让计算机“开口说话”、把计算机所知道的东西告诉人类是非常重要的。那么,首先就来看一下如何让计算机开口说话。

计算机要把它所知道的告诉人类,有很多方法,比如可以显示在显示器上,可以通过音箱等设备发出声音等。如果用屏幕输出,这里就需要一个让计算机开口说话的命令printf。

printf("ni hao");

printf和中文里面的“说”、英文里面的“say”是一个意思,就是控制计算机说话的一个单词。在printf后面紧跟一对圆括号(),把要说的内容放在这个括号里。在ni hao的两边还有一对双引号"",双引号里面的就是计算机要说的内容。最后,还需要用分号“;”表示语句的结束。

但在编写程序的过程中,仅仅包含printf("ni hao");这样的语句,计算机是识别不了的,还需要加一个框架。

#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("ni hao");
return 0;
}

用{和}括起来的部分,通常表示程序某一层次的结构。

所有C语言程序都必须有框架,并且类似printf这样的语句都要写在这一对花括号{}之间才有效。

除了与计算机交流的这些“命令”外,还需要有“C语言编译器”这样一个特殊软件,其作用是把代码变成一个可以让计算机直接运行的程序。这些软件需要下载并安装到计算机中才能使用。

当然,不同的编程语言,让计算机“说话”的方式不同,这些就等着大家去学习。或许通过大家的努力,将来让计算机通过人类语言与人类交流也能够轻松实现。

0.5 C语言的学习方法

C语言是在国内外广泛使用的一种计算机语言,很多新型的语言,如C++、Java、C#、J#、Perl等都衍生自C语言。掌握了C语言,可以说就相当于掌握了很多门语言。

在编写一个较大的程序时,应该把它分成几个小程序,这样会容易得多。同时,学习C语言时应该操作和理论相结合,两者是不可分割的。

读者要学习C语言,首先要注意以下几个方面。

(1)要培养学习C语言的兴趣。从简单的引导开始,有了学习的兴趣,才能够真正掌握C语言。此外,还要养成良好的学习习惯,切忌“逼迫学习”,把学习当成负担。

(2)学习语法。可以通过简单的实例来学习语法,了解它的结构。如变量,首先要了解变量的定义方式(格式),其意义是什么(定义变量有什么用);其次要学习怎么去运用它(用什么形式去应用它)。这些都是语法基础,也是C语言的基础,如果把它们都了解了,那么编写程序就得心应手了。

(3)学好语法后就可以开始编程了。在编写程序的时候,应该养成先画算法流程图的良好习惯。因为C语言的程序结构是模块化的,按照顺序一步步地从上往下执行,而流程图的思路也是从上到下一步步设计出来的。流程图画好了,编程的思路也基本定了,然后只需根据思路来编写程序代码即可。

(4)养成良好的编写习惯。例如,编写程序时每行代码要有缩进,程序复杂时还要写注释,这样程序看起来才会很清晰,错误也会减少很多,便于日后阅读、维护。

学习编程语言就是一个坚持读程序、编写代码、上机调试的过程。

(1)要学好C语言,首先要有一本好的入门书籍。本书把C语言所涉及的内容由易到难进行了详细的讲解,对于读者来说是个不错的选择。

(2)亲手操作。在大概了解内容后,一定要把程序“敲”出来自己运行一遍。编程工具推荐Code::Blocks。

(3)读程序。找一些用C语言编写的程序的例子,试着去读懂。

(4)自己改写程序。通过前面的学习,应该已经掌握了一些基本的编程技巧,在此基础上对程序进行改写。一定要有自己的想法,然后让自己的想法通过程序来实现。编程语言的学习过程就是坚持的过程,只要掌握了一种编程语言,再去学习其他的语言就很轻松了。

第1章 步入C语言的世界——Hello C

第2章 C程序的结构

第3章 C语言的基本构成元素

第4章 变量

第5章 计算机中的数制系统

第6章 数据的种类——数据类型

第7章 C语言中的运算符和表达式

第8章 程序的灵魂——算法

第9章 顺序结构与选择结构

第10章 循环结构与转向语句

第11章 数组

第12章 字符数组和字符串

C语言是国际上广泛流行的计算机高级程序设计语言,从诞生就注定了会受到世界的关注。它是世界上最受欢迎的语言之一,具有强大的功能,许多软件都是用C语言编写的。学习好C语言,可以为以后的程序开发打下坚实的基础。现在就跟笔者一起步入C语言的世界吧。

本章要点(已掌握的在方框中打钩)

□C语言的开发环境

□开始C编程——我的第一个C程序

1.1 C语言的开发环境

学习一门编程语言之前,首先要做的就是熟悉这门语言所使用的开发软件——开发环境。下面介绍一下C语言常用的开发环境。

1.1.1 C语言常用的开发环境

C语言常用的集成开发环境(Integrated Development Environment,IDE)和编译器有Microsoft Visual C++6.0、Microsoft Visual C++.NET、Turbo C、Borland C++Builder、Code::Blocks、Dev-C++、KDevelop、Eclipse CDT等。IDE主要是在程序员开发时提供各种软件应用组件,而受程序员欢迎的IDE都有一个共同点,那就是用户界面非常有吸引力。

01 Microsoft Visual C++

Microsoft Visual C++不仅是一个C++编译器,而且是一个基于Windows操作系统的功能强大的可视化集成开发环境。自1993年微软公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的重要工具。虽然微软公司推出了Visual C++.NET(Visual C++7.0),但它的应用有很大的局限性,只适用于Windows 2000、Windows XP和Windows NT 4.0。所以实际中,更多的是以Microsoft Visual C++6.0为平台。Microsoft Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等。这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。Microsoft Visual C++较受推崇的是Microsoft Visual C++6.0,简称VC 6.0。

02 Microsoft Visual C++.NET

Microsoft Visual Studio.NET是Microsoft Visual Studio 6.0的后续版本,是一套完整的开发工具集。它在.NET平台下调用Framework的类库,功能强大,其中包含了Visual C++开发组件。

03 Turbo C

Turbo C是美国Borland公司的产品,是一个基于DOS平台的应用程序,也可以在Windows环境下运行。目前比较新的版本为Turbo C 3.0,常用的版本是Turbo C 2.0。Turbo C 2.0是C语言集成环境,它集编辑、编译、连接和运行功能于一身,使得C程序的编辑、调试和测试非常简捷,编译和连接速度极快,使用也很方便。它提供了两种编译方式,一种是命令行方式,另一种是集成开发环境。

04 Borland C++Builder

Borland C++Builder是Borland公司继Delphi之后推出的一款高性能集成开发工具,具有可视化的开发环境,是基于C++语言的快速应用程序开发工具。C++Builder充分利用已经发展成熟的Delphi的可视化组件库,吸收Borland C++优秀编译器的诸多优点,结合先进的基于组件的程序设计技术,已成为一个非常成熟的可视化应用程序开发工具。C++Builder可以快速、高效地开发出基于Windows环境的各类程序,尤其在数据库应用和网络应用方面,更是一个十分理想的软件开发平台。

05 Code::Blocks

Code::Blocks是一个开放源码的全功能的跨平台C/C++集成开发环境,在Linux、macOS、Windows操作系统上都可以运行,且自身体积小,安装非常方便。它拥有简洁的用户界面,高效的编译器和调试器等,而且不需要购买许可证,上手难度不高,是一款轻量却又不失强大功能的好软件,支持GCC和g++(Linux操作系统下)。Code::Blocks由纯粹的C++语言开发完成,它使用了著名的图形界面库wxWidgets(2.6.2 unicode版)。

不同版本的C语言编译系统,所实现的语言功能和语法规则又略有差别,因此读者应了解所用的C语言编译系统的特点,这可以参阅有关手册。

本书主要是以Code::Blocks 16.01为程序开发环境,因为它功能完善,操作简便,界面友好,适合初学者开发使用。它除了能够完成最基本的编辑、编译、调试的功能,还具备以下特点。

(1)开源。

开源全称为开放源代码。开源软件的本质是开放,也就是任何人都可以得到软件的源代码,并在版权限制范围内使用。

(2)跨平台、跨编译器。

Windows、Linux、mac OS操作系统都可以使用,即使将来更换了设备也无须担忧。支持多款编译器,只要简单配置就可以轻松切换GCC/g++、Visual C++、Borland C++、Intel C++等20多款编译器。

(3)插件式框架。

初学者可能无法理解框架的概念,简单说就是方便添加各种小功能。

(4)采用C++写成。

运行环境非常简单,不用安装其他庞杂的架构。

(5)升级频繁与维护良好。

几乎每个月都有升级包,还有热心网友提供的各种功能包。

(6)内嵌可视化GUI设计。

IDE的图形界面,采用了wxWidgets。

1.1.2 Code::Blocks开发环境

Code::Blocks 16.01下载完成后会得到一个安装包(.exe可执行文件),双击该文件即可开始安装。具体安装过程如下。

双击.exe文件,直接进入安装程序,如下图(左)所示,单击【Next】按钮。

同意Code::Blocks的各项条款,如下图(右)所示,单击【I Agree】按钮。

选择要安装的组件,默认选择Full全部安装,如下图(左)所示,然后单击【Next】按钮。

选择安装路径时,默认位置即可,也可以安装在任意位置,但是路径中不要包含中文,如下图(右)所示,然后单击【Install】按钮。

等待安装。安装完成后,如下图(左)所示,单击【Finish】按钮。

打开【开始】→【所有程序】,会发现多了一个名为“CodeBlocks”的文件夹,如下图(右)所示,证明Code::Blocks已安装成功,同时在桌面上也会产生CodeBlocks的快捷方式。

启动Code::Blocks 16.01,窗口如下图所示。

1.1.3 手机编译器

对于没有计算机,或者计算机不在身边的读者,也可以使用手机随时学习C语言,只需要在手机上安装C语言的编译器。不过由于手机屏幕限制,虚拟键盘使用非常不便,因为要经常在英文、数字、符号之间切换,代码编写效率较低。

目前,比较常用的手机编译器有C4droid、C语言编译器、Quoda、AIDE、CppDroid、Mobile C等。这些软件需要到手机的“应用商店”或者官网中下载安装,有些是需要付费的。

本书主要介绍在安卓系统中使用的一个用户友好、功能强大的C/C++IDE和编译器C4droid。C4droid默认使用TCC(Tiny C Compiler)为编译器,可以选择安装GCC插件和SDL插件库(不需要ROOT)。选用GCC后,可以用SDL(简单直控媒体层库,需安装SDL plugin for C4droid)和QT(Nokia官方开发库,需安装SDL plugin for C4droid);也可以开发Native Android App(需安装SDL plugin for C4droid),就像Google NDK一样。GCC插件的4.7.2版本提供了示例程序,包含SDL、Android Native、QT和命令行测试程序源码。

C4droid支持离线C语言编译器、源代码编辑器、语法高亮、标签、自动补全代码、代码格式化、文件关联和撤销/重做、调试器、可定制的图形用户界面等常用功能,编译时间随手机CPU主频而定,主频越高编译越快,支持将程序打包成.apk安装包。

下面介绍笔者安装C4droid的具体过程。

首先在计算机上搜索“C4droid安卓汉化版”,通过手机扫码或者用连接线的方式把手机连接到计算机上,直接把软件下载到手机上并进行安装,如下图(左)所示。

安装成功后,在手机桌面上会出现C4droid的图标,如下图(右)所示。

在安装过程中出现“Do you want to install GCC?”提示,这时选择【Yes】。当出现“You need to install GCC for C4droid from Google Play,proceed?”提示时,选择【OK】。

GCC和SDL也可以在软件安装完成后单独安装。单击手机桌面上的C4droid图标,启动C4droid,单击右上角下拉按钮,选择【Preferences】选项,找到【Install GCC】和【Install SDL】就可以进行安装了,如下图所示。

当然读者也可以直接在手机的“应用商店”中搜索“C4droid”,可以找到很多类似的应用程序。

1.2 开始C编程——我的第一个C程序

C语言集成开发环境比较多,没有必要对每一种开发环境都熟练地掌握,只需要精通一种开发环境即可。下面在开发环境中学习编写第一个C程序。

1.2.1 程序编写及运行流程

汇编程序要转换成可执行文件(可以理解为能够“单独运行”的文件,一般在Windows操作系统中常见的可执行文件为.exe、.sys、.com文件等),需要通过汇编器来实现。那么,对于用C语言编写的代码,是如何把它转换为可执行文件的呢?

要转换C语言源代码为可执行文件,需要借助的工具是编译器(Compiler),转换的过程叫作编译。经过编译生成目标程序,目标文件是机器代码,是不能够直接执行的,它需要有其他文件或者其他函数库辅助,才能生成最终的可执行文件,这个过程称之为连接,使用的工具叫作连接器。

C程序的编写和运行流程如下图所示。

我们把编写的代码称为源文件或者源代码,输入、修改源文件的过程称为编辑。在这个过程中还要对源代码进行布局排版,使之有层次、方便阅读,并辅以一些说明的文字,帮助我们理解代码的含义,这些文字称为注释。它们仅起到说明的作用,不是功能代码,不会被执行。编辑的源代码经过保存,生成扩展名为“.c”的文件。这些源文件并不能够直接运行,而需要经过编译,把源文件转换为以“.obj”为扩展名的目标文件。此时目标文件再经过一个连接的环节,最终生成以“.exe”为扩展名的可执行文件。计算机系统能够运行的是可执行文件。

1.2.2 在Code::Blocks中开发C程序

启动Code::Blocks 16.01并新建程序。

范例1-1 使用Code::Blocks 16.01创建C程序并运行。

第1步:创建.c文件,如下图(左)所示,在Code::Blocks窗口中单击【Create a new project】。

当然也可以用菜单或者功能按钮区域里的命令按钮来创建新文件。在【New from template】对话框中选择【Files】→【C/C++source】,如下图(右)所示,单击【Go】按钮。

在【C/C++source】对话框中选择【C】,如下图(左)所示,单击【Next】按钮。

在“Filename with full path:”下的文本框中输入完整的文件名“1-1.c”,注意不要出现全角字符,然后单击文本框右边的【...】路径选择向导按钮,如下图(右)所示,选择文件保存路径后,单击【Finish】按钮。

在主窗口的工作区中可以看到多了一个名字为“1-1.c”的文件选项卡[见下图(左)],现在可以在这里面输入以下代码(代码1-1.txt)。

#include <stdio.h>               /*包含标准输入输出头文件*/
int main (void)                  /*主函数*/
{                                /*函数体开始*/
     printf(“Hello C!\n”);       /*在屏幕上输出Hello C!*/
     return 0;                   /*主函数结束后返回值0*/
}                                /*函数体结束*/

第2步:运行程序。

单击功能按钮区中的【Build and Run】按钮,程序直接完成编译、连接和运行工作,如下图(右)所示。

在程序执行窗口中输出程序的结果,如下图所示。

提示

如果程序在编译时有语法错误,则不出现运行结果,会在代码编辑工作区下面的“Logs & others”窗口中显示“第×行……(错误信息)”,这时可以按照这些提示信息修改代码,重新编译、运行,直到没有语法错误,并且能够在程序执行窗口中输出程序的结果为止。对应快捷键:编译【Ctrl+F9】,运行【Ctrl+F10】。

1.2.3 在手机编译器中开发C程序

单击手机桌面上的C4droid图标,启动C4droid。

第1步:在提示行中直接输入代码,如下图(左)所示。

第2步:运行程序。

单击窗口底部功能按钮区中的【RUN】,程序直接完成编译、连接和运行工作。如果代码有语法错误,窗口中会出现错误提示,如下图(右)所示,提示错误出现在第一行中,点击屏幕,回到编辑窗口中修改所有错误。

重新单击【RUN】,直到在程序执行窗口中输出正确的结果,如下图(左)所示。此时点击屏幕回到编辑窗口中。

第3步:保存程序。

窗口底部功能按钮区中的【OPEN】【NEW】【SAVE】【COMPILE】可以打开文件、创建新文件、保存文件、编译文件。如点击【SAVE】,在提示窗口中输入完整的文件名即可保存,如下图(右)所示。

1.3 高手点拨

学习任何一种编程语言,实践练习都是十分重要的,不要只看不练、眼高手低。要活学活用,看完课本中的范例之后,自己要在开发环境中独立操作一遍,不能认为简单而不亲手去操作。在编写C语言程序时,一定要注意养成好的书写习惯,好的书写习惯是一名优秀程序员具备的基本修养。一段程序可以反映一个人的编程水平,所以,针对C语言编程的书写,有以下4点建议。

(1)在每个程序文件最前面注释编写日期、程序的功能。

(2)代码格式要清晰,避免错乱;每段代码后面要注释这段代码的功能,便于以后的修改和查看。

(3)程序的模块化,也就是说对于一些功能复杂的程序,除了main()函数之外,还要定义其他函数,以免main()函数中的程序烦琐,也便于其他函数调用某个功能模块。例如,一个程序既要对整数排序,又要实现比较大小,那么可以将排序的程序放在函数A中,将比较大小的程序放在函数B中,然后在main()函数中调用这两个函数就可以了。如果其他函数中的整数也要排序,只需调用排序函数A就可以了,避免反复书写同样功能的程序段。

(4)函数命名规范化,例如,某段程序专门实现排序,可以将这段程序放到一个自定义函数中,将这个函数命名为“order”。因为order有排序的意思,这样命名可以一目了然,阅读程序的人通过函数名就可以知道该函数实现什么样的功能,便于理解。

1.4 实战练习

在Code::Blocks中编写C程序,在程序执行窗口中输出如下一行内容:“你好,世界!”

在C语言中,如同“学习攻略”一章中讲到的内容,仅仅用代码printf("ni hao")这样的“命令”计算机是识别不了的,必须把这个命令放在一个程序框架中。我们编写的程序也可能很简单,代码可以全部放在一个主函数中;编写的程序也可能很复杂,代码必须放在不同的文件中。本章将介绍C程序的完整结构。

本章要点(已掌握的在方框中打钩)

□声明区

□主函数

□函数定义区

□注释

□书写代码的规则

2.1 引例

范例2-1 计算圆的周长。

(1)在Code::Blocks中,新建名为“2-1.c”的文件。

(2)在代码编辑区域输入以下代码(代码2-1.txt)。

01   #include <stdio.h>    /*包含标准输入输出头文件*/
02   #define PI 3.14   /*定义符号常量PI,它的值是3.14*/
03   float circum(int);     /*声明子函数*/
04   int main()             /*主函数*/
05   {
06     int radius;        /*整型变量,存储半径值*/
07     float cir;        /*浮点型变量,存储周长值*/
08     radius = 2;        /*给半径赋初值*/
09     cir = circum(radius); /*调用计算周长子函数*/
10     printf("半径是%d,周长是%f。\n",radius,cir); /*输出变量radius的值和cir的值*/
11     return 0;        /*返回值*/
12     }                 /*主函数结束*/
13   float circum(int r)     /*子函数*/
14   {  
15      return  2 * PI * r; /*计算周长,并返回主函数*/
16   }                   /*子函数结束*/

【运行结果】

编译、连接、运行程序,即可在程序执行窗口中输出以下结果。

【范例分析】

通过这个C程序可以看到一个源文件的完整结构,如下图所示。下面将分别介绍C程序的这些部分。

2.2 声明区

2.2.1 头文件

一个C程序可以由若干个源文件组成,每一个源文件可以由若干预处理命令、全局变量声明、函数声明以及函数组成,每一个函数由函数首部和函数体组成。

作为一名程序开发人员,不可能每次编写都从最底层开发。如在上例中,要输出一串字符到输出设备上,我们需要做的仅是调用C语言已经定义好的标准函数printf(),至于数据是怎样显示在屏幕上的,我们并不关心。虽然我们不需要知道printf()函数的功能代码是如何设计的,但是我们要告诉编译系统printf()函数的功能代码包含在stdio.h这个头文件中,这是一个包含标准输入输出函数解释程序的头文件,这样程序在调用printf()函数时就能正确执行其功能。

C语言提供丰富的函数集,我们称之为标准函数库。标准函数库包括15个头文件,分别为assert.h、ctype.h、errno.h、float.h、limits.h、locale.h、math.h、setjmp.h、signal.h、stdarg.h、stddef.h、stdio.h、stdlib.h、string.h、time.h,借助这些库函数中的函数可以完成不同的功能,用户不需要再去写这些功能的代码了,灵活使用这些标准函数可以大大提高编程的效率。在源文件的最开始要用include命令把相应的头文件包含进来,其格式为:

#include <头文件名>

2.2.2 函数声明

在一个源文件中除了必须有一个main()函数外,往往还有用户自定义的实现其他功能的函数,例如【范例2-1】中的求圆的周长的circum()函数。为了能在main()函数中正确调用它,一般要在主函数首部的前面进行函数声明,函数声明的一般形式如下。

函数返回数据类型  函数名(参数类型1,参数类型2,…);

函数声明由函数返回类型、函数名和形参列表组成。即通过函数原型(即函数的首部)将函数名、函数类型以及形参的个数、类型、顺序通知编译系统,以便在调用该函数时,系统可以对照进行语法检查。另外,在软件设计过程中,定义函数的程序员提供函数原型,使用函数的程序员只需要按函数原型编写调用代码即可。

函数声明的详细内容在第13章介绍。

2.2.3 变量声明

在大多数程序设计语言中,使用一个变量之前,都要对这个变量进行声明,C语言同样如此。那么,什么是变量的声明呢?有什么作用呢?变量的声明其实就是在程序运行前,告诉编译器程序使用的变量以及与这些变量相关的属性,包括变量的名称、类型和长度等。这样,在程序运行前,编译器就可以知道怎样给变量分配内存空间,可以优化程序。

变量的声明语句的形式如下。

数据类型  变量名;

变量的声明包括变量的数据类型名和变量名两个部分,变量的声明必须在变量使用之前。来看下面的例子。

int num;
double area;
char ppt;

其中,int、double和char是数据类型名,num、area和ppt是变量名,即变量num是int类型(整型),area是double类型(双精度实型),ppt是char类型(字符型)。

数据类型包括C语言已定义的数据类型和用户自定义的数据类型。C语言常用的已定义的数据类型包括整型、字符型、实型、枚举型和指针类型等。

变量名其实就是一个标识符,要符合标识符的命名规则,详见第3章。

提示

如果变量没有经过声明而直接使用,则会出现编译器报错的现象。

下面用一个例子来验证声明必须在变量使用的前面。

范例2-2 验证未声明的标识符不可用。

(1)在Code::Blocks中,新建名为“2-2.c”的文件。

(2)在编辑窗口中输入以下代码(代码2-2.txt)。

01   #include<stdio.h>
02   int main(void)020  C语言从入门到精通第 4 版
03   {
04     printf("output undeclaredvar num=%d\n",num);
05     return 0;
06   }

【运行结果】

编译后显示出错,信息如下。

error:'num' undeclared(first use in this function)

【范例分析】

在此例子中,没有对标识符num进行声明就直接引用,编译器不知道num是什么,所以调试时编译器就会报错。

【拓展训练】

在第04行前插入如下语句。

int num=10;

或者:

int num;
num=10;

检验程序能否运行,是否还报错。

2.3 主函数

每个C程序有且只有一个主函数,也就是main()函数,它是程序的入口。C程序是由函数构成的,这使得程序容易实现模块化;main()函数后面的“()”不可省略,表示函数的参数列表;“{”和“}”是函数体开始和结束的标志,不可省略。

主函数main()在程序中可以放在任何位置,但是编译器都会首先找到它,并从它开始运行。它就像计算机的CPU,控制计算机中各功能模块协调地工作。

下图是对主函数各部分名称的说明。

在前面的两个范例中,主函数main()的首部都是int类型,int是整数integer的缩写,表示返回给系统的数据类型是整型数据,在return 0(返回值是0)语句中体现了出来。

主函数是如何调用其他函数,其他函数之间又是如何调用的呢?在本书的第13章详细介绍。

2.4 函数定义区

C语言编译系统是由上往下编译的。一般被调函数放在主调函数后面时,主调函数前面就要有对该被调函数的声明,否则C语言由上往下的编译系统将无法识别该函数。

函数的定义部分是实现函数功能的主体,仍然包含函数首部和函数体两部分,这部分可以放在源文件的任意位置。函数定义部分的格式如下。

返回值数据类型 函数名(参数类型1 参数名1,…,参数类型n 参数名n) 
{ 
函数体
}

例如【范例2-1】中的circum()函数,其功能的定义部分为:

float circum(int r)     /*子函数*/
{  
    return  2 * PI * r;  /*计算周长,并返回给主函数*/
}                      /*子函数结束*/

下面再看一个有关函数声明和函数定义的综合例子,比较它们有何不同。

#include<stdio.h>
int add(int x,int y); //函数声明语句
main()
{
int a,b,c;
c=add(a,b);
printf("%d",c);
}
int add(int x,int y)//函数定义
{ 
   int z; 
z=x+y; 
return z; 
}

2.5 注释

读者可能已经注意到,很多语句后面都有“/*……*/”符号,它们表示什么含义呢?

在前文已经说过,我们在编辑代码的过程中,希望加上一些说明的文字,来表示代码的含义,这是很有必要的。

费了很大精力编写的代码,如果没有写注释或者注释得不够清楚,一年后又要使用这段代码时,当年的思路全部记不得了,无奈之中,只得重分析、重理解。试问,因为当初一时的疏忽造成了今日的局面,值得吗?又如一个小组共同开发程序,组员需要在自己写的代码上进行二次开发,如果代码很复杂,也没有注释,恐怕只能用4个字形容组员的心情:欲哭无泪。所以,编写代码时建议书写注释,这样做可以提高程序的可读性,便于日后理解、维护。

注释的要求如下。

(1)使用“/*”和“*/”表示注释的起止,“/”和“*”之间没有空格,注释内容写在起止符号之间。注释表示对某句代码的说明,不属于程序代码的范畴,比如【范例1-1】和【范例2-1】代码中“/*”和“*/”之间的内容。

(2)使用“//”表示注释的开始,双斜杠后面跟注释内容。

(3)注释可以注释单行,也可以注释多行,而且注释不允许嵌套,嵌套会产生错误。错误的例子如下所示。

/*这样的注释/*特别*/有用*/

这段注释放在程序中不但起不到说明的作用,反而会使编译器产生“错觉”,原因是“这样”前面的“/*”与“特别”后面的“*/”匹配,注释结束,而“有用*/”就被编译器认为是违反语法规则的代码。

2.6 书写代码的规则

从书写代码清晰,便于阅读、理解、维护的角度出发,在书写程序时应遵循以下规则。

(1)一个说明或一个语句占一行。我们把空格符、制表符、换行符等统称为空白符。除了字符串、函数名和关键字,忽略所有的空白符,在其他地方出现时,只起间隔作用,编译器对它们忽略不计。因此在程序中使用空白符与否,对程序的编译不产生影响,但在程序中适当的地方使用空白符,可以增加程序的清晰性和可读性。

例如下面的代码。

int
main()
{
    printf("Hello C!\n");
}    /*这样的写法也能运行,但是太乱,很不妥*/

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

例如下面的代码。

int main()
{
printf("Hello C!\n");
return 0;}        /*这样的写法也能运行,但是阅读起来层次不清晰*/

(3)低一层次的语句通常比高一层次的语句向右缩进。一般来说,缩进指的是存在两个空格或者一个制表符的空白位置。

例如下面的代码。

int main()
{
   printf("Hello C!\n");
   {
      printf("Hello C!\n");
   }
   return 0;
}

(4)在程序中书写注释,用于说明程序做了什么,同样可以增加程序的清晰性和可读性。

以上介绍的4点规则,大家在编程时应力求遵循,以养成良好的编程习惯。

2.7 高手点拨

文件中声明函数,就像变量可以在头文件中声明、在源文件中定义一样,函数也可以在头文件中声明,在源文件中定义。把函数声明直接放在每个使用该函数的源文件中是大多数新手习惯并喜爱的方式,这是合法的,但是这种方式古板且易出错。解决方法就是把函数的声明放在头文件中,这样可以确保指定函数的所有声明保持一致。如果函数接口发生变化,则只需修改其唯一的声明即可。

将提供函数声明的头文件包含在定义该函数的源文件中,可使编译器检查该函数的定义和声明是否一致。特别地,如果函数定义和函数声明的形参列表一致,但实际返回数据类型不一致,编译器会发出警告或出错信息来指出差异。

那么函数声明与函数定义,它们到底有什么不同呢?我们知道函数的定义是一个完整的函数单元,它包含函数类型、函数名、形参及形参类型、函数体等,并且在程序中,函数的定义只能有一次,函数首部后面也不加分号。而函数声明只是对定义函数的返回值类型进行说明,以通知系统在本函数中所调用的函数是什么类型。它不包含函数体,并且调用几次该函数应在各个主调函数中作相应声明,函数声明是一个说明语句,必须以分号结束!

2.8 实战练习

(1)输入两个整数a和b,然后再输出这两个整数。

(2)输入两个整数,求这两个整数的和以及平均数并输出。

相关图书

代码审计——C/C++实践
代码审计——C/C++实践
C/C++代码调试的艺术(第2版)
C/C++代码调试的艺术(第2版)
大规模C++软件开发 卷1:过程与架构
大规模C++软件开发 卷1:过程与架构
C/C++程序设计竞赛真题实战特训教程(图解版)
C/C++程序设计竞赛真题实战特训教程(图解版)
C/C++函数与算法速查宝典
C/C++函数与算法速查宝典
C程序设计教程(第9版)
C程序设计教程(第9版)

相关文章

相关课程