第2篇:数据与类型——存储信息的基础

本课目标:掌握ArkTS的基本数据类型,学会存储各种信息
**作者:**中文编程倡导者—— 李金雨
预计课时:2课时(90分钟)
难度等级:⭐⭐(基础)


一、开篇引入

1.1 生活中的"数据"

想象一下,如果你要介绍自己,你会说什么?

  • 我叫张三(文字)
  • 我今年15岁(数字)
  • 我是男生(是/不是)
  • 我喜欢篮球、音乐、编程(多个文字)

这些都是数据——用来描述事物的信息。

1.2 程序中的数据

上一节课,我们写了这样的代码:

@State 欢迎语: string = '你好,鸿蒙!'

这里的 '你好,鸿蒙!' 就是数据,我们把它存在了 欢迎语 这个"盒子"里。

1.3 本课目标

今天我们要学习:

  1. 什么是数据(用盒子来理解)
  2. 不同类型的数据(数字、文字、真假、多个数据)
  3. 怎么创建和使用数据
  4. 做一个个人信息档案应用

1.4 预期成果

完成本课后,你能做出这样的应用:

┌─────────────────────────┐
│      我的个人档案        │
├─────────────────────────┤
│  姓名:张三              │
│  年龄:15岁              │
│  身高:1.75米            │
│  是否学生:是            │
│  爱好:篮球、音乐、编程   │
│                         │
│  BMI指数:22.5           │
│  体重状态:正常          │
└─────────────────────────┘

二、概念讲解

2.1 什么是数据?——盒子的比喻

生活例子:整理房间

想象你有一个储物柜,里面有很多盒子,每个盒子上贴着标签:

┌─────────────┐
│  玩具盒子   │  → 里面装玩具
├─────────────┤
│  书本盒子   │  → 里面装书本
├─────────────┤
│  文具盒子   │  → 里面装文具
└─────────────┘

在编程中,数据就像是盒子里的东西,而变量就是贴标签的盒子。

程序中的"盒子"
let 姓名: string = "张三"     // 一个叫"姓名"的盒子,装着"张三"
let 年龄: number = 15         // 一个叫"年龄"的盒子,装着15
let 是否学生: boolean = true  // 一个叫"是否学生"的盒子,装着"是"
代码部分 含义 盒子比喻
let 创建一个新盒子 拿出一个新盒子
姓名 盒子的名字(标签) 在盒子上贴标签
: 指定盒子的类型 规定这个盒子只能装什么
string 文字类型 只能装文字的盒子
= 把东西放进盒子 往盒子里放东西
"张三" 具体的内容 盒子里装的东西

2.2 数据的类型

不同类型的数据,就像不同规格的盒子:

类型1:数字(number)——装数字的盒子

用来存储年龄、身高、体重、成绩、价格等数字信息。

let 年龄: number = 15           // 整数
let 身高: number = 1.75         // 小数
let 体重: number = 60.5         // 小数
let 圆周率: number = 3.14159    // 小数
let 温度: number = -5           // 负数也可以

生活例子

  • 你的年龄:15
  • 你的身高:1.75米
  • 考试分数:95.5分
  • 气温:-3度

可以对数字做的运算

let 数学成绩: number = 90
let 语文成绩: number = 85

let 总分: number = 数学成绩 + 语文成绩    // 加法:175
let 平均分: number = 总分 / 2              // 除法:87.5
let 差值: number = 数学成绩 - 语文成绩     // 减法:5
let 翻倍: number = 数学成绩 * 2            // 乘法:180
类型2:文字(string)——装文字的盒子

用来存储名字、地址、句子、文章内容等文字信息。

let 姓名: string = "张三"
let 学校: string = "实验中学"
let 座右铭: string = "好好学习,天天向上"
let 空文字: string = ""   // 空的文字盒子

