个人第二次作业
GIT地址 | https://github.com/xxxy7280 |
---|---|
GIT用户名 | xxxy7280 |
学号后五位 | 61307 |
博客地址 | https://www.cnblogs.com/xxxy7280/ |
作业链接 | <软件工程第二次作业> |
一、环境配置过程 |
下载vs,配置开发环境。
由于以前稍微接触过vs,所以例如新建项目这些基本操作并不难。
注册Github,下载Git,克隆项目。打开 Git 命令行软件(Windows上可在空白处右键打开 Git Bash ),输入 git clone
在运行程序中,存在比较多的问题。例如:开始找不到stdfx文件,找了很久都没有找到。后来询问同学才知道是pch。
程序
二、代码设计
1.首先在脑海中想好基本解决方法,大体思路。申明定义好需要的全局变量,结构体,和头文件。例如表达式运算需要的栈结构,包括操作数和运算符栈结构。
2.表达式的生成:主要操作有:主函数中输入题的数量、调用生成表达式的函数、用random随机生成操作数数目、并根据操作数数目随机产生对应数目的操作数和操作符。
//产生表达式并写入文件
void proExpression(int n)
{
int i;
int num;//操作数数量
for (i = 0; i < n; i++)
{
num = random() % 4 + 2;//随机产生操作数数量2-5
proDigital(num);//随机产生操作数
//产生表达式 5 a-b+c*d/3
}
Calculate();
}
//随机产生操作数 形参为操作数数量num
void proDigital(int num)
{
int i, x;
char ch;
for (i = 0; i < num + num - 1; )
{
//srand(time(0));
x = random() % (101);//产生0-100的随机数作为操作数
fprintf(fp, "%d", x); i++;
if (i < num + num - 2)//2+3*4-1//5
{
ch = proOperator();//产生一个运算符
fputc(ch, fp); i++;
}
}
fputc('=', fp);
fputc('\n', fp);
}
在生成表达式的函数中,调用随机生成操作数的函数。根据两个操作数一个操作符,产生操作数数目-1的运算符并相继写入文件。由于每个表达式都要写进文件,每次循环后调用函数时文件指针应该指向上一次写完时的位置,所以文件指针应该设为全局变量。
这步最大的问题是早期虽然每次循环都为random函数设置时间种子,但是函数还是生成伪随机数,导致表达式都一样。但当将其变为全局变量这个问题也就遇到解决了。
#define random()(rand()%1000)
3.从文件中读出表达式并进行表达式的计算-----利用栈结构。对c++读取字符串操作不太熟悉,在网上粗略地查到了以读写方式打开文件方法。
errno_t err;
err = fopen_s(&fp, "D:\\2025的作业\\四则运算\\test.txt", "r+");
proExpression(n);
fclose(fp);
读出表达式后,将每一个表达式存在一个字符数组中,利用栈结构,先将中缀表达式转化为后缀表达式再进行运算。将运算结果保存在文件中。
4.总结:存在的问题:由于对c++语言并不是很熟悉,有些语句可能只适合c语言而不适用于c++,导致编译时出现了很多错误。例如打开指定位置的文件时在c语言中使用fopen,而c++中的使用方法更加复杂。大多数问题在编译时就会出现,可以根据错误代码等在网上搜索解决途径。还有一些问题是细节问题,比如打开文件却没有在程序结束时在主函数中关闭,直接地影响到程序的运行。比较棘手的是,编译不报错但是运行结果不对,这些问题可能需要通过调试,一步一步来才能查找出问题,比较费时间,所以我们在开始写的时候就要注意仔细,尽量及时发现问题,避免因此出现更大的更多的错误。另外,这个程序还没有完全做好,计算部分不太熟悉IO流导致单独运行时能打开文件,但是将这一部分加到程序里,不影响算式产生,但是就打不开文件了。如图:
这次时间比较紧,空余时间不多,还有很多需搞清楚的问题来完善程序。
三、使用github克隆项目以及提交代码的整个过程
-
使用github克隆项目
复制仓库地址,使用git clone 网址
即可实现将项目克隆到本地
-
提交代码
git status检查状态
git add file,git commmit -m "Message";
git push;完成
提交
四、对项目进行单元测试和回归测试的过程
单元测试进行的比较顺利,根据所给步骤建立单元测试,
写单元测试代码,引用接口,就可以顺利完成单元测试。
回归测试在整个程序中作用很大,它确保了修改了就代码后,没有引入新的错误或导致其他代码产生错误,软件开发的各个阶段都有必要进行回归测试。
本次的学习中,只进行了有关单元测试和回归测试的基本操作,也没有清楚地或者明显地意识到单元测试的重要性,希望可以通过以后的学习,可以更深地探索它具有的重大作用,也可以真正用到它来完善自己的程序。
五、本次作业感想
这次的任务,特别是程序的编写,对我这种专业知识欠缺也没有自己拓展的人来说还是比较有挑战性。
工欲善其事必先利其器。编写具有基础功能的程序知识一个基本要求,我们要做出更完美的软件。所以,我们不仅要会用编译软件的基础功能实现编写代码,也要去学习利用它其他的功能,例如效能分析,回归测试等,这样我们才可以做出更好的程序。一般来说,做程序不是一个人的事,特别是在做大型程序的时候,我们需要与其他人沟通,分享自己的经验并向他人学习,我们要好好利用已有的条件,积极拓宽自己的视野,丰富经验,逐渐完善自己。
另外,我也发现了自己编程过程中存在的一些问题。“写了再改”可以精简地概括我写程序的过程,程序划分为几大模块还是比较清晰,但是在每个模块的子模块的功能实现上往往是想到什么方法写什么代码,经常就是一直改来改去,最后乱七八糟的。出现这个问题的原因可能是拿到问题后,没有去系统地分析,求尽快着手项目而不求效率高,但这样往往适得其反,需要花更多的时间。在以后的作业中,还是应该尽量仔细规划下,思路清晰地写程序。