1. 程式人生 > 實用技巧 >開源專案分享-h5-api

開源專案分享-h5-api

一、作業資訊

這個作業屬於哪個課程 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