注意:文字必须用引号包起来(单引号'或双引号"都可以)

可以对文字做的操作

let: string = "张"
let: string = "三"

let 全名: string =+// 连接:"张三"
let 自我介绍: string = "我叫" + 全名   // "我叫张三"

let 重复: string = "哈".repeat(3)    // 重复:"哈哈哈"
let 长度: number = "Hello".length    // 长度:5
类型3:真假(boolean)——装"是/否"的盒子

只有两种可能的值:true(真/是)或 false(假/否)

let 是否学生: boolean = true
let 是否成年: boolean = false
let 是否会员: boolean = true
let 是否在线: boolean = false

生活例子

  • 你是学生吗?是(true)
  • 你成年了吗?否(false)
  • 今天下雨了吗?否(false)
  • 这个账号是VIP吗?是(true)

真假判断

let 年龄: number = 15
let 是否成年: boolean = 年龄 >= 18     // false(15小于18)

let 分数: number = 90
let 是否及格: boolean = 分数 >= 60     // true(90大于60)

let 姓名: string = "张三"
let 是否叫张三: boolean = 姓名 == "张三" // true

比较符号

符号 含义 例子 结果
== 等于 5 == 5 true
!= 不等于 5 != 3 true
> 大于 5 > 3 true
< 小于 5 < 3 false
>= 大于等于 5 >= 5 true
<= 小于等于 3 <= 5 true
类型4:多个数据(数组)——装很多东西的大盒子

用来存储一组相同类型的数据,比如成绩列表、好友名单、购物车商品等。

let 成绩列表: number[] = [85, 92, 78, 96, 88]
let 好友名单: string[] = ["张三", "李四", "王五"]
let 星期列表: string[] = ["周一", "周二", "周三", "周四", "周五"]

生活例子

  • 你这周的考试成绩:[85, 92, 78, 96, 88]
  • 你的好朋友:[“小明”, “小红”, “小刚”]
  • 购物清单:[“苹果”, “香蕉”, “牛奶”]

怎么使用数组里的数据

let 成绩列表: number[] = [85, 92, 78, 96, 88]

// 获取第1个成绩(注意:编程中从0开始数)
let 第一个成绩: number = 成绩列表[0]   // 85

// 获取第2个成绩
let 第二个成绩: number = 成绩列表[1]   // 92

// 获取第5个成绩
let 第五个成绩: number = 成绩列表[4]   // 88

// 获取数组长度
let 有几门课: number = 成绩列表.length  // 5

// 计算总分
let 总分: number = 成绩列表[0] + 成绩列表[1] + 成绩列表[2] + 成绩列表[3] + 成绩列表[4]

数组的常用操作

let 购物车: string[] = ["苹果", "香蕉"]

// 添加商品
购物车.push("牛奶")        // ["苹果", "香蕉", "牛奶"]

// 删除最后一个
购物车.pop()              // ["苹果", "香蕉"]

// 在开头添加
购物车.unshift("面包")     // ["面包", "苹果", "香蕉"]

// 删除第一个
购物车.shift()            // ["苹果", "香蕉"]

2.3 固定数据(常量)

有些数据是永远不变的,比如:

  • 圆周率 = 3.14159
  • 一年有12个月
  • 一周有7天

这些数据我们用 const 来创建,表示"固定不变":

const 圆周率: number = 3.14159
const 月份数: number = 12
const 星期数: number = 7
const 应用名称: string = "我的计算器"

letconst 的区别

关键字 含义 能否修改 使用场景
let 变量 可以修改 会变的数据(年龄、分数等)
const 常量 不能修改 不变的数据(圆周率、月份数等)
let 年龄: number = 15
年龄 = 16    // ✓ 可以,年龄会增长

const 圆周率: number = 3.14159
圆周率 = 3.14  // ✗ 错误!常量不能修改

2.4 类型推断——聪明的ArkTS

ArkTS很聪明,有时候你不用告诉它类型,它也能猜出来:

// 明确指定类型
let 姓名: string = "张三"

// 让ArkTS自己推断类型
let 姓名 = "张三"    // ArkTS知道这是string类型

let 年龄 = 15        // ArkTS知道这是number类型
let 是否学生 = true  // ArkTS知道这是boolean类型

但是,为了代码更清晰,建议初学者还是写上类型!


三、动手实践

3.1 基础练习:创建个人数据

打开DevEco Studio,创建一个新项目,在 Index.ets 中写:

// 完整可运行代码,复制到 Index.ets 即可运行
@Entry
@Component
struct Index {
  // 使用 @State 定义数据(ArkTS中组件内要用@State而不是let)
  @State 姓名: string = "张三"
  @State 年龄: number = 15
  @State 身高: number = 1.75    // 单位:米
  @State 体重: number = 60      // 单位:公斤
  @State 是否学生: boolean = true
  @State 爱好列表: string[] = ["篮球", "音乐", "编程"]
  
  // 常量可以写在组件外面,或者直接用值
  学校名称: string = "实验中学"

  build() {
    Column({ space: 15 }) {
      Text("我的个人档案")
        .fontSize(30)
        .fontWeight(FontWeight.Bold)
        .fontColor("#333333")
      
      // 显示基本信息
      Text(`姓名:${this.姓名}`)
        .fontSize(20)
      
      Text(`年龄:${this.年龄}`)
        .fontSize(20)
      
      Text(`身高:${this.身高}`)
        .fontSize(20)
      
      Text(`体重:${this.体重}公斤`)
        .fontSize(20)
      
      Text(`学校:${this.学校名称}`)
        .fontSize(20)
      
      Text(`是否学生:${this.是否学生 ? "是" : "否"}`)
        .fontSize(20)
      
      // 显示爱好
      Text(`爱好:${this.爱好列表.join("、")}`)
        .fontSize(20)
    }
    .width('100%')
    .padding(20)
  }
}

注意:上面代码有个错误!你发现了吗?

在ArkTS中,letconst 不能直接写在组件里,要改成 @State

@Entry
@Component
struct Index {
  // 使用 @State 定义数据
  @State 姓名: string = "张三"
  @State 年龄: number = 15
  @State 身高: number = 1.75
  @State 体重: number = 60
  @State 是否学生: boolean = true
  @State 爱好列表: string[] = ["篮球", "音乐", "编程"]
  
  // 常量可以写在组件外面,或者直接用值
  学校名称: string = "实验中学"

  build() {
    // ... 界面代码
  }
}

3.2 进阶练习:BMI计算器

BMI(身体质量指数)是衡量身体健康的一个指标,计算公式是:

BMI = 体重(kg) ÷ 身高(m)²

让我们做一个BMI计算器:

// 完整可运行代码,复制到 Index.ets 即可运行
@Entry
@Component
struct Index {
  @State 体重: number = 60
  @State 身高: number = 1.75
  
  // 计算BMI的功能
  计算BMI(): number {
    return this.体重 / (this.身高 * this.身高)
  }
  
  // 判断体重状态
  获取体重状态(): string {
    let bmi: number = this.计算BMI()
    if (bmi < 18.5) {
      return "偏瘦"
    } else if (bmi < 24) {
      return "正常"
    } else if (bmi < 28) {
      return "偏胖"
    } else {
      return "肥胖"
    }
  }

  build() {
    Column({ space: 20 }) {
      Text("BMI计算器")
        .fontSize(35)
        .fontWeight(FontWeight.Bold)
        .fontColor("#2196F3")
      
      // 显示当前数据
      Text(`体重:${this.体重}公斤`)
        .fontSize(20)
      
      Text(`身高:${this.身高}`)
        .fontSize(20)
      
      // 显示计算结果
      Text(`BMI指数:${this.计算BMI().toFixed(2)}`)
        .fontSize(25)
        .fontWeight(FontWeight.Bold)
      
      Text(`体重状态:${this.获取体重状态()}`)
        .fontSize(25)
        .fontColor(this.获取体重状态() == "正常" ? "#4CAF50" : "#FF5722")
    }
    .width('100%')
    .height('100%')
    .padding(30)
    .backgroundColor('#F5F5F5')
    .justifyContent(FlexAlign.Center)
  }
}

3.3 BMI标准参考

BMI范围 体重状态 建议
< 18.5 偏瘦 适当增加营养
18.5 - 23.9 正常 继续保持
24.0 - 27.9 偏胖 适当运动
≥ 28.0 肥胖 需要减重

3.4 挑战练习:成绩统计器

做一个成绩统计应用,功能包括:

  • 显示各科成绩
  • 计算总分
  • 计算平均分
  • 显示最高分
  • 显示最低分
// 完整可运行代码,复制到 Index.ets 即可运行
@Entry
@Component
struct Index {
  @State 成绩列表: number[] = [85, 92, 78, 96, 88, 90]
  @State 科目列表: string[] = ["语文", "数学", "英语", "物理", "化学", "生物"]
  
  // 计算总分
  计算总分(): number {
    let 总分: number = 0
    for (let i = 0; i < this.成绩列表.length; i++) {
      总分 = 总分 + this.成绩列表[i]
    }
    return 总分
  }
  
  // 计算平均分
  计算平均分(): number {
    return this.计算总分() / this.成绩列表.length
  }
  
  // 获取最高分
  获取最高分(): number {
    let 最高分: number = this.成绩列表[0]
    for (let i = 1; i < this.成绩列表.length; i++) {
      if (this.成绩列表[i] > 最高分) {
        最高分 = this.成绩列表[i]
      }
    }
    return 最高分
  }
  
  // 获取最低分
  获取最低分(): number {
    let 最低分: number = this.成绩列表[0]
    for (let i = 1; i < this.成绩列表.length; i++) {
      if (this.成绩列表[i] < 最低分) {
        最低分 = this.成绩列表[i]
      }
    }
    return 最低分
  }

  build() {
    Column({ space: 15 }) {
      Text("成绩统计器")
        .fontSize(30)
        .fontWeight(FontWeight.Bold)
        .fontColor("#2196F3")
      
      // 显示各科成绩
      Text("各科成绩:")
        .fontSize(22)
        .fontWeight(FontWeight.Bold)
      
      ForEach(this.成绩列表, (成绩: number, 索引: number) => {
        Text(`${this.科目列表[索引]}${成绩}`)
          .fontSize(18)
      })
      
      // 显示统计结果
      Column({ space: 10 }) {
        Text(`总分:${this.计算总分()}`)
          .fontSize(20)
          .fontColor("#4CAF50")
        
        Text(`平均分:${this.计算平均分().toFixed(1)}`)
          .fontSize(20)
          .fontColor("#2196F3")
        
        Text(`最高分:${this.获取最高分()}`)
          .fontSize(20)
          .fontColor("#FF9800")
        
        Text(`最低分:${this.获取最低分()}`)
          .fontSize(20)
          .fontColor("#F44336")
      }
      .margin({ top: 20 })
      .padding(20)
      .backgroundColor("#FFFFFF")
      .borderRadius(10)
    }
    .width('100%')
    .height('100%')
    .padding(20)
    .backgroundColor('#F5F5F5')
  }
}

四、知识总结

4.1 核心概念回顾

  1. 数据 = 存储信息的"盒子"
  2. 变量let)= 可以改内容的盒子
  3. 常量const)= 不能改内容的盒子

