您的位置:首页 > 其它

软件工程-东北师大战-第四次作业(3)

2017-10-11 13:40 274 查看
程序基本信息:

语言:C#

工具:VS2013

环境:windows 7 32位

功能:四则运算

代码git地址:https://git.coding.net/xushaobin/task_4.git

要求1 参考《构建之法》第4章两人合作,结对编程上述功能,要求每人发布随笔1篇 (代码是共同完成的,博客是分别完成的)。 (1) 给出每个功能的重点、难点、编程收获。(2)给出结对编程的体会,以及 (3) 至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。 (10分)

功能1. 四则运算(不支持括号)

重点:随机生成四个数字并且随机选择三个运算符。

难点:避免除不尽,或者除数为零的情况,和表达式如何正确计算。

编程收获:学习了C#随机生成数的算法,和逆波兰、堆栈等知识

代码:

//功能一 随机生成支持出题4个数的四则运算题目(无括号)
static void requirement1(int nn)
{
int right_num = 0;     //答对题目数目
Random rd = new Random();
int[] num = new int[4];
char[] fourOptions = new char[] { '+', '-', '*', '/' };//四则运算符
int i, j;
int[] charnum = new int[3];
for (i = 0; i < nn; i++)
{
num[0] = rd.Next(0, 10);
num[1] = rd.Next(0, 10);
num[2] = rd.Next(0, 10);
num[3] = rd.Next(0, 10);    //随机生成四个数
for (j = 0; j < 3; j++)
{
int n = rd.Next(0, 4);
charnum[j] = n;
if (n == 3)       //如果有除法,出发后面的数字在1,2,4,5,8里面选择。
{
int[] divisor = { 1, 2, 4, 5, 8 };
Random rd1 = new Random();
num[j + 1] = divisor[rd1.Next(0, 5)];
}
}
//Console.WriteLine(num1 + fourOptions[0] + num2 + fourOptions[1] + num3 + fourOptions[2] + num4);
string expression = num[0] + "" + fourOptions[charnum[0]] + num[1] + fourOptions[charnum[1]] + num[2] + fourOptions[charnum[2]] + num[3];
Console.WriteLine(expression);
Console.Write("?");
String str = Console.ReadLine();
//  Console.WriteLine(expression + " = " + Calucate(expression));
if (Math.Abs(Calucate(expression) - GetValue(str)) < 1e-7)
{
Console.WriteLine("答对了,你真是个天才!");
right_num++;
}
else
{
Console.WriteLine("再想想吧,答案似乎是" + Calucate(expression) + "喔!");
}
}
Console.WriteLine("你一共答对" + right_num + "道题,共20道题。");
}


运行截图:



功能2. 四则运算(支持括号)

重点:表达式中序变后序。

难点:如何随机使括号成对出现在表达式,这里人为规定的了10种情况的,证明改程序支持有括号的四则运算。另外如何避免带括号的除数为零的情况,比如:2/(1+1-2)。

编程收获:进一步理解逆波兰去括号,最后变为后序的工作原理。

代码:

