1>数组作为方法参数

阅读并运行示例PassArray.java,观察并分析程序输出的结果,小结,然后与下页幻灯片所讲的内容进行对照。

源代码:

// PassArray.java
// Passing arrays and individual array elements to methods public class PassArray { public static void main(String[] args) {
int a[] = { 1, 2, 3, 4, 5 };
String output = "The values of the original array are:\n"; for (int i = 0; i < a.length; i++)
output += " " + a[i]; output += "\n\nEffects of passing array " + "element call-by-value:\n"
+ "a[3] before modifyElement: " + a[3]; modifyElement(a[3]); output += "\na[3] after modifyElement: " + a[3]; output += "\n Effects of passing entire array by reference"; modifyArray(a); // array a passed call-by-reference output += "\n\nThe values of the modified array are:\n"; for (int i = 0; i < a.length; i++)
output += " " + a[i]; System.out.println(output);
} public static void modifyArray(int b[]) {
for (int j = 0; j < b.length; j++)
b[j] *= 2;
} public static void modifyElement(int e) {
e *= 2;
} }

运行结果:

实验分析:

引用传递:如果方法中有代码更改了数组元素的值,则直接修改了原始的数组元素,因为它将其地址传过去,原来地址所存储的数据已经改变。

按值传递:方法体中修改的仅是原始数组元素的一个拷贝,只是将数据的值传递过去进行运算,原来的数据值不变。

2>以下代码的输出结果是什么?为什么会有这个结果?

源代码:

public class ArrayInRam {
public static void main(String[] args) {
// 定义并初始化数组,使用静态初始化
int[] a = { 5, 7, 20 };
System.out.println("a数组中的元素:");
// 循环输出a数组的元素
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + ",");
}
// 定义并初始化数组b,使用动态初始化
int[] b = new int[4];
// 输出b数组的长度
System.out.println("\nb数组的初始长度为:" + b.length);
// 因为a是int[]类型,b也是int[]类型,所以可以将a的值赋给b。
// 也就是让b引用指向a引用指向的数组
b = a;
System.out.println("b=a,赋值之后,b数组的元素为:");
// 循环输出b数组的元素
for (int i = 0; i < b.length; i++) {
System.out.print(b[i] + ",");
} // 再次输出b数组的长度
System.out.println("\n赋值之后,b数组的长度为:" + b.length);
}
}

运行结果:

实验分析:

b = a 赋值不是将a的值赋值给b,而是将对象整体赋值给b,将a的地址传递给b,b指向a的内存空间,所以b的长度与a相等。

3>阅读程序WhatDoesThisDo.java, 解释程序所完成的功能。

public class WhatDoesThisDo {
static int result;
static String output; public static void main(String[] args) {
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
result = whatIsThis(a, a.length);
output = "Result is: " + result;
System.out.println(output);
} public static int whatIsThis(int b[], int size) {
if (size == 1)
return b[0];
else
return b[size - 1] + whatIsThis(b, size - 1);
}
}

运行结果:

实验分析:
递归实现数组内各个数的和。

4>阅读程序WhatDoesThisDo2.java, 解释程序所完成的功能。

public class WhatDoesThisDo2 {
public static void main(String[] args) {
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
StringBuilder sbBuilder=new StringBuilder();
someFunction(a, 0, sbBuilder);
System.out.println(sbBuilder);
}
public static void someFunction(int b[], int x, StringBuilder out) {
if (x < b.length) {
someFunction(b, x + 1, out);
out.append(b[x] + " ");
}
}
}

运行结果:

实验分析:

递归实现数组内数据逆序输出。

5>Arrays类中的静态方法

运行TestArrays.java,了解Arrays中的一些重要方法的用法。

import java.util.*;

