軟件工程——結對編程第二次作業

目錄

  • 1. 題目及要求
  • 2. 功能的設計
  • 3. GUI(圖形用戶界面)的設計
  • 4. 容錯機制的設計
    • 4.1 選擇運算符的容錯處理
    • 4.2 最大值和題目數輸入的容錯處理
    • 4.3 打開文件容錯處理
    • 4.4 打印的容錯處理
  • 5. 程序的運行效果
  • 6. 對領航員的評價
  • 7. 總結

本次作業所開發的程序已上傳至Coding.net中

結對伙伴——王宗波

我在本次的作業中擔任“駕駛員”的角色,王宗波同學擔任“領航員”的角色

1. 題目及要求

在這里我們選擇了“小學四則運算”自動生成的題目,其具體要求如下:

  • 能夠自動生成四則運算練習題
  • 可以定制題目數量
  • 用戶可以選擇運算符
  • 用戶設置最大數(如十以內、百以內等)
  • 用戶選擇是否有括號、是否有小數
  • 用戶選擇輸出方式(如輸出到文件、打印機等)
  • 最好能提供圖形用戶界面(根據自己能力選做,以完成上述功能為主)

2. 功能的設計

考慮到題目要求、開發難度和實際中的需求,我們決定開發的程序應具有如下功能:

  • 自動生成四則(混合)運算題目
  • 可以定制題目數量
  • 可以定制最大值
  • 可以定制四則運算符
  • 可以切換小數/整數運算
  • 可以添加括號改變運算順序
  • 可以輸出到文件,并能讓用戶方便的直接打開生成的文件
  • 可以調用系統接口進行打印的設置、頁面的設置,進行打印預覽和打印
  • 提供簡單的圖形化界面
  • 能對用戶的非法操作進行容錯處理

3. GUI(圖形用戶界面)的設計

我們選用了C#語言,開發Windows窗體應用程序來提供圖形用戶界面。
所設計的GUI如圖所示
avator

其中左側的Rich Text Box(富文本文本框)用來顯示自動生成的題目。

上面的三個按鈕分別實現自動生成題目、(若有則)打開文件和清空富文本框的功能。

左上角的通過Menu Strip控件實現的菜單欄提供了將當前生成的題目進行打印,和進行打印前的設置及打印預覽功能,如下圖所示。
avator

右側的Check Box則提供了選擇運算符、括號和小數,以及是否輸出到文件的選項。

用戶還可通過右側的兩個Text Box(文本框)輸入題目的最大值和題目數。

GUI的設計代碼由Visual Studio 2017完成。

4. 容錯機制的設計

為了提高程序的Robustness,我們對用戶的非法操作進行了容錯處理。

4.1 選擇運算符的容錯處理

用戶在點擊“出題”按鈕前,必須至少從“加”、“減”、“乘”、“除”四個運算符中選擇一個,才能開始。

當用戶沒有選擇運算符,直接進行出題操作是,進行如下的容錯處理

