四则运算

1.作业规范要求

博客班级 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18
作业要求 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18/homework/11377
作业目标 < 写一个能自动生成小学四则运算题目的程序,然后在此基础上扩展:
1)能自动随机生成整数和真分数,能自动判断真分数,并进行约分处理;
2)程序要求能处理用户的输入,判断对错,累积分数,正确加分,错误减分,总分为非负数;
3)程序支持可以由用户自行选择加、减、乘、除运算;
4)使用-n参数控制生成题目的个数,例如Myapp.exe -n 10,将生成10个题目
学号 <3180701116>

2.题目要求

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

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

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

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

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

3.代码设计

  1. 头文件
#include<stdio.h>
#include<windows.h>
#include <time.h>
  1. 全局变量,结构体;
int right=0;
int wrong=0;
struct fraction{//真分数
	int numerator;//分子
	int denominator;//分母
};

3.最大公约数函数

int find_gcd(int n1,int n2)//求最大公约数
{
	int temp;
	while(n1!=0)
	{
		temp=n2%n1;
		n2=n1;
		n1=temp;
	}
	return n2;
}

4.分数化简函数

struct fraction reduce_fraction(struct fraction f)//化简为分数最简形式
{
	int gcd=find_gcd(f.numerator,f.denominator);
	f.numerator/=gcd;
	f.denominator/=gcd;
	return f;
}

5.选择运算加减乘除

