结队编程——四则运算
1759101 张心玥 1759102 陈永欣 软工一班
在第二节王老师的软件工程综合实践课上,我们要求通过两两组队完成一道编程题:帮助小学老师每周给同学出300道四则运算练习题,自选一种编程方式实现,1、两个运算符,100以内的数字,不需要写答案,估计编写时间 2、需要写答案,并且保证答案在0-100之间,并且估计时间。3、增加要求(题目避免重复,可扩展性,可定制,具体定制),并且估计时间。
本程序使用 visual studio 2017 编写
一、程序1:不需要输出答案
代码段:
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int x, y, m, i, t;
srand(time(NULL));
for (i = 0; i<300; i++)
{
x = rand() % 100;
y = rand() % 100;
m = rand() % 4;
switch (m)
{
case 0:
printf("%d+%d=\n", x, y);
break;
case 1:
if (x<y)
{
t = x;
x = y;
y = t;
}
printf("%d-%d=\n", x, y);
case 2:
printf("%d*%d=\n", x, y);
case 3:
if (y != 0)
printf("%d/%d=\n", x, y);
else
i--;
}
}
return 0;
}
实现截图(我们仅截取了一部分题目):
二、程序2:可以选择是否输出答案
代码段:
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int n, x, y, m, i, t;
printf("是否打印出答案?(是:1;否:0)\n");
scanf_s("%d", &n);
srand(time(NULL));
for (i = 0; i<300; i++)
{
x = rand() % 100; //0~99
y = rand() % 100;
m = rand() % 4;
if (n == 1) {
switch (m)
{
case 0:
printf("%d+%d=%d\n", x, y, x+y);
break;
case 1:
if (x<y)
{
t = x;
x = y;
y = t;
}
printf("%d-%d=%d\n", x, y, x-y);
case 2:
printf("%d*%d=%d\n", x, y, x*y);
case 3:
if (y != 0)
printf("%d/%d=%d\n", x, y, x/y);
else
i--;
}
}
else {
switch (m)
{
case 0:
printf("%d+%d=\n", x, y);
break;
case 1:
if (x<y)
{
t = x;
x = y;
y = t;
}
printf("%d-%d=\n", x, y);
case 2:
printf("%d*%d=\n", x, y);
case 3:
if (y != 0)
printf("%d/%d=\n", x, y);
else
i--;
}
}
}
return 0;
}
实现截图:(仅截取了部分结果)
三、程序3:需要定制,增加要求
代码段:
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int m, n, i, j, k, t, x, y, z ;
float c, d;
printf("请输入需要的题数\t");
scanf_s("%d", &k);
printf("请输入数字类型(整数:1;小数:2 ) \t ");
scanf_s("%d", &m);
printf("是否打印出答案?(是:1;否:0 )\t ");
scanf_s("%d", &n);
srand(time(NULL));//初始化随机种子
switch (m) //输出不同类型数字四则运算
{
case 1:
{
if (n == 1) { //打印出有答案的四则运算
for (i = 0; i < k; i++)
{
x = rand() % 100;
y = rand() % 100;
z = rand() % 4;
switch (z)
{
case 0:
printf("%d+%d=%d\n", x, y, x + y);
break;
case 1:
if (x < y)
{
t = x;
x = y;
y = t;
}
printf("%d-%d=%d\n", x, y, x - y);
case 2:
printf("%d*%d=%d\n", x, y, x*y);
case 3:
if (y != 0)
printf("%d/%d=%d\n", x, y, x / y);
else
i--;
}
}
}
else { //打印出无答案的四则运算
for (i = 0; i < k; i++)
{
x = rand() % 100;
y = rand() % 100;
z = rand() % 4;
switch (z)
{
case 0:
printf("%d+%d=\n", x, y);
break;
case 1:
if (x < y)
{
t = x;
x = y;
y = t;
}
printf("%d-%d=\n", x, y);
case 2:
printf("%d*%d=\n", x, y);
case 3:
if (y != 0)
printf("%d/%d=\n", x, y);
else
i--;
}
}
}
}break;
case 2:
{
if (n == 1) { //打印出有答案的四则运算
for (i = 0; i < k; i++)
{
c = rand()*0.001 + 1;
d = rand()*0.001 + 1;
z = rand() % 4 + 1;
switch (z)
{
case 1:printf("%0.2f+%0.2f=%0.2f \n", c, d, c+d); break;
case 2:printf("%0.2f-%0.2f=%0.2f \n", c, d,c-d); break;
case 3:printf("%0.2f*%0.2f=%0.2f \n", c, d,c*d); break;
case 4:printf("%0.2f/%0.2f=%0.2f \n", c, d,c/d); break;
}
}
}
else { //打印出无答案的四则运算
for (i = 0; i < k; i++)
{
c = rand()*0.001 + 1;
d = rand()*0.001 + 1;
z = rand() % 4 + 1;
switch (z)
{
case 1:printf("%0.2f+%0.2f= \n", c, d); break;
case 2:printf("%0.2f-%0.2f= \n", c, d); break;
case 3:printf("%0.2f*%0.2f= \n", c, d); break;
case 4:printf("%0.2f/%0.2f= \n", c, d); break;
}
}
}
break;
}break;
}
return 0;
}
实现截图:
四、心得体会
在第二节王老师的软件工程综合实践课上,王老师希望我们能够体验到两人经过组合,讨论,思考以及编程的过程,因此她让我们思考编出一个能够解决老师一周要随机编出300道四则运算题,分别能够输出结果以及先不输出结果的程序,并且预估编程时间。接着进一步加强,对原本的已经构思完成的基础程序进行条件增加,需要满足题目避免重复,可扩展,可以通过数量或者打印方式对于算术题进行定制,是否有余数,是否有括号,是否支持分数,等等细节的要求。
因此,在老师让我们进行讨论后,我们预估一节课能够大概讨论出编程的方向以及方法和流程图,预计当天晚上便能设计出第一题第一小问的大致程序,在日后的2-3天能够全部完成。我们先决定定好编程软件,通过一年半的学习,我们初步学会了运用c语言,c++以及java进行编写程序,但是通过这道题,我们决定使用c语言来编写这道题。接着,我们拿出纸将这道题所需要的条件一一列下,我们需要考虑到四则运算必须是100以内的数字,并且只能是两个运算符,这都会被我们注意在真正的编程过程中,然后我们画出了大致的流程图,设立头文件,设置初始变量,应该运用哪种循环语句或者说是基础语句去实现,期间,我们也有过争论,对于哪种语言效率最高,能够使测试代码的人观看更为方便易懂,最后,在不输出结果的程序中我们决定使用for语句进行循环,并且用random函数随机寻找100以内的数字,用switch...case语句去考虑多种情况,并且运用了if语句去进行条件设定,在输出结果的程序中我们增加了初始化随机种子等来完成题目的硬性要求。
在课上我们仅仅讨论到没有增加条件的基础题便戛然而止,直到这个都是在预估时间内的,在课后,我们常常想要继续讨论并且进行编程,但往往因为时间凑不齐以及课程冲突而没有办法静下心好好进行对于题目的分析以及编程,但当我们在结束这样作业后,也进行了反思,为何我们比预估时间晚了两天,我们发现往往不是我们时间不够,而是我们没有将时间挤出来,在休息闲暇的时候,我们仅仅就在座位上无聊地打发时间,而没有花精力去思考这些题目,不断地拖延,但最后我们还是花时间去尽力的玩成了这样作业,力求能够做到完美,在对于第二页增加的条件该如何实现的时候,我们遇到了许多的瓶颈,虽然学习了很多编程知识,但是当真正实现的时候,却发现经常会心有余,而力不足,因此我们常常会询问编程能力优秀的同学请他们指教,或者上网搜索一些相关的知识去解决,例如我们在可扩展性方面的要求有一些不解,我们就去询问了邻宿舍的同学,指教他们的程序是如何编写的。最终顺利的完成了我们的编程作业。
最后通过这次作业,我们学会的不仅仅是如何沟通合作,也是一种对于编程知识的重温,更是如何合理的分配时间,如何在争论中听取他人意见,诉说自己的建议,这是一种对于能力和心境上的锻炼。
张心玥:我想这次双人合作锻炼的不仅是我们的编程能力,更是我们如何在短时间内的对项目的估测项目所需时间以及如何合理沟通,提高项目进程和效率的方法。
陈永欣:在这次双人合作中,我们遇到了许多瓶颈和困难,但是通过上网搜寻一些资料以及询问同学,我们学会的更是一种如何利用身边资源完成项目,进行沟通的能力。