if (Symbols.Count == 0)
{MessageBox.Show("加、減、乘、除運算符至少需要選擇一個!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);return;
}

其效果如圖所示
avator

4.2 最大值和題目數輸入的容錯處理

用戶在開始出題前,必須首先輸入最大值和題目數。

當用戶沒有輸入而直接點擊“出題”按鈕時,進行如下的容錯處理

string max = tbxMax.Text;
string num = tbxNum.Text;
if (tbxMax.Text == String.Empty)  
{MessageBox.Show("最大值不能為空!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);return;
}
if (tbxNum.Text == String.Empty) 
{MessageBox.Show("題目數不能為空!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);return;
}

其效果如圖所示
avatoravator

4.3 打開文件容錯處理

用戶在點擊“打開文件”按鈕前,必須已經有生成的文件

當用戶未選擇生成文件,又直接點擊了“打開文件”按鈕時,進行如下的容錯處理

if(cbxFile.Checked==false)
{MessageBox.Show("未生成文件,無法打開!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);return;
}

其效果如圖所示
avator

4.4 打印的容錯處理

在嘗試打印自動生成的題目時若出錯,則進行如下的容錯處理

try
{printPreviewDialog.ShowDialog();
}
catch(Exception excep)
{MessageBox.Show(excep.Message, "打印出錯", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

5. 程序的運行效果

為了全面的演示程序的運行效果,我們選擇所有的運算符,帶有小數和括號,并且輸出到文件來進行演示。

點擊“出題”按鈕,成功生成題目,并且導出到文件
avator
avator

點擊“打開生成的文件”按鈕,打開文件
avator

打開“打印”菜單,點擊“打印設置”選項,進行打印前的設置
avator

點擊“頁面設置”選項,進行頁面格式的設置
avator

點擊“打印預覽”選項,進行打印預覽
avator

點擊“打印”選項,進行打印
這里我們采用了Adobe公司提供的PDF虛擬打印機,可以看到如下的效果
avator

6. 對領航員的評價

本次我們這個項目的的領航員是王宗波同學。

在進行分析設計思路和用戶需求時,領航員能夠對整體開發思路有較清晰的統籌規劃,結合實際提出了具有遠見且實用的需求分析,并以此為基礎,和我共同制定了清晰的包含了需要開發的功能的開發計劃。

在開始編程前,領航員能夠及時地審閱了我所大體設計地圖形化用戶界面,并提出了有針對性地建議有,與我進行了討論。

在進行程序設計的時,領航員能夠為程序代碼地書寫規范,程序中各功能的開發順序和統籌兼顧實時的提出建議,為代碼及時、準確的完成提供了幫助。

在編程結束后,能設計單元測試,及時發現和提出在開發時考慮不得當的地方和些許小錯誤。

美中不足的是,雖然領航員在結對編程時能及時地發現大部分的問題,但是代碼中仍然有一些小問題是在編程結束后才發現并解決的。這可能是因為在進行開發時,駕駛員和領航員兩個人的思路無法保持同步造成的。

總的來說,這次的結對編程,領航員在大多數術事件,都能正確、及時的完成領航員的職責。

結對編程時領航員和駕駛員的工作照片如圖所示。

avator

7. 總結

本次的作業要求的題目,從總體上來說雖然有一定的難度,但是并不復雜。

這次作業是我們第一次嘗試進行具有圖形用戶界面的程序的設計,由于之前的學習和編程經歷,我們主要進行的都是C和C ++的控制臺應用的開發與設計,所以這次在嘗試開發圖形化用戶界面時,走了不少彎路。為了設計圖形化用戶界面,我們考慮了多種方案,比如使用C ++進行UWP應用的開發,使用Java繼續寧開發,使用C #開發Windows窗體應用程序等……

在考慮到時間限制、學習難度和開發難度等條件下,我們最終決定,學習并使用C #進行Windows窗體應用程序的開發。由于C #和C ++在許多地方一脈相承,學習的過程總體來說還算順利,尤其是語法方面,聯系C ++的語法,認清C #和C ++在諸如數組之類的地方的區別,掌握起來十分容易。但在窗體的設計和開發方面,由于涉及到的控件較多,而他們的方法又不盡相同,學習起來需要一定的時間和精力。

在編程的過程中,為了增加代碼的可讀性和遵循規范化的開發流程,我們有意識地對窗體的控件,控件的事件和變量名等使用了匈牙利命名法。在換行,函數的設計和命名,循環和判斷體的設計中也遵循了一定的規則。

第一次開發圖形化用戶界面,讓我們有機會接觸到比之前所學的課程知識更接近于現代化商業軟件開發流程和的內容。更讓我們體會到了在現代軟件設計開發中,對圖形化界面美觀度,對用戶的需求等方面的考慮的重要性。

在從零開始自學了一門程序設計語言,并編寫出了可以運行的具有圖形用戶界面的程序后,也帶給了我們成就感,能夠鼓勵我們繼續在軟件開發的領域繼續學習探索。

但是這次的程序設計也有不完善的地方。

最開始考慮到的可以讓用戶選擇是否顯示答案的功能,由于在生成題目時,我們將數字和運算符以及括號全部轉換成字符串的格式顯示,所以如果要顯示答案,就要進行字符串的匹配、轉換、找到正確的運算順序并計算等等一系列的功能,受限于本次的開發時間,我們沒有能夠完成這一功能的設計和開發。

另外我們在構思設計的初期,還考慮到了能讓用戶填寫某一特定問題的答案,并進行批改,還可以讓用戶手動切換當前題目的功能。但由于我們采用了邊生成邊顯示的生成題目方式,除了窗體里的富文本框以外,并沒有設計可以存儲已經生成的題目的數據結構,所以如果要實現此功能,還是需要對文本進行遍歷、匹配、識別、判斷運算順序和計算,考慮到時間因素我們也沒有完成這項功能。

雖然代碼仍然存在這兩方面的問題,但是我們在源代碼中預留了實現這兩個功能的函數位置,在本次作業后,我們仍然會找時間嘗試完善這個項目。

總體來說,完成這次作業,讓我們掌握了一門全新的程序設計語言,學習了GUI的設計與開發,認識并親身體會了結對編程的流程,收獲頗豐。

轉載于:https://www.cnblogs.com/martinzhang98/p/10795247.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386908.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386908.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386908.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RUNOOB python練習題 32 列表的中括號符號小tips

用來練手的python練習題,原題鏈接: python練習實例32 題干: 按相反的順序輸出列表的值 拿到題目首先寫下如下代碼: a [1,2,3,4] for i in range(len(a)):print(a[len(a)-i-1])輸出結果如下: 使用一個簡單的循環就可以完成這個操作。但其實python有利用中括號操…

redis啟動后出現WARNING you have Transparent Huge Pages (THP) support enabled in your kernel問題...

問題描述:啟動redis后出現:WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command echo never > /sys/kernel/mm/trans…

Anaconda安裝第三方包(whl文件)

先說下環境 Anaconda 對應Python3.5的版本 win7,64位系統。 step1:下載whl文件 step2:打開‘Anaconda Command Prompt‘, 如下圖: step3:命令行窗口pip安裝,代碼如下: pip install 路徑whl…

RUNOOB python練習題33 使用join方法實現用逗號分隔列表

用來練手的python練習題,原題鏈接:python練習實例33 題干: 按逗號分隔列表 用逗號分隔列表,我們就想到了join方法。 str.join(sequence)可以用自定的str字符串分隔一個序列,這個序列可以是字符串,列表,元組&#xff…

Use Vim as a Python IDE

Use Vim as a Python IDE I love vim and often use it to write Python code. Here are some useful plugins and tools for building a delightful vim python environment, escpecially for Vim8: 我喜歡vim,經常用它來編寫Python代碼。以下是一些有用的插件和工…

sql2008“備份集中的數據庫備份與現有的xx數據庫不同”解決方法 因為是在另一臺電腦對同名數據庫做的備份,用常規方法還原,提示不是相同數據庫,不讓還原,在網上找到下面的方法解決了: 一、右擊系

sql2008“備份集中的數據庫備份與現有的xx數據庫不同”解決方法 因為是在另一臺電腦對同名數據庫做的備份,用常規方法還原,提示不是相同數據庫,不讓還原,在網上找到下面的方法解決了: 一、右擊系統數據庫master&…

RUNOOB python練習題 35 python print各色字體及背景

用來練手的python練習題,原題鏈接: python練習實例35 題干: 文本顏色設置 python中通過指令可以控制輸出的背景顏色,前景顏色,以及顯示方式。指令的語法如下: ’\033[顯示方式;前景色;背景色m 輸出字符 \033[0m’ 其…

ubuntu18.04 qemu環境搭建【學習筆記】

一、準備工具   1.1 安裝相關工具     sudo apt-get install qemu libncurses5-dev gcc-arm-linux-gnueabi build-essential 1.2 下載kernel(linux-4.0)與busybox(1.24)源碼 https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/ https://busybox.net/downloads/busy…

for else語句小tips : RUNOOB python練習題36

用來練手的python練習題,原題鏈接: python練習實例36 題干: 求100之內的素數 求某個范圍內的素數,和之前的一個例題其實是一樣的,上次的同類例題鏈接如下: python練習實例12 在實現題目要求時,這次用了for else語句&#xff0c…

Linux 下殺毒軟件 clamav 的安裝和使用

Linux 下殺毒軟件 clamav 的安裝和使用 安裝依賴: 1 2 3 yum install -y pcre* zlib zlib-devel libssl-devel libssl yum install -y openssl yum install -y epel-release openssl version 0.9.8 or higher 1. yum 安裝 clamav 安裝后會自動生成服務文件&#…

列表,元組和range

內容大綱 列表的初識列表的索引切片列表的增刪改查列表的嵌套元組的初識元組的簡單應用range 昨日內容回顧以及作業講解 int str boolstr 索引 s[x:y:z] 常用操作方法 upper lower startswith endswith split 分割:默認按照空格.將字符串分割成列表.可以知道分隔符 strip …

RUNOOB python練習題37 對一個序列的數進行排序

用來練手的Python練習題,原題鏈接: python練習實例37 題干: 對10個數進行排序 在我們使用Numpy模塊時,這個問題是非常簡單的,下面放出降序排列和升序排列的代碼: 升序排列 import numpy as npresult np.zeros(10) for i in range(result…

Linux服務器不停的向外發包,且CPU持續100%

服務器不停的向外發包,且CPU持續100%,遠程登錄后查看發現有一長度為10的隨機字符串進程,kill掉,會重新生成另外長度為10的字符串進程。刪除文件也會重復生成,非常痛苦。查閱crond相關日志,發現實際執行的內…

逆向學習-IDApython(一)

背景 IDAPython 由三個分離的模塊組成,他們分別是 idc,idautils 和 idaapi。 idc(注意大小寫,不是 IDA 中的 IDC)是一個封裝了 IDA 的 IDC 的兼容性模塊,idautils 是 IDA 的高級實用功能模塊,idaapi 允許了我們訪問更加底層的數據。 基本操作 idc.Screen或者here()返回此時的地…

RUNOOB python練習題 39 數組排序

用來練手的python練習題,原題鏈接: python練習實例39 題干: 有一個已經排好序的數組。現輸入一個數,要求按原來的規律將它插入數組中。 這個題目用列表List的sort,append方法非常簡單,如下: 想要升序排列的話,就直接…

IIS 部署asp.net Provisional headers are shown 在VS2005返回值,部署不返回值

IIS 部署asp.net Provisional headers are shown 在VS2005調試返回值,部署到IIS不返回值 首先當時為了跨域的問題,在上面 后來把跨域的內容放在IIS去解決 其次,在每次返回結束的時候,加一句話 Response.End();

背包

學習博客https://www.cnblogs.com/fengziwei/p/7750849.html //為了不誤導初學者,和給老手diss的機會,我就把以前發的刪了, 有興趣的看看那個博客就行了 (明明寫好了,卻被老師關機子...不開心轉載于:https://www.cnblo…

POSIX線程

POSIX線程 標簽(空格分隔): Linux程序設計 什么是線程 線程是一個進程內部的一個控制序列。 當在進程中創建一個新線程時,新的執行線程將擁有自己的棧(因此也有自己的局部變量),但與它的創建者共…

RUNOOB python練習題44

用來練手的python練習題,原題鏈接:python練習實例44 題干: 兩個 3 行 3 列的矩陣,實現其對應位置的數據相加,并返回一個新矩陣 使用基本的List類寫起來就比較麻煩,需要初始化一個3*3的全0矩陣,之后通過遍歷將矩陣對應…

ImportError: No module named 'matplotlib'(python 安裝各種 )

matplotlib 怎么弄啊 我應該是安裝matplotlid了的 怎么還說我沒有 編輯于:2017.03.22 12:28 0 分享 |評論0|收藏0|瀏覽7261 qq_37926784 聲望: -4 3個回答 按贊數排序 用pip 也顯示已經安裝了matplotlib 編輯于:2018.03.26 19:43 分…