数组与语句
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]));
}
注意事项
- 索引从0开始:数组索引从0开始计数
- 类型安全:数组元素赋值时必须指定类型
- 内存管理:数组创建后需要手动管理,没有自动垃圾回收
- 索引越界:访问不存在的索引可能导致运行时错误
- 数组长度:数组长度是动态的,可以随时添加或删除元素
- 元素类型:数组可以存储不同类型的元素,但建议保持类型一致性
- 性能考虑:频繁的插入和删除操作可能影响性能
最佳实践
- 初始化数组:创建数组时指定合适的初始长度
- 类型一致性:尽量保持数组元素类型一致
- 边界检查:访问数组元素前检查索引是否有效
- 合理使用操作:
- 使用
push添加元素 - 使用
out删除元素并处理 - 使用
rmv简单删除元素
- 使用
- 循环遍历:使用
forloop或while遍历数组 - 错误处理:在数组操作中添加适当的错误处理
通过数组和语句的组合,Sii 语言提供了强大的数据处理能力,支持复杂的数据结构和算法实现。