四則運算題目生成程序(一)

1、做業信息

博客班級

軟件工程app

做業要求 做業要求
做業目標 你理解的做業目標具體內容
學號 3180701218

2、做業要求

寫一個能自動生成小學四則運算題目的程序,而後在此基礎上擴展:
1)除了整數之外,還要支持真分數的四則運算,例如:1/6+1/8=7/24
2)程序要求能處理用戶的輸入,判斷對錯,累積分數
3)程序支持能夠由用戶自行選擇加、減、乘、除運算
4)使用-n參數控制生成題目的個數,例如Myapp.exe -n 10,將生成10個題目
ide

3、代碼

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<math.h>
#define EPSILON 0.000001 //根據精度須要
int N=0;
int n=0;//用戶輸入搜題數目n
int m=0;//選擇搜題種類


void huajian(int *p,int *q)//化簡爲真分數
{
	int i;
	for(i=*p;i>=1;i--)
	{
		if(((*p)%i==0)&&((*q)%i==0))
		{
			(*p)=(*p)/i;
			(*q)=(*q)/i;
		}
	}
}


void input()//用戶輸入搜題數目n,選擇搜題種類
{
	printf("*———————————*\n");
	printf("|    四則運算生成器    |\n");
	printf("*———————————*\n");
	printf("|        1.加法        |\n");
	printf("|        2.減法        |\n");
	printf("|        3.乘法        |\n");
	printf("|        4.除法        |\n");
	printf("|        5.結束        |\n");
	printf("|  無限小數保留6位小數 |\n");
	printf("*———————————*\n");
	printf("請輸入搜題種類:\n");
	scanf("%d",&m);
}


void addtion()//加法
{
	int i,j;
	printf("1.整數運算or2.真分數運算\n");
	scanf("%d",&j);
	srand(time(NULL));
	if(j==1)
	{
		for(i=0;i<n;i++)
		{
			int a,b,c,d;
			a=rand()%N;
			b=rand()%N;
			c=a+b;
			printf("%d+%d=",a,b);
			scanf("%d",&d);
			if(d==c)printf("運算正確!\n");
			else printf("運算錯誤!正確答案是%d\n",c);
		}
	}
	else
		for(i=0;i<n;i++)
		{
			int a,b;
			int a1,b1;
			float c,d;
			while(1)
			{
				a=rand()%N;
				b=rand()%N;
				a1=rand()%N;
				b1=rand()%N;
				if(b1!=0&&b!=0&&a!=0&&a1!=0&&a!=b&&a1!=b1)
					break;
			}
			huajian(&a,&b);
			huajian(&a1,&b1);
			c=a/(b*1.0)+a1/(b1*1.0);
			printf("%d/%d+%d/%d=",a,b,a1,b1);
			scanf("%f",&d);
			if(fabs(d-c)<EPSILON)
				printf("運算正確!\n");
			else 
				printf("運算錯誤!正確答案是%f\n",c);
		}
};
void subtract()//減法
{
	int i,j;
	printf("1.整數運算or2.真分數運算\n");
	scanf("%d",&j);
	srand(time(NULL));
	if(j==1)
	{
		for(i=0;i<n;i++)
		{
			int a,b,c,d;
			a=rand()%N;
			b=rand()%N;
			c=a-b;
			printf("%d-%d=",a,b);
			scanf("%d",&d);
			if(d==c)printf("運算正確!\n");
			else printf("運算錯誤!正確答案是%d\n",c);
		}
	}
	else
		for(i=0;i<n;i++)
		{
			int a,b;
			int a1,b1;
			float c,d;
			while(1)
			{
				a=rand()%N;
				b=rand()%N;
				a1=rand()%N;
				b1=rand()%N;
				if(b1!=0&&b!=0&&a!=0&&a1!=0&&a!=b&&a1!=b1)
					break;
			}
			huajian(&a,&b);
			huajian(&a1,&b1);
			c=a/(b*1.0)-a1/(b1*1.0);
			printf("%d/%d-%d/%d=",a,b,a1,b1);
			scanf("%f",&d);
			if(fabs(d-c)<EPSILON)
				printf("運算正確!\n");
			else 
				printf("運算錯誤!正確答案是%f\n",c);
		}
};
void multiply()//乘法
{
	int i,j;
	printf("1.整數運算or2.真分數運算\n");
	scanf("%d",&j);
	srand(time(NULL));
	if(j==1)
	{
		for(i=0;i<n;i++)
		{
			int a,b,c,d;
			a=rand()%N;
			b=rand()%N;
			c=a*b;
			printf("%d*%d=",a,b);
			scanf("%f",&d);
			if(d==c)printf("運算正確!\n");
			else printf("運算錯誤!正確答案是%d\n",c);
		}
	}
	else
		for(i=0;i<n;i++)
		{
			int a,b;
			int a1,b1;
			float c,d;
			while(1)
			{
				a=rand()%N;
				b=rand()%N;
				a1=rand()%N;
				b1=rand()%N;
				if(b1!=0&&b!=0&&a!=0&&a1!=0&&a!=b&&a1!=b1)
					break;
			}
			huajian(&a,&b);
			huajian(&a1,&b1);
			c=a/(b*1.0)*a1/(b1*1.0);
			printf("%d/%d*%d/%d=",a,b,a1,b1);
			scanf("%f",&d);
			if(fabs(d-c)<EPSILON)
				printf("運算正確!\n");
			else 
				printf("運算錯誤!正確答案是%f\n",c);
		}
};
void divide()//除法【小數大小判斷不許確】
{
	int i,j;
	printf("1.整數運算or2.真分數運算\n");
	scanf("%d",&j);
	srand(time(NULL));
	if(j==1)
	{
		for(i=0;i<n;i++)
		{
			int a,b,c,d;
			a=rand()%N;
			b=rand()%N;
			c=a/b;
			printf("%d/%d=",a,b);
			scanf("%f",&d);
			if(d==c)printf("運算正確!\n");
			else printf("運算錯誤!正確答案是%d\n",c);
		}
	}
	else
		for(i=0;i<n;i++)
		{
			int a,b;
			int a1,b1;
			float c,d;
			while(1)
			{
				a=rand()%N;
				b=rand()%N;
				a1=rand()%N;
				b1=rand()%N;
				if(b1!=0&&b!=0&&a!=0&&a1!=0&&a!=b&&a1!=b1)
					break;
			}
			huajian(&a,&b);
			huajian(&a1,&b1);
			c=a/(b*1.0)/(a1/(b1*1.0));
			printf("(%d/%d)/(%d/%d)=",a,b,a1,b1);
			scanf("%f",&d);
			if(fabs(d-c)<EPSILON)
				printf("運算正確!\n");
			else 
				printf("運算錯誤!正確答案是%f\n",c);
		}
};

