開源專案分享-h5-api
阿新 • • 發佈:2020-11-06
一、作業資訊
這個作業屬於哪個課程 | https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18 |
---|---|
這個作業要求在哪裡 | https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18/homework/11377 |
這個作業的目標 | 能對需求進行分析並實現;編碼格式規範;學習部落格撰寫 |
學號 | 3180701312 |
二、作業要求
寫一個能自動生成小學四則運算題目的程式,然後在此基礎上擴充套件:
1)除了整數以外,還要支援真分數的四則運算,例如:1/6+1/8=7/24
2)程式要求能處理使用者的輸入,判斷對錯,累積分數
3)程式支援可以由使用者自行選擇加、減、乘、除運算
4)使用-n引數控制生成題目的個數,例如Myapp.exe -n 10,將生成10個題目
三、程式碼提交與執行截圖
1、原始碼
介面
void menu() { system("cls"); //清屏操作 printf("**********四則運算題目生成器***********\n"); printf("請選擇生成的題目型別:\n"); printf("1.加法運算\n"); printf("2.減法運算\n"); printf("3.乘法運算\n"); printf("4.除法運算\n"); printf("0.退出\n"); printf("提示:真分數運算結果要化簡!\n"); printf("請輸入選項(0-4):"); }
產生不重複隨機數
int *produce(int *eg,int num_a,int num_b) { int i,m,k,*a,j,t=1,v,b; m=num_b-num_a+1; v=m/2-1; b=0; a=(int *)malloc(m/2*sizeof(int)); srand(time(NULL)); while(t<=2) { for(j=0,i=b+1;i<=v+1;i++,j++) { a[j]=i; } for(k=0,i=b;i<=v;i++,k++) { j=(int) ((float) ((m/2-k)*rand())/(RAND_MAX+1.0)); eg[i]=a[j]; a[j]=a[m/2-1-k]; } b=m/2; v=m-1; t++; } free(a); return eg; }
化簡分數
int *simplify(int *f)
{
int i;
for(i=f[0];i>1;i--)
{
if((f[0]%i==0)&&(f[1]%i==0))
{
f[0]=f[0]/i;
f[1]=f[1]/i;
i=f[0];
}
}
return f;
}
答題結束
void over()
{
int i;
printf("答題結束!輸入任意數字退出!\n");
printf("請輸入數字:");
scanf("%d",&i);
}
主函式
int main()
{
int *number_int=NULL;//隨機數整數陣列
int *number_f=NULL;//隨機數真分數陣列
int i,m,k,q,w,r;
int *f1,*f2;//分子和分母
float answer;
float y;
int score,error;
int j; //真分數題目數量
int n;//生成題目數量
while(1)
{
menu();
do
{
scanf("%d",&i);
if(i<0||i>4)
{
printf("輸入不合法!請重新輸入!\n");
}
}while(i<0||i>4);
if(i!=0)
{
do
{
printf("請輸入測試題目數量(題目生成數量1-50):");
scanf("%d",&n);
if(n<1||n>50)
{
printf("輸入不合法!請重新輸入!\n");
}
}while(n<1||n>50);
j=n/3;//真分數數量是總體的1/3
m=2*(n-j);
k=4*j;
number_int=(int *)malloc(m*sizeof(int));
number_f=(int *)malloc(k*sizeof(int));
number_int=produce(number_int,0,m-1);//乘數,減數,除數//被乘數,被減數,被除數,加數
number_f=produce(number_f,0,k-1);//分子取值區 //分母取值區
f1=(int *)calloc(2,sizeof(int));
f2=(int *)calloc(2,sizeof(int));
}
switch(i)
{
//加法
case 1:
score=0;
for(q=0,w=m/2;q<=m/2-1;q++,w++)//整數
{
answer=number_int[q]+number_int[w];
printf(" %d + %d = ",number_int[q],number_int[w]);
scanf("%d",&r);
if(r==answer)
{
score++;//得分
printf("正確!得分:%d\n",score);
}
else
{
printf("錯誤!正確答案:%0.1f\n",answer);
}
}
for(q=0,w=k/2;q<k/2-1;q++,w++)//真分數數
{
f1[0]=number_f[q];//分子
f1[1]=number_f[w];//分母
printf("%d/%d +",f1[0],f1[1]);
f1=simplify(f1);//化簡
f2[0]=number_f[q+1];//分子
f2[1]=number_f[w+1];//分母
printf("%d/%d =\n",f2[0],f2[1]);
f2=simplify(f2);
f1[0]=f1[0]*f2[1]+f1[1]*f2[0];
f1[1]=f1[1]*f2[1];
f1=simplify(f1);//結果
//printf("運算到了!!!");
printf("分子:");
scanf("%d",&f2[0]);
printf("分母:");
scanf("%d",&f2[1]);
if(f1[0]==f2[0]&&f1[1]==f2[1])
{
score++;//得分
printf("正確!得分:%d\n",score);
}
else
{
printf("錯誤!正確答案:%d/%d\n",f1[0],f1[1]);
}
}
printf("總得分%d\n",score);
over();free(number_int);free(number_f);free(f1);free(f2);
break;
//減法
case 2:
score=0;
for(q=0,w=m/2;q<=m/2-1;q++,w++)//整數
{
answer=number_int[w]-number_int[q];
printf(" %d - %d = ",number_int[w],number_int[q]);
scanf("%d",&r);
if(r==answer)
{
score++;//得分
printf("正確!得分:%d\n",score);
}
else
{
printf("錯誤!正確答案:%0.1f\n",answer);
}
}
for(q=0,w=k/2;q<k/2-1;q++,w++)//真分數
{
f1[0]=number_f[q];//分子
f1[1]=number_f[w];//分母
f2[0]=number_f[q+1];//分子
f2[1]=number_f[w+1];//分母
if(f1[0]*f2[1]-f1[1]*f2[0]>=0)//防止出現負數
{
printf("%d/%d -",f1[0],f1[1]);
printf("%d/%d =\n",f2[0],f2[1]);
f1[0]=f1[0]*f2[1]-f1[1]*f2[0];
}
else
{
printf("%d/%d -",f2[0],f2[1]);
printf("%d/%d =\n",f1[0],f1[1]);
f1[0]=f1[1]*f2[0]-f1[0]*f2[1];
}
f1[1]=f1[1]*f2[1];
f1=simplify(f1);//結果
printf("分子:");
scanf("%d",&f2[0]);
printf("分母:");
scanf("%d",&f2[1]);
if(f1[0]==f2[0]&&f1[1]==f2[1])
{
score++;//得分
printf("正確!得分:%d\n",score);
}
else
{
printf("錯誤!正確答案:%d/%d\n",f1[0],f1[1]);
}
}
printf("總得分%d\n",score);
over();free(number_int);free(number_f);free(f1);free(f2);
break;
//乘法
case 3:
score=0;
for(q=0,w=m/2;q<=m/2-1;q++,w++)//整數
{
answer=number_int[q]*number_int[w];
printf(" %d * %d = ",number_int[q],number_int[w]);
scanf("%d",&r);
if(r==answer)
{
score++;//得分
printf("正確!得分:%d\n",score);
}
else
{
printf("錯誤!正確答案:%0.1f\n",answer);
}
}
for(q=0,w=k/2;q<k/2-1;q++,w++)//真分數數
{
f1[0]=number_f[q];//分子
f1[1]=number_f[w];//分母
printf("%d/%d *",f1[0],f1[1]);
f1=simplify(f1);//化簡
f2[0]=number_f[q+1];//分子
f2[1]=number_f[w+1];//分母
printf("%d/%d =\n",f2[0],f2[1]);
f2=simplify(f2);
f1[0]=f1[0]*f2[0];
f1[1]=f1[1]*f2[1];
f1=simplify(f1);//結果
printf("分子:");
scanf("%d",&f2[0]);
printf("分母:");
scanf("%d",&f2[1]);
if(f1[0]==f2[0]&&f1[1]==f2[1])
{
score++;//得分
printf("正確!得分:%d\n",score);
}
else
{
printf("錯誤!正確答案:%d/%d\n",f1[0],f1[1]);
}
}
printf("總得分%d\n",score);
over();free(number_int);free(number_f);free(f1);free(f2);
break;
//除法
case 4:
printf("整數除法保留一位小數\n");
score=0;
for(q=0,w=m/2;q<=m/2-1;q++,w++)//整數
{
answer=number_int[w]/(number_int[q]*1.0);
printf(" %d / %d = ",number_int[w],number_int[q]);
scanf("%f",&y);
if(y==answer)
{
score++;//得分
printf("正確!得分:%d\n",score);
}
else
{
printf("錯誤!正確答案:%0.1f\n",answer);
}
}
for(q=0,w=k/2;q<k/2-1;q++,w++)//真分數數
{
f1[0]=number_f[q];//分子
f1[1]=number_f[w];//分母
printf("%d/%d /",f1[0],f1[1]);
f1=simplify(f1);//化簡
f2[0]=number_f[q+1];//分子
f2[1]=number_f[w+1];//分母
printf("%d/%d =\n",f2[0],f2[1]);
f2=simplify(f2);
f1[0]=f1[0]*f2[1];
f1[1]=f1[1]*f2[0];
f1=simplify(f1);//結果
printf("分子:");
scanf("%d",&f2[0]);
printf("分母:");
scanf("%d",&f2[1]);
if(f1[0]==f2[0]&&f1[1]==f2[1])
{
score++;//得分
printf("正確!得分:%d\n",score);
}
else
{
printf("錯誤!正確答案:%d/%d\n",f1[0],f1[1]);
}
}
printf("總得分%d\n",score);
over();free(number_int);free(number_f);free(f1);free(f2);
break;
default: return 0;
}
}
}
2、執行截圖
(1)加法
(2)減法
(3)乘法
(4)除法
四、個人小結
困難:
1動態分配記憶體失敗!
原因:在前面的程式中出現了記憶體的越界訪問,導致malloc()分配函式所涉及的一些資訊被破壞。下次再使用malloc()函式申請記憶體就會失敗,返回空指標NULL(0)。
2.隨機數的產生重複
原因:因為此程式產生一個隨機數之前,都呼叫一次srand,而由於計算機執行很快,所以每用time得到的時間都是一樣的(time的時間精度較低,只有55ms)。這樣相當於使用同一個種子產生隨機序列,所以產生的隨機數總是相同的。將srand放在迴圈外。
(psp表格)
psp2.1 | 任務內容 | 計劃完成需要的時間(min) | 實際完成需要的時間(min) |
---|---|---|---|
Planning | 計劃 | 340 | 520 |
Estimate | 估計這個任務需要多少時間,並規劃大致工作步驟 | 30 | 60 |
Development | 開發 | 20 | 40 |
Analysis | 需求分析(包括學習新技術) | 30 | 50 |
Design Spec | 生成設計文件 | 20 | 20 |
Design Review | 設計複審 | 10 | 15 |
Coding Standard | 程式碼規範 | 10 | 10 |
Design | 具體設計 | 30 | 60 |
Coding | 具體編碼 | 60 | 120 |
Code Review | 程式碼複審 | 30 | 60 |
Test | 測試(自我測試,修改程式碼,提交修改) | 40 | 60 |
Reporting | 報告 | 10 | 20 |
Test Report | 測試報告 | 10 | 15 |
Size Measurement | 計算工作量 | 20 | 20 |
Postmortem & Process Improvement Plan | 事後總結,並提出過程改進計劃 | 20 | 30 |