C语言实现词频统计——第二版

原需求

1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符。

2.统计英文单词在本文件的出现次数

3.将统计结果排序

4.显示排序结果

新需求:

1.小文件输入. 为表明程序能跑

2.支持命令行输入英文作品的文件名

3. 支持命令行输入存储有英文作品文件的目录名,批量统计

4. 从控制台读入英文单篇作品,重定向输出

代码实现:

在原代码的基础上稍做了修改,使之可以批量读取文件夹下的所有文件,所以加了一个mode来判断是单个文件输入还是文件夹输入,来不及整理程序,所以现在程序有点丑。这次作业交了以后会干两件事,第一是精简程序结构,第二是优化程序性能,可能会重新构思程序的主体部分。

 1     if (mode == 2)
 2     {
 3         printf("输入读入文件夹的名字:");
 4         scanf("%s", &fa);
 5         if ((fHandle = _findfirst("*.txt", &fa)) == -1L)      //文件夹目录
 6         {
 7             printf("当前目录下没有txt文件\n");
 8             return 0;
 9         }
10         else
11             do
12             {
13                 fp = fopen(fa.name, "r");
14                 for (i = 0; i < 500; i++)
15                 {
16                     (w + i)->num = 1;
17                 }
18
19                 /****************单词匹配****************************************/
20                 i = 0;
21                 while (!feof(fp))//文件尚未读取完毕
22                 {
23                     ch = fgetc(fp);
24                     (w + i)->a[j] = ‘\0‘;
25                     if (ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122)                            //ch若为字母则存入
26                     {
27                         (w + i)->a[j] = ch;
28                         j++;
29                         flag = 0;                                                  //设标志位判断是否存在连续标点或者空格
30                     }
31                     else if (!(ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122) && flag == 0)       //ch若不是字母且上一个字符为字母
32                     {
33                         i++;
34                         j = 0;
35                         flag = 1;
36                         for (m = 0; m < i - 1; m++)                                    //匹配单词,若已存在则num+1
37                         {
38                             if (stricmp((w + m)->a, (w + i - 1)->a) == 0)
39                             {
40                                 (w + m)->num++;
41                                 i--;
42                             }
43                         }
44                     }
45                     /****************动态分配内存****************************************/
46                     if (i == (p * 500))                                                      //用i判断当前内存已满
47                     {
48                         p++;
49                         w = (struct fre_word*)realloc(w, 500 * p*(sizeof(struct fre_word)));
50                         for (n = i; n <= 500 * p; n++)                                           //给新分配内存的结构体赋初值
51                             (w + n)->num = 1;
52                     }
53                 }
54                 i = i - 2;
55                 quick(w, 0, i);
56
57                 printf("文件%s词频统计如下\n", fa.name);
58                 printf("不重复的单词数:");
59                 printf("%d\n", i);
60                 for (n = 0; n <10; n++)
61                 {
62                     printf("文档中出现的单词:");
63                     printf("%-18s", (w + n)->a);
64                     printf("其出现次数为:");
65                     printf("%d\n", (w + n)->num);
66                 }
67                 printf("\n");
68
69             } while (_findnext(fHandle, &fa) == 0);
70             _findclose(fHandle);
71             fclose(fp);
72             return 0;
73             free(w);
74
75     }

其余部分和之前第一版几乎没有区别,就不再赘述。

运行结果:

功能1:

功能2:


功能3:

功能4:

coding:https://git.coding.net/gongcr/word-frequency.git

openssh:[email protected]:gongcr/word-frequency.git

git:git://git.coding.net/gongcr/word-frequency.git

得分项:

表一:

表二:

项目:词频统计第二版

项目类型:个人项目

项目日期:2016.9.11-2016.9.13

11号

类别c 内容c 开始时间s 结束e 中断I 净时间T
项目实践 看书  8:00  10:00 20m 100m
项目实践 需求分析 10:00 10:40 10m 30m
项目实践 安装vs        

12号

类别c 内容c 开始时间s 结束e 中断I 净时间T
项目实践 调试vs 8:00 10:00 0m 120m
项目实践 重装系统/vs 12:00 16:00 0m 240m
项目实践 效能分析 19:00 19:40 0m 40m
项目实践 编码 20:00 22:00 20m 100m

13号

类别c 内容c 开始时间s 结束e 中断I 净时间T
项目实践 查资料 8:00 10:30 0m 150m
项目实践 编码 10:30 11:30 10m 50m
项目实践 编码 13:40 15:00 50m 30m
项目实践 计算工作量 15:00 15:20 0m 20m
项目实践 写博客 20:00 21:15 0m 75m
时间: 2024-10-26 13:33:40

C语言实现词频统计——第二版的相关文章

java词频统计——web版支持

