第二篇博客 wordcount
1、首先 附上Github项目地址:https://github.com/June1104/WordCount
2、psp表格
PSP2.1表格
|
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
|
Planning |
计划 |
||
|
· Estimate |
· 估计这个任务需要多少时间 |
1000 | 1200 |
|
Development |
开发 |
||
|
· Analysis |
· 需求分析 (包括学习新技术) |
100 | 150 |
|
· Design Spec |
· 生成设计文档 |
30 | 50 |
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
20 | 20 |
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10 | 20 |
|
· Design |
· 具体设计 |
100 | 120 |
|
· Coding |
· 具体编码 |
500 | 700 |
|
· Code Review |
· 代码复审 |
50 | 60 |
|
· Test |
· 测试(自我测试,修改代码,提交修改) |
80 | 100 |
|
Reporting |
报告 |
||
|
· Test Report |
· 测试报告 |
60 | 60 |
|
· Size Measurement |
· 计算工作量 |
20 | 25 |
|
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
20 | 20 |
3、思路大概就是开始先想着代码功能,总结一下功能就是读取文件,然后获得文件的字符数,单词数,行数,以及扩展功能读取当前目录和子目录下的文件,然后再返回更复杂的数据(代码行 / 空行 / 注释行)等。因为自己对java语言完全不熟悉,只是在大二学面向对象的时候应付作业用过,相对来说可能还c熟悉一点(但其实掌握的也不好),所以相比之下就选择了c,但其实作业做起来还是蛮吃力的,想要什么作用,就要百度各种不同的函数,比如打开文件的fopen函数,比如在识别命令行时的字符串比较函数strcmp等等。说到识别命令,那又是在写代码时遇到的一个大问题,在cmd里输入的不同命令,怎么与代码连接起来呢。后来百度到了“主函数main中变量(int argc,char *argv[])的含义”,看懂这个知识点后感觉开始有点上手,于是慢慢的弄懂了这个问题。然后说回来,在读取字符数、单词数这些问题上,先是自己想了,需要判断什么条件,然后在百度的帮助下,完善思路,可以正确的运行获取结果。
4、程序实现过程大概就是从各种百度中开始学习,开始上手。代码主要分成了三个部分,把不同的功能写在了三个文件里,分别是主函数main.c、获取字符数单词数行数的功能wc.c和获取文件的代码函数file.c。主函数里引用wc.c和file.c,主函数的主要流程就是判断cmd命令,然后读取文件,再根据wc.c函数判断不同条件,得到结果。
5、代码说明
a、在int main(int argc, char **argv)函数中,根据命令中的.c格式和.txt格式初步判断是要获取的文件还是输出结果到哪个文件。argv[]指向命令行的参数,当遍历到.c格式时,就把该参数赋值为文件路径,以遍接下来获取;当遍历到.txt格式时,就把该参数赋值为文件名。否则,输出error。
for(i = ; i < argc; ++i)/*argc是命令行总的参数个数*/
{
p = argv[i];
while(*++p != NULL);
if(strcmp(p - , ".c") == )
{
path = argv[i];
end = i;
} if(strcmp(p - , ".txt") == )
{
if(strcmp(argv[i - ], "-o") == )
filename = argv[i];
else
{
printf("error.\n");
return EXIT_FAILURE;
}
}
}
b、在file.c文件中的读取文件函数,返回buf首地址,fopen函数此时打开文件,形式为只读“r”。把文件里读到的内容放到缓冲中,最后返回缓冲首地址(此段功能的代码为网上搜索获得),在wc.c中用这个首地址++来判断各种不同条件。
char *readfile(char *path)/*返回buf首地址 参数是文件路径*/
{
FILE *fp ;
int len;
char *buf; if ((fp = fopen(path, "r") )== NULL)
{
printf("open file %s error.\n", path);
exit();
} len = filelength(fp);
buf = (char *) malloc (len);
fread(buf, sizeof(char), len, fp);
fclose(fp);
*(buf + len - ) = '\0';
return buf;
}
c、wc.c代码中的主要函数就是统计文件中的字符数,单词数和行数
这里是基本判断
int isalpha(char a){
if ((a <= 'z'&&a>='a') || (a<='Z'&&a>='A'))
return ;
return ;
}/*判断是否是单词*/
int isspace(char c){
if ((' ' == c) || ('\n' == c) || ('\t' == c) ||
(',' == c) || (';' == c) || (')' == c) ||
('(' == c) || ('{' == c) || ('}' == c))
return ;
return ;
}/*判断是否是分隔符*/
下面是计算字符数,单词数,行数的方法。以参数buf遍历,指针加一,字符数就加一;当遇见换行符时,行数加一;当是单词且通过一个间隔符后,单词数加一。
while( (c = *buf++) != '\0')
{
++info->nc;
if('\n' == c)
++info->nl;
if(isspace(c))
state = OUT;
else if(isalpha(c) && OUT == state)
{
state = IN;
++info->nw;
}
}
6、测试设计过程,对不同的功能,分别进行不同的测试,然后进行组合命令再测试不同的功能。
a、测试用例设计如下
不同输入 |
结果 |
wc.exe -c test.c |
test.c, 字符数:1386 |
wc.exe -w test.c |
test.c, 单词数:131 |
wc.exe -l test.c |
test.c, 行数:59 |
wc.exe -l -w test.c |
test.c, 行数:59
test.c, 单词数:131 |
wc.exe -c test.c -o res.txt |
![]() |
wc.exe -c -w -l test.c |
test.c, 字符数:1386 test.c, 单词数:131 test.c, 行数:59 |
wc.exe -c -w -l test.c -o resl.txt |
![]() |
wc.exe -c -w -l test1.c |
test1.c, 字符数:111 |
wc.exe -c -w -l test1.c -o res2.txt |
![]() |
wc.exe -c test2.c |
open file test2.c error. |
(备注,同一目录下放了test.c和test.c1文件,没有test.c2文件)
b、测试脚本文件为test.bat,脚本中测试内容有
start wc.exe wc.exe -l test.c
start wc.exe wc.exe -w test.c
start wc.exe wc.exe -c test.c
wc.exe -l -w test.c
wc.exe -c test.c -o output.txt
wc.exe -c -w -l test.c
wc.exe -c -w -l test.c -o outputl.txt
wc.exe -c -w -l test1.c
wc.exe -c -w -l test1.c -o output2.txt
wc.exe -c test2.c
在cmd中运行test.bat 结果为:
文件目录截图

