首页 > 其他 > 详细

四则运算

时间:2019-03-21 00:41:18      阅读:210      评论:0      收藏:0      [点我收藏+]

Github项目地址:https://github.com/cyjin30/-/tree/master

PSP

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

20

15

· Estimate

· 估计这个任务需要多少时间

15

10

Development

开发

1000

785

· Analysis

· 需求分析 (包括学习新技术)

45

40

· Design Spec

· 生成设计文档

20

40

· Design Review

· 设计复审 (和同事审核设计文档)

10

25

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

8

10

· Design

· 具体设计

20

50

· Coding

· 具体编码

10h*60

12h*60

· Code Review

· 代码复审

1h*60

1.5h*60

· Test

· 测试(自我测试,修改代码,提交修改)

3h*60

4h*60

Reporting

报告

300

450

· Test Report

· 测试报告+博客

4h*60

4.5h*60

· Size Measurement

· 计算工作量

10

15

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

50

50

合计

 

2578

2810

项目要求

  •  参与运算的数除了整数以外,还要支持真分数的四则运算。
  •  操作数必须随机生成。
  •  运算符为 +, −, ×, ÷ 运算符的种类和顺序必须随机生成。
  •  要求能处理用户的输入,并判断对错,并统计对错的条数。
附加要求
  •  支持有余数的运算
  •  支持有小数的运算

解题思路

        这个题目可以被划分为以下三个问题:

  1. 列出随机的四则运算表达式。
  2. 输入所列出四则运算的结果。
  3. 接受用户输入并比较结果是否正确,并进行计数。

如何解决

问题1

  • 使用C语言中的srand(time(NULL))来列出随机的四则运算表达式,避免题目重复

问题2

  • 求一般四则算数表达式的结果,分别利用“+,-,*,、”来分别计算,并放到数组中

问题3

  • 使用for循环和if else来解决问题

测试部分

  • 还行

代码说明

#include <tchar.h>
#include <stdlib.h>
#include <iostream>
#include <time.h>

