m0_56540752 2021-07-02 14:06 采纳率: 50%
浏览 251
已采纳

用c语言统计英语文章单词的数目

将一篇英文文章存入数据文件IN.DAT ( 每行的长度均小于80个字符,单词之间用空格或圆点隔开)。设计程序,统计各单词出现的次数(不区分大小写)。并按照出现次数由多到少的顺序显示统计结果,并将结果输出到文件0UT.DAT中。

(1)使用子函数实现各项具体功能;

(2)程序中需要添加适当的注释。

  • 写回答

3条回答 默认 最新

  • CSDN专家-link 2021-07-02 15:17
    关注
    char words[1000][20]; //最多1000个单词,单词长度不超过20个字母
    int n; //当前单词数量
    int a[1000];//各单词对应出现的次数
    
    void upper2lower(char *word)
    {
      for(int i=0;word[i] != 0;i++)
        if(word[i] >= 'A' && word[i] <= 'Z')
          word[i] += 'a' - 'A';
    }
    
    int findword(char *word)
    {
      for(int i=0;i<n;i++)
        if(strcmp(words[i],word)==0)
          return i;
      return -1;
    }
    
    void parseline(char *line)
    {
       char *p = line;
       char word[20] = {0};
       int w = 0;
       while(*p != 0)
      {
        if(*p == ' ' || *p == '.')
        {
          if(w > 0)
          {
            int pos = findword(word);
            if(pos >= 0)
              a[pos]++;
            else
              strcpy(words[n++],word);
            memset(word,0,20);
            w = 0;
          }
        }
        else
        {
          word[w++] = *p;
        }
      }
       p++; 
    }
    
    void readin()
    {
      FILE *fp = fopen("IN.DAT","r");
      if(fp == NULL)
      {
        printf("file open error\n");
        return;
      }
      char buf[100] = {0};
      while(fgets(buf,100,fp))
      {
        parseline(buf);
      }
      fclose();
    }
    
    void saveout()
    {
      FILE *fp = fopen("OUT.DAT","w");
      if(fp == NULL)
      {
        printf("file open error\n");
        return;
      }
      for(int i=0;i<n;i++)
      {
        fprintf(fp,"%s %d\n",words[i],a[i]);
      }
      fclose();
    }
    
    void sort()
    {
      int i,j,k;
      char word[20] = {0};
      for(i=0;i<n-1;i++)
        for(j=0;j<n-i-1;j++)
        {
          if(a[j] < a[j+1])
          {
            k = a[j];
            a[j] = a[j+1];
            a[j+1] = k;
            strcpy(word,words[j]);
            strcpy(words[j],words[j+1]);
            strcpy(words[j+1],word);
          }
        }
    }
    
    void showwords()
    {
        for(int i=0;i<n;i++)
        {
          printf("%s %d\n",words[i],a[i]);
        }
    }
    
    int main()
    {
      readline();
      sort();
      showwords();
      saveout();
      return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 我下载图形界面重启完就变成这样了,打字也打不了,动也动不了,该怎么解决(操作系统-centos)
  • ¥15 VBA中在窗体中遍历所有checkbox控件,提取出被选中的checkbox的caption值
  • ¥15 在Ubuntu上有什么命令,或者是系统文件能告诉我链接nvme ssd的pcie槽位是不是支持热插拔功能?
  • ¥15 ansys license许可证问题
  • ¥20 QQ号和密码都能正常登录微信 QQ号和密码登录微信显示密码错误
  • ¥15 qiankun主应用注册子应用提示跨域
  • ¥15 单片机RTOS Kernel与应用分离开发,Kernel如何调起应用?
  • ¥15 快手小店商家版APP怎么第三方APP跳转到指定用户聊天界面
  • ¥15 为什么AVL fire软件仿真时的步长改变了,仿真结果也会改变
  • ¥100 如何帮我写一个java小游戏