软件工程作业——小学四则运算
目录
一、题目要求
写一个能自动生成小学四则运算题目的程序,然后在此基础上扩展:
1)除了整数以外,还要支持真分数的四则运算,例如:1/6+1/8=7/24
2)程序要求能处理用户的输入,判断对错,累积分数
3)程序支持可以由用户自行选择加、减、乘、除运算
4)使用-n参数控制生成题目的个数,例如Myapp.exe -n 10,将生成10个题目
二、代码
1.存储结构
typedef struct {
int num;//分子
int demo;//分母
}Factions;
//题目个数
int n=10;
//整数题目 Integet[i][0]、Integet[i][1]、Integet[i][3] 分别存储第i题的两个运算数和运算结果
float Integet[M][3];
//分数题目 Faction[i][0]、Faction[i][1]、Faction[i][3] 分别存储第i题的两个运算数和运算结果
Factions Faction[M][3];
//总分
int score=0;
2.产生随机数
int produre(char ch)//生成题目
{
int i,j;
srand((unsigned)time(NULL));
for(i=0;i<=n/2;i++) //前n/2题为整数题
{
if(ch=='-')
{
Integet[i][1]=rand()%100+1;
Integet[i][0]=rand()%100+1+Integet[i][1];
}
else
{
Integet[i][1]=rand()%100+1;
Integet[i][0]=rand()%100+1;
}
}
int a=n-i;
for(j=0;j<a;j++)//后n/2题为分数题
{
Faction[j][0].num =rand()%9+1;
Faction[j][0].demo=rand()%9+Faction[j][0].num+1;
Faction[j][1].num =rand()%9+1;
Faction[j][1].demo =rand()%9+Faction[j][1].num+1;
}
}
3.约分
int yf(int demo,int num,int j)
{
int a = abs(demo);
int b = abs(num);
int t;
while(b != 0){
t = a%b;
a = b;
b = t;
}
Faction[j][2].demo=demo/a;
Faction[j][2].num=num/a;
}
4.加法
int add()
{
int i,j,a;
for(i=0;i<=n/2;i++)
Integet[i][2]=Integet[i][0]+Integet[i][1];
a=n-i;
for(j=0;j<a;j++)
{ Faction[j][2].demo=Faction[j][0].demo*Faction[j][1].demo;
Faction[j][2].num=Faction[j][0].num*Faction[j][1].demo+Faction[j][1].num*Faction[j][0].demo;
yf(Faction[j][2].demo,Faction[j][2].num,j);
}
}
5.减法
int sub(){
int i,j,a;
for(i=0;i<=n/2;i++)
Integet[i][2]=Integet[i][0]-Integet[i][1];
a=n-i;
for(j=0;j<a;j++)
{ Faction[j][2].demo=Faction[j][0].demo*Faction[j][1].demo;
Faction[j][2].num=Faction[j][0].num*Faction[j][1].demo-Faction[j][1].num*Faction[j][0].demo;
yf(Faction[j][2].demo,Faction[j][2].num,j);
}
}
6.乘法
int mul(){
int i,j,a;
for(i=0;i<=n/2;i++)
Integet[i][2]=Integet[i][0]*Integet[i][1];
a=n-i;
for(j=0;j<a;j++)
{ Faction[j][2].demo=Faction[j][0].demo*Faction[j][1].demo;
Faction[j][2].num=Faction[j][0].num*Faction[j][1].num;
yf(Faction[j][2].demo,Faction[j][2].num,j);
}
}
7.除法
四舍五入
float sw(float b)
{
b=b*100;//保留一位小数,乘10,两位乘100,以此类推;
b=b+0.5;
b=(int)b;//向上取整
b=b/100;//同 乘 ;
return b;
}
除法运算
int div(){
int i,j,a;
for(i=0;i<=n/2;i++)
{
Integet[i][2]=Integet[i][0]/Integet[i][1];
Integet[i][2]=sw(Integet[i][2]);//四舍五入、保留小数
}
a=n-i;
for(j=0;j<a;j++)
{ Faction[j][2].demo=Faction[j][0].demo*Faction[j][1].num;
Faction[j][2].num=Faction[j][0].num*Faction[j][1].demo;
yf(Faction[j][2].demo,Faction[j][2].num,j);
}
}
8.答题并判断正确
int ask(char ch)
{
printf("\n\n请答题:\n");
int i,j,a;
for(i=0;i<=n/2;i++)
{
printf("(%d),%.0f %c %.0f = ",i+1,Integet[i][0],ch,Integet[i][1]);
float answer;
scanf("%f",&answer);
if(answer==Integet[i][2])
{score+=1;//回答正确分值加1
printf("正确\n\n");
}
else
{
printf("错误\n");
if(ch=='/')
{
printf("正确答案为%.2f\n\n",Integet[i][2]);
}
else
printf("正确答案为%.0f\n\n",Integet[i][2]);
}
}
a=n-i;
for(j=0;j<a;j++){
printf("(%d),%d/%d %c %d/%d = ",j+i+1,
Faction[j][0].num,Faction[j][0].demo,ch,
Faction[j][1].num,Faction[j][1].demo);
char a2[10],a1[10],answerz[100];
itoa(Faction[j][2].demo,a2,10);
itoa(Faction[j][2].num,a1,10);
char a3[2]="/";
strcat(a1,a3);
strcat(a1,a2);
char answer[20];
scanf("%s",&answer);
if(strcmp(answer,a1)==0)
{score+=1;//回答正确分值加1
printf("正确\n\n");
}
else
{
printf("错误\n");
printf("正确答案为%s\n\n",a1);
}
}
printf("\n\n得分:%d\n",score);
}
9.选择运算方式菜单
int menu(){
start1:
printf("\n\n\t*****小学四则运算****\n\n");
printf("\n\n\t\t1.加法\n");
printf("\n\n\t\t2.减法\n");
printf("\n\n\t\t3.乘法\n");
printf("\n\n\t\t4.除法\n");
printf("\n\n\t\t0.退出\n");
printf("\n\n\t请选择运算运算方式:");
char ch;
while(1){
fflush(stdin);
scanf("%d",&ch);
fflush(stdin);
switch(ch)
{
case 1:
system("cls");
produre('+');
add();
ask('+');
break;
case 2:
system("cls");
produre('-');
sub();
ask('-');
break;
case 3:
system("cls");
produre('*');
mul();
ask('*');
break;
case 4:
system("cls");
produre('/');
div();
ask('/');
break;
case 0:
system("cls");
exit(0);
default:
printf("\t\t\t\t*********************输入错误!*******************\n");
system("pause");
system("cls");
goto start1;
}
printf("\n\n按任意键返回上一级");
system("pause");
system("cls");
goto start1;
break;
}
}
三、运行界面
主界面
减法
除法
四、作业小结
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 | 代码规范 | 5 | 10 |
Design | 具体设计 | 20 | 40 |
Coding | 具体编码 | 120 | 180 |
Code Review | 代码复审 | 5 | 7 |
Test | 测试(自我测试,修改代码,提交修改) | 10 | 15 |
Reporting | 报告 | 20 | 60 |
Test Report | 测试报告 | 5 | 5 |
Size Measurement | 计算工作量 | 5 | 10 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 10 | 15 |
2.心得和经验
本次作业整数部分运算不难,但要注意整数除法的到的是小数,比较小数相等判断正确。而真分数运算时,要注意产生的随机数的分子要比分母小。
这也是我第一次使用markdow编辑器,通过查阅资料也学会使用。通过参考链接学习。