第三次寒假作業
第三次寒假作業(二)
盧恺翔031602230
柯奇豪031602219
實作設計思路
我們将這個程式的設計分為四個部分:
1、完成界面的設計
2、完成随機題目的生成
3、設計判斷使用者輸入正确與否的算法
4、将這些融入到一個項目之中
訂立的編碼規範
由于我們都是沒學過C++的小弱雞,也沒學習過任何算法。是以對這方面不是很懂該怎麼做。。。我們隻想讓設計的變量更能夠讓人一眼就看出這是幹什麼的。并且希望能夠盡可能的按照面對對象的思想來完成項目(其實也對面對對象的思想也不是很清楚)
d數組代表随機數
c數組代表随機符号
choice代表使用者選擇中英界面的符号
answer數組代表使用者輸入結果
randomd函數代表随機d數組的函數
randomc函數代表随機c數組的函數
gcd代表最大公約數函數
(這裡的A1,B1,B3,C1是我們之前商量好的結果)
A1代表沒有括号的函數
B1代表包含第一個與第二個數的括号的函數
B3代表包含第二個與第三個數的括号的函數
C1代表包含第一個到第三個數的括号的函數
D1代表包含第一個和第二個數,包含第三個數和第四個數的有兩個括号的函數(由于太難是以放棄了)

