c语言单人项目,个人项目 wc(C语言)

github地址:https://github.com/Spartaright/wc

75658ab67620ee1a42bb2ae5e5772fba.png

一、题目描述

实现一个简单而完整的软件工具(源程序特征统计程序)。

进行单元测试、回归测试、效能测试,在实现上述程序的过程中使用相关的工具。

进行个人软件过程(PSP)的实践,逐步记录自己在每个软件工程环节花费的时间。

wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。

实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。

具体功能要求:程序处理用户需求的模式为:wc.exe [parameter] [file_name]

二、解题思路

统计字符数,行数的实现不算困难,只需要在意空格、换行符之类的操作即可;重点在于如何实现统计单词数的算法,参考C语言的教科书就可以解决。对于我来说,比较困难的是对文件的操作,因为之前从来没试过,对于如何读取文件的信息还是比较陌生的。因此在着手准备前针对性地学习了fopen、fclose,fgerc之类必要函数的算法。由于到目前为止大多数时间都是使用C语言,再加上C语言偏底层的特性,对文件操作比较方便,所以这次的个人项目用C来实现。

三、代码

1、字符数统计

int charcalculate(char *file) {

FILE*fp =NULL;int charcount = 0;

fp= fopen(file, "r");//打开一个文本文件

if (fp ==NULL) {

printf("文件寻找失败!");

exit(-1);

}charfilechar;

filechar=fgetc(fp);while (filechar !=EOF) {

filechar= fgetc(fp);//读取文件中的字符

charcount++;//统计字符数

}

fclose(fp);return charcount;

}

2、单词数统计

int wordcalculate(char *file) {

FILE*fp =NULL;int wordcount = 0;

fp= fopen(file, "r");if (fp ==NULL) {

printf("文件寻找失败!");

exit(-1);

}charfileword;intword;

fileword=fgetc(fp);while (fileword !=EOF) {

fileword=fgetc(fp);if (fileword 'Z'&&fileword < 'a') || fileword>'z')

{

word= 0;

}else if (word == 0)

{

word= 1;

wordcount++;

}

}if (word == 0)

{

wordcount++;

word= 1;

}returnwordcount;

}

3、行数统计

int linecalculate(char *file) {

FILE*fp =NULL;int linecount = 0;

fp= fopen(file, "r");if (fp ==NULL) {

printf("文件寻找失败!");

exit(-1);

}charfileline;

fileline=fgetc(fp);while (fileline !=EOF) {if (fileline == '') {//出现换行时,统计行数

linecount++;

fileline=fgetc(fp);

}else{

fileline=fgetc(fp);

}

fclose(fp);return linecount + 1;

}

}

4、主函数

#pragma warning(disable:4996)

#include

#include

#include

intmain() {char file[200], intput;

printf("请输入用户命令:wc.exe-");

intput=getchar();switch(intput)

{case 'c':

printf("请输入文件名:");

scanf("%s", &file);int charcount = 0;

charcount=charcalculate(file);

printf("文件字符数为:%d", charcount);break;case 'w':

printf("请输入文件名:");

scanf("%s", &file);int wordcount = 0;

wordcount=wordcalculate(file);

printf("文件单词数为:%d", wordcount);break;case 'l':

printf("请输入文件名:");

scanf("%s", &file);int linecount = 0;

linecount=linecalculate(file);

printf("文件行数为:%d", linecount);break;default:

printf("错误操作!请重新输入!");

}

getchar();return 0;

}

四、项目测试

1、空文件

70c9895e7663caa5443d92bd2e514b91.png

679ec8d7f96169ca70086538bb07c9b2.png

ed39c1938cba12cb93d24c0ac8e36018.png

2、只含一个字符

7fc287029b475bc6340e742b0c2cb773.png

c941b6c5a02f279120e65e557491311c.png

33019b8f63f6bec60256e3fed1eff255.png

3、只有一行

4e80fd9bce019282e2873e6b36bd5d50.png

911aad001d349289d27dfb8df39a07d9.png

be3b0d47d549678a2a263c999f4cefcf.png

4、一个典型的源文件

cbeb121b49424d42e5bea9fda0533eff.png

21ecd89f2ea4db454c4c320a7172ce21.png

3dbe9859a2762fb67ceffc0f33e940f1.png

五、心得总结

1、本次作业编译环境为vs2017,对C语言的支持并不是很好(而对于C++和C#比较完善),因此在编写的时候需要混杂有C++的风格,感觉比较棘手;最终编译的时候也是频繁出现无法找到pdb文件这一错误(错误代码:c4996),后来有试过把scanf,fopen之类的函数换成C++风格的scanf_s和fopen_s,但是效果并不理想,最终经过多次尝试,在预处理的时候加上#pragma warning(disable:4996)这一段后才能勉强运行,但是运行效率却大打折扣了,由于个人能力所限,改进过程只能放下了。

2、通过这次项目的锻炼,我体会到了个人软件过程能够使我按照一套标准的流水线的步骤去处理任务,由于自身能力的不足,在这个过程中出现了许多的困难,而且也有很多东西不达标,但是依旧体会到了这个过程的重要性,今后会加强训练自己,努力掌握个人软件过程。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值