软工第二次作业
GIT地址 | https://github.com/Accepted101?tab=repositories |
GIT用户名 | Accepted101 |
学号后五位 | 61228 |
博客地址 | https://www.cnblogs.com/aaddvvaanntteezz/ |
作业链接 | https://www.cnblogs.com/harry240/p/11515697.html |
1.环境配置
IDE用的是以前下载的vs2019,所以没有IDE的问题
git的安装与使用
由于是第一次使用github,所以去安装了git,用博客的给的安装链接速度非常的缓慢,于是在网上找了国内的安装地址这里
2.代码设计
储存结构:
通过随机数产生运算符,参与运算的数,运算符的个数,用STL的vector容器对参与运算的数字进行储存,用字符串类string储存操作符。
map<int, char>mp;
string opt[maxn];//储存操作符
vector<int>pre[maxn];//储存参与运算的数字
opt[i].clear();
pre[i].clear();//清空
int optnumber = rand() % 2 + 2;//运算符个数
for (int j = 1; j <= optnumber; ++j)
{
int tmp = rand() % 4 + 1;
opt[i] += mp[tmp];
}
for (int j = 1; j <= optnumber + 1; ++j)
{
int tmp = rand() % 101;
pre[i].push_back(tmp);
}
算法
因为是没有括号的简单四则运算所以用递归的方式计算结果
ll qiu(vector<int>& v, string op, int id, int mx)//由于只有简单的运算,这里使用递归解决
{
if (id == mx)
return v[id];
ll now = v[id];
for (int i = id; i < mx; ++i)
{
if (op[i] == '*')
now *= v[i + 1];
else if (op[i] == '/')
{
if (now % v[i + 1] == 0)//判断是否出现小数
now /= v[i + 1];
else
return -1e15;//如果出现小数则返回-1e15,便于最后比较结果
}
else if (op[i] == '+' && (i + 1 < mx && (op[i + 1] == '/' || op[i + 1] == '*')))
{
int tmp = qiu(v, op, i + 1, mx);//根据运算符优先级进行递归
now += tmp;
return now;
}
else if (op[i] == '+')
now += v[i + 1];
else if (op[i] == '-' && (i + 1 < mx && (op[i + 1] == '/' || op[i + 1] == '*')))
{
int tmp = qiu(v, op, i + 1, mx);
now -= tmp;
return now;
}
else
now -= v[i + 1];
}
return now;
}
当结果出现小数或是负数时,则重复本次操作
while (!ok)//不断进行随机操作直到满足条件
{
opt[i].clear();
pre[i].clear();//清空
int optnumber = rand() % 2 + 2;//运算符个数
for (int j = 1; j <= optnumber; ++j)
{
int tmp = rand() % 4 + 1;
opt[i] += mp[tmp];
}
for (int j = 1; j <= optnumber + 1; ++j)
{
int tmp = rand() % 101;
pre[i].push_back(tmp);
}
ll res = qiu(pre[i], opt[i], 0, optnumber);
if (res >= 0 && res < 1e9) {//满足条件输出运算式
ok = true;
for (int j = 0; j < pre[i].size(); ++j)
{
cout << pre[i][j];
if (j != pre[i].size() - 1)
cout << opt[i][j];
}
cout << "=" << res << endl;
}
}
完整代码
#include <iostream>
#include <vector>
#include <map>
#include <stdlib.h>
#include <time.h>
#include <cstdio>
using namespace std;
const int maxn = 105;
typedef long long ll;
map<int, char>mp;
string opt[maxn];//储存操作符
vector<int>pre[maxn];//储存参与运算的数字
ll qiu(vector<int>& v, string op, int id, int mx)//由于只有简单的运算,这里使用递归解决
{
if (id == mx)
return v[id];
ll now = v[id];
for (int i = id; i < mx; ++i)
{
if (op[i] == '*')
{
now *= v[i + 1];
}
else if (op[i] == '/')
{
if (now % v[i + 1] == 0)//判断是否出现小数
now /= v[i + 1];
else
return -1e15;//如果出现小数则返回-1e15,便于最后比较结果
}
else if (op[i] == '+' && (i + 1 < mx && (op[i + 1] == '/' || op[i + 1] == '*')))
{
int tmp = qiu(v, op, i + 1, mx);//根据运算符优先级进行递归
now += tmp;
return now;
}
else if (op[i] == '+')
{
now += v[i + 1];
}
else if (op[i] == '-' && (i + 1 < mx && (op[i + 1] == '/' || op[i + 1] == '*')))
{
int tmp = qiu(v, op, i + 1, mx);
now -= tmp;
return now;
}
else
{
now -= v[i + 1];
}
}
return now;
}
int main()//1*2-3+4*5
{
FILE* stream;
mp[1] = '+';
mp[2] = '-';
mp[3] = '*';
mp[4] = '/';//使用map使编码简洁
srand((unsigned)time(NULL));//用时间作为随机种子取随机数
cout << "请输入问题个数:" << endl;
freopen_s(&stream,"subject.txt", "w", stdout);//输出到文件
int n;
cin >> n;
cout << "以下为" << n << "个四则运算式" << endl;
for (int i = 1; i <= n; ++i)
{
bool ok = false;
while (!ok)//不断进行随机操作直到满足条件
{
opt[i].clear();
pre[i].clear();//清空
int optnumber = rand() % 2 + 2;//运算符个数
for (int j = 1; j <= optnumber; ++j)
{
int tmp = rand() % 4 + 1;
opt[i] += mp[tmp];
}
for (int j = 1; j <= optnumber + 1; ++j)
{
int tmp = rand() % 101;
pre[i].push_back(tmp);
}
ll res = qiu(pre[i], opt[i], 0, optnumber);
if (res >= 0 && res < 1e9) {//满足条件输出运算式
ok = true;
for (int j = 0; j < pre[i].size(); ++j)
{
cout << pre[i][j];
if (j != pre[i].size() - 1)
cout << opt[i][j];
}
cout << "=" << res << endl;
}
}
}
fclose(stdout);
return 0;
}
结果输出到文件
本来用的时freopen函数,但vs2019不支持这个函数了,于是改为freopen_s函数直接输出的指定文件夹
3.使用git克隆和提交项目
git克隆
克隆项目操作很简单,直接建立文件夹然后用git-bash就行了,没有遇到问题
git上传文件
老师的博客里讲的不是很明白,在git add操作上卡了很久,然后再网上找了很多博客也没能解决,于是我就在github上直接选择本地文件上传了
4.测试
设置断点,查看实时数据大小
查看CPU及内存的使用
5.感想
这一次的作业大部分时间都是用在学习github的操作上了,由于是第一次使用github,所以对它的功能完全不熟悉,但是在实际操作的过程中能够感受到它的强大(一个非常优秀的软件开源平台和开发者社区)。我也会继续花时间学习它的操作。