最好的我们! 2024-03-25 20:59 采纳率: 50%
浏览 6

文本文件操作的综合性实验

在当前目录中存在文件名为"case1.in"(其中case后为数字1,不是字母l,写错提交后会判错)的文本文件,
其内容为一篇英文文章(以EOF作为结束标志)。现要求读取该文本文件内容,统计文章中每个单词出现的次数,
并输出出现次数最多的前5个单词及其出现次数(按出现次数由多到少的顺序输出,次数相同时按字典顺序输出,
不足5个单词时,按序输出全部单词)。程序中注意如下细节:
(1) 空格、标点符号与回车符起到分隔单词的作用。
(2) 文章一行的末尾可能有连字符,出现连字符时,该行最末的字符串与下行最先出现的字符串构一个单词;
(3) 名词缩写算一个单词;
(4) 数字不算单词;
(5) 单词不区分大小写;
(6) 输出时单词全使用小写;
I am a student. My school is SCAU. It is a beau-
tiful university. I like it.
I am a student. My school is SCAU. It is a i-
s university. I like it.
1 2 3 4 5 6 7 8 9
12 12 12 12
jI I
我的代码统计I的数量为什么是错误的?应该怎么修改


```c
#include "stdio.h"
#include "math.h"
#include "string.h"
#include "stdlib.h"

struct wordstore
{
    char c[20];
    int num;  //重复次数
} word[10000];

main()
{
    FILE*fp=fopen("case1.in","r");   //以下操作是把文件中的所有单词存进结构体数组里
    if(fp==NULL)
    {
        perror("fopen");
        return 0;
    }
    char ch,w[20];     //w用来储存取出的一个单词
    int i=0,flag=0;    //i是表示存入一个单词时的下标
    int k=0;  //从文件中取出单词的数量
    int j=0;  //用于遍历文件取出的单词下标
    while((ch=fgetc(fp))!=EOF)
    {
        if(ch>='A'&&ch<='Z')
            ch=ch+32;
        if(ch>='a'&&ch<='z')
        {
            w[i++]=ch;
            flag=1;       //有单词
        }
        else   //录入的不是单词
        {
           /* if(ch=='-'&&(ch=fgetc(fp))=='\n')
               {
                   flag=0;      //单词还没有结束
                   fseek(fp,-1,SEEK_CUR);
               }
            */
            if(ch=='-')
            {
                char ch1=fgetc(fp);
                if(ch1=='\n')
                {
                  flag=0;
                }
                else
                {
                    fseek(fp,-1,SEEK_CUR);
                }
            }
            if(flag==1&&i!=0)   //一个单词结束了
            {
                w[i]='\0';
                for(j=0; j<k; j++) //取出的所有单词遍历
                {
                    if(strcmp(w,word[j].c)==0)   //有相同的单词
                    {
                        word[j].num++;
                        break;
                    }
                }
                //没有相同的即为新单词,个数置为1,把w储存的单词复制给结构体
                if(j==k)
                {
                    word[k].num=1;
                    strcpy(word[k++].c,w);
                }
                i=0;flag=0;
            }
        }
    }
    //输出出现次数最多的5个单词
    for(i=0; i<k-1; i++) //冒泡排序,使其降序排列
    {
        for(j=0; j<k-1-i; j++)
        {
            if(word[j+1].num-word[j].num>0||(word[j+1].num==word[j].num&&strcmp(word[j+1].c,word[j].c)<0))
            {
                struct wordstore tmp = word[j];
                word[j] = word[j + 1];
                word[j + 1] = tmp;
            }


        }
    }
    for(i=0; i<5; i++)
    {
        printf("%s %d\n",word[i].c,word[i].num);
    }
    fclose(fp);
    return 0;
}


```

  • 写回答

3条回答 默认 最新

  • 码农阿豪@新空间 优质创作者: Java、后端开发技术领域 2024-03-25 21:01
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题描述: 我的代码统计I的数量为什么是错误的?应该怎么修改? 代码解答: 问题代码中将单词都转换为小写字母进行统计,但是题目要求不区分大小写,因此需要在统计时将输入的单词转为小写字母,再进行比较。 修改代码如下:
    struct wordstore{
        char c[20];
        int num;
    } word[10000];
    //大写字母转小写字母
    char tolower(char c){
        if(c >= 'A' && c <= 'Z'){
            return c - 'A' + 'a';
        }
        return c;
    }
    main(){
        FILE*fp=fopen("case1.in","r");
        ...
        char ch,w[20];
        int i=0,flag=0;
        int k=0; //从文件中取出单词的数量
        int j=0; //用于遍历文件取出的单词下标
        while((ch=fgetc(fp))!=EOF)
        {
            ch = tolower(ch);  //转换为小写字母
            ...
        }
        //输出出现次数最多的5个单词
        for(i=0; i<k-1; i++) //冒泡排序,使其降序排列
        {
            for(j=0; j<k-1-i; j++)
            {
                if(word[j+1].num-word[j].num>0 || (word[j+1].num==word[j].num && strcmp(word[j+1].c,word[j].c)<0))
                {
                    struct wordstore tmp = word[j];
                    word[j] = word[j + 1];
                    word[j + 1] = tmp;
                }
            }
        }
        for(i=0; i<5 && i<k; i++) //注意不足5个单词时,按序输出全部单词
        {
            printf("%s %d\n",word[i].c,word[i].num);
        }
        return 0;
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 3月25日