Java语言程序设计基础篇_编程练习题**16.30(模式识别:连续四个相同的数)

news2024/11/14 12:14:36

目录

题目:**16.30(模式识别:连续四个相同的数)

 习题思路

代码示例

 结果展示


题目:**16.30(模式识别:连续四个相同的数)

  为编程练习题8.19编写一个GUI程序。让用户在6行7列的网格的文本域中输入数字。如果存在一串四个相等的数字,用户单击Solve按钮后,可以高亮现实它们。初始的,文本域中的值随机填充了0到9的数字。

  •  习题思路
  1.  新建一个HBox,放置一个Label,表示当前文本域中是否有连续的四个数。
  2. 新建一个GridPane,创建一个6行7列的TextField[][]数组,在每一个TextField元素中随机添加一个0~9的数,并设置到GridPane中。
  3. 新建一个HBox,添加两个Button。
  4. 新建一个BorderPane,将第一个HBox设置在顶部,将GridPane设置在中心,第二个HBox放在底部。
  5. 定义一个判断文本域中是否有四个相同的数的方法,可以参考编程练习题8.19的方法。如果找到了四个相同的数,那么将四个输入框位置的坐标添加到另一个数组Int[4][2]中。
  6. 定义一个设置高亮方法,将Int[4][2]数组中保存的与TextField对应的位置的文本框的边框设置为某一种颜色。
  7. 定义一个清除高亮方法,使用for循环清除文本边框设置,同时清除Int[4][2]中的数字。
  8. 还可以为第一个HBox中的Label定义一个设置文本的方法,根据⑤中的方法返回值(或者用一个boolean的值代表是否有连续数),设置Label中的文本。
  • 代码示例

编程练习题16_30PatternRecognition.java

package chapter_16;

