华中科技大学上机题
题目一:
从键盘输入一行英文句子,句子中只有英文单词和空格,每个单词之间由若干个空格隔开,英文单词由大小写字母组成,编程完成下列任务:
(1)统计并输出此句子中英文字母的个数;
(2)统计并输出此句子中单词的个数;
(3)查找此句子中出现次数最多的字母(不区分大小写,大小写字母是相同的)和次数。当出现最多的字符不止一个时,都能找到,并输出找到的所有字母及次数。(输出字母时大小写均可)。
例如:输入句子:This is An Pencil Case
则输出为:
字母个数:18
单词个数:5
最多的字母:i,s
出现的次数:3
算法思想:
(1)对于第一问,直接逐个读取字符串中的每个字符,判断是否是字母,再进行计数就可。
(2)对于第二问,可以根据单词的边界进行判断,每个单词后面都是空格或是字符串结束标志’\0’。若一个字母后面一个字符是空格或字符串结束标志,则前面的这些字母就构成了一个单词。
(3)对于第三问,我们可以通过数组存储每个单词的出现次数(大小写算一种),找出次数的最大值,然后再遍历一遍,把出现次数等于最大次数的字母输出出来。
#include<iostream>
#include<string>
using namespace std;
bool isCharacter(char c) {
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
return true;
else
return false;
}
void function1(string str) {
int count = 0;
int i = 0;
while (str[i] != '\0') {
if (isCharacter(str[i])) {
count++;
}
i++;
}
cout << "字母个数:" << count << endl;
}
void function2(string str) {
int count = 0;
for (int i = 0;i < str.length();i++) {
if (isCharacter(str[i]) && (str[i + 1] == ' ' || str[i + 1] == '\0'))
count++;
}
cout << "单词个数:" << count << endl;
}
void function3(string str) {
int count[26];
for (int i = 0;i < 26;i++)
count[i] = 0;
for (int i = 0;i < str.length();i++) {
if (str[i] >= 'a' && str[i] <= 'z') {
int num = int(str[i] - 'a');
count[num]++;
}
if (str[i] >= 'A' && str[i] <= 'Z') {
int num = int(str[i] - 'A');
count[num]++;
}
}
int max = 0;
for (int i = 0;i < 26;i++) {
if (count[i] > max)
max = count[i];
}
cout << "最多的字母:";
for (int i = 0;i < 26;i++) {
if (count[i] == max) {
cout << char(i + 'a') << " ";
}
}
cout << endl;
cout << "出现的次数:" << max << endl;
}
int main() {
string str;
cout << "输入字符串:";
getline(cin, str);
function1(str);
function2(str);
function3(str);
return 0;
}
运行测试:
题目二描述:
十二进制是数学中一种以12为底数的计数系统,它由0-9,a,b组成,与十进制的对位关系是:0-9对应0-9,a对应10,b对应11.例如,十二进制的a2,十进制是122,。输入一个仅含十二进制数字的字符串(字母一律小写,不超过8个字符),完成以下任务:
(1)输出该十二进制数每一位对应的十进制数(从高位到低位顺序输出,空格隔开);
(2)实现“十二进制”转“十进制”算法,输出该十二进制数对应的十进制数;
(3)输出转换后的十进制数在内存中的每个二进制位(共4字节,每字节之间空格隔开)。
例如:输入十二进制数:a2
则输出位:
10 2
122
00000000 00000000 00000000 01111010
算法思想:
(1)第一问,逐个字符分析即可。
(2)第二问,根据权值进行计算,与二进制和十进制的转换是类似的。
(3)第三问,其实是把十进制转换成二进制,我们可以把转换成的二进制数存放到数组中。因为要以4字节长度输出,我们先由低位到高位按顺序存储,后面进行补0,补到四字节长度,然后对数组进行逆置。
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int dozenCharToDecem(char c) {//将十二进制的字符转换成对应的十进制
int result = -1;
if (c >= '0' && c <= '9')
result = c - '0';
else if (c == 'a')
result = 10;
else if (c == 'b')
result = 11;
return result;
}
void printDozenToDecem(char num[]) {//打印十二进制字符串中的每一位转换为对应的十进制
for (int i = 0;num[i] != '\0';i++) {
cout << dozenCharToDecem(num[i]) << " ";
}
cout << endl;
}
int dozenToDecem(char num[]) {//将十二进制转换为十进制
int result = 0;
int weight = 0;
int i = strlen(num) - 1;
while (i >= 0) {
result += dozenCharToDecem(num[i]) * pow(12, weight);
weight++;
i--;
}
return result;
}
void printNumofBin(int num) {//以4字节长度输出十进制数num的二进制形式
int bin[32];
int i;
for (i = 0;i < 32;i++)
bin[i] = 0;
i = 31;
while (num / 2 != 0) {
bin[i] = num % 2;
num /= 2;
i--;
}
bin[i] = num;
for (i = 0;i < 32;i++) {
cout << bin[i];
if ((i + 1) % 8 == 0)
cout << ' ';
}
cout << endl;
}
int main() {
char num[8];
cout << "输入十二进制数:";
cin >> num;
printDozenToDecem(num);
cout << dozenToDecem(num) << endl;
printNumofBin(dozenToDecem(num));
return 0;
}
运行测试: