
C语言程序设计新思路主编巨同升副主编贾凌刘冬霞刘焕亭科学出版社科学出版社北京

内容简介本书依据最新版的C语言参考手册编写,兼顾C89与C99标准。本书内容包括引论、基本数据与运算、顺序结构、选择结构、循环结构、数组、指针、字符串处理、函数、函数进阶、编译预处理、结构体与共用体、位运算、文件等。本书采用“编程驱动知识”的方式布局知识,采用“真实情境法”讲解语法,采用“逐步构造法”讲解程序。本书在主要章节中,以二维码的形式提供了C语言程序设计的教学视频,尤其适合于初学者使用。本书依据VisualC++2010Express和DEV-C++5.1I集成开发环境进行讲述,符合当前软件发展趋势,便于读者上机调试程序。本书可作为高等院校各专业学生学习C语言程序设计的教材和参考书。图书在版编目(CIP)数据C语言程序设计新思路/巨同升主编.一北京:科学出版社,2020.1ISBN978-7-03-064295-0I,@CII.@巨.IⅢI.C语言-程序设计IV.@TP312.8中国版本图书馆CIP数据核字(2020)第007455号责任编辑:胡云志滕云丨责任校对:杨赛责任印制:霍兵/封面设计:华路天然工作室科学斜学出版社出版北京东黄城根北街16号邮政编码:100717http://www.:iencep,石家庄维文印刷有限公司印刷科学出版社发行各地新华书店经销*2020年1月第版开本:787×10921/16-2020年1月第一次印刷印张:161/4字数:410000定价:46.00元(如有印装质量问题,我社负责调换)

前言C语言是目前世界上使用较广的高级程序设计语言,广泛应用于系统程序设计、数值计算、自动控制等诸多领域。C语言的产生为有趣,C语言实际上是UNIX操作系统的一个副产品。1972年,美国贝尔实验室的DennisRitchie为了开发UNIX操作系统专门设计了一种新的语言——C语言。C语言具有强大的功能、很高的运行效率,兼具高级语言的直观性与低级语言的硬件访问能力,因而很快从贝尔实验室进人了广大程序员的编程世界。DennisRitchie设计C语言的初裹是用于开发UNIX操作系统,因此C语言称得上是一门专业型语言。这使得C语言在具有强大的功能、很高的运行效率的同时,也在一定程度上存在语法嗨涩难懂、不便于初学者掌握的不足之处。因此,C语言似乎不太适合作为程序设计初学者的入门语言。不过在现代人效率观念的驱使下,仍有许多学校将C语言选作程序设计初学者的门语言。其实,这样选择也未尝不可。只不过在教学中应当思考如何采取有效的应对策略,使初学者避开嗨涩难懂的语法,从C语言中最基本、最实用的编程方法入手,力争使学习者尽快学会程序设计的基本方法,进而达到应用编程解决实际问题的目的。从学习者的角度来说,要注意抓住C语言学习的重点所在一一编程方法,而不要沉溺于C语言的语法细节之中。因为学习C语言的目的是编写程序解决实际问题,而过于细致地研究C语言的语法对于提高编程能力并没有大的帮助。针对上述问题,本书在教学内容的编排上,采用了“编程驱动知识”的方式,即根据各章编程目标的需求,合理地安排每一个知识主题的切人点,从而将C语言中枯燥难懂的语法知识分解到全书各章中;采用“真实情境法”讲解语法,力求通过程序实例展示归纳出语法知识点;在讲解程序实例时,采用“逐步构造法”写出程序,即通过编程思路、算法设计、程序原型等环节一步一步地构造出完整的程序,从而加深读者对编程方法的理解和掌握。本书在主要章节中以二维码形式提供了C语言程序设计的教学视频,有助于读者自学参考使用。本书第2章由刘焕亭编写,第3章、第12章由贾凌编写,第4章、第6章由崔孝风编与,第7章由宋吉和编写,第14章由刘冬霞编写,其余各章由巨同升编写。全书由巨同升统筹并定稿。本书所附教学视频由巨同升、解红、周洁、刘冬霞讲授。李业刚、李增祥对本书的编写提出了宝贵的建议在本书编写过程中,作者得到了山东理工大学计算机科学与技术学院广大同仁的大力支持与帮助,在此表示感谢。由于作者水平所限,书中难免存在不足之处,敬请广大读者批评指正。作者2019年9月于山东理工大学

科学出版社