4.2 四种基本数据类型

类型 英文 存储内容 例子
数字 number 整数、小数 15, 1.75, -5
文字 string 文字、句子 "张三", "Hello"
真假 boolean true/false true, false
数组 类型[] 多个同类型数据 [85, 92, 78]

4.3 关键代码速查

// 创建变量
let 名字: 类型 =// 创建常量
const 名字: 类型 =// 数字运算
加:a + b
减:a - b
乘:a * b
除:a / b

// 文字连接
let 全名: string =+// 数组操作
数组[0]           // 获取第1个
数组.length       // 获取长度
数组.push()     // 添加到最后
数组.pop()        // 删除最后一个

// 比较运算
等于:==
不等于:!=
大于:>
小于:<
大于等于:>=
小于等于:<=

4.4 常见错误提醒

错误现象 原因 解决方法
类型不匹配 把文字赋给数字变量 检查类型是否对应
变量未定义 使用了没创建的变量 先用let创建变量
数组越界 访问了不存在的索引 检查索引是否小于length
常量被修改 const定义的变量被赋值 改用let,或不要修改
文字没引号 string类型没加引号 加上""''

五、课后作业

5.1 巩固练习(必做)

练习1:完善个人档案

在上面的个人档案基础上,添加:

  • 计算并显示BMI
  • 显示体重状态
  • 添加"星座"(根据生日判断)

