17.10.27作业 字符数组七则
Posted TobicYAL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了17.10.27作业 字符数组七则相关的知识,希望对你有一定的参考价值。
例题(12.3) 忽略大小写的字符串比较 (1016)
描述 | |
一般我们用strcmp可比较两个字符串的大小,比较方法为对两个字符串从前往后逐个字符相比较(按ASCII码值大小比较),直到出现不同的字符或遇到‘\0‘为止。如果全部字符都相同,则认为相同;如果出现不相同的字符,则以第一个不相同的字符的比较结果为准。但在有些时候,我们比较字符串的大小时,希望忽略字母的大小,例如"Hello"和"hello"在忽略字母大小写时是相等的。请写一个程序,实现对两个字符串进行忽略字母大小写的大小比较。 | |
关于输入 | |
输入为两行,每行一个字符串,共两个字符串。(每个字符串长度都小于80) | |
关于输出 | |
如果第一个字符串比第二个字符串小,输出一个字符"<" 如果第一个字符串比第二个字符串大,输出一个字符">" 如果两个字符串相等,输出一个字符"=" | |
例子输入 | |
Hello, how are you?
hello, How are you?
|
|
例子输出 | |
=
|
|
提示 | |
编写C程序时,请用gets录入每行字符串,scanf无法录入整行。 不要使用 strlwr()和strupr()函数来做。 |
1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 char ch1[80],ch2[80];int judge=0;//定义两个符号型数组来输入,设置一个判断数初始化为0 7 cin.getline(ch1,80); 8 cin.getline(ch2,80);//输入两行数组 9 for (int i = 0; ch1[i] != ‘\0‘ || ch2[i] != ‘\0‘; i++) 10 { 11 if (ch1[i] < 97) 12 ch1[i] += 32; 13 if (ch2[i] < 97) 14 ch2[i] += 32;//当ASCII码小于97时数字为大写,此时把它们转换成小写 15 if (ch1[i] > ch2[i])//判断两个元素的大小,要是两个元素不等把判断值设为1 16 { 17 cout << ">" << endl; 18 judge = 1; 19 break; 20 } 21 else if (ch1[i] < ch2[i]) 22 { 23 cout << "<" << endl; 24 judge = 1; 25 break; 26 } 27 } 28 if (judge == 0)//当判断条件为0的时候输出等号 29 cout << "=" << endl; 30 }
wrong answer:2
将字符串中的小写字母转换成大写字母
描述 | |
给定一个字符串,将其中所有的小写字母转换成大写字母。 | |
关于输入 | |
若干行,每行是一个字符串(长度不超过100)。 输入以Ctrl+Z结束,也就是强行中断输入流,此时cin表达式运行结果为false。在正常情况下cin表达式的运行结果都是true。因此,本题可以使用 while(cin>>str) { 处理当前行的字符串 } | |
关于输出 | |
将输入的字符串中所有小写字母转换成大写字母后的字符串。 | |
例子输入 | |
helloworld123Ha
|
|
例子输出 | |
HELLOWORLD123HA
|
1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 char str[101], i = 0;//定义一个符号数组和一个循环数 7 while (cin >> str)//在终止符前一直可以输入 8 { 9 for (i = 0; str[i] != ‘\0‘; i++)//循环判断将小写字母改为大写 10 { 11 if (str[i] >= 97 && str[i] <= 122) 12 str[i] -= 32; 13 } 14 cout << str;//输出整个字符串 15 cout << endl; 16 continue; 17 }}
注意while(cin>>str)用法
单词替换
描述 | |
输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。 | |
关于输入 | |
输入包括3行: 第1行是包含多个单词的字符串 s 第2行是待替换的单词 a (长度<=100) 第3行是a将被替换的单词 b (长度<=100) s, a, b 最前面和最后面都没有空格。 |
|
关于输出 | |
输出只有 1 行: 将s中所有单词a替换成b之后的字符串。 如果s中单词a没有出现,则将s原样输出。 |
|
例子输入 | |
You want someone to help you
You
I
|
|
例子输出 | |
I want someone to help you
|
|
提示 | |
可以用 gets() 函数来输入带空格的字符串。 |
1 #include <iostream> 2 #include<string.h> 3 using namespace std; 4 5 int main() 6 { 7 char s[101][101], a[101], b[101], ch; int len, lin = 0, col = 0; //定义一个二维符号数组s,两个一维的a和b,定义一个符号ch以备程序中判断,定义b的长度len,初始化行数lin和列数col 8 for (int i = 0;;) 9 { 10 cin.get(ch);//把输入的每个元素赋值给ch 11 if (ch == ‘ ‘)//如果ch为空格,把最后输入的值后面那一格赋为null,然后增加行数,使列数归0,如果ch为回车,那么结束输入并填入null值,如果ch为一个字母,就把它填入当前行列,达到每行一个单词的目的 12 { 13 s[lin][col] = ‘\0‘; 14 lin++; col = 0; 15 } 16 else if (ch == ‘\n‘) 17 { 18 s[lin][col] = ‘\0‘; 19 break; 20 } 21 else 22 { 23 s[lin][col] = ch; col++; 24 } 25 } 26 cin.getline(a, 101); cin.getline(b, 101); 27 len = strlen(b); 28 for (int i = 0; i <= lin; i++) 29 { 30 if (strcmp(s[i], a) == 0) //当某一行的单词和a一样时,将这一行替换为b 31 for (int j = 0; s[i][j] != ‘\0‘||b[j]!=‘\0‘; j++) 32 { 33 if (j < len) 34 s[i][j] = b[j]; 35 else 36 s[i][j] = ‘\0‘; 37 s[i][j + 1] = ‘\0‘; 38 } 39 } 40 for (int i = 0; i < lin; i++) 41 cout << s[i] << " "; 42 cout << s[lin] << endl; 43 }
wrong answer:2(字符串长度考虑漏了)
1079 统计字符数
描述 | |
判断一个由a-z 这26 个字符组成的字符串中哪个字符出现的次数最多 | |
关于输入 | |
第1 行是测试数据的组数n,每组测试数据占1 行,是一个由a-z 这26 个字符组成的字符串 每组测试数据之间有一个空行,每行数据不超过1000 个字符且非空 | |
关于输出 | |
n 行,每行输出对应一个输入。一行输出包括出现次数最多的字符和该字符出现的次数,中 间是一个空格。 如果有多个字符出现的次数相同且最多,那么输出ascii 码最小的那一个字符。 | |
例子输入 | |
2
abbccc
adfadffasdf
|
|
例子输出 | |
c 3
f 4
|
1 #include <iostream> 2 using namespace std; 3 int main() { 4 int n, count[27], word, max; //定义整数n,用来计算字母个数的数组count,最多字母编号word,以及最大重复数max 5 cin >> n; 6 cin.ignore(); //吸收掉输入n后的回车符 7 char str[1001], result; //定义符号型数组来储存字符串,以及出现最多的字母result 8 for (int i = 0; i<n; i++) 9 { 10 for (int j = 1; j <= 26; j++) //初始化数组count 11 count[j] = 0; 12 cin.getline(str, 1001); //输入字符串 13 cin.ignore(); 14 for (int j = 0; str[j] != ‘\0‘; j++) //在循环中计算所有字母个数的出现次数 15 count[str[j] - 96]++; 16 max = count[1]; word = 1; //初始化max和word 17 for (int j = 1; j <= 26; j++) //在循环中比较max和count中元素的大小确定出结果 18 { 19 if (max<count[j]) 20 { 21 max = count[j]; 22 word = j; 23 } 24 } 25 result = word + 96; 26 cout << result << " " << max << endl; 27 } 28 }
验证子串
描述 | |
输入两个字符串,验证其中一个串是否为另一个串的子串 | |
关于输入 | |
两个字符串,长度小于100 | |
关于输出 | |
若第一个串s1是第二个串s2的子串,则输出(s1) is substring of (s2) 否则,若第二个串s2是第一个串s1的子串,输出(s2) is substring of (s1) 否则,输出 No substring | |
例子输入 | |
abc
dddncabca
|
|
例子输出 | |
abc is substring of dddncabca
|
|
提示 | |
字符串匹配算法 |
1 #include <iostream> 2 #include<string.h> 3 using namespace std; 4 int main() { 5 char s1[100], s2[100]; //定义两个数组来储存两条字符串 6 int judge = 1, len1, len2; //设置一个判断值judge,定义两个字符串的长度 7 cin.getline(s1, 100); 8 cin.getline(s2, 100); 9 len1 = strlen(s1); 10 len2 = strlen(s2); 11 if (len1 > len2) //当第一条字符串比较大,另一条有可能是它的子串 12 { 13 for (int i = 0; i <= len1 - len2; i++) //对以s1[len1-len2]前的所有元素为首的,len2长度的子串和s2进行比较(忘了用strcmp) 14 { 15 for (int j = 0; s2[j] != ‘\0‘; j++) 16 { 17 judge = 1; 18 if (s1[i + j] != s2[j]) 19 { 20 judge = 0; break; 21 } 22 23 } 24 if (judge == 1) 25 { 26 cout << s2 << " is substring of " << s1 << endl; 27 break; 28 } 29 } 30 if (judge == 0) 31 cout << "No substring" << endl; 32 } 33 if (len1<= len2) //然后考虑len2比较长的情况 34 { 35 for (int i = 0; i <= len2 - len1; i++) 36 { 37 for (int j = 0; s1[j] != ‘\0‘; j++) 38 { 39 judge = 1; 40 if (s2[i + j] != s1[j]) 41 { 42 judge = 0; break; 43 } 44 45 } 46 if (judge == 1) 47 { 48 cout << s1 << " is substring of " << s2 << endl; 49 break; 50 } 51 } 52 if (judge == 0) //如果两种情况下都没有找到 53 cout << "No substring" << endl; 54 } 55 }
例题(12.9) 数制转换
描述 | |
求任意两个不同进制非负整数的转换(2进制~36进制),所给整数在long所能表达的范围之内。 不同进制的表示符号为(0,1,...,9,a,b,...,z)或者(0,1,...,9,A,B,...,Z)。 | |
关于输入 | |
输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。 a,b是十进制整数,2 ≤ a,b < 36。 | |
关于输出 | |
输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,Z)。 | |
例子输入 | |
15 Aab3 7
|
|
例子输出 | |
210306
|
|
提示 | |
可以用字符串表示不同进制的整数 |
1 #include <iostream> 2 #include<string.h> 3 #include<math.h> 4 using namespace std; 5 int main() { 6 int a, b, mutNum, over,len,mut,bMut; //定义整数a,b,备用变量mutNum,over分别代表次方数和除数,字符串的长度len,结果的最大长度mut,和b的mut次方bMut 7 char ch, numStr[100]; //定义符号ch为一个中间量,供删去回车符和输出字符,定义一个储存输入的进制数 8 long num=0; //初始化输入的进制数的十进制形式num 9 cin >> a; 10 cin.get(ch); //删减回车符 11 cin.get(numStr, 100,‘ ‘); //输入字符串,遇到空格停止 12 cin >> b; 13 len = strlen(numStr); 14 if (a != b) 15 { 16 for (int i = 0; numStr[i] != 0; i++) //得出num 17 { 18 if (numStr[i] >= ‘a‘) 19 numStr[i] -= 32; 20 if (numStr[i] <= 57) 21 numStr[i] += 7; 22 mutNum = pow(a, len - i - 1); 23 num += mutNum*(numStr[i] - 55); 24 } 25 mut = 1; bMut = b; //初始化mut和bMut 26 while (bMut <= num) //得出mut 27 { 28 bMut = bMut*b; 29 mut++; 30 } 31 for (int i = mut - 1; i >= 0; i--) //输出结果 32 { 33 over = num / pow(b, i); 34 if (over <= 9) 35 cout << over; 36 else 37 { 38 ch = over + 55; 39 cout << ch; 40 } 41 mutNum = pow(b, i); 42 num = num%mutNum; 43 } 44 } 45 else 46 cout << numStr << endl; 47 }
wrong answer:1(ASCII码)
大整数减法
描述 | |
求2个大的正整数相减的差 | |
关于输入 | |
第1行是测试数据的组数n,每组测试数据占2行,第1行是被减数a,第2行是减数b(a > b)。每组测试数据之间有一个空行,每行数据不超过100位 | |
关于输出 | |
n行,每组测试数据有一行输出是相应的整数差 | |
例子输入 | |
2
9999999999999999999999999999999999999
9999999999999
5409656775097850895687056798068970934546546575676768678435435345
1
|
|
例子输出 | |
9999999999999999999999990000000000000
5409656775097850895687056798068970934546546575676768678435435344
|
#include <iostream> #include<string.h> using namespace std; int main() { char s1[101], s2[101]; //定义两个数组分别储存两个大整数 int n, a1[101], a2[101],a3[101],len1,len2,num; //定义n,数组a1和a2分别储存大整数的每一位,a3数组储存这两个大整数的差,定义两个字符串的长度,定义s1位数与a3位数差的值num cin >> n; cin.ignore(); //删去回车 for (int j = 0; j < n; j++) { cin.getline(s1, 101); cin.getline(s2, 101); len1 = strlen(s1); len2 = strlen(s2); for (int i = 0; i < len1; i++) //把s1中表示的每一位数输入a1,初始化a2为和a1相同长度的数组 { a2[i] = 0; a1[i] = s1[i] - ‘0‘; } for (int i = 0; i < len2; i++) //把s2中的数字输入 a2[i + len1 - len2] = s2[i] - ‘0‘; for (int i = len1-1; i >=0; i--) //逐位数做差得到a3 { a3[i] = a1[i] - a2[i]; if(a3[i]<0) { a1[i - 1]--; a3[i] += 10; } } for(int i=0;i<len1;i++) //得出num if(a3[i]!=0) { num = i; break; } for (int i = num; i < len1; i++) cout << a3[i] ; cout << endl; cin.ignore(); } }
wrong answer:2(算法注意)
以上是关于17.10.27作业 字符数组七则的主要内容,如果未能解决你的问题,请参考以下文章