import java.util.Iterator;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class 编程练习题16_30PatternRecognition extends Application{
	private int[][] fourIndex = new int[4][2];
	private TextField[][] textList;
	private Label prompt;
	private boolean bool;
	@Override
	public void start(Stage primaryStage) throws Exception {
		textList = new TextField[6][7];
		prompt = new Label();
		HBox hBox = new HBox(prompt);
		hBox.setAlignment(Pos.CENTER);
		GridPane gridPane = new GridPane();
		gridPane.setPadding(new Insets(0, 15, 0, 15));
		for(int i = 0;i < textList.length;i++) {
			for(int j = 0;j < textList[i].length;j++) {
				int rand = (int)(Math.random()*10);
				textList[i][j] = new TextField(rand+"");
				gridPane.add(textList[i][j], i, j);
			}
		}
		Button btSolve = new Button("Solve");
		HBox hBox2 = new HBox(btSolve);
		hBox2.setAlignment(Pos.CENTER);
		
		BorderPane borderPane = new BorderPane();
		borderPane.setTop(hBox);
		borderPane.setCenter(gridPane);
		borderPane.setBottom(hBox2);
		
		btSolve.setOnAction(e ->{
		isConsecutiveFour(textList);
		System.out.println(bool);
		setLabelText();
		
	});
		Scene scene = new Scene(borderPane,200, 200);
		primaryStage.setTitle("编程练习题16_30PatternRecognition");
		primaryStage.setScene(scene);
		primaryStage.show();
	}
	public void setLabelText() {
		if(bool) {
			prompt.setText("A consecutive four found");
		}else {
			prompt.setText("Not a consecutive four found");
			clearHighlight();
			}
		}
	public void setHighlight(int[][] fourIndex) {
		clearHighlight();
			for(int i = 0;i < 4;i++) {
				int x;
				int y;
					x = fourIndex[i][1];
					y = fourIndex[i][0];
				textList[x][y].setStyle("-fx-border-color:Blue");
				System.out.println(x+","+y);
		}
			
	}
	public void clearHighlight() {  
	    if (textList != null) {  
	        for (int i = 0; i < textList.length; i++) {  
	            for (int j = 0; j < textList[i].length; j++) {  
	                textList[i][j].setStyle("");  
	            }  
	        }  
	    }  
		for(int i = 0;i < 4;i++) {
			fourIndex[i][0] = 0;
			fourIndex[i][0] = 0;
		}
	}
	public boolean isConsecutiveFour(TextField[][] values) {
		bool = false;
		 if (values == null || values.length == 0 || values[0].length == 0) {  
		        return false;  
		    }  
		  
		    // 初始化 fourIndex 数组  
		    int[][] fourIndex = new int[4][2];  
		  
		    // 判断行  
		    for (int i = 0; i < values.length; i++) {  
		        int countRow = 0;  
		        int startIndex = -1;  
		        for (int j = 0; j < values[i].length - 1; j++) {  
		            if (j > 0 && values[i][j].getText().equals(values[i][j - 1].getText())) {  
		                countRow++;  
		                if (startIndex == -1) {  
		                    startIndex = j - 1; // 记录连续序列的起始索引  
		                }  
		                if (countRow == 3) { // 已经是第四个连续的了  
		                    // 填充 fourIndex 数组(这里只填充最后四个索引)  
		                    for (int k = 0; k < 4; k++) {  
		                        fourIndex[k][0] = startIndex + k;  
		                        fourIndex[k][1] = i;  
		                    }  
		                    setHighlight(fourIndex);  
		                    bool = true;
		                    return true;  
		                }  
		            } else {  
		                countRow = 0;  
		                startIndex = -1;  
		            }  
		        }  
		    }  
		 // 判断列  
		    for (int j = 0; j < values[0].length; j++) { // 注意这里应该遍历列数  
		        int countColumn = 0;  
		        int startIndex = -1;  
		        for (int i = 0; i < values.length - 1; i++) { // 注意这里应该是 i < values.length - 1  
		            if (values[i][j].getText().equals(values[i + 1][j].getText())) { // 注意这里使用 i+1 而不是 i-1  
		                countColumn++;  
		                if (startIndex == -1) {  
		                    startIndex = i; // 记录连续序列的起始索引  
		                }  
		                if (countColumn == 3) { // 已经是第四个连续的了  
		                    // 填充 fourIndex 数组  
		                    for (int k = 0; k < 4; k++) {  
		                        fourIndex[k][0] = j; // 列索引不变  
		                        fourIndex[k][1] = startIndex + k; // 使用行索引的偏移  
		                    }  
		                    setHighlight(fourIndex);  
		                    bool = true;
		                    return true;  
		                }  
		            } else {  
		                countColumn = 0;  
		                startIndex = -1;  
		            }  
		        }  
		    }  
		      
		 // 判断左下到右上的对角线  
		    for (int i = 3; i < values.length; i++) { // 从第四行开始  
		        for (int j = 0; j < values[0].length; j++) { // 确保列索引不会超出范围  
		            int countDiagonal = 1; // 初始化计数器  
		            for (int k = 1; k <= 3; k++) { // 检查接下来的三个元素  
		                int ni = i - k; // 上一个元素的行索引  
		                int nj = j + k; // 下一个元素的列索引  
		                if (ni >= 0 && nj < values[0].length && // 确保索引不会越界  
		                    values[i][j].getText().equals(values[ni][nj].getText())) {  
		                    countDiagonal++; // 如果元素相同,增加计数器  
		                } else {  
		                    countDiagonal = 0; // 重置计数器,因为序列中断了  
		                    break; // 跳出内层循环  
		                }  
		            }  
		      
		            // 将判断移到内层循环外部  
		            if (countDiagonal == 4) { // 如果找到了四个相同的元素  
		                // 填充fourIndex  
		                for (int l = 0; l < 4; l++) {  
		                    fourIndex[l][1] = i - l; // 行索引递减  
		                    fourIndex[l][0] = j + l; // 列索引递增  
		                }  
		                setHighlight(fourIndex);  
		                bool = true;  
		                return true; // 找到后直接返回true  
		            }  
		        }  
		    } 
		 // 检查从左上角到右下角的次对角线  
		    for (int i = 0; i < values.length - 3; i++) { // 注意这里是 <=  
		        for (int j = 0; j < values[0].length - 3; j++) { // 注意这里是 <=  
		            if (values[i][j].getText().equals(values[i + 1][j + 1].getText()) &&  
		                values[i + 1][j + 1].getText().equals(values[i + 2][j + 2].getText()) &&  
		                values[i + 2][j + 2].getText().equals(values[i + 3][j + 3].getText())) {  
		                for (int k = 0; k < 4; k++) {  
		                    fourIndex[k][1] = i + k; // 行索引  
		                    fourIndex[k][0] = j + k; // 列索引  
		                }  
		                setHighlight(fourIndex);  
		                bool = true;  
		                return true; // 找到后直接返回true  
		            }  
		        }  
		    } 
		return false;
	}
	public static void main(String[] args) {
		Application.launch(args);
	}
	
}
  •  结果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2055149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实时手势识别(2)- 基于关键点分类实现零样本图片的任意手势的识别