//功能二 随机生成支持出题4个数的四则运算题目(有括号)
static void requirement2(int nn)
{
int right_num = 0;        //答对题目个数
Random rd = new Random();
int[] num = new int[4];
char[] fourOptions = new char[] { '+', '-', '*', '/' };//四则运算符
int i, j;
int[] charnum = new int[3];
for (i = 0; i < nn; i++)
{

num[0] = rd.Next(0, 10);
num[1] = rd.Next(0, 10);
num[2] = rd.Next(0, 10);
num[3] = rd.Next(0, 10);
for (j = 0; j < 3; j++)
{
int n = rd.Next(0, 4);
charnum[j] = n;
if (n == 3)   //如果出现除法,后面的数从1,2,4,5,8里面选择
{
int[] divisor = { 1, 2, 4, 5, 8 };
Random rd1 = new Random();
num[j + 1] = divisor[rd1.Next(0, 5)];
}
}
string[] expression = new String[10];
expression[0] = "(" + num[0] + "" + fourOptions[charnum[0]] + num[1] + ")" + fourOptions[charnum[1]] + num[2] + fourOptions[charnum[2]] + num[3];
expression[1] = "(" + num[0] + "" + fourOptions[charnum[0]] + num[1] + fourOptions[charnum[1]] + num[2] + ")" + fourOptions[charnum[2]] + num[3];
expression[2] = num[0] + "" + fourOptions[charnum[0]] + "(" + num[1] + fourOptions[charnum[1]] + num[2] + ")" + fourOptions[charnum[2]] + num[3];
expression[3] = num[0] + "" + fourOptions[charnum[0]] + "(" + num[1] + fourOptions[charnum[1]] + num[2] + fourOptions[charnum[2]] + num[3] + ")";
expression[4] = num[0] + "" + fourOptions[charnum[0]] + num[1] + fourOptions[charnum[1]] + "(" + num[2] + fourOptions[charnum[2]] + num[3] + ")";
expression[5] = "(" + num[0] + "" + fourOptions[charnum[0]] + num[1] + ")" + fourOptions[charnum[1]] + "(" + num[2] + fourOptions[charnum[2]] + num[3] + ")";
expression[6] = "((" + num[0] + "" + fourOptions[charnum[0]] + num[1] + ")" + fourOptions[charnum[1]] + num[2] + ")" + fourOptions[charnum[2]] + num[3];
expression[7] = "(" + num[0] + "" + fourOptions[charnum[0]] + "(" + num[1] + fourOptions[charnum[1]] + num[2] + "))" + fourOptions[charnum[2]] + num[3];
expression[8] = num[0] + "" + fourOptions[charnum[0]] + "((" + num[1] + fourOptions[charnum[1]] + num[2] + ")" + fourOptions[charnum[2]] + num[3] + ")";
expression[9] = num[0] + "" + fourOptions[charnum[0]] + "(" + num[1] + fourOptions[charnum[1]] + "(" + num[2] + fourOptions[charnum[2]] + num[3] + "))";
int mm = rd.Next(0, 10);
double ans = Calucate(expression[mm]);
if (go == 0)
{
Console.WriteLine(expression[mm]);
Console.Write("?");
String str = Console.ReadLine();
//  Console.WriteLine(expression + " = " + Calucate(expression));
if (Math.Abs(Calucate(expression[mm]) - GetValue(str)) < 1e-7)
{
Console.WriteLine("答对了,你真是个天才!");
right_num++;
}
else
{
Console.WriteLine("再想想吧,答案似乎是" + Calucate(expression[mm]) + "喔!");
}
}
else
{
i--;
go = 0;
}
}
Console.WriteLine("你一共答对" + right_num + "道题,共20道题。");
}


运行截图:



功能3. 限定题目数量,"精美"打印输出,避免重复

重点:按规定格式进行打印输出test.txt文件

难点:避免重复,限定题目数量。

编程收获:复习了文件读写操作和获取主函数传入的参数并处理。

代码:

