2017《面向对象程序设计》课程作业六

2017《面向对象程序设计》课程作业六

031602230 卢恺翔

题目描述

  • 本次作业要求将四则运算的核心部分采取栈的知识进行解决。即表达式生成的合法性检验、表达式结果计算。
  • 学习C++界面编程,可以学QT、MFC或者VS,选择其一即可,用博客记录学习到的知识以及心得体会。

作业要求

  • 本次作业要求实现核心算法,请将表达式生成的代码及相关的检验、计算表达式结果的代码贴在博客中,并对代码进行必要的解释。
  • 发表一篇博客,博客内容为:提供本次作业的github链接,本次程序运行的截图,对界面编程的探索。

问题一:本次作业要求实现核心算法,请将表达式生成的代码及相关的检验、计算表达式结果的代码贴在博客中,并对代码进行必要的解释。

核心算法,即计算表达式结果已经运用了栈的知识并且在上一篇博客讲过了,这边就不叙述了。(详见2017《面向对象程序设计》课程作业五

GitHub链接

表达式生成

我第一次生成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界面编程。

因为是视频学习,时间有限。学到的内容不是很多,总结为一下几点:

  1. MFC(Microsoft Foundation Class),成为类库。API(Application Programing Interface)应用程序编程接口,是由操作系统提供,面向操作系统的开发接口,只限制于本操作系统使用。
  2. 每一个控件都有一个属于自己的ID,就像人有自己的名字一样,如果需要从控件中获取数据或者传递数据给控件的话,要使用它们的ID。
  3. 每一个按钮都代表着一个函数,用于操作各种内容,双击按钮就可以直接编程。或者可以调试后直接跳到函数部分。
  4. 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界面好看多了)。

posted @ 2017-05-31 21:47  sungam  阅读(204)  评论(0编辑  收藏  举报