第3篇:数据的运算——让数据动起来

**作者:**中文编程倡导者—— 李金雨
联系方式: wbtm2718@qq.com
**目标读者:**编程入门(零基础)
核心理念: 使用华为仓颉原生中文编程,体验真正的国产编程语言


一、开篇引入

1.1 生活中的运算

生活中处处都有运算:

  • 买菜:3斤苹果 × 5元/斤 = 15元
  • 分糖果:10颗糖 ÷ 5个人 = 2颗/人
  • 比较身高:小明比小红高多少?
  • 判断年龄:年满18岁才能考驾照

1.2 程序中的运算

计算机最擅长的就是计算!我们可以让程序帮我们:

  • 快速计算复杂的数学题
  • 自动判断条件
  • 批量处理数据

1.3 关于运算符位置的思考

在开始学习运算之前,我们再聊聊仓颉的语法设计。

上一篇我们讨论了类型后置的问题(let 年龄: Int64),这一篇我们来看看运算符。

好消息是:仓颉的运算符设计还是比较符合习惯的:

let 和 = 甲 + 乙        // 甲加乙,符合习惯
let 差 = 甲 - 乙        // 甲减乙,符合习惯
let 积 = 甲 * 乙        // 甲乘乙,符合习惯
let 商 = 甲 / 乙        // 甲除以乙,符合习惯

这些中缀运算符(运算符在两个操作数中间)是全世界通用的,不管是中国人还是外国人,都是这样写的。这一点仓颉做得很好!

1.4 本课目标

今天我们要学习:

  1. 算术运算符(加减乘除)
  2. 比较运算符(大于小于等于)
  3. 逻辑运算符(并且、或者、非)
  4. 赋值运算符
  5. 做一个智能计算器

二、概念讲解

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 核心概念回顾

  1. 算术运算符+-*/%
  2. 比较运算符==!=><>=<=
  3. 逻辑运算符&&(并且)、||(或者)、!(非)
  4. 赋值运算符=+=-=*=/=%=

4.2 关于语法设计的再思考

这一篇我们学习的运算符设计,仓颉做得还是不错的:

做得好的地方:

  • 中缀运算符符合国际惯例(a + b
  • 逻辑运算符使用符号(&&||)简洁明了
  • 比较运算符直观易懂

可以改进的地方:

如果仓颉能支持更中文化的运算符,就更好了:

// 设想中的中文运算符(仅供娱乐)
let 和 = 甲 加 乙
let 差 = 甲 减 乙
let 并且 = 条件一 且 条件二
let 或者 = 条件一 或 条件二

当然,这在实际编程语言中不太现实,因为:

  1. 输入中文标点比较麻烦
  2. 与国际标准不兼容
  3. 代码会显得太长

所以,我们还是 happily 使用符号运算符吧!

4.3 关键代码速查

// 算术运算
let 和 = 甲 + 乙
let 差 = 甲 - 乙
let 积 = 甲 * 乙
let 商 = 甲 / 乙
let 余数 = 甲 % 乙

// 比较运算
let 相等 = 甲 == 乙
let 不等 = 甲 != 乙
let 大于 = 甲 > 乙
let 小于 = 甲 < 乙

// 逻辑运算
let 并且 = 条件一 && 条件二
let 或者 = 条件一 || 条件二
let 非 = !条件

// 复合赋值
var 数 = 10
数 += 5    // 数 = 15
数 -= 3    // 数 = 12
数 *= 2    // 数 = 24
数 /= 4    // 数 = 6

4.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 下篇预习

下一篇,我们将学习如果…那么——条件判断,让程序能够根据不同情况执行不同的代码。预习问题:

  1. 怎么让程序判断成绩是否及格?
  2. 怎么实现多条件判断?
  3. 怎么让程序选择执行不同的代码?

恭喜你完成了第3篇的学习! 🎉

现在你已经掌握了仓颉的各种运算符。虽然运算符本身设计得不错,但在实际使用中,我们还是要注意类型转换的问题——这又让我们想到了类型后置的语法设计…

下节课,我们将学习条件判断,让程序变得更智能!

Logo

一站式 AI 云服务平台

更多推荐