1109 综合实验:文件操作与字符处理
时间限制:4000MS 代码长度限制:10KB
提交次数:6265 通过次数:1646
题型: 填空题 语言: GCC
Description
在当前目录中存在文件名为"case1.in"(其中case后为数字1,不是字母l,写错提交后会判错)的文本文件,
其内容为一篇英文文章(以EOF作为结束标志)。现要求读取该文本文件内容,统计文章中每个单词出现的次数,
并输出出现次数最多的前5个单词及其出现次数(按出现次数由多到少的顺序输出,次数相同时按字典顺序输出,
不足5个单词时,按序输出全部单词)。程序中注意如下细节:
(1) 空格、标点符号与回车符起到分隔单词的作用。
(2) 文章一行的末尾可能有连字符,出现连字符时,该行最末的字符串与下行最先出现的字符串构一个单词;
(3) 名词缩写算一个单词;
(4) 数字不算单词;
(5) 单词不区分大小写;
(6) 输出时单词全使用小写;
#include “stdio.h”
#include “math.h”
#include “string.h”
#include “stdlib.h”
main()
{
_______________________
}
输入格式
文件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
算法描述 *
首先定义字符结构体数组,然后文本读写操作打开目录内的文本,依次读取文本的内容,定义一个字符数组来存储,最后在文尾输入\0 。
然后对该字符数组进行依次字符操作,如果读到的字符为大写,先转化为小写,
当读到-时判断下一位是否为换行符号,如果为换行符号则继续读入下下位的字符,如果不为换行符号则将前面读入的字符作为一个单词,
当读到其他符号时,先判断第一位是否为/0,如果为\0说明读入符号为空格,不为\0说明前面字符已存储有英文内容,所以直接结束该字符数组的存储,进行下一个字符数组的存储操作。
储存完后,需要进行排序,这时需要写一个cmp函数来定义比较规则,规则依照题目需要来填写,如果出现次数相同则比较字典序,如果出现次数不同则比较出现次数。
最后利用qsort对存储的单词数组进行排序。依次输出单词数组的内容,当输出次数大于五的时候停止,小于五时全部输出。
排序比较也可以写冒泡来排序
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
typedef struct words {
int count = 0;
char word[20];
}words;
int cmp(const void* p1, const void* p2)
{
words* word1 = (words*)p1;
words* word2 = (words*)p2;
if (word1->count == word2->count)
{
if (strcmp(word1->word, word2->word) < 0)
return -1;
else
return 1;
}
else
return word1->count < word2->count? 1 : -1;
}
int main(void) {
words word[10005];
FILE* fp;
fp = fopen("case1.in", "r+");
char ch;
int i = 0, j = 0, num = 0,t;
char tmp[20];
char w[100005];
int d = 0;
while ((ch = fgetc(fp)) != EOF) {
w[d++] = ch;
}
w[d] = '\0';
fclose(fp);
d = 0;
ch = w[d++];
while (ch != '\0') {
if (ch >= 'A' && ch <= 'Z')ch += 'a' - 'A';
if (ch >= 'a' && ch <= 'z') {
tmp[j++] = ch;
}
else if (ch == '-' && w[d] == '\n') {
d++;
}
else {
tmp[j] = '\0';
t = j;
j = 0;
if (tmp[0] != '\0') {
for (i = 0; i < num; i++) {
if (strcmp(word[i].word, tmp) == 0) {
word[i].count++;
break;
}
}
if (i == num) {
strcpy(word[i].word, tmp);
word[i].count++;
num++;
}
}
}
ch = w[d++];
}
qsort(word,num,sizeof(words),cmp);
int k = 0;
for (int j = 0; j < num; j++) {
printf("%s %d\n", word[j].word, word[j].count);
k++;
if (k == 5)break;
}
return 0;
}