个人项目(wordCount java)

WordCount.exe(java)

github项目地址:https://github.com/ydkxiu/wordCount

一、题目描述

  1. 实现一个简单而完整的软件工具(源程序特征统计程序)
  2. 进行单元测试、回归测试、效能测试,在实现上述程序的过程中使用相关的工具。
  3. 进行个人软件过程(PSP)的实践,逐步记录自己在每个软件工程环节花费的时间。

二、解题思路描述

寒假在家简单学了下java,还没有实践过.这次作业用到了面向对象的思想,就想到用java来实现,对字符串的处理也简单一些.

三、设计实现过程

主要用了一个主类一个方法类来实现,方法全部存放在方法类中.

四、代码说明

  • 统计字符数目
public static void charNum(String inPath) {
		int num=0;
		try {
			FileReader fr = new FileReader(inPath);
			BufferedReader br = new BufferedReader(fr);
			int a=0;
			while((a = br.read()) !=-1) {
				if(a!='\n'&&a!='\r') {
					num++;
				}
			}//不是回车或回车换行就算字符
			br.close();
			fr.close();//关闭流
			System.out.println("该文件字符数为"+num);
		}catch (IOException e) {
			System.out.println("该文件不存在,请重新输入!");
		}
	} 
  • 统计行数
public static void lineNum(String inPath) {
		String line= null;
		int lineNum=0;
		try {
			FileReader fr = new FileReader(inPath);
			BufferedReader br = new BufferedReader(fr);
			while((line = br.readLine())!=null) {
					lineNum++;//读的到就算一行
				}
			br.close();
			fr.close();
			System.out.println("该文件行数为"+lineNum);
		} catch (IOException e) {
			System.out.println("该文件不存在,请重新输入!");
		}
	}
  • 统计单词数
public static void wordNum(String inPath) {
		String line= "";
		int wordNum=0;
		try {
			FileReader fr = new FileReader(inPath);
			BufferedReader br = new BufferedReader(fr);
			while((line = br.readLine())!=null) {
					for(int i=0;i<line.length();i++) {
						char c=line.charAt(i);
						if(i==line.length()-1 && ((c>='a'&&c<='z')||(c>='A'&&c<='Z')) ){
							wordNum++;//如果是该行最后一个字符且是英文字母则单词数+1
						}
						if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) {
							continue;//还是英文字母则继续
						}else {
							wordNum++;
						}
					}
				}
			br.close();
			fr.close();
			System.out.println("该文件单词数为"+wordNum);
		} catch (IOException e) {
			System.out.println("该文件不存在,请重新输入!");
		}
	}
  • 返回更复杂的数据(代码行 / 空行 / 注释行)
public static void complexLines(String inPath) {   
		int blankLines=0;
		int commentLines=0;
		int codeLines=0;
		String line = "";
		int flag= 0;
		try {
			FileReader fr = new FileReader(inPath);
			BufferedReader br = new BufferedReader(fr);
			while ((line = br.readLine()) != null) {
				line = line.trim();
				if(flag==1) {
		        	if(line.endsWith("*/")) {
		        		flag=0;
		        	}else {
		        		commentLines++;
		        	}
		        }else {
		        	if(line.startsWith("/*")){
		        		commentLines++;
                    }
		        	else if(line.startsWith("//")||line.startsWith("}//")){
		        			commentLines++;
		        	}
		        	else if(line.equals("")) {
		        		 blankLines++;
		        	}
		        	else {
		        		codeLines++;
		        	}
		        }	
		    }
			br.close();
			fr.close();
			System.out.println("该文件的注释行为"+commentLines);
			System.out.println("该文件的空白行为"+blankLines);
			System.out.println("该文件的代码行为"+codeLines);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
        
	}  	
  • 递归处理
public static void recursion(File file) {
		if(file.isFile()) {
			System.out.println(file.getAbsolutePath());
			Method.charNum(file.getAbsolutePath());
			Method.lineNum(file.getAbsolutePath());
			Method.wordNum(file.getAbsolutePath());
		}else {
			File [] ff=file.listFiles();
			for(File fs:ff) {
				recursion(fs);
			}//递归处理
		}
	}
  • 主函数
public static void main(String[] args){
		int flag=1;
		Scanner sc = new Scanner(System.in);
		String inStr="aaa";
		File file=null;
		while(flag==1){
			System.out.println("请输入命令 ");
			if(sc.hasNextLine()){
				inStr = sc.nextLine();
			}
			String[] path = inStr.split(" ");
				if(path.length>1) {
					file = new File(path[1]);
				}
				switch(path[0]) 
				{
					case"-c":
						Method.charNum(path[1]);
						break;
					case"-w":
						Method.wordNum(path[1]);
						break;
					case"-l":
						Method.lineNum(path[1]);
						break;
					case"-s":
						Method.recursion(file);
						break;
					case"-e":
						flag=0;
						break;
					case"-a":
						Method.complexLines(path[1]);
						break;
					default:
						System.out.println("格式错误,请重新输入!");
				}
			} 
	}

五、测试运行

  • 只有一个字符的文件
  • 只有一行的文件
  • 只有一个单词的文件
  • 复杂的文件
  • 递归调用

六、PSP

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 40 40
· Estimate · 估计这个任务需要多少时间 20 30
Development 开发 405 635
· Analysis · 需求分析 (包括学习新技术) 60 120
· Design Spec · 生成设计文档 10 10
· Design Review · 设计复审 (和同事审核设计文档) 0 0
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 5 5
· Design · 具体设计 40 40
· Coding · 具体编码 210 240
· Code Review · 代码复审 40 40
· Test · 测试(自我测试,修改代码,提交修改) 40 180
Reporting 报告 50 60
· Test Report · 测试报告 10 10
· Size Measurement · 计算工作量 10 10
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 40
合计 495 735

七、项目总结

刚开始psp预估时以为不用那么久,但实际操作起来却是阻碍一个接一个,自己对java的使用还是十分的生疏,String的方法调用完全不熟练,查了才知道有这么方便快捷的函数.
同时思路也有卡壳,一时间想不到注释行该怎么计算.第一次使用exe4j转jar为exe,出现了相当多的问题,所以在测试和学习新知识方面花了十分多的时间,在打开exe的时候,
一打开就报错,eclipse可以正常使用.我最开始使用的是bufferedreader读取system.in来获取用户输入,结果报空指针异常,多次检查还是如此,不得已换为scanner读取,
发现仍然是报noline错误,最后发现exe4j转exe的时候发现应该点击console 而不是gui才解决问题.同时也简单了解如何使用github管理项目和用markdown编辑博客,
自己还有很多不足,还需要努力努力再努力.

posted @   池鱼柳林  阅读(218)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示