【日撸 Java 三百行】Day 10(综合任务 1)

目录

Day 10:综合任务 1

 一、题目分析

1. 数据结构

2. 相关函数基本知识

二、模块介绍

1. 初始化与成绩矩阵的构建

2. 创建总成绩数组

3. 寻找成绩极值

三、代码与测试

小结

拓展:关于求极值的相关算法


Day 10:综合任务 1

Task:

        学生的成绩存放于一个矩阵,其中行表示学生,列表示科目。如:第 0 行表示第 0 个学生的数学、语文、英语成绩。要求:

        进行学生成绩的随机生成, 区间为 [50, 100].
        找出成绩最好、最差的同学。但有挂科的同学不参加评比.

  • 实际代码中,for 和 if 是最常见的, switch 和 while 使用少得多.
  • 使用了 continue, 它是指继续跳过本次循环后面的代码,直接进入下一次循环. 而 break 是跳出整个循环体.
  • 为了随机数,迫不得已提前使用了 new 语句生成对象.
  • 通过数据测试找出程序中的 bug.

 一、题目分析

1. 数据结构

        每个学生的科目都是三科,不会多不会少,因此多个学生之间的记录是定长记录,因此可以考虑使用固定的一个m*3二维数组来记录所有学生的成绩。此外,题目要求记录成绩最好和最差的同学,因此,可以考虑使用一个数组记录每个同学的成绩和,然后通过成绩统计最高成绩与最低成绩。

        注:就实现统计最好最差同学来说,这里的求和数组不是必要的,可以在设计学生成绩时就完成相关统计。因此代码是可以简化的,只是此处为了练习java代码内容故尽可能让数据结构完善。

2. 相关函数基本知识

1) Random.nextlnt()
        为避免问题模拟时考虑设置数据的麻烦,这里使用了数据数生成的基本方法。
        java提供了Random库,此库中包含了一些系列可用的随机数生成工具。今天我们将使用如下函数:

java Random.nextInt()方法
public int nextInt(int n)
        该方法的作用是生成一个随机的int值,该值介于[0,n)的区间,也就是0到n之间的随机int值,包含0而不包含n

        有几个注意点是使用这个方法要注意的。

  • 此随机数的生成前闭后开的区间是,因此是无法生成n的
  • 此数据生成最低值是0,若要完成指定[a, b)的生成需要额外设计代码:a + temRandom.nextInt(b - a);
  • 数据是整型,不包含浮点(虽然成绩兼容浮点值,我们这暂时就整型来说明)

2)关于循环语句
        参考:【Java 专题补充】流程控制语句-CSDN博客

3)关于 continue 和 break
        参考: 【Java 专题补充】流程控制语句-CSDN博客

二、模块介绍

1. 初始化与成绩矩阵的构建

        初始化定义的上限不是100而是101是因为随机函数的右界是个开区间,因此要取满需要额外加一。
        此外,考虑到学生数量是不确定的,且考虑到成绩表的可扩展性,这里采用的是动态分配的方法创建矩阵。

// Step 1. Generate the date with n student and m course.// Set these value by yourself.int n = 10;int m = 3;int lowerBound = 50;int upperBound = 101;int threshold = 60;// Here we have to use an object to generate random numbersRandom temRandom = new Random();int[][] data = new int[n][m];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {data[i][j] = lowerBound + temRandom.nextInt(upperBound - lowerBound);} // Of for j} // Of for i

2. 创建总成绩数组

        创建总成绩数组。再次强调,这个数组不是必须的,此处是为了区分过程为了理清楚原理特别使用的一个存储空间。本质上可以通过成绩矩阵直接获得这一步的结果。
        当某个学生成绩低于及格线时,其总分无效,依据题意,这里令其总成绩为0。
        这里的0更多起了标记这个学生成绩无效的作用。

// Step 2.Compute the total score of each student.int[] totalScores = new int[n];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (data[i][j] < threshold) {totalScores[i] = 0;break;} // Of iftotalScores[i] += data[i][j];} // Of for j} // Of for i

3. 寻找成绩极值

分析代码如下:
        这里统计时将总分数为0(标记的不及格/通过)的学生跳过统计,符合题意要求
        这里使用了编程中常见得不能再常见的求极值方案——通过给预求极值设定一个反方向的最极限值(说人话就是给最大值设定一个能取的最小值为初始值,给最小值设定一个能取的最大值为初始值。这是一个求极值很常见的方法)
        这里能取的最小值就是0,最大值就是m * upperBound,因此只要保证最大值初始值小于等于0即可,最小值初始值大于等于m * upperBound即可。
        但是要说明,这个最值的含义只有在元素集的数目大于0才有意义。

