中文编程作业
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzzcxy/SE |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzzcxy/SE/homework/10283 |
作业代码位置 | https://github.com/irvingming11/Annotation.git |
这个作业的目标 | 完成中文编程作业,然后将代码上传至github仓库,加入gitignore文件和开源license |
作业正文 | 如下 |
其他参考文献 | 百度 |
||
|-- |-- |
|代码行数|388行|
|需求分析时间|一个小时|
|编码时间|取整一天半|
1.记录自己的代码行数,需求分析时间,编码时间。
代码是用java编写的,创建了五个类,总代码行数388行,需求分析先粗略分析了,后期编码过程中对存在的问题又不断的进行改进和分析,编码时间比较零散,整得来算一天半
2.分解需求的思路,分解成多个模块,并阐述为什么这么分,优势在哪,可以附上代码片段。
分解需求的思路是将需求分为五个模块:
1.变量声明:
2.变量运算
3.看看变量
4.条件判断
5.输入错误
选择这么划分是因为有四种固定的句型,然后输入错误模块是为了给用户提供交互,一旦输入错误会给用户提供错误信息,详细代码如下。
五个模块封装在run方法里面,分别对应着一个if else。程序还封装了四个类,Number,Arithmetic,Print,Variable。Number是处理数字的将中文数字和数学数字之间进行转换,Arithmetic是负责处理计算的,Print负责打印输出,Varible是对变量进行处理,包括三个参数varType,varName,varValue。因为希望程序后期不光可以支持整数类型,所以设置了varType。
public static void run(String input, int i, Scanner sc, ArrayList<Variable> list1) {
Object chineseNumber;
Variable var;
// 变量声明部分
if (input.equals("整数")) {
// 获取变量名
String var_name = sc.next();
// 判断变量是否已经声明
var = findVar(var_name, input, list1);
// 获取对变量进行的操作
String change = sc.next();
if ("等于".equals(change)) {
chineseNumber = sc.next();
Number n = new Number();
// 将中文数字转换成英文
int number = n.findNumber(chineseNumber);
if (number >= 0 && number <= 10) {
var.setVarValue(number);
// 将变量添加进list
list1.add(var);
} else {
System.out.println("第" + i + "行变量赋值必须在0-10之间,请重新声明赋值");
}
} else {
sc.next();
System.out.println("第" + i + "行的变量声明有误,请重新声明赋值");
}
} else if (findVar(input, list1) != null) {
// 变量计算部分
var = findVar(input, list1);
String change = sc.next();
String chinese_number = sc.next();
Number n = new Number();
int number = n.findNumber(chinese_number);
Arithmetic arith = new Arithmetic(change);
// 判断对变量进行的计算
arith.judgeOperator(number, var, i);
} else if ("看看".equals(input)) {
// 看看变量部分
String name = sc.next();
var = findVar(name, list1);
Print p = new Print(input, name);
// 打印变量
p.print(var, p, i, list1);
} else if ("如果".equals(input)) {
// 条件判断部分
String sentence = sc.nextLine();
String[] subString1 = sentence.split("否则");
String[] subString2 = subString1[0].split("则");
String[] name = subString2[0].split(" ");
var = findVar(name[1], list1);
if (var != null) {
Arithmetic arith = new Arithmetic();
arith.result(subString2[0], subString2[1], subString1[1], var, i, sc, list1);
} else {
System.out.println("第" + i + "行的" + name[1] + "变量未进行声明");
}
} else {
System.out.println("第" + i + "行的" + input + "变量未进行声明");
}
}
3.记录不会的知识的学习过程以及修改优化的过程;可以附上资料网站。
第一次程序完工,是按照样例一来进行编写的,当时是采用批处理的思想对每一条语句先存储在一个HashMap里然后每一个中文作为HashMap里面的Key,但是后来发现并不太可取,又将HashMap改成了List,将每天语句存储在List里面。后期在测试的时候,突然想到所有程序运行一条语句一条语句的运行,然后进行了一次大改之后就初步完成了现在的程序,但是现在的程序仍然存在不足的地方:
1.因为作业时间原因,还没有对代码进行优化,程序可能存在进一步优化的问题,比如,没有进行一些类之间的继承关系等,后期花时间整改一下代码肯定会更简洁
2.现在的程序不支持直接 “变量 等于 数字”这种赋值方式
3.现在的程序存在隐患,如果用户输入的时候不小心多敲了一个空格,程序就无法读取成功,后期需要解决两次输入之间的多空格问题。
4.如果……则……否则……这个固定句型中还不支持对两个变量之间的比较,只支持变量和数之间的比较。
运行结果如下: