第六次课程作业
第六次课程作业
本次作业要求实现核心算法,我就将上次作业讲到的后缀表达式进行代码实现,这次的作业是直接进行重构,如果按照原来生成算式的方法会显得代码杂乱且种类单一(主要的是再下次还得重构。。),所以就只做了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,却出现了下面这个情况。。。
在网上各种资料各种方法都试过去了还是没有办法解决(比较死脑筋也比较笨)。。然后一天多的时间就没有了(心态就崩了)。看的一些内容也只是纸上谈兵,学的东西就比较少。