第六次课程作业

第六次课程作业

git提交链接


本次作业要求实现核心算法,我就将上次作业讲到的后缀表达式进行代码实现,这次的作业是直接进行重构,如果按照原来生成算式的方法会显得代码杂乱且种类单一(主要的是再下次还得重构。。),所以就只做了A+B型的算式。计算的代码也没将括号考虑进去。最心累的还是被QT creator的配置浪费了一天半的时间还没弄好,后面心态就崩了(好像我开始学什么东西都会先在编译器上死很久)。。

生成表达式的代码
void Equation::generateExpresion()
{
	int b;
	srand(time(0));
	a[0]=randomNumber();
	b = rand() % 4;
	a[1] = trans_operation(b);
	a[2] = randomNumber();
}
char Equation::randomNumber()
{
	return rand() % 10+'0';
}
char Equation::trans_operation(int b)
{
	switch (b)
	{
	case 0:return '+'; break;
	case 1:return '-'; break;
	case 2:return '*'; break;
	case 3:return '/'; break;
	}
}

没什么特别的。。只有一种表达式。

用于计算的代码
double calculateResult(Equation &N)
{
	Num_Struct number;
	Operator_Struct ope;
	ope.top = -1; number.top = -1;
	int top_level = 0, now_level;
	int j = 0;
	char b[10] = { ' ' };
	for (int i = 0; i < strlen(N.a); i++)//遍历表达式依次操作
	{
		if(N.a[i]=='+'||N.a[i]=='-')//等级为1的运算符
		{
			now_level = 1;
			if (top_level < now_level)//优先级高于当前栈顶的优先级进栈
			{  
				ope.data[++ope.top] = N.a[i];
				top_level = 1;
			}
			else//不高于的依次出栈
			{
				for (; top_level >= now_level;)//边出边和栈顶对比
				{
					b[j] = ope.data[ope.top];ope.top--;
					top_level = judgelevel(ope.data[ope.top]);
				}
			}
		}
		if ( N.a[i] == '*' || N.a[i] == '/')//等级为2的运算符
		{
			now_level = 2;//优先级高于当前栈顶的优先级进栈
			{
				ope.data[++ope.top] = N.a[i];
				top_level = 2;
			}
			else//不高于的依次出栈
			{
				for (; top_level >= now_level;)//边出边和栈顶对比
				{
					b[j] = ope.data[ope.top]; ope.top--;
					top_level = judgelevel(ope.data[ope.top]);
				}
			}
		}
			if ((N.a[i] - '0') <= 9 && (N.a[i] - '0' )>= 0)//数字直接输出到保存后缀表达式的数组中
			{
				b[j] = N.a[i];
				j++;
			}
		}
	for (; ope.top >= 0;ope.top--)//遍历完后将栈内元素依次出栈
	{
		b[j] = ope.data[ope.top];
		j++;
	}//这两部分把中缀表达式转换成后缀表达式
	
	
	//接下来是后缀表达式的计算。
	for (int i = 0; i < strlen(b); i++)//后缀表达式的计算
	{
		if ((b[i] - '0') >= 0 && (b[i] - '0') <= 9)
		{
			number.data[++number.top] = b[i] - '0';
		}
		if (b[i] == '+')
		{
			number.data[number.top - 1] = number.data[number.top - 1] + number.data[number.top];
		}
		if (b[i] == '-')
		{
			number.data[number.top - 1] = number.data[number.top - 1] - number.data[number.top];
		}
		if (b[i] == '*')
		{
			number.data[number.top - 1] = number.data[number.top - 1] * number.data[number.top]*1.0;
		}
		if (b[i] == '/')
		{
			number.data[number.top - 1] = number.data[number.top - 1] / number.data[number.top]*1.0;
		}

	}//后缀表达式的计算
	return number.data[0];
}

实现的截图


C++界面的学习探索

起初参加过一个IOS项目开发的培训体验课,用OC弄了一个简单的飞机大战,觉得还挺通俗易懂的,大都是英文的意思来写代码。在网上查MFC、QT、VC的资料,大都推崇QT,于是我也选择了QT,却出现了下面这个情况。。。


在网上各种资料各种方法都试过去了还是没有办法解决(比较死脑筋也比较笨)。。然后一天多的时间就没有了(心态就崩了)。看的一些内容也只是纸上谈兵,学的东西就比较少。

一次失败的作业。。
posted @ 2017-05-31 17:57  乐乐kami  阅读(167)  评论(1编辑  收藏  举报