个人作业五:四则运算二
四則運(yùn)算2
一、設(shè)計思路:
1、題目避免重復(fù):
(1)利用系統(tǒng)時間來產(chǎn)生隨機(jī)數(shù),重復(fù)率會降低。
(2)建立鏈表,逐個判斷。可讀取寫入文件。
2、可定制(數(shù)量/打印方式):
(1)格式有默認(rèn)值;
(2)可以選擇重新設(shè)置分幾列和每行的間隔。打印方式用%取余來實現(xiàn)分列輸出。
3、可以控制參數(shù):
(1)這些參數(shù)都有默認(rèn)值;
(2)出題之前可以選擇重新設(shè)置某一個或多個參數(shù);
(3)是否有乘除法/括號/負(fù)數(shù)/余數(shù)/支持分?jǐn)?shù)/支持小數(shù):用戶輸入1/0表示是/否;
數(shù)值范圍、真分?jǐn)?shù)、假分?jǐn)?shù)、精確到幾位小數(shù)、每行的間隔:由用戶輸入決定;
(4)參數(shù)值得記錄借鑒老師的方法,用數(shù)組來存儲;用if-else來確定最終的格式。
是否有乘除法:判斷數(shù)組中的參數(shù)是1還是0,若為0,則判斷表示符號的隨機(jī)數(shù)是不是乘除,是的話跳過;
數(shù)值范圍:由rand()%(b-a+1)+a實現(xiàn)范圍為a~b的隨機(jī)數(shù);
加減有無負(fù)數(shù):判斷數(shù)組中的參數(shù)是1還是0,若為0,則判斷前一個數(shù)是否小于后一個數(shù),是的話跳過;
每行的間隔:根據(jù)數(shù)組中的數(shù),循環(huán)cout<<endl;
是否有余數(shù):判斷數(shù)組中的參數(shù)是1還是0,若為0,用%來判斷
二、源代碼
(1)
// 四則運(yùn)算2.cpp : Defines the entry point for the console application.
// 袁佩佩 信1201-1班 20122785 2015/3/15
#include "stdafx.h"
#include "iostream.h"
#include "stdlib.h"
#include "time.h"
#include "Caculation.h"
#include "iomanip.h"
?
//******重新生成算術(shù)題******
void ReBuild(Caculation &Q)
{
?????? if(para[4]==1)
?????? ?????? Q.sign=rand()%4;
?????? else
?????? ?????? Q.sign=rand()%2;
?????? Q.num1=rand()%(para[6]-para[5]+1)+para[5];
?????? Q.num2=rand()%(para[6]-para[5]+1)+para[5];
}
//*****輸出函數(shù)******
void Display(LinkC C,Caculation &Q)
{
?????? int temp,count=0;?????? ?????? ?????? ?????? ?????? ?????? ?????? ?????? ?????? //count記錄重新生成題目的次數(shù)
?????? for(int i=1;i<=para[1];i++)
?????? {
?????? ?????? cout<<"("<<i<<")";
?????? ?????? if(para[4]==1)
?????? ?????? ?????? Q.sign=rand()%4;????? ?????? ?????? ?????? ?????? ?????? ?????? //有乘除法
?????? ?????? else
?????? ?????? ?????? Q.sign=rand()%2;????? ?????? ?????? ?????? ?????? ?????? ?????? //沒有乘除法
?????? ?????? Q.num1=rand()%(para[6]-para[5]+1)+para[5];??? ?????? ?????? ?????? ?????? ?????? //隨機(jī)的(下限~上限)以內(nèi)的整數(shù)
?????? ?????? Q.num2=rand()%(para[6]-para[5]+1)+para[5];
RB: ?????? ReBuild(Q); ?????? ?????? ?????? ?????? ?????? ?????? ?????? ?????? ?????? //檢查是否有出過的題目
?????? ?????? if(count>((para[6]-para[5]+1)*(para[6]-para[5]+1)*100))
?????? ?????? {
?????? ?????? ?????? cout<<endl<<"該難度的題目已出完,請更改出題設(shè)置!"<<endl;
?????? ?????? ?????? break;
?????? ?????? }
?????? ?????? switch(Q.sign)
?????? ?????? {
?????? ?????? ?????? case 0:
?????? ?????? ?????? ?????? if(ExistQues(C,Q))
?????? ?????? ?????? ?????? {
?????? ?????? ?????? ?????? ?????? count++;
?????? ?????? ?????? ?????? ?????? goto RB;
?????? ?????? ?????? ?????? }
?????? ?????? ?????? ?????? cout<<Q.num1<<"+"<<Q.num2<<"="<<setw(5);
?????? ?????? ?????? ?????? break;
?????? ?????? ?????? case 1:
?????? ?????? ?????? ?????? if((para[7]==0)&&(Q.num1<Q.num2))
?????? ?????? ?????? ?????? {???? ?????? ?????? ?????? ?????? ?????? ?????? ?????? ?????? ?????? //若為負(fù)數(shù),則交換
?????? ?????? ?????? ?????? ?????? ?????? temp=Q.num1;
?????? ?????? ?????? ?????? ?????? ?????? Q.num1=Q.num2;
?????? ?????? ?????? ?????? ?????? ?????? Q.num2=temp;
?????? ?????? ?????? ?????? }
?????? ?????? ?????? ?????? if(ExistQues(C,Q))
?????? ?????? ?????? ?????? {
?????? ?????? ?????? ?????? ?????? count++;
?????? ?????? ?????? ?????? ?????? goto RB;
?????? ?????? ?????? ?????? }
?????? ?????? ?????? ?????? cout<<Q.num1<<"-"<<Q.num2<<"="<<setw(5);break;
?????? ?????? ?????? case 2:
?????? ?????? ?????? ?????? if(ExistQues(C,Q))
?????? ?????? ?????? ?????? {
?????? ?????? ?????? ?????? ?????? count++;
?????? ?????? ?????? ?????? ?????? goto RB;
?????? ?????? ?????? ?????? }
?????? ?????? ?????? ?????? cout<<Q.num1<<"*"<<Q.num2<<"="<<setw(5);break;
?????? ?????? ?????? case 3:
?????? ?????? ?????? ?????? while(Q.num2==0)
?????? ?????? ?????? ?????? ?????? Q.num2=rand()%(para[6]-para[5]+1)+para[5];
?????? ?????? ?????? ?????? if(!para[8])
?????? ?????? ?????? ?????? {
?????? ?????? ?????? ?????? ?????? while((Q.num1%Q.num2)!=0||Q.num2==0)
?????? ?????? ?????? ?????? ?????? {???? ?????? ?????? ?????? ?????? ?????? ?????? ?????? ?????? ?????? //重新生成
?????? ?????? ?????? ?????? ?????? ?????? Q.num1=rand()%(para[6]-para[5]+1)+para[5];
?????? ?????? ?????? ?????? ?????? ?????? Q.num2=rand()%(para[6]-para[5]+1)+para[5];
?????? ?????? ?????? ?????? ?????? }
?????? ?????? ?????? ?????? }
?????? ?????? ?????? ?????? if(ExistQues(C,Q))
?????? ?????? ?????? ?????? {
?????? ?????? ?????? ?????? ?????? count++;
?????? ?????? ?????? ?????? ?????? goto RB;
?????? ?????? ?????? ?????? }
?????? ?????? ?????? ?????? cout<<Q.num1<<"/"<<Q.num2<<"="<<setw(5);break;
?????? ?????? }
?????? ?????? InsertQues(C,Q);
?????? ?????? if(i%para[2]==0) ?????? ?????? ?????? ?????? ?????? ?????? ?????? ?????? //一行打印完規(guī)定列數(shù),換行
?????? ?????? ?????? for(int j=0;j<=para[3];j++)
?????? ?????? ?????? ?????? cout<<endl;
?????? }
?????? cout<<endl<<endl;
}
//*****判斷難度*****
void YesOrNo(int para)
{
?????? if(para)
?????? ?????? cout<<"是";
?????? else
?????? ?????? cout<<"否";
}
//*****查看設(shè)置*****
void ShowSetting()
{
?????? system("cls");
?????? cout<<"\t/*************四則運(yùn)算出題系統(tǒng)*************/"<<endl;
?????? cout<<"\t題目數(shù)量:"<<para[1]<<"個\t\t打印列數(shù):"<<para[2]<<"列"<<endl;
?????? cout<<"\t每行間隔:"<<para[3]<<"行\(zhòng)t\t是否有乘除法:";YesOrNo(para[4]);cout<<endl;
?????? cout<<"\t數(shù)值范圍下限:"<<para[5]<<"\t\t數(shù)值范圍上限:"<<para[6]<<endl;
?????? cout<<"\t是否有負(fù)數(shù):";YesOrNo(para[7]);cout<<"\t\t是否有余數(shù):";YesOrNo(para[8]);cout<<endl;
?????? cout<<"\t/******************************************/"<<endl;
}
//*****設(shè)置打印方式*****
void SetPrint()
{
?????? system("cls");
?????? char move1;
?????? cout<<"\t/*************設(shè)置打印方式*************/"<<endl;
?????? cout<<"\t????????? 0.設(shè)置打印列數(shù)("<<para[2]<<"列)"<<endl;
?????? cout<<"\t????????? 1.設(shè)置每行間隔("<<para[3]<<"行)"<<endl;
?????? cout<<"\t????????????? 2.返回主菜單"<<endl;
?????? cout<<"\t/**************************************/"<<endl;
?????? cout<<"請選擇后續(xù)操作(0~2):";
?????? cin>>move1;
?????? while(move1<'0'||move1>'2')
?????? {
?????? ?????? cout<<"錯誤!請正確輸入操作序號(0~2):";
?????? ?????? cin>>move1;
?????? }
?????? switch(move1)
?????? {
?????? ?????? case '0':
reset2:??? ?????? cout<<"新的打印列數(shù)(建議7列以內(nèi)):";
?????? ?????? ?????? cin>>para[2];
?????? ?????? ?????? if(para[2]<0)
?????? ?????? ?????? {
?????? ?????? ?????? ?????? cout<<"出錯!請重新輸入!"<<endl;
?????? ?????? ?????? ?????? goto reset2;
?????? ?????? ?????? }
?????? ?????? ?????? break;
?????? ?????? case '1':
reset3:??? ?????? cout<<"新的間隔行數(shù):";
?????? ?????? ?????? cin>>para[3];
?????? ?????? ?????? if(para[3]<0)
?????? ?????? ?????? {
?????? ?????? ?????? ?????? cout<<"出錯!請重新輸入!"<<endl;
?????? ?????? ?????? ?????? goto reset3;
?????? ?????? ?????? }
?????? ?????? ?????? break;
?????? ?????? case '2':break;
?????? }
}
//*****判斷輸入正確*****
void Reset(int i)
{
?????? do
?????? {
?????? ?????? cout<<"請重新設(shè)置(是1/否0):";
?????? ?????? cin>>para[i]; ?????? ?????? ?????? //此處輸入字符出錯,但沒解決
?????? }while(para[i]!=0&¶[i]!=1);
}
//*****設(shè)置題目難度*****
void SetLevel()
{
?????? system("cls");
?????? char move2;
?????? cout<<"\t/*************設(shè)置題目難度*************/"<<endl;
?????? cout<<"\t??????????? 0.是否有乘除法(";YesOrNo(para[4]);cout<<")"<<endl;
?????? cout<<"\t??????????? 1.數(shù)值范圍("<<para[5]<<"~"<<para[6]<<")"<<endl;
?????? cout<<"\t??????????? 2.是否有負(fù)數(shù)(";YesOrNo(para[7]);cout<<")"<<endl;
?????? cout<<"\t??????????? 3.是否有余數(shù)(";YesOrNo(para[8]);cout<<")"<<endl;
?????? cout<<"\t????????????? 4.返回主菜單"<<endl;
?????? cout<<"\t/**************************************/"<<endl;
?????? cout<<"請選擇后續(xù)操作(0~4):";
?????? cin>>move2;
?????? while(move2<'0'||move2>'4')
?????? {
?????? ?????? cout<<"錯誤!請正確輸入操作序號(0~4):";
?????? ?????? cin>>move2;
?????? }
?????? switch(move2)
?????? {
?????? ?????? case '0':Reset(4);break;
?????? ?????? case '1':? ?????? ?????? ?????? ?????? ?????? ?????? ?????? //此處若輸入字符,則出錯
reset1:??? ?????? cout<<"新的數(shù)值下限:";????? ?????? ?????? ?????? //但沒找到解決方法
?????? ?????? ?????? cin>>para[5];
?????? ?????? ?????? cout<<"新的數(shù)值上限:";
?????? ?????? ?????? cin>>para[6];
?????? ?????? ?????? if(para[5]>=para[6])
?????? ?????? ?????? {
?????? ?????? ?????? ?????? cout<<"出錯!請重新輸入數(shù)值范圍!"<<endl;
?????? ?????? ?????? ?????? goto reset1;
?????? ?????? ?????? }
?????? ?????? ?????? break;
?????? ?????? case '2':Reset(7);break;
?????? ?????? case '3':Reset(8);break;
?????? ?????? case '4':break;
?????? }
}
//****主頁面*****
void MainMenu(LinkC &C,Caculation &Q)
{
?????? char move,save;
?????? cout<<"\t/*************四則運(yùn)算出題系統(tǒng)*************/"<<endl;
?????? cout<<"\t???????????????? 0.開始出題"<<endl;
?????? cout<<"\t?????????????? 1.設(shè)置出題數(shù)量"<<endl;
?????? cout<<"\t?????????????? 2.設(shè)置打印方式"<<endl;
?????? cout<<"\t?????????????? 3.設(shè)置題目難度"<<endl;
?????? cout<<"\t?????????????? 4.查看當(dāng)前設(shè)置"<<endl;
?????? cout<<"\t???????????????? 5.退出系統(tǒng)"<<endl;
?????? cout<<"\t/******************************************/"<<endl;
?????? cout<<"請選擇后續(xù)操作(0~5):";
?????? cin>>move;
?????? while(move<'0'||move>'5')
?????? {
?????? ?????? cout<<"錯誤!請正確輸入操作序號(0~5):";
?????? ?????? cin>>move;
?????? }
?????? switch(move)
?????? {
?????? ?????? case '0':Display(C,Q);break;
?????? ?????? case '1':
reset4:??? ?????? cout<<"請設(shè)置出題數(shù)量(建議100道以內(nèi)):";
?????? ?????? ?????? cin>>para[1];
?????? ?????? ?????? if(para[1]<=0)
?????? ?????? ?????? {
?????? ?????? ?????? ?????? cout<<"出錯!請重新輸入!"<<endl;
?????? ?????? ?????? ?????? goto reset4;
?????? ?????? ?????? }
?????? ?????? ?????? break;
?????? ?????? case '2':SetPrint();break;
?????? ?????? case '3':SetLevel();break;
?????? ?????? case '4':ShowSetting();break;
?????? ?????? case '5':
?????? ?????? ?????? cout<<"是否保存出題記錄(是1/否0):";
?????? ?????? ?????? cin>>save;
?????? ?????? ?????? while(save!='1'&&save!='0')
?????? ?????? ?????? {
?????? ?????? ?????? ?????? cout<<"出錯!請正確輸入(是1/否0):";
?????? ?????? ?????? ?????? cin>>save;
?????? ?????? ?????? }
?????? ?????? ?????? if(save=='1')
?????? ?????? ?????? ?????? WriteQues(C);
?????? ?????? ?????? cout<<"感謝您的使用,再見!"<<endl;
?????? ?????? ?????? para[0]=0;break;
?????? }
}
?
int main(int argc, char* argv[])
{
?????? srand((unsigned)time(NULL));????? //srand()函數(shù)產(chǎn)生一個以當(dāng)前時間開始的隨機(jī)種子
?????? LinkC Cacu;
?????? Caculation ques;
?????? InitList(Cacu);
?????? ReadQues(Cacu);
?????? while(para[0])
?????? {
?????? ?????? system("cls");
?????? ?????? MainMenu(Cacu,ques);
?????? ?????? system("pause");
?????? }
?????? return 0;
}
(2)
#include "iostream.h"
#include "fstream.h"
//0退出、1出題數(shù)量、2打印列數(shù)、3每行間隔、4乘除、5數(shù)值范圍下限、6數(shù)值范圍上限、7負(fù)數(shù)、8余數(shù)、9出過的題目數(shù)
int para[10]={1,30,3,0,0,0,5,0,0,0};????? //默認(rèn)參數(shù)
?
//*****四則算術(shù)題的數(shù)據(jù)結(jié)構(gòu)*****
typedef struct
{
?????? int num1;
?????? int num2;
?????? int sign;
}Caculation;
typedef struct CNode?????? ?????? ?????? ?????? ?????? //結(jié)點(diǎn)
{
?????? Caculation ques;
?????? struct CNode * next;
}CNode,*LinkC;
//******題目初始化******
void InitList(LinkC &C)
{
?????? C=new CNode;
?????? C->next=NULL;
}
//******添加題目信息******
void InsertQues(LinkC &C,Caculation Q)
{???? ?????? ?????? ?????? ?????? ?????? ?????? ?????? ?????? ?????? //尾插入
?????? LinkC tail,temp;
?????? tail=C;
?????? while(tail&&tail->next!=NULL)
?????? ?????? tail=tail->next;
?????? temp=new CNode;
?????? temp->ques=Q;
?????? temp->next=NULL;
?????? tail->next=temp;
?????? tail=temp;
?????? para[9]++;
}
//******判斷題目存在******
int ExistQues(LinkC C,Caculation Q)
{
?????? LinkC temp;
?????? temp=C->next;
?????? while(temp)
?????? {
?????? ?????? if((temp->ques.num1==Q.num1)&&(temp->ques.num2==Q.num2)&&(temp->ques.sign==Q.sign))
?????? ?????? ?????? return 1; ?????? ?????? ?????? ?????? //當(dāng)兩個數(shù)字和算符與鏈表中的一樣,則存在
?????? ?????? else
?????? ?????? ?????? temp=temp->next;
?????? }
?????? return 0;
}
//******讀取出過的問題******
void ReadQues(LinkC &C)
{
?????? LinkC temp;
?????? ifstream infile("question.txt");
?????? for(int i=0;i<10;i++)?? ?????? ?????? ?????? //讀取參數(shù)表
?????? ?????? infile>>para[i];
?????? for(i=0;i<para[9];i++) ?????? ?????? ?????? //讀取出過的題目
?????? {
?????? ?????? temp=new CNode;
?????? ?????? infile>>temp->ques.num1;
?????? ?????? infile>>temp->ques.num2;
?????? ?????? infile>>temp->ques.sign;
?????? ?????? temp->next=NULL;
?????? }
}
//******寫入文件******
void WriteQues(LinkC C)
{
?????? LinkC temp;
?????? ofstream outfile("question.txt");
?????? if(!outfile)
?????? {
?????? ?????? cout<<"文件存儲失敗!"<<endl;
?????? ?????? exit(0);
?????? }
?????? for(int i=0;i<10;i++)
?????? ?????? outfile<<para[i]<<" ";
?????? for(temp=C->next;temp;temp=temp->next)
?????? {
?????? ?????? outfile<<temp->ques.num1<<" ";
?????? ?????? outfile<<temp->ques.num2<<" ";
?????? ?????? outfile<<temp->ques.sign<<" ";
?????? }
}
三、運(yùn)行結(jié)果
第一次使用時,程序默認(rèn)10以內(nèi)四則運(yùn)算10道題,有負(fù)數(shù)余數(shù),分三列打印,每行間隔一行。見下圖。
? ? ? ? ? ? ? ? ? ? ? ? ?
?? ? ? ? ? ? ? 對參數(shù)進(jìn)行一些修改。見下圖。
?
?
? ? ? ? ? ? ? ? ? ? ? ? ? 對打印方式進(jìn)行修改。見下圖。
?
?
對題目的一些設(shè)置
?
?
退出系統(tǒng),可選擇保存出過的題目和參數(shù)設(shè)置。
?
?后來經(jīng)過我的代碼優(yōu)化,當(dāng)某種類型的題目全部都出過以后,會提示。
首先當(dāng)前設(shè)置如下。
?
連續(xù)出題多次發(fā)現(xiàn)
?
四、遇到的困難
??設(shè)計思想里已經(jīng)寫了,編寫程序的時候,我是漸進(jìn)式的自頂向下的開發(fā)的。但是我不太清楚編寫代碼時,該不該用自頂向下。因為我比較注重細(xì)節(jié),先寫框架 再寫核心往往會導(dǎo)致編出來的程序虎頭蛇尾。而且這次我是最后才加上的數(shù)據(jù)結(jié)構(gòu),以至于之前寫的變量名、參數(shù)等等都要變更,有些麻煩。以后我會訓(xùn)練自己自底 向上寫代碼的能力。我有個壞毛病就是,邊寫邊思考,有時候這個問題還差一點(diǎn)就解決了,結(jié)果就又扯到另一個問題上了。我在與其他同學(xué)交流的過程中,也了解到“下手”之前,必須要先把整個程序在心里構(gòu)建的差不多了,再敲代碼。多和編程能力強(qiáng)或編程習(xí)慣好的同學(xué)交流,多向他們學(xué)習(xí),也是受益匪淺啊。
? 最后就是,數(shù)據(jù)結(jié)構(gòu)部分我是借鑒之前數(shù)據(jù)結(jié)構(gòu)小學(xué)期自己做的員工管理系統(tǒng)來編寫的,回憶起了鏈表以及相關(guān)操作的知識。
?
轉(zhuǎn)載于:https://www.cnblogs.com/lrhan/p/5609554.html
總結(jié)
以上是生活随笔為你收集整理的个人作业五:四则运算二的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 孕妇梦到大鱼是什么意思
- 下一篇: 关于html的一些杂技