MIPS:计算纯文本文件中的唯一单词并查找其频率
第一次在这里提问。我对MIPS的家庭作业感到非常沮丧。赋值状态:输入将是一个纯文本文件,输出将是另一个包含单词列表及其频率的文件。输出文件呈现两列,左列为单词,右列为输入文件中的频率数。例如,输出文件可能如下所示: have:2MIPS:计算纯文本文件中的唯一单词并查找其频率,mips,Mips,第一次在这里提问。我对MIPS的家庭作业感到非常沮丧。赋值状态:输入将是一个纯文本文件,输出将是另一个包含单词列表及其频率的文件。输出文件呈现两列,左列为单词,右列为输入文件中的频率数。例如,输出文件可能如下所示: have:2 他们:3 is:4 i:5 我们假设使用MIPS汇编编写此代码。我不明白我该如何处理这类问题。我想首先将旧文件中的所有字符读入内存中的数组,然后尝试找出一种方法来构造第二个数组,该数组包含所有唯一的单词及其频率 到目前为止,我只能将原始文件读入数组。 .数据 字符:。空
他们:3
is:4
i:5
我们假设使用MIPS汇编编写此代码。我不明白我该如何处理这类问题。我想首先将旧文件中的所有字符读入内存中的数组,然后尝试找出一种方法来构造第二个数组,该数组包含所有唯一的单词及其频率 到目前为止,我只能将原始文件读入数组。 .数据 字符:。空格1024 fin:.ascii“chill.txt”#要读取的文件名 唯一字:。空格1024 .文本 主要内容:
如果有人能给我这个任务的指导,我将不胜感激。非常感谢 对于所有像这样复杂的赋值,您应该首先用C编写并调试一个简单的解决方案,然后手工翻译成汇编。您可以用C快速开发一个工作解决方案。然后,您所需要做的就是验证您是否已将其正确地转换为程序集,并调试您可能在程序集中引入的任何bug 考虑一个问题的解决方案并同时考虑该解决方案在汇编程序中的实现太复杂了。你只会陷入细节,迷失方向。这就是我在日常工作中用汇编写东西的方式 解决此问题的最简单方法是使用一个数组,其中包含迄今为止看到的所有单词,并使用一个单独的数组,每个单词都有使用计数,这样单词[0]的使用计数就保留在计数[0]中。然后:
- 当你读入一个新词时:
- 将其与数组中的每个单词进行比较
- 如果与某个单词匹配,则增加该单词的使用计数
- 如果到达阵列末尾时没有匹配项:
- 将当前字添加到数组的末尾
- 增加数组长度。如果数组长度超过最初为数组分配的空间,请放弃并退出,并出现错误
这只是一个简单的建议,不难翻译成汇编语言。显然有很多更快的算法可以解决这个问题,比如树和哈希表。我试着用Java编写并翻译,但我也被困在如何用Java编写这个问题上)非常感谢你的帮助
Open a file
li $v0, 13 # syscall for open file
la $a0, fin # output file name
li $a1, 0 # open for read
li $a2, 0
syscall
move $s6, $v0 # save the file descriptor
read from the file that just opened
li $v0, 14 # syscall for read from file
move $a0, $s6 # file descriptoer
la $a1, chars
li $a2, 1024
syscall
I try to use these to find the beginning and the ending or a word.
add $t4, $zero, $zero # I = 0
add $t0, $zero, $zero # TOTAL = 0
add $t1, $zero, 44 # ENDPOINT = ','
add $t2, $zero, 32 # ENDPOINT = ' '
addi $t3, $zero, 46 # ENDPOINT = '.'
loop:
lb $t5, chars($t4) # for c in chars
beq $t5, $zero, endloop #
beq $t5, $t3,uniqueWord # if c == '.' go to uniqueWord
beq $t5, $t1,uniqueWord # if c == ',' go to endloop
beq $t5, $t2, uniqueWord # if c == ' ' go to endloop
addi $t4, $t4, 1 # i += 1 increment index
addi $t0, $t0, 1 # total += 1
j loop