//功能三 限定题目数量,"精美"打印输出,避免重复
static void requirement3(int nn)
{
string path = "test.txt";
File.Delete(path);
if (!File.Exists(path))
{

FileInfo myfile = new FileInfo(path);
FileStream fs = myfile.Create();
fs.Close();
}
StreamWriter sw = File.AppendText(path);
Random rd = new Random();
int[] num = new int[4];
char[] fourOptions = new char[] { '+', '-', '*', '/' };//四则运算符
int i, j;
int[] charnum = new int[3];
double[] outcome = new double[nn];
for (i = 0; i < nn; i++)
{
num[0] = rd.Next(0, 10);
num[1] = rd.Next(0, 10);
num[2] = rd.Next(0, 10);
num[3] = rd.Next(0, 10);
for (j = 0; j < 3; j++)
{
int n = rd.Next(0, 4);
charnum[j] = n;
if (n == 3)
{
int[] divisor = { 1, 2, 4, 5, 8 };
Random rd1 = new Random();
num[j + 1] = divisor[rd1.Next(0, 5)];
}
}
string[] expression = new String[10];
expression[0] = "(" + num[0] + "" + fourOptions[charnum[0]] + num[1] + ")" + fourOptions[charnum[1]] + num[2] + fourOptions[charnum[2]] + num[3];
expression[1] = "(" + num[0] + "" + fourOptions[charnum[0]] + num[1] + fourOptions[charnum[1]] + num[2] + ")" + fourOptions[charnum[2]] + num[3];
expression[2] = num[0] + "" + fourOptions[charnum[0]] + "(" + num[1] + fourOptions[charnum[1]] + num[2] + ")" + fourOptions[charnum[2]] + num[3];
expression[3] = num[0] + "" + fourOptions[charnum[0]] + "(" + num[1] + fourOptions[charnum[1]] + num[2] + fourOptions[charnum[2]] + num[3] + ")";
expression[4] = num[0] + "" + fourOptions[charnum[0]] + num[1] + fourOptions[charnum[1]] + "(" + num[2] + fourOptions[charnum[2]] + num[3] + ")";
expression[5] = "(" + num[0] + "" + fourOptions[charnum[0]] + num[1] + ")" + fourOptions[charnum[1]] + "(" + num[2] + fourOptions[charnum[2]] + num[3] + ")";
expression[6] = "((" + num[0] + "" + fourOptions[charnum[0]] + num[1] + ")" + fourOptions[charnum[1]] + num[2] + ")" + fourOptions[charnum[2]] + num[3];
expression[7] = "(" + num[0] + "" + fourOptions[charnum[0]] + "(" + num[1] + fourOptions[charnum[1]] + num[2] + "))" + fourOptions[charnum[2]] + num[3];
expression[8] = num[0] + "" + fourOptions[charnum[0]] + "((" + num[1] + fourOptions[charnum[1]] + num[2] + ")" + fourOptions[charnum[2]] + num[3] + ")";
expression[9] = num[0] + "" + fourOptions[charnum[0]] + "(" + num[1] + fourOptions[charnum[1]] + "(" + num[2] + fourOptions[charnum[2]] + num[3] + "))";
int mm = rd.Next(0, 10);
outcome[i] = Calucate(expression[mm]);
if (go == 0)
{
int or = 0;
for (int k = 0; k < i; k++)           //如果结果重复,重新生成该题目。
{
if (outcome[k] == outcome[i])
{
or = 1;
i = i - 1;
break;
}
}
if (or == 0)
{
Console.WriteLine("{0,-20}{1,-7}", expression[mm], Calucate(expression[mm]));
sw.WriteLine("{0,-20}{1,-7}", expression[mm], Calucate(expression[mm]));
sw.Flush();
}
}
else
{
i--;
go = 0;
}
}
sw.Close();

}


运行截图:





逆波兰表达式解数学运算参考博客:

http://blog.csdn.net/liuyuxusuixiang/article/details/25289715

结对编程的体会

结对编程用两个人的力量编写一个程序,常常产生1+1>2的情况,开发效率较高。另外锻炼了自己与人交流,与人合作的能力,同时增进的我与我的队友蔺依铭同学的革命友谊。

在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。

1、讨论逆波兰的实现原理。

2、讨论如何避免除不尽和除数为零的情况。

3、讨论如何获取主函数参数并获取其中用户想要生成的题目个数。

4、讨论如何避免题目重复的情况

5、讨论功能四是否能短时间完成。

要求2 给出照片1张,包括结对的2位同学、工作地点、计算机,可选项包括其他能表达结对编程工作经历的物品或场景。 (5分)

照片:



工作地点:计算机二楼实验室

计算机:个人笔记本电脑

要求3 使用coding.net做版本控制。checkin 前要求清理 临时文件、可执行程序,通常执行 build-clean可以达到效果。(5分)

代码git地址:https://git.coding.net/xushaobin/task_4.git
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: