小學生四則運算練習的編程 軟件工程

簡單的四則運算題目生成及求值小程序 
程序發佈至 https://github.com/zxt555/

一、實驗目的與要求html

(1)掌握軟件項目我的開發流程。git

(2)掌握Github上發佈軟件項目的操做方法。github

二、實驗內容和步驟
 
嘗試按照《構建之法》第2章中2.3所述PSP流程,使用JAVA編程語言,獨立完成一個包含3到5個數字的四則運算練習的命令行軟件開發題目參考:http://www.cnblogs.com/xinz/p/7417960.html
軟件基本功能要求以下:
  • 程序可接收一個輸入參數n,而後隨機產生n道加減乘除練習題,每一個數字在 0 和 100 之間,運算符在3個到5個之間。
  • 爲了讓小學生獲得充分鍛鍊,每一個練習題至少要包含2種運算符。同時,因爲小學生沒有分數與負數的概念,你所出的練習題在運算過程當中不得出現負數與非整數,好比不能出 3/5+2=2.6,2-5+10=7等算式。
  • 練習題生成好後,將你的學號與生成的n道練習題及其對應的正確答案輸出到文件「result.txt中,不要輸出額外信息,文件目錄與程序目錄一致。
  • 當程序接收的參數爲4時,如下爲輸出文件示例。

題目要求
運算符爲 +, −, ×, ÷
而且要求能處理用戶的輸入,並判斷對錯,打分統計正確率。
使用 -n 參數控制生成題目的個數,例如執行下面命令將生成10個題目
Myapp.exe -n 10

需求分析
•經過-n參數控制題目個數,經過-s參數執行對錯檢驗輸出正確率
•生成max=10之內的隨機的整數,隨機的 +, −, ×, ÷符號,組合成四則運算運算題目,輸出到文本文件
•讀入文本文件,解析表達式求值,對比用戶的答案,統計正確率
•學習新技術 
◦棧
◦文件的讀寫
◦markdown
◦string流,string與int的相互轉換
設計文檔
用戶輸入命令行,程序根據命令行執行相應功能,Myapp.exe -n 10生成10道隨機四則運算題目並輸出到文本,Myapp.exe -s讀入文本統計正確率並輸出到控制檯。

具體定義:

•運算符號只包含+, −, ×, ÷,=。沒有括號。
•題目類型:[整數][符號][整數][符號][整數] 
操做數+運算符+操做數

程序架構:

•解析用戶輸入的命令行。Myapp.exe -n 10,Myapp.exe -s
•Myapp.exe -n 10 ,返回題目個數
•循環生成題目直到知足題目數n
•隨機生成整數或真分數,運算符,組成一道題目string
•一道題目加上 ’=’ 一行,輸出到文本文件
•Myapp.exe -s ,表達式求值並統計正確率
•從文本中逐行讀入題目和答案string
•bool result(string one) 將string中算術表達式部分壓入optr和opnd棧中計算出結果res,最後從string中解析出答案ans,比對答案,正確返回true,錯誤返回false。
-函數返回true則tc+1,false則fc+1。
•統計結果tc/(tc+fc)並輸出到控制檯
代碼規範
-隨機生成low到high之間的數字的函數int random(int low ,int high)
-表達式比對並進行答案比對bool result(string one)

  設計思路:  我作這個四則運算的思路是這樣的:首先進入程序,在主函數裏直接用一個while循環,循環裏面判斷並輸出用戶在10題的練習裏作對了幾題,當用戶作完了10道題就給用戶做出是否繼續練習或者退出的選擇;還有直接進入調用函數,調用函數首先是隨機產生0~10的兩個整數,四個符號(+ - *  /)用一個變量隨機產生1~4的整數。每一個數對應一個符號,用case語句實現。而後加入兩個個判斷:

       1.防止「不夠減」的語句,當選擇減法且num1小於num2時不夠減不夠減的時候,用臨時變量交換兩個操做數;編程

       2.防止「除數爲0」的程序漏洞,當num2被隨機取值到0時,就將num2強制置爲1,作除法時,將num1的值強制賦值給num1*num2,防止不能整除;小程序

而後電腦計算正確的結果提示用戶輸入答案而且電腦計算正確的結果。最後是判斷用戶是否答對了,答對了就返回1,不對則返回0(用來計算作對的題數)。以此循環!markdown

       這個程序的缺陷是,當用戶輸入答案時,若用戶輸入了一個非整型字符,系統會崩潰;還有隻是0~10之間的簡單的運算,把範圍侷限了,但能夠改進。還有是不能進行小數的運算架構

 


代碼說明:

include <stdio.h>app

#include <stdlib.h>dom

void main() {  編程語言

int n=0,count=0;  printf("\n歡迎使用小學生四則運算練習軟件\n");  

int ch=0;
 printf("\n歡迎使用小學生四則運算練習軟件\n\n");
 while(1)
 {
  if(count==10)
  {
   printf("恭喜你在10道練習裏作對了%d題! \n",n);
   printf("\t1.繼續練習\n\t2.退出");
   scanf("%d",&ch);
   if(ch==2)
   {
   break;
   }
  }

 n+=yusuan();  count++;  

}

}

int yusuan()

{  

int ranswer=0;   //正確答案  

int uanswer=0;   //用戶輸入的答案  

int t=0,n=0;    //臨時變量  

char op;       //運算類別  

int num1=0;    //操做數1  

int num2=0;    //操做數2

 srand(time(NULL));  //初始化隨機數  

num1=rand()%10;   //取0—9之間的隨機數  

num2=rand()%10;  

n=rand()%4+1;  switch(n)  

{   case 1:    op='+';    break;

  case 2:    op='-';    break;

  case 3:    op='*';    break;

  case 4:    op='/';    break;

 }

//加入一條防止「不夠減」的語句,當選擇減法且num1小於num2時不夠減

//不夠減的時候,用臨時變量交換兩個操做數

 if((op=='-') && (num1<num2))

 {   t=num1;

  num1=num2;

  num2=t;  

}

//防止「除數爲0」的程序漏洞

//當num2被隨機取值到0時,就將num2強制置爲1

//作除法時,將num1的值強制賦值給num1*num2,防止不能整除  

if(op=='/')  

{   

if(num2==0)

  {    num2=1;   }   

num1=num1*num2;   

//防止num1不能被num2整除的語句  }

//輸出測試題自己、提示用戶輸入  

printf("   %d%c%d= ",num1,op,num2);  

scanf("%d",&uanswer);

//程序計算正確結果  

switch(op)

 {   case '+':   ranswer=num1+num2;   break;

  case '-':   ranswer=num1-num2;   break;

  case '*':   ranswer=num1*num2;   break;

  case '/':   ranswer=num1/num2;   break;  

}

//評判,作對返回1,作錯返回0

 if(uanswer==ranswer)

 {   printf("\t作對了!\n");  

 return 1;  

}  else

 {   printf("\t作錯了!\n");  

 return 0;  }

}

 運行結果:

PSP環節:

總結 •前期需求分析及設計文檔 作的越詳細越正確後期寫代碼就會越輕鬆。由於程序架構與流程有了,寫代碼時只需特定的地方寫詳細就好。若是一開始就寫代碼,沒有架構後期調試就會很麻煩且代碼臃腫。固然寫好架構的前提是先學好一門語言。 •學習看和查英文幫助文檔。畢竟網上的大多我的博客寫不是很詳細(寫這個小程序就有這種感受了)。 •認真學習C++一門。在各門語言之間轉來轉去實在混亂,通曉一門足以知曉其餘語言的大致狀況了。
相關文章
相關標籤/搜索