简易电子表格的设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实验一简易电子表格的设计实验一简易电子表格的设计...............................................11.问题描述................................................................................12.基本要求................................................................................13.实现提示................................................................................24.实验过程................................................................................34.1基本算法及分析.................................................................................................................34.2程序代码.............................................................................................................................75.实验结果..............................................................................146.实验总结..............................................................................147.参考文献..............................................................................151.问题描述设计一个支持基本计算统计功能和其它一些表格管理/处理功能的软件,使用户可在该软件的支持下,用交互方式进行表格建立、数据输入、数据编辑及其它一些表格操作。即类似于简易Execel表格处理软件。2.基本要求(1)建立表格:建立空白表格,同时在屏幕上显示,使其处于可输入数据的状态。用户可指定新建表格的行列数。(2)输入数据与编辑数据:通过键盘将数据输入到显示在屏幕上的电子表格上。(3)基本统计计算:可选择按行或列合计、求平均、求最大最小。(4)排序:使任意指定的行或列中的数据按大小(升或降)排列,对字符型数据,还可选择大小写敏感。(5)表格保存:使电子表格以磁盘文件的方式存储在磁盘上,并可随时读入,供继续处理。*(6)公式支持:单元格内可输入公式(表达式),使对应单元格的最终内容为公式的计算结果。公式最基本的形式是算术计算公式,可按名引用其它单元格。*该功能可选做。3.实现提示该题目需要使表格成为可编辑状态,此部分要求较高,可在网上或图书馆查找相关资料。提示:MSFlexGrid控件的函数的长度单位是“缇(twips)”,需要将其转化为像素,1440缇=1英寸4.实验过程4.1基本算法及分析首先,定义绘制可视化表格的一些函数,部分函数名如下:CMainFrame::OnCreate()CStringCOleFont::GetName()COleFont::SetName()CYCOleFont::GetSize()COleFont::SetSize()COleFont::SetBold()COleFont::SetItalic()COleFont::SetUnderline()CPicture::GetHandle()CPicture::GetHPal()CPicture::SetHPal()CPicture::GetType()利用这些函数将可视化表格绘制出来。第二,定义函数CChild::OnClickMsflexgrid1()将可视化表格打印出来。同时利用两个for循环,在行和列上分别将A~Z,“和”“最大值”“最小值”“平均值”“行排序”“列排序”“读取”“保存”等字符串显示出来。第三,使表格成为可编辑状态。通过if(lRowm_FlexGrid.GetRows()||lRow==0)判断点击是否有效。若有效,则获取FlexGrid控件的窗口矩形并将其转换为客户区矩形,以像素为单位计算选中格的左上角的坐标和选中格的尺寸,形成选中个所在的矩形区域并转换成相对对话框的坐标。然后获取单元格内容,改变大小并移到选中格位置,显示文本。第四,求和。定义函数CChild::OnButton1()。先判断是行还是列需要求和,在将所在行(或列)的所有数加起来得到sum并显示。为方便存取,利用可以将字符转换成浮点数的函数atof和可以将浮点数转换成字符的函数gcvt把获取到的单元格内容来回转换。第五,求最值。分别定义函数CChild::OnButton2()和CChild::OnButton3()求最大值和最小值。先判断是行还是列需要求最值,将所在行(或列)的第一个数存放在max(或min)中,并将此数与后面的数次比较。求最大值时,如果前面的数比后面的数大,则继续向下比较。否则,将大的数存到max中。求最小值时,如果前面的数比后面的数小,则继续向下比较。否则,将小的数存到min中。比较结束之后,将最终的max(或min)输出。第六,定义函数CChild::OnButton8()求平均值。由于第四步已经求得了所在行(或列)的和sum,因此直接利用sum除以col或row即可得到平均值。第七,定义函数CChild::OnButton6()和函数CChild::OnButton7()进行行(列)排序。先利用函数current_col=m_FlexGrid.GetCol()获取鼠标所在的列的值,将所在列的所有值存入temp数组,利用选择排序法将temp数组中所有数据进行排序,并将排好序的数组的值重新传回表格。同理,利用函数current_row=m_FlexGrid.GetRow()获取鼠标所在的列的值,将所在列的所有值存入temp数组,利用选择排序法将temp数组中所有数据进行排序,并将排好序的数组的值重新传回表格。选择排序法部分的代码为:for(inti=1;irow;i++){intlow=i;for(intj=row;ji;j--){if(temp[j]temp[low])low=j;}doubletp;tp=temp[i];temp[i]=temp[low];temp[low]=tp;}第八,定义函数CChild::OnButton4()和CChild::OnButton5()进行表格数据的存储和读取。第九,程序的优化:建立函数CShezhi::OnOK(),使表格的行列数可以自行定义。其主要内容如下:CDialog::OnOK();CChilddlg;dlg.row=m_row;dlg.col=m_col;dlg.DoModal();4.2程序代码#includestdafx.h#includeexcel.h#includeChild.h#includeExcelDoc.h#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endifvoidCChild::OnClickMsflexgrid1()//打印表格{charc[10];for(inti=1;i=col;i++){c[1]='\0';c[0]=65+(i-1)%26;m_FlexGrid.SetTextMatrix(0,i,c);//行输出A~Z};charq[]=和;charw[]=最大值;chare[]=最小值;charr[]=平均值;m_FlexGrid.SetTextMatrix(0,col+1,q);//输出字符串“和”m_FlexGrid.SetTextMatrix(0,col+2,w);//输出字符串“最大值”m_FlexGrid.SetTextMatrix(0,col+3,e);//输出字符串“最小值”m_FlexGrid.SetTextMatrix(0,col+4,r);//输出字符串“平均值”for(i=1;i=row;i++){gcvt(i,10,c);m_FlexGrid.SetTextMatrix(i,0,c);//列输出A~Z}m_FlexGrid.SetTextMatrix(row+1,0,q);//输出字符串“和”m_FlexGrid.SetTextMatrix(row+2,0,w);//输出字符串“最大值”m_FlexGrid.SetTextMatrix(row+3,0,e);//输出字符串“最小值”m_FlexGrid.SetTextMatrix(row+4,0,r);//输出字符串“平均值”/*****使表格成为可编辑状态*****/longlCol=m_FlexGrid.GetColSel();//获取点击的行号longlRow=m_FlexGrid.GetRowSel();//获取点击的列号if(lRowm_FlexGrid.GetRows()||lRow==0)//判断点击是否有效return;CRectrect;m_FlexGrid.GetWindowRect(&rect);//获取FlexGrid控件的窗口矩形ScreenToClient(&rect);//转换为客户区矩形CDC*pDC=GetDC();//MSFlexGrid控件的函数的长度单位是“缇(twips)”,需要将其转化为像素,1440缇=1英寸//计算象素点和缇的转换比例intnTwipsPerDotX=1440/pDC-GetDeviceCaps(LOGPIXELSX);intnTwipsPerDotY=1440/pDC-GetDeviceCaps(LOGPIXELSY);//计算选中格的左上角的坐标(象素为单位)longy=m_FlexGrid.GetRowPos(lRow)/nTwipsPerDotY;longx=m_FlexGrid.GetColPos(lCol)/nTwipsPerDotX;//计算选中格的尺寸(象素为单位)。加1是实际调试中,发现加1后效果更好longwidth=m_FlexGrid.GetColWidth(lCol)/nTwipsPerDotX+1;longheight=m_FlexGrid.GetRowHeight(lRow)/nTwipsPerDotY+1;//形成选中个所在的矩形区域CRectrc(x,y,x+width,y+height);//转换成相对对话框的坐标rc.OffsetRect(rect.left+1,rect.top+1);CStringstrValue=m_FlexGrid.GetTextMatrix(lRow,lCol);//获取单元格内容m_Edit.ShowWindow(SW_SHOW);//显示控件m_Edit.MoveWindow(rc);//改变大小并移到选中格位置m_Edit.SetWindowText(strValue);//显示文本m_Edit.SetFocus();//获取焦点}/*****输入完毕后使edit空间隐藏,并返回值*****/voidCChild::OnKillfocusEdit1(){//TODO:AddyourcontrolnotificationhandlercodehereCStringstrInput;GetDlgItemText(IDC_EDIT1,strInput);//获取输入框内容

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功