【问题标题】:MIPS - Frequency of EACH lowercase, uppercase, and space charactersMIPS - 每个小写、大写和空格字符的频率
【发布时间】:2017-02-08 11:14:32
【问题描述】:

我正在尝试计算一个字符出现的次数,包括大写和小写以及从键盘输入的字符串中的空格字符。

我知道在 ASCII 中,a-z 是 97 - 122,A-Z 是 65-90。我不确定如何在汇编中实现这个算法,因为我对它很陌生,这个概念让我很困惑。

我的伪代码类似于:

// Uppercase
array[0] = -65
if (character read from string > 64) {
   if (character read from string < 91) {
     increment array[i] based on character
   }
}
// Print out integers stored in array (the frequency)

我不确定这是否是解决问题的方法。

    .data
prompt:     .asciiz "Please enter a string: \n"
userString: .space 104
occLow:     .space 104
occUpp:     .space 104
newLine:    .asciiz "\n"

#######################
# t0 = string
# t1 = char being looked at
# t2 = counter
# s0 = array lower (occLow)
# s1 = array upper (occUpp)
#######################

    .text
main:   li $v0, 4
        la $a0, prompt       # Prompts the user for string
        syscall

        li $v0, 8            # Save string to $a0
        la $a0, userString
        move $t0, $a0         # Move $a0 to $t0
        syscall

test:   lb $t1, 0($t0)         # Load each individual character
        beqz $t1, end           # If it is null, end program
        addi $t0, $t0, 1         # Next char

        beq $t1, 32, space      # If the character is a space
        blt $t1, 91, upper      # Uppercase character, 90 = 'Z'
        bgt $t1, 96, lower      # Lowercase character
        b test


upper1: bgt $t1, 64, upper2 # 65 = 'A'
        b test
upper2: # UPPERCASE ADDITIONS HERE
        # la $s0, occUpp
        # add $t0, $t0, 4
        # lw $t1, 0($s0)
        # addi $t2, 1
        # sw $t1, 

【问题讨论】:

  • 你的伪代码太伪了。在 C 中编写一个工作实现,仅使用:1) goto 2) 仅单个赋值(例如,没有 y = 2*x+z

标签: assembly ascii mips frequency


【解决方案1】:
// Uppercase
array[0] = -65
if (character read from string > 64) {
   if (character read from string < 91) {
     increment array[i] based on character
   }
}
// Print out integers stored in array (the frequency)

一些烦人的风格注释:


为什么 > 64 和 'A' 到 'Z'

在伪代码中我会尽量保持我的初衷,所以检查字符是否从6590(包括)。

character = next_char();
if (character < 'A') goto not_uppercase;
if ('Z' < character) goto not_uppercase;
// uppercase detected
...

not_uppercase:
// character is not uppercase
...

"基于字符的递增数组[i]"

所以你想要基于字符的i。什么是性格?从 0 到 255 的某个值,因为您的输入是 ASCII 编码的,所以单个字符是 8 位值。值 0-255 是否足以索引数组?实际上是,如果您保留 256 元素数组。您可以通过检查不需要计算统计信息的代码来提高内存效率,例如只计算值 32-127 的统计信息,然后您只需要 96 个计数器的数组,索引将是 (character-32)。如果您想将小写字母与大写字母一起计算,甚至可以通过 -32 ('a'-32 == 'A' 97-32 == 65) 将小写字母大写。

但您也可以使用 256 元素数组单独计算它们(甚至是字符串的不可打印内容),然后根据需要仅选择/分组它的大写/小写/空白/数字部分。

那么伪代码可能如下所示:

charCounters = array(256) { 0, 0, ... };
// ^^^ counters for each possible letter set to zero
for_each(character in string) {
    ++charCounters[character];   // count particular letter
}
// counters are now updated, displaying results

// for example total count of uppercase
uppercaseLettersTotalCount = 0;
for (i = 'A' to 'Z') {
    uppercaseLettersTotalCount += charCounters[i];
}
display("Total uppercase letters: " + uppercaseLettersTotalCount);

// number of 'A' letters, both upper and lowercase
totalA = charCounters['A'];
totalA += charCounters['a'];
display("Total A/a letters: " + totalA);

// ... etc

如果您只想显示短字符串(5-30 个字母)中单个字符的计数,那么执行简单的破坏性两个内部循环(逐个字符地遍历字符串并计算字符串剩余部分的相同字符:

for (string_index in [0, string_length - 1]) {
    character = string[string_index];
    if (0 == character) continue;   // was already counted
    count = 1;
    for (index2 in [string_index + 1, string_length - 1]) {
        if (character != string[index2]) continue;  // different char
        ++count;              // same character found
        string[index2] = 0;   // mark as counted (destroys input string)
    }
    display("Character " + character + " found " + count + " many times.\n");
}

【讨论】:

    猜你喜欢
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 2011-06-16
    • 2021-12-07
    • 1970-01-01
    • 2016-03-11
    相关资源
    最近更新 更多