L如何学好C语言C语言作为一门专业型的语言,具有功能强天、运行效率高、实用性强等特点。但是若作为学习程序设计的入门语言,C语言却存在诸多不足之处,如C语言的语法过于灵活C语言的指针功能过于强大等。凡此种种,往往会给初学者造成诸多困惑,甚至严重打击初学者学习程序设计的自信心。C语言难学似乎是初学者的一个共识,那么C语言到底难在哪里,如何才能破解C语言难学的困局呢?其实,C语言学习的难点主要在于其语法,而造成C语言语法难学的主要因素包括以下几方面。(1)C语言提供了多种功能独特的运算符,如自增(自减)运算符、复合赋值运算符、条件运算符、逗号运算符、位运算符等。(2)C语言允许将赋值表达式、自增(自减)表达式嵌人其他表达式中,导致C语言语句的表达形式灵活多变。(3)C语言中指针的使用无处不在、功能异常强大。(4)C语言中大大扩展了逻辑运算量的类型。(5)C语言中花括号与分号的位置若稍作变化,则往往导致完全不同的含义。以上特色一方面造就了C语言优异的性能,另一方面也给初学者埋设了诸多的困惑与陷阱,令人爱恨交加,欲黑不能。下面从三个方面探寻正确的C语言学习之道。1.如何学习C语言的语法其实,只要采取了正确的学习策略,C语言语法难学的问题是可以解决的。首先,需要明确语法在程序设计中的地位。学习C语言的最终目的是学会编写程序解决现实问题,因此编程能力的培养是学习的核心。而语法是编程的基础,是为编程服务的、因此语法的学习应当紧紧围绕编程这个核心,脱离了编程的语法是毫无意义的。是不是说必须系统地、牢固地掌握了C语言的语法,才能学好编程呢?其实并非如此。对于程序设计,更重要的是确定编程的总体思路或者说是算法,而不是具体实现中的语法。既往的经验表明,只需要掌握少量最常规的语法,就可以编写出解决一般问题的程序。至于有些非常规语法,即使是专业的程序员都极少用到,更别说是初学者了。因此,在学习时不要过于看重语法知识的系统性与连贯性,而应当根据程序设计的需求,循序渐进地积累语法知识。例如,C语言中的运算符与表达式特别丰富,若将这些内容集中到一章中学习,则既枯燥乏味,又难以深人理解;若根据语法与程序设计的内在联系,将这些内容分布到适当的章节中讲述,则既容易理解,又便于学以致用。例如,自增(自减)运算符和逗号运算符在学习循环结构之前儿平不会用到,完全可以延后到循环程序部分再学习:初学者应当优先学习既容易理解,又频繁使用的常规语法;而尽量避免研究既嗨涩难懂,又极少使用的非常规语法。例如,形如j-i+++i+++i++,a+=a-=a+a这样的表达式

在实际编程中几乎不可能出现,因此并无研究的必要。再如,printf函数中各种格式说明符的详尽用法、整型数据的内存表示形式及相互转化、扩展的逻辑运算量及逻辑运算的短路for语句的各种变式、通过指针引用二维数组的元素、行指针变量、指向函数的指针、链表等,这些内容初学者最好暂时不要深究。当然,并不是说这些非常规语法就完全不进行研究,而是要选择恰当的学习方式和时机。正确的学习方式是在编程实践中研究语法,包括在阅读其他人写好的程序时发现的语法知识点,以及在自已编写程序、调试程序的过程中查阅并掌握需要用到的语法知识。这种方式具有更好的针对性,因而能够获得更好的学习效果。而正确的学习时机,则是在比较熟练地掌握常规语法并能够编写一般难度的程序之后,再来研究这些非常规语法。采取这种策略相当于降低了知识之间的跨度,从而能够更好地理解和掌握知识。2.如何培养基本的编程能力编程能力的培养需要一个长期积累的过程。那么,如何才能逐步地积累编程经验呢?首先是要尽量多地阅读其他人写好的程序,能够看懂程序实现的功能,分析出每条语向的作用,即如何一步步实现程序功能,然后上机调试阅读过的程序,从最简单的程序入手,将程序代码一条一条地录人、编辑、编译、运行。在调试程序的过程中,能够发现在书面上静态分析程序时所不能发现的问题,然后经过查阅资料、主动思考、改正错误的过程,即可获取新的知识和技能。而这种收获是仅仅通过书面学习方式所不能得到的。因此,可以说不厌其烦地反复调试程序是学好程序设计的制胜法宝,这种说法一点都不为过。在不断阅读已有程序的同时,还要经常自已编写程序。从模仿已有的程序人手,尝试编写简单的程序。编写程序的过程最好在计算机上完成,边编写、边调试运行,然后根据调试中发现的问题及时地修正程序。在不断地改正错误的过程中,编程能力将会得到有效提高。对于具有一定复杂度的程序,可以首先尝试实现其中的一部分功能,待现有的程序调试运行成功之后,再在此基础上扩展另一部分功能,然后如此循环往复,直至最终获得功能完善的程序。3.如何让编程水平更上一层楼在具备基本的编程能力之后,如何才能使自己的编程水平更上一层楼呢?将程序设计应用于解决现实问题是提高编程能力行之有效的方法,而面向项目的学习就是一种体现这种思路的卓有成效的培养学生综合分析问题、解决问题能力的教学模式。项目是指来源于c现实中、具有一定复杂度的问题,通常需要学生运用多方面的知识综合分析、统筹规划、语才能解决。言面向项目的学习,需要学生自行查阅资料,准备与项目相关的知识。通过这种方式所程获得的是最牢固、“有机”的知识,更重要的是这种学习方式能够提高学生自主学习的能力。序来自现实中的项目,往往是错综复杂的,在分析问题的过程中需要舍弃非本质的内容,提设取出本质的核心问题,从而培养学生综合分析问题、统筹规划和解决复杂问题的能力。计新思作者路2019年9月iv

