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.代码设计
- 头文件
#include<stdio.h>
#include<windows.h>
#include <time.h>
- 全局变量,结构体;
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.总结 | |||
·写这份简单的代码还是花费了许多时间的,途中也遇到了许多的困难,对于分数的识别及分数的运算遇到了一些困难,写出来的代码也比较繁杂不够简洁,希望以后能好好改正。 | |||
·在写代码时,对于生成随机数,控制输出精度,读取输入的分数等知识点都存在疑惑,自己需要学习的知识还很多。 | |||
·在写代码的途中,也重新认识到代码规范化及软件工程思想的重要性。 |