// Step 3. Find the best and worst student.// Typical initialization for index: invalid value.int tempBestIndex = -1;int tempWorstIndex = -1;// Typical initialization for best and worst values.// They must be replaced by valid values.int tempBestScore = 0;int tempWorstScore = m * upperBound + 1;for (int i = 0; i < n; i++) {// Do not consider failed students.if (totalScores[i] == 0) {continue;} // Of ifif (tempBestScore < totalScores[i]) {tempBestScore = totalScores[i];tempBestIndex = i;} // Of if// Attention: This if statememt cannot be combined with the last one// using "else if",because a student can be both the best and the// worst. I found this bug while setting upperBound = 65.if (tempWorstScore > totalScores[i]) {tempWorstScore = totalScores[i];tempWorstIndex = i;} // Of if} // Of for i

三、代码与测试

package basic;import java.util.Arrays;
import java.util.Random;/*** The usage of sth.** @author: Changyang Hu joe03@foxmail.com* @date created: 2025-05-10*/
public class Task1 {/*** ********************** @Title: main* @Description: The entrance of the program.** @param args Not used now.* @return void **********************/public static void main(String args[]) {task1();}// Of main/*** ********************** @Title: task1* @Description: Method unit test.* * @return void **********************/public static void task1() {// Step 1. Generate the data with n student and m courses.// Set these values by yourselfint n = 10;int m = 3;int lowerBound = 50;int upperBound = 101; // Should be 100. I use this value for testingint threshold = 60;// Here we have to use an object to generate random numbers.Random tempRandom = new Random();int[][] data = new int[n][m];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {data[i][j] = lowerBound + tempRandom.nextInt(upperBound - lowerBound);} // Of for j} // Of for iSystem.out.println("The data is:\r\n" + Arrays.deepToString(data));// Step 2. Compute the total score of each student.int[] totalScores = new int[n];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (data[i][j] < threshold) {totalScores[i] = 0;break;} // Of iftotalScores[i] += data[i][j];} // Of for j} // Of for iSystem.out.println("The total scores are:\r\n" + Arrays.toString(totalScores));// Step 3. Find the best and worst student.// Typical initialization for index: invalid value.int tempBestIndex = -1;int tempWorstIndex = -1;// Typical initialization for best and worst value.// They must be replaced by valid values.int tempBestScore = 0;int tempWorstScore = m * upperBound + 1;for (int i = 0; i < n; i++) {// Do not consider failed students.if (totalScores[i] == 0) {continue;} // Of ifif (tempBestScore < totalScores[i]) {tempBestScore = totalScores[i];tempBestIndex = i;} // Of if// Attention: This if statement cannot be combined with the last one// using "else if", because a student can be both the best and the// worst. I found this bug while setting upperBound = 65.if (tempWorstScore > totalScores[i]) {tempWorstScore = totalScores[i];tempWorstIndex = i;} // Of if} // Of for i// Step 4. Output the student number and score.if (tempBestIndex == -1) {System.out.println("Cannot find best student. ALL students have failed.");} else {System.out.println("The best student is No." + tempBestIndex + " with scores: "+ Arrays.toString(data[tempBestIndex]));} // Of ifif (tempWorstIndex == -1) {System.out.println("Cannot find worst student. All students have failed.");} else {System.out.println("The worst student is No." + tempWorstIndex + " with scores: "+ Arrays.toString(data[tempWorstIndex]));} // Of if}// Of task1}// Of class Task1

 第一次运行结果:upperBound = 101

在一次运行后数据如我们预期那样,对于不及格的学生,其总分是按照0处理的。
为了验证我们预先的特殊情况,我们先将随机生成的分数上限下调到66,让我们的分数随机数更容易落到不及格:upperBound = 66

可以发现,因为每个人存在不及格学科(由于是随机生成,所以也存在第一张图片所示,仍然有结果),因此大家总分都不及格,因此,这里大家的分数在比较时都跳过了,出现了“无最高分,无最低分”的人为规定条件。 


小结

        本篇展示了数据处理中很多比较常见的方法,包括总分求和、极值的计算与分析等。要注意的点就是灵活对于数据进行分析,合理利用数据结构即可,属于是基础的表格数据的应用。
        但是引起我思考的是其中求极值的方法。本篇代码中我们使用的是一种给极值赋相反的极限值的一种无效赋值法,我提到了“ 数据集合元素要大于0时,极值才有意义 ”。

拓展:关于求极值的相关算法

