个人项目作业——wc.exe

Github项目地址:

https://github.com/LittleTaro/Chaos

 

 


 

 

 

解题思路

拿到题目后,我从几个重要的、我却不了解的相关知识下手,比如命令行程序、文件的读写。

结合题目的相关要求,我在”菜鸟教程“的c语言模块针对性地学习了命令行参数的使用、读写文件的相关函数。

同时,我还利用百度得知了windows命令行如何运行C/C++程序。

对于不同的计数功能要求,要使用循环语句,注意每个元素的终止条件,有的还要注意使用变量标注状态,再fgetc、fgets配合就能实现基础功能。

 


 

设计实现过程

代码中除了一个主函数,还有3个自定义函数;主函数调用3个自定义函数;

 


 

代码说明

wc.exe -c file.c 

思路:利用fgetc函数从 fp 所指向的输入文件中读取一个字符。

           若返回值是 EOF 则输入字符结束,结束循环;

           若返回字符则计数器的值加1。

 

 1 //返回文件file.c的字符数
 2   int CCount(char *filename){
 3   FILE *fp=fopen(filename,"r");
 4   int count=0;  
 5   char c;    //接收返回的字符
 6   if(fp==NULL){
 7       exit(-1);
 8   }             
 9   c=fgetc(fp);
10   while(c!=EOF){
11          count++;
12        c=fgetc(fp); 
13   }
14   fclose(fp);
15   return count;
16 }

wc.exe -w file.c 

思路:利用fgetc函数从 fp 所指向的输入文件中读取一个字符。

           若返回值为EOF则结束循环;

           若返回一个字符,则判断其是不是字母,配合InWord变量的状态变化,

           再判断它在不在一个新的词里,从而可以判断新词的出现来计数。

 1 //计算纯英文单词个数
 2 int WCount(char *filename){
 3     FILE *fp=fopen(filename,"r");
 4      if(fp==NULL)
 5        exit(-1);
 6     char c;
 7     int count=0;
 8     int InWord=1;
 9     c=fgetc(fp);
10     while (c!=EOF){
11         if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) //字符是字母
12         {
13             count+=InWord;
14             InWord=0;   //表示当前字母在词中
15         }
16         else
17         {
18             InWord=1;  //表示当前字符不在词中
19         }     
20         c=fgetc(fp);
21     }
22     fclose(fp);
23     return count;
24 }

wc.exe -l file.c 

思路:利用fgets函数读取最后一个字符之前就遇到一个换行符 '\n' 或文件的末尾 EOF就会返回已读字符串并停止读取的性质,

           配合循环,把每一次读取的字符串暂存在字符数组str中,

           每读一次,计数器加一,可得文件行数。

          

 1 //计算行数
 2 int LCount(char *filename){
 3     FILE *fp;
 4     char str[200];
 5     int count=0,n;
 6     fp=fopen(filename,"r");
 7     if(fp==NULL)
 8        exit(-1); 
 9     for(;fgets(str,200,fp)!=NULL;count++);   //读取一行字符串
10     fclose(fp);
11     return count;
12 }

 


测试运行

测试文件:

程序运行的截图

 


 

PSP:

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

  Planning

计划

  30

 30

· Estimate

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

 30

 30

Development

开发

 1010

 830

· Analysis

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

90

 90

· Design Spec

· 生成设计文档

 30

 90

· Design Review

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

 10

 10

· Coding Standard

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

 40

 10

· Design

· 具体设计

 60

 60

· Coding

· 具体编码

 400

 300

· Code Review

· 代码复审

 30

 30

· Test

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

 350

 240

Reporting

报告

 450

 160

· Test Report

· 测试报告

 360

 60

· Size Measurement

· 计算工作量

 30

 10

· Postmortem & Process Improvement Plan

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

 60

 90

合计

 

 1490

 1020

项目小结

  • 困难描述:实现不了-a功能,难于计算注释行;
  • 做过哪些尝试:尝试用字符数组存储每行的前两个非空字符,若为"//"或"/*"则判为注释行,但这无法用于判断多行注释的情况;
  • 是否解决:否;
  • 有何收获:在这次个人项目的实施过程中,我更加熟悉了个人个人开发的流程,还学习了一些c语言的知识(命令行参数、文件的读取等);
  • 教训:我从这次的实践中感受到本人应该再至少多掌握一门别的编程语言、同时还应该提高编程的能力,才能利用已学知识满足该项目的高级需求;

 

posted @ 2020-03-16 01:12  冰镇芋头  阅读(156)  评论(2编辑  收藏  举报