软工实践寒假作业(2/2)

基本信息

这个作业属于哪个课程 2021春软件工程实践S班(福州大学)
这个作业要求在哪里 软工实践寒假作业(2/2)
这个作业的目标 学习使用git以及github,高效系统编程
其他参考文献 《构建之法》

目录:

part1:阅读《构建之法》并提问

Q1

> 分析麻痹:一种极端情况是想弄清楚所有细节、所有依赖关系之后再动手,心理上过于悲观,不想修复问题,出了问题都赖在相关问题上。分析太多,腿都麻了,没法起步前进,故得名“分析麻痹”(Analysis Paralysis)。  
  • 当我看到这里时,就不太明白为什么弄清楚所有细节是极端情况?不正是因为细节处理得好,才能使程序更完善么?老话不是也说细节决定成败么?
  • 不单单是从程序上考虑,从提高编程能力出发,不也正是因为许多细节上的考虑,才让我们的编程能力更为经验老道,得到提高么?

Q2

> 7. 理性地工作:软件开发有很多个人的、感情驱动的因素,但是一个成熟的团队成员必须从事实和数据出发,按照流程,理性地工作。很多人认为自己需要灵感和激情,才能为宏大的目标奋斗,才能成为专业人士。著名的艺术家Chuck Close说:我总觉得灵感是属于业余爱好者的。我们职业人士只是每天持续工作。今天你继续昨天的工作,明天你继续今天的工作,最终你会有所成就”。  
  • 当我看到这里时,就不太明白为什么只是完成每天的工作任务,最终就会有所成就?如果工作的内容一成不变,对编程技巧,对个人的进步无太大效果,又怎会有所成就?
  • 按时按质按量完成所需工作量当然是必须的,但我们如果还想要提高自己的能力,竞争力,我们就不该仅仅觉得那样最后真能有所成就,而是多思考自身的能力局限,和应该努力提高的方面,并真正往其中下功夫

part2:WordCount编程

Github项目地址

Github项目点我前往

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
Estimate 估计这个任务需要多少时间 2day 3.5day
Development 开发
Analysis 需求分析 (包括学习新技术) 10 35
Design Spec 生成设计文档 20 15
Design Review 设计复审 10 8
Coding Standard 代码规范 (为目前的开发制定合适的规范) 10 10
Design 具体设计 20 25
Coding 具体编码 300 360
Code Review 代码复审 50 40
Test 测试(自我测试,修改代码,提交修改) 40 40
Reporting 报告
Test Repor 测试报告 50 50
Size Measurement 计算工作量 15 20
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 20 30
合计 具体编码 545 583

解题思路描述

刚开始看到题目那么长一大段,特别是git和github的使用我没怎么了解过,就感觉挺复杂的,于是直接挑编程题目看,
幸好,题目并没有多复杂,功能的实现也是比较简单的,于是我便按要求,一个一个实现,先完成文件的字符数的统计,
在解决字符数的统计时,我发现txt文件换行时,程序所计算的字符数为二,我便在换行时数量减一,再完成统计文件的单词总数,
这时,我用的是完成有分隔符时单词的检测,再完成单词的要求检测,而计数我使用的则是map,单词为key,单词的频率为value,
若有相同的单词,则value加一,再逐一完成作业要求。

代码规范制定链接

代码规范制定点我前往

设计与实现过程