int main()
{
	printf("想練習多大數之內的運算題目:\n");
	scanf("%d",&N);
	while(1)
	{
		input();
		switch(m)
		{
		case 1:
			printf("請輸入搜題數目:\n");
			scanf("%d",&n);
			addtion();
			break;
		case 2:
			printf("請輸入搜題數目:\n");
			scanf("%d",&n);
			subtract();
			break;
		case 3:
			printf("請輸入搜題數目:\n");
			scanf("%d",&n);
			multiply();
			break;
		case 4:
			printf("請輸入搜題數目:\n");
			scanf("%d",&n);
			divide();
			break;
		case 5:
			printf("謝謝使用!:\n");
			return 0;
		default:
			printf("輸入指令有誤,請從新輸入!\n");
			break;
		}
	}
	return 0;
};

4、運行截圖

5、總結

1.psp表格

psp2.1 任務內容 計劃完成須要的時間(min) 實際完成須要的時間(min)
Planning 計劃 10 8
Estimate 估計這個任務須要多少時間,
並規劃大體工做步驟
10 12
Development 開發 100 150
Analysis 需求分析(包括學習新技術) 12 5
Design Spec 生成設計文檔 5 5
Design Review 設計複審 5 5
Coding Standard 代碼規範 3 2
Design 具體設計 10 12
Coding 具體編碼 36 21
Code Review 代碼複審 5 7
Test 測試(自我測試,修改代碼,提交修改) 10 15
Reporting 報告 9 6
Test Report 測試報告 3 2
Size Measurement 計算工做量 2 1
Postmortem & Process Improvement Plan 過後總結,並提出過程改進計劃 3 3

2.總結

剛看到這個題目時,我以爲很簡單,只須要利用隨機數就能夠了,可是實現過程卻遇到了不少困難,尤爲是實現真分數運算。該系統將分數轉化爲小數,經過兩個分數差的絕對值與一個很小量比較判斷大小,所以會產生誤判,而且用戶只能輸入小數才能被系統識別。例如1/3+3/7=?正確答案是16/21。可是用戶只能輸入小數,且保留小數點後6位。這樣,用戶輸入不方便,並且系統可能會誤判。學習

相關文章
相關標籤/搜索