简易电子表格的设计.docx

上传人:b****8 文档编号:10328328 上传时间:2023-02-10 格式:DOCX 页数:17 大小:43.10KB
下载 相关 举报
简易电子表格的设计.docx_第1页
第1页 / 共17页
简易电子表格的设计.docx_第2页
第2页 / 共17页
简易电子表格的设计.docx_第3页
第3页 / 共17页
简易电子表格的设计.docx_第4页
第4页 / 共17页
简易电子表格的设计.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

简易电子表格的设计.docx

《简易电子表格的设计.docx》由会员分享,可在线阅读,更多相关《简易电子表格的设计.docx(17页珍藏版)》请在冰豆网上搜索。

简易电子表格的设计.docx

简易电子表格的设计

实验一简易电子表格的设计

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 实习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1