前言
C/C++作为目前最为流行的编程语言之一,是高等院校计算机类相关专业学生的必修课程,也是计算机科学研究和软件开发的重要基础。熟练掌握C/C++编程语言和相关的开发工具对于今后深入学习和理解数据结构、算法设计与分析、操作系统、计算机网络、数据库原理、编译原理等专业课程意义重大。C/C++定义了编写程序的语法规则,其中的算法则告诉如何利用这两门语言编写出高质量的程序。本书主要介绍C语言常用的函数、C++常见类库和函数、常用算法及范例,旨在帮助读者掌握C/C++中的常用函数和算法,理解如何使用这些函数,并熟谙算法思想。
本书分为3篇:C语言函数篇、算法篇、C++输入/输出流与容器篇。其中,C/C++函数、容器主要介绍每个函数的原型、参数含义、返回值及使用方法。相对来说,这两部分内容比较容易掌握。算法这一篇分11章(第8~18章)进行介绍,其中第18章是以范例的形式介绍程序调试技术。我们学习计算机软件开发的过程往往是从掌握编程语言的语法开始,但在学完编程语言后,只是了解了这些语言的语法,会编写简单的程序,如果遇到一些稍有难度的程序(如蛇形方阵、螺旋矩阵)时,仍然会感到吃力。而导致这种结果的其中一个原因是看的程序太少,阅读的程序设计类书籍太少,另一个原因是没有学过数据结构和算法方面的知识。在读完一本C语言的书后,虽然了解了它的语法规则,但是可能还不怎么会用,这就需要多看一些范例,并上机实践。除此之外,还需要学习并掌握一些常见的算法。算法是程序设计的思想和灵魂,而C/C++只是实现算法的工具。这就像做一道菜,语言工具就是食材和作料,算法就是烧菜的方法,至于菜烧得好吃不好吃,则取决于厨师的手艺。在编程中,算法决定了编写出的程序是不是有效,因此,熟练掌握算法至关重要。
为了让读者快速地掌握函数的使用方法,除了介绍函数的功能、参数、返回值外,本书还提供了极具代表性、趣味性和实用性的范例,以开拓读者思路,使其理解算法设计的奥妙。例如,第12章的“求n个数中的最大者”“和式分解”“大牛生小牛问题”都巧妙地利用了递归来实现。第16章矩阵算法中的“打印螺旋矩阵”“将矩阵旋转90度”虽然代码不长,却充分体现出程序员的程序设计思想和实际编程技术。考虑到算法的实用性,本书尽量将范例与实际工作和生活相结合,比如加油站问题、找零钱问题、大小写金额转换、求算术表达式的值。本书的算法部分可以被看作对前面基础知识的一种升华。
本书作为一本工具书,对每一个函数和算法范例的关键知识点都进行了说明,并列出了注意事项,以帮助读者快速上手。
本书的特点
1.覆盖全面,讲解详细
本书的内容不仅包括C函数库、C++函数库,还包括常用的算法。本书精选了C语言中的7个常用函数库,其中包含了100多个常用函数,还精选了多个常用算法,比如排序算法、查找算法、递推算法、枚举算法、递归算法、贪心算法、回溯算法等。此外,还精选了C++中的11个常用类库,其中包含了近200个常用函数。这些函数涵盖了C/C++的各个领域,基本满足读者的各项需求,算法也比较全面,所选用的范例也都是比较经典的范例。
2.层次分明,结构清晰
本书层次分明、结构清晰,便于读者阅读和掌握。本书用篇、章、节和小节划分知识点,其中第1篇C语言函数篇中每一小节都以【函数原型】【函数功能】【函数参数】【函数的返回值】【函数范例】【函数解析】的形式分别进行讲解。
3.图表丰富,语言通俗
本书对每个函数都结合了具体的范例进行讲解,旨在通过具体运用,让读者明白函数的用法。而本书的算法则除了有具体的范例外,还用比较直观的图表来表示抽象的概念,以便读者掌握。在叙述上,本书普遍采用短句或易于理解的语言,让读者阅读起来更轻松。
4.范例具体,实用性强
针对每个函数和算法,本书均提供了具体的应用范例。此外,还选取了一些比较大的综合范例以说明多个函数的综合应用效果。另外,除了对算法原理的讲解,本书还筛选了典型范例,并提供了完整的实现代码,方便读者掌握算法思想,提高读者的实践能力。
本书的内容
第1篇主要讲解C语言的常用函数,包括ctype.h、stdio.h、string.h、stdlib.h、math.h、stdarg.h、time.h库函数,如字符处理函数、标准控制台输入/输出函数、字符串和字符数组、字符串转换函数、内存分配函数、过程控制函数、数学函数、可变参数函数、日期和时间函数的应用。
第2篇主要讲解常用算法,包括插入排序、交换排序、选择排序、归并排序和基数排序算法、基于线性表/树的查找算法,以及哈希查找算法、顺推法和逆推法、枚举算法、递归算法、贪心算法、回溯算法、分治算法、矩阵算法、实用算法等。
第3篇主要讲解C++输入/输出的基类ios_base类、iostream类、文件流类、string类、vector类、deque类、list类、stack类、queue类、set类、map类的使用。
程序调试的提示
在教学研究和实践过程中,经常有学生在上机实践时会犯这样或那样的错误,那么如何能快速找出错误程序的位置和原因,以便让程序正常运行呢?方法如下。
1.熟练掌握一个开发工具
为了解决程序调试问题,首先要选择一个比较趁手的开发工具,比如Visual C++或Visual Studio。
● 对于语法错误,编译器会直接定位错误行,并给出相应的错误提示。
● 对于逻辑错误和运行时的错误,则需要为可能出问题的代码段设置断点,以跟踪查看变量在程序运行过程中的变化情况。通过对输入的数据进行分析,就能很快找出问题所在。
2.亲自动手,多上机实践
虽然本书为所有的范例都提供了完整的代码,但还是建议读者亲自在计算机上运行一下代码,在编写代码和运行代码的过程中体会算法的设计思想。这个过程中,你也许会不小心输入错误,也许会为一个小错误苦恼半天,但在经过多次检查和艰难调试后,你最终会找到代码错误的原因并且成功将其解决。当你看到代码正确地运行出结果时,你可能会激动不已,甚至喜极而泣。这个过程也是每个成功者的必经之路,只有经历无数次的痛苦、挣扎,你才有可能成长为一名经验丰富的C/C++程序员,或一名合格的软件工程师。计算机是一门学科,也是一门技术,算法思想固然很重要,但再伟大的算法也需要对其进行验证。正所谓实践是检验真理的唯一标准,这个亘古不变的道理在这里同样成立。
如果有读者看完本书后感觉有所收获,那么编者长时间的辛苦与付出就是值得的,也就达到了编写本书的目的。
本书范例的运行结果(如图1-1)中显示的路径仅为作者本地运行路径,读者运行的路径略有不同。
本书由陈锐、孙玉胜、梁辉主编,戎璐、徐洁、蔡增玉、陈明、李昊、崔建涛参与编写。
由于时间仓促,加上编者水平有限,书中难免会存在一些不足和疏漏,希望读者不吝赐教,通过邮箱235668080@qq.com与编者联系,或通过QQ群(1059130240)与编者沟通交流。
致谢
本书的编写参阅了大量相关文献、著作、网络资源,在此向各位原著者致谢!
另外,本书的出版得到了郑州轻工业大学和人民邮电出版社的大力支持与帮助,在此向其表示感谢。尤其要感谢人民邮电出版社的蒋艳编辑和王旭丹编辑,她们十分看重本书的实用价值,在她们的努力下,本书才得以顺利出版。
最后,还要感谢所有编者的家人,正是他们的默默付出与鼓励才使我们顺利完成本书的编写。
陈锐