3079:Vowel Counting

14 篇文章 1 订阅
Problem Description
The "Vowel-Counting-Word"(VCW), complies with the following conditions.
Each vowel in the word must be uppercase. 
Each consonant (the letters except the vowels) must be lowercase.
For example, "ApplE" is the VCW of "aPPle", "jUhUA" is the VCW of "Juhua".
Give you some words; your task is to get the "Vowel-Counting-Word" of each word.
 
Input
The first line of the input contains an integer T (T<=20) which means the number of test cases.
For each case, there is a line contains the word (only contains uppercase and lowercase). The length of the word is not greater than 50.
 
Output
For each case, output its Vowel-Counting-Word.
 
Sample Input
4
XYz
application
qwcvb
aeioOa 
 
Sample Output
xyz
ApplIcAtIOn
qwcvb
AEIOOA
 

分析:

将字符串当成数组,以数组形式读取字符串中单个元素。

代码如下:

#include <iostream>
#include <string>
using namespace std;

int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		string str;
		cin >> str;
		for (int i = 0;i < str.length();i++)
		{
			if (str[i] == 'a' || str[i] == 'e' || str[i] == 'i' || str[i] == 'o' || str[i] == 'u')
				str[i] -= 32;
			if (str[i] >= 'A'  && str[i] <= 'Z' && str[i] != 'A' && str[i] != 'E' && str[i] != 'I' && str[i] != 'O' && str[i] != 'U')
				str[i] += 32;
		}
		cout << str << endl;
	}

	return 0;
}


以下是一个高效的 MIPS 汇编语言函数 `Scan`,实现了扫描字符串并找出所有小写元音的位置以及出现的次数: ``` Scan: # Initialize variables li $t0, 0 # Counter for number of vowels found li $t1, 0 # Index of current character # Loop over characters in string loop: lb $a0, ($a1) # Load current character beqz $a0, done # If character is null, exit loop # Check if current character is a vowel addi $t2, $a0, -97 # Convert character to ASCII code and subtract 97 sltiu $t3, $t2, 21 # Check if character is between 'a' and 'u' andi $t4, $t2, 1 # Check if character is odd (i or u) or $t3, $t3, $t4 # Combine results of both checks beqz $t3, next # If character is not a vowel, skip to next character # If character is a vowel, print its position addi $t0, $t0, 1 # Increment vowel counter li $v0, 1 # System call for printing integer move $a0, $t1 # Move index of current character to $a0 jal PrintDecimal # Call PrintDecimal function to print index next: addi $a1, $a1, 1 # Increment pointer to next character addi $t1, $t1, 1 # Increment index of current character j loop # Jump back to start of loop done: move $a0, $t0 # Move vowel counter to $a0 for return jr $ra # Return to calling function ``` 该函数首先通过 `$a1` 寄存器获取字符串 `X` 的地址,然后使用 `lb` 指令以字节为单位从该地址加载当前字符。接下来,使用 `addi` 指令将 `$t2` 中存储的当前字符的 ASCII 码减去 97,得到字符相对于字母 a 的偏移量。然后,使用 `sltiu` 指令检查偏移量是否小于 21,以确定当前字符是否为小写元音字母。接下来,使用 `andi` 指令检查字符是否为 i 或 u,因为这两个字符不是元音字母,但它们是奇数偏移量。最后,使用 `or` 指令将两个检查的结果合并到 `$t3` 中。 如果 `$t3` 的值为 0,则当前字符不是小写元音字母,跳转到下一个字符。否则,将 `$t1` 中存储的当前字符的索引传递给 `PrintDecimal` 函数,以打印该字符在字符串中的位置。然后,使用 `addi` 指令将 `$t1` 和 `$a1` 的值增加 1,以指向下一个字符。最后,使用 `j` 指令跳转回循环的开始,直到遇到空字符为止。 在循环结束后,该函数将 `$t0` 中存储的小写元音字母的数量移动到 `$a0` 中,以便在堆栈上返回该值。该函数是可重入的,因为它不会使用任何静态数据,而是仅使用函数参数和寄存器来执行计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值