第3篇:数据的运算——让数据动起来
**作者:**中文编程倡导者—— 李金雨
联系方式:wbtm2718@qq.com
**目标读者:**编程入门(零基础)
核心理念:使用华为仓颉原生中文编程,体验真正的国产编程语言
一、开篇引入
1.1 生活中的运算
生活中处处都有运算:
- 买菜:3斤苹果 × 5元/斤 = 15元
- 分糖果:10颗糖 ÷ 5个人 = 2颗/人
- 比较身高:小明比小红高多少?
- 判断年龄:年满18岁才能考驾照
1.2 程序中的运算
计算机最擅长的就是计算!我们可以让程序帮我们:
- 快速计算复杂的数学题
- 自动判断条件
- 批量处理数据
1.3 关于运算符位置的思考
在开始学习运算之前,我们再聊聊仓颉的语法设计。
上一篇我们讨论了类型后置的问题(let 年龄: Int64),这一篇我们来看看运算符。
好消息是:仓颉的运算符设计还是比较符合习惯的:
let 和 = 甲 + 乙 // 甲加乙,符合习惯 let 差 = 甲 - 乙 // 甲减乙,符合习惯 let 积 = 甲 * 乙 // 甲乘乙,符合习惯 let 商 = 甲 / 乙 // 甲除以乙,符合习惯这些中缀运算符(运算符在两个操作数中间)是全世界通用的,不管是中国人还是外国人,都是这样写的。这一点仓颉做得很好!
但是,在一些函数调用上,还是有改进空间。比如:
// 目前的写法 let 最大值 = max(甲, 乙) // 函数名在前 // 如果像中文一样 let 最大值 = 甲和乙的最大值 // 这样更符合中文习惯当然,这在编程语言中很难实现,所以我们还是接受函数名在前的写法吧!
1.4 本课目标
今天我们要学习:
- 算术运算符(加减乘除)
- 比较运算符(大于小于等于)
- 逻辑运算符(并且、或者、非)
- 赋值运算符
- 做一个智能计算器
二、概念讲解
2.1 算术运算符——加减乘除
基本运算符
| 运算符 | 含义 | 例子 | 结果 |
|---|---|---|---|
+ | 加 | 5 + 3 | 8 |
- | 减 | 5 - 3 | 2 |
* | 乘 | 5 * 3 | 15 |
/ | 除 | 5 / 3 | 1(整数除法) |
% | 取余 | 5 % 3 | 2 |
代码示例
main() { let 甲: Int64 = 10 let 乙: Int64 = 3 println("${甲} + ${乙} = ${甲 + 乙}") // 10 + 3 = 13 println("${甲} - ${乙} = ${甲 - 乙}") // 10 - 3 = 7 println("${甲} * ${乙} = ${甲 * 乙}") // 10 * 3 = 30 println("${甲} / ${乙} = ${甲 / 乙}") // 10 / 3 = 3 println("${甲} % ${乙} = ${甲 % 乙}") // 10 % 3 = 1 }注意整数除法
在计算机中,10 / 3不等于3.333...,而是等于3(只保留整数部分)。
如果想要小数结果,需要这样写:
let 结果: Float64 = Float64(10) / Float64(3) // 结果是3.333...吐槽一下:这里又涉及到类型转换的问题。如果仓颉能像JavaScript那样自动类型转换,或者像C#那样有更简洁的语法,就更好了!
2.2 比较运算符——比大小
基本比较符
| 运算符 | 含义 | 例子 | 结果 |
|---|---|---|---|
== | 等于 | 5 == 5 | true |
!= | 不等于 | 5 != 3 | true |
> | 大于 | 5 > 3 | true |
< | 小于 | 5 < 3 | false |
>= | 大于等于 | 5 >= 5 | true |
<= | 小于等于 | 3 <= 5 | true |
代码示例
main() { let 小明的成绩: Int64 = 85 let 小红的成绩: Int64 = 92 println("小明的成绩:${小明的成绩}") println("小红的成绩:${小红的成绩}") println("") // 比较成绩 println("小明和小红成绩相等:${小明的成绩 == 小红的成绩}") println("小明成绩比小红高:${小明的成绩 > 小红的成绩}") println("小明成绩比小红低:${小明的成绩 < 小红的成绩}") println("小明及格了:${小明的成绩 >= 60}") }2.3 逻辑运算符——并且、或者、非
逻辑运算符表
| 运算符 | 含义 | 例子 | 结果 |
|---|---|---|---|
&& | 并且(AND) | true && true | true |
|| | 或者(OR) | true || false | true |
! | 非(NOT) | !true | false |
生活中的逻辑
并且(&&):两个条件都要满足
- 买手机:有钱并且有货才能买到
- 考试优秀:语文>=90并且数学>=90
或者(||):满足一个条件就行
- 周末活动:去公园或者看电影
- 免费入场:儿童或者老人
非(!):反过来
- 不是学生
- 没有及格
代码示例
main() { let 有身份证: Bool = true let 年满18岁: Bool = true let 有驾照: Bool = false // 可以考驾照吗?(需要身份证并且年满18岁) let 可以考驾照: Bool = 有身份证 && 年满18岁 println("可以考驾照:${可以考驾照}") // 可以开车吗?(有驾照或者年满18岁有身份证) let 可以开车: Bool = 有驾照 || (年满18岁 && 有身份证) println("可以开车:${可以开车}") // 没有驾照 println("没有驾照:${!有驾照}") }2.4 赋值运算符——快捷赋值
基本赋值
let 分数: Int64 = 100 // 把100赋给分数复合赋值
| 运算符 | 含义 | 等价于 |
|---|---|---|
+= | 加后赋值 | a = a + b |
-= | 减后赋值 | a = a - b |
*= | 乘后赋值 | a = a * b |
/= | 除后赋值 | a = a / b |
%= | 取余后赋值 | a = a % b |
代码示例
main() { var 分数: Int64 = 100 println("初始分数:${分数}") 分数 += 10 // 分数 = 分数 + 10 println("加10分后:${分数}") 分数 -= 5 // 分数 = 分数 - 5 println("扣5分后:${分数}") 分数 *= 2 // 分数 = 分数 * 2 println("翻倍后:${分数}") 分数 /= 2 // 分数 = 分数 / 2 println("减半后:${分数}") }注意:使用复合赋值时,变量必须用var声明(可变),不能用let(不可变)。
三、动手实践
3.1 基础练习:简易计算器
// 简易计算器 main() { println("=== 简易计算器 ===") // 定义两个数 let 甲: Float64 = 15.5 let 乙: Float64 = 4.5 println("第一个数:${甲}") println("第二个数:${乙}") println("") // 各种运算 println("加法:${甲} + ${乙} = ${甲 + 乙}") println("减法:${甲} - ${乙} = ${甲 - 乙}") println("乘法:${甲} × ${乙} = ${甲 * 乙}") println("除法:${甲} ÷ ${乙} = ${甲 / 乙}") // 判断关系 println("") println("${甲} > ${乙}:${甲 > 乙}") println("${甲} == ${乙}:${甲 == 乙}") println("${甲} != ${乙}:${甲 != 乙}") }3.2 进阶练习:成绩分析器
// 成绩分析器 main() { println("=== 成绩分析器 ===") // 三个学生的成绩 let 小明: Int64 = 85 let 小红: Int64 = 92 let 小刚: Int64 = 78 println("小明:${小明}分") println("小红:${小红}分") println("小刚:${小刚}分") println("") // 计算平均分 let 总分: Int64 = 小明 + 小红 + 小刚 let 平均分: Float64 = Float64(总分) / 3.0 println("平均分:${平均分}分") println("") // 找出最高分和最低分 var 最高分: Int64 = 小明 if (小红 > 最高分) { 最高分 = 小红 } if (小刚 > 最高分) { 最高分 = 小刚 } var 最低分: Int64 = 小明 if (小红 < 最低分) { 最低分 = 小红 } if (小刚 < 最低分) { 最低分 = 小刚 } println("最高分:${最高分}分") println("最低分:${最低分}分") println("") // 统计及格人数(>=60分) var 及格人数: Int64 = 0 if (小明 >= 60) { 及格人数 += 1 } if (小红 >= 60) { 及格人数 += 1 } if (小刚 >= 60) { 及格人数 += 1 } println("及格人数:${及格人数}人") // 统计优秀人数(>=90分) var 优秀人数: Int64 = 0 if (小红 >= 90) { 优秀人数 += 1 } // 其他人都没达到90分 println("优秀人数:${优秀人数}人") }3.3 挑战练习:智能判断系统
// 智能判断系统 main() { println("=== 智能判断系统 ===") println("") // 场景1:判断是否可以看电影 let 年龄: Int64 = 16 let 有家长陪同: Bool = true let 电影分级: String = "PG-13" // 13岁以上可以观看 println("【电影院入场判断】") println("年龄:${年龄}岁") println("有家长陪同:${有家长陪同}") println("电影分级:${电影分级}") // PG-13电影:13岁以上可以单独看,13岁以下需要家长陪同 let 可以入场: Bool = (年龄 >= 13) || (有家长陪同) println("可以入场:${可以入场}") println("") // 场景2:判断是否可以免费乘车 let 是儿童: Bool = false // 6岁以下 let 是老人: Bool = false // 65岁以上 let 是学生: Bool = true let 有学生证: Bool = true println("【公交免费判断】") println("是儿童:${是儿童}") println("是老人:${是老人}") println("是学生:${是学生}") println("有学生证:${有学生证}") // 免费条件:儿童或老人,或学生有学生证 let 可以免费: Bool = 是儿童 || 是老人 || (是学生 && 有学生证) println("可以免费乘车:${可以免费}") println("") // 场景3:判断是否可以参加竞赛 let 数学成绩: Int64 = 88 let 英语成绩: Int64 = 92 let 有竞赛经验: Bool = false println("【竞赛资格判断】") println("数学成绩:${数学成绩}") println("英语成绩:${英语成绩}") println("有竞赛经验:${有竞赛经验}") // 参加条件:数学和英语都>=85,或者有竞赛经验 let 可以参加: Bool = (数学成绩 >= 85 && 英语成绩 >= 85) || 有竞赛经验 println("可以参加竞赛:${可以参加}") }四、知识总结
4.1 核心概念回顾
- 算术运算符:
+、-、*、/、% - 比较运算符:
==、!=、>、<、>=、<= - 逻辑运算符:
&&(并且)、||(或者)、!(非) - 赋值运算符:
=、+=、-=、*=、/=、%=
4.2 关于语法设计的再思考
这一篇我们学习的运算符设计,仓颉做得还是不错的:
做得好的地方:
- 中缀运算符符合国际惯例(
a + b) - 逻辑运算符使用符号(
&&、||)简洁明了 - 比较运算符直观易懂
可以改进的地方:
如果仓颉能支持更中文化的运算符,就更好了:
// 设想中的中文运算符(仅供娱乐) let 和 = 甲 加 乙 let 差 = 甲 减 乙 let 并且 = 条件一 且 条件二 let 或者 = 条件一 或 条件二当然,这在实际编程语言中不太现实,因为:
- 输入中文标点比较麻烦
- 与国际标准不兼容
- 代码会显得太长
所以,我们还是 happily 使用符号运算符吧!
4.3 关键代码速查
// 算术运算 let 和 = 甲 + 乙 let 差 = 甲 - 乙 let 积 = 甲 * 乙 let 商 = 甲 / 乙 let 余数 = 甲 % 乙 // 比较运算 let 相等 = 甲 == 乙 let 不等 = 甲 != 乙 let 大于 = 甲 > 乙 let 小于 = 甲 < 乙 // 逻辑运算 let 并且 = 条件一 && 条件二 let 或者 = 条件一 || 条件二 let 非 = !条件 // 复合赋值 var 数 = 10 数 += 5 // 数 = 15 数 -= 3 // 数 = 12 数 *= 2 // 数 = 24 数 /= 4 // 数 = 64.4 常见错误提醒
| 错误现象 | 原因 | 解决方法 |
|---|---|---|
| 整数除法没小数 | 两个整数相除 | 转换为Float64再除 |
| 逻辑判断错误 | 运算符优先级 | 使用括号明确优先级 |
| 赋值给let变量 | let不可变 | 改用var声明 |
| 类型不匹配 | 运算数类型不同 | 统一类型后再运算 |
五、课后作业
5.1 巩固练习(必做)
练习1:BMI计算器
输入身高(米)和体重(公斤),计算BMI并判断体重状态。
练习2:闰年判断
输入年份,判断是否是闰年:
- 能被4整除但不能被100整除,或者能被400整除
练习3:三角形判断
输入三条边长,判断:
- 能否构成三角形(任意两边之和大于第三边)
- 是什么类型的三角形(等边、等腰、直角、普通)
5.2 创意编程(选做)
创意1:简易计算器
实现一个支持加减乘除的计算器,可以连续运算。
创意2:猜数字游戏
程序随机生成一个1-100的数字,用户猜数字,程序提示"大了"或"小了"。
创意3:24点游戏
输入4个数字,判断是否能通过加减乘除得到24。
5.3 下篇预习
下一篇,我们将学习如果…那么——条件判断,让程序能够根据不同情况执行不同的代码。预习问题:
- 怎么让程序判断成绩是否及格?
- 怎么实现多条件判断?
- 怎么让程序选择执行不同的代码?
恭喜你完成了第3篇的学习!🎉
现在你已经掌握了仓颉的各种运算符。虽然运算符本身设计得不错,但在实际使用中,我们还是要注意类型转换的问题——这又让我们想到了类型后置的语法设计…
下节课,我们将学习条件判断,让程序变得更智能!