1.输入一句英文(含空格),求
(1)统计英文单词个数(10’)
(2)统计字符个数(10’)
(3)查找出现次数最多的字符(可能不止一个),要求全部给出并输出出现的次数(20’)
以上输出均不区分大小写
例如 this is A pencil Case
输出:
英文单词数:5
字符个数:17
出现最多字符:i,s
出现次数:3
输入带空格的字符串首选gets()函数,若字符为空格,记录为一个新单词,否则记录为一个字符。第三问稍微麻烦些,在代码中讲解,还得特别注意一点,题中强调以上输出均不区分大小写,所以输入中大小写应同步,可以将输入的大写转化为小写字母,利用<ctype.h>中的ch=tolower(ch)可以大写转化为小写,ch=toupper(ch)可以小写转化为大写,也可根据字母的ascii值进行转化,A–65,Z–91,a–97,z–123,具体见https://blog.csdn.net/weixin_39617680/article/details/78052894
记录出现最多的字符和出现次数,我用的是最笨的方法,一次次循环
1.先用sumsum[]的下标对应于原字符串,记录第一次出现的字符的次数,
并设置标志位跳过已访问的字符,如对于abc dbc,sumsum[]={1220100}后面重复的
不访问不计数,所以还是初始值0;
2.在sumsum[]中找出最大值,记为maxsum,即为字符出现的最多次数;
3.再遍历sumsum[],找出有几个最大值,即次数最多的字符的个数,记为con;
4.最后遍历一次ch[]同时也是遍历sumsum[],当sumsum[j]==maxsum,表示这是
其中一个次数最多字符,输出并使con-1,直到遍历结束,同时注意最后一个字符的格式跟前面不一样
代码:
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
using namespace std;
int main()
{
char ch[120];
//char maxzifu;
while(gets(ch)){//将整个输入看做是一整个字符串输入
int danci=1,zifu=0,sum=0;
int len=strlen(ch);
for(int i=0;i<len;i++){
if(ch[i]==' ')//若遇见空格,表示有一个新的单词
danci++;
else {
zifu++;//忽略掉空格记录单词数量
if(ch[i]>='A'&&ch[i]<='Z'){//将大写字母转化为小写字母,方便后续统计字母个数
ch[i]=tolower(ch[i]);
}
}
}
cout<<"英文单词数:"<<danci<<endl;
cout<<"字符数:"<<zifu<<endl;
/*
接下来是记录出现最多的字符和出现次数,我用的是最笨的方法,一次次循环
1.先用sumsum[]的下标对应于原字符串,记录第一次出现的字符的次数,
并设置标志位跳过已访问的字符,如对于abc dbc,sumsum[]={1220100}后面重复的
不访问不计数,所以还是初始值0;
2.在sumsum[]中找出最大值,记为maxsum,即为字符出现的最多次数;
3.再遍历sumsum[],找出有几个最大值,即次数最多的字符的个数,记为con;
4.最后遍历一次ch[]同时也是遍历sumsum[],当sumsum[j]==maxsum,表示这是
其中一个次数最多字符,输出并使con-1,直到遍历结束,同时注意最后一个字符的格式跟前面不一样
*/
//1.
int sumsum[101]={0},flag[101]={0},t=0;//sumsum[]
for(int i=0;i<len;i++){
if(ch[i]!=' '){
flag[i]=1;
t=i;
for(int j=i+1;j<len;j++){
if(ch[i]==ch[j]&&flag[j]==0){
ch[j]='*';
sumsum[t]++;
flag[j]=1;
}
}
}
else sumsum[i]=0;
}
//2.
int maxsum=0;
for(int j=0;j<t;j++){
if(maxsum<sumsum[j]){
maxsum=sumsum[j];
}
}
//3.
int con=0;
for(int j=0;j<t;j++){
if(sumsum[j]==maxsum){
con++;
}
}
//cout<<"con="<<con<<endl;
//4.
cout<<"出现最多字符:";
int k=0;
for(int j=0;j<t;j++){
if(sumsum[j]==maxsum){
if(k<con-1){//在这犯了个小错误,用k记录已输出的最大个数字符数,con为上界,注意格式
cout<<ch[j]<<",";
}
else cout<<ch[j];
k++;
}
}
cout<<endl<<"出现次数:"<<maxsum+1<<endl;
}
return 0;
}
运行结果: