四则运算

一、作业信息

博客班级 ahpu软件工程
作业要求 实现四则运算
作业目标 能对需求进行分析并实现;写一个能自动生成小学四则运算题目的程序
学号 3180701228

二、作业要求

写一个能自动生成小学四则运算题目的程序,然后在此基础上扩展:
1)除了整数以外,还要支持真分数的四则运算,例如:1/6+1/8=7/24
2)程序要求能处理用户的输入,判断对错,累积分数
3)程序支持可以由用户自行选择加、减、乘、除运算
4)使用-n参数控制生成题目的个数,例如Myapp.exe -n 10,将生成10个题目

三、代码提交

1.代码结构
①加法整/分数运算函数
void add_oper()
{
int a,b,c,q;
q=rand()%2;//随机选择整数或分数进行运算
if(q == 1)
{
a=rand()%100;
b=rand()%100;
printf("请回答:\n\t\t %d + %d = ",a,b);
scanf("%d",&c);
if(a+b==c)
{
printf("回答正确!\n");
r++;
}
else
{
printf("回答错误!\n");
w++;
}
}
else
{
int nume_1, deno_1, nume_2, deno_2;
//↑第一个数的分子分母和第二个数的分子分母
int nume_s, deno_s;
//↑存储计算机计算出的答案分子分母
int i, len;//len存储输入字符长度
int nume=0;
int deno=0;//存储用户输入的分子分母
char sum[DIGIT];//存储用户输入字符串

	deno_1=rand()%100+1;
	nume_1=rand()%deno_1;
	deno_2=rand()%100+1;
	nume_2=rand()%deno_2;
	printf("%d/%d+%d/%d= \n",nume_1,deno_1,nume_2,deno_2);
	//真分数分母要比分子大且分母不能为0;
	
	nume_s=(nume_1*deno_2)+(nume_2*deno_1);
	deno_s=deno_1*deno_2;
	//↑计算真分数相加的结果 
	
	scanf("%s", sum);
	len = strlen(sum);

// for(i=0; i<len; i++)
// {
// printf("%c", sum[i]);
//
// }

	int flag=0;
	for(i=0; i<len; i++)//将输入的字符型答案转换成整形的分子分母 
	{	
		if(sum[i] != '/')
		{
			int i_sum = sum[i] - '0';//将char型转换为int型
		//	printf("\ni_sum=%d",i_sum);
			if(flag == 0){
				nume *= 10;
				nume += i_sum; 
			}
			if(flag == 1){
				deno *= 10;
				deno += i_sum;
			}
		}
		
		else if(sum[i] == '/')
		{
		//	printf("\n/");
			flag = 1;
		}
	}
	
	if(nume == nume_s && deno == deno_s)
	{
	//	printf("转换后的结果 %d/%d", nume, deno); 
		printf("答案正确!"); 
		r++;
	}
	else
	{
	//	printf("转换后的结果 %d/%d", nume, deno); 
		printf("答案错误!"); 
		w++;
	}

}

}
②减法整/分数运算函数
void sub_oper()
{
int a,b,c,q;
q=rand()%2;
if(q == 0)
{
a=rand()%100;
b=rand()%100;
printf("请回答:\n\t\t %d - %d = ",a,b);
scanf("%d",&c);
if(a-b==c)
{
printf("回答正确!\n");
r++;
}
else
{
printf("回答错误!\n");
w++;
}
}
else
{
int nume_1, deno_1, nume_2, deno_2;
//↑第一个数的分子分母和第二个数的分子分母
int nume_s, deno_s;
//↑存储计算机计算出的答案分子分母
int i, len;//len存储输入字符长度
int nume=0;
int deno=0;//存储用户输入的分子分母
char sum[DIGIT];//存储用户输入字符串

	deno_1=rand()%100+1;
	nume_1=rand()%deno_1;
	deno_2=rand()%100+1;
	nume_2=rand()%deno_2;
	printf("%d/%d-%d/%d= \n",nume_1,deno_1,nume_2,deno_2);
	//真分数分母要比分子大且分母不能为0;
	nume_s=(nume_1*deno_2)-(nume_2*deno_1);
	deno_s=deno_1*deno_2;
	//↑计算真分数相减的结果 
	scanf("%s", sum);
	len = strlen(sum);
	
	int flag=0;//判断比值符 
	int sign=0;//判断正负符号 
	for(i=0; i<len; i++)//将输入的字符型答案转换成整形的分子分母 
	{	
		if(sum[i] != '/' && sum[i] != '-')
		{
			int i_sum = sum[i] - '0';//将char型转换为int型
			if(flag == 0){
				nume *= 10;
				nume += i_sum; 
			}
			if(flag == 1){
				deno *= 10;
				deno += i_sum;
			}
		}
		
		else if(sum[i] == '/')
		{
			flag = 1;
		}
		else if(sum[i] == '-') 
		{
			sign = 1;//说明用户输入的结果是负数 
		}
	}
	
	if(nume_s > 0 && nume == nume_s && deno == deno_s)
	{
		printf("答案正确!");
		r++; 
	}
	else if(nume_s < 0 && nume == -nume_s && deno == deno_s && sign == 1)
	{
		printf("答案正确!"); 
		r++;
	}
	else
	{
		printf("答案错误!"); 
		w++;
	} 
	 

 }

}
③乘法整/分数运算函数
void mul_oper()
{
int a,b,c,q;
q=rand()%2;
if(q == 0)
{
a=rand()%100;
b=rand()%100;
printf("请回答:\n\t\t %d * %d = ",a,b);
scanf("%d",&c);
if(a*b==c)
{
printf("回答正确!\n");
r++;
}
else
{
printf("回答错误!\n");
w++;
}
}
else
{
int nume_1, deno_1, nume_2, deno_2;
//↑第一个数的分子分母和第二个数的分子分母
int nume_s, deno_s;
//↑存储计算机计算出的答案分子分母
int i, len;//len存储输入字符长度
int nume=0;
int deno=0;//存储用户输入的分子分母
char sum[DIGIT];//存储用户输入字符串

	deno_1=rand()%100+1;
	nume_1=rand()%deno_1;
	deno_2=rand()%100+1;
	nume_2=rand()%deno_2;
	printf("%d/%d*%d/%d= \n",nume_1,deno_1,nume_2,deno_2);
	//真分数分母要比分子大且分母不能为0;
	nume_s=nume_1*nume_2;
	deno_s=deno_1*deno_2;

// printf("%d * %d", nume_s, deno_s);
//↑计算真分数相乘的结果
scanf("%s", sum);
len = strlen(sum);

	int flag=0;//判断比值符  
	for(i=0; i<len; i++)//将输入的字符型答案转换成整形的分子分母 
	{	
		if(sum[i] != '/')
		{
			int i_sum = sum[i] - '0';//将char型转换为int型
			if(flag == 0){
				nume *= 10;
				nume += i_sum; 
			}
			if(flag == 1){
				deno *= 10;
				deno += i_sum;
			}
		}
		
		else if(sum[i] == '/')
		{
			flag = 1;
		}

	}
	
	if(nume == nume_s && deno == deno_s && nume_s != 0)
	{
		printf("答案正确!");
		r++; 
	}
	else if(nume == nume_s && nume_s == 0)
	{
		printf("答案正确!"); 
		r++;
	}
	else
	{ 

// printf("%d", nume);
printf("答案错误!");
w++;
}
}
}
④除法整/分数运算函数
void div_oper()
{
int a,b,c,q;
q=rand()%2;
if(q == 0)
{
a=rand()%100;
b=rand()%100;
printf("请回答:\n\t\t %d / %d = ",a,b);
scanf("%d",&c);
if(a/b==c)
{
printf("回答正确!\n");
r++;
}
else
{
printf("回答错误!\n");
w++;
}
}
else
{
int nume_1, deno_1, nume_2, deno_2;
//↑第一个数的分子分母和第二个数的分子分母
int nume_s, deno_s;
//↑存储计算机计算出的答案分子分母
int i, len;//len存储输入字符长度
int nume=0;
int deno=0;//存储用户输入的分子分母
char sum[DIGIT];//存储用户输入字符串

	deno_1=rand()%100+1;
	nume_1=rand()%deno_1;
	deno_2=rand()%100+2;
	nume_2=rand()%deno_2;//除数不能为零!!! 
	printf("%d/%d ÷%d/%d= \n",nume_1,deno_1,nume_2,deno_2);
	//真分数分母要比分子大且分母不能为0;
	nume_s=nume_1*deno_2;
	deno_s=deno_1*nume_2;

// printf("%d * %d", nume_s, deno_s);
//↑计算真分数相乘的结果
scanf("%s", sum);
len = strlen(sum);

	int flag=0;//判断比值符 

// int sign=0;//判断正负符号
for(i=0; i<len; i++)//将输入的字符型答案转换成整形的分子分母
{
if(sum[i] != '/')
{
int i_sum = sum[i] - '0';//将char型转换为int型
if(flag == 0){
nume *= 10;
nume += i_sum;
}
if(flag == 1){
deno *= 10;
deno += i_sum;
}
}

		else if(sum[i] == '/')
		{
			flag = 1;
		}

	}
	if(nume == nume_s && deno == deno_s && nume_s != 0)
	{
		printf("答案正确!");
		r++; 
	}
	else if(nume == nume_s && nume_s == 0)
	{
		printf("答案正确!");
		r++; 
	}
	else
	{ 
		printf("答案错误!"); 
		w++;
 	}
		 	
 }

}
⑤头文件、宏定义、全局变量
include<stdio.h>
include<math.h>
include<string.h>
include<windows.h>
define N 10 //出十道题
define DIGIT 20 //用户输入答案数组的大小
int r = 0;//计数正确答题数
int w = 0;//计数错误答题数
void add_oper();//加法整/分数运算函数
void sub_oper();//减法整/分数运算函数
void mul_oper();//乘法整/分数运算函数
void div_oper();//除法整/分数运算函数

