早教吧 育儿知识 作业答案 考试题库 百科 知识分享

c语言:文件操作与字符处理1109文件操作与字符处理1.题目及题目分析1.1问题描述在当前目录中存在文件名为"case1.in"(其中case后为数字1,不是字母l,写错提交后会判错)的文本文

题目详情
c语言:文件操作与字符处理
1109 文件操作与字符处理
1. 题目及题目分析
1.1 问题描述
在当前目录中存在文件名为"case1.in"(其中case后为数字1,不是字母l,写错提交后会判错)的文本文件,
其内容为一篇英文文章(以EOF作为结束标志)。现要求读取该文本文件内容,统计文章中每个单词出现的次数,
并输出出现次数最多的前5个单词及其出现次数(按出现次数由多到少的顺序输出,次数相同时按字典顺序输出,
不足5个单词时,按序输出全部单词)。程序中注意如下细节:
(1) 空格、标点符号与回车符起到分隔单词的作用。
(2)文章一行的末尾可能有连字符,出现连字符时,该行最末的字符串与下行最先出现的字符串构一个单词;
(3) 名词缩写算一个单词;
(4) 数字不算单词;
(5) 单词不区分大小写;
(6) 输出时单词全使用小写;
输入格式
文件case1.in中一篇英文文章,包含多段文字,单词数不超过10000,每个单词不超过20个字符
输出格式
按题意输出答案
输入样例
(如case1.in内容如下)
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
我希望有详细的注释!!!!在线等~
▼优质解答
答案和解析
//#include "stdafx.h"//vc++6.0加上这一行.
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
struct word{//建立一个结构体记录单词及数量
    char w[21];
    int n;
};
int main(void){
    struct word a[10000]={"",0,},tmp;//声明一个10000个元素的结构体数组作记录空间
    FILE *fp;
    int x,i,j,k=1;
    char wt[21],wh[21];
    if((fp=fopen("case1.in","r"))==NULL){//打开文件
        printf("Open the file failure...\n");
        exit(0);
    }
    while(fscanf(fp,"%s",wt),!feof(fp)){ //读一个单词
        if(wt[x=strlen(wt)-1]=='-'){//这个“单词”末尾是'-'的话接着读后面的“单词”
            wt[x]='\0';
            fscanf(fp,"%s",wh);
            strcat(wt,wh);//把后面读到的“单词”与前面读到的拼为一个单词
        }
        for(i=0;i<=x;wt[i++]|=0x20);//把单词中的大写变为小写
        if(wt[x]>'z' || wt[x]<'a')//单词末尾有标点符号的话去掉
            wt[x]='\0';
        for(i=0;i            if(strcmp(wt,a[i].w)==0){//有的话免记录,将记录数量增1,跳出
                a[i].n++;
                break;
            }
        }
        if(i==k){//未检索到刚读到的单词则追加记录且将数量置1
            strcpy(a[k].w,wt);
            a[k++].n=1;
        }
    }
    fclose(fp);//读完关闭文件
    for(i=0;i        for(x=i,j=x+1;j            if(a[x].n        if(x!=i){
            tmp=a[x];
            a[x]=a[i];
            a[i]=tmp;
        }
    }
    for(i=0;i        for(x=i,j=x+1;j            if(a[x].n==a[j].n && strcmp(a[x].w,a[j].w)>0) x=j;
        if(x!=i){
            tmp=a[x];
            a[x]=a[i];
            a[i]=tmp;
        }
    }//以上两次排序都用的是选择法
    printf("The result is as following:\n");//输出前5项
    for(i=0;i<5;printf("%-20s %d\n",a[i++].w,a[i].n));
    return 0;
}