我是小康小白,一個平平無奇的Java小白,熱愛有趣的文字,生活和遠方,
個人博客:https://blog.csdn.net/weixin_45791445
有問題歡迎QQ聯系:1059320343 (記得備注CSDN)
大家好呀,我康小白又來了,

閑話不多說,讓我們開始正題,
一,題目:
1.1【問題描述】
撰寫一個幫助小學生練習數學的程式,幫助小學生練習100以內的四種數學運算:加、減、乘、除,
1.2【基本要求】
a) 程式應先詢問用戶的ID號(ID號包括兩個大寫字母和4位數字),例如:
請輸入用戶ID號:AB1234 程式應對輸入的ID號驗證,符合ID號要求的格式,然后程式提示三種選擇: (1)開始測驗 (2)檢查分數 (3)退出
b) 測驗:該程式將給出10道數學題,例如:
12 * 3 =36
48 + 32 =80
?
56 / 28 =2
注意:
i)學生將依次回答每一個問題(在等于號后面給出答案),然后給出下一道題,
ii)試題應包含四種數學運算:加、減、乘、除,它們是隨機產生的,相鄰的問題應該是不同的操作,每個操作必須至少出現一次,
iii)為每道題隨機生成數字,但必須確保參與運算的數字和結果都小于100且大于零的整數, iv)十道題做完后,記錄學生完成這十道題所用的時間,
v)給每個學生一個分數,將該學生的ID、成績和使用時間保存到一個名為record.txt的檔案中,
vi)在螢屏上輸出以下資訊:
問題 | 正確答案 | 你的答案
c) 成績檢查:從檔案“record.txt”中列出該學生的所有歷史成績,例如:
你以前的記錄是:
AB1234 80 150秒
AB1234 50 182秒
AB1234 90 98秒
二,注意點
這道題目不難,但如何在題目中體現我們Java的面向物件那?
君且聽我慢慢道來:
-
分析物件:
首先題目的主體是什么:計算題,玩家
那么就是兩物件; -
分析物件屬性:
-
計算題(Operation):
計算題有什么屬性呀?
兩個引數,一個結果,一個運算子號;
這是最基礎的屬性,可是這是就有個問題了,兩個運算的引數尚可以隨機生成,那運算的符號如何隨機生成呀?
小白的想法是使用數字來代替符號,在物件類中添加相應的方法進行轉換,
可這時小白又遇到了一個問題,小白原本的轉換是這樣寫的:

設定一個String型別的屬性expression,通過方法轉化成對應的符號,
可是在運算的時候小白發現了問題,我的這種方法可以進行輸出但不能進行運算,()
于是小白想了一種解決方法:

設定了String型別的expression變數用來輸出運算式,
設定了float型別的result來記錄正確結果,
(
這里使用的是switch case陳述句,在這種判斷中會比多重if回圈快
)
后面為了進行對比,小白還設定了一個float型別的playerResult來存盤每道題玩家的運算結果,
所以運算式(Operation)的所有屬性有:

為了講存盤式轉換為String形式,還需要重寫物件的toString()方法

- 玩家(Player)
基礎屬性:玩家ID,玩家的總成績,玩家的所用時間,玩家最后的運算式以及自己的答案和正確答案

為了計算玩家得分,還需要寫一個方法

為了實作對玩家成績的輸入,需要重寫物件的toStirng()方法

為了輸出用戶所有的題目資訊,還需要寫一個方法

