主頁 > 後端開發 > 小學生四則運算--軟體工程

小學生四則運算--軟體工程

2021-09-26 06:51:23 後端開發

1.

PSP

 

PSP2.1

Personal Software Process Stages

預估耗時(分鐘)

實際耗時(分鐘)

Planning

計劃

10

10

· Estimate

· 估計這個任務需要多少時間

10

10

Development

開發

655

600

· Analysis

· 需求分析 (包括學習新技術)

30

35

· Design Spec

· 生成設計檔案

30

40

· Design Review

· 設計復審 (和同事審核設計檔案)

10

15

· Coding Standard

· 代碼規范 (為目前的開發制定合適的規范)

5

5

· Design

· 具體設計

40

70

· Coding

· 具體編碼

5h*60

8h*60

· Code Review

· 代碼復審

1h*60

2h*60

· Test

· 測驗(自我測驗,修改代碼,提交修改)

3h*60

2h*60

Reporting

報告

290

60

· Test Report

· 測驗報告+博客

4h*60

3h*60

· Size Measurement

· 計算作業量

10

10

· Postmortem & Process Improvement Plan

· 事后總結, 并提出程序改進計劃

40

30

合計

 

955

1785

2.專案要求

  • 能自動生成小學四則運算題目
  • 除了整數以外,還要支持真分數的四則運算
  • 解題思路

    • 了解四則運算的大概思路,即:生成四則運算式子;用戶輸入結果;程式檢驗用戶輸入的結果是否正確;若用戶輸入的結果錯誤,即把正確答案輸入,
    • 用陣列和隨機函式隨機生成四則運算式子;
    • 了解逆波蘭式,即將中綴表示式轉換成后綴運算式,以便計算機對式子進行運算;
    • 檢驗結果并輸出;

     

    設計實作及代碼說明

      1、NiBoLanShi.java

      對四則運算式子從中綴運算式轉換成后綴運算式,以便計算機計算,

  •   1 package jjj.arithmetic.methods;
      2 
      3 import java.util.List;
      4 import java.math.BigDecimal;
      5 import java.util.ArrayList;
      6 import java.util.Stack;
      7 
      8 public class NiBoLanShi {
      9     public static String cal(String str) {
     10         //對運算式進行預處理,并簡單驗證是否是正確的運算式
     11         //存放處理后的運算式
     12         List<String> list = new ArrayList<>();
     13         char[] arr = str.toCharArray();
     14 
     15         //存放數字臨時變數
     16         StringBuffer tmpStr = new StringBuffer();
     17         for (char c : arr) {
     18             //如果是數字或小數點,添加到臨時變數中
     19             if (c>='0' && c<='9') {
     20                 tmpStr.append(c);
     21             }else if(c=='.') {
     22                 if(tmpStr.indexOf(".")>0) {
     23                     throw new RuntimeException("非法字符");
     24                 }
     25                 tmpStr.append(c);
     26             }
     27 
     28             //如果是加減乘除或者括號,將數字臨時變數和運算子依次放入List中
     29             else if (c=='+' || c=='-' || c=='*' || c=='/' || c=='(' || c==')') {
     30                 if (tmpStr.length() > 0) {
     31                     list.add(tmpStr.toString());
     32                     tmpStr.setLength(0);
     33                 }
     34                 list.add(c + "");
     35             }
     36             else if (c==' ') {
     37                 continue;
     38             }
     39             else {
     40                 throw new RuntimeException("非法字符");
     41             }
     42         }
     43         if (tmpStr.length() > 0) {
     44             list.add(tmpStr.toString());
     45         }
     46 
     47         //初始化后綴運算式
     48         List<String> strList = new ArrayList<>();
     49 
     50         //運算程序中,使用了兩次堆疊結構,
     51         //第一次是將中綴運算式轉換成后綴運算式,第二次是計算后綴運算式的值
     52         Stack<String> stack = new Stack<>();
     53 
     54         //宣告臨時變數,存放堆疊元素
     55         String tmp;
     56 
     57         //將中綴運算式轉換成后綴運算式
     58         for (String s : list) {
     59             //如果是左括號直接入堆疊
     60             if (s.equals("(")) {
     61                 stack.push(s);
     62             }
     63 
     64             //如果是右括號,執行出堆疊操作,依次添加到后綴運算式中,直到出堆疊元素為左括號,左括號和右括號都不添加到后綴運算式中
     65             else if (s.equals(")")) {
     66                 while (!(tmp = stack.pop()).equals("(")) {
     67                     strList.add(tmp);
     68                 }
     69             }
     70 
     71             //如果是加減乘除,彈出所遇優先級大于或等于該運算子的堆疊頂元素(堆疊中肯定沒有右括號,認為左括號的優先級最低),然后將該運算子入堆疊
     72             else if (s.equals("*") || s.equals("/")) {
     73                 while(!stack.isEmpty()) {
     74                     //取出堆疊頂元素
     75                     tmp = stack.peek();//取出但不移除
     76                     if (tmp.equals("*") || tmp.equals("/")) {
     77                         stack.pop();
     78                         strList.add(tmp);
     79                     }
     80                     else {
     81                         break;
     82                     }
     83                 }
     84                 stack.push(s);
     85             }
     86             else if (s.equals("+") || s.equals("-")) {
     87                 while(!stack.isEmpty()) {
     88                     //取出堆疊頂元素
     89                     tmp = stack.peek();
     90                     if (!tmp.equals("(")) {
     91                         stack.pop();
     92                         strList.add(tmp);
     93                     }
     94                     else {
     95                         break;
     96                     }
     97                 }
     98                 stack.push(s);
     99             }
    100 
    101             //如果是數字,直接添加到后綴運算式中
    102             else {
    103                 strList.add(s);
    104             }
    105         }
    106 
    107         //最后依次出堆疊,放入后綴運算式中
    108         while (!stack.isEmpty()) {
    109             strList.add(stack.pop());
    110         }
    111 
    112         //計算后綴運算式的值
    113         Stack<BigDecimal> newStack = new Stack<>();
    114         for (String s : strList) {
    115             //若遇運算子,則從堆疊中退出兩個元素,先退出的放到運算子的右邊,后退出的放到運算子的左邊
    116             //運算后的結果再進堆疊,直到后綴運算式遍歷完畢
    117             if (s.equals("*") || s.equals("/") || s.equals("+") || s.equals("-")) {
    118                 BigDecimal b1 = newStack.pop();
    119                 BigDecimal b2 = newStack.pop();
    120                 switch (s) {
    121                 case "+":
    122                     newStack.push(b2.add(b1));
    123                     break;
    124                 case "-":
    125                     newStack.push(b2.subtract(b1));
    126                     break;
    127                 case "*":
    128                     newStack.push(b2.multiply(b1));
    129                     break;
    130                 case "/":
    131                     newStack.push(b2.divide(b1, 9, BigDecimal.ROUND_HALF_UP));
    132                     break;
    133                 }
    134             }
    135 
    136             //如果是數字,入堆疊
    137             else {
    138                 newStack.push(new BigDecimal(s));
    139             }
    140         }
    141 
    142         //最后,堆疊中僅有一個元素,就是計算結果
    143         return newStack.peek().toString();
    144     }
    145 }

    2、CreateShiZi.java

      利用代碼隨機產生四則運算式子,

  •  1 package jjj.arithmetic.methods;
     2 
     3 
     4 public class CreateShiZi {
     5     public void create(int m, int n, String[] fuHao, String[] strArray) {
     6         String str = "";
     7 
     8         //隨機生成式子
     9         for (int i = 0; i < n; i++) {
    10             str = "";
    11             int[] arr1 = new int[n];
    12             int[] arr2 = new int[n];
    13             arr2[i] = (int)(Math.random()*m+1);
    14             for(int j = 0; j < (int)(Math.random()*10+1); j++) {
    15                 int order = (int)(Math.random()*4);
    16                 arr1[j] = (int)(Math.random()*m+1);
    17                 str = str + arr1[j] + fuHao[order];
    18             }
    19             str = str + arr2[i];
    20             strArray[i] = str;
    21             System.out.println("第"+(i+1)+"題:"+str);
    22             arr1 = null;
    23             arr2 = null;
    24         }
    25         System.out.println("\n");
    26     }
    27 }

    3、Student.java

      主類,用戶輸入答案,及檢驗其答案是否正確,

  •  1 package jjj.arithmetic.texts;
     2 
     3 import java.util.Scanner;
     4 
     5 
     6 import jjj.arithmetic.methods.CreateShiZi;
     7 import jjj.arithmetic.methods.NiBoLanShi;
     8 
     9 public class Student {
    10 
    11     public static void main(String[] args) {
    12         CreateShiZi createShiZi = new CreateShiZi();
    13         NiBoLanShi niBoLanShi = new NiBoLanShi();
    14         String[] fuHao = {"+","-","*","/"};
    15         Scanner input = new Scanner(System.in);
    16         System.out.println("請輸入范圍內的計算:");
    17         int m = input.nextInt();
    18         System.out.println("請輸入要產生的題數:");
    19         int n = input.nextInt();
    20         String[] strArray = new String[n];
    21         System.out.println("\n題目\n");
    22         createShiZi.create(m, n, fuHao, strArray);
    23         for(int i = 0; i<n; i++) {
    24             String result = niBoLanShi.cal(strArray[i]);
    25             System.out.println("第"+(i+1)+"題:"+strArray[i]);
    26             System.out.print("你的答案:");
    27             String yourAnswer = input.next();
    28             if (yourAnswer.equals(result)) {
    29                 System.out.println("True\n");
    30             }else {
    31                 System.out.println("False");
    32                 System.out.println("正確答案:"+result+"\n");
    33             }
    34         }
    35     }
    36 }

     

  • 測驗運行

      為了方便展示,測驗以小數目為主:

  •  

     

     總結

       這次的用Java實作簡單的四則運算,讓我重拾了以前的基礎知識,譬如陣列,串列等等,程式看起來不是很完美,運行時候或許有一些小漏洞,例如隨機產生的四則運算式子中并沒有加入括號;后續也并沒有進行程式的性能分析,由于時間問題及個人能力有限,只能以后再繼續完善了,

努力地向月光下的影子——駭客靠攏!!! 黎明之花,待時綻放

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/302923.html

標籤:其他

上一篇:python有序序列的字典序列推導式運用技巧!

下一篇:資料結構 二叉樹的順序結構原來要這么寫

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more