【日擼 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.pswp.cn/news/905010.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905010.shtml
英文地址,請注明出處:http://en.pswp.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命令&…