个人项目:wc程序(java)

  Github项目地址:https://github.com/jat0824/wc.git

 项目相关要求

  wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。具体功能要求:程序处理用户需求的模式为:

wc.exe [parameter] [file_name]

 


 

PSP

 

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划 6030 
· Estimate· 估计这个任务需要多少时间 700630 
Development开发 640590 
· Analysis· 需求分析 (包括学习新技术) 9090 
· Design Spec· 生成设计文档 3030 
· Design Review· 设计复审 (和同事审核设计文档) 3030 
· Coding Standard· 代码规范 (为目前的开发制定合适的规范) 2015 
· Design· 具体设计 3025 
· Coding· 具体编码 200180 
· Code Review· 代码复审 6040 
· Test· 测试(自我测试,修改代码,提交修改) 180180 
Reporting报告 120100 
· Test Report· 测试报告 6060 
· Size Measurement· 计算工作量 3020 
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划 3020 
 合计 820720 

 

 

遇到的困难及解决方法

  • 问题描述做过的尝试

    • 1、关于如何将参数传入main方法的问题
    • 2、如何统计词数
    • 3、如何判别注释段是否结束
    • 4、通配符的处理
  • 做过的尝试
    • 1、用Scanner类获取参数输入->使用main函数的argv数组获取参数输入

    • 2、逐行读取文件,除去特殊字符后用空格分离该行,返回数组长度

    • 3、设置了两个变量来记录注释段的开始字符个数和结束字符个数,只有两个变量相等的时候才表示注释段结束

    • 4、将通配符按正则表达式的规则替换掉了*和?

  • 成功解决问题

  • 收获:了解了main函数参数的作用,学习并运用了正则表达式,多角度思考问题

 

设计实现过程

包含以下几个函数:

  1、stringcount():实现-c、-l操作:统计文件字符数或行数

  2、wordcount():实现-w操作:统计指定文件中词的个数

  3、handleall():实现-s操作:递归读取目录下符合条件的文件,加入List

  4、moredata  ()  :实现-a操作: 统计代码行/空行/注释行

  5、Checkfile  ()  :判断需要处理的是目录还是文件

  6、deal  ()  :按正则表达式处理含通配符的文件名

  7、main():主方法

实现过程:

  在主方法中判断输入的参数并进行相应的操作,-s操作需要先调用Checkfile  () 函数,在Checkfile  () 函数中调用了deal  () 函数规范文件名,然后再调用了handleall()函数处理符合条件的文件。

 

 

 关键代码

 -s、-a操作实现:

在主函数中:首先判断参数是否为-s,然后调用Checkfile()方法判断输入的最后一个参数是目录还是文件,最后通过handleall()方法对符合条件的文件进行后续操作。

 

