您的位置:首页 > 编程语言 > C语言/C++

如何用c语言从键盘上读取一段英语短文,并统计出各个单词的出现个数

2018-03-31 15:18 615 查看
首先将这个问题分解成几个问题:
1.从键盘上读取文章。
2.将文章中的单词提取
3.去除重复的单词
4.统计单词的个数
一:从键盘上读取文章
1)可以有俩个方法。1.定义一个一维字符数组进行读取以及存储。2.定义一个二维字符数组读取以及存储。
本文中主要对第二个方法进行介绍
char m[10][30]={'\0'};            //定义一个二维的字符数组,并对其进行初始化,初始化为结束符,用来存储文章

char word[100][30]={'\0'};    //用来存储单词

for(i=0;i<10;i++)
    {
    gets(m[i]);
    flag++;
    if(strcmp(&m[i][0],"\0")==0)
{
break;
}
     }                                                           //get(m[i]) 一行一行的输入   如果不进行输入则直接跳出

二:提取文章的的单词
我是将字母全部转换成大写,然后判断是否为字母,是字母将其对应在另一个数组的数字为1,不是则为0
 for(i=0;i<10;i++)
 {
  for(j=0;j<30;j++)
  {
   if(m[i][j]>=97&&m[i][j]<=122)          //小写转换成大写
   {
    m[i][j]=m[i][j]-('a'-'A');
   }
   if(m[i][j]>=65&&m[i][j]<=90)
   {
    mark[l]=1;
   }
   else
   {
    mark[l]=0;
   }
   l++;
  }
 }

这段代码的作用就是实现我前面所说的。接下来就是根据1与0的关系将单词分解出来

for(p=0;p<300;p++)
 {
  if(mark[p]==1&&mark[p+1]==1)
  {
   word[r][s]=m[i][j];
   s++;
  }
  if(mark[p]==1&&mark[p+1]==0)
  {
   word[r][s]=m[i][j];
   r++;
   s=0;
   sum++;
  }
     j++;
     if(j==30)
     {
      j=0;
      i++;
  }
 }                

分解后再将重复的单词删除

 for(i=0;i<sum;i++)
 {
  strcpy(word2[i],word[i]);
 }
 sum1=sum;
    for(i=0;i<sum1;i++)
    {
     for(j=i+1;j<sum1;j++)
     {
      flag2=0;
      for(t=0;t<30;t++)
      {
       flag=1;
       if(word[i][t]==word[j][t])
       {
        flag=0;
    }
    flag2+=flag;
   }
   if(flag2==0)
   {
    for(r=j;r<sum1;r++)
    {
     strcpy(word[r],word[r+1]);
    }
    sum1--;
    j=i;
   }
  }
 最后统计单词个数
 r=0;
 flag2=0;
 flag=1;
 int flag3=0;
 while(r<sum1)
 {
  flag3=0;
  for(i=0;i<sum;i++)
  {
   if(strcmp(word[r],word2[i])==0)
   {
    flag3++;
   }
  }
  time[r]+=flag3;
  r++;
 } 

所有代码如下:

#include<stdio.h>
#include<string.h>
int main()
{
 char m[10][30]={'\0'};
 char word[100][30]={'\0'};
 int mark[300];        //能够存储10行300字母100个单词
 char word2[100][30]={'\0'};//没有相同的单词
 int i,j,l=0;
 int p,q,r,s,t;
 int flag=1;
 int flag2=0;
 int time[100];
 for(i=0;i<100;i++)
 {
  time[i]=0;
 }
 int sum=0;
 int
4000
sum1=0;
    for(i=0;i<10;i++)
    {
     gets(m[i]);
     flag++;
     if(strcmp(&m[i][0],"\0")==0)
  {
   break;
  }
 }
 //------------------------------------------------------------------------------------//
 for(i=0;i<10;i++)
 {
  for(j=0;j<30;j++)
  {
   if(m[i][j]>=97&&m[i][j]<=122)          //小写转换成大写
   {
    m[i][j]=m[i][j]-('a'-'A');
   }
   if(m[i][j]>=65&&m[i][j]<=90)
   {
    mark[l]=1;
   }
   else
   {
    mark[l]=0;
   }
   l++;
  }
 }
 //-------------------------------------------------------------------------//
 i=0;
 j=0;
 r=0;
 s=0;
 for(p=0;p<300;p++)
 {
  if(mark[p]==1&&mark[p+1]==1)
  {
   word[r][s]=m[i][j];
   s++;
  }
  if(mark[p]==1&&mark[p+1]==0)
  {
   word[r][s]=m[i][j];
   r++;
   s=0;
   sum++;
  }
     j++;
     if(j==30)
     {
      j=0;
      i++;
  }
 }                                      //`将单词提取出来,提取到word数组中  
 //--------------------------------------------------------------//
 for(i=0;i<sum;i++)
 {
  strcpy(word2[i],word[i]);
 }
 sum1=sum;
    for(i=0;i<sum1;i++)
    {
     for(j=i+1;j<sum1;j++)
     {
      flag2=0;
      for(t=0;t<30;t++)
      {
       flag=1;
       if(word[i][t]==word[j][t])
       {
        flag=0;
    }
    flag2+=flag;
   }
   if(flag2==0)
   {
    for(r=j;r<sum1;r++)
    {
     strcpy(word[r],word[r+1]);
    }
    sum1--;
    j=i;
   }
  }
 }                                       //删除重复
 //------------------------------------------------------------------------//
 r=0;
 flag2=0;
 flag=1;
 int flag3=0;
 while(r<sum1)
 {
  flag3=0;
  for(i=0;i<sum;i++)
  {
   if(strcmp(word[r],word2[i])==0)
   {
    flag3++;
   }
  }
  time[r]+=flag3;
  r++;
 }                           //统计每个单词出现的次数
 //-------------------------------------------------//
 printf("\n总数:");
 printf("%d\n",sum);
 for(i=0;i<sum1;i++)
 {
  puts(word2[i]);
  printf("-----次数:");
  printf("%d",time[i]);
  printf("\n");
 }
}
在devcpp环境中运行无误      还可以对单词按照字母顺序进行排序  也可以对文章的容量进行修改,推荐使用函数来实现它 我懒0.0就这样

                       


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: