这个作业属于哪个课程 软件工程-计算机四班
这个作业要求在哪里 编程作业
这个作业的目标 完成项目的需求
学号 20188507

项目连接

C-project

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将输入字符串存储到结构体中,运用冒泡排序法对出现次数进行降序排序,再输出前十个出现次数最多

代码规范

C-project

计算模块接口的设计与实现过程

定义结构体

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和一些新知识,虽然这次编程查阅了大量资料,但是经过这次编程,我也学习到了许多新知识,为下一次编程做好准备,希望经过这次编程,能让我以后在编程上越做越好。