软工第二次作业

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,所以对它的功能完全不熟悉,但是在实际操作的过程中能够感受到它的强大(一个非常优秀的软件开源平台和开发者社区)。我也会继续花时间学习它的操作。

posted @ 2019-09-21 18:35  tryatry  阅读(267)  评论(1编辑  收藏  举报