// 判断需要处理的是目录还是文件
public static void Checkfile()
{int pathlen = filename.get(0).length();int filelen = 0;String name = null;String file = filename.get(0);// 判断是否为文件名,是否含有通配符if (file.replaceAll("[^//.^//*^//?]", "").length()==0)  {handleall(file, "");}else{if (file.contains("/")){String[] n = file.split("/");name = n[n.length-1];filelen = name.length();handleall(file.substring(0, pathlen-filelen), deal(name));}else{handleall("", deal(file));}}
}// 实现-s操作:递归读取目录下符合条件的文件,加入List
public static List<String> handleall(String path, String name) {Matcher m = null;if (path.equals("")){dir = new File("src");}else {dir = new File(path);}File[] files = dir.listFiles();if (files == null){System.out.println("该目录为空!");}for (File f : files){if (f.isFile()) {if (name.equals("")){filename.add(f.getAbsolutePath());}else {Pattern p = Pattern.compile(name);m = p.matcher(f.getName());if (m.matches()){filename.add(f.getAbsolutePath());}}}else if (f.isDirectory()) {handleall(f.getAbsolutePath(), name);}}return filename;
}// 按正则表达式处理含通配符的文件名
public static String deal(String name)
{name = name.replace(".", "#");name = name.replaceAll("#", "\\.");name = name.replace("*", "#");name = name.replaceAll("#", ".*");name = name.replace("?", "#");name = name.replaceAll("#", ".?");name = "^" + name + "$";// System.out.println(name);return name;
}// 实现-a操作public static String moredata(int first) throws IOException {int line = 0;int null_line = 0;  // 空行// 用于匹配注释段的起始(/*)与结束(*/),只有当cp1==cp2时注释段才结束int cp1 = 0;    int cp2 = 0;// 标记整段注释的起始行数int note = 0;   int end = 0;int note_line = 0;  // 注释行int code_line = 0;  // 代码行File files = new File(filename.get(first));if (files.exists()) {    // 判断文件是否存在BufferedReader br = new BufferedReader(new FileReader(files));String st = null;while ((st = br.readLine())!=null) {   // 如果文件中最后一行为空行则最后一行不算一行++line;// 将字符串中的空格、回车、换行符、制表符去掉String s = st.replaceAll("\\s*|\t|\r|\n", "");  if (s.equals("") || s.equals("{") || s.equals("}")) {   // 判断空行用s.equals("")// 注释段中的空行不算在空行数中,算在注释行数中if (s.equals("") && cp1!=cp2){;}else {null_line++;}}else if (s.startsWith("//") || s.startsWith("{//") || s.startsWith("}//")){note_line++;}else if (s.startsWith("/*")){cp1++;if (line>note && note!=0){continue;}else {note = line;}}else if (s.endsWith("*/")) {cp2++;if (line>end){end = line;}else {continue;}if (cp2 == cp1){note_line += end-note+1;}}// 代码行=总行数-注释行-空行code_line = line-note_line-null_line;}br.close();System.out.println("文件" + filename.get(first) + "的代码行/空行/注释行 分别为: " + code_line + "/" + null_line + "/" + note_line);return code_line + "/" + null_line + "/" + note_line;} else {System.out.println(files.getPath() + " 文件不存在!");return "no such file!";}}

 

  • Checkfile()方法用于判断输入的路径是目录还是文件,再通过handleall()方法将各符合条件的文件绝对路径存入List表中。输入的是目录则递归对该目录下的所有文件进行后续操作,输入的是文件则直接对符合条件的文件进行后续操作(默认的文件路径在src目录下)

  • deal()方法是按正则表达式的规则处理含通配符的文件名,例如:输入的文件名为 *.?d 则经过处理后文件名为 ^.*..?d$

    • 其中^和$分别表示正则表达式的起始和终止
    •  . 匹配除"\r\n"之外的任何单个字符; * 表示零次或多次匹配前面的字符或子表达式; ?表示零次或一次匹配前面的字符或子表达式;
  • moredata()方法中实现了对代码行、空行、注释行的统计,其中注释行的统计主要设置了两个int类变量cp1和cp2 对读取的每一行字符串进行判断,是否为"/*"开头,是则cp1++,是否为"*/"结尾,是则cp2++。因此只有当cp1==cp2的时候注释段才结束,这样设计主要针对注释段中含有注释段的特殊情况。并且注释段中的空行算在注释行数不算在空行数。

  • 运行结果截图:

    • 输入命令:

    • 结果输出:

 

测试运行

运行测试单元文件,运行结果截图:

 

项目小结

   在一开始分析需求的时候没有彻底分析清楚需求,导致设计的时候没有考虑全面,在快结束的时候才发现需求没有完全实现。而且有些功能会有些不能解决的情况,例如:-w功能统计词数的时候如果两个词都顶格,分布在相邻两行或者中间隔着若干空行,则该功能会将两个词算为一个词。下次开发的时候不能粗略的按照自己的理解看完需求就马上开始设计,应该认真的看完需求文档之后再进行设计。在代码规范方面,应该在平时写代码的时候就养成好习惯,在需要解释说明的地方写好注释,代码的格式也应该有自己的风格。在开发完后可以给自己的项目写个用户说明文档以便用户使用。

            

 

 

转载于:https://www.cnblogs.com/x-j1/p/9648250.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/485103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【剑指offer】面试题35:复杂链表的复制(Java)

