四则运算


博客班级 AHPU软件工程
作业要求 实现小学四则运算
作业目标
学号 3180701214

题目要求

写一个能自动生成小学四则运算题目的程序,然后在此基础上扩展:

1)除了整数以外,还要支持真分数的四则运算,例如:1/6+1/8=7/24

2)程序要求能处理用户的输入,判断对错,累积分数

3)程序支持可以由用户自行选择加、减、乘、除运算

4)使用-n参数控制生成题目的个数,例如Myapp.exe -n 10,将生成10个题目

代码

递归求最大公约数

int Gcd(int m,int n){
	if(n==0) return m;
	return Gcd(n,m%n);
}//递归求最大公约数 

四舍五入

float Handling(float &t){
	t*=100;
	t+=0.5;
	t=(int)t;
	t/=100;
	return t;
}//对计算机算出的数进行位数的确定,并使用四舍五入算法 

交换

int swap(int &a,int &b){
	int t;
	if(a>b){
		t=a;
		a=b;
		b=t;
	}	
}//交换

整数加法

int intAddition(int &score){
	int a,b,c;
	srand((unsigned int)time(NULL));
	a=rand()%100;
	b=rand()%100;
	printf("\n\t\t\t\t请计算:%d+%d=",a,b);
	scanf("%d",&c);
	if(a+b==c){
		score++;
		printf("\t\t\t\t回答正确!\n"); 
	} 
	else
	printf("\t\t\t\t回答错误!正确答案为:%d\n",a+b);
}

真分数加法

int trueAddition(int &score){
	
		int a,b,c,d,x,y;
		float e,f,g;
		int tru1,tru2,tru3,tru4;
		int re1,re2;
		srand((unsigned int)time(NULL));
		do{
			a=rand()%10;
			b=rand()%10+1;
			x=rand()%10;
			y=rand()%10+1;	
		}while(a==b||x==y);
		swap(a,b);
		swap(x,y);
		
		tru1=(a/Gcd(a,b))*(y/Gcd(x,y));
		tru2=(x/Gcd(x,y))*(b/Gcd(a,b));
		tru3=(b/Gcd(a,b))*(y/Gcd(x,y));
		tru4=tru1+tru2;
		re1=tru4/Gcd(tru4,tru3);
		re2=tru3/Gcd(tru4,tru3);
		printf("\n\t\t\t\t请计算:%d/%d+%d/%d=",a/Gcd(a,b),b/Gcd(a,b),x/Gcd(x,y),y/Gcd(x,y));
		scanf("%d/%d",&c,&d);
		if(re1==c&&re2==d){
		score++;
		printf("\t\t\t\t回答正确!\n"); 
	   } 
	   else{
	    if(re2==1){
	    	printf("\t\t\t\t回答错误!正确答案为:%d\n",re1);
		}else
		printf("\t\t\t\t回答错误!正确答案为:%d/%d\n",re1,re2);
	   }
} 

整数减法

int intSubtraction(int &score){
	int a,b,c,t;
	srand((unsigned int)time(NULL));
	a=rand()%100;
	b=rand()%100;
	if(a<b){
		t=a;
		a=b;
		b=t;
	}
	printf("\n\t\t\t\t请计算:%d-%d=",a,b);
	scanf("%d",&c);
	if(a-b==c){
		score++;
		printf("\t\t\t\t回答正确!\n"); 
	} 
	else
	printf("\t\t\t\t回答错误!正确答案为:%d\n",a-b);
}

真分数减法

