新書推薦:
《
新能源材料
》
售價:HK$
63.8
《
传统文化有意思:古代发明了不起
》
售價:HK$
43.8
《
无法从容的人生:路遥传
》
售價:HK$
74.8
《
亚述:世界历史上第一个帝国的兴衰
》
售價:HK$
107.8
《
大处着眼:持久战与《论持久战》
》
售價:HK$
85.8
《
人工智能与大数据:采煤机智能制造
》
售價:HK$
96.8
《
未来漫游指南:昨日科技与人类未来
》
售價:HK$
97.9
《
新民说·逝去的盛景:宋朝商业文明的兴盛与落幕(上下册)
》
售價:HK$
173.8
編輯推薦:
? 这是一本按照“先让读者在实践中遇到问题,再通过理论学习来解决问题”思路编写的C语言实践指导书;
? 全书本着“急用先学,学以致用”的原则,将一个完整项目开发过程分解为65个任务,将C语言的核心知识点按照项目需求的顺序贯穿其中,并注重编程思维和编码习惯的训练;
? 使用《换个姿势学C语言》,读者可快速进入项目开发状态,锻炼发现问题、分析问题和解决问题的核心能力。
內容簡介:
这是一本指引零基础读者使用C语言逐步完成一个完整项目的实践指导书。全书以完成“外汇牌价看板”项目为目标,将编程语言基础、程序设计及调试方法、软件工程实践的经验融入其中,帮助初学者度过最艰难的入门阶段。
全书共11课:编程基础(第1~3课)介绍了什么是程序、不同编程语言的特点、C语言程序的结构以及使用Visual Studio 2022编写C语言程序的方法;C语言核心知识(第4~7课)从实际需求出发介绍了C语言程序中常用的数据结构,包括变量、结构体、数组等,这部分还介绍了指针、动态内存分配和文件访问、自定义函数库的知识;图形用户界面实现原理和方法(第8、9课)以在屏幕上绘制“点”为基础,逐步介绍显示图形、位图的方法和原理,并将文本界面的“外汇牌价看板”程序升级到图形用户界面;“外汇牌价看板”程序的完成与交付(第10、11课),在前面已完成内容的基础上对“外汇牌价看板”进行重构,完善细节并使其达到交付标准。此外,在附录A(电子版形式,请扫描第1页的二维码获取)介绍了一些有关计算机的基础知识。
《换个姿势学C语言》不仅适合对学习编程感到困难的读者,也适合那些“看了很多书,听了很多课,但仍然没有编程思路,不会动手写程序”的读者,还适合没有编程经验的读者学习。
目錄 :
第1课 开始之前
1.1 为什么很多人学不会编程 1
1.2 基于应用的学习方式 2
1.3 明确“外汇牌价看板”程序的设计
目标 3
1.3.1 什么是“外汇牌价看板” 4
1.3.2 通过需求会议确定软件功能要求 6
1.3.3 编写需求规格说明书 7
1.3.4 设计原型系统 7
1.4 找到程序设计的思路 9
1.4.1 划分功能模块 9
1.4.2 确定程序运行的硬件环境 10
1.4.3 选择程序架构 12
1.4.4 选择程序设计语言 15
1.5 小结 16
第2课 准备开发环境
2.1 软件开发工具的组成和用途 17
2.1.1 源代码编辑器 17
2.1.2 编译器 18
2.1.3 调试器 19
2.1.4 版本管理系统 19
2.2 安装集成开发环境 20
2.2.1 为何需要集成开发环境 20
2.2.2 选择集成开发环境 21
2.2.3 安装Visual Studio Community
2022 22
2.3 编写和运行第1个C语言程序 26
2.3.1 规划项目目录结构 27
2.3.2 创建解决方案和项目 28
2.3.3 在空白项目中增加和运行程序 32
2.4 使用MSC编译器 36
2.4.1 为何使用“cpp文件” 36
2.4.2 设置Visual Studio中的C 项目
属性 36
2.5 小结 38
2.6 检查表 39
第3课 分析第1个程序
3.1 程序由多个相互调用的功能
(function)组成 40
3.1.1 C语言中最基本的功能模块被称为
函数 41
3.1.2 “Hello,World”程序中的函数 41
3.1.3 通过调试工具观察函数的调用
过程 43
3.2 定义和调用函数的方法 45
3.2.1 函数从哪里来 45
3.2.2 定义和调用函数 46
3.2.3 调用标准库函数 49
3.3 源程序如何“变成”可执行文件 57
3.3.1 预处理 58
3.3.2 编译 59
3.3.3 链接 60
3.4 重复地sayHello 61
换个姿势学
C
语言
X
3.4.1 新增sayHelloForFiveTimes函数 62
3.4.2 修改sayHelloForFiveTimes函数 63
3.4.3 如何规范地给函数命名 64
3.4.4 函数的声明和定义的区别 65
3.4.5 注释 67
3.5 小结 68
3.6 检查表 68
第4课 获取和显示外汇实时牌价
4.1 如何获取实时牌价数据 70
4.2 下载和引用外汇牌价接口库 71
4.2.1 下载外汇牌价接口库 71
4.2.2 显示美元的中行折算价 72
4.2.3 分析显示美元中行折算价程序 75
4.3 数据类型与变量 78
4.3.1 数据类型与变量声明 79
4.3.2 找到变量在内存中的地址 81
4.4 给变量赋值 82
4.4.1 变量的初值不是默认为0 83
4.4.2 将常量的值赋值给变量 83
4.4.3 将变量的值赋值给另一个变量 86
4.4.4 将算术计算的结果赋值给变量 87
4.4.5 将函数的返回值赋值给变量 90
4.4.6 交换两个变量的值 91
4.5 选择结构程序 91
4.5.1 关系运算符和关系表达式 92
4.5.2 使用if语句实现选择结构93
4.6 小结 96
4.7 检查表 96
第5课 获取完整的牌价数据
5.1 使用数组存储数据 99
5.1.1 数组的声明方法 100
5.1.2 将外汇牌价数据存入数组 101
5.1.3 访问数组元素 102
5.1.4 突破数组大小的限制 111
5.2 处理数组中的数据 126
5.2.1 查找数组中的最大值 126
5.2.2 数组排序 132
5.3 字符和字符串 141
5.3.1 计算机中的字符 142
5.3.2 字符编码 143
5.3.3 编码是如何被显示成字符的 145
5.3.4 C语言中的字符 148
5.3.5 从键盘输入字符并显示 149
5.3.6 C语言中的字符串 154
5.3.7 使用scanf函数输入字符串159
5.4 获取和显示货币名称 160
5.4.1 获取某种货币的全部牌价数据 161
5.4.2 分析GetRatesAndCurrencyNameBy
Code函数的原型 163
5.5 小结 164
5.6 检查表 164
第6课 创建自己的函数库
6.1 什么是函数库 173
6.1.1 静态链接库 173
6.1.2 动态链接库 173
6.2 自定义字符串处理函数 174
6.2.1 计算字符串长度 175
6.2.2 在字符串中查找特定字符的位置 178
6.2.3 转换字符串中的大写字母为小写
字母 181
6.2.4 复制字符串 184
6.2.5 自定义字符串函数的其他要求 191
6.2.6 字符串处理的库函数 195
6.3 处理键盘输入 196
目
录
XI
6.3.1 使用scanf函数输入数值196
6.3.2 自定义数据输入函数 202
6.4 在Visual Studio 2022中创建
静态库 209
6.4.1 创建静态库项目 209
6.4.2 函数库中的代码组织 211
6.4.3 分发函数库 214
6.4.4 在项目中引用Mars函数库 215
6.5 小结 216
6.6 检查表 216
第7课 获取全部外币牌价并保存为文件
7.1 使用结构体存储不同类型的多项
数据 222
7.1.1 定义结构体 223
7.1.2 声明结构体变量 225
7.1.3 访问结构体变量的成员 225
7.1.4 结构体变量的内存占用和内存
对齐 227
7.1.5 使用typedef为结构体创建别名 231
7.1.6 获取货币牌价并填充至结构体 232
7.2 文件访问的基础知识 234
7.2.1 使用fopen函数打开或创建文件 234
7.2.2 使用fwrite函数写入数据到文件 236
7.2.3 文件缓冲区 239
7.2.4 使用fread函数从磁盘文件读入
数据 240
7.3 将结构体存入磁盘文件 241
7.3.1 获取牌价数据并写入磁盘文件 242
7.3.2 分析输出文件的内容 243
7.3.3 从磁盘文件读入数据到结构体 247
7.4 获取和保存全部外币牌价数据 248
7.4.1 使用结构体数组存储多种外币
牌价 249
7.4.2 取得外币牌价并存入结构体
数组 250
7.4.3 将显示外币牌价的代码封装成
函数 251
7.4.4 获取全部外币牌价 253
7.4.5 一次获取全部牌价 255
7.4.6 保存和打开数据文件 261
7.5 小结 266
7.6 检查表 267
第8课 图形编程基础
8.1 图像在计算机中的表示 276
8.1.1 来自人工绘制的矢量图形 276
8.1.2 来自数码相机或扫描仪的位图 277
8.2 计算机是如何显示图形的 279
8.2.1 大型发光二极管显示屏 280
8.2.2 OLED显示屏 281
8.2.3 LCD显示屏 281
8.3 使用EasyX图形库283
8.3.1 下载和安装EasyX图形库 283
8.3.2 初始化图形窗口并绘制一个白
色的点 284
8.4 基本的绘图操作 286
8.4.1 绘制线 286
8.4.2 控制绘图颜色 291
8.4.3 绘制和填充矩形框 296
8.5 小结 301
8.6 检查表 302
第9课 显示图形和文本元素
9.1 常见的位图文件格式 306
9.1.1 常见的位图格式 306
换个姿势学
C
语言
9.1.2 BMP文件基本结构307
9.2 显示24位BMP图像 307
9.2.1 打开BMP文件并读取文件头308
9.2.2 从文件中获取第1个像素的颜色 317
9.2.3 绘制每个像素 319
9.3 优化BMP图像显示程序 324
9.3.1 重新组织代码结构,减少main
函数中的代码 324
9.3.2 displayBMP函数的设计与实现 326
9.4 显示不同字体的文字 340
9.4.1 显示文字的原理 341
9.4.2 使用EasyX的函数显示文字 342
9.4.3 设置文字格式 343
9.5 控制屏幕分辨率和全屏显示窗口 346
9.5.1 通过EnumDisplaySettings函数获得
当前屏幕分辨率 346
9.5.2 改变和恢复屏幕分辨率—
ChangeDisplaySettings 348
9.5.3 隐藏窗口边框和按钮 349
9.5.4 setFullScreenWindow函数和restore
DisplayMode函数的实现 350
9.6 小结 353
9.7 检查表 353
第10课 完成外汇牌价看板程序
10.1 将程序分为三层 356
10.2 设计和实现外汇牌价看板程序的
表现层 357
10.2.1 明确表现层需要完成的功能 358
10.2.2 创建新项目并加入工具函数 359
10.2.3 显示外汇牌价看板的固定部分 365
10.2.4 在1页中显示7行牌价 370
10.2.5 显示实时外汇牌价 386
10.2.6 实现分页循环显示 391
10.2.7 其他细节问题 403
10.2.8 实现按任意键退出 410
10.3 设计和实现外汇牌价看板的数据
访问层 414
10.3.1 设计LoadRates函数 415
10.3.2 实现LoadRates函数 417
10.3.3 显示提示信息 423
10.4 消除隐蔽的隐患 427
10.4.1 排除内存泄漏 427
10.4.2 请检查网络连接 432
10.5 切换和恢复屏幕分辨率 440
10.6 小结 441
10.7 检查表 441
第11课 达到交付标准
11.1 使用相对路径 442
11.1.1 修改getFlagFileName函数 444
11.1.2 修改dal.cpp 444
11.2 项目的配置管理 444
11.2.1 Debug和Release的区别 446
11.2.2 生成程序的Release版本 448
11.2.3 生成外汇牌价看板程序的Release
版本 450
11.2.4 x86(Win32)和x64的区别 454
11.3 制作安装程序 455
11.3.1 安装Microsoft Visual Studio Installer
Projects 455
11.3.2 创建外汇牌价看板的安装程序 457
11.3.3 安装外汇牌价看板程序 467
11.4 后续学习建议 469
11.4.1 重构外汇牌价看板程序 469
11.4.2 后续学习方向及学习建议 470
后记
內容試閱 :
关于本书
从2002年开始,笔者陆续在培训机构、大学和企业里担任程序设计课程的教师,
培训的对象包括在校大学生和已经工作了多年的程序员,也包括从其他专业转过来的学
生。很多学生往往在入门阶段非常迷茫,感觉“看了很多书,听了很多课,但仍然没有
编程思路,仍然不会动手写程序”,进而选择了“从入门到放弃”。这促使笔者开始思
索是什么原因造成了这样的情况,学编程一定需要“天赋”吗?有没有一种学习路径可
以在降低难度的同时训练学生的编程思维?
为了解决这些问题,在过去十几年里笔者和同事始终坚持带领学生以项目实训的方
式展开学习,用项目需求来推动技术学习,取得了不错的教学效果,也积累了一些实训
案例。
在2018年的某次授课中,一名学生提出“我们能不能不在‘黑框框’下编程”,这
激发了笔者进行新课程设计的动力并设计了 “外汇牌价看板”实训项目用于教学,同时
也开始了这本实践指导书的编写。2019—2021年我们分别在多个教学班级进行了教学试
点,取得了很好的教学效果,在此基础上最终完成了本书。
本书的读者
如果你符合下列条件之一:
●准备开始学习软件开发,但不知道如何入门,也不知道方向;
●学过某种程序设计语言,但不知道它有什么用,也无法将其应用于实践;
●会做很多练习题,但从来没有从头至尾完成过一个项目;
● 之前学习的挫折让你产生学不会编程这样消极的念头。
那么这本书就是适合你的。本书使用最简单的 C 语言作为入门语言,对读者之前的专
业、编程经验没有特殊要求。
本书特色
在本书的编写过程中,笔者始终把“急用先学、学以致用”作为最重要的原则,
避免对语言细节的过多深究造成的学习压力和乏味感;按照“先在实践中发现问题,再
学习相应的理论知识或技能来解决问题”的思路,让读者以最快的速度进入项目开发状
态,并在这个过程中有意识地锻炼读者发现问题、分析问题和解决问题的能力。
换个姿势学
C
语言
IV
因此,本书不是一本讲述C语言细节的专著,而是一本实践指导书。它着重帮助读
者建立对程序设计的系统认知,并通过案例来培养和锻炼读者的编程思维,积累编程经
验,从而度过最艰难的入门阶段。
本书所使用的案例放弃了传统C语言教学中纯文本模式下的编程,加入了对图形显
示原理和方法的介绍,并最终完成基于图形用户界面的项目开发。
如何使用本书
本书是一本实践指导书,全书是完全围绕完成“外汇牌价看板”这个目标而设计的。
因此,除了第1课是必备的背景知识外,从第2课开始每课都要解决一个或多个实际问题。
按照这种方式学习编程已经被大量学习者证明是最有效的,也最符合软件工程师日
常学习和工作的模式,对锻炼读者的编程思维和习惯养成是非常有益的。
第2~9课课后都安排了“小结”和“进度检查表”,请读者务必确保在完成了“进度
检查表”中每一个任务后再继续后续章节的学习。
更重要的建议是,读者在按照本书的指引完成实训项目的开发后,需要抛开这本书
按照自己的思路和想法,尝试找到比本书更好的方式来重新设计和实现一次“外汇牌价
看板”程序。如果读者真的这样做了,一定会有额外的收获。
本书的案例
在本书中,笔者将与读者共同从零开始逐步完成“外汇牌价看板”这个小型应用程序。
但“罗马不是一天建成的”,谁也不可能一开始就有能力完成整个程序的开发。
在最终实现“外汇牌价看板”程序之前我们将要学习程序和计算机的基础概念、基础的
C语言语法知识和数据结构,以及从文本界面逐渐过渡到图形用户界面,并且在这个过
程中设计软件需要的基础功能,才可以最后将它们“组装”成可以交付的“外汇牌价看
板”程序。在这个软件开发过程中读者需要先完成如表0-1所列的65个小任务,它们分布
在第2~9课中。
表0-1 书中涉及的65个任务
任务编码
任务名称
L02_01_HELLOWORLD
第1个C语言程序
L03_01_PRINTF
printf函数的基本用法
L03_02_ESCAPE_CHARACTERS
在printf函数中使用转义符
L03_03_SAY_HELLO_FOR_MANY_TIMES
多次调用一个函数
L04_01_RATES_EXAMPLE
使用外汇牌价接口库获取指定外币中行折
算价
L04_02_ADDRESS_OF_VARIABLE
显示变量的内存地址
L04_03_AVOID_OVERFLOW
使用更大的数据类型解决溢出问题
L04_04_CONDITIONAL_EXPRESSION
显示条件表达式的值
L04_05_IF_STATEMENT
使用if语句显示较大的数值
前
言
V
续表
任务编码
任务名称
L05_01_GET_RATES_BY_CODE
根据货币代码获得完整的外汇牌价数据
L05_02_TRAVERSAL_IN_ARRAY
使用goto语句遍历数组
L05_03_FOR_EXAMPLE
使用for循环遍历数组
L05_04_SIZEOF_OPERATOR
使用sizeof运算符计算数组大小
L05_05_OUT_OF_ARRAY
数组访问越界
L05_06_ARRAY_LIMIT
了解数组大小限制
L05_07_MALLOC
动态分配内存
L05_08_ADDRESS_OF_VARIABLE
获取变量的地址
L05_09_CHAGE_VARIABLE_WITH_POINTER
使用指针改变变量的值
L05_10_ACCESS_LARGE_ARRAY
“伪造”一个大数组
L05_11_FIND_MAX_IN_ARRAY
在数组中查找最大值的函数
L05_12_SWAP_ELEMENT
用函数交换变量的值
L05_13_SORT_ARRAY
数组排序
L05_14_CHAR
C语言中的字符编码
L05_15_KEY_IN_CHAR
从键盘输入字符
L05_16_STRING_CONST
C语言中的字符串常量
L05_17_STRING_VARIABLE
C语言中存储可变字符串的方法
L05_18_KEY_IN_STR
从键盘输入字符串
L05_19_GET_RATES_AND_CURRENCY_NAME_BY_
CODE
获取和显示全部牌价数据
L06_01_STRING_LENGTH
计算字符串长度
L06_02_INDEX_OF_CHAR
在字符串中查找特定字符
L06_03_TO_LOWER_CASE
大写字母转换为小写字母
L06_04_STRING_COPY
字符串复制
L06_05_SCANF_NUMBER
使用scanf函数输入数值
L06_06_SCANF_STRING
使用scanf函数输入字符串的隐患及解决
方法
L06_07_SCANF_MULTI_VARIABLES
使用scanf函数输入多项数据
L06_08_INPUT_FUNCTION
典型用户输入功能实现
L06_09_INPUT_INTEGER
输入整数并检查有效性
L06_10_INPUT_CHAR
输入字符并检查有效性
L06_11_INPUT_STRING
输入字符串并检查有效性
L06_12_USE_MARS_LIB
引用Mars函数库
L07_01_STRUCT
在程序中使用结构体
L07_02_SIZE_OF_STRUCT
计算结构体变量的大小
L07_03_DISPLAY_ADDRESS_OF_MEMBERS
显示结构体成员的内存地址
L07_04_MEMORY_ALIGNMENT
内存对齐
L07_05_TYPE_DEF
自定义数据类型
L07_06_GET_RATE_RECORD_BY_CODE
根据货币代码获取外币牌价
L07_07_OPEN_AND_WRITE_FILE
向文件中写数据
换个姿势学
C
语言
续表
任务编码
任务名称
L07_08_OPEN_AND_READ_FILE
从文件中读数据
L07_09_SAVE_USD_RATES
保存美元牌价数据到磁盘文件
L07_10_READ_RATES_FROM_FILE
从磁盘文件读取牌价数据
L07_11_READ_RATES_TO_STRUCTURE_ARRAY
将外币牌价读取到结构体数组
L07_12_READ_RATES_ONE_BY_ONE
逐一读取所有外币牌价
L07_13_GET_AND_DISPLAY_ALL_RATES
一次读取全部外币牌价数据并显示
L07_14_GET_AND_SAVE_ALL_RATES
一次读取全部外币牌价数据并保存到磁盘
文件
L07_15_DISPLAY_RATES_IN_FILE
显示磁盘文件中的全部外币牌价数据
L08_01_PUT_PIXEL
在屏幕上绘制点
L08_02_DRAW_LINES
在屏幕上绘制线
L08_03_SET_COLOR
控制绘图颜色
L08_04_DRAW_BOX
绘制和填充矩形框
L09_01_DISPLAY_BMP
显示BMP图片
L09_02_DISPLAY_BMP_V2
改进显示BMP图片的程序
L09_03_DISPLAY_TEXT
在图形窗口中显示文本
L09_04_SET_AND_RESTORE_DISPLAY_MODE
设置和恢复屏幕分辨率
L09_05_NO_BORDER_AND_BUTTONS
实现无边框、无按钮的窗口
L09_06_SET_FULL_SCREEN_WINDOW
设置和恢复屏幕模式
完成这些任务后,我们将在第10课最终完成“外汇牌价看板”程序,在第11课通过
改善程序的细节使其达到交付标准。“外汇牌价看板”最终运行效果如图0-1所示,并且
每隔5分钟会自动刷新并显示最新的外汇牌价信息。
图0-1 “外汇牌价看板”运行效果
前
言
本书的网络资源
本书案例所需的素材、程序文件、全部案例代码以及因篇幅原因未能收入书中的内
容,读者可以从清华大学出版社的网站下载,下载请扫描下面的二维码。
G:\\文件帮科技\\换个姿势学C语言 1校袁超0609\\1校替换0601\\二维码\\P1 ,扩展阅读:《重新认识计算机》.png
欢迎各位读者通过电子邮件(hexh@163.com)与笔者联系,提出指正的意见、建议
或在使用本书过程中遇到的问题。
本书的创作灵感来自日常教学中与学生们的交流和互动,他们的学习热情也感染和
支持我完成这项工作。中国地质大学(北京)的项乐、浙江工业大学教科学院的廖伟霞
参与了本书部分案例代码的编写和测试工作,并从读者的角度提出了很多有益的建议。
清华大学出版社的编辑老师在本书写作期间给予了很多帮助和指导,本书的很多修
正来自于他们的宝贵意见,也是在他们的帮助下本书才得以出版。
何旭辉
2022年8月于武汉