-1

请尽快帮助... 编写一个 MIPS 汇编语言程序,提示用户输入两个字符串(每个字符串不应超过 50 个字符,包括空终止符)。您的程序应该确定第二个字符串是否是第一个字符串的子字符串。如果是,那么您的程序应该打印出第一个索引,其中第二个字符串出现在第一个索引中。例如,如果第一个字符串是“Hello World”,第二个字符串是“lo”,那么程序应该打印出 3,即“lo”在“Hello World”中的起始索引。如果第二个字符串不包含在第一个字符串中,那么您的程序应该打印出 -1。

4

1 回答 1

0

为了能够理解你必须在汇编级别实现什么,你应该做的第一件事就是理解高级算法。为什么?

  • 您可以更轻松地及时查看所有案例和边缘案例!
  • 回头看看我一直在尝试做什么?在对汇编版本进行编程的过程中。
  • 快速查看您(当然)需要哪些变量。

我写了以下程序(原谅我,python 对我来说已经有一段时间了):

def is_in_string_1(string, substring):
    """
        aaba: a, b, ab, ba, aba (last one will fail)
    """
    length = len(string)
    sublength = len(substring)

    if (sublength == 0):
        return True

    j = 0
    for i in range(0, length):
        if string[i] != substring[j]:
            j = 0
        else:
            j += 1
            if j == sublength:
                return True
    return False

def is_in_string_2(string, substring):
    """
        aaba: a, b, ab, ba, aba
    """
    length = len(string)
    sublength = len(substring)
    for i in range(0, length + 1 - sublength):  # string: aabc; substring: c; length: 4; sublength: 1; indexes: 0,1,2,3;
        is_substring = True
        for j in range(0, sublength):           # for the sake of the algorithm, no slicing here
            if string[i+j] != substring[j]:
                is_substring = False
                break
        if is_substring:
            return True
    return False
 
stringTuples = [
    ("aaa", "aa"),
    ("aaa", "aaa"),
    ("aaa", "aab"),
    ("abc", "bc"),
    ("abc", "a"),
    ("abc", "abc"),
    ("aaa", ""),
    ("aaa", "b")
]

for stringTuple in stringTuples:
    print(
        stringTuple[0],
        stringTuple[1],
        ':',
        is_in_string_1(stringTuple[0], stringTuple[1]),
        is_in_string_2(stringTuple[0], stringTuple[1]),
        sep='\t'
    )

我首先认为我可以优化标准解决方案(is_in_string_2),省去第二个 for 循环(is_in_string_1),但经过一番思考,我已经发现它会失败(边缘情况甚至不在我的任何测试数据中! ) - 所以我把它作为一个例子来说明使用正确算法的重要性。

该程序产生以下输出:

aaa     aa      :       True    True
aaa     aaa     :       True    True
aaa     aab     :       False   False
abc     bc      :       True    True
abc     a       :       True    True
abc     abc     :       True    True
aaa             :       True    True
aaa     b       :       False   False
aaba    aba     :       False   True

注意所有输出是如何正确的,除了最后一行,第一个算法是错误的。

在继续之前:

  • len()您必须在 MIPS中创建自己的函数;请注意,所有字符串(如果我没记错的话)都是空终止的,因此您必须计算字符串的所有非空字符,或者换句话说,计算空终止符之前的字符数。
  • 您应该使用j,$rajr调用去“函数”或子例程。(搜索)
  • 同时,您可以使用 stack调用其他函数。(搜索)
于 2020-06-18T14:22:44.893 回答