软工实践寒假作业(2/2)
基本信息
这个作业属于哪个课程 | 2021春软件工程实践S班(福州大学) |
---|---|
这个作业要求在哪里 | 软工实践寒假作业(2/2) |
这个作业的目标 | 学习使用git以及github,高效系统编程 |
其他参考文献 | 《构建之法》 |
目录:
part1:阅读《构建之法》并提问
Q1
> 分析麻痹:一种极端情况是想弄清楚所有细节、所有依赖关系之后再动手,心理上过于悲观,不想修复问题,出了问题都赖在相关问题上。分析太多,腿都麻了,没法起步前进,故得名“分析麻痹”(Analysis Paralysis)。
- 当我看到这里时,就不太明白为什么弄清楚所有细节是极端情况?不正是因为细节处理得好,才能使程序更完善么?老话不是也说细节决定成败么?
- 不单单是从程序上考虑,从提高编程能力出发,不也正是因为许多细节上的考虑,才让我们的编程能力更为经验老道,得到提高么?
Q2
> 7. 理性地工作:软件开发有很多个人的、感情驱动的因素,但是一个成熟的团队成员必须从事实和数据出发,按照流程,理性地工作。很多人认为自己需要灵感和激情,才能为宏大的目标奋斗,才能成为专业人士。著名的艺术家Chuck Close说:我总觉得灵感是属于业余爱好者的。我们职业人士只是每天持续工作。今天你继续昨天的工作,明天你继续今天的工作,最终你会有所成就”。
- 当我看到这里时,就不太明白为什么只是完成每天的工作任务,最终就会有所成就?如果工作的内容一成不变,对编程技巧,对个人的进步无太大效果,又怎会有所成就?
- 按时按质按量完成所需工作量当然是必须的,但我们如果还想要提高自己的能力,竞争力,我们就不该仅仅觉得那样最后真能有所成就,而是多思考自身的能力局限,和应该努力提高的方面,并真正往其中下功夫
part2:WordCount编程
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,在编写代码,一个一个完成所需要的功能后,也能从中收获喜悦,增加经验。