int _tmain(int argc, _TCHAR* argv[])
{
srand(time(NULL)); //避免题目重复
//存放正确答案和用户结果的数组
int daan[100000],jieguo[100000];
int x1,x2,flag,i,j,k;
int x3,x4;
//正确计数器和错误计数器
int count1=0;
int count2=0;
int a[10];
printf("请输入要打印的题目数:");
scanf("%d",&a[0]);
while(a[0]<=0) //题目数必须为正数
{
printf("请重新输入有效的题目数:");
scanf("%d",&a[0]);
};
//可定制运算数的范围
printf("请输入运算数的范围:");
scanf("%d",&a[2]);
while(a[2]<=0) //运算数必须为正数
{
printf("请重新输入有效的范围:");
scanf("%d",&a[2]);
};
//可定制题目中是否有乘除法
printf("请选择否有乘除法(是->1;否->0):");
scanf("%d",&a[1]);
while((a[1]!=1)&(a[1]!=0)) //只能选择1或0
{
printf("请重新输入有效的数值:");
scanf("%d",&a[1]);
};
//可定制题目结果是否有负数
printf("请选择结果有无负数(是->1;否->0):");
scanf("%d",&a[3]);
while((a[3]!=1)&(a[3]!=0)) //只能选择1或0
{
printf("请重新输入有效的数值:");
scanf("%d",&a[3]);
};
//可定制结果是否有余数
printf("请选择结果有无余数(是->1;否->0):");
scanf("%d",&a[4]);
while((a[4]!=1)&(a[4]!=0)) //只能选择1或0
{
printf("请重新输入有效的数值:");
scanf("%d",&a[4]);
};
//可定制是否支持小数
printf("请选择是否支持小数(是->1;否->0):");
scanf("%d",&a[5]);
while((a[5]!=1)&(a[5]!=0)) //只能选择1或0
{
printf("请重新输入有效的数值:");
scanf("%d",&a[5]);
};
//可定制是否加括号
printf("请选择是否加括号(是->1;否->0):");
scanf("%d",&a[6]);
while((a[6]!=1)&(a[6]!=0)) //只能选择1或0
{
printf("请重新输入有效的数值:");
scanf("%d",&a[6]);
};

//循环打印符合要求的题目
for(i=0;i<a[0];i++)
{
switch(a[1])
{
case 1:j=rand()%4;
break; //有乘除法
case 0:j=rand()%2;
break; //无乘除法
}
x1=rand()%a[2]+1;
x2=rand()%a[2]+1;
if(j==0)
{
switch(a[6])
{
case 0:
switch(a[5])
{
case 0:printf("%d+%d=\t\t",x1,x2);
break;
case 1:
x3=rand()%9+1;
x4=rand()%9+1;
printf("%d.%d+%d.%d=\t\t",x1,x3,x2,x4);
break;
}
break;
case 1:
switch(a[5])
{
case 0:printf("(%d+%d)=\t",x1,x2);
break;
case 1:
x3=rand()%9+1;
x4=rand()%9+1;
printf("(%d.%d+%d.%d)=\t",x1,x3,x2,x4);
break;
}
break;
}
//计算当运算法则为加法时的正确结果,并存入数组
jieguo[i]=x1+x2;
}
if(j==1)
{
switch(a[3])
{
case 1:
break;
case 0: //结果无负数
if(x1<x2) //被减数比减数小则交换
{
flag=x1;
x1=x2;
x2=flag;
}
break;
}
switch(a[6])
{
case 0:
switch(a[5])
{
case 0:
printf("%d-%d=\t\t",x1,x2);
break;
case 1:
x3=rand()%9+1;
x4=rand()%9+1;
printf("%d.%d-%d.%d=\t\t",x1,x3,x2,x4);
break;
}
break;
case 1:
switch(a[5])
{
case 0:
printf("(%d-%d)=\t",x1,x2);
break;
case 1:
x3=rand()%9+1;
x4=rand()%9+1;
printf("(%d.%d-%d.%d)=\t",x1,x3,x2,x4);
break;
}
break;
}
//计算当运算法则为减法时的正确结果,并存入数组
jieguo[i]=x1-x2;
}
if(j==2)
{
switch(a[6])
{
case 0:
switch(a[5])
{
case 0:
printf("%d*%d=\t\t",x1,x2);
break;
case 1:
x3=rand()%9+1;
x4=rand()%9+1;
printf("%d.%d*%d.%d=\t\t",x1,x3,x2,x4);
break;
}
break;
case 1:
switch(a[5])
{
case 0:printf("(%d*%d)=\t",x1,x2);
break;
case 1:
x3=rand()%9+1;
x4=rand()%9+1;
printf("(%d.%d*%d.%d)=\t",x1,x3,x2,x4);
break;
}
break;
}
//计算当运算法则为乘法时的正确结果,并存入数组
jieguo[i]=x1*x2;
}
if(j==3)
{
switch(a[4])
{
case 1: //结果可有余数
break;
case 0: //结果无余数
while(x1%x2!=0) //如果不能整除,则重新生成
{
x1=rand()%a[2]+1;
x2=rand()%a[2]+1;
};
break;
}
switch(a[6])
{
case 0:
switch(a[5])
{
case 0:
printf("%d/%d=\t\t",x1,x2);
break;
case 1:
x3=rand()%9+1;
x4=rand()%9+1;
printf("%d.%d/%d.%d=\t\t",x1,x3,x2,x4);
break;
}
break;
case 1:
switch(a[5])
{
case 0:
printf("(%d/%d)=\t",x1,x2);
break;
case 1:
x3=rand()%9+1;
x4=rand()%9+1;
printf("(%d.%d/%d.%d)=\t",x1,x3,x2,x4);
break;
}
break;
}
//计算当运算法则为除法时的正确结果,并存入数组
jieguo[i]=x1/x2;
}
}
for(k=0;k<a[0];k++)
{
printf("\n请输入第%d个答案:",k+1);
scanf("%d",&daan[k]);
//比较结果是否正确,并计数
if(daan[k]==jieguo[k])
{
printf("正确!\n");
count1++;
}
else
{
printf("错误!\n");
count2++;
}
}
printf("\n正确答案有%d个,",count1);
printf("错误答案有%d个。\n",count2);
return 0;
}

运行效果

技术分享图片

单元测试

《构建之法》第二章中详细提及了好的单元测试的标准。

  • 单元测试应该在最基本的功能/参数上检验程序的正确性。
  • 单元测试必须由最熟悉代码的人来写。
  • 单元测试过后,机器状态保持不变。
  • 单元测试要快。
  • 单元测试应该产生可重复、一致的结果。
  • 独立性-单元测试的运行/通过/失败不依赖于别的测试,可以人为构造数据,以保持测试的独立性。
  • 单元测试应该覆盖所有代码路径。

效能分析与改进

  • 首先考虑到用户输入会影响效能分析中的时间因素,去掉了主函数中接受用户输入并比较的部分,直接改成由代码随机生成算式然后计算结果。

总结及收获

  • 由于自己本身能力的不足,无法设计出特别完美的代码,加上对Python语言的不熟,所以只能勉强用C语言编写代码。
  • C语言的代码也是网上参考,加上自己的理解,由于本身代码存在bug,所以需要自己的改正。
  • 无论是从算法到测试再到效能提升,肯定还是有很多改进空间的,自己还需要多提升。

四则运算

原文:https://www.cnblogs.com/cyjin30/p/10569028.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!