• WordCount C语言实现求文本的字符数,单词数,行数


    1.码云地址:

    https://gitee.com/miaomiaobobo/WordCount

    2.psp表格

    PSP2.1表格

    PSP2.1

    PSP阶段

    预估耗时

    (分钟)

    实际耗时

    (分钟)

    Planning

    计划

     25

    20

    · Estimate

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

     10

    5

    Development

    开发

     200 

    350

    · Analysis

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

     25

     20

    · Design Spec

    · 生成设计文档

     30  

     20

    · Design Review

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

    20

     40

    · Coding Standard

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

     20

     15

    · Design

    · 具体设计

     20

     40

    · Coding

    · 具体编码

    200    

     300

    · Code Review

    · 代码复审

     20

     40

    · Test

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

     30

     60

    Reporting

    报告

     20

     20

    · Test Report

    · 测试报告

     15  

     10

    · Size Measurement

    · 计算工作量

    10

     10

    · Postmortem & Process Improvement Plan

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

     20

     30

     

    合计

     665

    950

    误差分析:本次项目的主要误差存在于具体的编码和开发阶段,因为前期自己对文件的使用不熟悉以及上传到码云的初次接触,导致在这些地方耗费了大量的时间(总计多出200分钟左右)

     3.需求功能分析

    WordCount的需求:能够通过cmd执行.exe程序,并且传入文本文件,然后对其中的字符数,单词书,行数进行计算,并将结果保存在.exe程序的同级别目录下。

    解题思路:1.通过cmd的命令行向main函数中传入操作方式与相应的文件。

                       2.通过设置flag记录上一个字符是否为空格结合当前是否为空格来判断单词数;

                       3.判断是否有“ ”来 确定行数。

    其中,C语言实现WordCount参考链接:https://www.cnblogs.com/xiaobao123/articles/9649687.html

               字符指针数组的空间分配参考链接:https://www.cnblogs.com/mensanu/p/7979462.html

    4.程序设计

    程序总共包含4个函数(main,countw,countc,countl)其中,main为主函数,通过传入的操作数不同分别调用不同的函数,

     主要的模块有:

    1.单词数的统计,当遇到空格时,如果上一个字符不是空格,则可判断这是一个新单词

     1 while(fgets(buffer, 1003, fp) != NULL){
     2 bufferLen = strlen(buffer);
     3 
     4 for(i=0; i<bufferLen; i++){
     5 c = buffer[i];
     6 if( c==' ' || c=='	'){ 
     7 !isLastBlank && wordNum++; //当上一个不是空格,而这一个是空格时单词数+1 
     8 isLastBlank = 1;//表明一个空格
     9 }else if(c!='
    '&&c!='
    '){ 
    10 
    11 isLastBlank = 0;
    12 }
    13 }
    14 !isLastBlank && wordNum++;

    2.主函数,将cmd的操作指令传入,并通过函数strcmp进行比较,调用不同的函数:

     1 int main(int argc,char* argv[]){
     2 char filname[30];
     3 char operation;
     4 int totalline;//总行数
     5 int toalchar;//总字符数
     6 int totalword;//总单词数
     7 if(!strcmp(argv[1],"-w")) 
     8 countw(argv[2]); 
     9 else if(!strcmp(argv[1],"-c")) 
    10 
    11 countc(argv[2]); 
    12 else if(!strcmp(argv[1],"-l")) 
    13 countl(argv[2]); 
    14 return 0;
    15 }

    5.具体代码(具体代码也可参考码云链接中的.cpp文件)

      1 1 #include <stdio.h>
      2   2 #include <string.h>
      3   3 #include<malloc.h>
      4   4 int countw(char *filename);
      5   5 int countc(char *filename);
      6   6 int countl(char *filename);
      7   7 
      8   8 int main(int argc,char* argv[]){
      9   9 char filname[30];
     10  10 char operation;
     11  11 int totalline;//总行数
     12  12 int toalchar;//总字符数
     13  13 int totalword;//总单词数
     14  14 if(!strcmp(argv[1],"-w")) 
     15  15 countw(argv[2]); 
     16  16 else if(!strcmp(argv[1],"-c")) 
     17  17 
     18  18 countc(argv[2]); 
     19  19 else if(!strcmp(argv[1],"-l")) 
     20  20 countl(argv[2]); 
     21  21 return 0;
     22  22 }
     23  23 
     24  24 int countw(char *filename){
     25  25 FILE *fp=NULL; 
     26  26 FILE *fp2=NULL;
     27  27 char buffer[1003]; 
     28  28 int bufferLen; 
     29  29 int i; 
     30  30 char c; 
     31  31 int isLastBlank = 0; 
     32  32 int totalword=0;
     33  33 int wordNum = 0; 
     34  34 if( (fp=fopen(filename, "rb")) == NULL ){
     35  35 perror(filename);
     36  36 return NULL;
     37  37 }
     38  38 
     39  39 while(fgets(buffer, 1003, fp) != NULL){
     40  40 bufferLen = strlen(buffer);
     41  41 
     42  42 for(i=0; i<bufferLen; i++){
     43  43 c = buffer[i];
     44  44 if( c==' ' || c=='	'){ 
     45  45 !isLastBlank && wordNum++; //当上一个不是空格,而这一个是空格时单词数+1 
     46  46 isLastBlank = 1;//表明一个空格
     47  47 }else if(c!='
    '&&c!='
    '){ 
     48  48 
     49  49 isLastBlank = 0;
     50  50 }
     51  51 }
     52  52 !isLastBlank && wordNum++; 
     53  53 isLastBlank = 1; 
     54  54 totalword += wordNum; 
     55  55 wordNum = 0;
     56  56 }
     57  57 printf("totalword:%d ",totalword);
     58  58 fp2=fopen("result.txt","a");
     59  59 if(fp2){
     60  60 fprintf(fp2,"单词总数:%d
    ",totalword);
     61  61 fclose(fp2);
     62  62 }
     63  63 return 0;
     64  64 }
     65  65 int countc(char *filename){
     66  66 
     67  67 FILE *fp=NULL;
     68  68 FILE *fp2=NULL; 
     69  69 char buffer[1003]; 
     70  70 int bufferLen; 
     71  71 int i; 
     72  72 char c; 
     73  73 int isLastBlank = 0; 
     74  74 int totalchar=0;
     75  75 int charNum = 0; 
     76  76 if( (fp=fopen(filename, "rb")) == NULL ){
     77  77 perror(filename);
     78  78 return NULL;
     79  79 }
     80  80 while(fgets(buffer, 1003, fp) != NULL){
     81  81 bufferLen = strlen(buffer);
     82  82 for(i=0; i<bufferLen; i++){
     83  83 c = buffer[i];
     84  84 if( c==' ' || c=='	'){ 
     85  85 isLastBlank = 1;//字符不统计空格
     86  86 }else if(c!='
    '&&c!='
    '){ 
     87  87 charNum++; 
     88  88 isLastBlank = 0;
     89  89 }
     90  90 }
     91  91 
     92  92 isLastBlank = 1; 
     93  93 
     94  94 totalchar += charNum; 
     95  95 
     96  96 charNum = 0;
     97  97 
     98  98 }
     99  99 printf("totalchar:%d",totalchar);
    100 100 fp2=fopen("result.txt","a");
    101 101 if(fp2){
    102 102 fprintf(fp2,"字符总数:%d
    ",totalchar);
    103 103 fclose(fp2);
    104 104 }
    105 105 return 0;
    106 106 }
    107 107 
    108 108 int countl(char *filename){
    109 109 FILE *fp=NULL; 
    110 110 FILE *fp2=NULL;
    111 111 char buffer[1003]; 
    112 112 int bufferLen; 
    113 113 int i; 
    114 114 char c; 
    115 115 int totalline=-1;
    116 116 if( (fp=fopen(filename, "rb")) == NULL ){
    117 117 perror(filename);
    118 118 return NULL;
    119 119 }
    120 120 
    121 121 while(fgets(buffer, 1003, fp) != NULL){
    122 122 bufferLen = strlen(buffer);
    123 123 for(i=0; i<bufferLen; i++){
    124 124 c=buffer[i];
    125 125 if(c=='
    '||c=='
    '){ 
    126 126 totalline++; 
    127 127 
    128 128 }
    129 129 }
    130 130 }
    131 131 printf("totalline:%d",totalline);
    132 132 fp2=fopen("result.txt","a");
    133 133 if(fp2){
    134 134 fprintf(fp2,"总行数:%d
    ",totalline);
    135 135 fclose(fp2);
    136 136 }
    137 137 return 0;
    138 138 
    139 139 }
    All Code

    6.本程序的测试

    cmd测试命令行:

    待测试的文件:

    处理的结果:

    7.个人项目总结

    本次项目,学到的很多新知识。但是在项目开始的时候,我本来对文本的处理不是很熟悉,所以在这方面花费了很多时间,之后通过cmd运行可执行文件也耗费了我大量的时间。所以,这个项目虽然实现的功能比较简单,但总的花费我差不多一天的时间,但收获也是巨大的,也明白了自己的不足。项目本身存在着一些缺陷,包括对错误操作的提示不足,只能进行单一文件处理等,都需要改进。

    8.参考资料

    1.C语言实现WordCount参考链接:https://www.cnblogs.com/xiaobao123/articles/9649687.html

    2. 字符指针数组的空间分配参考链接:https://www.cnblogs.com/mensanu/p/7979462.html

    3.%s在c语言中对于空格的处理 : http://bbs.bccn.net/thread-352772-1-1.html

    4.git的使用:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/

  • 相关阅读:
    Mybatis配置文件
    maven添加镜像与常用配置
    互联网级微服务架构神器Duubo
    Mybatis入门
    SpringMVC文件下载与JSON格式
    SpringMVC拦截器与异常处理
    SpringMVC国际化与文件上传
    cinder
    horizon
    glance
  • 原文地址:https://www.cnblogs.com/miaobo/p/9696026.html
Copyright © 2020-2023  润新知