《疯狂Java讲义》第4章 流程控制与数组 课后练习

第1题:使用循环输出九九乘法表。输出结果如下:
1 × 1 = 1
2 × 1 = 2,2 × 2 = 4
3 × 1 = 3,3 × 2 = 1,3 × 3 = 9

9 × 1 = 9,9 × 2 = 18,9 × 3 = 27,…9 × 9 =8 1
具体代码如下:

public class jiujiu {

	public static void main(String[] args) 
	{
		for(int i=1;i<=9;i++)
		{
			for(int j=1;j<=i;j++)
			{
				System.out.print(i+"*"+j+"="+i*j);
				if(i>=2 && j!=i) 
				System.out.print(",  ");
			}
			System.out.println();
		}
	}
}

输出结果如下:
九九乘法表
第2题:使用循环输出等腰三角形。例如给定4,输出如下结果:

   *
  ***
 *****
*******
import java.util.Scanner;
public class Triangle
{
 public static void main(String[] args)
 {
    int rows = 0; //三角形行数
    System.out.print("请输入等腰三角形的行数:");
    Scanner input = new Scanner(System.in);
    rows = input.nextInt();
    //打印等腰三角形
    for(int i = 1; i <= rows; i++)  //控制行数
    {
      for(int j = 1; j <= rows-i; j++)  //控制空格
      {
          System.out.print(" ");
      }
        for(int k = 1; k <= 2*i-1; k++)   //控制*号
        {
           System.out.print("*");
        }
      System.out.print("\n");
    }
  }
}

第3题:通过查询API文档查询Math类的方法,打印出如下的近似圆,只要给定不同半径,圆的大小就会随之发生改变。

请输入要打印圆形的半径:5
     *     
 *       * 
*         *
*         *
 *       * 
     *     

习题代码如下:

import java.util.Scanner;
public class CircleDraw {
     public static void main(String[] args) {
        //定义半径
        int r = 0;
        System.out.print("请输入要打印圆形的半径:");
        Scanner input = new Scanner(System.in);
        r = input.nextInt();
        // 定义y为圆的纵坐标,其中y=y+2是让设置纵坐标的步长,可以调整椭圆的“胖瘦”
        for (int y = 0; y <= 2 * r; y = y + 2) {
            long x = Math.round(r - Math.sqrt(2 * r * y - y * y));
            for (int i = 0; i <= 2 * r; i++) {
                // i==x是指某一个纵坐标对应的一个横坐标,i==2*r-x 是指该纵坐标对应的第二个横坐标
                if (i == x || i == 2 * r - x) {
                    System.out.print("*");
                } else {
                    System.out.print(" ");
                }
            }
            System.out.print("\n");
        }
    }
}

第4题:实现按一个字节来截取字符串的子串的方法,功能类似于String类的substring()方法,String类是按字符截取的,例如“中国abc”,substring(1,3),将返回“国a”。这里要求按字节截取,一个英文字符当一个字节,一个中文字符当两个字节。
习题代码如下:

public class SubByteString {

    private static String subStringByByte(String str, int len) {
        String result = null;
        if (str != null)
        {
            byte[] a = str.getBytes();
            if (a.length <= len)
            {
                result = str;
            }
            else if (len > 0)
            {
                result = new String(a, 0, len);
                int length = result.length();
                if (str.charAt(length - 1) != result.charAt(length - 1))
                {
                    if (length < 2)
                    {
                        result = null;
                    } else
                    {
                        result = result.substring(0, length - 1);
                    }
                }
            }
        }
        return result;
    }

    public static void main(String[] args)
    {
        String str1="中国abc";
        byte[] a = str1.getBytes();
        String str2 = subStringByByte(str1,5);
        System.out.println("--str1.length="+str1.length());
        System.out.println("--Byte长度="+a.length);
        System.out.println("--str2="+str2+"--");
    }

}

第5题:编写一个程序,将浮点数转换成人民币读法字符串,例如,将1006.333转换为壹仟零陆元叁角叁分。
习题代码如下:


public class Num2Rmb {
	private String[] hanArr = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
	private String[] unitArr = { "仟", "佰", "十", "亿", "仟", "佰", "十", "万", "仟", "佰", "十", "元" };
	private String[] unitArr3 = { "零仟", "零佰", "零十", "零亿", "零仟", "零佰", "零十", "零万", "零仟", "零佰", "零十", "零元" };
	private String[] unitArr4 = { "零", "零", "零", "亿", "零", "零", "零", "万", "零", "零", "零", "元" };
	private String[] unitArr2 = { "角", "分", "整" };

	/**
	 * 该方法将给定的浮点数分割成整数部分和小数部分
	 * 
	 * @param num
	 *            该参数指定需要分割的浮点数
	 * @return 返回字符串数组,包含整数部分和小数部分
	 */
	private String[] divide(double num) {
		long zheng = (long) num;
		long xiao = Math.round((num - zheng) * 100);// 此处需要四舍五入
		return new String[] { zheng + "", xiao + "" };
	}