⑥主函数
int main()
{
int sel_oper, flag=1;
int con = 0;

printf("\n\t\t\t欢迎进入简易四则运算\n\n");

while(flag <= N)
{
	printf("请选择:\n");
	printf("\t\t\t  加法整/分数运算(请输入1)\n");
	printf("\t\t\t  减法整/分数运算(请输入2)\n");
	printf("\t\t\t  乘法整/分数运算(请输入3)\n");
	printf("\t\t\t  除法整/分数运算(请输入4)\n");
	printf("\t\t\t  退出整/分数运算(请输入5)\n");

// sto = rand()%4;//随机生成四则运算选择数
if(con0)
scanf("%d",&sel_oper);
switch(sel_oper)
{
case 1:
printf("第%d题:", flag);
add_oper();
flag++;
break;
case 2:
printf("第%d题:", flag);
sub_oper();
flag++;
break;
case 3:
printf("第%d题:", flag);
mul_oper();
flag++;
break;
case 4:
printf("第%d题:", flag);
div_oper();
flag++;
break;
case 5:
return;
}
printf("\n\t\t\t继续运算?(请输入1)\n");
printf("\n\t\t\t重新选择?(请输入2)\n");
printf("\n\t\t\t退出运算?(请输入3)\n");
scanf("%d",&con);
if(con
1)
con=1;
else if(con2)
con=0;
else if(con
3)
break;
else
printf("抱歉!,你输入的指令有误!请重新输入!\n");
}
printf("您总共完成了 %d 道题\n正确 %d 道\n错误 %d 道\n",r+w,r,w);
return 0;
}
2.运行截图
整数加法

整数减法

整数乘法

整数除法

四、个人小结

第一次用博客园来写代码,完成相关作业,感觉对于自己来说还是有一点难度。关于这个题目,完成的还有很多不足,其中最大的不足就是,没有关于真分数的计算。总体来说,通过这次作业可以看出,编程能力还需要提高。

psp 任务内容 计划完成的时间(min) 实际完成时间(min)
Planning 计划 30 30
Estimate 估计这个任务需要多少时间 50 60
Development 开发 20 20
Design 设计 15 15
Test 测试 6 6
Postmortem & Process Improvement Plan 事后总结 5 5
posted on 2020-11-07 23:42  乾巧555  阅读(174)  评论(0)    收藏  举报