请实现 copyRandomList 函数&#xff0c;复制一个复杂链表。在复杂链表中&#xff0c;每个节点除了有一个 next 指针指向下一个节点&#xff0c;还有一个 random 指针指向链表中的任意节点或者 null。 示例 1&#xff1a; 输入&#xff1a;head [[7,null],[13,0],[11,4],[10,2…

【综述专栏】图神经网络综述

来源&#xff1a;图灵人工智能作者&#xff1a;王健宗等https://wwwihcm/people/euu-lin-jun-7原文链接&#xff1a;https://kns.cnki.net/kcms/detail/31.1289.tp.20201123.1641.002.html摘要&#xff1a;随着计算机行业和互联网时代的不断发展与进步&#xff0c;图神经网络已…

HDFS设计思想

HDFS设计思想 DataNode&#xff1a;用来在磁盘上存储数据 HDFS 数据存储单元&#xff08; block &#xff09; 1 文件被切分成固定大小的数据block块 •默认数据块大小为 64MB(hadoop1.x版本64M&#xff0c;2.x为128M) &#xff0c;可配置 •若文件大小不到 64MB &#xff…

被认为是世界史上50个最伟大的发明有哪些?

来源&#xff1a;数学中国根据美国《大西洋月刊》杂志邀请了世界上12位科学家、技术史专家、工程师、企业高管组成的专家团为世界遴选自车轮&#xff08;车轮的广泛使用一般被认为始于6000年前&#xff09;问世后的50个最伟大的发明。其中&#xff0c;中国的四大发明均在其中。…

“NP问题是可计算的吗?” - 从“可计算性”的角度审视NP

来源&#xff1a;图灵人工智能转自 http://blog.sciencenet.cn/u/liuyu2205P vs NP世纪难题显示出在现有的计算机理论中存在着令人不安的困惑&#xff1a;一方面&#xff0c;书本中的NP问题理论部份无论是学习或教学都感到困难&#xff0c;以至于人们不得不一次又一次回头去重新…

GPT-3和AlphaFold 2震撼2020,2021年AI最大看点在哪儿?

来源&#xff1a;机器学习研究组订阅2020年并不缺重磅新闻&#xff0c;但人工智能依然够杀出重围&#xff0c;走进主流视野。尤其是GPT-3&#xff0c;它展示了人工智能即将以全新的方式深入我们的日常生活。这些进步赋予了未来很多可能&#xff0c;预测未来变得并不容易&#x…

宇宙与无限之谜

文&#xff1a;Alan Lightman译&#xff1a;Sue校对&#xff1a;Rachel在博尔赫斯&#xff08;Jorge Luis Borges&#xff09;的《沙之书》&#xff08;The Book of Sand&#xff09;中&#xff0c;一个神秘的传教者敲开了故事主人公的门&#xff0c;想要卖给他一本圣书。这本书…

微软、IBM们的中国研究院是怎样一步步“躺平”的?

来源&#xff1a; 脑极体IBM中国研究院关闭的消息&#xff0c;又让大家想起了曾经甲骨文、微软、Adobe等外企研究机构离华的新闻。从上世纪末本世纪初来华&#xff0c;十多年情缘突然宣告分手&#xff0c;固然是遗憾的&#xff0c;也更令人好奇背后的原因。公司业绩表现不佳、研…

斯坦福 AI 课程 10 年发展史

作者&#xff1a;Rachel Oh 、Peter Maldonado转自&#xff1a;机器之心编辑&#xff1a;杜伟、小舟在人工智能领域&#xff0c;斯坦福大学的很多课程都颇受欢迎&#xff0c;如 CS 224N 深度学习自然语言处理和 CS 229 机器学习。这些课程如何一步步发展成为今天的热门课程&…

6G技术长啥样?5大趋势,13个核心技术2030年落地

来源&#xff1a;智东西5G已经展开了全面商用&#xff0c;随着5G在垂直行业的不断渗透&#xff0c;人们对于6G的设想也逐步提上日程。面向2030, 6G将在5G基础上全面支持整个世界的数字化&#xff0c;并结合人工智能等技术的发展&#xff0c;实现智慧的泛在可取、全面赋能万事万…

微积分的未来:DNA、非线性、混沌、复杂系统与人工智能

