实验2 数组与指针(多边形面积计算)
一、实验目的
• 掌握数组与指针的使用,特别是动态数组的使用
二、实验内容与要求
编写一个求任意多边形面积的程序。要求:通过界面文本框输入数据,并把数据保存在一个二维数组或一个一维的自定义结构体类型的数组中,然后再进行计算。
- 把多边形定点点坐标定义成结构体
- 创建动态数组。根据输入的顶点个数,定义动态数组储存多边形顶点数据
- 可以尝试将计算部分写成函数形式,使计算程序与界面无关
三、设计与实现:
3.1设计思路:
1 在【文件】菜单执行【新建】,选择【项目】。
2 在【项目类型】窗格中,选择【Visual C++】下的“MFC”项。在【模板】窗格中,选择“MFC 应用程序”模板,输入应用名“RS_110_ZRX_PolygonAreaCalculation”。按向导创建“RS_110_ZRX_PolygonAreaCalculation”的MFC应用程序,应用程序类型为基于对话框。
3 在窗体上放置2个静态文本框、2个编辑框、3个命令按钮。
4 设置控件属性:
4.1 将2个编辑框依次右击执行【添加变量】,在弹出的【添加成员变量向导】对话框中,【类别】属性更改为“Value”型,【变量类型】属性更改为合适类型,将【变量名】依次命名为:
4.2 点击其中一命令按钮,将其【Caption】属性更改为“计算”。双击命令按钮,进入“void CYG_110_zhangruixiang_SY2Dlg::OnBnClickedOkcalculation()”中,添加代码,在该.cpp文件中依次添加函数并辅以说明;另一完成归零功能的命令按钮操作与上类似。
4.3 流程图如下:
5 运行和调试程序;
6 保存应用程序。
3.2界面设计:
3.3主要代码:
文件:<YGzhangSY2Dlg.cpp>
/***************************************************************************
* 文件名:<YGzhangSY2Dlg.cpp> *
* *
* 描述:多边形面积计算 调用两个函数SplitStringArray、PolArea *
* *
* 历史:**日期** **理由** **签名** *
* 2019年3月14日 代码格式修改 *** *
* *
* 外部过程: *
* *
/**************************************************************************/
函数:
/***************************************************************************
* 名字:int SplitStringArray(CString str, char split, CStringArray& aStr) *
* *
* 描述:分割字符 *
* *
* 历史:**日期** **理由** **签名** *
* 2019年3月14日 创建该函数 *** *
* *
* 参数: 1.CString str *
* 2.char split *
* 3.CStringArray& aStr *
* *
* 返回值:int类型数据 *
* *
* 注: *
/**************************************************************************/
int CYGzhangSY2Dlg::SplitStringArray(CString str, char split,CStringArray& aStr)
{
int startIdx = 0;
int idx = str.Find(split, startIdx);
aStr.RemoveAll();//先清空
while (-1 != idx)
{
CString sTmp = str.Mid(startIdx, idx - startIdx);
aStr.Add(sTmp);
startIdx = idx + 1;
idx = str.Find(split, startIdx);
}
CString sTmp = str.Right(str.GetLength() - startIdx);
if (! sTmp.IsEmpty())
aStr.Add(sTmp);
return aStr.GetSize();
}
/***************************************************************************
* 名字:double PolArea(CString strPolData,double &dArea) *
* *
* 描述:多边形面积的计算 *
* *
* 历史:**日期** **理由** **签名** *
* 2019年3月14日 创建该函数 *** *
* *
* 参数: 1.CString strPolData *
* 2.double &dArea *
* *
* 返回值:double类型数据 多边形面积 *
* *
* 注: *
/**************************************************************************/
double CYGzhangSY2Dlg::PolArea(CString strPolData,double &dArea)
{
int iLine;//行数==顶点数
CStringArray aStrLine;
iLine=SplitStringArray(strPolData,13,aStrLine);
if(iLine<3)
{
AfxMessageBox(_T("输入的数据不完整!"));
return 0;
}
//定义结构体和动态数组
Vertex *ver= new Vertex[iLine];
//使用Split函数分离,获得坐标
CStringArray aStrTmp;
int n;
for(int i=0;i<iLine;i++)
{
n=SplitStringArray(aStrLine[i],',',aStrTmp);
ver[i].dx =_tstof(aStrTmp[0]);
ver[i].dy =_tstof(aStrTmp[1]);
}
//多边形面积的计算
double dSumx=0;
double dSumy=0;
double dT=0;
int ib=0;
for(int i=0;i<iLine;i++)
{
ib=i+1;
if (i==iLine-1){
ib=0;
}
dSumx=ver[ib].dx+ver[i].dx ;
dSumy=ver[ib].dy-ver[i].dy ;
dT=(dSumx*dSumy)*1/2+dT;
dArea=abs (dT);
}
return dArea;
if(ver!=NULL)
{
delete[] ver;
ver=NULL;
}
}
命令按钮:
void CYGzhangSY2Dlg::OnBnClickedOkcalculation()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
PolArea(strPolData,dArea);
UpdateData(false);
}
void CYGzhangSY2Dlg::OnBnClickedButtonzeroing()
{
// TODO: 在此添加控件通知处理程序代码
strPolData.Format(_T(""));
dArea=0;
UpdateData(false);
}
3.4运行结果:
3.5设计技巧:
构造函数,并将函数放入同按钮所在的类中。函数声明放在按钮前的类中public声明。
构造结构体,同样放在存放按钮所在的类中的.h文件中