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

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

报告相同问题?

悬赏问题

  • ¥30 Matlab打开默认名称带有/的光谱数据
  • ¥50 easyExcel模板 动态单元格合并列
  • ¥15 res.rows如何取值使用
  • ¥15 在odoo17开发环境中,怎么实现库存管理系统,或独立模块设计与AGV小车对接?开发方面应如何设计和开发?请详细解释MES或WMS在与AGV小车对接时需完成的设计和开发
  • ¥15 CSP算法实现EEG特征提取,哪一步错了?
  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格