汉字编程——第一次个人编程作业

这个作业属于哪个课程 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;
                }
            }

运行截图

汉字编程——第一次个人编程作业