数组问题(课后作业)
Posted heartbeat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组问题(课后作业)相关的知识,希望对你有一定的参考价值。
一、动手动脑
1、qipan.java
(1)源代码
package Guidang6; import java.io.BufferedReader; import java.io.InputStreamReader; public class QiPan { //定义一个二维数组来充当棋盘 private String[][] board; //定义棋盘的大小 private static int BOARD_SIZE = 15; public void initBoard() { //初始化棋盘数组 board = new String[BOARD_SIZE][BOARD_SIZE]; //把每个元素赋为"╋",用于在控制台画出棋盘 for (int i = 0 ; i < BOARD_SIZE ; i++) { for ( int j = 0 ; j < BOARD_SIZE ; j++) { board[i][j] = "╋"; } } } //在控制台输出棋盘的方法 public void printBoard() { //打印每个数组元素 for (int i = 0 ; i < BOARD_SIZE ; i++) { for ( int j = 0 ; j < BOARD_SIZE ; j++) { //打印数组元素后不换行 System.out.print(board[i][j]); } //每打印完一行数组元素后输出一个换行符 System.out.print("\\n"); } } public static void main(String[] args)throws Exception { QiPan gb = new QiPan(); gb.initBoard(); gb.printBoard(); //这是用于获取键盘输入的方法 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String inputStr = null; System.out.println("请输入您下棋的座标,应以x,y的格式:"); //br.readLine():每当在键盘上输入一行内容按回车,刚输入的内容将被br读取到。 while ((inputStr = br.readLine()) != null) { //将用户输入的字符串以逗号(,)作为分隔符,分隔成2个字符串 String[] posStrArr = inputStr.split(","); //将2个字符串转换成用户下棋的座标 int xPos = Integer.parseInt(posStrArr[0]); int yPos = Integer.parseInt(posStrArr[1]); //把对应的数组元素赋为"●"。 gb.board[xPos - 1][yPos - 1] = "●"; /* 电脑随机生成2个整数,作为电脑下棋的座标,赋给board数组。 还涉及 1.座标的有效性,只能是数字,不能超出棋盘范围 2.如果下的棋的点,不能重复下棋。 3.每次下棋后,需要扫描谁赢了 */ gb.printBoard(); System.out.println("请输入您下棋的座标,应以x,y的格式:"); } } }
(2)、结果
(3)、流程
用for循环进行棋盘的输出,用二维数组,之后输入坐标,再进行替换。
二、汉化
(1)、数字转换成汉字的源代码
package Guidang6; import java.util.Scanner; public class Changnum { public static void main(String[] args) { Changnum t2r = new Changnum(); String s = t2r.cleanZero(t2r.numFormat((t2r.getNum()))); // 如果转换过后是一个空串,则不输出屏幕 if(!"".equals(s)) { System.out.println("转换成中文后为:" + s); } } private String getNum() { String s = null; System.out.println("请输入一个整数(非负数):"); // 从命令行输入这个数 Scanner scanner = new Scanner(System.in); s = scanner.next(); scanner.close(); return s; } private String numFormat( String s) { int sLength = s.length(); // 货币大写形式 String bigLetter[] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; // 货币单位 String unit[] = {" ", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千", "万"}; // 用来存放转换后的新字符串 String newS = ""; // 逐位替换为中文大写形式 for(int i = 0; i < sLength; i ++) { newS = newS + bigLetter[s.charAt(i) - 48] + unit[sLength - i - 1]; } return newS; } private String cleanZero(String s) { // 如果传入的是空串则继续返回空串 if("".equals(s)) { return ""; } // 如果用户开始输入了很多 0 去掉字符串前面多余的\'零\',使其看上去更符合习惯 while(s.charAt(0) == \'零\') { // 将字符串中的 "零" 和它对应的单位去掉 s = s.substring(2); // 如果用户当初输入的时候只输入了 0,则只返回一个 "零" if(s.length() == 0) { return "零"; } } // 字符串中存在多个\'零\'在一起的时候只读出一个\'零\',并省略多余的单位 String regex1[] = {"零千", "零百", "零十"}; String regex2[] = {"零亿", "零万"}; String regex3[] = {"亿", "万"}; // 第一轮转换把 "零仟", 零佰","零拾"等字符串替换成一个"零" for(int i = 0; i < 3; i ++) { s = s.replaceAll(regex1[i], "零"); } // 第二轮转换考虑 "零亿","零万","零元"等情况 // "亿","万","元"这些单位有些情况是不能省的,需要保留下来 for(int i = 0; i < 2; i ++) { // 当第一轮转换过后有可能有很多个零叠在一起 // 要把很多个重复的零变成一个零 s = s.replaceAll("零零零", "零"); s = s.replaceAll("零零", "零"); s = s.replaceAll(regex2[i], regex3[i]); } // 当"万"到"亿"之间全部是"零"的时候,忽略"亿万"单位,只保留一个"亿" s = s.replaceAll("亿万", "亿"); return s; } }
(2)、结果截图
2、数字汉化成大写的汉字
(1)、源代码
package Guidang6; import java.util.Scanner; public class Changrmb { public static void main(String[] args) { Changrmb t2r = new Changrmb(); String s = t2r.cleanZero(t2r.splitNum(t2r.roundString(t2r.getNum()))); // 如果转换过后是一个空串,则不输出屏幕 if(!"".equals(s)) { System.out.println("转换成中文后为:" + s); } } private String getNum() { String s = null; System.out.println("请输入一个数字(非负数,精确到小数点后两位):"); // 从命令行输入这个浮点数 Scanner scanner = new Scanner(System.in); s = scanner.next(); scanner.close(); return s; } /** * 把用户输入的数以小数点为界分割开来,并调用 numFormat() 方法 */ private String splitNum(String s) { // 如果传入的是空串则继续返回空串 if("".equals(s)) { return ""; } // 以小数点为界分割这个字符串 int index = s.indexOf("."); // 截取并转换这个数的整数部分 String intOnly = s.substring(0, index); String part1 = this.numFormat(1, intOnly); // 截取并转换这个数的小数部分 String smallOnly = s.substring(index + 1); String part2 = this.numFormat(2, smallOnly); // 把转换好了的整数部分和小数部分重新拼凑一个新的字符串 String newS = part1 + part2; return newS; } /** * 对传入的数进行四舍五入操作 * @param s String 从命令行输入的那个数 * @return 四舍五入后的新值 */ private String roundString(String s) { // 如果传入的是空串则继续返回空串 if("".equals(s)) { return ""; } // 将这个数转换成 double 类型,并对其进行四舍五入操作 int index = s.indexOf("."); // 这个数的整数部分 String intOnly = s.substring(0, index); // 规定数值的最大长度只能到万亿单位,否则返回 "0" if(intOnly.length() > 13) { System.out.println("输入数据过大!(整数部分最多13位!)"); return ""; } // 这个数的小数部分 String smallOnly = s.substring(index + 1); // 如果小数部分大于两位,只截取小数点后两位 if(smallOnly.length() > 2) { String roundSmall = smallOnly.substring(0, 2); // 把整数部分和新截取的小数部分重新拼凑这个字符串 s = intOnly + "." + roundSmall; } return s; } /** * 把传入的数转换为中文金额大写形式 */ private String numFormat(int flag, String s) { int sLength = s.length(); // 货币大写形式 String bigLetter[] = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; // 货币单位 String unit[] = {"元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万"}; String small[] = {"分", "角"}; // 用来存放转换后的新字符串 String newS = ""; // 逐位替换为中文大写形式 for(int i = 0; i < sLength; i ++) { if(flag == 1) { // 转换整数部分为中文大写形式(带单位) newS = newS + bigLetter[s.charAt(i) - 48] + unit[sLength - i - 1]; } else if(flag == 2) { // 转换小数部分(带单位) newS = newS + bigLetter[s.charAt(i) - 48] + small[sLength - i - 1]; } } return newS; } private String cleanZero(String s) { // 如果传入的是空串则继续返回空串 if("".equals(s)) { return ""; } // 如果用户开始输入了很多 0 去掉字符串前面多余的\'零\',使其看上去更符合习惯 while(s.charAt(0) == \'零\') { // 将字符串中的 "零" 和它对应的单位去掉 s = s.substring(2); // 如果用户当初输入的时候只输入了 0,则只返回一个 "零" if(s.length() == 0) { return "零圆"; } } // 字符串中存在多个\'零\'在一起的时候只读出一个\'零\',并省略多余的单位 String regex1[] = {"零仟", "零佰", "零拾"}; String regex2[] = {"零亿", "零万", "零元"}; String regex3[] = {"亿", "万", "元"}; String regex4[] = {"零角", "零分"}; // 第一轮转换把 "零仟", 零佰","零拾"等字符串替换成一个"零" for(int i = 0; i < 3; i ++) { s = s.replaceAll(regex1[i], "零"); } // 第二轮转换考虑 "零亿","零万","零元"等情况 // "亿","万","元"这些单位有些情况是不能省的,需要保留下来 for(int i = 0; i < 3; i ++) { // 当第一轮转换过后有可能有很多个零叠在一起 // 要把很多个重复的零变成一个零 s = s.replaceAll("零零零", "零"); s = s.replaceAll("零零", "零"); s = s.replaceAll(regex2[i], regex3[i]); } // 第三轮转换把"零角","零分"字符串省略 for(int i = 0; i < 2; i ++) { s = s.replaceAll(regex4[i], ""); } // 当"万"到"亿"之间全部是"零"的时候,忽略"亿万"单位,只保留一个"亿" s = s.replaceAll("亿万", "亿"); return s; } }
(2)、结果截图
三、大数类
(1)、源代码
package Guidang6; import java.util.Scanner; public class Dashu { public static void main(String[] args) { // TODO Auto-generated method stub String s1,s2; Scanner in=new Scanner(System.in); System.out.println("输入第一个大数:"); s1=in.next(); System.out.println("输入第二个大数:"); s2=in.next(); System.out.println(add(s1,s2)); System.out.println(sub(s1,s2)); in.close(); } private static String add(String a, String b) { System.out.print("加法结果:"); char[] aa = new StringBuffer(a).reverse().toString().toCharArray(); char[] bb = new StringBuffer(b).reverse().toString().toCharArray(); int aLen = aa.length; int bLen = bb.length; int len = aLen > bLen ? aLen : bLen; int[] result = new int[len + 1]; for (int i = 0; i < len + 1; ++i) { int aint = i < aLen ? aa[i] - \'0\' : 0; int bint = i < bLen ? bb[i] - \'0\' : 0; result[i] = aint + bint; } for(int i=0;i<result.length-1;++i){ if(result[i]>=10){ result[i+1] += result[i]/10; result[i] %= 10; } } boolean flag = true; StringBuffer sb = new StringBuffer(len); for(int i=len;i>=0;--i){ if(result[i]==0&&flag){ continue; } else{ flag=false; } sb.append(result[i]); } return sb.toString(); } public static String sub(String f, String s) { System.out.print("减法结果:"); // 将字符串翻转并转换成字符数组 char[] a = new StringBuffer(f).reverse().toString().toCharArray(); char[] b = new StringBuffer(s).reverse().toString().toCharArray(); int lenA = a.length; int lenB = b.length; // 找到最大长度 int len = lenA > lenB ? lenA : lenB; int[] result = new int[len]; // 表示结果的正负 char sign = \'+\'; // 判断最终结果的正负 if (lenA < lenB) { sign = \'-\'; } else if (lenA == lenB) { int i = lenA - 1; while (i > 0 && a[i] == b[i]) { i--; } if (a[i] < b[i]) { sign = \'-\'; } } // 计算结果集,如果最终结果为正,那么就a-b否则的话就b-a for (int i = 0; i < len; i++) { int aint = i < lenA ? (a[i] - \'0\') : 0; int bint = i < lenB ? (b[i] - \'0\') : 0; if (sign == \'+\') { result[i] = aint - bint; } else { result[i] = bint - aint; } } // 如果结果集合中的某一位小于零,那么就向前一位借一,然后将本位加上10。其实就相当于借位做减法 for (int i = 0; i < result.length - 1; i++) { if (result[i] < 0) { result[i + 1] -= 1; result[i] += 10; } } StringBuffer sb = new StringBuffer(); // 如果最终结果为负值,就将负号放在最前面,正号则不需要 if (sign == \'-\') { sb.append(\'-\'); } // 判断是否有前置0 boolean flag = true; for (int i = len - 1; i >= 0; i--) { if (result[i] == 0 && flag) { continue; } else { flag = false; } sb.append(result[i]); } // 如果最终结果集合中没有值,就说明是两值相等,最终返回0 if (sb.toString().equals("")) { sb.append("0"); } // 返回值 System.out.println(sb.toString()); return ""; } }
(2)、结果截图
(3)、阅读BigInteger类源码,弄清楚它是使用什么算法实现加减乘除四种运算的
BigInteger是不可变的任意精度的整数。所有操作中,都以二进制补码形式表示 BigInteger(如 Java 的基本整数类型)。BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。另外,BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、位操作以及一些其他操作。
四、随机数组
(1)、源代码
package Guidang6; import javax.swing.JOptionPane; public class Shuzu { public static void main(String[] args) { // TODO 自动生成的方法存根 int[] arr = new int[10];//定义数组 int num=0; String output=""; for(int i=0;i<10;i++){//循环赋值 arr[i] = (int)(Math.random()*10);//随机0-10范围内的整数 } output+="十个元素:"+"\\n"; for(int i=0;i<10;i++)//循环输出 { output+=arr[i]+" "; num=num+arr[i]; } output+="\\n"; output+="十个元素相加结果:"+"\\n"; output+=num; JOptionPane.showMessageDialog( null,output, "数组",JOptionPane.PLAIN_MESSAGE); } }
(2)、设计思路
首先定义一个长度为十的数组,在运用for循环进行数组的赋值,赋值运用随机数发生器赋值,最后再运用消息框输出结果。
(3)程序流程图
(4)结果截图
以上是关于数组问题(课后作业)的主要内容,如果未能解决你的问题,请参考以下文章