早教吧作业答案频道 -->其他-->
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
我希望有详细的注释!!!!在线等~
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;
}
#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
a[i].n++;
break;
}
}
if(i==k){//未检索到刚读到的单词则追加记录且将数量置1
strcpy(a[k].w,wt);
a[k++].n=1;
}
}
fclose(fp);//读完关闭文件
for(i=0;i
tmp=a[x];
a[x]=a[i];
a[i]=tmp;
}
}
for(i=0;i
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;
}
看了c语言:文件操作与字符处理11...的网友还看了以下:
数学曲线与方程已知2a+2b+c=0.求直线ax+by+c=0与曲线y^2=2x交点连线的中点的轨迹 2020-03-30 …
为什么ax+by+c+A(mx+ny+p)表示过直线ax+by+c=0与mx+ny+p=0交点的所 2020-04-27 …
1.已知直线Ax+By+C=0与两轴都相交,则().(A)AB0(B)A0或B0(C)C0(D)B 2020-05-14 …
一道高中数学圆的题目若c≠0,则直线ax + by + c = 0与圆 x^2 + y^2 + a 2020-05-16 …
设椭圆x2/m+1+y2=1的两个焦点是F1(-c,0)与F2(c,0),(c>0),设E是直线Y 2020-06-16 …
根据表格中代数式ax2+bx+c=0与x的对应值,判断方程ax2+bx+c=0(其中a,b,c是常 2020-07-18 …
常数C≠0,则圆x2+y2+2x+2y+C=0与直线2x+2y+C=0的位置关系A相交B相离C相切 2020-07-26 …
已知圆C:(x-b)2+(y-c)2=a2(a>0)与x轴相交,与y轴相离,圆心C(b,c)在第一 2020-07-26 …
用正余弦定理解下面的题,中等生能看懂的,在三角形ABC中,a,b,c分别为A,B,C的对边,则直线 2020-08-02 …
过直线Ax+By+C=0与圆x^2+y^2+Dx+Ey+F=0的交点的圆系方程为x^2+y^2+Dx 2020-11-01 …