陈波,重庆大学计算机学院讲师,艾尔曦医疗设备联合创始人。在工程实践方面,长期从事医用电子仪器的研究和开发,擅长应用新的计算机理论及方法解决具体工程问题。在教学实践方面,长期从事计算机程序设计课程的教学工作,擅长将工程实践经验与教学相结合,著有《C++编程基础及应用》、《Python编程基础及应用》等高校教材。
本书以仓颉编程语言为载体,是一本面向零基础读者的程序设计教材。通过阅读本书,读者可以掌握仓颉的基本语法,了解基础的算法及计算思维,并通过书中大量的实践案例,获得将语法知识及算法理论应用于工程实践的切身体验。本书以“知其然,更知其所以然”为理念,从计算机底层模型出发,由浅入深,逐步构建程序思维,在讲解语法的同时,始终贯穿对程序运行本质的剖析,帮助读者建立扎实的计算机科学基础及程序思维。本书可作为高等学校公共程序设计课程的教材,也可作为期望使用仓颉开发鸿蒙应用的软件工程师的参考用书。
陈波,重庆大学计算机学院讲师,艾尔曦医疗设备联合创始人。在工程实践方面,长期从事医用电子仪器的研究和开发,擅长应用新的计算机理论及方法解决具体工程问题。在教学实践方面,长期从事计算机程序设计课程的教学工作,擅长将工程实践经验与教学相结合,著有《C++编程基础及应用》、《Python编程基础及应用》等高校教材。
本书特色:1.初学者可流畅阅读和理解。编写团队耗费大量精力梳理与教学目标相关的知识体系,试图构造出一条曲折但畅通的学习路径;刻意避开了简单堆砌知识点的做法,而是通过科学的知识架构和学习路径设计,引导初学者在不断的自我肯定中步步为营,勇往直前。2.内容兼顾HOW&WHY。只有当读者将抽象的语法与CPU、内存层面的具体行为关联起来时,才能真正理解语法本身。编写团队在书中设置了大量“知所以然”环节,以帮助读者建立对程序和计算思维的更深刻理解。程序设计能力训练和软件工程习惯养成并举。编写团队力求在书中提供整齐有序、符合工程实践规范的代码示例,摒弃不规范的“教学代码”风格,在潜移默化中向读者传递“优美、良好的编程风格”的理念。3.案例设计贴近工程实践且富趣味性。书中的教学案例来自经济学、数学、管理学、医学等众多学科领域。期望通过对本书的学习,读者可以获得切实的通过程序设计解决实际工程问题的体验。4.将算法之“盐”融入语法之“水”。根据语法学习的需要,本书适当引入了一些算法和数据结构示例,包括但不限于选择排序、折半查找、散列数据结构与递归等。此外,在这些示例的讲授过程中,本书还力图潜移默化地向读者传递程序效率、计算复杂性、松散耦合等设计思想。5.本书的撰写得到了华为公司仓颉语言生态与产业发展总监王学智先生、华为基础软件人才发展总监王景全先生、华为仓颉编程语言团队技术专家刘俊杰先生的大力支持。6.配套教学资源丰富,除书中二维码所提供的电子资源外,编者团队将持续丰富本书配套的学习资源(在华为ICT学院及B站提供本书的视频MOOC,在拼题A等平台提供配套的在线评测习题集)。
书用文字写就,软件则由程序设计语言编写。用造字的仓颉来命名由华为公司开发的先进编程语言,确实是一个富有文化底蕴和科技内涵的选择。这一命名既是对中华传统文化的致敬,也彰显了华为以创新连接过去与未来、推动数字文明发展的雄心。
随着原生鸿蒙系统的正式发布,在操作系统这一重要的信息化基础领域,自主可控的国产产品替代进程迎来拐点。不难预测,在未来数年中,搭载原生鸿蒙系统的计算机和移动终端的数量将迎来爆发式增长,海量的App将由Android、iOS和Windows迁移至鸿蒙系统。与之相适应,与鸿蒙应用相关的工作岗位将呈现井喷式增长,形成全新的产业链和人才需求体系。作为为鸿蒙量身打造的全场景智能应用编程语言,仓颉将在相关产业链中发挥关键作用。
身居高校的青年学生们学习和使用仓颉,正逢其时。而将仓颉广泛地引入高等学校的教育体系,首先需要解决教材问题。我们合作编写的这本教材,应该是当前少有的由在职高校教师编写,适用于高等学校课堂教学的仓颉语言教材(适用于仓颉LTS 1.0.0及更高版本)。本书编写团队得此机缘,将仓颉这门优秀的语言推介给广大高校学子和教学同行,深感荣幸。
全书共分15章:第1章介绍计算机的基本模型、仓颉语言及编译器的基本概念、仓颉开发环境的搭建过程;第2 ~ 8章由浅及深、循序渐进地讲授仓颉基础编程知识,包括基本和复杂的数据类型,顺序、分支以及循环的程序结构,面向过程、面向对象以及函数式程序设计方法;第9章讨论容器;第10章讨论泛型程序设计;第11章讲授异常处理方法;第12章讲授文件及I/O操作;第13章深度讨论程序并发执行的方法和原理;第14章从一个极其简单的示例出发,讲授使用仓颉语言开发鸿蒙应用的原理、过程及方法;第15章则更进一步,带领读者使用仓颉语言搭建一个基于鸿蒙的聊天机器人App,该App通过网络与DeepSeek大语言模型进行交互。
笔者在重庆大学讲授“程序设计基础”“算法设计与分析”课程已近20年,在此期间,也一直以C、Python、Java等语言为工具,在医疗电子、工业自动化等领域进行程序设计实践,未曾间断。基于这些自认丰富的程序设计教学和实践经验,编写团队试图在本书中实现下述目标:
提供一本初学者可流畅阅读和理解的教科书。编写团队耗费大量精力梳理与教学目标相关的知识体系,试图构造出一条曲折但畅通的学习路径;刻意避开了简单堆砌知识点的做法,而是通过科学的知识架构和学习路径设计,引导初学者在不断的自我肯定中步步为营,勇往直前。
内容兼顾HOW & WHY。只有当读者将抽象的语法与CPU、内存层面的具体行为关联起来时,才能真正理解语法本身。编写团队在书中设置了大量“知所以然”环节,以帮助读者建立对程序和计算思维的更深刻理解。
程序设计能力训练和软件工程习惯养成并举。编写团队力求在书中提供整齐有序、符合工程实践规范的代码示例,摒弃不规范的“教学代码”风格,在潜移默化中向读者传递“优美、良好的编程风格”的理念。
案例设计贴近工程实践且富趣味性。书中的教学案例来自经济学、数学、管理学、医学等众多学科领域。期望通过对本书的学习,读者可以获得切实的通过程序设计解决实际工程问题的体验。
将算法之“盐”融入语法之“水”。根据语法学习的需要,本书适当引入了一些算法和数据结构示例,包括但不限于选择排序、折半查找、散列数据结构与递归等。此外,在这些示例的讲授过程中,本书还力图潜移默化地向读者传递程序效率、计算复杂性、松散耦合等设计思想。
实践是检验真理的唯一标准。本书的实践价值尚需全国同行和读者们的实践检验。编写团队虽尽心竭力,但水平有限,书中难免有疏漏之处,敬请读者批评指正。
本书的撰写得到了华为公司仓颉语言生态与产业发展总监王学智先生、华为基础软件人才发展总监王景全先生、华为仓颉编程语言团队技术专家刘俊杰先生的大力支持,其中,刘俊杰先生向笔者提供了本书第15章示例的初始版本,王景全先生提供了国内基础软件产业发展建议,在此表示感谢!
除书中二维码所提供的电子资源外,编者团队将持续丰富本书配套的学习资源(在华为ICT学院及B站提供本书的视频MOOC,在拼题A等平台提供配套的在线评测习题集),欢迎读者朋友们检索使用。
最后,怀着谦恭之心,诚邀全国高校教学同行加入我们的工作,共同把优秀的国产语言和系统推介给青年学子。也期待第二本、第三本乃至无数本仓颉与鸿蒙教材面世,因为唯有百花齐放,方能成就产业的真正繁荣与长足发展。
陈 波
2025年6月于重庆大学虎溪校区
第1章 学习准备 / 001
1.1 了解计算机 / 002
1.1.1 计算机的组成 / 002
1.1.2 内存模型 / 003
1.2 仓颉语言及编译器 / 004
1.3 仓颉编译器的下载及安装 / 005
1.4 第一个仓颉程序:学习仓颉,
拥抱未来 / 006
1.5 第一个仓颉项目:
世界,你好 / 008
第2章 计算及基本数据类型 / 010
2.1 main函数 / 010
2.2 变量 / 011
2.3 整数类型 / 013
2.4 浮点数类型 / 019
2.5 数值计算 / 022
2.5.1 自增、自减、求余、
求幂 / 022
2.5.2 复合操作符 / 023
2.5.3 操作符优先级 / 024
2.6 字符串 / 025
2.6.1 “单行”字符串 / 026
2.6.2 转义符号 / 028
2.6.3 多行字符串 / 029
2.7 用户输入 / 030
2.8 格式化 / 032
2.9 常量 / 033
2.10 对象命名 / 034
2.11 实践:鸡兔同笼 / 035
2.12 小结 / 036
第3章 程序结构基础 / 038
3.1 条件分支 / 038
3.1.1 if语句 / 038
3.1.2 if-else语句 / 040
3.1.3 条件表达式 / 041
3.1.4 多分支选择 / 043
3.2 模式匹配 / 046
3.2.1 不含选择器的match
表达式 / 046
3.2.2 包含选择器的match
表达式 / 048
3.3 布尔型 / 051
3.4 关系运算 / 052
3.5 使用库函数 / 055
3.6 自定义函数 / 057
3.7 实践:断点调试观察函数
调用 / 060
3.8 实践:心灵感应魔法 / 061
3.9 数组容器 / 064
3.10 实践:鼠牛虎兔 / 066
3.11 构造对象 / 067
3.12 小结 / 068
第4章 循环之道 / 069
4.1 for循环 / 069
4.2 实践:断点调试观察程序
循环 / 072
4.3 区间 / 073
4.4 实践:滚雪球的复利 / 074
4.5 容器的遍历 / 076
4.6 实践:发现圆周率 / 077
4.7 实践:质数判定 / 079
4.8 while循环 / 080
4.9 break—跳出循环 / 082
4.10 实践:九层之台,
起于累土 / 084
4.11 算法:折半查找 / 086
4.12 do‐while循环 / 089
4.13 continue—跳过当次循环/ 092
4.14 算法:选择排序与双重
循环 / 094
4.15 小结 / 098
第5章 自定义类型(上) / 099
5.1 定义新类型 / 099
5.2 对象构造 / 101
5.3 主构造函数 / 104
5.4 成员函数 / 105
5.5 终结器 / 109
5.6 静态成员 / 110
5.7 小结 / 113
第6章 高级数据类型及运算 / 115
6.1 字符 / 115
6.2 字符串进阶 / 118
6.2.1 比较 / 118
6.2.2 运算 / 119
6.2.3 成员函数 / 119
6.3 位运算 / 122
6.4 元组 / 123
6.5 枚举 / 125
6.5.1 定义 / 125
6.5.2 枚举对象匹配 / 126
6.5.3 成员函数 / 128
6.6 Option / 130
6.7 实践:市值排名 / 136
6.8 Unit类型 / 138
6.9 值与引用类型 / 139
6.10 引用与函数 / 143
6.11 小结 / 145
第7章 函数进阶 / 146
7.1 函数的默认值 / 146
7.2 函数重载 / 148
7.3 变长参数 / 150
7.4 实践:啃不完的麻辣兔头 / 151
7.5 对象作用域 / 154
7.6 递归 / 156
7.7 实践:汉诺塔 / 158
7.8 算法:分而治之的奥秘* / 163
7.9 函数是一等公民 / 167
7.9.1 类型 / 167
7.9.2 作为变量值 / 168
7.9.3 作为实参 / 169
7.9.4 作为函数返回值 / 170
7.10 匿名函数/lambda表达式 / 173
7.11 嵌套函数 / 175
7.12 闭包* / 177
7.13 操作符重载* / 183
7.13.1 加法(+)操作符 / 183
7.13.2 取反(–)操作符 / 187
7.13.3 索引([ ])操作符 / 187
7.14 流表达式* / 194
7.15 小结 / 196
第8章 自定义类型(下) / 198
8.1 结构体 / 198
8.2 属性 / 202
8.3 访问控制 / 205
8.4 继承 / 207
8.5 多态 / 212
8.6 抽象类 / 215
8.7 类型模式匹配 / 220
8.8 接口 / 222
8.9 扩展 / 225
8.9.1 直接扩展 / 225
8.9.2 接口扩展 / 226
8.10 小结 / 227
第9章 容器 / 228
9.1 数组进阶 / 229
9.1.1 切片 / 229
9.1.2 成员函数 / 230
9.2 ArrayList / 232
9.2.1 创建 / 232
9.2.2 增删元素 / 233
9.2.3 成员函数 / 235
9.3 HashSet / 237
9.4 HashMap / 239
9.4.1 创建映射容器 / 240
9.4.2 键到值的映射 / 241
9.4.3 增删键值对 / 244
9.4.4 遍历 / 245
9.4.5 实践:基尼系数与
贫富差距 / 246
9.5 小结 / 249
第10章 泛型 / 250
10.1 泛型函数 / 250
10.2 泛型类 / 253
10.3 泛型接口 / 255
10.3.1 Iterable / 255
10.3.2 Equatable、
Comparable / 258
10.4 高阶泛型函数* / 259
10.4.1 forEach / 259
10.4.2 filter / 261
10.4.3 map / 263
10.4.4 reduce / 264
10.5 类型别名 / 267
10.6 小结 / 268
第11章 异常处理* / 269
11.1 异常的发生 / 270
11.2 用Option处理失效 / 271
11.3 异常的捕获及处理 / 272
11.4 自定义异常类型 / 274
11.5 try‐catch的嵌套 / 280
11.6 自动资源释放 / 281
11.7 小结 / 284
第12章 文件及I/O操作 / 285
12.1 文件及文件系统 / 285
12.2 读写普通文本文件 / 288
12.3 读写逗号分隔值文件* / 294
12.4 二进制文件的读写 / 297
12.5 文件的随机读写* / 302
12.6 读写复杂二进制文件* / 304
12.7 实践:细胞计数 / 310
12.7.1 从文件读入二值化
矩阵 / 311
12.7.2 图的宽度优先遍历 / 312
12.7.3 循环遍历与搜索 / 315
12.8 小结 / 317
第13章 程序的并发执行 / 318
13.1 线程及分时系统 / 318
13.2 主线程 / 320
13.3 线程的创建与使用 / 322
13.4 分而治之 / 325
13.5 访问线程 / 327
13.6 终止线程 / 329
13.7 线程同步* / 331
13.7.1 同步计数器 / 331
13.7.2 数据竞争 / 334
13.7.3 原子操作 / 336
13.7.4 可重入互斥锁 / 338
13.7.5 屏障 / 341
13.7.6 信号量 / 343
13.7.7 定时器 / 345
13.8 小结 / 349
第14章 初探—仓颉开发鸿蒙
应用 / 350
14.1 搭建开发环境 / 350
14.2 世界你好 / 351
14.2.1 创建项目 / 351
14.2.2 打开虚拟手机 / 352
14.2.3 部署并运行项目 / 354
14.2.4 修改主页面 / 355
14.3 消息循环 / 356
14.4 宏及领域专用语言 / 358
14.5 主页面代码解析 / 362
14.6 添加新页面 / 366
14.7 Ability / 369
14.8 Stage框架 / 371
14.9 修改应用名称及图标 / 372
14.10 小结 / 373
第15章 再造轮子—DeepSeek
聊天机器人 / 375
15.1 界面及功能 / 375
15.2 数据结构 / 378
15.2.1 对话及输入输出
状态 / 378
15.2.2 State宏装饰的其他
成员 / 380
15.2.3 消息列表 / 380
15.3 页面结构 / 384
15.3.1 主体布局 / 384
15.3.2 标题栏 / 386
15.3.3 欢迎信息 / 387
15.3.4 输入框 / 388
15.3.5 控制栏 / 389
15.3.6 自定义Switch组件 / 391
15.3.7 对话信息显示框 / 392
15.4 功能函数 / 395
15.4.1 更新输入输出状态 / 395
15.4.2 附加AI消息至消息
列表 / 395
15.4.3 停止对话 / 395
15.4.4 重置对话 / 396
15.4.5 执行发送/停止功能 / 396
15.5 与DeepSeek大语言模型的
交互 / 399
15.5.1 robot对象及上下文 / 399
15.5.2 LLM构造及成员变量 / 400
15.5.3 流式对话chat函数 / 401
15.5.4 请求发送send函数 / 404
15.5.5 应答片段解析parse
函数 / 405
15.5.6 上下文记录record
函数 / 405
15.5.7 其他成员函数 / 406
15.6 小结 / 406