int Choise()/*四则运算选择*/
{
	int choise;
	printf("
			欢迎进入小学四则运算

");
	printf("请选择:
");
	printf("			  加法运算(请输入1)
");
	printf("			  减法运算(请输入2)
");
	printf("			  乘法运算(请输入3)
");
	printf("			  除法运算(请输入4)
");
	scanf("%d",&choise);
	while(!(choise>=1&&choise<=4))
	{
		printf("			输入非正确选项,请重新输入!
");
		scanf("%d",&choise);
	}
	return choise;
}

6.计算


void Compute()/*计算*/
{
	int x1,x2,x3,x4,x5,x6,x7,x8,b,c;
	float result,true_value;
	struct fraction Y1;
	struct fraction Y2;
	struct fraction Result;
	struct fraction True_value;
	srand(time(0));//通过系统时间初始化随机数种子,让每次产生的随机数不相同
	x1=rand()%100;
	x2=rand()%100;
	x3=rand()%100;
	x4=rand()%100;
	x5=rand()%100;
	x6=rand()%100;
	/*生成0-99的6个随机数*/
	for(;x2==0;)
	{
		x2=rand()%100;
	}//除数不为0
	for(;x4==0||x3>=x4;)
	{
		x3=rand()%100;
		x4=rand()%100;
	}//判断分母是否为0,是否分子小于分母为真分数
	for(;x6==0||x5>=x6;)
	{	x5=rand()%100;
		x6=rand()%100;
	}//判断分母是否为0,是否分子小于分母为真分数
	Y1.numerator=x3;
	Y1.denominator=x4;
	Y2.numerator=x5;
	Y2.denominator=x6;
	Y1=reduce_fraction(Y1);
	Y2=reduce_fraction(Y2);//生成真分数
	b=rand()%2;//用于随机整数或真分数计算组合选择
	c=Choise();
	if(b==0)
	{//整数整数运算
		switch(c)
		{
		case 1://整数+整数
			printf("请回答:
		 %d + %d = ",x1,x2);
			scanf("%f",&result);
			if(x1+x2==result)
			{
				printf("回答正确!
");
				right++;
			}
			else
			{
				printf("回答错误!
");
				wrong++;
			}
			break;
		case 2://整数-整数
			printf("请回答:
		 %d - %d = ",x1,x2);
			scanf("%f",&result);
			if(x1-x2==result)
			{
				printf("回答正确!
");
				right++;
			}
			else
			{
				printf("回答错误!
");
				wrong++;
			}
			break;
		case 3://整数*整数
			printf("请回答:
		 %d * %d = ",x1,x2);
			scanf("%f",&result);
			if(x1*x2==result)
			{
				printf("回答正确!
");
				right++;
			}
			else
			{
				printf("回答错误!
");
				wrong++;
			}
			break;
		case 4://整数/整数
			printf("请回答:
		 %d / %d = ",x1,x2);
			scanf("%f",&result);
			true_value=int(float(x1)/x2*1000)/1000.0;//结果保留三位小数
			if(true_value==result)
			{
				printf("回答正确!
");
				right++;
			}
			else
			{
				printf("回答错误!
");
				wrong++;
			}
			break;
		}
	}
	
	else if(b==1)
	{
		//真分数 真分数运算
		switch(c)
		{
		case 1://真分数+真分数数
			printf("请回答:
		 %d/%d + %d/%d = ",Y1.numerator,Y1.denominator,Y2.numerator,Y2.denominator);
			True_value.numerator=Y1.numerator*Y2.denominator+Y2.numerator*Y1.denominator;
			True_value.denominator=Y1.denominator*Y2.denominator;
			True_value=reduce_fraction(True_value);
			scanf("%d/%d",&x7,&x8);
			Result.numerator=x7;
			Result.denominator=x8;
			Result=reduce_fraction(Result);
			if(True_value.numerator==Result.numerator && True_value.denominator==Result.denominator)
			{
				printf("回答正确!
");
				right++;
			}
			else
			{
				printf("回答错误!
");
				wrong++;
			}
			break;
		case 2://真分数-真分数
		printf("请回答:
		 %d/%d - %d/%d = ",Y1.numerator,Y1.denominator,Y2.numerator,Y2.denominator);
			True_value.numerator=Y1.numerator*Y2.denominator-Y2.numerator*Y1.denominator;
			True_value.denominator=Y1.denominator*Y2.denominator;
			True_value= reduce_fraction(True_value);
			scanf("%d/%d",&x7,&x8);
			Result.numerator=x7;
			Result.denominator=x8;
			Result=reduce_fraction(Result);
			if(True_value.numerator==Result.numerator && True_value.denominator==Result.denominator)
			{
				printf("回答正确!
");
				right++;
			}
			else
			{
				printf("回答错误!
");
				wrong++;
			}
			break;
		case 3://真分数*真分数
			printf("请回答:
		 %d/%d * %d/%d = ",Y1.numerator,Y1.denominator,Y2.numerator,Y2.denominator);
			True_value.numerator=Y1.numerator*Y2.numerator;
			True_value.denominator=Y1.denominator*Y2.denominator;
			True_value=reduce_fraction(True_value);
			scanf("%d/%d",&x7,&x8);
			Result.numerator=x7;
			Result.denominator=x8;
			Result=reduce_fraction(Result);
			if(True_value.numerator==Result.numerator && True_value.denominator==Result.denominator)
			{
				printf("回答正确!
");
				right++;
			}
			else
			{
				printf("回答错误!
");
				wrong++;
			}
			break;
		case 4://真分数/真分数
		printf("请回答:
		 %d/%d / %d/%d = ",Y1.numerator,Y1.denominator,Y2.numerator,Y2.denominator);
			True_value.numerator=Y1.numerator*Y2.denominator;
			True_value.denominator=Y1.denominator*Y2.numerator;
			True_value=reduce_fraction(True_value);
			scanf("%d/%d",&x7,&x8);
			Result.numerator=x7;
			Result.denominator=x8;
			Result=reduce_fraction(Result);
			if(True_value.numerator==Result.numerator && True_value.denominator==Result.denominator)
			{
				printf("回答正确!
");
				right++;
			}
			else
			{
				printf("回答错误!
");
				wrong++;
			}
			break;
		}
	}
}

7.主函数

void main()
{
int total_score=0;
int n=0;
printf("请输入运算题的数目:
");
scanf("%d",&n);
while(n!=0)//控制计算题目总数
{
	Compute();
	printf("
-----------------------------------------------------
");
	n--;
}
if(right>=wrong)//累计分数,并保证分数非负
total_score=right-wrong;

printf("	**********计算结束!**********
");
printf("总分:%d;	正确:%d;	错误:%d
",total_score,right,wrong);

}

8.代码运行

4.个人小结

1.psp耗时表

psp2.1 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 500 700
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 550 700
Development 开发 200 300
Analysis 需求分析(包括学习新技术) 30 30
Design Spec 生成设计文档 30 30
Design Review 设计复审 20 20
Coding Standard 代码规范 15 30
Design 具体设计 15 10
Coding 具体编码 120 150
Code Review 代码复审 10 10
Test 测试(自我测试,修改代码,提交修改) 30 30
Reporting 报告 15 10
Test Report 测试报告 20 15
Size Measurement 计算工作量 20 30
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 20 30
2.总结
·写这份简单的代码还是花费了许多时间的,途中也遇到了许多的困难,对于分数的识别及分数的运算遇到了一些困难,写出来的代码也比较繁杂不够简洁,希望以后能好好改正。
·在写代码时,对于生成随机数,控制输出精度,读取输入的分数等知识点都存在疑惑,自己需要学习的知识还很多。
·在写代码的途中,也重新认识到代码规范化及软件工程思想的重要性。
原文地址:https://www.cnblogs.com/SZYJY/p/13946131.html