统计单词--2018

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;
}

运行结果:
字符统计

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值