C语言蓝桥杯真题:单词分析-创新互联
#include#includeint main()
{
int count[26]={0};
char ch=0;
int maxc=0;
while((ch=getchar())!='\n')
{
if(++count[ch-97]>=count[maxc])
{
maxc=ch-97;
}
}
printf("%c\n%d",maxc+97,count[maxc]);
return 0;
}
初始化: 创建字母表count,巧妙地串联起了单词顺序,主要作用是记录单词出现的个数
解释:我们已知ASCII码中,小写的字母a之后的ASCII码为97,98....后面的代码中将输入的字符ch-97,我们可知'a'-97=0,'b'-97=1,'c'-97=2....
即作者意图将count创立为count[0]表示a,count[1]表示b,count[2]表示c以此类推
数组内部则统计各个字母出现的个数
ch用来遍历
maxc记录出现最多次的单词,作为输出内容的一部分(原变量名为maxInside,我改成了maxc,意思是maxchar 大的字符,这个因人而异,但是有一个好的变量名称习惯是很必要的!)
初始化为0,在下一步中默认为count[0],即第一个字母a
遍历过程:while((ch=getchar())!='\n')
{
if(++count[ch-97]>count[maxc])
{
maxc=ch-97;
}
循环条件为 ch接收的getchar函数读取的字符不为回车符
进入if条件后,先对出现的字符进行计数: ++count[ch-97],前置++
然后对其进行比较出现次数的大小判断:
第一次进入时:maxc为0,即count[0],表示的是第一个字母a
如果ch-97>=maxc,即 '输入字母'>='a' 则将最多次数的字母的位置记录为maxc
因为是前置++,所以第一次肯定更新maxc
除非是a,因为count[0]=count[0]
后面遍历的情况:
因字符而异啦
进入条件先对读取字符的次数加一,然后判断
如果读取的字符出现的次数 大于 目前出现次数最多的字符
更新 maxc
输出过程:printf("%c\n%d",maxc+97,count[maxc]);
因为maxc的大小和ch-97是配合起来的,哪怕是初始化,当maxc=0时,maxc+97为a的ASCII码值
所以这里直接输出字符%c,按照char类型输出maxc+97 及%d,按照Int类型输出数组的内容count[maxc]即出现最多的字符
第二个代码解析:#include#includeint main(int argc, char *argv[])
{
// 请在此输入您的代码
int count[26]={0},max=0,i;
char ch;
while((ch=getchar())!='\n')
count[ch-'a']++;
for(i=1;i<26;i++)
if(count[i]>count[max])
max=i;
printf("%c\n%d",max+'a',count[max]);
return 0;
}
这个写的很清晰很简单,但是它不如第一个简约:
1.先while循环 进行字母出现次数 计数
2.进行for循环遍历,看看哪个出现的字母个数最多
这里需要注意的点是: i=1,它没有从0开始
因为第一次进入后count[1]先和count[max]比较,此时的max=0,很细节的优化
3.输出
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网页题目:C语言蓝桥杯真题:单词分析-创新互联
分享地址:http://azwzsj.com/article/dhjdei.html