由于operationsToString是一個ArrayList集合,所以使用for回圈輸出比迭代器要快,迭代器更適合類似于LinkList的輸出,
- 玩家(Player)
-
-
上面就是Java面向物件思想的集中體現:
遇到專案(上面的這道題目就可以簡單理解為一個簡單的小專案)時,思考其中一共有多少物件,且首先分析這些物件基礎的屬性有什么,(就像上文的玩家物件基礎屬性只有玩家ID,玩家總成績,玩家所用時間),然后在做專案的程序中分析為了完成專案還需要多少屬性(就像上文的玩家物件中有個ArrayList型別的屬性operationsToString----指的是玩家最后的運算式以及自己的答案和正確答案,為什么要將玩家最后的運算式以及自己的答案和正確答案作為一個單獨的屬性添加到玩家物件中?),
當然還有很重要的一點是所有的屬性都應當是私有(private)的,只能通過get和set方法實作對屬性的訪問,這也就是Java三大特性中的封裝,封裝提高了代碼的安全性降低了代碼的耦合度,方便了模塊的多次呼叫,
那么如何在題目中體現基礎的軟體架構?
我下面使用的就是一種軟體架構—三層架構
-
三層架構
這是百度的結果
表現層(UI)(web層)
業務邏輯層(BLL)(service層)
資料訪問層(DAL)(dao層)
再加上物體類別庫(Model)

src目錄下有三個包,dao , model , service , web
dao 包中原本應當是存放對資料庫的訪問,即對資料庫的增刪改查,這里由于題目中要求使用的是創建txt檔案來存盤資訊,所以里面類的方法實作了對txt的存盤和存出,還有一些是專案中需要使l用的基礎方法,(具體代碼請查看文章末尾的所有代碼)
model中存放的是物體類,一般是與資料庫中的資料表相對應,
service包中的類起連接作用,將UI表示層與DAL資料訪問層之間聯系起來,他們就是處理涉及業務邏輯相關的問題,比如在呼叫訪問資料庫之前,先處理資料、判斷資料,
web層存放的是用戶看到的主界面,由于本題目沒有對界面的要求,所以這里小白沒有寫內容, -
在完成一個專案時要完善對各種情況的思考,以及處理,
例如題目要求中要求只讀出該學生的歷史成績那么就應當考慮到檔案中可能會存在其它學生的歷史成績,
那么就需要在讀取成績時添加一個判斷
我的代碼實作是這樣的

