跳到主要内容

数组与语句

Sii 语言支持数组类型,提供了丰富的数组操作语句,包括数组创建、赋值、添加、删除等操作。

数组类型

Sii 语言中的数组类型为 arr,可以存储任意类型的元素。

数组声明

let 数组名: arr = new Array();  // 创建一个空数组
let 数组名: arr = new Array(长度); // 创建一个有固定长度的数组

示例:

let numbers: arr = new Array();
let names: arr = new Array(10);

数组操作

数组赋值

使用索引语法为数组元素赋值:

let 数组名[索引]: 类型 = 值;

示例:

let numbers: arr = new Array();
let numbers[0]: int = 10;
let numbers[1]: int = 20;
let numbers[2]: int = 30;

数组访问

使用索引语法访问数组元素:

let 变量名: 类型 = 数组名[索引];

示例:

let firstNumber: int = numbers[0];
let secondNumber: int = numbers[1];
print(firstNumber);

数组操作语句

push 语句

push 语句用于向数组添加元素:

push 值: 类型 => 数组名[索引];

语法说明:

  • :要添加的值
  • 类型:值的类型
  • =>:指向符号
  • 数组名[索引]:目标位置

示例:

let fruits: arr = new Array();

// 向数组末尾添加元素
push "苹果": string => fruits[0];
push "香蕉": string => fruits[1];
push "橙子": string => fruits[2];

// 向指定位置添加元素
push "葡萄": string => fruits[1]; // 插入到索引1位置

push 语句特点:

  • 当不指定索引时,默认添加到数组末尾
  • 当指定索引时,插入到该位置,后续元素向后移动
  • 支持任意类型的元素

out 语句

out 语句用于删除数组元素,并可以通过回调处理被删除的值:

out 数组名[索引].then((参数名) => {
处理逻辑;
});

语法说明:

  • 数组名[索引]:要删除的元素位置
  • .then((参数名) => {}):回调函数,处理被删除的值
  • 参数名:可选,表示被删除的值

示例:

let numbers: arr = new Array();
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;

// 删除元素并处理
out numbers[1].then((deletedValue) => {
print("删除的值:" + string(deletedValue));
});

// 简化写法(不处理删除的值)
out numbers[0].then(() => {
print("元素已删除");
});

out 语句特点:

  • 删除指定索引位置的元素
  • 后续元素向前移动
  • 可以通过回调函数处理被删除的值
  • 删除后无法再找回被删除的值(除非通过回调处理)

rmv 语句

rmv 语句用于永久删除数组元素:

rmv 数组名[索引];

示例:

let numbers: arr = new Array();
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;

// 永久删除索引1的元素
rmv numbers[1];

rmv 语句特点:

  • 永久删除指定索引位置的元素
  • 后续元素向前移动
  • 删除后无法找回被删除的值
  • out 语句更简洁,但无法处理被删除的值

数组遍历

使用 forloop 遍历数组

let numbers: arr = new Array();
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;

forloop (let i: int = 0; i < 3; i.toUp(1)) {
print("索引 " + string(i) + " 的值:" + string(numbers[i]));
}

使用 while 遍历数组

let index: int = 0;
while (index < 3) {
print("索引 " + string(index) + " 的值:" + string(numbers[index]));
index.toUp(1);
}

数组操作示例

完整示例:学生成绩管理

// 创建学生成绩数组
let scores: arr = new Array();

// 添加成绩
push 85: int => scores[0];
push 92: int => scores[1];
push 78: int => scores[2];
push 96: int => scores[3];

// 计算总分
let total: int = 0;
forloop (let i: int = 0; i < 4; i.toUp(1)) {
total = total + scores[i];
}

// 计算平均分
let average: int = total / 4;
print("平均分:" + string(average));

// 删除最低分
let minIndex: int = 0;
forloop (let i: int = 1; i < 4; i.toUp(1)) {
if (scores[i] < scores[minIndex]) {
minIndex = i;
}
}

out scores[minIndex].then((deletedScore) => {
print("删除的最低分:" + string(deletedScore));
});

// 显示剩余成绩
print("剩余成绩:");
forloop (let i: int = 0; i < 3; i.toUp(1)) {
print("成绩 " + string(i) + ":" + string(scores[i]));
}

数组排序示例

// 创建数字数组
let numbers: arr = new Array();
push 64: int => numbers[0];
push 34: int => numbers[1];
push 25: int => numbers[2];
push 12: int => numbers[3];
push 22: int => numbers[4];
push 11: int => numbers[5];
push 90: int => numbers[6];

// 冒泡排序
let n: int = 7;
forloop (let i: int = 0; i < n - 1; i.toUp(1)) {
forloop (let j: int = 0; j < n - i - 1; j.toUp(1)) {
if (numbers[j] > numbers[j + 1]) {
// 交换元素
let temp: int = numbers[j];
numbers[j] = numbers[j + 1];
numbers[j + 1] = temp;
}
}
}

// 输出排序结果
print("排序后的数组:");
forloop (let i: int = 0; i < n; i.toUp(1)) {
print(string(numbers[i]));
}

注意事项

  1. 索引从0开始:数组索引从0开始计数
  2. 类型安全:数组元素赋值时必须指定类型
  3. 内存管理:数组创建后需要手动管理,没有自动垃圾回收
  4. 索引越界:访问不存在的索引可能导致运行时错误
  5. 数组长度:数组长度是动态的,可以随时添加或删除元素
  6. 元素类型:数组可以存储不同类型的元素,但建议保持类型一致性
  7. 性能考虑:频繁的插入和删除操作可能影响性能

最佳实践

  1. 初始化数组:创建数组时指定合适的初始长度
  2. 类型一致性:尽量保持数组元素类型一致
  3. 边界检查:访问数组元素前检查索引是否有效
  4. 合理使用操作
    • 使用 push 添加元素
    • 使用 out 删除元素并处理
    • 使用 rmv 简单删除元素
  5. 循环遍历:使用 forloopwhile 遍历数组
  6. 错误处理:在数组操作中添加适当的错误处理

通过数组和语句的组合,Sii 语言提供了强大的数据处理能力,支持复杂的数据结构和算法实现。