2017-02-08 30 views
0

キーボードから入力された文字列から、大文字と小文字の両方の空白文字とともに表示される回数をカウントしようとしています。MIPS - 各小文字、大文字、および空白の度数

私は、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, 
+0

疑似コードがあまりにも擬似です。 1) 'goto' 2)単一の代入のみ(例えば' y = 2 * x + z'なし) –

答えて

0
// 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、あなたは大文字を書いた< 91は65〜90ですか?実際には、ほとんどのアセンブラがASCII形式を扱うことができるので、大文字は'A'から'Z'までです。

擬似コードでは、元の意図に従うようにします。したがって、文字が65から90(両端を含む)であるかどうかを確認してください。

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コード化されているので、1文字は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文字)を表示したい場合は、それはより速く、少ないメモリになります素敵な破壊的な2つの内部ループを行い、文字列charを文字列に通し、文字列の残りの部分から同じ文字を数えます。

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"); 
} 
関連する問題