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

用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条)

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?