public class TestArrays
{
public static void main(String[] args)
{
//定义一个a数组
int[] a = new int[]{3, 4 , 5, 6};
//定义一个a2数组
int[] a2 = new int[]{3, 4 , 5, 6};
//a数组和a2数组的长度相等,每个元素依次相等,将输出true
System.out.println("a数组和a2数组是否相等:" + Arrays.equals(a , a2));
//通过复制a数组,生成一个新的b数组 int[] b = Arrays.copyOf(a, 6);
System.out.println("a数组和b数组是否相等:" + Arrays.equals(a , b));
//输出b数组的元素,将输出[3, 4, 5, 6, 0, 0]
System.out.println("b数组的元素为:" + Arrays.toString(b));
//将b数组的第3个元素(包括)到第5个元素(不包括)赋为1
Arrays.fill(b , 2, 4 , 1);
//输出b数组的元素,将输出[3, 4, 1, 1, 0, 0]
System.out.println("b数组的元素为:" + Arrays.toString(b));
//对b数组进行排序
Arrays.sort(b);
//输出b数组的元素,将输出[0, 0, 1, 1, 3, 4]
System.out.println("b数组的元素为:" + Arrays.toString(b));
}
}
运行结果:
实验分析:
Arrays.equals(a , a2):判断两数组数据值是否相等。
Arrays.copyOf(T[] original, int newLength):通过复制原数组,生成一个新的数组,长度为newLength。
Arrays.toString(b):将数组转化为字符串输出。
Arrays.fill(b , 2, 4 , 1):将数组b中3到5的元素用1来填充。
Arrays.sort(b):将数组b进行排序。
6>阅读QiPan.java示例程序了解如何利用二维数组和循环语句绘制五子棋盘。

 
 

源程序:
import java.io.*;

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的格式:");
}
}
}

运行结果:

实验分析:

利用二维数组绘制棋盘并规定棋盘大小即二维数组的行和列;利用双层循环语句为二维数组赋值;输出数组时也要利用双层循环语句但要注意换行问题。

7>请编写一个程序将一个整数转换为汉字读法字符串。比如“1123”转换为“一千一百二十三”。

源程序:

