书名:C语言从入门到精通(精粹版)
ISBN:978-7-115-46340-1
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
编 著 梁义涛
责任编辑 张 翼
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
本书以零基础讲解为宗旨,用实例引导读者学习,深入浅出地介绍了C语言的相关知识和实战技能。
本书第Ⅰ篇【基础知识】主要讲解C语言的基础知识、C程序的组成、字符集、标识符和关键字、变量、数制、数据类型、运算符和表达式、顺序结构与选择结构、循环结构与转向语句、输入和输出、数组以及字符数组等;第Ⅱ篇【算法应用】主要讲解算法与流程图、基础算法、C世界中的高级算法、数学在程序设计中的应用、算法设计的常用思路以及算法竞赛实例等;第Ⅲ篇【核心技术】主要介绍函数、函数中的变量、文件、库函数、位运算、结构体和联合体以及数据结构等;第Ⅳ篇【高级应用】主要介绍指针、指针与数组、指针与函数、指针与字符串、指针与结构体以及指针的高级应用与技巧等;第Ⅴ篇【趣味题解】主要介绍K-均值聚类算法、哥德巴赫猜想、猴子选大王游戏、迷宫求解、背包问题求解、火车车厢重排、哈夫曼编码、八皇后问题、商人过河游戏、K阶斐波那契序列以及最短路径等。
本书提供了与图书内容全程同步的教学录像。此外,还赠送了大量相关学习资料,以便读者扩展学习。
本书适合任何想学习C语言的读者,无论您是否从事计算机相关行业,是否接触过C语言,均可通过学习快速掌握C语言的开发方法和技巧。
“从入门到精通”系列是专为初学者量身打造的一套编程学习用书,由知名计算机图书策划机构“龙马高新教育”精心策划而成。
本书主要面向C语言初学者和爱好者,旨在帮助读者掌握C语言基础知识、了解开发技巧并积累一定的项目实战经验。
荀子曰:不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之。
实践对于学习的重要性由此可见一斑。纵观当前编程图书市场,理论知识与实践经验的脱节,是某些C语言图书中经常出现的情况。为了避免这一现象,本书立足于实战,从项目开发的实际需求入手,将理论知识与实际应用相结合。目标就是让初学者能够快速成长为初级程序员,并拥有一定的项目开发经验,从而在职场中拥有一个高起点。
本书总结了作者多年的教学实践经验,为读者设计了学习路线。
无论读者是否从事计算机相关行业,是否接触过C语言,是否使用C语言开发过项目,都能从本书中获益。
本书结合实际工作中的范例,逐一讲解C语言的各种知识和技术。最后,还以实际开发项目来总结本书所学内容,帮助读者在实战中掌握知识,轻松拥有项目经验。
每章首页给出了“本章要点”,以便读者明确学习方向。每章最后的“实战练习”则根据所在章的知识点精心设计而成,读者可以随时自我检测,巩固所学知识。
本书在讲解过程中使用了“提示”“注意”“技巧”等小栏目,帮助读者在学习过程中更清楚地理解基本概念、掌握相关操作,并轻松获取实战技巧。
涵盖本书所有知识点,详细讲解每个范例及项目的开发过程及关键点。帮助读者更轻松地掌握书中所有的C语言程序设计知识。
赠送大量资源,包括Java和Oracle项目实战教学录像、C语言标准库函数查询手册、C语言常用信息查询手册、10套超值完整源代码、全国计算机等级考试二级C语言考试大纲及应试技巧、C语言常见面试题、C语言常见错误及解决方案、C语言开发经验及技巧大汇总、C语言程序员职业规划、C语言程序员面试技巧。
为了方便读者学习,本书提供了大量视频教程的二维码。读者使用微信、QQ的“扫一扫”功能扫描二维码,即可通过手机观看视频教程。
如图所示,扫描标题旁边的二维码即可观看本节视频教程。
搜索“龙马高新教育”,下载、安装并打开龙马高新教育App,可以直接使用手机号码注册并登录。
(1)在【个人信息】界面,用户可以订阅图书类型、查看问题及添加的收藏、与好友交流、管理离线缓存、反馈意见并更新应用等。
(2)在首页界面单击顶部的【全部图书】按钮,在弹出的下拉列表中可查看订阅的图书类型,在上方搜索框中可以搜索图书。
(3)进入图书详细页面,单击要学习的内容即可播放视频。此外,还可以发表评论、收藏图书并离线下载视频文件等。
(4)首页底部包含4个栏目:在【图书】栏目中可以显示并选择图书,在【问同学】栏目中可以与同学讨论问题,在【问专家】栏目中可以向专家咨询,在【晒作品】栏目中可以分享自己的作品。
本书由国家863中部软件孵化器组织编写,梁义涛任主编。参与本书编写、资料整理、多媒体开发及程序调试的人员有孔万里、周奎奎、张田田、常俊杰、黄月、谢洋洋、刘江涛、张芳、江百胜、尚梦娟、张会锋、王金丽、贾祥铎、陈小杰、左琨、邓艳丽、崔姝怡、侯蕾、左花苹、刘锦源、普宁、王常吉、师鸣若、钟宏伟、陈川、刘子威、徐永俊、朱涛和翟桂花等。
在此书的编写过程中,我们竭尽所能地将最好的讲解呈现给读者,但书中也难免有疏漏和不妥之处,敬请广大读者不吝指正。若读者在阅读本书时遇到困难或疑问,或有任何建议,可发送邮件至zhangyi@ptpress.com.cn。
读者可以申请加入编程语言交流学习群(QQ:829094243),可在群中获得本书的学习资料,并和其他读者进行交流,帮助你无障碍地快速阅读本书。
编者
❶ C语言标准库函数查询手册
❷ C语言常用信息查询手册
❸ 10套超值完整源代码
❹ 全国计算机等级考试二级C语言考试大纲及应试技巧
❺ C语言常见面试题
❻ C语言常见错误及解决方案
❼ C语言开发经验及技巧大汇总
❽ C语言程序员职业规划
❾ C语言程序员面试技巧
❿ Java和Oracle项目实战教学录像
在学习任何一门编程语言之前,都应该对这门语言的用途和应用领域有一个比较清楚的认识。只有这样,才能有目的、有方向地去学习。
本章要点(已掌握的在方框中打钩)
□ C语言的来源
□ C语言的特点
□ C语言的应用领域
□ C语言的学习路线
提到计算机编程,大家第一反应就是:繁琐的代码和复杂的指令。但实际上,编程是一个神奇的、具有魔力的东西。
首先不妨看下2147483647这个数字,2147483647仅可以被1及其本身整除,因此也被称为质数(素数)。它在1722年被欧拉发现,在当时堪称世界上已知的最大的质数,由于证明过程复杂,欧拉也就被冠以“数学英雄”的美名。但是,现在通过简单的编程,不到1秒的时间就可以证明2147483647是质数。
下面我们再来看一下八皇后问题。八皇后问题是一个古老而著名的问题,该问题是国际西洋棋棋手马克斯•贝瑟尔于1848年提出的。在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?
上图所示的就为其中的一种摆法,但是有没有其他方案呢?一共有92种解决这个问题的摆法,想知道通过编程多久能计算出来吗?可以告诉你,不到1秒就可以。
相信很多读者都玩过数独这个经典的数字游戏(如果没有玩过这个游戏,不妨在网上先了解一下游戏的背景及要求),题目很多,而每一个题目都会对应很多种解法,有的甚至会有几万种。如果想在纸上解出所有方法,是很难实现的,但是通过编程,1秒,甚至不到1秒,就可以轻松计算出来有多少种解决方法。
除了上面提到的问题外,还有猴子选大王、迷宫求解、商人过河、哥德巴赫猜想及选美比赛等很多趣味问题,读者既可以了解每个问题背后有趣的故事,又可以自己动手编程获得问题的解答方法,既开阔眼界,又能学习知识,这也算是编程的特殊魔力吧!
C语言是一种计算机程序设计语言,它既有高级语言的特点,又具有低级汇编语言的特点。它可以作为系统设计语言来编写工作系统应用程序,也可以作为应用程序设计语言来编写不依赖计算机硬件的应用程序。因此,它的应用范围非常广泛。下面就来了解一下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年,剑桥大学马丁·理察斯(Martin Richards)对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语言过于简单,数据没有类型,功能也有限,所以美国贝尔实验室的丹尼斯·里奇在B语言的基础上最终设计出了一种新的语言,取名为C语言,并试着以C语言编写UNIX。1972年,丹尼斯·里奇完成了C语言的设计,并成功地利用C语言编写出了操作系统,从而降低了作业系统的修改难度。
1978年,C语言先后移植到大、中、小、微型计算机上,风靡世界,成为应用最广泛的几种计算机语言之一。
1983年,美国国家标准学会(ANSI)对C语言进行了标准化,当年颁布了第一个C语言标准草案(83 ANSI C),1987年又颁布了另一个C语言标准草案(87 ANSI C)。1994年,ISO修订了C语言的标准。而C语言标准C99是在1999年颁布、在2000年3月被ANSI采用,正式名称是ISO/IEC9899:1999。
每一种语言都有自己的优缺点,C语言也不例外,所以才有了语言的更替,有了不同语言的使用范围。下面列举C语言的一些优点。
(1)功能强大、适用范围广、可移植性好。
许多著名的系统软件都是由C 语言编写的,而且C语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机的基本工作单元。
C语言适合于多种操作系统,如DOS、UNIX等。对于操作系统、系统使用程序以及需要对硬件进行操作的场合,使用C语言明显优于其他解释型高级语言。此外,一些大型应用软件也是用C语言编写的。
(2)运算符丰富。
C语言的运算符包含的范围广泛,共有34种运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理,从而使C语言的运算类型极其丰富,表达式类型多样化。灵活地使用各种运算符可以实现在其他高级语言中难以实现的运算。
(3)数据结构丰富。
C语言的数据类型有整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等,能用来实现各种复杂的数据结构的运算。C语言还引入了指针的概念,从而使程序的效率更高。
(4)C语言是结构化语言。
结构化语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C语言是以函数形式提供给用户的,因此用户可以方便地调用这些函数,并具有多种循环和条件语句来控制程序的流向,从而使程序完全结构化。
(5)C语言可以进行底层开发。
C语言允许直接访问物理地址,可以直接对硬件进行操作,因此可以使用C语言来进行计算机软件的底层开发。
(6)其他特性。
C语言对语法的限制不太严格,其语法比较灵活,允许程序编写者有较大的自由度。另外,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 语言编译器”的特殊软件,其作用是把代码变成一个可以让计算机直接运行的程序。这些软件需要下载并安装到计算机中才能使用。
当然,不同的编程语言,让计算机“说话”的方式不同,这些就等着大家去学习。或许通过大家的努力,将来让计算机通过人类语言与人类交流也能够轻松实现。
C语言应用范围极为广泛,不仅仅是在软件开发上,各类科研项目也都要用到C语言。下面列举了C语言一些常见的用途。
(1)应用软件。Linux操作系统中的应用软件都是使用C语言编写的,因此这样的应用软件安全性非常高。
(2)对性能要求严格的领域。一般对性能有严格要求的程序都是用C语言编写的,比如网络程序的底层和网络服务器端的底层、地图查询等软件。
(3)系统软件和图形处理。C语言具有很强的绘图能力、数据处理能力和可移植性,可以用来编写系统软件、制作动画、绘制二维图形和三维图形等。
(4)数字计算。相对于其他编程语言,C语言是数字计算能力很强的高级语言。
(5)嵌入式设备开发。手机、PDA等时尚消费类电子产品相信大家都不陌生,其内部的应用软件、游戏等很多都是采用C语言进行嵌入式开发的。
(6)游戏软件开发。对于游戏大家更不陌生,很多人就是因为玩游戏而熟悉了计算机。利用C语言可以开发很多游戏,例如推箱子、贪吃蛇等。
C语言是在国内外广泛使用的一种计算机语言,很多新型的语言,如C++、Java、C#、J#、Perl等都是衍生自C语言。掌握了C语言,可以说就相当于掌握了很多门语言。
在编写一个较大的程序时,应该把它分成几个小程序来看,这样会容易得多。同时, C语言应该是操作和理论相结合的课程,两者是不可分割的。
读者要学习C语言,首先要注意以下几个方面。
(1)首先要培养学习C语言的兴趣。从简单的引导开始,有了学习的兴趣,才能够真正掌握C语言。此外,还要养成良好的学习习惯,切忌逼迫学习,把学习当成负担。
(2)学习语法。可以通过简单的实例来学习语法,了解它的结构。如变量,首先要了解变量的定义方式(格式),其意义是什么(定义变量有什么用);其次就是要怎么去运用它(用什么形式去应用它)。这些都是语法基础,也是C语言的基础,如果把它们都了解了,那么编起程序来就很得心应手了。
(3)学好语法基础后就可以开始编程了。在编写程序的时候,应该养成画流程图的好习惯。因为C语言的程序是以顺序为主,一步步地从上往下执行的,而流程图的思路也是从上到下一步步画出来的。流程图画好了,编程的思路也基本定了,然后只要根据思路来编写程序即可。
(4)养成良好的编程习惯。例如,编写程序时要有缩进,程序复杂时还要写注释,这样程序看起来就会很清晰,错误也会减少很多。
学习编程语言就是一个坚持看、敲、写的过程。
(1)要学好C语言,首先要有一本好的入门书籍。本书把C语言所涉及的内容由易到难进行了详细的讲解,对于读者来说是个不错的选择。
(2)看书,在大概了解内容后,一定要把程序敲出来自己运行一遍。编程工具推荐VC 6.0。
(3)读程序。找一些用C语言编写的程序的例子,试着去读懂。
(4)自己改写程序。通过前面的学习,应该已经掌握了一些基本的编程技巧,在此基础上对程序进行改写。一定要有自己的想法,然后让自己的想法通过程序来实现。编程语言的学习过程就是坚持的过程,只要掌握了一种编程语言,再去学习其他的语言就很轻松了。
第 1 章 步入C的世界——Hello C
第 2 章 C程序的组成
第 3 章 C语言的基本构成元素——字符集、标识符和关键字
第 4 章 变量
第 5 章 计算机如何识数——数制
第 6 章 数据的种类——数据类型
第 7 章 C世界中的加减乘除——运算符和表达式
第 8 章 顺序结构与选择结构
第 9 章 C程序的流程——循环结构与转向语句
第 10 章 用户与计算机的交互——输入和输出
第 11 章 数组
第 12 章 字符数组
C语言是国际上广泛流行的计算机高级程序设计语言,从诞生就注定了会受到世界的关注,它是世界上最受欢迎的语言之一,具有强大的功能,许多著名的软件都是用C语言编写的。学习好C语言,可以为以后的程序开发之路打下坚实的基础。现在就跟我一起步入C语言的世界吧。
本章要点(已掌握的在方框中打钩)
□ C语言的开发环境
□ 认识常用开发环境
□ 编写第1个C程序
学习一门编程语言之前,首先要做的就是:熟悉这门语言所使用的开发软件——开发环境。下面介绍一下C语言常用的开发环境。
C语言常用的集成开发环境有Microsoft Visual C++ 6.0、Microsoft Visual C++.NET、Turbo C以及Borland C++ Builder等。
Microsoft Visual C++ 不仅是一个C++编译器,而且是一个基于操作的可视化集成开发环境。Microsoft Visual C++目前选项新的版本为2017版,但业界比较流行的为Microsoft Visual C++ 6.0,简称VC++ 6.0。
Microsoft Visual Studio.NET是Microsoft Visual Studio 6.0的后续版本,是一套完整的开发工具集。它在.NET平台下调用Framework的类库,功能强大,其中包含了Visual C++开发组件。
Turbo C 是美国Borland 公司的产品,目前比较新的版本为Turbo C 3.0,不过常用的版本是Turbo C 2.0。
Borland C++ Builder是由Borland公司继Delphi之后推出的一款集成开发,具有可视化的开发环境。
不同版本的C编译系统,所实现的语言功能和语法规则又略有差别,因此读者应了解所用的C语言编译系统的特点,这可以参阅有关手册来实现。
本书主要是以Microsoft Visual C++ 6.0为C语言开发环境,因为它功能完善,操作简便,界面友好,适合初学者开发使用。考虑到大家存在的多种需求,本章也将简要介绍较为常用的Turbo C 2.0开发环境。
VC++ 6.0的具体安装过程如下。
(1)打开VC++ 6.0的安装目录,单击运行【AUTORUN.EXE】,弹出如下界面。VC++ 6.0有中文版和英文版两种安装方式,本书使用的是英文版操作界面,单击【英文版】按钮。
(2)单击【Next】按钮,选择“I accept the agreement”,然后单击【Next】按钮,在打开的界面中,输入产品序列号、ID及账户信息,单击【Next】按钮。
(3)选择第一个选项“Install Visual C++6.0 Enterprise Edition”,然后单击【Next】按钮,进入下一界面。
(4)安装路径选择默认位置,单击【Next】按钮,进入下一界面。
(5)开始启动安装程序,单击【继续】按钮,进入下一界面。
(6)单击【继续】按钮,进入下一界面。
(7)单击【确定】按钮,进入下一界面。安装程序提示是否替换VSS 6.0源代码管理工具的安装环境,根据实际需要选择,然后进入下一界面。
(8)单击【OK】按钮,进入下一界面,等待Visual C++ 6.0 Enterprise Setup安装到100%时,出现如下界面,单击【确定】按钮,开发环境安装完成。
Turbo C 2.0的具体安装过程如下。
(1)打开Turbo C 2.0的安装目录,单击运行【Turbo C 2.0.EXE】,弹出如下界面。
(2)单击【下一步】按钮,进入下一界面。
(3)默认以上的选项,单击【下一步】按钮,进入下一界面。
(4)在指定位置选择安装路径,单击【下一步】按钮,进入下一界面。
(5)程序安装完成,进入下一界面。
(6)单击【确定】按钮,开发环境安装完成。
C语言集成开发环境比较多,没有必要对每一种开发环境都熟练地掌握,只需要精通一种开发环境即可。下面分别来认识一下常用的两种开发环境:Visual C++ 6.0和Turbo C 2.0。
安装Visual C++ 6.0之后,选择【开始】【程序】
【Microsoft Visual Studio 6.0】
【Microsoft Visual C++ 6.0】菜单命令,即可启动Visual C++ 6.0。
启动Visual C++ 6.0并新建程序,新建程序的步骤可参照1.3.2节,新建程序后的界面如下图所示。
通过菜单栏中的菜单命令,读者可以轻松地完成编辑程序和资源、编译、链接及调试程序等各项工作。常用菜单如下图所示。
(1)【File】文件菜单:File菜单包含了各种对文件进行操作的选项,如加载、保存、打印和退出等。
(2)【Edit】编辑菜单:Edit菜单中的命令用来使用户便捷地编辑文件内容,如进行删除、复制等操作,其中的大多数命令的功能与Windows中的标准字处理程序的编辑命令一致。
(3)【View】查看菜单:View菜单中的命令主要用来改变窗口和工具栏的显示方式,激活调试时所用的各个窗口等。
(4)【Insert】插入菜单:Insert菜单中的命令主要用于项目及资源的创建和添加。
(5)【Project】工程菜单:Project菜单中的命令主要用于项目的操作,如项目中添加源文件等。
(6)【Build】编译菜单:Build菜单中的命令主要用于应用程序的编译、连接、调试和运行。
(7)【Tools】工具菜单:Tools菜单中的命令主要用于选择或制定开发环境中的一些实用工具。
(8)【Window】窗口菜单:Window菜单中的命令主要用于文档窗口的操作,如排列文档、打开或关闭一个文档窗口、重组或切分文档窗口等。
(9)【Help】帮助菜单:Visual C++ 6.0同大多数其他的Windows 应用软件一样,能够提供大量详细的帮助信息,而Help菜单便是得到这些帮助信息的最有效和最主要的途径之一。
工具栏中提供了大部分常用的操作命令,通过单击工具栏中相应的按钮,可以快捷地进行各种操作。在工具栏中的空白处单击鼠标右键,在弹出的快捷菜单中选择相应的菜单项可以定制(添加或删除)工具栏。
工作区窗口共有以下3个标签,分别代表3种视图形式。
(1)【ClassView(类视图)】:显示项目中所有的类信息。
(2)【ResourceView(资源视图)】:包含了项目中所有资源的层次列表。每一种资源都有自己的图标。在字符界面或者控制台界面中没有该项,只有在Windows程序下才出现。
(3)【FileView(文件视图)】:可将项目中的所有文件分类显示,每一类文件在【FileView】页面中都有自己的目录项。可以在目录项中移动文件,还可以创建新的目录项,以及将一些特殊类型的文件放在该目录项中。
提示
这里只是从概念上对工作区窗口进行简单的介绍,在后面的章节中会详细地介绍工作区窗口。读者不必在这里花费太多的时间。
输出窗口显示程序编译和连接错误与警告。
编辑窗口可进行输入、修改以及删除代码等操作。
相比现在有漂亮视窗界面、功能强大的开发软件,Turbo C略显单薄,但是即使面对这样强大的对手,Turbo C依然拥有较为广泛的使用群体,这是因为Turbo C不仅是一个快捷、高效的编译程序,同时还有一个易学、易用的集成开发环境。
使用Turbo C 2.0开发程序,不用独立地新建工程,直接可以在开发环境的编辑区输入所需的程序,然后编译运行程序就可以了,操作简单快捷,具体的程序开发过程请参照1.3.3节。
安装Turbo C 2.0之后,可以通过以下方式启动Turbo C 2.0。
(1)命令行方式启动。
选择【开始】【程序】
【附件】
【命令提示符】,在打开的命令行中输入Turbo C 2.0的路径,如“C:\TURBOC2\TC”,按【Enter】键,即可进入Turbo C 2.0集成环境的主菜单窗口。
(2)从Windows环境进入。
在Windows XP环境中,如果本机中已安装了Turbo C,可以在桌面上建立一个快捷方式,双击该快捷方式即可进入C语言开发环境。或者选择【开始】【运行】,在运行对话框中输入程序的路径,单击【确定】按钮即可。
Turbo C 2.0的主界面分为4个部分,由上至下分别为菜单栏、编辑区、信息区和功能键索引。
(1)菜单栏:包括【File】(文件)菜单、【Edit】(编辑)菜单、【Run】(运行)菜单、【Compile】(编译)菜单、【Project】(项目)菜单、【Options】(选择)菜单、【Debug】(调试)菜单和【Break/watch】(断点及监视)菜单等。
(2)编辑区:编辑区的第1行为编辑状态行,用来指示游标所在位置、文件名称以及编辑相关的状态信息。其他为代码编辑区域。
(3)信息区:显示程序编译和连接错误与警告。
(4)功能键索引:Turbo C 2.0不支持鼠标操作,功能键索引给出了功能按键的索引号。
我们已经大致了解了Visual C++ 6.0和Turbo C 2.0的界面,本节引入第1个C程序 “Hello C!”,开始我们的C编程之旅。
汇编程序要转换成可执行文件(可以理解为能够“单独运行”的文件,一般在Windows操作系统中常见的可执行文件为.exe/.sys/*.com文件等),需要通过汇编器来实现。那么,对于用C语言编写的代码,是如何把它转换为可执行文件的呢?
要转换C语言为可执行文件,需要借助的工具是编译器(Compiler),转换的过程叫作编译。经过编译,生成目标程序,目标文件是机器代码,是不能够直接执行的,它需要有其他文件或者其他函数库辅助,才能生成最终的可执行文件,这个过程称之为连接,使用的工具叫做连接器。
C程序的编写和运行流程如图所示。
我们把编写的代码称为源文件或者源代码,输入修改源文件的过程称为编辑,在这个过程中还要对源代码进行布局排版,使之美观有层次,并辅以一些说明的文字,帮助我们理解代码的含义,这些文字称为注释,它们仅起到说明的作用,不是代码,不会被执行;经过编辑的源代码经过保存,生成后缀名为“.c”的文件,这些源文件并不能够直接运行,而需要经过编译,把源文件转换为以“.obj”为后缀名的目标文件;此时目标文件再经过一个连接的环节,最终生成以“.exe”为后缀名的可执行文件。能够运行的是可执行文件。
本小节介绍使用Visual C++ 6.0开发C程序的过程。本书的所有例程都是在VC++ 6.0中开发的。
(1)在Visual C++ 6.0中,选择【Flie】【New】菜单,在弹出的对话框中选择【Projects】选项卡,在左侧列表框中选择【Win32 Console Application】,在【Project name】文本框中输入工程名“Hello”,单击【Location】文本框右侧的
按钮,选择工程要存放的文件夹。
(2)单击【OK】按钮,选中【An empty project】单选按钮,单击【Finish】按钮,显示工程信息,然后单击【OK】按钮,即可完成空工程的创建。
(1)选择【Flie】【New】菜单,在弹出的对话框中选择【Files】选项卡,在左侧列表框中选择【Text File】,新建一个程序文档,在【File】文本框中输入“Hello.c”,单击【Location】文本框右侧的
按钮,可浏览到程序存放的文件夹(这个文件夹要和工程文件夹保持一致)。
(2)单击【OK】按钮,在编辑窗口输入以下代码(代码1-1.txt)。
01 #include <stdio.h> /*包含标准输入输出头文件*/
02 int main (void) /*主函数*/
03 { /*函数体开始*/
04 printf(“Hello C!\n”); /*函数体*/
05 return 0; /*返回值*/
06 } /*函数体结束*/
(1)单击工具栏中的【Compile】按钮,或选择【Build】
【Compile Hello.c】菜单命令,程序开始编译,并在输出窗口显示编译信息。
(2)单击工具栏中的【Build】按钮,或选择【Build】
【Build Hello.exe】菜单命令,开始连接程序,并在输出窗口显示连接信息。
(3)单击工具栏中的【Execute Programe】按钮,或选择【Build】
【Execute Hello.exe】菜单命令,即可在命令行中输出程序的结果。
提示
可以省略第1步创建空工程的步骤,直接从第2步开始。但是在程序编译时,会要求确认是否为C程序创建默认的工作空间,单击【是】按钮即可,如下图所示。
因为Turbo C 也是开发C程序常用的开发环境,所以结合【范例1-1】,下面分步骤详细讲解如何使用Turbo C 2.0创建C程序,但本书的所有例程都是在VC++ 6.0中开发的。
(1)在Turbo C 2.0中,按【ALT+O】组合键,弹出【Options】菜单,使用方向键选择【Directories】菜单命令,按【Enter】键,选择【Output directory】项,按【Enter】键,输入已存在的路径,如“d:\Final”。
(2)按【Enter】键,然后选择【Options】【Save Options】,按【Enter】键,保存配置信息,最后连按两次【Esc】键,退出菜单。
(1)按【Alt+F】组合键,选择【Write to】菜单命令,按【Enter】键,输入“d:\Final\hello.c”,按【Enter】键,即可将输入的程序保存在D盘的Final目录中,文件名为“HELLO.C”。
(2)在编辑区中输入源程序(程序见【范例1-1】中的“代码1-1.txt”)。
(3)按【F2】键直接保存文件。按【Alt+C】组合键,选择【Compile to OBJ D:HELLO.OBJ】,编译“HELLO.C”程序,并出现编译成功与否的信息对话框。
(4)按【Enter】键,按【Alt+C】组合键,选择【Make EXE file D:HELLO.EXE】,生成可执行文件,并显示生成执行文件成功与否的信息对话框。
(5)按【Enter】键,按【Ctrl+F9】组合键,运行程序,但会一闪而过。按【Alt+F5】组合键,可在屏幕中查看程序运行结果。
(6)按任意键,返回Turbo C 2.0开发环境。
开发任何一种语言编程,实践练习都是十分重要的,不要只看不练、眼高手低。学会活学活用,看完课本中的例程之后,自己要在开发环境中独立操作一遍,不能认为简单而不亲手去操作。在书写C语言编程时,一定要注意养成好的书写习惯;好的书写习惯是一名优秀程序员要具备的基本修养。一段程序可以反映一个人的编程水平,所以,针对C语言编程的书写,有以下4点建议。
(1)在每个程序文件最前面注释书写日期、程序的目的。
(2)代码格式要清晰,避免错乱不堪;每段代码后面要注释这段代码的功能,便于以后的修改和查看。
(3)程序的模块化,也就是说对于一些功能复杂的程序,除了main()函数之外,还要定义其他函数,以免main()函数中的程序繁琐,也便于其他函数调用某个功能模块。例如,一个程序既要实现整数的排序,又要实现比较大小,那么可以将排序的程序放在函数A中;将比较大小的程序放在函数B中。只需要在main()函数中调用这两个函数就可以了。如果其他函数中的整数也要排序,只需调用排序函数A就可以了,避免反复书写同样的程序。
(4)函数命名规范化,例如,某段程序专门实现排序,可以将这段程序放到一个自定义函数中,将这个函数命名为“order”。因为order有排序的意思,所以这样命名可以一目了然,通过函数名就可以知道该函数实现什么样的功能,便于理解。
分别在VC++ 6.0和Turbo C 2.0中编写C程序,在命令行中输出如下一行内容:
“你好,世界!”
在C语言中,根据存储方式和表示形式,数据有常量和变量之分,就像方程有已知数和未知数一样。
本章要点(已掌握的在方框中打钩)
□ 声明区
□ 主函数
□ 函数定义区
□ 注释
□ 代码的规矩
(1)在Visual C++ 6.0中,新建名为“计算圆周长.c”的【Text File】文件。
(2)在代码编辑区域输入以下代码(代码2-1.txt)。
01 /*内容:计算圆周长
02 目的:了解C语法*/
03 #include <stdio.h> /*包含标准输入输出头文件*/
04 #include <math.h> /*包含数学函数库头文件*/
05 #define PI 3.14 /*定义常量PI,它的值是3.14*/
06 int main() /*主函数*/
07 {
08 int radius; /*整型变量,存储半径值*/
09 float circum; /*浮点型变量,存储周长值*/
10 radius = 2; /*半径赋值*/
11 circum = 2 * PI * radius; /*计算周长*/
12 printf("变量radius地址是%d\n",&radius); /*输出变量radius存储地址*/
13 printf("半径开方值是%f\n",sqrt(radius)); /*输出变量radius的开方值*/
14 printf("半径是%d,周长是%f\n",radius,circum); /*输出变量radius值和circum值*/
15 return 0; /*返回值*/
16 } /*函数体结束*/
编译、连接、运行程序,即可在命令行中输出以下结果。
这个范例的目的是让大家看到一个较复杂的C程序的组成,所谓复杂只是多了些说明和代码。
一个C程序可以由若干个源程序文件组成,每一个源文件可以由若干个函数和预处理命令以及全局变量声明部分组成,每一个函数由函数首部和函数体组成。C程序的结构如图所示。
作为一名程序开发人员,不可能每次编写都从最底层开发。如在上例中,要输入一串字符到输出设备上,我们需要做的仅是调用printf()函数,至于“Hello C!”是怎样显示的,我们并不关心。我们认识printf()函数,在编写程序时调用它,更需要让程序认识它,这样才能使用printf()函数提供的功能,这就需要使用#include <stdio.h>,包含标准输入输出头文件,这样程序就能够认识printf()函数,并执行其功能。
C提供有丰富的函数集,我们称之为标准函数库。标准函数库包括15个头文件,借助这些函数可以完成不同的功能。
例如,【范例2-1】中有#include<math.h>时,就可以使用该数学函数库头文件提供的如开平方函数sqrt(),求出半径radius为2时的开平方值1.414;又如,当程序包含头文件“malloc.h”时,就可以完成对内存的申请和释放等功能。
标准C语言引入了新的更好的函数声明方法,即用函数原型指定函数更多的信息,通过函数原型可以将函数的名字和函数类型以及形式参数的个数、类型、顺序通知编译系统,以便在调用函数时,系统可以对照检查。
函数声明由函数返回类型、函数名和形参列表组成。形参列表必须包括形参类型,但是不必对形参命名。这3个元素被称为函数原型,函数原型描述了函数的接口。定义函数的程序员提供函数原型,使用函数的程序员就只需要对函数原型编辑即可。
函数声明的一般形式为:
函数返回类型 函数名(参数类型1, 参数类型2,……);
函数声明包括函数的返回类型和函数名,来看下面这个例子。
01 int fun(int a, int b);
02 void display();
03 float fn (float x);
其中,int、void和float都是函数返回类型,也属于数据类型。fun、display和fn是所调用的函数名。也就是说,fun()函数返回的数据类型为整型int;display()函数返回的类型为void型,指函数无返回值;fn()返回的数据类型为浮点型float。
fun(int a, int b)函数内部的a和b为形参,其参数类型都为int型。fn (float x)函数内部参数x的类型为float型。函数声明中的形参名往往被忽略,如果声明中提供了形参的名字,也只是用作辅助文档。另外要注意函数声明是一个语句,后面不可漏分号!
进一步对函数做解释,需要注意的有以下几点。
(1)函数名称后面必须有小括号,不能省略,这是函数的特征。
(2)函数结束必须有分号,不能省略。
(3)字符串结尾有这样的内容“\n”,它叫作转义符,表示的含义是把光标移动到下一行的行首,也就是回车换行,因为我们无法直接通过键盘输入换行的指令,所以需要使用转义符;又比如输出内容后希望返回该行的行首,重新输出内容,键盘上也没有对应的功能键,我们就可以使用回车符转义符“\r”来代替。当然,转义还包含其他内容,后续章节中会详细讲述。
在大多数语言中,在使用一个变量之前,都要对这个变量进行声明,C语言同样如此。那么,什么是变量的声明呢?有什么作用呢?变量的声明其实就是在程序运行前,告诉编译器程序使用的变量以及与这些变量相关的属性,包括变量的名称、类型和长度等。这样,在程序运行前,编译器就可以知道怎样给变量分配内存空间,可以优化程序。
变量的声明语句的形式如下:
变量类型名 变量名
变量的声明包括变量类型名和变量名两个部分。来看下面的例子:
01 int num
02 double area
03 char ppt
其中,int、double和char是变量类型名,num、area和ppt是变量名。其实,变量类型名也是数据类型的一种,就是说变量num是int类型,area是double类型,ppt是char类型。
变量类型名是C语言自带的数据类型和用户自定义的数据类型。C语言自带的数据类型包括整型、字符型、浮点型、枚举型和指针类型等。
变量名其实就是一个标识符,当然,标识符的命名规则在此处同样适用。除此之外,变量命名的时候还需要注意以下几点。
(1)变量名区分大小写,变量Num和num是两个不同的变量。
(2)变量的命名建议与实际应用有关联,例如,num一般表示数量,area表示面积等。
(3)变量的命名必须在变量使用之前。
提示
如果变量没有经过声明而直接使用,则会出现编译器报错的现象。
下面用一个例子来验证声明必须在变量使用的前面。
(1)在Visual C++ 6.0中,新建名为“undeclaredvar.c”的【Text File】文件。
(2)在编辑窗口中输入以下代码(代码2-2.txt)。
01 #include<stdio.h>
02 int main(void)
03 {
04 printf("output undeclaredvar num=%d\n",num);
05 return 0;
06 }
编译后显示出错,信息如下:
undeclaredvar.c(4) : error C2065: 'num' : undeclared identifier
在此例子中,没有对标识符num进行声明就直接引用,编译器不知道num是什么,所以调试时编译器就会报错。
在第3句和第4句之间插入语句:
04 int num=10;
或者:
04 int num;
05 num=10;
检验一下程序能否运行,是否还报错。
每个C程序必须有而且只有一个主函数,也就是main()函数,它是程序的入口。main()函数有时也作为一种驱动,按次序控制调用其他函数,C程序是由函数构成的,这使得程序容易实现模块化;main()函数后面的“()”不可省略,表示函数的参数列表;“{”和“}”是函数开始和结束的标志,不可省略。
下图是对主函数调用其他函数的说明。
主函数main()在程序中可以放在任何位置,但是编译器都会首先找到它,并从它开始运行。它就像汽车的引擎,控制程序中各部分的执行次序。
下图是对主函数各部分名称的说明。
在前面的两个范例中,主函数main()的部首都是int类型,int是整数integer单词的缩写,表示返回给系统的数据类型是整型数据,返回值是0,在return语句中体现了出来。
C语言编译系统是由上往下编译的。一般被调函数放在主调函数后面时,前面就该有声明,否则C语言由上往下的编译系统将无法识别。正如变量必须先声明后使用一样,函数也必须在被调用之前先声明,否则无法调用!函数的声明可以与定义分离,要注意的是一个函数只能被定义一次,但可以声明多次。
函数定义:
返回类型 函数名(参数类型1 参数名1,…,参数类型n 参数名n)
{
函数体...
}
例如:
int fun(int a,int b)
{
int c;
c=a+b;
return c;
}
在程序中,如果main()函数在前,必须在main()中写函数声明;如果函数在main()前面,可以不在main()中写函数声明!
下面看一个有关函数声明和函数定义的综合例子,比较一下它们有何不同。
#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;
}
读者可能已经注意到,很多语句后面都跟有“/*”和“*/”符号,它们表示什么含义呢?
在前文已经说过,我们在编辑代码的过程中,希望加上一些说明的文字,来表示代码的含义,这是很有必要的。
费了很大精力,绞尽脑汁编写的代码,如果没有写注释或者注释得不够清楚,一年后又要使用这段代码时,当年的思路全部记不得了,无奈之中,只得重分析、重理解。试问,因为当初一时的懒散造成了今日的结局,值得吗?又比如,一个小组共同开发程序,别人需要在该小组写的代码上进行二次开发,如果代码很复杂、没有注释,恐怕只能用4个字形容组员此时的心情:欲哭无泪。所以,编写代码时建议书写注释,这样做有百利而无一弊。
注释的要求如下。
(1)使用“/*”和“*/”表示注释的起止,注释内容写在这两个符号之间,注释表示对某语句的说明,不属于程序代码的范畴,比如【范例1-1】和【范例2-1】代码中“/*”和“*/”之间的内容。
(2)“/”和“*”之间没有空格。
(3)注释可以注释单行,也可以注释多行,而且注释不允许嵌套,嵌套会产生错误,比如:
/*这样的注释/*特别*/有用*/
这段注释放在程序中不但起不到说明的作用,反而会使程序产生错觉,原因是“这样”前面的“/*”与“特别”后面的“*/”匹配,注释结束,而“有用*/”就被编译器认为是违反语法规则的代码。
从书写代码清晰,便于阅读、理解、维护的角度出发,在书写程序时应遵循以下规则。
(1)一个说明或一个语句占一行。我们把空格符、制表符、换行符等统称为空白符。除了字符串、函数名和关键字,C忽略所有的空白符,在其他地方出现时,只起间隔作用,编译程序对它们忽略不计。因此在程序中使用空白符与否,对程序的编译不产生影响,但在程序中适当的地方使用空白符,可以增加程序的清晰性和可读性。
例如下面的代码:
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点规则,大家在编程时应力求遵循,以养成良好的编程习惯。
文件中声明函数,就像变量可以在头文件中声明,而在源文件中定义一样,函数也可以在头文件中声明,在源文件中定义。把函数声明直接放在每个使用该函数的源文件中是大多数新手习惯并喜爱的方式,这是合法的。但是这种方式古板且易出错。解决方法就是把函数的声明放在头文件中,这样可以确保指定函数的所有声明保持一致。如果函数接口发生变化,则只需修改其唯一的声明即可。
将提供函数声明的头文件包含在定义该函数的源文件中,可使编译器能检查该函数的定义和声明是否一致。特别地,如果函数定义和函数声明的形参列表一致,但返回类型不一致,编译器会发出警告或出错信息来指出差异。
那么学过了函数声明与函数定义,它们到底有什么不同呢?我们知道函数的定义是一个完整的函数单元,它包含函数类型、函数名、形参及形参类型、函数体等,并且在程序中,函数的定义只能有一次,函数首部与花括号间也不加分号。而函数声明只是对定义函数的返回值类型进行说明,以通知系统在本函数中所调用的函数是什么类型。它不包含函数体,并且调用几次该函数就应在各个主调函数中作相应声明,函数声明是一个说明语句,必须以分号结束!
学习了这一章的内容,读者是不是对C语言有更好的理解呢?下面了解一下我们在使用函数时,需要注意的一些问题。
① 函数声明可以省略形参名,但是函数定义的首部必须写出所有形参名并给出其对应的数据类型。
② 函数原型的主要目的是为了声明函数返回值类型以及函数期望接受的参数的个数、参数类型和参数顺序。
③ 如果程序中没有某个函数的函数原型(没有说明),编译系统就会用第一次出现的这个函数(函数定义或函数调用)构造函数原型。
④ 在默认下,编译系统默认函数返回值为int。
在编写函数时的常见错误:当调用的函数与函数原型不相匹配时,程序会提示语法错误,并且当函数原型和函数定义不一致时,也会产生错误。
1.要求输入两个整数a和b,然后再输出这两个数。
2.输入两个数,求两个数的和sum以及平均数avg(float类型)。
提示
求和的公式是sum=a+b;
求平均数的公式是avg=sum/2。
3.请参照本章例题,编写一个C程序,输出以下信息:
**************************
Very Good!
**************************