目录 前言 1.实现效果 2.关键点分类网络 3.KPNet训练测试数据准备 4.训练结果 4.1训练过程可视化 4.2验证集上的混淆矩阵 4.测试结果 4.1不同规模模型的测试结果对比 4.2分类结果投影到第一象限 4.3测试集上的混淆矩阵 4.4 二义性手势结果 4.5视频实测 5.零样本的…

深入理解计算机系统 CSAPP 实验lab:Architecture Lab

前期准备参考: 深入理解计算机系统 CSAPP 第四章 Y86-64模拟器 安装与使用-CSDN博客 writeup上写了要求,这里就不赘述了. Part A: sum.ys: # Execution begins at address 0 .pos 0irmovq stack, %rsp # Set up stack pointercall main # Execute main programhalt # …

【CRT实用小技巧(1)】一键发送命令到所有会话窗口

CRT实用小技巧&#xff08;1&#xff09;一键发送命令到所有会话窗口 在view&#xff08;视图&#xff09;中打开command windows&#xff08;命令窗口&#xff09; 打开后&#xff0c;可以看到下面的命令窗口了 然后再下面的命令窗口中&#xff0c;右键出菜单&#xff0c;选择…

centos7突然掉电后启动报错/dev/mapper/centos-root does not exist

问题现象 物理服务器SR588已安装centos7&#xff0c;突然掉电后系统进不去&#xff0c;提示/dev/mapper/centos-root does not exist 问题解决过程 网上搜索相关的解决方法 1、 用此方法不行 2、 用此方法也是不行 3、 分析查看ls /dev/mapper&#xff0c;目录底下没有cent…

Kafka运行机制(一):Kafka集群启动,controller选举,生产消费流程

前置知识 Kafka基本概念https://blog.csdn.net/dxh9231028/article/details/141270920?spm1001.2014.3001.5501 1. Kafka集群启动 Kafka在启动集群中的各个broker时&#xff0c;broker会向controller注册自己&#xff0c;并且从controller节点同步集群元数据。 broker是Kaf…

栈和堆的区别

存储内容不同&#xff1a; 栈区&#xff1a;主要存储函数调用时的局部变量、函数参数等。栈底是函数调用后的下一条指令。 堆区&#xff1a;存储动态分配的内存&#xff0c;如使用 new 分配的内存&#xff0c;具体内容由程序员安排。 管理方式不同&#xff1a; 栈区&#x…

牛客刷题二叉树(三)

1.输出二叉树的右视图 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** 求二叉树的右视图* param preOrder int整型一维数组 先序遍历* param inOrder int整型一维数组 中序…

【无线通信发展史⑤】万有引力定律的推导前奏3.0,本次学习开普勒三大定律,成就“天空立法者”的美名

前言&#xff1a;用这几个问答形式来解读下我这个系列的来龙去脉。如果大家觉得本篇文章不水的话希望帮忙点赞收藏加关注&#xff0c;你们的鼓舞是我继续更新的动力。 我为什么会写这个系列呢&#xff1f; 首先肯定是因为我本身就是一名从业通信者&#xff0c;想着更加了解自…

高性能 Web 服务器:让网页瞬间绽放的魔法引擎(中)

目录 一.Nginx版本和安装方式:源码编译安装 1.验证版本及编译参数 2.使用安装完成的二进制文件nginx 3.Nginx 启动文件 二.平滑升级和回滚 三.全局配置 实现 nginx 的高并发配置 四.核心配置&#xff1a;新建一个 PC web 站点 五.核心配置&#xff1a;location的详细使用…

vscode 远程控制ssh操作步骤

1.下载拓展Remote - SSH 打开Visual Studio Code&#xff0c;进入拓展市场(CtrlShiftX)&#xff0c;下载拓展Remote - SSH 2.选择远程(隧道/SSH)类别 点击远程资源管理器选项卡&#xff0c;并选择远程(隧道/SSH)类别 4.在弹出的选择配置文件中&#xff0c;点击第一个 5. 连接到…

