《疯狂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.****.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的格式:");
}
}
}