目录5.3for循环前言595.4do-while循环62如何学好C语言5.5循环的嵌套-65第1章引论·15.6循环辅助语句和while(1)1.1 程序与程序设计语言循环,691.2C语言的发展及特点135.7循环结构应用举例1.3C语言程序的构成72..45.8拓展:逗号表达式与for语1.4C语言程序的运行句变形:.976第2章基本的数据与运算2.19第6章数组··79标识符、变量与常量6.1一维数组:2.2.·79整型、实型与字符型数据.·116.2维数组,2.3算术运算符和算术表达式·17-92指针第7章·99第3章顺序结构程序设计·217.1变量的指针与指针变量993.1C语言的语句类型21:变量的间接引用…3.2变量的赋值和初始化+·227.2-100指针与一维数组·3.3数据的格式输出与格式7.3:1037.4拓展:指针与二维数组…107输入....233.4字符型数据的输出与输入及7.5拓展:指针数组与二重指针:109混合运算..·303.5顺序结构程序举例·32第8章字符串处理:: 1123.6拓展:赋值运算中的类型8.1字符串的存储与引用·.. 112转换..8.2字符串的输和输出115·33选择结构程序设计8.3字符处理函数与字符串第4章.35处理函数关系表达式与逻辑表达式35:1184.1字符串处理应用举例125算法及其表示8.44.2..384.3if语句.·39第9章函数:1319.1用户函数的定义与调用·1314.4混合运算与强制类型转换···459.2函数的参数和返回值1384.5switch语句·469.3函数的调用方式与函数4.6选择结构程序举例...·50原型的声明·4.7拓展:条件表达式与goto.142语句…9.4.51变量的作用域和生存期1459.5拓展多文件程序.循环结构程序设计...152第5章.·54第10章5.1while循环.....··55函数进阶..15710.1指针作函数参数....1575.2自增自减运算符与复合赋值运算符10.2数组名作函数参数.160.58

10.3拓展:指针型函数和指向12.7拓展:枚举类型202函数的指针·16912.8拓展:内存的动态分配20410.4函数的递归调用·17312.9拓展:链表206..位运算第11 章编译预处理命令:177第13章.214宏定义命令·位运算符11.1 -17713.1*214文件包含命令.17913.2位运算程序举例11.2*+21911.3拓展:条件编译-180文件第14章·22114.1文件概述.221第12章结构体与共用体:18412.1结构体变量与结构体14.2文件的打开与关闭...222类型·18414.3文件的读写22512.2结构体变量的初始化和拓展:文件的读写定位与14.4引用-187随机读写+:238结构体数组:191附录A12.3ASCII码字符表·:24212.4结构体指针194附录BC语言的关键字·24512.5结构体变量的跨函数附录C运算符的优先级和结合性·246引用·197附录D常用的C语言库函数24812.6共用体199参考文献252科学出c语言程序设计新思路vi