int trueSubtraction(int &score){
	
		int a,b,c,d,x,y;
		float e,f,g;
		int tru1,tru2,tru3,tru4;
		int re1,re2;
		srand((unsigned int)time(NULL));
		do{
			a=rand()%10;
			b=rand()%10+1;
			x=rand()%10;
			y=rand()%10+1;	
		}while(a==b||x==y);
		swap(a,b);
		swap(x,y);
		
		tru1=(a/Gcd(a,b))*(y/Gcd(x,y));//通分后的第一个分子 
		tru2=(x/Gcd(x,y))*(b/Gcd(a,b));//通分后的第二个分子 
		tru3=(b/Gcd(a,b))*(y/Gcd(x,y));//通分后的分母 
		if(tru1<tru2){
			int t;
			t=a;
			a=x;
			x=t;//交换分子 
			t=b;
			b=y;
			y=t;//交换分母 
		} 
		tru1=(a/Gcd(a,b))*(y/Gcd(x,y));
		tru2=(x/Gcd(x,y))*(b/Gcd(a,b));
		tru4=tru1-tru2;
		re1=tru4/Gcd(tru4,tru3);
		re2=tru3/Gcd(tru4,tru3);
		printf("\n\t\t\t\t请计算:%d/%d-%d/%d=",a/Gcd(a,b),b/Gcd(a,b),x/Gcd(x,y),y/Gcd(x,y));
		scanf("%d/%d",&c,&d);
		if(re1==c&&re2==d){
		score++;
		printf("\t\t\t\t回答正确!\n"); 
	   } 
	   else{	
		printf("\t\t\t\t回答错误!正确答案为:%d/%d\n",re1,re2);
	   }
	 
  
} 

整数乘法

int intMultiplication(int &score){
	int a,b,c;
	srand((unsigned int)time(NULL));
	a=rand()%100;
	b=rand()%100;
	printf("\n\t\t\t\t请计算:%d*%d=",a,b);
	scanf("%d",&c);
	if(a*b==c){
		score++;
		printf("\t\t\t\t回答正确!\n"); 
	} 
	else
	printf("\t\t\t\t回答错误!正确答案为:%d\n",a*b);
}

真分数乘法

int trueMultiplication(int &score){
		int a,b,c,d,x,y;
		float e,f,g;
		int tru1,tru2,tru3,tru4;
		int re1,re2;
		srand((unsigned int)time(NULL));
		do{
			a=rand()%10;
			b=rand()%10+1;
			x=rand()%10;
			y=rand()%10+1;	
		}while(a==b||x==y);
		swap(a,b);
		swap(x,y);
		
		tru1=(a/Gcd(a,b))*(x/Gcd(x,y));//相乘后的分子 
		tru2=(y/Gcd(x,y))*(b/Gcd(a,b));//相乘后的分母 
		
		re1=tru1/Gcd(tru1,tru2);
		re2=tru2/Gcd(tru1,tru2);
		printf("\n\t\t\t\t请计算:%d/%d*%d/%d=",a/Gcd(a,b),b/Gcd(a,b),x/Gcd(x,y),y/Gcd(x,y));
		scanf("%d/%d",&c,&d);
		if(re1==c&&re2==d){
		score++;
		printf("\t\t\t\t回答正确!\n"); 
	   } 
	   else{	
		printf("\t\t\t\t回答错误!正确答案为:%d/%d\n",re1,re2);
	   }
} 

整数除法

int intDivision(int &score){
	int a,b;
	float c,t;
	srand((unsigned int)time(NULL));
	a=rand()%100;
	b=rand()%100+1;
	printf("\n\t\t\t\t请计算:%d/%d=",a,b);
	scanf("%f",&c);
	t=(float)a/b;
	t=Handling(t);
	c=Handling(c);
	if(t==c){
		score++;
		printf("\t\t\t\t回答正确!\n"); 
	} 
	else
	printf("\t\t\t\t回答错误!正确答案为:%.2f\n",t);
}

真分数除法