public class Num1Rmb
{
private String[] hanArr = {"零" , "一" , "二" , "三" , "四" ,
"五" , "六" , "七" , "八" , "九"};
private String[] unitArr = {"十" , "百" , "千","万","十万","百万"}; /**
* 把一个四位的数字字符串变成汉字字符串
* @param numStr 需要被转换的四位的数字字符串
* @return 四位的数字字符串被转换成的汉字字符串。
*/
private String toHanStr(String numStr)
{
String result = "";
int numLen = numStr.length();
//依次遍历数字字符串的每一位数字
for (int i = 0 ; i < numLen ; i++ )
{
//把char型数字转换成的int型数字,因为它们的ASCII码值恰好相差48
//因此把char型数字减去48得到int型数字,例如'4'被转换成4。
int num = numStr.charAt(i) - 48;
//如果不是最后一位数字,而且数字不是零,则需要添加单位(千、百、十)
if ( i != numLen - 1 && num != 0)
{
result += hanArr[num] + unitArr[numLen - 2 - i];
}
//否则不要添加单位
else
{ //上一个数是否为“零”,不为“零”时就添加
if(result.length()>0 && hanArr[num].equals("零") && result.charAt(result.length()-1)=='零')
continue;
result += hanArr[num];
}
}
//只有个位数,直接返回
if(result.length()==1)
return result; int index=result.length()-1;
while(result.charAt(index)=='零'){
index--;
}
if(index!=result.length()-1)
return result.substring(0,index+1);
else {
return result;
}
} public static void main(String[] args)
{
Num1Rmb nr = new Num1Rmb();
System.out.println("只支持整数(0~百万)");
//测试把一个四位的数字字符串变成汉字字符串
System.out.println(nr.toHanStr("1123"));
运行结果:
实验分析:
利用数组将数字大写形式以及个十百千等表示出来,注意遇到0以及个位数的判断。
8>更进一步,能否将数字表示的金额改为“汉字表达? 比如将“¥123.52”转换为“壹佰贰拾叁元伍角贰分”。
源代码:
//将数字表示的金额改为“汉字表达? 比如将“¥123.52”转换为“壹佰贰拾叁元伍角贰分”。
public class Num1Rmb
{
private String[] hanArr = {"零" , "壹" , "贰" , "叁" , "肆" ,
"伍" , "陆" , "柒" , "捌" , "玖"};
private String[] unitArr = {"分","角","元","拾" ,"佰" , "千","万","十万","百万"}; private String toHanStr(String numStr)
{ String result = "";
int point = numStr.indexOf(".");
String integer = numStr.substring(0,point);//取该字符串整数部分
String decimal = numStr.substring(point+1);//取该字符串小数部分
String newNum = integer + decimal;//合成一个新的字符串
int numLen = newNum.length();
//依次遍历数字字符串的每一位数字
for (int i = 0 ; i < numLen ; i++ )
{
//把char型数字转换成的int型数字,因为它们的ASCII码值恰好相差48
//因此把char型数字减去48得到int型数字,例如'4'被转换成4。
int num = newNum.charAt(i) - 48;
//如果不是最后一位数字,而且数字不是零,则需要添加单位(千、百、十)
if ( num != 0)
{
result += hanArr[num] + unitArr[numLen -1 - i];
}
//否则不要添加单位
else
{ //上一个数是否为“零”,不为“零”时就添加
if(result.length()>0 && hanArr[num].equals("零") && result.charAt(result.length()-1)=='零')
continue;
result += hanArr[num];
}
}
//只有个位数,直接返回
if(result.length()==1)
return result; int index=result.length()-1;
while(result.charAt(index)=='零'){
index--;
}
if(index!=result.length()-1)
return result.substring(0,index+1);
else {
return result;
}
} public static void main(String[] args)
{
Num1Rmb nr = new Num1Rmb();
System.out.println("(只支持两位小数,整数部分只支持百万)");
//测试把一个四位的数字字符串变成汉字字符串
System.out.println(nr.toHanStr("1.00"));
System.out.println(nr.toHanStr("10.01"));
System.out.println(nr.toHanStr("123.52"));
System.out.println(nr.toHanStr("1000.56")); }
}

运行结果:

实验分析:

只需在上一个程序上稍作修改,将小数点去掉合成一个新的字符串,并在数组中添加“角”“分”“元”即可。

9>前面几讲介绍过JDK所提供的BigInteger能完成大数计算,如果不用它,直接使用数组表达大数,你能实现相同的功能吗?

源代码:
//大数类实现加和减两个功能
class BigNum{
private char[] number = {'0','1','2','3','4','5','6','7','8','9'};
public String Largenum(String s)
{
String result = "";
int sLen = s.length();
for(int i = 0; i < sLen; i++)
{
for(int j = 0; j < 10; j++)
{
if(s.charAt(i) == number[j])
result += number[j];
}
}
return result;
}
public String plus(String s1,String s2)
{
String result1 = "";
String result = "";//要返回的结果
String longnumber = "";//位数较大的数
String shortnumber = "";//位数较小的数
String surplus = "";//多出来的数
int s1Len = s1.length();
int s2Len = s2.length();
if(s1Len>s2Len)
{
shortnumber = s2;
int m = s1Len - s2Len;
for(int i = 0;i < m;i++)
{surplus += s1.charAt(i);}//将s1比s2多出来的数据用surplus暂时存储
for(int j = m;j < s1.length(); j++)
{longnumber += s1.charAt(j);}//将s1剩下的数据用longnumber暂时存储
}
else if(s1Len<s2Len)
{
shortnumber = s1;
int n = s2Len - s1Len;
for(int i = 0;i < n;i++)
{surplus += s2.charAt(i);}//将s2比s1多出来的数据用surplus暂时存储
for(int j = n;j < s2.length(); j++)
{longnumber += s2.charAt(j);}//将s2剩下的数据用longnumber暂时存储
}
else//两数据长度相等
{
shortnumber = s1;
longnumber = s2;
}
boolean flag = true;
int p = 0,q = 0,L = 0;
for(int i = longnumber.length()-1; i >= 0; i--)//从个位开始计算
{
if(flag)
{
//把每个位强制转化为整数再相加
p = shortnumber.charAt(i) - '0';
q = longnumber.charAt(i) - '0';
L = p + q;
}
else
{
//如果上一个位数两数相加大于10,则加1
p = shortnumber.charAt(i) - '0';
q = longnumber.charAt(i) - '0';
L = p + q + 1;
}
if(L>=10 && i!=0)
{
String temp = String.valueOf(L);
result1 += temp.charAt(1);
flag = false; }
else if(i == 0)
{
String temp = String.valueOf(L);
result1 += temp.charAt(1);
result1 += temp.charAt(0);
}
else
{
result1 += (char)(L+48);
flag = true;
}
}
for(int i = result1.length()-1; i >= 0;i--)
{
result += result1.charAt(i);
}
if(s1Len!=s2Len)
{
result = surplus + result;
}
return result;
}
public String subtraction(String s1,String s2)
{
String result = "";
String result1 = "";
String longnumber = "";//位数较大的数
String shortnumber = "";//位数较小的数
String surplus = "";//多出来的数
int s1Len = s1.length();
int s2Len = s2.length();
if(s1Len>s2Len)
{
shortnumber = s2;
int m = s1Len - s2Len;
for(int i = 0;i < m;i++)
{surplus += s1.charAt(i);}//将s1比s2多出来的数据用surplus暂时存储
for(int j = m;j < s1.length(); j++)
{longnumber += s1.charAt(j);}//将s1剩下的数据用longnumber暂时存储
}
else if(s1Len<s2Len)
{
shortnumber = s1;
int n = s2Len - s1Len;
for(int i = 0;i < n;i++)
{surplus += s2.charAt(i);}//将s2比s1多出来的数据用surplus暂时存储
for(int j = n;j < s2.length(); j++)
{longnumber += s2.charAt(j);}//将s2剩下的数据用longnumber暂时存储
}
else//两数据长度相等
{
longnumber = s1;
shortnumber = s2;
}
int p = 0,q = 0,L = 0,x = 0;
boolean flag = true;
for(int i = longnumber.length()-1;i>=0;i--)
{
if(flag)
{
p = longnumber.charAt(i) - '0';
q = shortnumber.charAt(i) - '0';
}
else
{
p = longnumber.charAt(i) - '0'-1;//被上一个运算借走1
q = shortnumber.charAt(i) - '0';
}
if(p>=q && i != 0)
{
L = p - q;
result1 += (char)(L+48);
flag = true;
}
else if(p < q && i == 0)//向多余的数中借了1
{
L = p + 10 - q;
result1 += (char)(L+48);
x = 1;
flag = false;
}
else
{
L = p + 10 - q;
result1 += (char)(L+48);
flag = false;
}
}
for(int i = result1.length()-1; i >= 0;i--)
{
result += result1.charAt(i);
}
if(s1Len!=s2Len)
{
if(x == 1)
{
int ch ;
ch = surplus.charAt(surplus.length()-1)- '0';
ch -= 1;
String surplus2 = "";
for(int y = 0;y < surplus.length()-1;y++)
{
surplus2 += surplus.charAt(x);
}
surplus2 += (char)(ch+48);
result = surplus2 + result;
}
else
{
result = surplus + result;
} }
return result;
}
}
public class BigNumber { public static void main(String[] args) {
// TODO Auto-generated method stub
BigNum num = new BigNum();
System.out.println(num.Largenum("1234567890987654321"));
System.out.println(num.plus("9123456789", "2456123987"));
System.out.println(num.subtraction("9087654321", "123456789"));
} }

运行结果:

实验分析:

利用数组实现大数的表示;大数的加减即将数的每个位分开计算,相加大于10或不够减分情况讨论即可。

10>随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中。

设计思路:

通过for循环对数组内每一个数通过随机函数赋值,然后利用output按格式连接输出,编写方法实现数组内数据加和,然后用消息弹框形式输出。

程序流程图:


源程序代码:
//随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中。
import javax.swing.JOptionPane;
import javax.swing.JTextArea; public class RandomAdd { public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = new int[10];
String output = "";
output += "Subscript\tValue\n";
for(int i =0;i<10;i++)
{
a[i] = 1+(int)(Math.random()*100);
output += i + "\t" + a[ i ] + "\n";
}
int result = 0;
String output2 = "";
result = whatIsThis(a, a.length);
output2 += "数组元素和为" + result;
JTextArea outputArea = new JTextArea( 11, 10 );
outputArea.setText( output ); JOptionPane.showMessageDialog( null, outputArea,
"Random Array",
JOptionPane.INFORMATION_MESSAGE );
JOptionPane.showMessageDialog( null, output2,
"Add",
JOptionPane.INFORMATION_MESSAGE );
System.exit( 0 );
}
public static int whatIsThis(int b[], int size) {
if (size == 1)
return b[0];
else
return b[size - 1] + whatIsThis(b, size - 1);
}
}
结果截图:

编程总结:
了解了一些JTextArea的用法,学会了如何实现字符串的分列输出。

Java(数组)动手动脑的更多相关文章