        任何最大值最小值的含义都是在元素集大于0才有意义,这个不言而喻。
        也是因为这个原因,还有另一种设置初值的方案是——将第一个元素的值设定给初始极值,并由此衍生——只记录最大值的下标而不记录最大值本身,然后下标初始值为0(就是默认为第一个元素的值)。如果这么做了,我们设定的变量似乎就更少了呢,而且,对于随机存取的数组来说,下标的信息熵比元素本身要多***(知道极值下标的话,在知道数据顺序之余还能以O(1)速度立马知道数据,而只知道数据最大值本身的话,那也就知道数据本身而已了)***。
        但是事物要辩证看待,本代码使用的无效赋值方法其实可以让数据本身起到一种标签的作用,若比大小时候有特殊处理时(比如这里的0分不统计),通过判断极值是否有效也可以用以断定“ 是不是所有大小判断都已经跳过 ”这种极特殊情景。

        除此之外,一般常见的求极值的算法还有:三分、二元函数、退火求极值的方法。更详细的可以参考如下博文:
优化算法:一元与二元函数极值求解与退火方法-CSDN博客

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

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

相关文章

c++:库(Library)

目录 什么是库&#xff1f; C中库的两种形态&#xff1a;静态库 和 动态库 静态链接 vs 动态链接&#xff08;链接 ≠ 库&#xff09; &#x1f512; 静态链接&#xff08;Static Linking&#xff09; &#x1f517; 动态链接&#xff08;Dynamic Linking&#xff09; C标…

Java线程池深度解析:从使用到原理全面掌握

在高并发场景下&#xff0c;线程管理是提升系统性能的关键。本文将深入探讨Java线程池的核心机制&#xff0c;带你从基础使用到底层实现全面掌握这一重要技术。 一、线程池存在的意义 1.1 线程的隐形成本 尽管线程相比进程更轻量&#xff0c;但当QPS达到万级时&#xff1a; 频…

PostgreSQL 的 pg_advisory_lock_shared 函数

PostgreSQL 的 pg_advisory_lock_shared 函数详解 pg_advisory_lock_shared 是 PostgreSQL 提供的共享咨询锁函数&#xff0c;允许多个会话同时获取相同键值的共享锁&#xff0c;但排斥排他锁。 共享咨询锁 vs 排他咨询锁 锁类型共享锁 (pg_advisory_lock_shared)排他锁 (pg…

Halcon之计算抓取螺母的位姿

文章目录 1&#xff0c;项目说明。2&#xff0c;注意事项3&#xff0c;关联的主要算子3.1&#xff0c; gen_parallels_xld 3.2 &#xff0c;convert_pose_type 4&#xff0c;程序流程。5&#xff0c;代码6&#xff0c;Demo链接。 1&#xff0c;项目说明。 Robot标定使用的模式…

互联网大厂Java求职面试:AI集成场景下的技术挑战与架构设计

标题&#xff1a;互联网大厂Java求职面试&#xff1a;AI集成场景下的技术挑战与架构设计 第一幕&#xff1a;向量数据库选型与性能调优 技术总监&#xff08;严肃脸&#xff09;&#xff1a; 郑薪苦&#xff0c;我们最近在做一个基于大语言模型的企业级AI应用&#xff0c;需要…

ABB电机控制和保护单元与Profibus DP主站转Modbus TCP网关快速通讯案例

ABB电机控制和保护单元与Profibus DP主站转Modbus TCP网关快速通讯案例 在现代工业自动化系统中&#xff0c;设备之间的互联互通至关重要。Profibus DP和Modbus TCP是两种常见的通信协议&#xff0c;分别应用于不同的场景。为了实现这两种协议的相互转换&#xff0c;Profibus …

智慧农业、智慧养殖平台—监控摄像头管理监控设计—仙盟创梦IDE

智慧养殖 监控摄像头是核心管理工具&#xff0c;主要通过以下方式提升养殖效率与管理水平&#xff1a; 环境实时监测&#xff1a;对养殖区域进行全天候可视化监控&#xff0c;及时捕捉温度、湿度、通风等环境要素变化&#xff0c;确保动物生存环境稳定 。例如在规模化猪场&…

YOLO 从入门到精通学习指南

一、引言 在计算机视觉领域,目标检测是一项至关重要的任务,其应用场景广泛,涵盖安防监控、自动驾驶、智能交通等众多领域。YOLO(You Only Look Once)作为目标检测领域的经典算法系列,以其高效、快速的特点受到了广泛的关注和应用。本学习指南将带领你从 YOLO 的基础概念…

Java 24新特性深度解析:从优化技巧到高手进阶指南

一、Java 24核心新特性详解 Java 24作为长期支持版本(LTS)&#xff0c;带来了许多令人振奋的新特性&#xff0c;下面我们将深入探讨其中最值得关注的改进。 1. 字符串模板&#xff08;String Templates&#xff09;正式发布 字符串模板结束了Java字符串拼接的混乱时代&#…

《类和对象(中)》

引言&#xff1a; 上次我们主要学习了类的相关知识&#xff0c;今天我们就来学习类和对象(中)&#xff0c;今天也会用到之前学习过的东西&#xff0c;可以说是前面知识的结合&#xff0c;较前面会难一点&#xff08;打个预防针&#xff09;。 一&#xff1a;类的默认成员函数…

为什么 AI 理解不了逻辑问题?

人类擅长“如果 A 则 B”,AI 擅长“这个像那个”。逻辑推理?对它来说是一场灾难性的认知挑战。 前言 在实际使用 AI(尤其是大型语言模型,比如 GPT、Claude、Gemini 等)时,我们常发现一个诡异的现象:它们文采斐然,甚至能讲出笑话,但一旦问点小学奥数或逻辑问题,就集体…

C# 使用SunnyUI控件 (VS 2019)

前言&#xff1a;建议下载源码&#xff0c;源码中包含了各种控件的用法案例。 下载 帮助文档: 文档预览 - Gitee.comGitee: SunnyUI: SunnyUI.NET 是基于.NET Framework 4.0、.NET8、.NET9 框架的 C# WinForm UI、开源控件库、工具类库、扩展类库、多页面开发框架。GitHub: h…

Spring Cloud: Nacos

Nacos Nacos是阿里巴巴开源的一个服务发现&#xff0c;配置管理和服务管理平台。只要用于分布式系统中的微服务注册&#xff0c;发现和配置管理&#xff0c;nacos是一个注册中心的组件 官方仓库&#xff1a;https://nacos.io/ Nacos的下载 Releases alibaba/nacos 在官网中…

Linux下的c/c++开发之操作mysql数据库

libmysqlclient-dev介绍&#xff08;Linux 下的 Mysql C/C 开发包&#xff09; libmysqlclient-dev 是一个开发包&#xff0c;在Linux环境下为使用 MySQL C API 进行开发的c/c程序员提供头文件&#xff08;如 mysql.h&#xff09;和静态库/动态库的链接信息&#xff08;如 lib…

Java EE(Spring+Spring MVC+MyBatis)从入门到精通企业级应用开发教程——1初识MyBatis框架

1、MyBatis工作原理 MyBatis操作数据库流程分为8个步骤&#xff0c;具体介绍如下&#xff1a; &#xff08;1&#xff09;MyBatis读取核心配置文件mybatis-config.xml mybatis-config.xml核心配置文件主要配置了MyBatis的运行环境等信息。 &#xff08;2&#xff09;加载映射…

【许可证】Open Source Licenses

长期更新 扩展&#xff1a;shield.io装饰 开源许可证&#xff08;Open Source Licenses&#xff09;有很多种&#xff0c;每种都有不同的授权和限制&#xff0c;适用于不同目的。 默认的ISC&#x1f7f0;MIT License是否可商用是否要求开源衍生项目是否必须署名是否有专利授权…

ZooKeeper工作机制与应用场景

目录 1.1、概述1.2、选举机制1.2.1、选举触发条件1.2.2、选举规则1.2.3、选举过程详解 1.3、数据同步机制1.3.1、正常同步1.3.2、宕机同步 1.4、客户端常用命令1.5、应用场景1.5.1、配置管理1.5.2、命令服务1.5.3、分布式锁服务1.5.4、集群管理1.5.5、分布式ID1.5.6、分布式协调…

前端面经-VUE3篇(四)--pinia篇-基本使用、store、state、getter、action、插件

一、基本使用 1、什么是 Pinia&#xff1f; Pinia 是 Vue.js 的官方状态管理库&#xff0c;是 Vuex 的“升级版”。它专为 Vue 3 和 Composition API 设计&#xff0c;用于管理多个组件之间共享的数据&#xff08;也叫“全局状态”&#xff09;。 2、为什么需要状态管理库&a…

数据结构之图的遍历

图的遍历 图的遍历目的是访问图的每一个顶点恰好一次,&#xff0c;同时访问图中每条边恰好一 次。 对于无向图&#xff0c;常见的遍历方式有深度优先遍历&#xff08;Depth-First Search, DFS&#xff09; 和广度优先遍历&#xff08;Breadth-First Search, BFS&#xff09;。…

Ubuntu 第11章 网络管理_常用的网络配置命令

为了管理网络&#xff0c;Linux提供了许多非常有用的网络管理命令。利用这些命令&#xff0c;一方面可以有效地管理网络&#xff0c;另一方面出现网络故障时&#xff0c;可以快速进行诊断。本节将对Ubuntu提供的网络管理命令进行介绍。 11.2.1 ifconfig命令 关于ifconfig命令&…