数组
一.动手动脑
1.棋盘设计:如何利用二维数组和循环语句绘制五子棋盘
(1)源程序:
/*
* 利用二维数组和循环语句编写五子棋盘,Qipan.java程序
* 陈晓阳 20153253 2016.11.4
*/
import java.io.*;
//公有类Qipan
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()//每打印完一行数组元素后输出一个换行符,利用System.out.print()不换行,System.out.println()换行
{
//打印每个数组元素
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)分析源程序
定义一个公有类,类中包括初始化方法,输出方法和主方法,在主函数中调用初始化和输出方法,还用到了主方法中首先定义二维数组,用到了BufferedReader和br.readLine()来从键盘上得到输入的字符,利用split(",")将得到的字符用逗号隔开,parseInt来得到两个int型的数,再将这两个整型的数转化成坐标,将这个坐标对应的赋值为“●“;初始化方法就是将利用for循环将二维数组都赋值为"╋",输出方法也是利用for循环输出每一个数组元素,但是要注意应该在输出完一行后再换行,所以就要用System.out.print()而不用System.out.println();当然这只是用户输入,还没有电脑输出,电脑输入后还要进行判断是否有五个棋子连在一起的情况,来判断是谁赢了。
(3)程序结果截图
2.编写程序将整数转换成汉字读法字符串,例如将“1123“转化成一千一百二十三;更进一步将数字表示的金额改为汉字表达,例如将¥123.52转化成壹佰贰拾叁元伍角贰分。
(1)源代码:
数字转化成大写:
public class Num2Rmb
{
private String[] hanArr = {"零" , "壹" , "贰" , "叁" , "肆" ,
"伍" , "陆" , "柒" , "捌" , "玖"};
private String[] unitArr = {"十" , "百" , "千","万","十万","百万"};
/**陈晓阳 20153253 2016.11.5
* 把一个四位的数字字符串变成汉字字符串
* @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)
{
Num2Rmb nr = new Num2Rmb();
System.out.println("只支持整数(0~百万)");
//测试把一个四位的数字字符串变成汉字字符串
System.out.println(nr.toHanStr("0"));
System.out.println(nr.toHanStr("1"));
System.out.println(nr.toHanStr("10"));
System.out.println(nr.toHanStr("15"));
System.out.println(nr.toHanStr("110"));
System.out.println(nr.toHanStr("123"));
System.out.println(nr.toHanStr("105"));
System.out.println(nr.toHanStr("1000"));
System.out.println(nr.toHanStr("1100"));
System.out.println(nr.toHanStr("1110"));
System.out.println(nr.toHanStr("1005"));
System.out.println(nr.toHanStr("1105"));
System.out.println(nr.toHanStr("1111"));
System.out.println(nr.toHanStr("10000"));
System.out.println(nr.toHanStr("10001"));
System.out.println(nr.toHanStr("10011"));
System.out.println(nr.toHanStr("10111"));
System.out.println(nr.toHanStr("11111"));
System.out.println(nr.toHanStr("11000"));
System.out.println(nr.toHanStr("11100"));
System.out.println(nr.toHanStr("11110"));
System.out.println(nr.toHanStr("101110"));
System.out.println(nr.toHanStr("1001110"));
}
}
金额转化成大写
int i1=0,i=0;
if(numStr.charAt(0)=='$')i1=1;//看第一个是不是¥,是的话跳过第一个字符
for (i=i1; i < numLen ; i++ )
{
//把char型数字转换成的int型数字,因为它们的ASCII码值恰好相差48
int num=0;
if(numStr.charAt(i)=='.')num=-1;//表示“.”
else num = numStr.charAt(i) - 48;//把char型数字减去48得到int型数字,例如'4'被转换成4。
if(num==-1)result +=unitArr1[2];//表示“.”的情况
//数字不是零,则需要添加单位(千、百、十)
else if (/* i != numLen - 1 && */num != 0)
{
result += hanArr[num] + unitArr1[numLen - 1 - i];
}
}
(2)运行结果截图:
(3)程序分析
第一个程序:只能输出整数,借用两个数组,一个数组表示数字的大写,另一个数组表示十,百等单位,首先将字符转化成数字,用到了numStr.charAt(i) - 48,再将数字用数组中的字符表示,输出结果要注意,考虑清楚是否要加零,如果是最后一个&&数字是0就不用加零,否则就要加上单位,但是还要注意如果数字有好几个0相连,就只用添加一个零。如果是0,就直接输出零。
第二个程序:要判断是否有“¥”,有¥就要跳过这个字符,表示就是金额了,还要判断是否是小数位数的金额,没有“.”,就直接numStr.charAt(i) – 48表示出整型数字,再借用数组表示出结果,这次的第二个数组中要有元角分,最后一个只要不是零也要输出分,所以只用判断是否为0,为0就不输出。但是不能将整数金额输出来。
3. 用大数类数组实现加和减两个功能
(1)源代码
import java.util.Scanner;
//用你的大数类实现加和减两个功能
//陈晓阳 2016.11.5
public class Bignum {
public static void main(String args[])
{
String a1;
String a2;//两个数
System.out.print("请输入一个数:");
Scanner scanner1=new Scanner(System.in);
a1=scanner1.next();//表示成string型的
System.out.print("请输入另一个数:");
Scanner scanner2=new Scanner(System.in);
a2=scanner2.next();//表示成string型的
int l1=a1.length();
int l2=a2.length();int l,L;
if(l1>l2){l=l2;L=l1;}
else {l=l1;L=l2;}
char b1[]=new char[l1];b1=a1.toCharArray();
char b2[]=new char [l2];b2=a2.toCharArray();
int c1[]=new int [l1];int c2[]=new int [l2];
int c[]=new int [L];
//将字符数组转化成整型数组
for (int i=0;i<l1;i++)
{
c1[i]=b1[i]-48;
}
for (int i=0;i<l2;i++)
{
c2[i]=b2[i]-48;
}
for(int i=L-1;i>=0;i--)
{
if(l1<l2)
{
if(i>=L-l)
c[i]=c[i]+c1[i-L+l]+c2[i];
else c[i]=c[i]+c2[i];
if(c[i]>9)
{
c[i]=c[i]-10; c[i-1]=c[i-1]+1;
}
}
else
{
if(i>=L-l)
c[i]=c[i]+c2[i-L+l]+c1[i];
else c[i]=c[i]+c1[i];
if(c[i]>9)
{
c[i]=c[i]-10; c[i-1]=c[i-1]+1;
}
}
}
/* //减法
for(int i=L-1;i>=0;i--)
{
if(l1<l2)
{
if(i>=L-l)
c[i]=c[i]+c1[i-L+l]+c2[i];
else c[i]=c[i]+c2[i];
if(c[i]>9)
{
c[i]=c[i]-10; c[i-1]=c[i-1]+1;
}
}
else
{
if(i>=L-l)
c[i]=c[i]+c2[i-L+l]+c1[i];
else c[i]=c[i]+c1[i];
if(c[i]>9)
{
c[i]=c[i]-10; c[i-1]=c[i-1]+1;
}
}
}*/
// for (int i=L-l-1)
System.out.print("两数之和是:");
for(int i=0;i<L;i++)
{
System.out.print(c[i]);
}
}
}
(2)运行结果截图
(3)程序分析
首先得到string类型的两个数,然后将这些数转化成字符数组,接着再利用相差48的关系得到整型数组,利用for循环从左到右进行计算。计算时要注意输入的第一串数小,还是第二串数小,分情况讨论,将大的那部分直接加到和数组中。相加后还要注意是不是超十,超了就要在前一个数上加1。减法的程序还没有写出来。
4.随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算元素的和,将结果也显示在消息框中。
(1)源代码
import javax.swing.JOptionPane;
/*
* 随机生成10个数,填充一个数组,然后用消息框显示数组内容;
* 接着计算数组元素中的和,将结果也显示在消息框中
*/
//20153253 陈晓阳 2016.11.3
public class shuzu {
public static void main(String args[])
{
int a[]=new int[10];//定义数组
int sum=0;
String output="";
for(int i=0;i<10;i++)
{
a[i]=(int) ( Math.random() * 100 );//产生随机数
output=output+"a["+i+"] "+a[i]+"\n";
sum=sum+a[i];
}
output=output+"sum: "+sum+"\n";
JOptionPane.showMessageDialog(null, output, "数组结果", JOptionPane.INFORMATION_MESSAGE);
}
}
(2)设计思路
先申请一个数组空间,利用for循环随机生成10个随机数,并且将这10个随机数存在数组空间里,定义一个string类型的变量用来输出,每一个数及最后的结果都存在string变量中,最后利用面板消息框输出结果
(3)程序流程图
(4)截图
(5)编程总结
定义数组,将产生的数存放在数组中,利用string变量储存数,最终输出结果,用到对话框JOptionPane.showMessageDialog,所以要借用string变量。