	/**
	 * 该方法将给定的整数部分字符串转换为人民币读法字符串
	 * 
	 * @param zheng
	 *            该参数指定需要转换的整数部分字符串
	 * @return 返回字符串,整数部分的人民币读法
	 */
	// 将整数部分每四个数分为一组,每个组的读法基本相同,每个组最多4个0,按0的个数分类讨论,考虑所有情况
	private String zheng2HanStr(String zheng) {
		String result = "";
		int length = zheng.length();
		for (int i = 0; i < length; i++) {
			int num = zheng.charAt(i) - 48;// 将数字字符换成对应数字
			result += hanArr[num] + unitArr[12 - length + i];// 将数字换成汉字并加上数位
		} // end for
		length = result.length();
		for (int i = 0; i < 12; i++) {
			result = result.replaceAll(unitArr3[i], unitArr4[i]);
		} // end for
		while (result.indexOf("零零") >= 0)// 去掉所有"零零"
		{
			result = result.replaceAll("零零", "零");
		} // end while
		result = result.replaceAll("零万", "");
		result = result.replaceAll("零元", "元");
		return result;
	}

	/**
	 * 该方法将给定的小数部分字符串转换为人民币读法字符串
	 * 
	 * @param xiao
	 *            该参数指定需要转换的小数部分字符串
	 * @return 返回字符串,小数部分的人民币读法
	 */
	private String xiao2HanStr(String xiao) {
		String result = "";
		int length = xiao.length();
		if (length == 2) {
			int num1 = xiao.charAt(0) - 48;
			int num2 = xiao.charAt(1) - 48;
			if (num1 != 0 && num2 == 0) {
				result += hanArr[num1] + unitArr2[0];
			} // 针对小数部分是".90"这种情况
			else {
				result += hanArr[num1] + unitArr2[0] + hanArr[num2] + unitArr2[1];
			} // 针对小数部分是".89"这种情况
		} else if (length == 1) {
			int num1 = xiao.charAt(0) - 48;
			if (num1 != 0) {
				result += hanArr[0] + hanArr[num1] + unitArr2[1];
			} // 针对小数部分是".09"这种情况
			else {
				result += unitArr2[2];
			} // 针对小数部分是".00"这种情况
			System.out.println("有一位!");
		} else {// 针对可能出现的意外情况
			result += unitArr2[2];
			System.out.println("没有位!");
		} // end if
		return result;
	}

	/**
	 * 该方法将给定的浮点数转换为人民币读法字符串
	 * 
	 * @param num
	 *            该参数指定需要转换的浮点数
	 * @return 返回字符串,浮点数的人民币读法
	 */
	private String toHanStr(double num) {
		String result = "";
		Num2Rmb nr2 = new Num2Rmb();
		String[] diviStr2 = nr2.divide(num);
		result += nr2.zheng2HanStr(diviStr2[0]);
		result += nr2.xiao2HanStr(diviStr2[1]);
		return result;
	}

	public static void main(String[] args) {
		Num2Rmb nr = new Num2Rmb();
		System.out.println(nr.toHanStr(1006.333));
	}
}

本题程序源代码引用自 weixin_40720438的博客。

https://blog.csdn.net/weixin_40720438/article/details/79429834

第6题:编写控制台的五子棋游戏。
以下代码只是来源于课本,我水平不够,还不能完善!O(∩_∩)O~∑  >_<|||

import java.io.BufferedReader;
import java.io.InputStreamReader;
/*
 *程序名称:Gobang.java
 *程序功能:控制台五子棋的初步功能
 *编写日期:2018-12-30 
 */
public class Gobang
{
	//定义棋盘的大小
	private static int BOARD_SIZE=15;
	//定义一个二维数组充当棋盘
	private String[][] board;
	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
	{
		Gobang gb=new Gobang();		//实例化一个Gobang类
		gb.initBoard();			//初始化棋盘
		gb.printBoard();		//打印15*15棋盘
		//用于获取键盘输入的方法
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String inputStr=null;
		//每当在键盘上输入一行内容后按回车键,刚输入的内容被br读取到
		while((inputStr=br.readLine())!=null)
		{
			//将用户输入的字符串以(,)为分隔符,分隔成两个字符串
			String[] posStrArr=inputStr.split(",");
			//将两个字符串转换为用户下棋的坐标
			int xPos=Integer.parseInt(posStrArr[0]);
			int yPos=Integer.parseInt(posStrArr[1]);
			//把对应的数组元素赋值为"●"
			gb.board[yPos-1][xPos-1]="●";
			/*
			电脑随机生成2个整数,作为电脑下棋的坐标,赋给board数组
			还涉及
			1.坐标的有效性,只能是数字,不能超出棋盘范围
			2.下的棋子的点,不能重复下棋
			3.每次下棋后,需要扫描谁赢了
			 */
			gb.printBoard();
			System.out.println("请输入您下棋的坐标,应以x,y的格式:");
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值