• 个人项目作业——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函数读取最后一个字符之前就遇到一个换行符 ' ' 或文件的末尾 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语言的知识(命令行参数、文件的读取等);
    • 教训:我从这次的实践中感受到本人应该再至少多掌握一门别的编程语言、同时还应该提高编程的能力,才能利用已学知识满足该项目的高级需求;

     

  • 相关阅读:
    【机器学习】matplotlib库练习-函数绘图
    【算法】二分查找应用:直接在结果域中进行二分查找
    【机器学习】朴素贝叶斯-02
    【机器学习】朴素贝叶斯-01
    【机器学习】决策树-02
    【机器学习】决策树-01
    【机器学*】k*邻算法-03
    【机器学*】k*邻算法-02
    【LeetCode】剑指 Offer 04. 二维数组中的查找
    【感悟】观《BBC彩色二战纪录片》有感
  • 原文地址:https://www.cnblogs.com/kriswy666/p/12501476.html
Copyright © 2020-2023  润新知