NowCoder——单词识别(C语言非结构体解法)

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//输入一个英文句子,把句子中的单词(不区分大小写)按出现次数按从多到少把单词和次数在屏幕上输出来
//要求能识别英文句号和逗号,即是说单词由空格、句号和逗号隔开。

//对已经统计好的单词数组按照字典顺序排序
void insertionSort(int A[],int N, char h[][1000])
{
    int i,j,v;
    char str[1000];
    for(i=0; i<N; i++)
    {
        v=A[i];
        strcpy(str,h[i]);
        j=i-1;
        //while(j>=0 && A[j]<v)         //按照单词出现频率从高到低可以使用此条代码。
        while(j>=0 && strcmp(h[j], str) > 0)
        {
            A[j+1]=A[j];
            strcpy(h[j+1],h[j]);
            j--;
        }
        A[j+1]=v;
        strcpy(h[j+1],str);
    }
}
void wordcount(char *sentence)
{
    char *p;
    int len=strlen(sentence);  //记录句子sentence的长度。
    char h[len][1000];         //建立二维字符串数组,用来存放句子中划分好的单词。
    char h1[len][1000];        //用来存放后续的" "字符。
    int row;                   //统计这句英语总共包含多少单词。
    int i;
    //把句子中所有字母转换成小写
    for(i=0; i<len; i++)
    {
        p=sentence;
        if(p[i]>='A'&&p[i]<='Z')
            p[i]+=32;
    }
    //对句子中的单词进行切分。
    for( i=0; i<len; i++)
    {
        p=sentence;
        while(p&&*p!=' '&&*p!=','&&*p!='.'&&*p!='\0'&&*p!='!')  //只要不遇到这些符号的时候,指针继续后移
        {
            ++p;
        }
        if(' '==*p ||','==*p || '.'==*p||'!'==*p||'\0'==*p)     //如果遇见',''.' ' ''\0'从此位置进行单词切分
        {
            *p++='\0';
            strcpy(h[i],sentence);                              //把单词存入数组h[i]中
        }
        sentence=p;                                             //切分的后半段,重新赋给句子sentence
        if(strlen(h[i]))                                        //如果划分的单词不为空
        {
            row=i+1;                                            //单词数加1.
        }

    }

    int b[row];                           //用来存放句子中每个单词出现次数
    int row1=0;                           //用来统计非重复单词个数
    for(i=0; i<row; i++)
    {
        //b[i]=1;                       //每个单词至少出现1次,初始化为1
        int times=1;
        if(strcmp(h[i]," ")!=0)            //如果str不为空
        {
            for(int j=i+1; j<row; j++)     //从数组i之后每个数组内的单词都与str相比
            {
                if(strcmp(h[j],h[i]) == 0)  //如果是一样的。
                {
                    times++;                //出现次数+1
   //                 b[i]=times;             //更新当前单词频次数组的值。
                    strcpy(h[j]," ");       //这时候为了避免重复统计把h[j]换成空" "。
                }
            }
            b[row1]=times;
            strcpy(h1[row1],h[i]);          //把整理好的非重复性单词存入字符串数组h1中。*其实不存也行,无非就是数组中有数值为空的数组单元,但牛客不通过,只能多此一步*
            row1++;                          //非重复性单词的个数
        }
    }
    row =row1;
    for (i = 0; i < row; i++)
    {
        strcpy(h[i],h1[i]);
    }
    insertionSort(b, row, h);
    for(i=0; i<row; i++)
    {
        char *q;
        q=h[i];
        if(strcmp(h[i]," ")!=0&&*q!='\0')
        {
            printf("%s:%d\n", h[i], b[i]);
        }
    }
}

int main()
{
    char sentence[10000];
    gets(sentence);
    wordcount(sentence);

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值