一個database記錄那個地方發了多少次罰單,可以用一個storage儲存地點名,之後做個if..else statement 去記錄,最多5-7個位置,e.g.
location time ticket gave
Red road 2
Blue road 4
Black road 5
(up to a limited number)
.data
location:
.asciiz "Red road" # 位置名称数组
.asciiz "Blue road"
.asciiz "Black road"
ticket:
.word 0 # 罚单记录数组
input_loc:
.asciiz "Please input location name: "
input_ticket:
.asciiz "Please input ticket number for the location: "
output_ticket:
.asciiz "The ticket number for the location is: "
output_error:
.asciiz "Error: not found or location list is full\n"
.text
main:
# 加载 location 和 ticket 数组地址
la $s0, location
la $s1, ticket
# 循环输入地点名和罚单次数
input_loop:
# 读取地点名
li $v0, 4
la $a0, input_loc
syscall
# 读取罚单次数
li $v0, 4
la $a0, input_ticket
syscall
li $v0, 5
syscall
move $t0, $v0 # $t0 中保存输入的罚单次数
# 在 location 数组中查找地点名
li $t1, 0 # $t1 中保存 location 数组下标
loop_search:
lw $t2, ($s0) # $t2 中保存当前位置名称
beqz $t2, loop_not_found # 如果已经搜索完所有元素,则跳转到 loop_not_found 标签
# 如果找到了对应的位置名称,则存储或更新相应的罚单记录
beq $t2, $a0, found
addi $s0, $s0, 8 # 位置名称的长度为 8,因此每次需要增加 8 个字节的偏移量
addi $s1, $s1, 4
addi $t1, $t1, 1
j loop_search
# 在 location 数组中未找到对应的元素
loop_not_found:
la $a0, output_error
li $v0, 4
syscall
j input_loop
# 存储或更新罚单记录
found:
sw $t0, ($s1)
j input_loop
# 查询指定地点名的罚单记录
query_loop:
# 读取地点名
li $v0, 4
la $a0, input_loc
syscall
# 在 location 数组中查找地点名
li $t1, 0 # $t1 中保存 location 数组下标
loop_search:
lw $t2, ($s0) # $t2 中保存当前位置名称
beqz $t2, loop_not_found2 # 如果已经搜索完所有元素,则跳转到 loop_not_found2 标签
# 如果找到了对应的位置名称,则输出相应的罚单记录
beq $t2, $a0, found2
addi $s0, $s0, 8 # 位置名称的长度为 8,因此每次需要增加 8 个字节的偏移量
addi $s1, $s1, 4
addi $t1, $t1, 1
j loop_search
# 在 location 数组中未找到对应的元素
loop_not_found2:
la $a0, output_error
li $v0, 4
syscall
# 输出错误信息后跳转到查询指定地点名的罚单记录的循环
j query_loop
# 输出对应的罚单记录
found2:
sll $t1, $t1, 2 # 罚单记录中每个元素占据 4 个字节,因此需要将下标乘以 4 得到偏移量
add $s1, $s1, $t1 # 计算出对应罚单记录的地址
lw $a0, ($s1) # 读取罚单记录并输出
li $v0, 1
syscall
la $a0, "\n"
li $v0, 4
syscall
j query_loop
# 程序结束
li $v0, 10
syscall
在这个程序中,我们使用了两个循环:一个循环用于输入地点名和相应罚单记录,另一个循环用于查询指定地点名的罚单记录。在输入时,我们使用 beq
指令根据位置名称判断是否为已存储的位置,并据此决定是更新相应的罚单记录还是添加新的位置及相应罚单记录。
在查询时,我们同样使用 beq
指令根据位置名称判断是否为已存储的位置,并据此输出相应的罚单记录,否则输出错误信息。这两个循环虽使用了相同的查找方式,但对应的地址偏移量不同,需要根据情况进行适当调整。