一、作业信息
作业班级 | https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18 |
---|---|
作业要求 | https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18/homework/11377 |
作业目标 | 能对需求进行分析并实现;编码格式规范;学习博客撰写 |
学号 | 3180701337 |
二、作业要求
写一个能自动生成小学四则运算题目的程序,然后在此基础上扩展:
1)除了整数以外,还要支持真分数的四则运算,例如:1/6+1/8=7/24
2)程序要求能处理用户的输入,判断对错,累积分数
3)程序支持可以由用户自行选择加、减、乘、除运算
4)使用-n参数控制生成题目的个数,例如Myapp.exe -n 10,将生成10个题目
三、代码提交与运行截图
1.源代码
include<stdio.h>
include<stdlib.h>
include<time.h>
include<string.h>
include<math.h>
void getZquestion();
void getFquestion();
char operators();
int ZResult(int,int,char);
int FZResult(int,int,int,int,char);
int FMResult(int,int,int,int,char);
(一)、主函数
void main()
{
int key;
printf("请选择需要进行四则运算的类型\n");
printf("********1.整数************\n");
printf("********2.真分数**********\n");
printf("请输入数字进行选择:");
scanf("%d", &key);
switch(key)
{
case 1:
{
int i;
printf("请输入题目的个数:");
scanf("%d", &i);
for (int j = 0; j < i; j++)
{
getZquestion();
}
}
case 2:
{
int i;
printf("请输入题目的个数:");
scanf("%d", &i);
for (int j = 0; j < i; j++)
{
getFquestion();
}
}
}
}
(二)、整数类型题目生成与解答
void getZquestion()
{
int n1,n2;
char symbol;
int answer;
srand((unsigned)time(NULL)); //用时间做种子生成随机数
symbol=operators();
n1=rand()%101;
n2=rand()%101+1; //使n2不为0;防止在除法运算中无意义
if(symbol=='-')
{
if(n1<n2) //判断两个数的大小,使n1为较大的数,方便在运算符号为减号时使结果有意义
{
int temp;
temp=n1;
n1=n2;
n2=temp;
}
}
printf("%d%c%d=",n1,symbol,n2);
scanf("%d",&answer);
if(ZResult(n1,n2,symbol)==answer) //判断使用者的答案是否正确
{
printf("Right\n");
}
else
{
printf("Wrong\n");
printf("正确答案:%d\n",ZResult(n1,n2,symbol));
}
}
(三)、获取运算随机符
char operators()
{
char symbol[4]={'+','-','*','/'};
srand((unsigned)time(NULL));
return symbol[rand()%4]; //根据时间来获得随机数从而进一步随机获得运算的符号
}
(四)、整数型运算结果判断
int ZResult(int n1,int n2,char symbol)
{
int r;
switch(symbol)
{
case '+':
r=n1+n2;break;
case '-':
r=n1-n2;break;
case '*':
r=n1*n2;break;
case '/':
r=n1/n2;break;
default:
r=0;
printf("运算符不符合规则\n");
}
return r; //结果验证
}
(五)、分数类型题目生成与解答
void getFquestion()
{
int n1,n2,n3,n4,a1,a2; //n1,n3分别为两个数的分子,n2,n4分别为两个数的分母
char symbol;
srand((unsigned)time(NULL));
symbol=operators();
n1=rand()%101;
n2=rand()%101+1;
n3=rand()%101;
n4=rand()%101+1; //使n2,n4两个分母不为0
if(n1>n2)
{
int temp;
temp=n1;
n1=n2;
n2=temp;
}
if(n3>n4) //将n1,n2和n3,n4中较小的数作为分子,使分数为真分数
{
int temp;
temp=n3;
n3=n4;
n4=temp;
}
printf("(%d/%d)%c(%d/%d)=",n1,n2,symbol,n3,n4);
printf("分别输入答案的分子和分母:");
scanf("%d,%d",&a1,&a2);
if((FZResult(n1,n2,n3,n4,symbol)==a1)&&(FMResult(n1,n2,n3,n4,symbol)==a2)) //判断分子和分母是否都对,若都对,则表示结果正确
{
printf("Right\n");
}
else
{
printf("Wrong\n");
printf("正确答案:%d/%d\n",FZResult(n1,n2,n3,n4,symbol),FMResult(n1,n2,n3,n4,symbol)); //错误时输出正确答案
}
}
(六)、得到分数类型题目结果的分子
int FZResult(int n1,int n2,int n3,int n4,char symbol) //该函数用以得到正确答案的分子
{
int Z,g; //Z表示分子
switch(symbol)
switch(symbol)
{
case '+':
Z=n1*n4+n3*n2;
break;
case '-':
Z=n1*n4-n3*n2;
break;
case '*':
Z=n1*n3;break;
case '/':
Z=n1*n4;break;
}
return Z;
}
(七)、得到分数类型题目结果的分母
int FMResult(int n1,int n2,int n3,int n4,char symbol) //该函数用以得到正确答案的分母
{
int M,g; //M表示分母
switch(symbol)
{
case '+':
M=n2*n4;
break;
case '-':
M=n2*n4;
break;
case '*':
M=n2*n4;break;
case '/':
M=n2*n3;break;
}
return M;
}
2.运行截图
四、个人小结
本次在博客园进行作业的完成使我学到了很多,因为是第一次使用在使用过程中也遇到了许多问题,好在大都已经解决。对于本次的作业,虽然四则运算是最基础的算法问题之一,但我在撰写代码的过程中仍遇到了许多问题,例如没有考虑很多特殊的情况,也让我明白需要多加练习与学习来提高自己的水平。
(PSP)
psp2.1 | 任务内容 | 计划完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 10 | 12 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 8 | 10 |
Development | 开发 | 250 | 280 |
Analysis | 需求分析(包括学习新技术) | 5 | 8 |
Design Spec | 生成设计文档 | 5 | 5 |
Design Review | 设计复审 | 5 | 5 |
Coding Standard | 代码规范 | 5 | 3 |
Design | 具体设计 | 12 | 15 |
Coding | 具体编码 | 20 | 25 |
Code Review | 代码复审 | 20 | 12 |
Test | 测试(自我测试,修改代码,提交修改) | 15 | 24 |
Reporting | 报告 | 9 | 10 |
Test Report | 测试报告 | 3 | 3 |
Size Measurement | 计算工作量 | 2 | 2 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 5 | 3 |