不得不说对于菜鸟级的我,这是一次心酸的经历啊。。。自打接到王老师布置的这个任务(个人项目)之后,我心里一直在想着自己要用哪种语言来完成我的任务。以前多多少少写过一些程序的,这又想起了数据库小学期与永哥和小强哥一起奋斗的日子来了,和大牛一起合作就是长见识,哈哈!

好吧,介绍一下题目,对一个英文文本进行词频统计,并把出现频率最高的10个词打印出来。

     发愁是肯定的,努力也是肯定的,既然对一个英文文本进行词频统计,那么肯定会用到文件的读写函数,所以先找到了c语言课本,对这一部分的知识做了一下系统地复习。并且对该部分的知识做了一个小小的总结,虽然不是很全面吧,但是是自己对知识的深入理解。当然这对我们班的神人来说就是小case了,所以还是很惭愧滴!

对文件的读写操作搞懂了之后呢,就要设计自己的思路了。首先,定义一个结构体,(想必,我的同学们也有好多用结构体的...)

1 struct wordcount//定义一个结构体Wordcount
2 {
3     char *word;
4     int count;
5     struct wordcount *next;
6 };

然后定义了一些指向结构体变量的指针,和缓冲区用来存放从文本文件中获取的内容。然后运用isalpha()来判断读到缓冲区的内容是否为字母。

/* 函数:isalpha

  原型:int isalpha(int ch)

  用法:头文件加入#include <cctype>(旧版本的编译器使用<ctype.h>)

  功能:判断字符ch是否为英文字母,当ch为英文字母a-z或A-Z时,在标准c中相当于使用“isupper(ch)||islower(ch)”做测试,返回非零值,否则返回零。*/

之后就是判断缓冲区中的单词有没有超过规定的最大限度,以及把大写字母转换为小写字母等等。部分代码如下

用strcpy()函数来判断是否和buff内的单词相同,若相同,则count+1

 1 while (wc)//如果有的话则计数加1
 2 {
 3        if (strcmp(wc->word,buff)==0)
 4       {
 5               wc->count=wc->count+1;
 6               isfinded=1;
 7               break;
 8       }
 9        else
10              wc=wc->next;
11 }

对出现次数最高的10个词进行排序则可能弱了一些,我选用的是交换排序,所以效率会慢了一些。自然所用的时间就会长好多了(和那些大牛级的任务了)。下面是全部的代码:

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>#define MAXLEN 30struct wordcount//定义一个结构体Wordcount
{char *word;int count;struct wordcount *next;
};struct wordcount *head,*wc,*sort,*headsort;
char buff[MAXLEN];
char *zs_c;//buf[]数组用来存放英文字母
int buff_count=0, isfinded;int main()
{FILE *fp;char ch;int i;int k;char filename[20];printf("请输入文件名:\n");scanf("%s",filename);if ((fp=fopen(filename,"r"))==NULL) {printf("不能打开该文件!\n");exit(0);}while ((ch=fgetc(fp))!=EOF)//读取英文文本中的内容if (isalpha(ch)){buff[buff_count++]=tolower(ch);//判断是否为字母若果是则把它放到数组Buff[]if (buff_count>=MAXLEN){printf("单词长度超过最大限度!\n");//判断单词的长度是否超过最长限度
                fclose(fp);return -1;}}else{//若果不是字母,且buff[]中没有单词的话则把其放到Wordcount link中if (buff_count!=0){buff[buff_count]='\0';wc=head;isfinded=0;while (wc)//如果有的话则计数加1
                {if (strcmp(wc->word,buff)==0){wc->count=wc->count+1;isfinded=1;break;}elsewc=wc->next;}if (isfinded==0) {zs_c=(char *)malloc(buff_count);if (zs_c==0){printf("错误!: zs_c !\n");fclose(fp);exit(0);}memcpy(buff,zs_c,buff_count);wc=(struct wordcount *)malloc(sizeof(struct wordcount));if (wc==0){printf("分配有误!\n");fclose(fp);exit(0);}wc->word=zs_c;wc->count=1;wc->next=head;head=wc;}buff_count=0;}}fclose(fp);if (head)//对单词进行排序
    {sort=head->next;head->next=0;while (sort){wc=sort;sort=sort->next;if ((wc->count) > (head->count)){wc->next=head->next;head=wc;}else{headsort=head;while ((headsort->next) && (headsort->next->count > wc->count ))//交换进行排序
                {headsort->count=headsort->next->count;wc->next->count=headsort->next->count;wc->next->count=headsort->count;headsort->word=headsort->next->word;wc->next->word=headsort->next->word;wc->next->word=headsort->word;}}}}while (head)//对结果进行输出
    {wc=head;head=head->next;printf("序号\t单词\t频率\n");for(i=1;i<11;i++)printf("NO%d\t%s\t %d\n",i,wc->word,wc->count);}return 0;
}

运行结果:

个人工作总结:
      实话说来对于好久没有碰过程序的我来说不得不说这是很困难的。

2.22就开始构思如何实现这个问题,开始进行咨询,并开始复习文件的读取。

2.27上机时间(2:00--4:00)开始写程序,事实表明情况是不乐观的,此时多么希望神可以拯救我啊!(抓狂)。后来了解到,用trie树,map实现起来效率比较高,所以对这两种方法进行了查询,但是能力有限,所以还是沿用了最先的想法,周五自打吃完晚饭,就开始继续调试程序,就因为文件无法读取这个问题困扰了一晚上,最终和娇哥交流后,(因为她也遇到了相同的问题,难姐难妹啊),才知道是文件默认的格式就是.txt,是自动隐藏的,还以为是自己安装的vc有问题呢或者和电脑本身有关系,看来写程序这个东西是要和同仁交流的!!!。

