练手题二

    科技2024-10-21  19

    模块二的练习来了-第二个题还是有点难的整了一天还是没整出来,最后还是参考别人的

    编程实现以下需求:

    定义一个长度为[16][16]的整型二维数组并输入或指定所有位置的元素值,分别实现二维数组中所有行和所有列中所有元素的累加和并打印。

    再分别实现二维数组中左上角到右下角和右上角到左下角所有元素的累加和并打印。

    实现类

    package code_1; import java.util.Random; public class arr { //定义行列以及数组 private int row; private int column; private int [][] arrs; //定义行的和,列,对角线的和 private int[] sumRows; private int[] sumCols; private int[] sumDiagonal; public arr() { } public arr(int row, int column) { this.row = row; this.column = column; setSumDiagonal(2); sumRows=new int[row]; sumCols=new int[column]; arrs = new int[row][column]; } public void setRow(int row) { this.row = row; } public void setColumn(int column) { this.column = column; } public void setArrs(int[][] arrs) { this.arrs = arrs; } public void setSumRows(int[] sumRows) { this.sumRows = sumRows; } public void setSumCols(int[] sumCols) { this.sumCols = sumCols; } public void setSumDiagonal(int number) { sumDiagonal = new int[number]; } public int getRow() { return row; } public int getColumn() { return column; } public int[][] getArrs() { return arrs; } /** * 得到所有行的和 * @return */ public int[] getSumRows() { System.out.println("\n====打印各行的和===="); for (int i = 0; i < sumRows.length; i++) { System.out.println("第"+i+"列的和"+sumRows[i]); } return sumRows; } /** * 得到所有列的和 * @return */ public int[] getSumCols() { System.out.println("\n====打印各列的和===="); for (int i = 0; i < sumCols.length; i++) { System.out.println("第"+i+"行的和"+sumCols[i]); } return sumCols; } public int[] getSumDiagonal() { System.out.println("\n====对角线的和===="); System.out.println("从左上角到右下角的和"+ sumDiagonal[0]); System.out.println("从右下角到左上角的和"+sumDiagonal[1]); return sumDiagonal; } /** *指定所有位置的元素值 */ public void add(){ Random ra=new Random(); for (int i = 0; i <arrs.length; i++) { for (int j = 0; j < arrs[i].length; j++) { arrs[i][j]=ra.nextInt(10); sumRows[i] += arrs[i][j]; sumCols[j] += arrs[i][j]; if (i == j) { sumDiagonal[0] += arrs[i][j]; } if (i == (arrs[i].length -1-j )) { sumDiagonal[1] += arrs[i][j]; } } } } /** * 打印数组 */ public void show(){ for (int i = 0; i < arrs.length; i++) { for (int j = 0; j < arrs[i].length; j++) { System.out.print(" "+arrs[i][j]); } System.out.println(); } } }

    测试类

    package code_1; public class it_test_1 { public static void main(String[] args) { arr array=new arr(16,16); array.add();//添加元素 array.show(); array.getSumRows();//行的和 array.getSumCols();//列的和 array.getSumDiagonal();//对角线的和 } } 编程实现控制台版并支持两人对战的五子棋游戏。

    (1)绘制棋盘 - 写一个成员方法实现

    (2)提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现。

    (3)每当一方下棋后判断是否获胜 - 写一个成员方法实现。

    (4)提示: 采用二维数组来模拟并描述棋盘,棋盘如下:

    实现类

    package code_2; import java.util.Scanner; public class gobang { //(1)绘制棋盘 - 写一个成员方法实现 private String[][] checkerboard; //定义白棋黑棋 private char black_mole; private char white_mole; // 棋盘大小 private int rows; private int cols; public gobang() { } public gobang( char black_mole, char white_mole, int rows, int cols) { setCheckerboardint(rows,cols); setBlack_mole(black_mole); setWhite_mole(white_mole ); setCols(cols); setRows(cols); } public void setCheckerboardint(int rows, int cols) { checkerboard = new String[rows][cols]; } public char getBlack_mole() { return black_mole; } public void setBlack_mole(char black_mole) { this.black_mole = black_mole; } public char getWhite_mole() { return white_mole; } public void setWhite_mole(char white_mole) { this.white_mole = white_mole; } public int getRows() { return rows; } public void setRows(int rows) { this.rows = rows; } public int getCols() { return cols; } public void setCols(int cols) { this.cols = cols; } //绘制棋盘 public void getCheckerboard(){ for (int i = 0; i < checkerboard.length; i++) { for (int j = 0; j < checkerboard[i].length; j++) { checkerboard[0][0]=" "; if (0==i) {checkerboard[i][j]=String.format("%x",j-1);} else if (0==j) {checkerboard[i][j]=String.format("%x",i-1);} else {checkerboard[i][j]="+";} } } } //打印棋盘 public void showcheckerboard() { for (String[] str : checkerboard) { for (int j = 0; j < checkerboard[0].length; j++) { if ("白".equals(str[j])) { System.out.print(white_mole + " "); } else if ("黑".equals(str[j])) { System.out.print(black_mole + " "); } else { System.out.print(str[j] + " "); } } System.out.println(); } } //判断 private Boolean isWin(int x, int y, String chess, int rows, int cols) { int countCol = -1; int countRow = -1; int countDiagonalLeft = -1; int countDiagonalRight = -1; int a; int b; // 行:向左数相同的棋子 a = x; b = y; while (true){ if (chess.equals(checkerboard[a][b])) { countRow++; if (b == 0) { break; } b--; }else { break; } } // 行:向右数相同的棋子 a = x;//行 b = y;//列 while (true) { if (chess.equals(checkerboard[a][b])) { countRow++; // 防止数组下标越界 if (b == (cols - 1)) { break; } b++; } else { break; } } // 列:向下数相同的棋子 a = x;//行 b = y;//列 while (true) { if (chess.equals(checkerboard[a][b])) { countCol++; // 防止数组下标越界 if (a == 0) { break; } a--; } else { break; } } // 列:向上数相同的棋子 a = x; b = y; while (true) { if (chess.equals(checkerboard[a][b])) { countCol++; // 防止数组下标越界 if (a == (rows - 1)) { break; } a++; } else { break; } } // 左对角:左上数相同的棋子 a = x; b = y; while (true) { if (chess.equals(checkerboard[a][b])) { countDiagonalLeft++; // 防止数组下标越界 if (a == 0 || b == 0) { break; } a--; b--; } else { break; } } // 左对角:右下数相同的棋子 a = x; b = y; while (true) { if (chess.equals(checkerboard[a][b])) { countDiagonalLeft++; // 防止数组下标越界 if (a == (rows - 1) || b == (cols - 1)) { break; } a++; b++; } else { break; } } // 右对角:右上数相同的棋子 a = x; b = y; while (true) { if (chess.equals(checkerboard[a][b])) { countDiagonalRight++; // 防止数组下标越界 if (a == 0 || b == (cols - 1)) { break; } a--; b++; } else { break; } } // 右对角:左下数相同的棋子 a = x; b = y; while (true) { if (chess.equals(checkerboard[a][b])) { countDiagonalRight++; // 防止数组下标越界 if (a == (rows - 1) || b == 0) { break; } a++; b--; } else { break; } } return (countRow >= 5 || countCol >= 5 || countDiagonalLeft >= 5 || countDiagonalRight >= 5); } //游戏入口 public void startGame() { Scanner sc = new Scanner(System.in); boolean flag = true; int x; int y; String chess; while (true) { if (flag) { System.out.println("请白方落子(空格隔开):"); chess = "白"; } else { System.out.println("请黑方落子(空格隔开):"); chess = "黑"; } x = sc.nextInt() + 1; y = sc.nextInt() + 1; if (x < 0 || y < 0 || x > 16 || y > 16) { System.out.println("落子超出棋盘范围,请重新落子。"); continue; } if ("+".equals(checkerboard[x][y])) { checkerboard[x][y] = chess; } else { System.out.println("当前坐标不可落子,请重新落子。"); continue; } showcheckerboard(); flag = !flag; boolean isWin = isWin(x, y, chess, getRows(), getCols()); if (isWin) { System.out.printf("恭喜%s方获胜!", chess); break; } } } }

    测试类

    /** * 2. 编程实现控制台版并支持两人对战的五子棋游戏。 (1)绘制棋盘 - 写一个成员方法实现 (2)提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现。 (3)每当一方下棋后判断是否获胜 - 写一个成员方法实现。 */ public class it_test_2 { public static void main(String[] args) { char black_mole=0x2665; char white_mole=0x2022; gobang go=new gobang(black_mole,white_mole,17,17); go.getCheckerboard(); go.showcheckerboard(); go.startGame(); } }

    按照要求设计并实现以下实体类和接口。

    3.1 第一步:设计和实现以下类

    (1)手机卡类 特征:卡类型、卡号、用户名、密码、账户余额、通话时长(分钟)、上网流量 行为:显示(卡号 + 用户名 + 当前余额)

    (2)通话套餐类 特征:通话时长、短信条数、每月资费 行为: 显示所有套餐信息 (3)上网套餐类 特征:上网流量、每月资费 行为:显示所有套餐信息

    (4)用户消费信息类 特征:统计通话时长、统计上网流量、每月消费金额

    3.2 第二步:设计和实现以下枚举类 手机卡的类型总共有 3 种:大卡、小卡、微型卡

    3.3 第三步:实体类的优化 将通话套餐类和上网套餐类中相同的特征和行为提取出来组成抽象套餐类。

    3.4 第四步:创建并实现以下接口

    (1)通话服务接口 抽象方法: 参数1: 通话分钟, 参数2: 手机卡类对象 让通话套餐类实现通话服务接口。

    (2)上网服务接口 抽象方法: 参数1: 上网流量, 参数2: 手机卡类对象 让上网套餐类实现上网服务接口。

    3.5 第五步:进行代码测试

    编写测试类使用多态格式分别调用上述方法,方法体中打印一句话进行功能模拟即可。

    消费类

    public class UserConsume { // 统计余额、通话时长、上网流量 private int consumeValue; private int consumeCallDuration; private int consumeNetworkData; public void setConsumeValue(int consumeValue) { this.consumeValue = consumeValue; } public void setConsumeCallDuration(int consumeCallDuration) { this.consumeCallDuration = consumeCallDuration; } public void setConsumeNetworkData(int consumeNetworkData) { this.consumeNetworkData = consumeNetworkData; } public int getConsumeValue() { return consumeValue; } public int getConsumeCallDuration() { return consumeCallDuration; } public int getConsumeNetworkData() { return consumeNetworkData; } // 打印消费情况 public void showInfo() { System.out.printf("\n消费情况:您已通话 "+consumeCallDuration+"分钟;流量使用"+consumeNetworkData+"GB;合计消费"+consumeValue+"元。"); } }

    手机卡类

    public class PhoneCard { private String cardType; private String cardId; private String userName; private String password; private int accountBalance; private int callDuration; private int networkData; private UserConsume userConsume; public PhoneCard() { } public PhoneCard(String cardType, String cardId, String userName, String password, int accountBalance, int callDuration, int networkData, UserConsume userConsume) { setCardType(cardType); setCardId(cardId); setUserName(userName); setPassword(password); setAccountBalance(accountBalance); setCallDuration(callDuration); setNetworkData(networkData); setUserConsume(userConsume); } public UserConsume getUserConsume() { return userConsume; } public void setUserConsume(UserConsume userConsume) { this.userConsume = userConsume; } public String getCardType() { return cardType; } public void setCardType(String cardType) { this.cardType = cardType; } public String getCardId() { return cardId; } public void setCardId(String cardId) { this.cardId = cardId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getAccountBalance() { return accountBalance; } public void setAccountBalance(int accountBalance) { this.accountBalance = accountBalance; } public int getCallDuration() { return callDuration; } public void setCallDuration(int callDuration) { this.callDuration = callDuration; } public int getNetworkData() { return networkData; } public void setNetworkData(int networkData) { this.networkData = networkData; } /** * 增加消费方法 * * @param consumeValue 消费金额 * @param consumeCallDuration 通话时长 * @param consumeNetworkData 上网流量 */ public void addComsume(int consumeValue, int consumeCallDuration, int consumeNetworkData) { // 记录消费金额 getUserConsume().setConsumeValue(getUserConsume().getConsumeValue() + consumeValue); // 记录通话时长 getUserConsume().setConsumeCallDuration(getUserConsume().getConsumeCallDuration() + consumeCallDuration); //记录上网流量 getUserConsume().setConsumeNetworkData(getUserConsume().getConsumeNetworkData() + consumeNetworkData); } //打印信息 public void showInfo() { System.out.printf("卡号:%s\n用户名:%s\n当前余额:%d元\n", getCardId(), getUserName(), getAccountBalance()); // 打印消费情况 getUserConsume().showInfo(); } /** * 多态 * 打印用户所有信息与各类套餐内容 * * * @param abstractPackage 套餐抽象类对象 */ public void showOnCreate(AbstractPackage... abstractPackage) { System.out.printf("卡号:%s\n类型:%s\n用户名:%s\n密码:%s\n时长包:%d分钟\n流量包:%dGB\n当前余额:%d元\n", getCardId(), getCardType(), getUserName(), getPassword(), getCallDuration(), getNetworkData(), getAccountBalance()); for (int i = 0; i < abstractPackage.length; i++) { abstractPackage[i].showInfo(); } } }

    通话套餐类

    public class PhonePackage extends AbstractPackage implements ServeCall { // 记录短信条数 private int message; //初始化通话套餐 public PhonePackage(int price, int phonePackage,int message) { // 继承抽象套餐类 super(price,phonePackage); // 设置短信 setMessage(message); } public void setMessage(final int message) { this.message = message; } public int getMessage() { return message; } // 重写抽象套餐类,打印套餐信息; @Override public void showInfo() { System.out.printf("通话套餐:时长包"+getPhonePackage()+"分钟;每月资费"+getPrice()+"元/分钟;短信"+getMessage()+"条"); } @Override // 重写通话服务接口方法 public void server(int number, PhoneCard phoneCard) { // 消费金额=通话数量*资费 int consumeValue=number*getPrice(); // 手机余额减消费 phoneCard.setAccountBalance(phoneCard.getAccountBalance() - consumeValue); // 添加通话消费时长 phoneCard.addComsume(consumeValue,number,0); // 打印手机卡当前消费信息 phoneCard.showInfo(); } }

    抽象类

    public abstract class AbstractPackage { // 套餐资费 private int price; // 套餐数量 private int phonePackage; // 无参构造 public AbstractPackage() { } // 初始化套餐 public AbstractPackage(int price, int phonePackage) { setPrice(price); setPhonePackage(phonePackage); } // 设置资费 public void setPrice(int price) { this.price = price; } // 获取资费 public int getPrice() { return price; } // 设置套餐数量 public void setPhonePackage(int phonePackage) { this.phonePackage = phonePackage; } // 获取套餐 public int getPhonePackage() { return phonePackage; } // 打印套餐信息 public abstract void showInfo(); }

    上网套餐类

    public class NetworkPackage extends AbstractPackage implements ServerNtework { public NetworkPackage(int price, int phonePackage) { // 继承抽象类套餐 super(price,phonePackage); } //重写抽象套餐类,打印套餐信息; @Override public void showInfo() { System.out.printf("上网套餐:流量包"+getPhonePackage()+"GB;每月资费"+getPrice()+"元/GB"); } // 重写上网服务接口方法 // 重写上网服务接口方法 @Override public void server(int networkData, PhoneCard phoneCard) { // 消费金额=上网流量*资费 int consumeValue=networkData*getPrice(); // 手机余额减消费 phoneCard.setAccountBalance(phoneCard.getAccountBalance() - consumeValue); // 添加流量消费数量 phoneCard.addComsume(consumeValue,0,networkData); // 打印手机卡当前消费信息 phoneCard.showInfo(); } }

    卡型枚举类

    public enum Type_enum { BIG("大卡"), SMALL("小卡"), MINI("微型卡"); private final String cardType; private Type_enum(String cardType) { this.cardType = cardType; } public String getCardType() { return cardType; } }

    *** 通话服务接口:**

    public interface ServeCall { // 通话数量,手机卡对象 public abstract void server(int number, PhoneCard phoneCard); }

    流量服务接口

    public interface ServerNtework { // 流量数量,手机卡对象 public abstract void server(int networkData, PhoneCard phoneCard); }

    测试类

    public class it_test_3 { public static void main(String[] args) { System.out.println("========注册卡========="); // 定义通话套餐数量与资费 PhonePackage call = new PhonePackage(1, 0, 0); // 定义上网套餐与资费 NetworkPackage network = new NetworkPackage(1, 0); // 消费统计对象 UserConsume consume = new UserConsume(); // 注册一张手机卡 类型:大卡 PhoneCard card = new PhoneCard(Type_enum.BIG.getCardType(), "110120130150", "username", "******", 1000, call.getPhonePackage(), network.getPhonePackage(), consume); // 多态:打印套餐信息:抽象套餐类->通话套餐、上网套餐 card.showOnCreate(call, network); System.out.println("=================\n\n"); // 开始消费 System.out.println("========使用通话========="); call.server(30, card); System.out.println("\n=================\n\n"); System.out.println("========使用流量========="); network.server(100, card); System.out.println("\n=================\n\n"); } }

    这次作业拖时间挺长的,国庆节,和学校实习,哎痛疼。加油吧少年~~~~~~~~~~

    Processed: 0.016, SQL: 8