广州黄埔网站制作,电商网站域名,微信公众平台开发代理,开发app需要哪些审批Github项目地址#xff1a;https://github.com/jat0824/wc.git 项目相关要求 wc.exe 是一个常见的工具#xff0c;它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序#xff0c;模仿已有wc.exe 的功能#xff0c;并加以扩充#xff0c;给出某程序设计… 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 ListString 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; // 空行// 用于匹配注释段的起始(/*)与结束(*/),只有当cp1cp2时注释段才结束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 (linenote note!0){continue;}else {note line;}}else if (s.endsWith(*/)) {cp2;if (lineend){end line;}else {continue;}if (cp2 cp1){note_line end-note1;}}// 代码行总行数-注释行-空行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。因此只有当cp1cp2的时候注释段才结束这样设计主要针对注释段中含有注释段的特殊情况。并且注释段中的空行算在注释行数不算在空行数。 运行结果截图 输入命令 结果输出 测试运行 运行测试单元文件运行结果截图 项目小结 在一开始分析需求的时候没有彻底分析清楚需求导致设计的时候没有考虑全面在快结束的时候才发现需求没有完全实现。而且有些功能会有些不能解决的情况例如-w功能统计词数的时候如果两个词都顶格分布在相邻两行或者中间隔着若干空行则该功能会将两个词算为一个词。下次开发的时候不能粗略的按照自己的理解看完需求就马上开始设计应该认真的看完需求文档之后再进行设计。在代码规范方面应该在平时写代码的时候就养成好习惯在需要解释说明的地方写好注释代码的格式也应该有自己的风格。在开发完后可以给自己的项目写个用户说明文档以便用户使用。 转载于:https://www.cnblogs.com/x-j1/p/9648250.html