数组

一.动手动脑

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变量。

posted on 2016-11-06 23:53  一抹阳光~绚烂  阅读(248)  评论(0编辑  收藏  举报

导航