练习2:班级通讯录

创建一个包含3个同学信息的应用,显示:

  • 姓名
  • 年龄
  • 电话号码
  • 家庭住址

使用数组存储多个同学的信息。

练习3:购物清单

做一个购物清单应用:

  • 显示商品列表
  • 显示商品数量
  • 计算总价(假设每个商品10元)

5.2 创意编程(选做)

创意1:生日倒计时

输入你的生日,计算:

  • 今年几岁
  • 距离下次生日还有多少天

创意2:成绩等级评定

输入成绩,显示等级:

  • 90-100:优秀
  • 80-89:良好
  • 70-79:中等
  • 60-69:及格
  • <60:不及格

创意3:简易计算器

做两个输入框,输入两个数字,显示:

  • 相加结果
  • 相减结果
  • 相乘结果
  • 相除结果

5.3 下篇预习

下一篇,我们将学习界面基础,了解如何使用各种组件构建漂亮的页面。预习问题:

  1. 手机应用里都有哪些常见的界面元素?(按钮、输入框、图片等)
  2. 怎么让文字和图片排列整齐?
  3. 怎么改变界面的颜色和样式?

附录:更多例子

例子1:温度转换器

// 完整可运行代码,复制到 Index.ets 即可运行
@Entry
@Component
struct Index {
  @State 摄氏温度: number = 25
  
