wc.exe之C实现

Github项目地址:

 https://github.com/haomeili/project3/tree/master

基本功能

  -c 统计文件字符数(实现)

   -w 统计文件词数(实现)

   -l  统计文件行数(实现)

PSP2.1表格

 

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

15

15

· Estimate

· 估计这个任务需要多少时间

180

210

Development

开发

300

360

· Analysis

· 需求分析 (包括学习新技术)

200

200

· Design Spec

· 生成设计文档

10

10

· Design Review

· 设计复审 (和同事审核设计文档)

0

0

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

5

5

· Design

· 具体设计

60

60

· Coding

· 具体编码

300

360

· Code Review

· 代码复审

10

10

· Test

· 测试(自我测试,修改代码,提交修改)

40

60

Reporting

报告

30

30

· Test Report

· 测试报告

10

10

· Size Measurement

· 计算工作量

10

10

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

10

10

合计

 

1180

1350

解题思路:刚开始拿到题目,基本功能不难实现,建立一个缓冲区,每次从文件中读取一行,放到缓冲区buffer,然后遍历缓冲区,统计当前行的字符和单词数。

(空白字符(空格和tab缩进)不计入字符总数; 单词以空格为分隔;  不考虑一个单词在两行的情况; 限制每行的字符数不能超过100)

 

设计实现过程:基本功能简单,只设计了一个函数来实现三个功能。

 

代码说明:


三个基本功能实现代码:

 1 int *GetCharNum(char *filename, int *TotalNum)
 2 {
 3     FILE *p;//指向文件的指针
 4     char buffer[103];//缓冲区,存储读取到的每行的内容
 5     int len;//缓冲区中实际存储的内容的长度
 6     int i;//当前读到缓冲区的第i个字符
 7     char c;//读取到的字符
 8     int blank = 0;//上个字符是否是空格
 9     int charNum = 0;//当前行的字符数
10     int wordNum = 0;//当前行的单词数
11     if((p = fopen(filename,"rb")) == NULL)
12     {
13         perror(filename);
14         return NULL;
15     }
16     printf("line    words    chars\n");
17     while(fgets(buffer,103,p)!=NULL)
18     {
19         len = strlen(buffer);
20         //遍历缓冲区的内容
21         for(i=0;i<len;i++)
22         {
23             c = buffer[i];
24             if(c == ' '||c == '\t')//遇到空格
25             {
26                 !blank&&wordNum++;//如果上个字符不是空格,那么单词数加1
27                 blank = 1;
28             }
29             else if(c!='\n' && c!='\r')//忽略换行符
30             {
31                 charNum++;//如果既不是换行符也不是空格,字符数加1
32                 blank = 0;
33             }
34         }
35         !blank && wordNum++;//如果最后一个字符不是空格,那么单词数加1
36         blank = 1;//每次换行重置为1
37         //一行结束,计算总字符数、总单词数、总行数
38         TotalNum[0]++;//总行数
39         TotalNum[1] += charNum;//总字符数
40         TotalNum[2] += wordNum;//总单词数
41         printf("%-10d%-10d%-10d\n", TotalNum[0],wordNum,charNum);
42         //置零,重新统计下一行
43         charNum = 0;
44         wordNum = 0;
45 
46     }
47     return TotalNum;
48 }

 

主函数:

 1 int main()
 2 {
 3     char filename[30];
 4     //TotalNum[0]:总行数  TotalNum[1]:总字符数  TotalNum[2]:总单词数
 5     int TotalNum[3] = {0,0,0};
 6     printf("Please input the file name:");
 7     scanf("%s",filename);
 8     if(GetCharNum(filename,TotalNum))
 9     {
10         printf("Total:%d lines, %d words, %d chars\n", TotalNum[0],TotalNum[2], TotalNum[1]);
11     }
12     else
13     {
14         printf("Error!\n");
15     }
16     system("pause");
17     return 0;
18 }

测试运行:

实际花费的时间: 见上表

 

项目小结: 本次功能实现不难,主要是之前没有接触过读取文件的函数,在本次项目中花了不少时间学习新的知识。最后在博客和GitHub的使用上也花了不少时间。

 

 

 

posted @ 2018-09-17 22:06  詹祺豪  阅读(99)  评论(1编辑  收藏  举报