基于PHP网上投票系统---附源码121500

摘 要 随着全球Internet的迅猛发展和计算机应用的普及&#xff0c;特别是近几年无线网络的广阔覆盖以及无线终端设备的爆炸式增长&#xff0c;使得人们能够随时随地的访问网络&#xff0c;以获取最新信息、参与网络活动、和他人在线互动。为了能及时地了解民情民意&#xff0c;…

深度学习基础—学习率衰减与局部最优问题

1.学习率衰减 下图中&#xff0c;蓝色的线是min-batch梯度下降法过程中较大学习率的的优化路径&#xff0c;绿线是较小学习率的优化路径。 如果使用min-batch梯度下降法&#xff0c;在模型的学习过程中&#xff0c;会有很多噪声&#xff0c;在靠近最小值的时候&#xff0c;由于…

考试:数据库系统(02)

关系代数 ◆并&#xff1a;结果是两张表中所有记录数合并&#xff0c;相同记录只显示一次。 ◆交&#xff1a;结果是两张表中相同的记录。 ◆差&#xff1a;S1-S2, 结果是S1表中有而S2表中没有的那些记录。 ◆笛卡尔积&#xff1a;S1*S2,产生的结果包括S1和S2的所有属性列&…

Redis7基础篇(二)

目录 持化双雄 RDB 案例演示 优势 劣势 AOF 案例演示 正常恢复 异常恢复 优点 缺点​编辑 aof重写机制 ​编辑​编辑重写的原理​编辑 小总结 rdb和aof的混合持久化 纯缓存模式 redis的持久化最终还是靠硬盘 持化双雄 redis提供了一rdb aof 不持久化 rdbaof的…

ansible相关模块

copy模块(重点) copy模块⽤于对⽂件的远程拷⻉操作&#xff08;如把本地的⽂件拷⻉到远程 的机器上) https://docs.ansible.com/ansible/latest/modules/copy_module.htm l#copy-module 在master上准备⼀个⽂件&#xff0c;拷⻉此⽂件到group1的所有机器上 使⽤content参数直…

Linux之 宝塔面板 通过binlog日志恢复被删除表的数据

参考文章 查找mysql的binlog文件位置 这个命令是用来将MySQL的二进制日志文件(mysql-bin.000021)转换成SQL格式的文件(000021.sql)。 /www/server/mysql/bin/mysqlbinlog --base64-outputDECODE-ROWS -v mysql-bin.000021 > /www/000021.sql 提取sql语句 [rootdata]# …

访问网站出现“此站点不安全”如何解决

在网络浏览中&#xff0c;我们经常会遇到浏览器地址栏出现“此站点不安全”的警告。这通常意味着网站没有使用SSL&#xff08;安全套接层&#xff09;加密来保护用户数据的安全。那么&#xff0c;如何通过获得并安装SSL证书来消除这一警告&#xff0c;确保网站的安全可靠呢&…

未来视界,触手可及:揭秘数字透明屏的奇幻之旅

在这个日新月异的科技时代&#xff0c;每一项创新都如同星辰般璀璨&#xff0c;引领着我们向更加智能、更加梦幻的未来迈进。今天&#xff0c;就让我们一起揭开一项颠覆传统视觉体验的前沿科技——数字透明屏的神秘面纱&#xff0c;探索它如何将未来视界&#xff0c;化为触手可…

C++集成spdlog,spdlog基本使用方法

C集成spdlog&#xff0c;spdlog基本使用方法 何时输出日志第一步&#xff1a;集成 spdlog 到你的项目方法 1&#xff1a;使用包管理器&#xff08;例如 vcpkg 或 conan&#xff09;方法 2&#xff1a;手动集成 第二步&#xff1a;基本使用第三步&#xff1a;设置日志级别第四步…

后端开发刷题 | 反转链表【链表篇】

描述 给定一个单链表的头结点pHead(该头节点是有值的&#xff0c;比如在下图&#xff0c;它的val是1)&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链表的表头。 数据范围&#xff1a; 0≤n≤1000 要求&#xff1a;空间复杂度 O(1) &#xff0c;时间复杂度…