简易电子表格的设计.docx
- 文档编号:10328328
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:17
- 大小:43.10KB
简易电子表格的设计.docx
《简易电子表格的设计.docx》由会员分享,可在线阅读,更多相关《简易电子表格的设计.docx(17页珍藏版)》请在冰豆网上搜索。
简易电子表格的设计
实验一简易电子表格的设计
1.问题描述
设计一个支持基本计算统计功能和其它一些表格管理/处理功能的软件,使用户可在该软件的支持下,用交互方式进行表格建立、数据输入、数据编辑及其它一些表格操作。
即类似于简易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(lRow>m_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;i { intlow=i; for(intj=row;j>i;j--) { if(temp[j] 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程序代码 #include"stdafx.h" #include"excel.h" #include"Child.h" #include"ExcelDoc.h" #ifdef_DEBUG #definenewDEBUG_NEW #undefTHIS_FILE staticcharTHIS_FILE[]=__FILE__; #endif voidCChild: : 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(lRow>m_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: Addyourcontrolnotificationhandlercodehere CStringstrInput; GetDlgItemText(IDC_EDIT1,strInput);//获取输入框内容 m_FlexGrid.SetText(strInput);//设置单元格内容 m_Edit.ShowWindow(SW_HIDE); } /*****求和*****/ voidCChild: : OnButton1() { //TODO: Addyourcontrolnotificationhandlercodehere//求和 doublesum=0; chart[10]; longcurrent_col=m_FlexGrid.GetCol(); longcurrent_row=m_FlexGrid.GetRow(); if(col+1==current_col)//行求和 {//用col+1判断是行还是列需要求和 for(inti=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(inti=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);//求和结束后将结果显示 }; } /*****求最大值*****/ voidCChild: : OnButton2() { //TODO: Addyourcontrolnotificationhandlercodehere doublemax; chart[10]; longcurrent_col=m_FlexGrid.GetCol(); longcurrent_row=m_FlexGrid.GetRow(); inti=1; if(col+2==current_col)//指向当前行,求最大值 {//用col+2判断是行还是列需要求最大值 max=atof(m_FlexGrid.GetTextMatrix(i,current_col)); //将当前的第一个值赋给max for(i=1;i<=row;i++) { if(max //max与后面的数进行比较 max=atof(m_FlexGrid.GetTextMatrix(current_row,i)); //如果max小于后面的数,则将该数重新赋给max } gcvt(max,10,t); m_FlexGrid.SetTextMatrix(current_row,col+2,t);//将max显示 } elseif(row+2==current_row)//指向当前列,求最大值 {//用row+2判断是行还是列需要求最大值 i=1; max=atof(m_FlexGrid.GetTextMatrix(current_row,i)); //将当前的第一个值赋给max for(i=1;i<=col;i++) { if(max //max与后面的数进行比较 max=atof(m_FlexGrid.GetTextMatrix(i,current_col)); //如果max小于后面的数,则将该数重新赋给max } gcvt(max,10,t); m_FlexGrid.SetTextMatrix(row+2,current_col,t);//将max显示 }; } /*****最小值*****/ voidCChild: : OnButton3() { doublemin; chart[10]; longcurrent_col=m_FlexGrid.GetCol(); longcurrent_row=m_FlexGrid.GetRow(); inti=1;//指向当前行,求最小值 if(col+3==current_col)//用col+3判断是行还是列需要求最小值 { min=atof(m_FlexGrid.GetTextMatrix(i,col));//将当前的第一个值赋给min for(i=1;i<=col;i++) { if(min>atof(m_FlexGrid.GetTextMatrix(current_row,i))) //min与后面的数进行比较 min=atof(m_FlexGrid.GetTextMatrix(current_row,i)); //如果min小于后面的数,则将该数重新赋给min } gcvt(min,10,t); m_FlexGrid.SetTextMatrix(current_row,current_col,t);//将min显示 } elseif(row+3==current_row)//指向当前列,求最小值 {//用row+3判断是行还是列需要求最小值 i=1; min=atof(m_FlexGrid.GetTextMatrix(i,current_col)); //将当前的第一个值赋给min for(i=1;i<=row;i++) { if(min>atof(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显示 } } /*****读取存储的值*****/ voidCChild: : OnButton4() { //TODO: Addyourcontrolnotificationhandlercodehere externdoublemem[20][20];//将数组的值一次存入表格 externdoublem_r; externdoublem_c; chart[10]; for(inti=1;i<=m_r;i++) for(intj=1;j<=m_c;j++) { gcvt(mem[i][j],10,t); m_FlexGrid.SetTextMatrix(i,j,t); } } /*****存储表格的值******/ voidCChild: : OnButton5() { //TODO: Addyourcontrolnotificationhandlercodehere externdoublemem[20][20]; externdoublem_r; externdoublem_c; for(inti=1;i<=row;i++) for(intj=1;j<=col;j++) mem[i][j]=atof(m_FlexGrid.GetTextMatrix(i,j)); m_r=row;//用全局变量记录表格的行列数 m_c=col; EndDialog(0); } /*****列排序*****/ voidCChild: : OnButton6() { //TODO: Addyourcontrolnotificationhandlercodehere longcurrent_col=m_FlexGrid.GetCol();//获取鼠标所在的列的值 doubletemp[20]; chart[10]; for(intk=1;k<=row;k++)//将所在列的所有值存入temp数组 temp[k]=atof(m_FlexGrid.GetTextMatrix(k,current_col)); for(inti=1;i { intlow=i; for(intj=row;j>i;j--) { if(temp[j] low=j;//用选择排序排列 } doubletp; tp=temp[i]; temp[i]=temp[low]; temp[low]=tp; } for(intm=1;m<=row;m++) { gcvt(temp[m],10,t);//将排好序的数组的值重新传回表格 m_FlexGrid.SetTextMatrix(m,current_col,t); } } /*****行排序*****/ voidCChild: : OnButton7() { //TODO: Addyourcontrolnotificationhandlercodehere longcurrent_row=m_FlexGrid.GetRow();//获取表格所在的行 doubletemp[20]; chart[10]; for(intk=1;k<=col;k++) temp[k]=atof(m_FlexGrid.GetTextMatrix(current_row,k)); //将所在行的值存入数组 for(inti=1;i<=col;i++) { intlow=i; for(intj=col;j>i;j--) { if(temp[j] low=j; } doubletp; tp=temp[i]; temp[i]=temp[low]; temp[low]=tp; } for(intm=1;m<=col;m++) { gcvt(temp[m],10,t);//将排好序的数组的值回传表格 m_FlexGrid.SetTextMatrix(current_row,m,t); } } /*****求平均值*****/ voidCChild: : OnButton8() { //TODO: Addyourcontrolnotificationhandlercodehere doubleave; chart[10]; longcurrent_col=m_FlexGrid.GetCol(); longcurrent_row=m_FlexGrid.GetRow(); doublem; 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); } elseif(r
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易 电子表格 设计