需求概要: 1.把程序迁移到web平台,通过用户上传TXT的方式接收文件. 2.用户直接输入要统计的文本,服务器返回结果 3.在页面上给出链接 (如果有封皮.作者.字数.页数等信息更佳)或表格,展示经典英文小说词频统计结果: 4.支持用户自定义单词分隔符: 5.词汇范围对比(额外项). 分析和设计: 1.创建web工程,利用servlet上传文件的技术实现用户向服务器上传文件.页面设置表单类型为enctype="multipart/form-data",创建文件上传文本框<inp

c语言实现词频统计

需求: 1.设计一个词频统计软件,统计给定英文文章的单词频率. 2.文章中包含的标点不计入统计. 3.将统计结果以从大到小的排序方式输出. 设计: 1.因为是跨专业0.0···并不会c++和java,只能用仅学过的C语言进行编写,还是挺费劲的. 2.定义一个包含单词和频率两个成员的结构体来统计词频(进行了动态分配内存,可以处理较大文本). 3.使用fopen函数读取指定的文档. 4.使用fgetc函数获取字符,再根据取得的字符是否是字母进行不同的处理. 5.采用快速排序法对统计结果进行排序. 5

C语言程序设计案例教程(第二版)答案

本人计划考研:报考学校北京工业大学--计算机 专业课编号985:教材为C语言程序设计案例教程和严蔚敏的数据结构那本 现在开始复习C语言,计划先将课后部分写代码的题目写一遍 不定期跟新最迟一周搞定 //========================第二章 C语言的基本控制结构======================== //==========4.从键盘输入一个年份,判断该年是否为闰年 //==========5.从键盘输入一个年份和月份,输出这个月份的天数 //==========都比较简

武汉科技大学ACM :1009: 华科版C语言程序设计教程(第二版)例题4.18

Problem Description 验证哥德巴赫猜想:任何充分大(>=4)的偶数都可以用两个素数之和表示. Input 输入一个偶数n.(2<n<=10000) Output 找到a.b使得 n=a+b 其中a.b为两个素数,且a<=b. Sample Input 4 100 Sample Output 2 2 3 97 1 #include <iostream> 2 3 #include<math.h> 4 5 using namespace std;

武汉科技大学ACM :1007: 华科版C语言程序设计教程(第二版)例题4.13

Problem Description 输入两个整数,求他们的最大公约数和最小公倍数. Input 两个整数. Output 最大公约数和最小公倍数. Sample Input 12 9 Sample Output 3 36 HINT 可以把求最小公约数和最小公倍数写成函数,方便以后调用. 1 #include <stdio.h> 2 3 void main() 4 5 { 6 7 int m,n; 8 9 while(scanf("%d%d",&m,&n)

武汉科技大学ACM :1010: 华科版C语言程序设计教程(第二版)例题7.8

Problem Description 输入一个用年月日表示的日期,求该日期是该年的第几天.输入某年的第几天,输出这一天是该年的几月几号,茂茂解不出,需要你的帮助. Input 开始有个整数k,表示询问的种类,如果k=1,后面有三个合法的整数a,b,c,表示输入的年月日,此时输出该日期是该年的第几天:如果k=2,后面有两个合法的整数a,b,求a年的第b天的日期.保证所有的输入合法. Output 对于询问1,输出一个整数表示是该年的第几天. 对于询问2,输出年月月,格式为****/**/** 如

武汉科技大学ACM:1009: 华科版C语言程序设计教程(第二版)习题5.12

Problem Description 这天老师照例给小豪出了一道题目:老师给小豪一个字符串,让小豪将该字符串逆序输出. Input 第一行包括一个T,表示有多少组测试数据: 接下来T行,每行包括一个字符串(长度不超过65535). Output 对于每个测试数据输出它的逆序字符串. Sample Input 1 oaHoaiX evoL I Sample Output I Love XiaoHao 1 #include<stdio.h> 2 #include <string.h>

武汉科技大学ACM :1001: 华科版C语言程序设计教程(第二版)课后习题3.12

Problem Description 输入n,输出对应的边长为n的空心正六边形. 为方便看图,样例中点 '.' 表示空格,打印图形时请打印空格而非小圆点. Input 边长n.(n<=20) Output 边长为n的正六边形 Sample Input 5 Sample Output .....***** ....*.....* ...*.......* ..*.........* .*...........* ..*.........* ...*.......* ....*.....* ...

武汉科技大学ACM :1008: 华科版C语言程序设计教程(第二版)习题6.14

Problem Description 输入一个八进制的字符串,将它转换成等价的十进制字符串,用pringf的%s格式输出. Input 首先输入一个正整数t,表示有t组测试数据(1<= t <= 10010). 接下来t行,每行一个字符串,表示一个八进制整数(这个整数不超过20位). Output 对于每个测试数据,输出相应的十进制字符串.每个字符串一行. Sample Input 1 1732 Sample Output 986 HINT 注意:给的八进制数可能很大,用long long