简易电子表格的设计

上传人:hao****an 文档编号:100733069 上传时间:2022-06-03 格式:DOC 页数:15 大小:81KB
返回 下载 相关 举报
简易电子表格的设计_第1页
第1页 / 共15页
简易电子表格的设计_第2页
第2页 / 共15页
简易电子表格的设计_第3页
第3页 / 共15页
点击查看更多>>
资源描述
实验一 简易电子表格的设计实验一 简易电子表格的设计11.问题描述12.基本要求13.实现提示24.实验过程34.1基本算法及分析34.2程序代码75.实验结果136.实验总结147.参考文献151.问题描述 设计一个支持基本计算统计功能和其它一些表格管理/处理功能的软件,使用户可在该软件的支持下,用交互方式进行表格建立、数据输入、数据编辑及其它一些表格操作。即类似于简易Execel表格处理软件。2.基本要求 (1)建立表格:建立空白表格,同时在屏幕上显示,使其处于可输入数据的状态。用户可指定新建表格的行列数。 (2)输入数据与编辑数据:通过键盘将数据输入到显示在屏幕上的电子表格上。 (3)基本统计计算:可选择按行或列合计、求平均、求最大最小。 (4)排序:使任意指定的行或列中的数据按大小(升或降)排列,对字符型数据,还可选择大小写敏感。 (5)表格保存:使电子表格以磁盘文件的方式存储在磁盘上,并可随时读入, 供继续处理。 *(6)公式支持:单元格内可输入公式(表达式),使对应单元格的最终内容为公式的计算结果。公式最基本的形式是算术计算公式,可按名引用其它单元格。 *该功能可选做。3.实现提示该题目需要使表格成为可编辑状态,此部分要求较高,可在网上或图书馆查找相关资料。提示:MSFlexGrid 控件的函数的长度单位是“缇(twips)”,需要将其转化为像素,1440 缇 = 1 英寸4.实验过程4.1基本算法及分析首先,定义绘制可视化表格的一些函数,部分函数名如下:CMainFrame:OnCreate( )CString COleFont:GetName( )COleFont:SetName( )CY COleFont:GetSize( )COleFont:SetSize( )COleFont:SetBold( )COleFont:SetItalic( )COleFont:SetUnderline( )CPicture:GetHandle( )CPicture:GetHPal( )CPicture:SetHPal( )CPicture:GetType( )利用这些函数将可视化表格绘制出来。第二,定义函数CChild:OnClickMsflexgrid1( )将可视化表格打印出来。同时利用两个for循环,在行和列上分别将AZ,“和”“最大值”“最小值”“平均值”“行排序”“列排序”“读取”“保存”等字符串显示出来。第三,使表格成为可编辑状态。通过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(int i=1;ii;j-)if(tempjtemplow)low=j; double tp;tp=tempi;tempi=templow;templow=tp;第八,定义函数CChild:OnButton4() 和CChild:OnButton5() 进行表格数据的存储和读取。第九,程序的优化:建立函数CShezhi:OnOK(),使表格的行列数可以自行定义。其主要内容如下:CDialog:OnOK();CChild dlg;dlg.row=m_row;dlg.col=m_col;dlg.DoModal();4.2程序代码#include stdafx.h#include excel.h#include Child.h#includeExcelDoc.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifvoid CChild:OnClickMsflexgrid1() /打印表格char c10;for(int i=1;i=col;i+)c1=0;c0=65+(i-1)%26; m_FlexGrid.SetTextMatrix(0,i,c); /行输出AZ;char q=和;char w=最大值;char e=最小值;char r=平均值; 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;im_FlexGrid.GetRows() | lRow=0) /判断点击是否有效return; CRect rect; m_FlexGrid.GetWindowRect(&rect); /获取FlexGrid控件的窗口矩形 ScreenToClient(&rect); /转换为客户区矩形 CDC* pDC=GetDC(); /MSFlexGrid 控件的函数的长度单位是“缇(twips)”,需要将其转化为像素,1440 缇 = 1 英寸 /计算象素点和缇的转换比例 int nTwipsPerDotX=1440/pDC-GetDeviceCaps(LOGPIXELSX); int nTwipsPerDotY=1440/pDC-GetDeviceCaps(LOGPIXELSY); /计算选中格的左上角的坐标(象素为单位) long y = m_FlexGrid.GetRowPos(lRow)/nTwipsPerDotY; long x = m_FlexGrid.GetColPos(lCol)/nTwipsPerDotX; /计算选中格的尺寸(象素为单位)。加1是实际调试中,发现加1后效果更好 long width = m_FlexGrid.GetColWidth(lCol)/nTwipsPerDotX+1; long height = m_FlexGrid.GetRowHeight(lRow)/nTwipsPerDotY+1; /形成选中个所在的矩形区域 CRect rc(x,y,x+width,y+height); /转换成相对对话框的坐标 rc.OffsetRect(rect.left+1,rect.top+1); CString strValue=m_FlexGrid.GetTextMatrix(lRow,lCol); /获取单元格内容 m_Edit.ShowWindow(SW_SHOW); /显示控件 m_Edit.MoveWindow(rc); /改变大小并移到选中格位置 m_Edit.SetWindowText(strValue); /显示文本 m_Edit.SetFocus(); /获取焦点/*输入完毕后使edit空间隐藏,并返回值*/void CChild:OnKillfocusEdit1() / TODO: Add your control notification handler code here CString strInput; GetDlgItemText(IDC_EDIT1,strInput); /获取输入框内容 m_FlexGrid.SetText(strInput); /设置单元格内容 m_Edit.ShowWindow(SW_HIDE); /*求和*/void CChild:OnButton1() / TODO: Add your control notification handler code here / 求和double sum=0;char t10;long current_col=m_FlexGrid.GetCol(); long current_row=m_FlexGrid.GetRow();if(col+1=current_col)/行求和/用col+1判断是行还是列需要求和for(int i=1;i=col;i+) sum+=atof(m_FlexGrid.GetTextMatrix(current_row,i);/atof是将字符转换成浮点数的函数gcvt(sum,10,t); /gcvt是将浮点数转换成字符的函数m_FlexGrid.SetTextMatrix(current_row,col+1,t); /求和结束后将结果显示;if(row+1=current_row)/列求和/用row+1判断是行还是列需要求和sum=0;for(int i=1;i=row;i+)sum+=atof(m_FlexGrid.GetTextMatrix(i,current_col);/atof是将字符转换成浮点数的函数gcvt(sum,10,t);/gcvt是将浮点数转换成字符的函数m_FlexGrid.SetTextMatrix(row+1,current_col,t);/求和结束后将结果显示;/*求最大值*/void CChild:OnButton2() / TODO: Add your control notification handler code heredouble max;char t10;long current_col=m_FlexGrid.GetCol(); long current_row=m_FlexGrid.GetRow();int i=1;if(col+2=current_col)/指向当前行,求最大值/用col+2判断是行还是列需要求最大值max=atof(m_FlexGrid.GetTextMatrix(i,current_col); /将当前的第一个值赋给maxfor( i=1;i=row;i+)if(maxatof(m_FlexGrid.GetTextMatrix(current_row,i)/max与后面的数进行比较max=atof(m_FlexGrid.GetTextMatrix(current_row,i);/如果max小于后面的数,则将该数重新赋给maxgcvt(max,10,t);m_FlexGrid.SetTextMatrix(current_row,col+2,t);/将max显示else if(row+2=current_row)/指向当前列,求最大值/用row+2判断是行还是列需要求最大值i=1;max=atof(m_FlexGrid.GetTextMatrix(current_row,i);/将当前的第一个值赋给maxfor( i=1;i=col;i+)if(maxatof(m_FlexGrid.GetTextMatrix(i,current_col)/max与后面的数进行比较max=atof(m_FlexGrid.GetTextMatrix(i,current_col);/如果max小于后面的数,则将该数重新赋给max gcvt(max,10,t); m_FlexGrid.SetTextMatrix(row+2,current_col,t);/将max显示;/*最小值*/void CChild:OnButton3() double min;char t10;long current_col=m_FlexGrid.GetCol(); long current_row=m_FlexGrid.GetRow();int i=1;/指向当前行,求最小值if(col+3=current_col)/用col+3判断是行还是列需要求最小值min=atof(m_FlexGrid.GetTextMatrix(i,col);/将当前的第一个值赋给minfor( i=1;iatof(m_FlexGrid.GetTextMatrix(current_row,i)/min与后面的数进行比较min=atof(m_FlexGrid.GetTextMatrix(current_row,i); /如果min小于后面的数,则将该数重新赋给mingcvt(min,10,t);m_FlexGrid.SetTextMatrix(current_row,current_col,t);/将min显示else if(row+3=current_row)/指向当前列,求最小值/用row+3判断是行还是列需要求最小值i=1;min=atof(m_FlexGrid.GetTextMatrix(i,current_col);/将当前的第一个值赋给minfor( i=1;iatof(m_FlexGrid.GetTextMatrix(i,current_col)/min与后面的数进行比较min=atof(m_FlexGrid.GetTextMatrix(i,current_col);/如果min小于后面的数,则将该数重新赋给min gcvt(min,10,t); m_FlexGrid.SetTextMatrix(current_row,current_col,t);/将min显示/*读取存储的值*/void CChild:OnButton4() / TODO: Add your control notification handler code here extern double mem2020; /将数组的值一次存入表格extern double m_r;extern double m_c;char t10;for(int i=1;i=m_r;i+) for(int j=1;j=m_c;j+) gcvt(memij,10,t); m_FlexGrid.SetTextMatrix(i,j,t);/*存储表格的值*/void CChild:OnButton5() / TODO: Add your control notification handler code hereextern double mem2020;extern double m_r;extern double m_c;for(int i=1;i=row;i+)for(int j=1;j=col;j+)memij=atof(m_FlexGrid.GetTextMatrix(i,j);m_r=row; /用全局变量记录表格的行列数m_c=col;EndDialog(0);/*列排序*/void CChild:OnButton6() / TODO: Add your control notification handler code herelong current_col=m_FlexGrid.GetCol();/获取鼠标所在的列的值double temp20;char t10;for(int k=1;k=row;k+) /将所在列的所有值存入temp数组tempk=atof(m_FlexGrid.GetTextMatrix(k,current_col);for(int i=1;ii;j-)if(tempjtemplow)low=j; /用选择排序排列double tp;tp=tempi;tempi=templow;templow=tp;for(int m=1;m=row;m+)gcvt(tempm,10,t); /将排好序的数组的值重新传回表格m_FlexGrid.SetTextMatrix(m,current_col,t);/*行排序*/void CChild:OnButton7() / TODO: Add your control notification handler code herelong current_row=m_FlexGrid.GetRow(); /获取表格所在的行double temp20;char t10;for(int k=1;k=col;k+)tempk=atof(m_FlexGrid.GetTextMatrix(current_row,k); /将所在行的值存入数组for(int i=1;ii;j-)if(tempjtemplow) /用选择排序法排序low=j;double tp;tp=tempi;tempi=templow;templow=tp;for(int m=1;m=col;m+)gcvt(tempm,10,t); /将排好序的数组的值回传表格m_FlexGrid.SetTextMatrix(current_row,m,t);/*求平均值*/void CChild:OnButton8() / TODO: Add your control notification handler code heredouble ave;char t10;long current_col=m_FlexGrid.GetCol(); long current_row=m_FlexGrid.GetRow();double m;if(current_col=col+4) /用col+4判断是行还是列需要求平均值m=atof(m_FlexGrid.GetTextMatrix(current_row,col+1);/利用前面求的的和(COL+1)m直接进行求平均ave=m/col;gcvt(ave,10,t); m_FlexGrid.SetTextMatrix(current_row,col+4,t);else if(row+4=current_row)/用row+4判断是行还是列需要求平均值m=atof(m_FlexGrid.GetTextMatrix(row+1,current_col); /利用前面求的的和(row+1)m直接进行求平均ave=m/row;gcvt(ave,10,t); m_FlexGrid.SetTextMatrix(row+4,current_col,t);5.实验结果行列的数量可自行设置:定义了4x4的表格后,任意给定一些数据,得到的结果如图所示:6.实验总结通过这次的数据结构专题实验,我个人得到了不少的收获,一方面加深了我对课本理论的认识,另一方面也提高了自己的独立分析问题能力和解决问题的能力。尽管有些问题并不是完全靠自己的能力去解决的,但是在参考了相关资料,咨询老师之后,细心领悟其中的道理,不放过任何一个细节,不断的完善自己的知识。7.参考文献数据结构实用教程C+版 万健 主编 电子工业出版社数据结构实践教程 徐慧 主编 清华大学出版社数据结构与算法分析 Larry Nyhoff著; 黄达明等译 清华大学出版社
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!