3. 實作了上面文章中的兩點便實作了面向物件思維和軟體架構的小實踐,
三,補充
為什么要將玩家最后的運算式以及自己的答案和正確答案作為一個單獨的屬性添加到玩家物件中?
因為為了實作一個玩家對應所有他在這次測驗中完成的題目的自己的答案和正確答案,之前
軟體架構和設計思維有什么區別?
設計是架構的實作之一,
四,代碼
dao包中
—WorkDomeDao類
package dao;
import model.Operation;
import model.Player;
import java.io.*;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
/**
* @author kangzhijie
* @date 2020/10/10 10:56
*/
public class WorkDemoDao {
//隨機生成數字去進行運算,但運算的型別由輸入的symbol確定
public Operation randomGenerate(int symbol, Player player) {
Random random = new Random();
int x = random.nextInt(100);
int y = random.nextInt(100);
while (x == 0) {
x = random.nextInt(100);
}
while (y == 0) {
y = random.nextInt(100);
}
Operation operation = new Operation(x, y, symbol);
//呼叫方法來創建運算式
operation.matchingSymbol();
//獲得運算式
System.out.print(operation.getExpression() + "=");
//要求用戶去輸入自己的答案
try {
Scanner scanner = new Scanner(System.in);
operation.setPlayerResult(scanner.nextFloat());
} catch (Exception e){
System.out.println("提示:每次運算的結果只需要精確到小數點后一位即可,且無需四舍五入");
System.out.println("請再次輸入你的答案");
Scanner scanner1 = new Scanner(System.in);
operation.setPlayerResult(scanner1.nextFloat());
}
//計算總分
player.countScore(operation);
//將這次的運算添加到List集合中
player.getOperationsToString().add(operation.toString());
return operation;
}
//游戲的主體,player是玩家物件
public void mainBody(Player player) {
System.out.println("提示:每次運算的結果只需要精確到小數點后一位即可,且無需四舍五入");
//在每次開始游戲之前重置當前用戶物件的成績和使用時間
player.setScore(0);
player.setTime(0);
ArrayList<String> arrayList = new ArrayList<>();
player.setOperationsToString(arrayList);
Random random = new Random();
WorkDemoDao workDemo = new WorkDemoDao();
long startTime = System.currentTimeMillis();
for (int i = 0; i <= 3; i++) {
workDemo.randomGenerate(i, player);
}
//設定個節點保證每一次的新操作與上次不同
int symbolLast = 3;
for (int j = 0; j < 7; j++) {
int symbol = random.nextInt(3);
while (symbol == symbolLast) {
symbol = random.nextInt(3);
}
symbolLast = symbol;
workDemo.randomGenerate(symbol, player);
}
long endTime = System.currentTimeMillis();
long time = (endTime - startTime) / 1000;
player.setTime(time);
workDemo.inputSource(player);
}
//判斷輸入ID是否符合要求
public Boolean judgeId(String id) {
int judge1 = 1;
int judge2 = 1;
String strEnglish = id.substring(0, 2);
// System.out.println(strEnglish);
String strNumber = id.substring(2, 6);
// System.out.println(strNumber);
//判斷字串是否都為大寫
char data1[] = strEnglish.toCharArray();
for (char value : data1) {
if (value > '0' && value < '9') {
judge1 = 0;
}
if (Character.isLowerCase(value)) {
judge1 = 0;
}
}
//判斷字串是否都為數字
char data2[] = strNumber.toCharArray();
for (char c : data2) {
if (c < '0' || c > '9') {
judge2 = 0;
}
}
return judge1 != 1 || judge2 != 1;
}
//判斷ID的格式
public String inputID() {
Boolean judge;
Scanner scanner = new Scanner(System.in);
WorkDemoDao workDemo = new WorkDemoDao();
System.out.println("提示:玩家ID應該由兩位大寫英語字母加四位數字組成");
System.out.print("請輸入玩家的ID:");
String id = scanner.next();
if (id.length() == 6) {
judge = workDemo.judgeId(id);
} else {
judge = true;
}
if (judge) {
while (judge) {
System.out.println("ID不符合格式");
System.out.println("提示:玩家ID應該由兩位大寫英語字母加四位數字組成");
System.out.print("請重新輸入您的ID:");
id = scanner.next();
if (id.length() == 6) {
judge = workDemo.judgeId(id);
} else {
judge = true;
}
}
}
return id;
}
//向檔案中寫入玩家的資訊
public void inputSource(Player player) {
File file = new File("D:\\record.txt");
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
//FileWriter構造方法中添加的true確保了Java檔案寫入是向檔案末尾添加而不是覆寫原檔案
FileWriter fileWriter = new FileWriter("D:\\record.txt", true);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
bufferedWriter.write(player.toString() + "\n");
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//查詢檔案獲取資訊
public void outputScoreLast(Player player) {
File file = new File("D:\\record.txt");
//使用ArrayList來存盤每行讀取到的字串
ArrayList<String> arrayList = new ArrayList<>();
if (!file.exists() && !file.isDirectory()) {
System.out.println("您尚未進行游戲,請先進行游戲后查詢分數!");
} else {
System.out.println("您之前的記錄是:");
try {
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r");
//按行讀取字串
String str = null;
while ((str = randomAccessFile.readLine()) != null) {
//判斷是否為當前用戶ID
String[] middle = str.split(" ");
if (middle[0].equals(player.getId())) {
arrayList.add(str + "秒");
}
}
randomAccessFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (arrayList.size() != 0) {
for (String s : arrayList) {
System.out.println(s);
}
} else {
System.out.println("您還未進行測驗,請至少測驗一次后,查詢成績");
}
}
//選擇代碼的主體
public void switchCase(Player player) throws IOException {
Scanner scanner = new Scanner(System.in);
WorkDemoDao workDemo = new WorkDemoDao();
System.out.println("歡迎玩家" + player.getId());
boolean middle = true;
while (middle) {
System.out.println("請選擇您要進行的操作:");
System.out.println("-----(1)開始測驗-----");
System.out.println("-----(2)檢查分數-----");
System.out.println("-----(3)退出-----");
int i = scanner.nextInt();
switch (i) {
case 1:
workDemo.mainBody(player);
player.inputExpression();
System.out.println(player.getId() + "的成績是" + player.getScore());
break;
case 2:
workDemo.outputScoreLast(player);
break;
case 3:
middle = false;
break;
default:
System.out.println("無效操作,請重新輸入");
break;
}
}
System.out.println("已成功退出");
}
}
model包
—Operation類
—Player類
package model;
/**
* @author kangzhijie
* @date 2020/9/27 10:19
*/
public class Operation {
//運算變數一
private int x;
//運算變數二
private int y;
//運算子號
private int symbol;
//正確結果
private float result;
//算式的運算式
private String expression;
//玩家輸入的答案
private float playerResult;
public Operation() {
}
public Operation(int x, int y, int symbol) {
this.x = x;
this.y = y;
this.symbol = symbol;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getSymbol() {
return symbol;
}
public void setSymbol(int symbol) {
this.symbol = symbol;
}
public float getResult() {
return result;
}
public void setResult(float result) {
this.result = result;
}
public String getExpression() {
return expression;
}
public void setExpression(String expression) {
this.expression = expression;
}
public float getPlayerResult() {
return playerResult;
}
public void setPlayerResult(float playerResult) {
this.playerResult = playerResult;
}
public void matchingSymbol() {
switch (symbol) {
case 0:
result = x + y;
expression = x + "+" + y;
break;
case 1:
result = x - y;
expression = x + "-" + y;
break;
case 2:
result = x * y;
expression = x + "*" + y;
break;
case 3:
result = x / y;
expression = x + "/" + y;
break;
default:
System.out.println("無此型別");
break;
}
}
@Override
public String toString() {
return expression + " | " + result + " | " + playerResult;
}
}
package model;
import java.util.ArrayList;
import java.util.List;
/**
* @author kangzhijie
* @date 2020/9/27 11:30
*/
public class Player {
//玩家id
private String id;
//玩家總成績
private int score;
//玩家所用時間
private long time;
//玩家最后的運算式以及自己的答案和正確答案
private ArrayList<String> operationsToString = new ArrayList<>();
public Player() {
}
public Player(String id) {
this.id = id;
}
public Player(String id, int score, long time, ArrayList<String> operationsToString) {
this.id = id;
this.score = score;
this.time = time;
this.operationsToString = operationsToString;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
public List<String> getOperationsToString() {
return operationsToString;
}
public void setOperationsToString(ArrayList<String> operationsToString) {
this.operationsToString = operationsToString;
}
//計算得分
public void countScore(Operation operation) {
if (operation.getPlayerResult() == operation.getResult()) {
this.score += 10;
}
}
//輸出用戶所有的題目資訊
public void inputExpression() {
System.out.println("問題 | 正確答案 | 你的答案");
for (int i = 0; i < operationsToString.size(); i++) {
System.out.println(operationsToString.get(i));
}
}
@Override
public String toString() {
return id + " " + score + " " + time;
}
}
service包
—WorkDemo類
package service;
import dao.WorkDemoDao;
import model.Player;
import java.io.IOException;
/**
* @author kangzhijie
* @date 2020/9/27 8:21
*/
public class WorkDemo {
public static void main(String[] args) throws IOException {
WorkDemoDao workDemo = new WorkDemoDao();
System.out.println("開始測驗");
//獲取正確的id作為id
String id = workDemo.inputID();
//創建玩家物件
Player player = new Player(id);
//開始選擇操作
workDemo.switchCase(player);
}
}
web包
空
以上就是代碼原始碼,如有問題和疑惑,以及想要代碼的包的歡迎聯系小白,
小白寫博客不容易,希望各位兄弟們,點贊評論收藏加關注,小白在此謝謝各位老爺們,

對于白嫖的兄弟們

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/169132.html
標籤:其他
下一篇:OpenCV:讀取與寫入圖片