cmd截图

输出txt文件截图:



7、参考文献链接
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/
http://www.jb51.net/article/107168.htm
https://baike.baidu.com/item/c%E8%AF%AD%E8%A8%80fopen%E5%87%BD%E6%95%B0/1775995?fr=aladdin
https://baike.baidu.com/item/strcmp/5495571?fr=aladdin
第二篇博客 wordcount的更多相关文章
- python第二篇博客,关于数据类型的详细讲解
数据,就是我们要存储的信息,因为信心种类很多,所以,数据种类也有很多 数字类型数据 整数int 表示年龄,手机号等等 浮点型float 表示身高,工资等带有小数点的数据 字符串类型数据 用来做描述性信 ...
- 项目冲刺Beta第二篇博客
Beta版本冲刺计划安排 1.当天站立式会议照片: 2.工作分工: 团队成员 分工 张洪滨060 排行榜界面美化 陈敬轩059 注册成功界面美化 黄兴067 登录界面美化 林国梽068 答题界 ...
- 小白两篇博客熟练操作MySQL 之 第二篇
小白两篇博客熟练操作MySQL 之 第二篇 一. 视图 视图是一个虚拟表,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用名称即可获取结果集, 并可以将其当做表来使用. s ...
- 這是我既C語言作業寫博客後寫的第一篇博客
這篇博客應該算是寫給我自己的博客吧,所以這裏我想用繁體字寫,因為我漸漸地發現我已經很少使用到繁體字了,日常QQ聊天都使用簡體字,繁體字都懶得切換了,但是為了不讓別人麻煩,在外界交流的時候我會使用簡體字 ...
- 小白两篇博客熟练操作MySQL 之 第一篇
小白两篇博客熟悉操作MySQL 之 第一篇 一.概述 1. 什么是数据库? 答: 储存数据的仓库, 如: 在ATM的事例中创建的一个db 目录, 称为数据库 2. 什么是Mysql, Oracl ...
- 小白神器 - 一篇博客学会HTML
小白神器 - 一篇博客学会HTML 一. 简介 1. HTML 定义 htyper text markup language 即超文本标记语言. 超文本: 就是指页面内可以包含图片.链接,甚至音乐. ...
- [书籍]值得纪念的第100篇博客,推荐一些看过的UI书籍
1. 前言 来到博客园11年,这两年闲下来了才有时间写写博客,不知不觉终于写到第100篇博客了.回顾过去发表的博客,居然大部分都与UI相关.明明我本来从事的是Oracle的相关开发,明明我当初的目标是 ...
- 鸿蒙内核源码分析(字符设备篇) | 字节为单位读写的设备 | 百篇博客分析OpenHarmony源码 | v67.01
百篇博客系列篇.本篇为: v67.xx 鸿蒙内核源码分析(字符设备篇) | 字节为单位读写的设备 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...
- 鸿蒙内核源码分析(文件概念篇) | 为什么说一切皆是文件 | 百篇博客分析OpenHarmony源码 | v62.01
百篇博客系列篇.本篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一切皆是文件 | 51.c.h.o 本篇开始说文件系统,它是内核五大模块之一,甚至有Linux的设计哲学是" ...
随机推荐
- PHP 程序员学数据结构与算法之《栈》
“要成高手,必练此功”. 要成为优秀的程序员,数据结构和算法是必修的内容.而现在的Web程序员使用传统算法和数据结构都比较少,因为很多算法都是包装好的,不用我们去操心具体的实现细节,如PHP的取栈 ...
- Gradle 语法
参考文章: Gradle学习系列之二——创建Task的多种方法(http://www.cnblogs.com/CloudTeng/p/3417970.html) Gradle基本知识点与常用配置(ht ...
- Zuul超时问题,微服务响应超时,zuul进行熔断
天碰到了微服务响应超时问题,而且超时时间特别短,2秒就超时,zuul就走熔断了. 我采用zuul作为网关,根据不同的访问路径进行微服务的路由,譬如有个服务是user,我访问user服务的某个接口时,该 ...
- Swift - JPush极光推送的使用3(根据Alias别名,给某个指定用户发推送)(转)
一.别名(alias)介绍 (1)我们可以给每一个安装了应用程序的用户,取不同别名来标识(比如可以使用用户账号的 userid 来作为别名). (2)以后给某个特定用户推送消息时,就可以用此别名来指定 ...
- C++连接Oracle之OCCI(windows)
上一节我们讲过了ADO连接Oracle,这一节我们尝试通过OCCI的方式,来在windows平台下连接Oracle数据库,下一节讨论在Linux环境下通过OCCI的方式连接远程的Oracle数据库. ...
- python-淘宝信息定向爬取
S是类似产品页数 bcoffset直流偏移. 有人在将偏移量:http://www.cnblogs.com/defineconst/p/6185396.html item.taobao.com/it ...
- 通过IP地址进行精准定位
可能会遇到这样的问题,服务器或者系统经常被扫描,通过IP地址我们只能查到某一个市级城市,如下图: 当我们想具体到街道甚至门牌号,该怎么办??? 偶然间发现百度地图有高精度IP定位API的接口,通过该接 ...
- cookie保存用户名及密码
登陆页中,用户输入用户名密码,点击提交,后台对照mysq数据库中,看是否有对应的用户名,以及密码是否正确.如果正确 则将用户名密码分两份Cookie保存.页面跳转到登陆成功页. 用户再次访问登陆页时, ...
- C#四舍五入说明
string.Format("{0:N2}", d) 与 Math.Round(d, 2).ToString() 不总是相等 string.Format("{0:N2}& ...
- 吴裕雄 实战PYTHON编程(4)
import hashlib md5 = hashlib.md5()md5.update(b'Test String')print(md5.hexdigest()) import hashlib md ...