四个函数,分别对应四个功能
1.统计文件的字符数


	 public static void countChar() throws IOException{
	    FileWriter fw = new FileWriter("f://output.txt");
		File file = new File("F:\\input.txt");
		try {
			FileReader fr = new FileReader(file);
			BufferedReader bfr = new BufferedReader(fr);
			char ch;
			int countc = 0;//字符数
			while((ch = (char) bfr.read()) != (char)-1)	{
				countc++;//累计字符数
				if(ch == '\n')
				{
					countc--;
				}
			}
			//System.out.println("Chars:"+countc);
	        fw.write("characters:"+ countc + "\n");
			bfr.close();
			fr.close();;
			fw.close();
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}

2.统计文件的单词总数

	public static void countWordsNum() throws IOException{
	    FileWriter fw = new FileWriter("f://output.txt",true);
		File file = new File("F:\\input.txt");
		
		try {
			FileReader fr = new FileReader(file);
			BufferedReader bfr = new BufferedReader(fr);
					
			char ch;//当前字符
			int count = 0;//字母数量是否超过4个
			int t = 0 ;//是否有分隔符,有才能增加单词数
			int endchar = 0;//末尾无分隔符的单词也要加一
			int countw = 0;//英文单词数
			//String[] strArray={};
			String str = "";
			HashMap<String, Integer> words = new HashMap<String, Integer>();
			while ((ch = (char) bfr.read()) != (char)-1)//按字符读取文本内容&&((fch>='a'&&fch<='z')||(fch>='A'&&fch<='Z'))
			{
				if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
					str += ch;
					str = str.toLowerCase();
					count++;//累计字母
					t = 0;
					if (count >= 4) {
						endchar = 1;
					}
					
				}else if ((ch < '0' || ch >'9')) {
					if (t == 0 && count >= 4) {
						countw++;
						if(words.containsKey(str)) {
							words.compute(str,(key, value) ->value + 1);
						}else {
							words.put(str, 1);
						}
					}
					str = "";
					t = 1;
					count = 0;
					endchar = 0;
				}else {
					str += ch;
				}
			}
			if (endchar == 1) {
				countw++;
				if(words.containsKey(str)) {
					words.compute(str,(key, value) ->value + 1);
				}else {
					words.put(str, 1);
				}
			}
			//System.out.println("WordsRepeatNum:  "+countw);
		    //System.out.println("Words:            "+words);
			
		    //System.out.println("WordsSingleNum:  "+words.size());
			fw.write("words:  "+words.size() + "\n");
			bfr.close();
			fr.close();;
			fw.close();
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}

3.统计文件的有效行数

	public static void countLine() throws IOException{
		 
	    FileWriter fw = new FileWriter("f://output.txt",true);
	    File file = new File("F:\\input.txt");
		try {
			FileReader fr = new FileReader(file);
			BufferedReader bufr = new BufferedReader(fr);
			int i = 0;
			String s1 = null;
			while ((s1 = bufr.readLine()) != null)
			{
				i++;//累计行数
				if (s1.equals("")) {
					i--;
					//空白行不统计
				}
			}
			//System.out.println("lines:"+i);
	        fw.write("lines:"+ i + "\n");
			bufr.close();
			fr.close();
			fw.close();
		}catch (Exception e){
			e.printStackTrace();
		}
	 }

4.统计文件中各单词的出现次数

public static void countWordsSinglenum() throws IOException{
		FileWriter fw = new FileWriter("f://output.txt",true);
		File file = new File("F:\\input.txt");
		try {
			FileReader fr = new FileReader(file);
			BufferedReader bfr = new BufferedReader(fr);
					
			char ch;//当前字符
			int count = 0;//字母数量是否超过4个
			int t = 0 ;//是否有分隔符,有才能增加单词数
			int endchar = 0;//末尾无分隔符的单词也要加一
			int countw = 0;//英文单词数
			//String[] strArray={};
			String str = "";
			HashMap<String, Integer> words = new HashMap<String, Integer>();
			while ((ch = (char) bfr.read()) != (char)-1)//按字符读取文本内容&&((fch>='a'&&fch<='z')||(fch>='A'&&fch<='Z'))
			{
				if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
					str += ch;
					str = str.toLowerCase();
					count++;//累计字母
					t = 0;
					if (count >= 4) {
						endchar = 1;
					}
					
				}else if ((ch < '0' || ch >'9')) {
					if (t == 0 && count >= 4) {
						countw++;
						if(words.containsKey(str)) {
							words.compute(str,(key, value) ->value + 1);
						}else {
							words.put(str, 1);
						}
						str = "";
					}
					t = 1;
					count = 0;
					endchar = 0;
				}else {
					str += ch;
				}
			}
			if (endchar == 1) {
				countw++;
				if(words.containsKey(str)) {
					words.compute(str,(key, value) ->value + 1);
				}else {
					words.put(str, 1);
				}
			}
			//System.out.println("WordsRepeatNum:  "+countw);
		    //System.out.println("Words:            "+words);
			
		    //System.out.println("WordsSingleNum:  "+words.size());
	        //fw.write("Words:  "+words.size() + "\n");
		        
		        
		    //统计文件中各单词的出现次数(对应输出接下来10行),最终只输出频率最高的10个。
		    Collection<String> keyset= words.keySet();
		    List<String> list = new ArrayList<String>(keyset);
				 
			//对key键值按字典升序排序
			Collections.sort(list);
			
			Map<String, Integer> newMap = new LinkedHashMap<>();//全部字典序排序后
			for (int i = 0; i < list.size(); i++) {
				//System.out.println(list.get(i)+":"+words.get(list.get(i)));
			    newMap.put(list.get(i).toString() , words.get(list.get(i).toString()));
			 }
			
			Map<String, Integer> newMap2 = new LinkedHashMap<>();//再根据频率排序后取前10
			newMap2 = sortMap(newMap);
		       //System.out.println("SortWordsrank5:  "+newMap2);
			for (String s : newMap2.keySet()) {
		           //System.out.println(s + ": " + newMap2.get(s));
		        fw.write(s + ": " + newMap2.get(s) + "\n");
		       }
			bfr.close();
			fr.close();
			fw.close();
		}
		catch (Exception e) 
		{
			e.printStackTrace();
		}
	 }

单元测试










心路历程与收获

刚开始看到这么多没怎么接触的东西,就感觉很复杂,于是我便挑熟悉的先做,先完成代码功能,然后再按照作业要求,
一步一步的完成,快速上手git和github,在编写代码,一个一个完成所需要的功能后,也能从中收获喜悦,增加经验。

posted @ 2021-03-06 08:00  心动`  阅读(132)  评论(7编辑  收藏  举报