  转华氏温度(): number {
    return this.摄氏温度 * 9 / 5 + 32
  }
  
  转开尔文温度(): number {
    return this.摄氏温度 + 273.15
  }

  build() {
    Column({ space: 20 }) {
      Text("温度转换器")
        .fontSize(30)
      
      Text(`摄氏:${this.摄氏温度}°C`)
        .fontSize(25)
      
      Text(`华氏:${this.转华氏温度()}°F`)
        .fontSize(25)
      
      Text(`开尔文:${this.转开尔文温度()}K`)
        .fontSize(25)
    }
    .padding(30)
  }
}

例子2:简单记账本

// 完整可运行代码,复制到 Index.ets 即可运行
@Entry
@Component
struct Index {
  @State 支出列表: number[] = [25, 18, 56, 12, 30]
  @State 支出项目: string[] = ["早餐", "饮料", "文具", "零食", "交通"]
  
  计算总支出(): number {
    let 总和: number = 0
    for (let 支出 of this.支出列表) {
      总和 += 支出
    }
    return 总和
  }

  build() {
    Column({ space: 10 }) {
      Text("今日支出")
        .fontSize(30)
      
      ForEach(this.支出列表, (金额: number, 索引: number) => {
        Row() {
          Text(this.支出项目[索引])
            .width('50%')
          Text(`¥${金额}`)
            .width('50%')
        }
        .width('100%')
        .padding(10)
        .backgroundColor('#F0F0F0')
      })
      
      Text(`今日总支出:¥${this.计算总支出()}`)
        .fontSize(25)
        .fontColor('#F44336')
        .margin({ top: 20 })
    }
    .padding(20)
  }
}

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

现在你已经学会了如何在程序中存储和处理各种数据。这是编程的基础,就像学会了写字,接下来就可以写文章了!

下节课,我们将学习如何把这些数据显示在漂亮的界面上!

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