汉字编程——第一次个人编程作业
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzzcxy/SE |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzzcxy/SE/homework/10283 |
这个作业的目标 | 汉字编程 |
作业正文 | GitHub链接 |
其他参考文献 | ... |
记录
代码行数:274 326
需求分析时间:10分钟吧。。
编码时间:目前一天了 一天半
完整代码可以在Github查看,连接在上方
分解思路
首先
根据之后代码的需求写了类似几个这样的方法,这些方法都是在数字与字符串,数字与字符,字符串与数字之间的转换用的,以供主函数的调用
int setnum(String arr) {
switch(arr) {
case "零" :
return 0;
case "一" :
return 1;
case "二" :
return 2;
case "三" :
return 3;
case "四" :
return 4;
case "五" :
return 5;
case "六" :
return 6;
case "七" :
return 7;
case "八" :
return 8;
case "九" :
return 9;
case "十" :
return 10;
default :
System.out.println("输入有误");
}
return 0;
}
String Jsetnum(int d) {
switch(d) {
case 1 :
return "十";
case 2 :
return "百";
case 3 :
return "千";
case 4 :
return "万";
default :
System.out.println("输入有误");
}
return null;
}
然后
输入采用scanner
Scanner w = new Scanner(System.in);
主体都在循环中完成,
第一行是取得输入的汉字,
第二行利用正则将得到的汉字按空格分开存进数组
在最后因为写的是无线循环,所以在最后补了一个退出循环的条件
while (true) {
String result = w.nextLine();// 取出输入的字符串
String arr[] = result.split("\\s+");// 正则按空格匹配
。。。。。。
if(arr[0].equals("esc"))
break;
}
主体
这段主体现在已经可以实现:
汉字定义段:不限于正数十以内,目前只能实现一个定义(已完成,可以实现多个变量定义)
汉字运算段:不限于正数十以内
汉字输出段:不限于正数十以内
汉字如果判断段:正数十以内(需要的话可以再补充到十开外= =)
if (arr.length == 4) { // 识别定义
if(arr[3].length()==1)//区别个位十位
wd = p.setnum(arr[3]);
else if (arr[3].length() > 1) {
kk = "";
for (i = 0; i < arr[3].length(); i++) {
if (arr[3].charAt(0) == '负')
i++;
if (arr[3].charAt(i) == '十' || arr[3].charAt(i) == '百' || arr[3].charAt(i) == '千'
|| arr[3].charAt(i) == '万') {
i++;
if (i == arr[3].length()) {
kk = kk + '0';
wd = Integer.parseInt(kk);
break;
}
}
kk = kk + p.Csetnum(arr[3].charAt(i));
wd = Integer.parseInt(kk);
}
if (arr[3].charAt(0) == '负')
wd = 0 - wd;
}
}
else if (arr.length == 3) { // 识别运算
if (arr[2].length() == 1) {
if (arr[1].equals("增加")) {
wd = wd + p.setnum(arr[2]);
}
if (arr[1].equals("减少")) {
wd = wd - p.setnum(arr[2]);
}
}
else if(arr[2].length() > 1) {
kk = "";
for (i = 0; i < arr[2].length(); i++) {
if (arr[2].charAt(0) == '负')
i++;
if (arr[2].charAt(i) == '十' || arr[2].charAt(i) == '百' || arr[2].charAt(i) == '千'
|| arr[2].charAt(i) == '万') {
i++;
if (i == arr[2].length()&&arr[2].charAt(i-1) == '十') {
kk = kk + '0';
t = Integer.parseInt(kk);
break;
}
if (i == arr[2].length()&&arr[2].charAt(i-1) == '百') {
kk = kk + "00";
t = Integer.parseInt(kk);
break;
}
if (i == arr[2].length()&&arr[2].charAt(i-1) == '千') {
kk = kk + "000";
t = Integer.parseInt(kk);
break;
}
if (i == arr[2].length()&&arr[2].charAt(i-1) == '万') {
kk = kk + "0000";
t = Integer.parseInt(kk);
break;
}
}
kk = kk + p.Csetnum(arr[2].charAt(i));
t = Integer.parseInt(kk);
}
if (arr[2].charAt(0) == '负')
t = 0 - t;
if (arr[1].equals("增加")) {
wd = wd + t;
}
if (arr[1].equals("减少")) {
wd = wd - t;
}
}
}
else if (arr.length == 2) { //识别输出
kk="";
if(wd>=0&&wd<=10)//区别个位十位
System.out.println(p.Fsetnum(wd));
else if(wd<0){
wd=0-wd;
System.out.print("负");
kk=String.valueOf(wd);
for (i = 0; i < kk.length(); i++) {
if(i!=0)//十百千万单位
System.out.print(p.Jsetnum(i));
System.out.print(p.Zsetnum(kk.charAt(i)));
}
wd=0-wd;
System.out.println();
}
else {//大于10
k=wd;
for(j=0;k!=0;j++)
k=k/10;
j--;
kk=String.valueOf(wd);
for (i = 0; i < kk.length(); i++) {
System.out.print(p.Zsetnum(kk.charAt(i)));
if(kk.charAt(i)=='0')//零后无单位,一百零五
j--;
if(j!=0) {//十百千万单位
System.out.print(p.Jsetnum(j));
j--;
}
}
System.out.println();
}
}
else if (arr.length == 10) { //识别判断
kk="";
if (wd > p.setnum(arr[3])) {
for (i = 0; i < arr[6].length(); i++) {
if(arr[6].charAt(i)!='“' && arr[6].charAt(i)!='”')
kk = kk+arr[6].charAt(i);
}
System.out.println(kk);
}
else {
for (i = 0; i < arr[9].length(); i++) {
if(arr[9].charAt(i)!='“' && arr[9].charAt(i)!='”')
kk = kk+arr[9].charAt(i);
}
System.out.println(kk);
}
}
测试
学习过程
通过百度查找,了解到字符串可以通过.split("\s+")的方式按空格分别读取,通过.charAt(i)可以一个个读取字符串里的字符
改进
因为样例2比原本的复杂做了一些小改进,大体的代码没有改变。
我在循环体里的头部加了两个标记数组(已用红色标出),
String brr[]= new String[10];//放置定义变量的数组,变量个数取决于数组大小
int crr[] = new int[10];//存放对应变量的数据
再用for循环去做变量的查重,如果brr数组没有相同的,那么标记符号f就等于1,将新变量存放进brr数组里,
这样就完成了多个变量的存放,然后每一个变量对应的值都存放在crr数组中,需要哪个变量就到crr数组寻找对应的值
for (f = 1, n = 0; n <= m; n++) {// 定义变量查重
if (f == 1) {//记录新的变量
主体代码都是对于新加的两个数组brr,crr,稍微进行的一些修改
String result = w.nextLine();// 取出输入的字符串
String arr[] = result.split("\\s+");// 正则按空格匹配
String brr[]= new String[10];//放置定义变量的数组,变量个数取决于数组大小
int crr[] = new int[10];//存放对应变量的数据
if (arr.length == 4) { // 识别定义
for (f = 1, n = 0; n <= m; n++) {// 定义变量查重
if (arr[1].equals(brr[n])) {
f = 0;
break;
}
}
if (f == 1) {//记录新的变量
brr[m] = arr[1];
m++;
}
if(arr[3].length()==1)//区别个位十位
wd = p.setnum(arr[3]);
else if (arr[3].length() > 1) {
kk = "";
for (i = 0; i < arr[3].length(); i++) {
if (arr[3].charAt(0) == '负')
i++;
if (arr[3].charAt(i) == '十' || arr[3].charAt(i) == '百' || arr[3].charAt(i) == '千'
|| arr[3].charAt(i) == '万') {
i++;
if (i == arr[3].length()) {
kk = kk + '0';
wd = Integer.parseInt(kk);
break;
}
}
kk = kk + p.Csetnum(arr[3].charAt(i));
wd = Integer.parseInt(kk);
}
if (arr[3].charAt(0) == '负')
wd = 0 - wd;
}
if(f==1) {//对应变量记录数据
crr[m]=wd;
}
else {
crr[n]=wd;
}
}