程式的實作和結果測試的截圖
界面設計
說實話,這是我們在本次項目中最簡單完成的,耗時也最少。
char calculate2::choice()
{
cout<<"Please choose the language that you need:(a.Simple Chinese; b.English)"<<endl; //2種語言的切換
int i;
char choice;
for(i=0;;i++)
{
cin>>choice;
if(choice=='a')
{cout<<"請輸入你所想要的題目數(你可以輸入'q'則結束程式):"<<endl;break;}
else if(choice=='b')
{cout<<"Please enter the number of texts you want(You can enter'q'to end the program):"<<endl;break;}
else
{cout<<"輸入不當,請重新選擇選項/Please select the option again if it is wrong"<<endl;continue;}
}
return choice;
}
else
if(ch=='q')break;
}
if(ch=='a')
{
cout<<"回答正确的的題數為 :"<<endl;
}
else if(ch=='b')
{
cout<<"The number of correct answers are:"<<endl;
}
cout<<count<<endl;
return 0;
}
随機題目的生成
由于之前沒有任何基礎,完全不知道有随機函數這個函數。也是隻有再百度之後才知道原來有僞随機這個東西。由于是完全陌生的東西,我們花了整整2天才完成這些東西
int calculate2::randomd(int d[])
{
d[0]=rand()%10+1; //整數數字随機函數
d[1]=rand()%10+1;
d[2]=rand()%10+1;
d[3]=rand()%10+1;
}
int calculate2::randomc(int c[])
{
int j;
for(j=0;;j++) //+,-,*,/的随機
{
c[0]=rand()%6+42;
if(c[0]!=44&&c[0]!=46)break;
}
for(j=0;;j++)
{
c[1]=rand()%6+42;
if(c[1]!=44&&c[1]!=46)break;
}
for(j=0;;j++)
{
c[2]=rand()%6+42;
if(c[2]!=44&&c[2]!=46)break;
}
}
這是我們一開始弄得,發現由于不懂僞随機的原理,所有随機的數字都是一樣的。
到後來發現是種子的問題。
最後終于可以做到完全随機(可惜當時太激動,沒有截圖)
判斷使用者的輸入正确與否
在這個階段,我的同伴和我都有點暈暈乎乎的。應該是由于遭到本地各種風俗活動和班聚的影響,導緻我們的交流出現了一些障礙。不能及時地傳達自己想要表達的思想。
一開始是由我來設計這個算法,但是因為自己的能力有限。最後還是選擇一起合作。
我們設計了各種各樣的版本。但總是會有一些bug。在前幾天,我們臨時決定增加假分數的運算。當時的我們還不懂這個的難度,隻是覺得很有意思。。。結果就是因為設計這個假分數的算法,導緻我們原先計劃在16号完成代碼,拖到現在也隻是一個半成品。
但所幸的是,我們起碼完成了假分數算法,也算是沒有辜負自己的努力。
下面是包含假分數的算法
int calculate2::A1(int d[],int c[],int fenshu[])
{
int j;
cout<<d[0]<<char(c[0])<<d[1]<<char(c[1])<<d[2]<<char(c[2])<<d[3]<<'='<<endl;
int k=0;
for(j=0;j<3;j++)
{
if(c[j]==45) // '-'
{
d[j+1]=-d[j+1];
c[j]=43;
}
}
for(j=0;j<3;j++)
{
if(c[0]==47&&c[2]==47&&c[1]==43)
{
fenshu[0]=d[0]*d[3]+d[2]*d[1];
fenshu[1]=d[1]*d[3];
c[1]=0;
break;
}
if(c[j]==42)
{
d[j+1]*=d[j];
d[j]=0;
c[j]=43;
}
if(c[j]==47)
{
if(k==0)fenshu[0]=d[j];
fenshu[1]*=d[j+1];
d[j+1]=d[j];
d[j]=0;
k++; //防止分子被重置
if(c[j+1]==42)
{
fenshu[0]*=d[j+2];
j++;
}
}
}
for(j=0;j<3;j++)
{
if(c[j]==43)
{
if(j==0)
fenshu[0]+=d[0]*fenshu[1];
fenshu[0]+=d[j+1]*fenshu[1];
}
}
int r,x=fenshu[0],y=fenshu[1],t;
if(x>y){t=x;x=y;y=t;}
while(r!=0)
{
r=y%x;
y=x;
x=r;
}
fenshu[0]=fenshu[0]/y;
fenshu[1]=fenshu[1]/y;
}
int answer[2];
cin>>answer[0];
if(c[0]=='/'||c[1]=='/'||c[2]=='/')
{
if(fenshu[0]%fenshu[1]==0) //結果不一定有除号 ,可能是整數
if(answer[0]==fenshu[0]/fenshu[1])count++;
else
{
if(answer[0]==fenshu[0])
{
char fenhao;
cin>>fenhao;
if(fenhao=='/')
{
cin>>answer[1];
if(answer[1]==fenshu[1])count++;
}
}
}
}
效果其實還是非常好的
整合
就像剛才說的,由于沒有好好估計時間,導緻我們這個方面沒有做好,雖然整合了,卻老是無法運作。這也是本次項目最大的遺憾。
main函數
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include "calculate2.h"
using namespace std;
int main()
{
srand((unsigned)time(NULL));
calculate2 cal;
char ch;
ch=cal.choice();
int N,i;
cin>>N;
int d[4],c[3],count=0,fenshu[2]={1,1};
for(i=0;i<N;i++)
{
cal.randomd(d);
cal.randomc(c);
int k;
k=rand()%4;
switch(k) //随機4種函數類型
{
case 0:cal.A1(d,c,fenshu);break;
case 1:cal.B1(d,c,fenshu);break;
case 2:cal.B3(d,c,fenshu);break;
case 3:cal.C1(d,c,fenshu);break;
}
if(ch=='a')
{
cout<<"請輸入你的答案:"<<endl;
}
else if(ch=='b')
{
cout<<"Please enter your answer :"<<endl;
}
int answer[2];
cin>>answer[0];
if(c[0]=='/'||c[1]=='/'||c[2]=='/')
{
if(fenshu[0]%fenshu[1]==0) //結果不一定有除号 ,可能是整數
if(answer[0]==fenshu[0]/fenshu[1])count++;
else
{
if(answer[0]==fenshu[0])
{
char fenhao;
cin>>fenhao;
if(fenhao=='/')
{
cin>>answer[1];
if(answer[1]==fenshu[1])count++;
}
}
}
}
else
if(ch=='q')break;
}
if(ch=='a')
{
cout<<"回答正确的的題數為 :"<<endl;
}
else if(ch=='b')
{
cout<<"The number of correct answers are:"<<endl;
}
cout<<count<<endl;
return 0;
}
calculate2.h檔案
#ifndef CALCULATE1_H
#define CALCULATE1_H
class calculate2
{
public:
int A1(int d[],int c[],int fenshu[]);
int B1(int d[],int c[],int fenshu[]);
int B3(int d[],int c[],int fenshu[]);
int C1(int d[],int c[],int fenshu[]);
int randomd(int d[]);
int randomc(int c[]);
int calculate(int d[],int c[]);
char choice();
int gcd(int x,int y);
private:
int d[4];
int c[3];
};
#endif
由于calculate2.cpp的代碼太長了,就不在此列出,詳見GitHub。
GitHub送出連結
盧恺翔的GitHub最終檔案為calculate2,其他檔案均為之前上傳的材料
2位同學的分工和協作證據截圖
一開始我想我負責寫算法,奇豪寫界面。結果發現界面設計其實非常簡單,而算法也很難。于是我們決定先一人寫,當另一個人沒有思路的時候,換另一個人寫。但這可能就是我們本次項目制作失敗的原因。可能這樣子做導緻效率太低。當然,自身能力的不足也是導緻時間不足的原因。