第1章引论计算机解决五花八门的问题,主要是通过软件实现的。这是因为一种计算机的硬件系统一经设计完成,就是基本固定不变的。而如何充分发挥硬件系统的功能,则要完全依赖软件。软件是程序、数据及相关文档的集合,其中,程序是软件的主体。1.1程序与程序设计语言程序,就是用于完成特定任务的一组指令的序列。从广义上来说,一篇菜谱、一段操作指令都是程序。而狭义的程序则特指计算机程序。编写计算机程序需要有专门的程序设计语言。程序设计语言的发展经历了机器语言、汇编语言和高级语言三个时代,机器语言的指令都是二进制代码,非常不便于编程者使用,而且其程序难以在具有不同指令系统的计算机之间移植。汇编语言有所改进,其指令采用助记符表示,使用起来直观一些。不过,汇编语言指令与机器语言指令本质上是相同的,其程序仍然难以在具有不同指令系统的计算机之间移植。因而,机器语言与汇编语言统称为低级语言。为了克服低级语言的缺点,从20世纪50年代开始,计算机专家着手研究设计一种更加通用、与具体计算机硬件无关,表达方式接近人类自然语言和数学语言的程序设计语言,这种语言称为高级语言。从那时起,计算机专家陆续研究开发了数以千计的程序设计语言。就目前而言,常用的程序设计语言也有数十种之多。各种程序设计语言的使用排名情况,可以查看TIOBE网站(https://www.tiobe.com/tiobe-index)的程序设计语言社区排行榜。1.2C语言的发展及特点1.2.1C语言的发展在程序设计语言的发展历程中,从来没有一种语言像C语言一样具有如此广泛而长久的影响力。这主要体现在如下三个方面(1)C语言是编写操作系统的第一选择,也是编写其他系统软件的优先选择。(2)C语言在嵌人式系统程序设计方面具有独特的地位,C语言是除了汇编语言之外使用最多的单片机编程语言。(3)鉴于C语言获得了巨大的成功,人们相继开发了许许多多的“C-like”程序设计语言,从而构成了庞大的C家族,包括C++、C#、Objective-C、Java、PHP、Swift等。C语言的诞生颇为有趣,C语言实际上是UNIX操作系统的一个副产品。1972年,美

国贝尔实验室的DennisRitchie为了开发UNIX操作系统,专门设计出一种新的程序设计语言一C语言。由于C语言具有强大的功能、很高的运行效率,兼具高级语言的直观性与低级语言的硬件访问能力,因而它很快从贝尔实验室走入了广大程序员的编程世界。1.2.2C语言的标准化1.传统C语言早期的C语言没有统一的标准和规范,直到1978年BrainW.Kernighan和DennisM.Ritchie合著的TheCProgrammingLanguage一书出版,才使这种状况得以改变。这本书中定义的语法很快就成为当时事实上的C语言规范,通常将这种规范称为传统C语言。2.C89标准在C语言的发展过程中,出现了很多C语言的“方言”版本,C语言的标准化成为一个紧迫的问题。1983年,美国国家标准化协会(AmericanNationalStandardsInstitute,ANSI)着手进行C语言的标准化工作,直到1989年12月颁布实施。1990年,国际标准化组织(InternationalOrganizationforStandardization,ISO)接受了这一标准,并将其颁布为国际标准。通常将这一标准称为C89标准。目前,几乎所有的C语言编译器都能够支持C89标准。3.C99标准1999年,国际标准化组织再次颁布了新的C语言标准,通常称其为C99标准。目前大部分C语言编译器都能够支持C99标准。4.C11标准2011年,国际标准化组织再次颁布了迄今最新的C语言标准,通常称其为C11标准。目前,几种主流的C语言编译器能够部分地支持C11标准。本书内容主要依据C89标准讲解,部分内容同时兼顾C99标准。1.2.3C语言的特点C语言具有如此强大持久的生命力,成为经久不衰、最受欢迎的程序设计语言之一,是由C语言自身所具有的如下显著特点所决定的。(1)简洁。C语言的关键字与保留标识符特别简短,并采用一对花括号定义程序块,从而使得C语言的程序异常简洁。c(2)灵活。C语言定义了若干功能独特的运算符,加之赋值运算可以嵌入其他表达式语中,导致C语言语句的表达形式灵活多变。当然,过于灵活多变的语法表示也会给学习者書程带来诸多的陷阱与困惑。序(3)功能强大。C语言具有丰富而独特的数据类型与运算符,使得C语言具有强大的设数据表达能力与数据处理能力,计(4)效率高。这主要得益于灵活强大的指针功能,使得C语言程序具有仅次于汇编语新言程序的执行效率。思路2