导语微积分是人类历史上的伟大思想成就之一&#xff0c;也是数学领域不可或缺的一个重要分支。如果没有微积分&#xff0c;人类就不可能发明电视、微波炉、移动电话、GPS、激光视力矫正手术、孕妇超声检查&#xff0c;也不可能发现冥王星、破解人类基因组、治疗艾滋病&#xff…

美国防部官员讨论量子科学、5G和定向能的发展

来源&#xff1a;国防科技要闻3月8日&#xff0c;美国防部国防研究与工程办公室负责现代化建设的三名官员在国防工业协会太平洋作战科技虚拟会议上讨论了量子科学、5G和定向能的发展。量子科学量子科学主要负责人保罗洛帕塔表示&#xff0c;国防部在过去的二三十年里一直在进行…

9-18 学习如何使用Python包的管理

前提是安装好Anaconda 1.如何安装一个包 这里的语句 package_name为包的名字 例如 你可以在cmd窗口下输入 按下回车后 系统将会进行安装numpy包。 你也可以同时安装多个包&#xff0c;比如同时安装numpy、scipy、pandas包。 命令如下 注&#xff1a;numpy&#xff1a;是Python的…

AR行业发展现状:定义、技术原理及商业价值

文章来源&#xff1a;AR工业应用资料源自网络《Pokemon Go》这款游戏能够大火&#xff0c;除了一个好的IP之外。AR技术也功不可没。而在AR发光之后&#xff0c;什么是AR&#xff1f;它的技术原理是怎么样的&#xff0c;它能够具备哪些商业价值&#xff1f;希望通过这篇文章&…

基础学科如何不再“又难又穷”

来源&#xff1a;光明日报投身基础学科意味着什么——“奉献”“冷板凳”“异常艰苦”……也许&#xff0c;这是横亘在数十年间&#xff0c;大学生选报志愿时对“基础学科”的“刻板印象”。在知乎、豆瓣等大学生汇集的社交网站上&#xff0c;谈到基础学科&#xff0c;一位叫刘…

2021年阿贝尔奖公布!理论计算机科学和离散数学领域学者获奖

来源&#xff1a;前瞻网3月17日&#xff0c;2021年阿贝尔奖揭晓。挪威科学和文学院决定将2021年阿贝尔奖授予来自匈牙利&#xff0c;布达佩斯罗兰大学的Lszl Lovsz 和来自美国&#xff0c;普林斯顿高等研究院的 Avi Wigderson&#xff0c;以表彰两位科学家在理论计算机科学和离…

path环境变量丢失恢复

path环境变量不小心丢失&#xff0c;查询到的恢复方法记录一下 WindowsR键&#xff0c;打开&#xff1a;regedit后点击确定按钮 依次按照这个步骤找到path&#xff0c;鼠标右键修改&#xff0c;复制值到path环境变量中就可以了 转载于:https://www.cnblogs.com/liangcl/p/96797…

GPU深度报告,三大巨头,十四个国内玩家一文看懂【物联网智商精选】

来源: 智东西编辑&#xff1a;智东西内参关于GPU&#xff0c;你想知道的都在这里了。GPU是Graphics Processing Unit&#xff08;图形处理器&#xff09;的简称&#xff0c;它是一种专门在个人电脑、工作站、游戏机和一些移动设备&#xff08;如平板电脑、智能手机等&#xff0…

MYSQL--一条SQL查询语句是如何执行的?

select * from user where id10 当输入这条查询语句之后会发生什么&#xff1f; MYSQL逻辑架构图 MYSQL大致可以分为两大部分&#xff1a;Server层和存储引擎层 下面来介绍各层中各部分的作用&#xff1a; 连接器&#xff1a; 客户端请求建立连接&#xff0c;在完成TCP连接…

人工智能功能级别与框架|《远望译品》

来源&#xff1a;远望智库预见未来人工智能功能级别与框架本文摘自《人工智能算法、作战环境及未来趋势预判》&#xff5c;《远望译品》1、人工智能功能级别人工智能不仅在知识域中运行&#xff0c;而且在不同级别上与其他理性个体及其问题空间相互作用。人们对人工智能的期望过…