華中科技大學上機題

華中科技大學上機題

題目一:
從鍵盤輸入一行英文句子,句子中只有英文單詞和空格,每個單詞之間由若干個空格隔開,英文單詞由大小寫字母組成,編程完成下列任務:
(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;
}

運行測試:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章