  1. Java之动手动脑(三)

    日期:2018.10.12 星期五 博客期:017 这次留了两个动手动脑作业!我需要一个一个来说!先说第一个吧! Part 1 :随机生成1000个随机数 代码: //以下为 RandomMaker. ...

  2. java的动手动脑10月20日

    (1)动手动脑 该函数没有赋初值再就是如果类提供一个自定义的构造方法,将导致系统不在提供默认的构造方法. (2) public class test { /*** @param args*/publi ...

  3. Java的动手动脑

    动手动脑及课后实 仔细阅读示例: EnumTest.java,运行它,分析运行结果? public class EnumTest { public static void main(String[] ...

  4. java异常处理动手动脑问题解决和课后总结

    动手动脑 一.问题:请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识. 1.源代码 import javax.swing.*; cl ...

  5. java课java方法动手动脑

    动手动脑: import java.util.Scanner; public class Random { public static void main(String[] args) {       ...

  6. java课堂动手动脑及课后实验总结

      动手动脑一:枚举   输出结果: false false true SMALL MEDIUM LARGE 分析和总结用法 枚举类型的使用是借助ENUM这样一个类,这个类是JAVA枚举类型的公共基本 ...

  7. Java课堂 动手动脑5

    1.了解棋盘打印:利用二维数组输出一个15*15的棋盘,棋盘的原素为“+”,就是输出一个横纵都是15个“+”的二维数组,然后再以坐标形式输入棋子“●”,替换掉原来棋盘里的“+”.再编写代码. 电脑随机 ...

  8. java课堂动手动脑博客

    随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中. 要求将设计思路.程序流程图.源程序代码.结果截图.编程总结等发表到博客园. (截止时间2015 ...

  9. Java一些动手动脑实验

    一.Java字段初始化的规律: 输出结果为:100 和 300 当把{filed=200}放在public int field=100之后输出结果为:200 和 300 所以执行类成员定义时指定的默认 ...

  10. Java的动手动脑(七)

    日期:2018.11.18 博客期:025 星期日 Part 1:使用 Files.walkFileTree()来找出指定文件夹下大小大于1KB的文件 package temp; import jav ...

随机推荐

  1. 移动端网页fixed布局问题解决方案

    问题说明 移动端web的footer常常设计为fixed布局,但是在页面键盘被拉起时fixed的布局会出现问题,自己试了下,在较低版本ios和部分安卓机上会有此问题.具体问题看图示: <body ...

  2. 微信nickname乱码及mysql编码格式设置(utf8mb4)

    微信nickname乱码及mysql编码格式设置(utf8mb4) 今天在写微信公众平台项目时,写到一个用户管理模块,接口神马的已经调试好了,于是将用户从微信服务器保存到本地数据库,发现报错: jav ...

  3. Excel 取得一定范围内最大的有值的行号

    dim iRow iRow = Range("A1000").End(xlUp).Row

  4. C++学习基础十二——纯虚函数与抽象类

    一.C++中纯虚函数与抽象类: 1.含有一个或多个纯虚函数的类成为抽象类,注意此处是纯虚函数,而不是虚函数. 2.如果一个子类继承抽象类,则必须实现父类中的纯虚函数,否则该类也为抽象类. 3.如果一个 ...

  5. leetcode 191

    191. Number of 1 Bits Write a function that takes an unsigned integer and returns the number of ’1' ...

  6. 转 Jmeter之Bean shell使用(一)

    一.什么是Bean Shell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法; BeanShell是一种松散类型的脚本语言(这点和JS类似); BeanS ...

  7. Generate transparent shape on image

    Here is an example code to generate transparent shape on image. Need to pay attention can not use cv ...

  8. java工程或web工程项目上出现红色感叹号

    最近在新公司重新搭建mybatis3+spring4框架的时候出现的问题.确定这个问题是出现在项目的build path里面,但是如果jar包上没出现红X就不知道哪个jar包有问题了,最笨的办法是删除 ...

  9. 敏捷软件开发 VS. 传统软件工程

    敏捷软件开发 VS. 传统软件工程 软件工程这一术语1968年被提出,之后美国软件工程专家巴利·玻姆对十多年间研究软件工程的专家学者们提出的一些准则与信条,于1983年对提出软件工程的七条基本定理,将 ...

  10. java中 sleep 与 wait 的区别

    1.所属类不同 sleep是Thread类的方法: wait是Object类的方法: 2.功能不同 sleep是线程用来控制自身流程的,在调用sleep()方法的过程中,线程不会释放对象锁: wait ...