最好的我们! 2024-03-25 13:04 采纳率: 50%
浏览 4

文本文件操作综合性实验

在当前目录中存在文件名为"case1.in"(其中case后为数字1,不是字母l,写错提交后会判错)的文本文件,
其内容为一篇英文文章(以EOF作为结束标志)。现要求读取该文本文件内容,统计文章中每个单词出现的次数,
并输出出现次数最多的前5个单词及其出现次数(按出现次数由多到少的顺序输出,次数相同时按字典顺序输出,
不足5个单词时,按序输出全部单词)。程序中注意如下细节:
(1) 空格、标点符号与回车符起到分隔单词的作用。
(2) 文章一行的末尾可能有连字符,出现连字符时,该行最末的字符串与下行最先出现的字符串构一个单词;
(3) 名词缩写算一个单词;
(4) 数字不算单词;
(5) 单词不区分大小写;
(6) 输出时单词全使用小写;


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

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

main()
{
    FILE*fp=fopen("case1.in","r");   //以下操作是把文件中的所有单词存进结构体数组里
    if(fp==NULL)
    {
        perror("fopen");
        return 0;
    }
    char ch,w[21];     //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;      //单词还没有结束
            if(flag==1)   //一个单词结束了
            {
                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;
            }
        }
    }
    //输出出现次数最多的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)
            {
                char tmp[21];
                strcpy(tmp,word[j].c);
                strcpy(word[j].c,word[j+1].c);
                strcpy(word[j+1].c,tmp);
            }
            else if(word[j+1].num==word[j].num)  //假如出现次数相同,按字典顺序输出,即小的先输出
            {
                if(strcmp(word[j+1].c,word[j].c)<0)
                {
                    char tmp[21];
                    strcpy(tmp,word[j].c);
                    strcpy(word[j].c,word[j+1].c);
                    strcpy(word[j+1].c,tmp);
                }
            }
        }
    }
    for(i=0;i<5;i++)
    {
        printf("%s %d\n",word[i].c,word[i].num);
    }
    fclose(fp);
    return 0;
}


```
I am a student. My school is SCAU. It is a beau-
tiful university. I like it.
正确输出应该如下:
a 2
i 2
is 2
it 2
am 1
为什么我的错误输出是:
i 2
a 1
am 2
1
student 3
怎么修改程序才能正确,我的错因在哪里?

  • 写回答

2条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-03-25 13:04
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    为了能够帮助你找出错误,需要你提供你的代码以及实际输出结果。只给出正确输出结果是无法找出错误的。
    评论

报告相同问题?

问题事件

  • 创建了问题 3月25日