南北商城/二手免佣/个人免佣/线上3%/线下3%/0自营/0仅退款/0直通车/0押金/0月租/0年费/0技术费/0罚款/T+0

C语言程序设计――程序思维与代码调试

价格
66.11
配 送 至
配送地区
购买数量
仅剩 85 件,抓紧时间购买哦!
热卖排行
    新品推荐
      推荐商品
        商品详情
        规格参数
        商品评论
        商品咨询
        销售记录
        作者:周幸妮 著
        出版社:电子工业出版社
        出版时间:2019-07
        版次:1
        装帧:平装
        货号:1050009
        上书时间:2023-09-09
        【书    名】 C语言程序设计——程序思维与代码调试
        【书    号】 9787121370984
        【出 版 社】 电子工业出版社
        【作    者】 周幸妮
        【出版日期】 2019-07-01
        【版    次】 1
        【开    本】 其他
        【页    码】 464
        【定    价】 89.00元

        【内容简介】 
        本书站在程序设计的角度,从程序和算法、数据、程序语句、指针、结构体、函数和文件等基本的C语言要素讲起,全面介绍C语言程序设计的方方面面,引导学习者以“程序的思维”看问题,即如何从一个问题入手,算法应该如何设计、程序如何实现的角度去看程序设计问题,让初学者容易理解并掌握程序设计的基本思想与方法。通过对实际问题、解决方法或存在问题的讨论,引入新概念,深入浅出,让学习的过程变得有趣且容易。本书图文、表格并茂,便于直观理解。

        【目录】 
        第1章  程序概论1

        1.1  流程的概念1

        1.1.1  关于流程1

        1.1.2  流程的表达方式3

        1.1.3  流程的基本逻辑结构4

        1.2  程序的概念8

        1.2.1  自动化流程9

        1.2.2  程序的概念9

        1.2.3  程序的执行特点12

        1.2.4  计算机工作流程12

        1.3  程序的构成13

        1.3.1  计算机解题流程之数据14

        1.3.2  计算机解题流程之处理15

        1.3.3  计算机解题流程之结果15

        1.4  程序的开发过程17

        1.4.1  问题引例17

        1.4.2  程序开发基本步骤18

        1.4.3  计算机解题实例19

        1.4.4  程序开发流程24

        1.5  C语言程序简介25

        1.5.1  C程序样例25

        1.5.2  C程序框架结构28

        1.5.3  代码格式要求29

        1.6  本章小结30

        习题31

        第2章  算法32

        2.1  算法的概念32

        2.2  算法的表示35

        2.3  算法的可行性39

        2.4  算法的通用性42

        2.5  算法的全面性44

        2.6  算法设计过程与算法特性49

        2.6  本章小结52

        习题52

        第3章  基本数据54

        3.1  常量与变量54

        3.1.1  常量54

        3.1.2  变量56

        3.2  数据类型62

        3.2.1  计算机中的信息表示62

        3.2.2  计算机中的信息处理问题

              讨论63

        3.2.3  C语言的基本数据类型66

        3.3  整数存储规则67

        3.3.1  有符号整数68

        3.3.2  无符号整数68

        3.3.3  字符类型数据69

        3.4  实数存储规则70

        3.5  运算符与表达式74

        3.6  数值处理76

        3.6.1  算术运算符和算术表达式76

        3.6.2  数据运算中的出界问题80

        3.7  逻辑判断处理81

        3.7.1  关系运算81

        3.7.2  逻辑运算82

        3.8  数据类型转换86

        3.8.1  强制类型转换88

        3.8.2  自动类型转换89

        3.9  其他运算90

        3.9.1  条件表达式90

        3.9.2  sizeof运算符91

        3.9.3  赋值运算符与表达式92

        3.9.4  复合赋值运算符92

        3.9.5  逗号运算符和逗号表达式92

        3.10  本章小结93

        习题94

        第4章  输入/输出95

        4.1  输入/输出的概念95

        4.1.1  标准输入/输出95

        4.1.2  C标准库函数96

        4.1.3  头文件96

        4.2  数据的输出97

        4.2.1  字符输出函数97

        4.2.2  字符串输出函数98

        4.2.3  格式输出函数99

        4.3  数据的输入102

        4.3.1  字符输入函数103

        4.3.2  字符串输入函数104

        4.3.3  格式输入函数105

        4.4  数据输入的常见问题109

        4.5  本章小结112

        习题113

        第5章  程序语句115

        5.1  顺序结构115

        5.2  双分支选择结构117

        5.2.1  双分支选择结构的语法规则117

        5.2.2  复合语句的作用118

        5.2.3  if语句实例119

        5.2.4  嵌套的if-else语句121

        5.3  多分支选择结构124

        5.3.1  多分支问题的引入124

        5.3.2  多分支结构语法规则125

        5.3.3  多分支结构实例128

        5.3.4  各种分支结构语句的比较134

        5.4  循环问题的引入134

        5.4.1  循环中的要素分析134

        5.4.2  循环三要素136

        5.4.3  循环语句137

        5.5  当型循环结构137

        5.5.1  当型循环语法规则137

        5.5.2  循环要素必要性验证138

        5.5.3  当型循环实例142

        5.5.4  循环控制方式146

        5.6  直到型循环结构146

        5.6.1  直到型循环语法规则146

        5.6.2  do-while的适用场合150

        5.6.3  do-while语句实例150

        5.7  当型循环的另一种形式151

        5.7.1  for语句语法规则151

        5.7.2  for语句实例152

        5.8  无限循环154

        5.8.1  实际问题中的无限制循环154

        5.8.2  无限循环的while语句表达154

        5.8.3  无限循环的for语句表达155

        5.9  中断循环157

        5.9.1  实际问题中的循环中断157

        5.9.2  跳出循环的break语句158

        5.9.3  在循环内跳转的continue

              语句161

        5.10  自由跳转机制164

        5.10.1  自由跳转的概念164

        5.10.2  无条件转移语句规则164

        5.10.3  无条件转移语句实例164

        5.10.4  goto语句的特点166

        5.11  本章小结167

        习题168

        第6章  数组172

        6.1  数组的概念172

        6.1.1  一组同类型数据的处理

              问题172

        6.1.2  一组同类型数据所需要的

              表达方式175

        6.2  数组的存储176

        6.2.1  数组的定义176

        6.2.2  数组的初始化178

        6.2.3  数组的空间分配179

        6.2.4  数组的空间查看180

        6.3  一维数组的操作183

        6.4  二维数组的操作196

        6.5  字符数组的操作205

        6.6  本章小结214

        习题215

        第7章  指针217

        7.1  指针的概念217

        7.1.1  名称引用和地址引用217

        7.1.2  存储空间的管理219

        7.1.3  指针的概念223

        7.2  指针的运算224

        7.2.1  指针运算符224

        7.2.2  指针运算种类224

        7.2.3  指针运算基本规则224

        7.2.4  指针偏移的意义227

        7.2.5  空指针的概念230

        7.3  指针与数组230

        7.3.1  指针与一维数组230

        7.3.2  指针与二维数组234

        7.4  指针与多组字符串问题238

        7.4.1  一维指针数组与指向指针的

              指针240

        7.5  本章小结241

        习题242

        第8章  复合类型数据244

        8.1  结构体的概念244

        8.1.1  问题引入244

        8.1.2  综合数据表的存储方案245

        8.2  结构体的存储246

        8.2.1  结构体类型定义246

        8.2.2  结构体变量定义248

        8.2.3  结构体初始化248

        8.2.4  结构体变量空间分配249

        8.2.5  结构体成员引用253

        8.3  结构体应用实例254

        8.4  共用体264

        8.4.1  问题引入264

        8.4.2  共用体的空间存储描述264

        8.5  枚举269

        8.5.1  问题引入269

        8.5.2  枚举的概念及定义形式270

        8.5.3  枚举实例271

        8.5.4  枚举的使用规则272

        8.6  声明新的类型名273

        8.6.1  问题引入273

        8.6.2  typedef声明形式及使用275

        8.7  本章小结275

        习题276

        第9章  函数278

        9.1  函数的概念278

        9.1.1  问题的提出278

        9.1.2  模块的概念279

        9.2  函数形式设计281

        9.2.1  模块间信息交流方法281

        9.2.2  函数形式设计282

        9.3  函数间信息交流机制设计285

        9.3.1  函数间信息交流特点分析285

        9.3.2  函数间信息交流之处理数据

              的提交与接收287

        9.3.3  函数结果的获取方式288

        9.4  函数总体设计289

        9.4.1  函数设计要素289

        9.4.2  函数间信息传递归结289

        9.4.3  函数的调用290

        9.5  函数设计实例292

        9.5.1  传值调用292

        9.5.2  传址调用298

        9.5.3  函数综合实例306

        9.5.4  main函数的参数316

        9.6  作用域319

        9.6.1  问题引入319

        9.6.2  模块的屏蔽机制321

        9.6.3  内存分区与存储分类322

        9.6.4  屏蔽机制1——变量的有效期

              和作用范围323

        9.6.5  屏蔽机制2——函数的有效

              范围330

        9.6.6  屏蔽机制3——共享数据的

              使用限制332

        9.7  递归333

        9.7.1  引例333

        9.7.2  递归概念336

        9.7.3  递归实例337

        9.8  本章小结339

        习题340

        第10章  编译预处理——编译前的

                   工作343

        10.1  问题的引入343

        10.2  宏定义344

        10.2.1  简单的宏定义344

        10.2.2  带参数的宏定义346

        10.2.3  宏定义的副作用348

        10.3  文件包含348

        10.4  条件编译350

        10.5  本章小结353

        习题354

        第11章  文件——外存数据的操纵356

        11.1  问题的引入356

        11.2  文件的概念357

        11.3  文件的操作流程358

        11.4  内存和外存的数据交流359

        11.5  程序对文件的操作361

        11.5.1  打开文件361

        11.5.2  文件的读写362

        11.5.3  关闭文件366

        11.5.4  随机读取文件内容367

        11.6  关于文件读写函数的讨论368

        11.7  程序调试与输入输出重定向372

        11.8  本章小结374

        习题375

        第12章  程序的运行377

        12.1  程序运行环境377

        12.1.1  集成环境主界面379

        12.1.2  建立项目380

        12.1.3  新建源文件382

        12.1.4  编辑源文件382

        12.1.5  编译源文件384

        12.1.6  链接程序385

        12.1.7  运行程序386

        12.2  程序测试387

        12.2.1  引子387

        12.2.2  程序测试方法与实例388

        12.3  程序调试概念392

        12.3.1  bug与debug392

        12.3.2  bug无处不在393

        12.3.3  软件调试的困难393

        12.4  软件调试的方法论394

        12.4.1  引例394

        12.4.2  软件调试的基本过程395

        12.4.3  程序错误的查找方法讨论395

        12.4.4  跟踪方法方案探索397

        12.5  程序调试工具399

        12.5.1  IDE中调试器的功能399

        12.5.2  调试命令401

        12.6  调试实例405

        12.6.1  基本调试步骤示例405

        12.6.2  调试查找程序错误示例407

        12.6.3  调用栈的使用示例416

        12.6.4  数据断点使用示例418

        12.7  本章小结420

        习题421

        附录A  运算符的优先级和结合性425

        附录B  ASCII码表426

        附录C  C语言常用库函数427

        附录D  常用转义字符表432

        附录E  位运算简介433

        附录F  在工程中加入多个文件435

        附录G  编程范式441

        附录H  空类型void问题449

        参考文献450

        【前言】 
        "前    言
        缘起
        2016年底,电子工业出版社与中新金桥信息技术有限公司合作,计划做一批立体化网络课程建设项目,作者因有《C 语言程序设计新视角》(以下简称《新视角》)一书,有幸参与到项目之中。在C语言课程视频的录制过程当中,作者引入了许多新的思路与方法,因此有了对《新视角》进行完善再版的想法。
        写作思路
        《新视角》一书结合作者多年教学实践经验,针对学生在学习程序设计中的困惑,侧重引入问题、分析问题、讨论解决问题的方法,本书是基于《新视角》的改进版本。在C语言、数据结构等程序设计课程的讲授以及课后和学生的沟通中,笔者认识到在编程学习中大家遇到的普遍问题归纳起来有四难:概念晦涩理解难,规则众多记忆难,法无定法编程难,bug深藏调试难。
        著名数学家欧拉(Leonhard Euler)说过,如果不能把解决数学问题背后的思维过程传授给学生,那么数学教学就没有意义,这种观点同样适用于其他各学科或课程的教学。理解原理、掌握解决问题的思维方法是学习过程的要点。分析学生在学习程序设计中的问题,*主要的问题是编程概念建立困难,其次是程序调试技巧难以把握。按照问题轻重的顺序,《新视角》一书尝试从以下这些方面来解决问题——重思维,揭本质,强调试,轻语法。《新视角》经过这些年的使用,发现依然有不少需要改进的地方,特别是在问题引入和解析各种机制设置的原因方面,本书对此做了较大篇幅的增加。 
        1.重思维
        图灵奖获得者、现代计算机科学的先驱人物高德纳,在其代表作《计算机程序设计的艺术》中指出,编程是把问题的解法翻译成为计算机能“理解”的明确术语的过程,这是在人们开始试图使用计算机时*难以掌握的。C语言又是在不错编程语言中公认属于较难掌握的,有枯燥乏味、规则众多、艰深晦涩的一面。
        计算机是一种自动化的工具,人们用这种工具来解决问题,会受到很多机器特性的限制,在一个与人们以往解决问题的运作规则不一样的系统中,已有的处理问题的经验很可能用不上。在程序设计语言中有很多概念是只学习过数理化知识的学生们从未接触过的,课堂上直接按传统教科书的内容讲述解释后,发现他们较难理解和接受。
        Garr Reynolds在《演说之禅》中这样写道:“好的故事可以终生受用,用于传道授业,用于分享,用于启迪,当然,也可以用于劝解。讲故事是吸引观众,满足他们对于逻辑、结构以及情感方面需求的一个重要方式。”本书中许多引例都是从有趣的故事开始,从实际问题引出与编程相关的话题,提出问题,引起读者思考,再从人直接解决问题到使用机器解决问题的不同角度加以讨论,分析相同与不同,*后提出相关的程序设计概念。为在叙述中有代入感,书中设计了布朗教授一家参与问题的讨论。布朗教授或以初学者的视角提出问题、探索解决方案,或以专家的身份讨论问题;布朗太太是编程小白,偶尔会有貌似可笑的外行言论;布朗教授的儿子小布朗是小学生,也常会提些看起来幼稚的问题。另外还有布朗教授的学生、同事及亲属参与“演出”。这样的设计思路,是遵循金出武雄(Takeo Kanade)教授在总结科研成功之道时提出的“像外行一样思考,像专家一样实践”方法论的一次实践。
        “如果我们从不同的角度对同一个概念进行学习并研究与其相关的问题,就能建立更多且更深层次的信息链接。这些信息链接和与其相关的内容交织,共同构成了我们日常所说的‘理解’。大脑处理的所有信息都不是孤立的,而是具有逻辑关系的一组信息。当这些信息具有结构性,能够和已经学过的知识、和学生的生活实际建立密切的联系时,就容易让人从不同的角度来思考这一信息,从而对其有深入且透彻的理解。”(Salman Khan,《翻转课堂的可汗学院》)《新视角》通过解析人与计算机解决问题的同与不同,探索问题的解决方法,培养学生基于计算机特点进行逻辑思维的素养。根据计算机解决问题的特点,通过介绍读程列表法、算法设计法以及经典的算法描述法等方法,让学生先学读程再学编程,从大的方向上把握编程的一般方法,逐步建立程序的思维。  
        2.揭本质
        “重视知识的本质,对于程序员来说这一点尤其重要。程序员的知识芜杂海量,而且总是在增长变化的。很多人感叹跟不上新技术。应对这个问题的办法只能是抓住不变量。大量的新技术其实只是一层皮,背后的支撑技术其实都是数十年不变的东西。底层知识永远都不过时,算法数据结构永远都不过时,基本的程序设计理论永远都不过时。”(刘未鹏,《暗时间》)
        编程没有现成的公式可以套用,虽然学生通过大量实例的学习可以从中总结出一些规律,但对于程序设计语言为什么设这样或那样的处理规则,可能在短时间内不一定能琢磨明白。知其然还要知其所以然,只有清楚了各种规则设计的原理,才能彻底理解规则,进而熟悉和掌握规则,*后举一反三熟练应用。从原理的剖析入手,这样能提高学习效率,学会用计算机解决问题的方法。本书增加了许多从实际的问题引入概念的内容,让学生知道程序设计各重要概念的来龙去脉;增加了对重要机制的设置原因进行本质讨论分析,把有关联关系的概念进行横向或纵向分析链接,对重点的概念或相关联的概念提炼出其中的要素,以期增加学生对课程关键内容的把握。 
        3.强调试
        “无论一个程序的设计结构如何合理,也无论文档如何完备,如果不能产生正确的结果,则其一文不值。”(Chris H. Pappas等所著的《C++程序调试》)人们制造的产品,一般都有一定的误差存在,比如设备或仪器。软件产品是一个例外,软件的*终交付形态是二进制的可执行码,执行码是不能容忍误差的,而人类的思维特性正好与之相反,是模糊和充满误差的,因此程序员很难一次就写出完全正确的代码。
        张银奎在其《软件调试》一书中指出,“软件调试技术是解决复杂软件问题的*强大工具。如果把解决复杂软件问题看作一场战斗,那么软件调试技术便是一种可以直击要害而且锐不可当的武器。应该说学会调试器命令不难,但如何用调试器调试程序,找到bug,却是一件很不容易的事情。”调试的技巧和经验需要很长时间的练习才能积累起来,对初学者而言是不容易掌握的,由此造成很多学生惧怕编程。
        “我们可以在调试程序和侦破谋杀案之间找出相似点来。实际上,在几乎所有的谋杀悬念小说中,谜案都是通过仔细分析线索,将表面上不重要的细节全联结起来而*终侦破的。”(Glenford J. Myers,《软件测试的艺术》)“调试有点像捕鱼:相同的情绪、热情和刺激。长时间静静地工作后*终得到的是别人所不能体验的喜悦。”(Eugene Kotsuba)掌握了程序调试技术,读者在学习和开发程序时就能独立发现问题、解决问题,这样可以大大提高学习的兴趣和信心。
        除了查找程序中的错误,调试其实对程序设计中不少概念的理解也是非常有帮助的,比如地址、存储单元、赋值、参数传递、作用域等,课堂上调试演示给予的直接的感性认识,比抽象的语言描述概念生动直观得多。“除了使用调试器调试程序、寻找代码中的问题,还可以认识其他软件、探索操作系统、观察硬件等。”(张银奎,《软件调试》)不同的调试器,基本调试功能的工作方式和工作原理是基本一致的,“与MS-DOS中的个调试器Debug.com相比,雨后春笋般涌现的各种调试器,它们的大多数在原理上并没有多少进步,只是界面不同而已。”(Kaspersky,Hacker Debugging Uncovered)可以说,学会调试,对后续诸多的计算机类课程学习都是有益的,因此,教会学生调试的方法和技巧应该是编程类课程的一个非常重要的内容。
        笔者在企业任程序员多年,参与过历时4年多、获国家科技进步奖的大型软件开发、开发成功后多用户单位安装调试、售后服务等系列工程工作,对程序测试与调试有一定的实践经验。在授课过程中一直坚持在课堂上穿插演示调试,学生只要有要求,随时可以将任何一个程序展开进行跟踪调试讲解。后来发现,即使在课上多次演示重要程序实例的调试,学生也掌握得并不好。细究原因,调试是一个复杂过程,不同的数据组织、程序逻辑、现场查看处理等情形非简单几句描述就可以清楚明白,学生当时看懂了,但要回想复习时,就没有可以参考的纸面资料,所以在《新视角》一书中把各章很多重点实例的调试过程及技巧都“静态固化”到纸面上,让学习者学习调试时有切实可行的参照方法。调试内容千变万化,技巧也非常