这个作业属于哪个课程 | 软件工程-计算机四班 |
---|---|
这个作业要求在哪里 | 编程作业 |
这个作业的目标 | 完成项目的需求 |
学号 | 20188507 |
项目连接
2编程要求
1:统计文件的字符数(对应输出第一行):
只需要统计Ascii码,汉字不需考虑
空格,水平制表符,换行符,均算字符
2:统计文件的单词总数(对应输出第二行),单词:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写。
英文字母: A-Z,a-z
字母数字符号:A-Z, a-z,0-9
分割符:空格,非字母数字符号
例:file123是一个单词, 123file不是一个单词。file,File和FILE是同一个单词
3:统计文件的有效行数(对应输出第三行):任何包含非空白字符的行,都需要统计。
4:统计文件中各单词的出现次数(对应输出接下来10行),最终只输出频率最高的10个。
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
• Estimate | • 估计这个任务需要多少时间 | 240 | 360 |
Development | 开发 | ||
• Analysis | • 需求分析 (包括学习新技术) | 120 | 120 |
• Design Spec | • 生成设计文档 | 10 | 10 |
• Design Review | • 设计复审 | 10 | 10 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
• Design | • 具体设计 | 20 | 20 |
• Coding | • 具体编码 | 180 | 240 |
• Code Review | • 代码复审 | 20 | 20 |
• Test | • 测试(自我测试,修改代码,提交修改) | 20 | 20 |
Reporting | 报告 | 60 | 60 |
• Test Repor | • 测试报告 | 10 | 10 |
• Size Measurement | • 计算工作量 | 10 | 10 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 10 | 10 |
合计 | 750 | 930 |
解题思路
(1):读取文件,利用fopen进行打开文件,“r”进行读取
(2):利用fgets从指定的流中读取数据,用if进行判断是否为空格或者换行符,如果不为空格,则单词数加一,如果不为空格或者换行符,则字符数加一。
循环下去知道所有的单词都满足要求,然后输出个数
(3):利用fscanf将输入字符串存储到结构体中,运用冒泡排序法对出现次数进行降序排序,再输出前十个出现次数最多
代码规范
计算模块接口的设计与实现过程
定义结构体
struct
{
char str[99]; //单词
int n; //出现次数
}
定义一个指针
int *getCharNum(char *filename,int *totalNum);
进行文件读取判断
if( (fp=fopen(name, "rb"))== NULL ){
perror(name);
return NULL;
}
文件行内容的读取与单词分割:
while(fgets(buffer, 10000, fp)!= NULL){
bufferLen = strlen(buffer);
for( i=0; i<bufferLen; i++){
c = buffer[i];
if( c==' ' || c=='\t'){
//遇到空格
!isLastBlank && wordNum++; //如果上个字符不是空格,那么单词数加1
isLastBlank = 1;
}else if(c!='\n'&&c!='\r'){
//忽略换行符
charNum++; //如果既不是换行符也不是空格,字符数加1
isLastBlank = 0;
}
}
!isLastBlank && wordNum++;//如果最后一个字符不是空格,那么单词数加1
isLastBlank = 1; //每次换行重置为1
totalNum[0]++;//总行数
totalNum[1] += charNum;//总字符数
totalNum[2] += wordNum;//总单词数
printf("%-7d%-7d%d\n" , totalNum[0], wordNum, charNum);
//置零,重新统计下一行
charNum = 0;
wordNum = 0;
}
fscanf输入字符串储存到结构体中
unsigned x,j,times=0;
for(x=0;x<99;x++)
{
fscanf(fp,"%s",a[x].str);//
a[x].n++; //计算出现次数
for(j=0;j<x;j++)
if(strcmp(a[x].str,a[j].str)==0) //如果和前面的相同
{
if(a[j].n!=0)a[j].n++; //不为0的加一
a[x].n=0; //置为0
}
times++; //计算字符串个数
if(fgetc(fp)==EOF)break;
}
for(x=0;x<times-1;x++) //冒泡法排序
for(j=0;j<times-1-x;j++)
if(a[j].n<a[j+1].n) //对出现次数进行降序排序
{ //交换结构体
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
for(x=0;x<10;x++) {//输出前十个出现次数最多
printf("%s %d\n",a[x].str,a[x].n);
}
单元测试和性能分析
异常处理
文件读取失败。
心路历程与收获:
通过这次编程,我巩固到了以前学习的一些即将遗忘的知识,也让我学习到了如何使用git和一些新知识,虽然这次编程查阅了大量资料,但是经过这次编程,我也学习到了许多新知识,为下一次编程做好准备,希望经过这次编程,能让我以后在编程上越做越好。