周六晚8:00又出现了一个大大的问题那就是死循环,所以那更是一个痛苦,程序的调试是必须的了,终于,发现了!原来是在进行数据交换的时候丢了一个指针。本来想使用argv传递参数的,argv[0]是执行的该文件,argv[1]是传递的第二个参数,即在屏幕上输入的第一个内容,本来是想用这种方法来获取文件的名称的,但是失败了,所以又改用了原来c语言传统的文件读取方式。

不得不承认我的这个工程效率是不高的,比如说排序用到的算法啊,(有时间一定要再研究一下)如果文本的大小再大些的话,速度是相当的慢了就。自己的能力还不是很高,自己都觉得着急了,因为对trie树也进行了一定的学习,我想自己接下来能否可以用这种数据结构来实现,最让我崇拜的就是辉哥的hashtable了,自己一定要对这些知识进行学习。多学习,多联系,这是我对写程序的深刻体会!

转载于:https://www.cnblogs.com/zsjy/p/3576384.html

软件工程之个人项目--词频统计相关推荐

  1. 结对项目 - 词频统计

    目的与要求 代码复审练习 结对练习 编写单元测试 基于作业3的结果,读取一个较小的文本文件A_Tale_of_Two_Cities.txt,统计该文件中的单词的频率,并将统计结果输出到当前目录下的 R ...

  2. 【现代软件工程】第一次作业——词频统计

    目录 1.1基本功能 1.2设计实现 1.3代码结构 1.4测试运行 1.5性能分析 1.6项目总结 1.7 PSP展示   1.1 基本功能 1. 统计文件的字符数(只需要统计Ascii码,汉字不用 ...

  3. #软工实践-个人项目-词频统计

    Github项目地址 https://github.com/pandaeathzr/personal-project PSP表格: PSP2.1 Personal Software Process S ...

  4. 201671030128+词频统计软件项目报告

    一.需求分析 根据实验二 软件工程个人项目的要求本次软件项目的需求有以下几点: 1.程序可读入任意英文文本文件,该文件中英文词数大于等于1个,程序需要很壮健,能读取容纳英文原版<哈利波特> ...

  5. 201671030125+词频统计软件项目报告

    项目 内容 这个作业属于哪个课程? 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里? 实验二 软件工程个人项目 我在这个课程的目标是? 按时完成老师给的任务,复习JAVA ...

  6. 201671030130+词频统计软件项目报告

    (一)需求分析 根据实验二 软件工程个人项目的要求该软件项目的基本功能要求如下: 1.程序可读入任意英文文本文件,该文件中英文词数大于等于1个. 2.程序需要很壮健,能读取容纳英文原版<哈利波特 ...

  7. 实验二 词频统计软件项目报告

    实验要求 实验二 软件工程个人项目 GitHib链接 https://github.com/Z-zt/Count 一.需求分析 通过分析实验二题目要求,得出的用户需求主要为: 程序可读入任意英文文本文 ...

  8. 201671010411+巩定定+词频统计软件项目报告

    课程名 软件工程 实验二 词频统计软件项目报告 词频(TF) 是一个词语出现的次数除以该文件的总词语数. 实验目的 (1)掌握软件项目个人开发流程. (2)掌握Github上发布软件项目的操作方法. ...

  9. 201671010417 金振兴 词频统计软件项目报告

    1.需求分析 按照<构建之法>第2章中2.3所述PSP流程,使用JAVA编程语言,独立完成一个英文文本词频统计的软件开发. .程序可读入任意英文文本文件,该文件中英文词数大于等于1个. . ...

最新文章

  1. 【LeetCode】0046.全排列 (递归详解)
  2. mysql 创建定时器
  3. golang中的defer
  4. session 中对象实例在不同事务中的状态
  5. php zip怎么安装,php如何安装zip模块?(方法介绍)
  6. 【HDU - 1546】 Idiomatic Phrases Game(Dijkstra,可选map处理字符串)
  7. 你会感觉容器使用起来很痛苦吗?
  8. 一个牛逼的项目开发过程是怎样的?
  9. 传统socket的编程实现
  10. java使用javax.mail包发送电子邮件:设置账号、密码、主题、文本、附件
  11. UIButton设置圆角和边框
  12. Android设备间通信(wifi连接)
  13. 关于软件快捷方式显示异常,任务栏小图标模糊的解决方案
  14. Spring 学习笔记(day02)
  15. 金融数据智能峰会 | 数据规模爆炸性增长,企业如何进行精准决策?云原生数据仓库数据化运营实战分享
  16. 精尽Spring Boot源码分析 - 内嵌Tomcat容器的实现
  17. mysql中TINYINT的取值范围
  18. 潜在语义索引(LSI)
  19. java祖玛_Canvas小练习_祖玛游戏01
  20. Google PR劫持(转)

热门文章

  1. jspwiki mysql_Wiki.js初体验
  2. 办公技巧:分享12个实用的word小技巧,欢迎收藏!
  3. 计算机基础:多媒体基础知识笔记
  4. 远程办公的一天:魔幻24小时
  5. JS 开发常用工具函数
  6. Linux文件压缩命令笔记
  7. html定义字体纵向对齐,HTML5 Canvas的文本如何实现垂直对齐
  8. mysql读书笔记---if语句
  9. Java正则表达式较验手机号、邮箱
  10. nda协议_如何将NDA项目添加到您的投资组合