2017《面向对象程序设计》课程作业六
2017《面向对象程序设计》课程作业六
031602230 卢恺翔
题目描述
- 本次作业要求将四则运算的核心部分采取栈的知识进行解决。即表达式生成的合法性检验、表达式结果计算。
- 学习C++界面编程,可以学QT、MFC或者VS,选择其一即可,用博客记录学习到的知识以及心得体会。
作业要求
- 本次作业要求实现核心算法,请将表达式生成的代码及相关的检验、计算表达式结果的代码贴在博客中,并对代码进行必要的解释。
- 发表一篇博客,博客内容为:提供本次作业的github链接,本次程序运行的截图,对界面编程的探索。
问题一:本次作业要求实现核心算法,请将表达式生成的代码及相关的检验、计算表达式结果的代码贴在博客中,并对代码进行必要的解释。
核心算法,即计算表达式结果已经运用了栈的知识并且在上一篇博客讲过了,这边就不叙述了。(详见2017《面向对象程序设计》课程作业五)
表达式生成
我第一次生成2个数字和一个字符,然后再随机括号在他们旁边。做完这些操作后,把这些看做一个小算式,再生成一个字符和数字添加在小算式的后面,再随机括号在他们旁边,然后重复操作,就形成了表达式。
data.cpp
int Data::randomNumber() //用于随机生成数字
{
random = rand() % 10+1 ;
return random;
}
char Data::randomOperation() //用于随机生成运算符
{
random = rand() % 4;
switch (random)
{
case 0: randomsym = '+'; break;
case 1: randomsym = '-'; break;
case 2: randomsym = '*'; break;
case 3: randomsym = '/'; break;
}
return randomsym;
}
string Data::bracket(string str) // 随机括号
{
random = rand() % 2;
if (random == 1)
{
str = '(' + str + ')';
}
return str;
}
string Data::int_str(int number) // 数字转字符串
{
char str[100];
_itoa_s(number, str, 10);
string i_s = str;
return i_s;
}
string Data::connect(string str1, string str2, char a) // 连接数字运算符
{
equ = str1 + a + str2;
return equ;
}
main.cpp
string generateExpression(int i,char *p) //用于生成运算式
{
int n1, n2;
Data dat;
n1 = dat.randomNumber(); //随机数字
n2 = dat.randomNumber(); //随机数字
char sign;
sign = dat.randomOperation(); //随机生成字符
string str_n1, str_n2, temp;
str_n1 = dat.int_str(n1); //将数字转换为字符串
str_n2 = dat.int_str(n2); //将数字转换为字符串
string equation;
equation = dat.connect(str_n1, str_n2, sign); //连接2个数字和1个符号
for (int j = 0; j < 2; j++)
{
str_n1 = dat.bracket(equation); // 每2个数字和一个符号就随机在两端加一个括号
n2 = rand() % (10-1+1)+1;
str_n2 = dat.int_str(n2);
int exchange;
exchange = rand() % 2; // 对字符串位置进行随机交换
if (exchange == 1)
{
temp = str_n1;
str_n1 = str_n2;
str_n2 = temp;
}
sign = dat.randomOperation();
equation = dat.connect(str_n1, str_n2, sign); //把那2个数字和1个符号看做旧的的字符串,将新生成的数字与字符连接上旧的的字符串上
}
string str_i;
str_i = dat.int_str(i);
equation = "(" + str_i + ")" + equation + "=";
cout << equation << endl; //生成运算式
cout << boundadry[1] ;
return equation;
}
问题2:学习C++界面编程,可以学QT、MFC或者VS,选择其一即可,用博客记录学习到的知识以及心得体会。
因为vs有自带的FMC,所以我直接学习了MFC界面编程。
因为是视频学习,时间有限。学到的内容不是很多,总结为一下几点:
- MFC(Microsoft Foundation Class),成为类库。API(Application Programing Interface)应用程序编程接口,是由操作系统提供,面向操作系统的开发接口,只限制于本操作系统使用。
- 每一个控件都有一个属于自己的ID,就像人有自己的名字一样,如果需要从控件中获取数据或者传递数据给控件的话,要使用它们的ID。
- 每一个按钮都代表着一个函数,用于操作各种内容,双击按钮就可以直接编程。或者可以调试后直接跳到函数部分。
- 2个最常用的函数:
从控件中取值: GetDlgItemInt(ID号),给控件传值:SetDlgItemInt(ID号, 想要传的值)
于是自己尝试做了一个教程教的小界面。效果如图所示
代码如下:
void CMFCApplication2Dlg::OnBnClickedButton1()
{
int a;
int b;
int sum;
a = GetDlgItemInt(IDC_LEFT1);
b = GetDlgItemInt(IDC_RIGHT1);
sum = a + b;
SetDlgItemInt(IDC_RESULT1, sum);
// TODO: 在此添加控件通知处理程序代码
// TODO: 在此添加控件通知处理程序代码
}
void CMFCApplication2Dlg::OnBnClickedButton2()
{
int a;
int b;
a = GetDlgItemInt(IDC_LEFT2);
b = GetDlgItemInt(IDC_RIGHT2);
SetDlgItemInt(IDC_RESULT2, a-b);
// TODO: 在此添加控件通知处理程序代码
}
void CMFCApplication2Dlg::OnBnClickedButton3()
{
int a;
int b;
a = GetDlgItemInt(IDC_LEFT3);
b = GetDlgItemInt(IDC_RIGHT3);
SetDlgItemInt(IDC_RESULT3, a*b);
// TODO: 在此添加控件通知处理程序代码
}
void CMFCApplication2Dlg::OnBnClickedButton4()
{
int a;
int b;
int sum;
a = GetDlgItemInt(IDC_LEFT4);
b = GetDlgItemInt(IDC_RIGHT4);
SetDlgItemInt(IDC_RESULT4, a/b);
// TODO: 在此添加控件通知处理程序代码
}
这些都是非常基础的MFC简单操作,复杂的操作还在学习ing,但是起码这是一个能看的程序吧(比那个dos界面好看多了)。