首页>参考读物>计算机科学与技术>软件与程序设计

手把手教你学C语言
作者 : 吴明杰 曹宇 吴丹 著
出版日期 : 2016-11-22
ISBN : 978-7-111-55307-6
定价 : 79.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 592
开本 : 16
原书名 :
原出版社:
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

图书特色

封底:
  很多人学习编程往往从C语言入手,但是学完遇到实际问题还是不知如何编程。本书源于作者的学习笔记,就是希望将学习中遇到的问题以更加通俗易懂的方式呈现给读者,为读者铺设好一条学习C语言的捷径。本书内容丰富,配有大量程序。每个知识点都结合相应的程序去讲解,这样更能巩固学习效果。
  本书主要针对C语言的初学者,即使完全没有编程基础,也能够通过阅读本书快速掌握C语言的核心知识。

本书特色
·叙述通俗易懂,撇弃了生涩的“高大上”专业术语,以风趣幽默的语言带领读者踏上C语言学习之旅。
·摒弃了传统C语言书籍脱离实际的、过时的用法,大大减轻学习压力。
·详细剖析每个知识点,且配有大量程序,帮助读者进一步巩固学习效果。

前勒口:
|内容简介|
  
  本书是学习C语言的入门书籍,因此前面几章对C语言的铺垫很充分,循序渐进,目的是让大家对C语言不再陌生,能够轻松愉快地学习。本书内容翔实全面,包括C语言基础知识、流程控制、数组、函数、指针、字符串、结构体、链表、文件操作等核心知识。这些知识构成了C语言的主要框架,本书在讲解这些知识时力求清晰明白,让每位读者都能够掌握。除此之外,本书还增加了很多在工作中需要用到的其他知识,比如栈和队列、自定义头文件、多文件编译、Linux下C文件的编译和链接、链接库等。

图书前言

当你拿起本书翻到这一页时,不管最后买与不买,都要对你说声谢谢,相遇就是缘分。
为什么要写这本书
本书是我人生中写的第一本书,基于我学习C语言的笔记。我从大学本科的时候开始学习C语言,每每学到新的知识或有心得体会时便记下来,就同写日记一样。就这样断断续续一直持续到硕士研究生阶段,那时差不多写了7万多字。我会将自己的笔记分享给很多想学C语言的师弟师妹。在学习的过程中他们发现,我的笔记比其他C语言书籍都更易于理解,讲得通俗易懂,风趣幽默。虽然当时只有7万多字,内容有限,但他们都认为“绝对是入门的好书”。所以我的“前期读者”以及专业导师都希望我能出版这些笔记。但我觉得还不够好,内容还不够充实,也怕误人子弟,浪费读者时间,毕竟当时水平有限。但这却在我心里埋下了一颗想要写一本好书的种子。
硕士研究生毕业后我应聘到上海起策教育科技公司工作,而我教授的第一门课就是C语言。从此我正式开始了与C语言全天候、长时期的亲密接触,也正式开启了我要将这本书写好的历程。在工作中,我有很多心得体会,或跟同事交流,或得益于很多前辈的教导。于是通过不断地补充,原先的7万多字变为现在的34万多字。在这个过程中我不断地对它精雕细琢,就像培养一个优秀的孩子一样,只希望能展现给大家一份优秀的作品。现在我觉得时机到了,可以让它为更多想学好C语言的读者做贡献了。
本书内容
本书是学习C语言的入门书籍,所以一开始对C语言的铺垫很充分,循序渐进,目的是让大家对C语言不再陌生,轻松愉快地学习。本书的内容对于入门来说是非常全面的,包括C语言基础知识、流程控制、数组、函数、指针、字符串、结构体、链表、文件操作等主流知识。这几个知识点是学习C语言的主要框架,对于不同的C语言书籍,区别就在于讲得是否详细,是否能让每位读者都掌握。本书中这几个知识点都讲得非常详细、透彻,是经过无数学弟学妹检验过的,也期待着读者的检验。除此之外,本书还增加了很多在工作中需要用到的其他知识,如栈和队列、自定义头文件、多文件编译、Linux下C文件的编译和链接、链接库等。
本书特色
因为本书基于我的学习笔记,所以本书更多的是以初学者的角度编写的,而且后来一直延续了这种风格,抛开“高大上”、生涩的专业术语,用词通俗易懂。
因为本书的很多内容是我在参加工作之后总结的,所以都是根据实际工作的需要整理而成。摒弃了脱离实际工作、过时的、不用的、“变态”的用法,大大减轻了读者学习的压力,除去了学习道路上的“杂草”,铺设了一条更好走的捷径。
此外,本书并不是单纯地讲理论,而是配有大量的程序。每个知识点都是配合程序讲解的,这样理解起来就更加容易。而且本书没有那种单独的、无答案的课后练习题,所有的练习都直接以程序的形式写在书中,读者在学习的时候直接练习那些程序即可,而且每个程序都是经过编译可以直接运行的。此外本书不会提供电子版的代码,因为学习C语言必须要多动手、多“敲”代码,所以我希望读者自己动手。
最后真切地希望本书能成为你编程路上的重要伙伴,为你的成长打下深厚的编程功底。“虽然我可能不是最好的,但我绝对是最用心的。”
限于作者水平有限,书中难免存在不当或疏漏之处,恳请读者批评指正,并多提出宝贵意见。希望在你的帮助下本书一步步接近完美,谢谢!