int trueDivision(int &score){
		int a,b,c,d,x,y;
		float e,f,g;
		int tru1,tru2,tru3,tru4;
		int re1,re2;
		srand((unsigned int)time(NULL));
		do{
			a=rand()%10;
			b=rand()%10+1;
			x=rand()%10+1;
			y=rand()%10+1;	
		}while(a==b||x==y);
		swap(a,b);
		swap(x,y);
		
		tru1=(a/Gcd(a,b))*(y/Gcd(x,y));//相除后的分子 
		tru2=(x/Gcd(x,y))*(b/Gcd(a,b));//相除后的分母 
		
		re1=tru1/Gcd(tru1,tru2);
		re2=tru2/Gcd(tru1,tru2);
		printf("\n\t\t\t\t请计算:%d/%d/%d/%d=",a/Gcd(a,b),b/Gcd(a,b),x/Gcd(x,y),y/Gcd(x,y));
		scanf("%d/%d",&c,&d);
		if(re1==c&&re2==d){
		score++;
		printf("\t\t\t\t回答正确!\n"); 
	   } 
	   else{
	    if(re2==1){
	    	printf("\t\t\t\t回答错误!正确答案为:%d\n",re1);
		}else
		printf("\t\t\t\t回答错误!正确答案为:%d/%d\n",re1,re2);	
	   }
} 

主函数

int main(){
	int n,m,t,x,score=0;//m表示选择的四则运算类型,score表示总分累计 
	system("color f2");
	start:
		printf("\n\n\t\t\t\t\t\t欢迎进入四则运算练习\n\n\n");
		printf("\t\t\t设置生成的练习题目个数:");
		scanf("%d",&n); 
		t=n; 
		printf("\n\t\t\t\t\t1.加法运算\n");
		printf("\t\t\t\t\t2.减法运算\n");
		printf("\t\t\t\t\t3.乘法运算\n");
		printf("\t\t\t\t\t4.除法运算\n");
		printf("\t\t\t\t\t0.結束答題\n");
		restart:
		printf("\n\n\t\t\t请选择算法类型:");
		scanf("%d",&m);	
		
		while(t>0){
			switch(m){
				case 0:
					exit(0); 
				case 1:
					srand((unsigned int)time(NULL));
					x=rand()%2;
					if(x==0){
						intAddition(score);
					}
					else{
						trueAddition(score); 
					}
					break;
				case 2:
					srand((unsigned int)time(NULL));
					x=rand()%2;
					if(x==0){
						intSubtraction(score);
					}
					else{
						trueSubtraction(score); 
					}
					break;
				case 3:
					srand((unsigned int)time(NULL));
					x=rand()%2;
					if(x==0){
						intMultiplication(score);
					}
					else{
						trueMultiplication(score); 
					}
					break;
				case 4:
					srand((unsigned int)time(NULL));
					x=rand()%2;
					if(x==0){
						intDivision(score);
					}
					else{
						trueDivision(score); 
					}
					break;
				default:
					printf("\n\t\t\t\t输入不正确,请重新输入!");
					
					goto restart;
			}
			t--;
		}
	printf("\n\n\t\t\t\t\t\t\t此次练习共%d题,共答对%d题\n",n,score);
	printf("\n\n\t\t\t\t\t\t\t\t\t\t\t总得分:%d分\n",score);
	printf("\n\n\t\t\t\t\t...............返回主界面.............\n\n");
	system("pause");
	system("cls");
	goto start;
	
	return OK;
}

运行界面

整数、真分数加法练习界面

整数、真分数减法练习界面

整数、真分数乘法练习界面

整数、真分数除法练习界面

退出练习界面

作业小结

1.psp表格

psp2.1 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 120 8
Development 开发 100 150
Analysis 需求分析(包括学习新技术) 10 10
Design Spec 生成设计文档 30 40
Design Review 设计复审 5 10
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.心得和经验

通过本次作业,我练习了编程能力,深刻掌握了如何将计算机计算出的浮点数精确转变为任意位数的浮点数的方法,同时也学会了Makdown编辑规范,也学会了写博客的整体流程,对博客使用更加熟练。

posted on 2020-11-07 23:58  繁霜银河  阅读(244)  评论(0编辑  收藏  举报