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