吴明杰
2016年9月

上架指导

计算机\程序设计

封底文字

很多人学习编程往往从C语言入手,但是学完遇到实际问题还是不知如何编程。本书源于作者的学习笔记,就是希望将学习中遇到的问题以更加通俗易懂的方式呈现给读者,为读者铺设好一条学习C语言的捷径。本书内容丰富,配有大量程序。每个知识点都结合相应的程序去讲解,这样更能巩固学习效果。

本书主要针对学习C语言的初学者,即使完全没有编程基础,也能够通过阅读本书快速掌握C语言的核心知识。


本书特色:
· 叙述通俗易懂,撇弃了“高大上”、生涩的专业术语,以风趣幽默的语言带领读者踏上C语言学习之旅。
· 剔除了传统C语言书籍中脱离实际的、过时的用法,大大减轻学习压力。
· 详细剖析每个知识点,且配有大量程序,帮助读者进一步巩固学习。

作者简介

吴明杰 曹宇 吴丹 著:暂无简介

图书目录

前言
第1章 为什么要学习C语言 1
1.1 C的起源和发展 1
1.1.1 计算机语言发展的三个阶段 1
1.1.2 语言运行速度的比较 3
1.1.3 C语言的演变过程 3
1.2 C的特点 4
1.2.1 C语言的优点 4
1.2.2 C语言的缺点 5
1.3 C的应用领域 6
1.4 C的重要性 6
1.5 本章总结 7
第2章 怎样学习C语言 8
2.1 学习C语言的心得 8
2.2 学习C语言的目标 9
2.3 常见问题答疑 9
2.3.1 学习Java之前为什么建议先学C语言 9
2.3.2 没学过计算机专业课程能够学懂C语言吗 10
2.3.3 英语和数学不好能学好C语言吗 10
2.4 本章总结 11
第3章 Microsoft Visual C++ 6.0的使用 12
3.1 为什么要学习VC++ 6.0 12
3.2 如何创建编程文件 12
3.3 编写一个最简单的程序 16
3.4 要养成时刻保存的习惯 18
3.5 编译–链接–执行 18
3.6 怎样运行第二个程序 20
3.7 编译–链接–执行时保存路径下的文件夹有什么变化 21
3.8 如何编写多文件程序 23
3.9 如何用VC++ 6.0调试程序 28
3.10 本章总结 30
第4章 从一个程序走进C语言 31
第5章 预备知识 35
5.1 CPU、内存、硬盘、显卡、主板、显示器之间的关系 35
5.1.1 电影是如何运行的 35
5.1.2 CPU为什么不能直接操作硬盘却能直接操作内存 35
5.1.3 内存的速度为什么比硬盘的速度快 36
5.1.4 为什么不将内存造得跟硬盘一样大 36
5.1.5 CPU是如何操作内存的 36
5.1.6 主板的作用 37
5.2 HelloWorld程序是如何运行起来的 37
5.3 字节 38
5.3.1 什么是字节 38
5.3.2 字节换算 38
5.3.3 小结 38
5.4 进制 39
5.4.1 什么是进制 39
5.4.2 进制转换口算法 40
5.4.3 进制转换公式法 41
5.4.4 人类为什么最习惯用十进制 44
5.4.5 计算机为什么用的是二进制 44
5.4.6 小结 44
5.5 数据类型 45
5.5.1 数据类型的分类 45
5.5.2 基本数据类型及其所占的字节数 46
5.6 常量 48
5.6.1 整型常量 49
5.6.2 浮点型常量 49
5.6.3 字符型常量 51
5.7 常量是以什么样的二进制代码存储在计算机中的 51
5.8 补码 52
5.8.1 原码和反码 52
5.8.2 补码的两个核心问题 53
5.8.3 int型变量所能存储的范围 55
5.8.4 int型和char型变量是如何相互赋值的 56
5.9 什么是ASCII 57
5.10 变量 58
5.10.1 如何定义变量 58
5.10.2 变量的本质 61
5.10.3 为什么要使用变量 62
5.10.4 变量的命名规则 62
5.10.5 为什么必须要初始化变量 63
5.10.6 小结 66
5.11 各类型数据之间的混合运算 66
5.12 代码规范化 68
5.12.1 代码如何写才能规范 68
5.12.2 代码规范化的好处 68
5.12.3 代码规范化的七大原则 69
5.12.4 小结 72
5.13 本章总结 72
第6章 printf的用法 73
6.1 printf的格式 74
6.2 输出控制符 76
6.3 %x、%X、%#x、%#X的区别 76
6.4 如何输出“%d”、“\”和双引号 77
6.5 本章总结 78
第7章 scanf的用法 79
7.1 概述 79
7.2 使用scanf的注意事项 82
7.2.1 参数的个数一定要对应 82
7.2.2 输入的数据类型一定要与所需要的数据类型一致 83
7.2.3 在使用scanf之前使用printf提示输入 85
7.3 本章总结 86
第8章 运算符和表达式 87
8.1 算术运算符 87
8.2 关系运算符 89
8.3 逻辑运算符 90
8.4 赋值运算符 93
8.5 运算符的优先级 94
8.6 本章总结 95
第9章 选择结构程序设计 96
9.1 流程控制 96
9.1.1 什么是流程控制 96
9.1.2 流程控制的分类 96
9.2 选择执行的定义和分类 97
9.3 if语句 97
9.3.1 if的最简单用法 97
9.3.2 if的控制范围问题 99
9.3.3 if…else的用法 100
9.3.4 if…else if…else的用法 103
9.3.5 练习—求分数的等级 104
9.3.6 练习—三个整数从小到大排序 107
9.3.7 if的常见问题解析 110
9.4 switch语句 113
9.5 本章总结 115
第10章 循环控制 117
10.1 循环执行的定义和分类 117
10.2 for循环 117
10.2.1 for语句的格式 117
10.2.2 自增和自减 121
10.2.3 for循环编程练习 122
10.2.4 for和if的嵌套使用 122
10.2.5 强制类型转换 125
10.2.6 浮点数的存储所带来的问题 130
10.2.7 for循环的嵌套使用 134
10.2.8 for循环嵌套编程练习 136
10.3 while循环 146
10.3.1 while的执行顺序 146
10.3.2 while和for的比较 147
10.3.3 如何看懂一个程序—“试数” 148
10.3.4 do…while 151
10.3.5 break和continue 156
10.4 清空输入缓冲区 158
10.4.1 输入缓冲区 158
10.4.2 %d和%c读取缓冲区的差别 159
10.4.3 用scanf吸收回车 161
10.4.4 getchar() 163
10.4.5 fflush(stdin) 166
10.5 本章总结 168
第11章 数组 169
11.1 一维数组的使用 169
11.1.1 一维数组的定义 169
11.1.2 一维数组的初始化 170
11.1.3 一维数组元素的引用 173
11.1.4 如何将数组a赋给数组b 174
11.1.5 如何编程获取数组的长度 175
11.1.6 练习 177
11.1.7 宏定义:#define 179
11.1.8 小结 182
11.2 数组倒置算法 182
11.3 数组查找算法 184
11.3.1 顺序查找 184
11.3.2 折半查找 185
11.4 数组插入、删除算法 188
11.4.1 插入算法 188
11.4.2 删除算法 189
11.5 数组排序算法 190
11.5.1 冒泡排序 190
11.5.2 插入排序 193
11.5.3 选择排序 196
11.5.4 快速排序 198
11.5.5 四种排序算法的比较 204
11.6 二维数组的使用 205
11.6.1 二维数组的定义 205
11.6.2 二维数组的初始化 206
11.6.3 二维数组如何输出 207
11.6.4 练习—杨辉三角 208
11.6.5 是否存在多维数组 213
11.7 本章总结 213
第12章 函数 215
12.1 概述 215
12.1.1 什么是函数 215
12.1.2 C程序的组成和编译单位 216
12.1.3 库函数和自定义函数 216
12.1.4 函数的调用 216
12.2 为什么需要函数 217
12.3 有参函数 217
12.3.1 有参函数定义的一般形式 218
12.3.2 形参和实参 219
12.3.3 主调函数中对被调函数的声明 220
12.3.4 定义函数时应指定返回值类型 221
12.3.5 函数的返回值 222
12.3.6 return是如何将值返回给主调函数的 222
12.3.7 函数的命名规则 223
12.3.8 练习—判断一个自然数是否是素数 223
12.4 函数的递归调用 227
12.4.1 什么是递归 227
12.4.2 使用递归必须要满足的两个条件 228
12.4.3 如何学习递归 229
12.4.4 递归和循环的关系 229
12.4.5 递归的优缺点 229
12.4.6 练习—用递归求n          的阶乘 230
12.4.7 练习—用递归实现1+2+3+…+100的和 232
12.4.8 练习—用递归求斐波那契数列 233
12.4.9 练习—用递归求两个数的最大公约数 234
12.4.10 小结 235
12.5 数组名作为函数参数 236
12.6 变量的作用域和存储方式 238
12.6.1 局部变量 239
12.6.2 全局变量 240
12.6.3 为什么不建议使用全局变量 242
12.6.4 自动变量(auto) 242
12.6.5 静态变量(static) 242
12.6.6 寄存器变量(register) 245
12.6.7 外部变量(extern) 246
12.7 本章总结 248
第13章 指针 249
13.1 指针的重要性 249
13.2 地址和指针的概念 250
13.3 指针和指针变量 251
13.3.1 指针变量的定义 252
13.3.2 指针变量的初始化 254
13.3.3 指针常见错误 257
13.4 指针作为函数参数 260
13.4.1 互换两个数 260
13.4.2 函数参数传指针和传数据的区别 262
13.4.3 定义只读变量:const 263
13.4.4 用const修饰指针变量时的三种效果 264
13.5 指针和一维数组的关系 266
13.5.1 用指针引用数组元素 266
13.5.2 指针的移动 267
13.5.3 指针变量的自增运算 271
13.5.4 两个参数确定一个数组 277
13.5.5 指针变量占多少字节 279
13.6 函数、数组、指针相结合的程序练习 280
13.7 动态内存分配 282
13.7.1 传统数组的缺点 282
13.7.2 malloc函数的使用(一) 283
13.7.3 malloc函数的使用(二) 286
13.7.4 free函数的使用 289
13.7.5 练习—动态数组的构建 291
13.7.6 动态数组长度的扩充和缩小 294
13.7.7 静态内存分配和动态内存分配小结 296
13.7.8 多级指针 296
13.7.9 跨函数使用动态内存 298
13.8 通过指针引用二维数组 302
13.8.1 二维数组元素的地址 302
13.8.2 二维数组的首地址和数组名 303
13.8.3 练习 307
13.9 函数指针 309
13.9.1 什么是函数指针 309
13.9.2 如何用函数指针调用函数 310
13.10 本章总结 311
第14章 字符串 313
14.1 字符串常量 313
14.2 不能将一个字符串常量赋给一个字符变量 314
14.3 字符数组 315
14.3.1 字符数组的定义 315
14.3.2 字符数组的初始化 315
14.3.3 初始化内存函数:memset() 318
14.3.4 用scanf输入字符串 320
14.4 字符串与指针 322
14.5 如何用scanf给字符指针变量所指向的内存单元初始化 323
14.6 字符串处理函数 324
14.6.1 字符串输入函数gets() 324
14.6.2 优先使用fgets()函数 326
14.6.3 使用gets()和fgets()前注意吸收回车 329
14.6.4 练习——判断字符串是否是回文字符串 331
14.6.5 练习——将字符串中的小写字母转换成大写字母 336
14.6.6 字符串输出函数puts() 337
14.6.7 字符串输出函数fputs() 339
14.6.8 字符串复制函数strcpy() 341
14.6.9 字符串复制函数strncpy() 343
14.6.10 内存拷贝函数memcpy() 343
14.6.11 sprintf() 345
14.6.12 字符串比较函数strcmp() 347
14.7 本章总结 348
第15章 自定义数据类型——结构体 350
15.1 为什么需要结构体 350
15.2 定义和使用结构体变量 351
15.2.1 声明结构体类型 351
15.2.2 定义结构体类型变量 352
15.2.3 结构体变量可进行哪些运算 354
15.2.4 结构体变量的初始化—定义时初始化 354
15.2.5 结构体变量的引用 355
15.2.6 结构体变量的初始化—先定义后初始化 358
15.2.7 结构体字节对齐 363
15.3 结构体数组 369
15.3.1 结构体数组的定义和引用 369
15.3.2 结构体数组定义时初始化 371
15.4 结构体指针 372
15.4.1 指向结构体变量的指针 372
15.4.2 指向结构体数组的指针 375
15.5 结构体变量和结构体指针变量作为函数参数 378
15.6 练习—动态构造存放学生信息的结构体数组 382
15.7 本章总结 385
第16章 链表 387
16.1 为什么要学习链表 387
16.1.1 数组的缺陷 388
16.1.2 链表的优点 388
16.2 链表的缺点 389
16.3 链表相关术语 389
16.4 链表的定义和分类 390
16.4.1 链表的定义 390
16.4.2 链表的分类 390
16.5 编写一个链表程序 391
16.6 练习——插入结点 396
16.7 练习——删除结点 404
16.8 练习——销毁链表 409
16.9 链表排序算法 413
16.9.1 如何互换结点 413
16.9.2 链表冒泡排序 414
16.9.3 链表插入排序 418
16.9.4 链表选择排序 421
16.9.5 链表快速排序 422
16.9.6 链表排序小结 425
16.10 单循环链表 425
16.11 双向链表 430
16.12 typedef的用法 434
16.13 本章总结 437
第17章 栈 439
17.1 内存的分区 439
17.2 线性表 440
17.3 栈的定义 441
17.4 栈的基本操作 441
17.5 链栈程序演示 442
17.6 栈的应用 450
17.7 本章总结 454
第18章 队列 455
18.1 队列的定义 455
18.2 顺序队列 455
18.3 链式队列的基本操作 456
18.4 链式队列程序演示 457
18.5 队列的应用 464
18.6 本章总结 464
第19章 文件操作 465
19.1 文件概述 466
19.1.1 文件的定义 466
19.1.2 文件的分类 466
19.2 文件类型指针变量 467
19.3 文件的打开 469
19.3.1 打开文件 469
19.3.2 文件的使用方式 470
19.3.3 练习——打开文件 472
19.4 文件的关闭 474
19.5 文件读写函数概述 475
19.6 fgetc()和fputc() 475
19.6.1 fputc() 475
19.6.2 fgetc() 477
19.6.3 fgetc()程序举例 478
19.6.4 fgetc()和fputc()结合程序举例 482
19.6.5 如何判断文件是否为空 483
19.7 fgets()和fputs() 484
19.7.1 fgets() 484
19.7.2 fputs() 486
19.8 移动文件位置指针:fseek()和rewind() 488
19.8.1 fseek() 488
19.8.2 rewind() 489
19.9 格式化读写函数:fprintf()和fscanf() 489
19.10 数据块读写函数:fread()和fwrite() 491
19.10.1 fwrite()函数 492
19.10.2 fread()函数 494
19.10.3 ftell() 500
19.10.4 如何用fread()和fwrite()删除文件中的数据块 503
19.10.5 练习——登录程序 509
19.11 本章总结 513
第20章 头文件 515
20.1 程序是如何编译生成可执行文件的 515
20.2 概述 516
20.2.1 什么是头文件 516
20.2.2 头文件的作用 517
20.2.3 什么样的内容适合放在头文件中 517
20.3 “# include <>”和“# include ""”的区别 518
20.4 如何自定义头文件 519
20.4.1 头文件的组成部分 519
20.4.2 #ifndef/#define/#endif 520
20.5 本章总结 522
第21章 位操作运算符 523
21.1 按位与(&) 523
21.2 按位或(|) 524
21.3 按位异或(^) 524
21.4 左移运算符(<<) 526
21.5 右移运算符(>>) 527
21.6 本章总结 528
附录A gcc编译工具的使用 530
附录B make自动化编译工具的使用 537
附录C gdb调试工具的使用 549
附录D 链接库 563
附录E 运算符的优先级和结合性 572
常用ASCII码表 574

教学资源推荐
作者: George Coulouris, Jean Dollimore, Tim Kindberg
作者: (美)Eric S.Roberts
作者: [美]沃特·萨维奇 (Walter Savitch) 肯里克·莫克(Kenrick Mock)著
参考读物推荐
作者: 闫洪磊 著
作者: (法)Yves Savourel
作者: David Buser, John Kauffman