簡易電子表格的設(shè)計_第1頁
簡易電子表格的設(shè)計_第2頁
簡易電子表格的設(shè)計_第3頁
簡易電子表格的設(shè)計_第4頁
簡易電子表格的設(shè)計_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、實驗一 簡易電子表格的設(shè)計實驗一 簡易電子表格的設(shè)計11.問題描述12.基本要求13.實現(xiàn)提示24.實驗過程34.1基本算法及分析34.2程序代碼75.實驗結(jié)果136.實驗總結(jié)147.參考文獻151.問題描述 設(shè)計一個支持基本計算統(tǒng)計功能和其它一些表格管理/處理功能的軟件,使用戶可在該軟件的支持下,用交互方式進行表格建立、數(shù)據(jù)輸入、數(shù)據(jù)編輯及其它一些表格操作。即類似于簡易Execel表格處理軟件。2.基本要求 (1)建立表格:建立空白表格,同時在屏幕上顯示,使其處于可輸入數(shù)據(jù)的狀態(tài)。用戶可指定新建表格的行列數(shù)。 (2)輸入數(shù)據(jù)與編輯數(shù)據(jù):通過鍵盤將數(shù)據(jù)輸入到顯示在屏幕上的電子表格上。 (3)基

2、本統(tǒng)計計算:可選擇按行或列合計、求平均、求最大最小。 (4)排序:使任意指定的行或列中的數(shù)據(jù)按大小(升或降)排列,對字符型數(shù)據(jù),還可選擇大小寫敏感。 (5)表格保存:使電子表格以磁盤文件的方式存儲在磁盤上,并可隨時讀入, 供繼續(xù)處理。 *(6)公式支持:單元格內(nèi)可輸入公式(表達式),使對應(yīng)單元格的最終內(nèi)容為公式的計算結(jié)果。公式最基本的形式是算術(shù)計算公式,可按名引用其它單元格。 *該功能可選做。3.實現(xiàn)提示該題目需要使表格成為可編輯狀態(tài),此部分要求較高,可在網(wǎng)上或圖書館查找相關(guān)資料。提示:MSFlexGrid 控件的函數(shù)的長度單位是“緹(twips)”,需要將其轉(zhuǎn)化為像素,1440 緹 = 1

3、英寸4.實驗過程4.1基本算法及分析首先,定義繪制可視化表格的一些函數(shù),部分函數(shù)名如下: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( )利用這些函

4、數(shù)將可視化表格繪制出來。第二,定義函數(shù)CChild:OnClickMsflexgrid1( )將可視化表格打印出來。同時利用兩個for循環(huán),在行和列上分別將AZ,“和”“最大值”“最小值”“平均值”“行排序”“列排序”“讀取”“保存”等字符串顯示出來。第三,使表格成為可編輯狀態(tài)。通過if(lRowm_FlexGrid.GetRows() | lRow=0)判斷點擊是否有效。若有效,則獲取FlexGrid控件的窗口矩形并將其轉(zhuǎn)換為客戶區(qū)矩形,以像素為單位計算選中格的左上角的坐標(biāo)和選中格的尺寸,形成選中個所在的矩形區(qū)域并轉(zhuǎn)換成相對對話框的坐標(biāo)。然后獲取單元格內(nèi)容,改變大小并移到選中格位置,顯示文本

5、。第四,求和。定義函數(shù)CChild:OnButton1()。先判斷是行還是列需要求和,在將所在行(或列)的所有數(shù)加起來得到sum并顯示。為方便存取,利用可以將字符轉(zhuǎn)換成浮點數(shù)的函數(shù)atof和可以將浮點數(shù)轉(zhuǎn)換成字符的函數(shù)gcvt把獲取到的單元格內(nèi)容來回轉(zhuǎn)換。第五,求最值。分別定義函數(shù)CChild:OnButton2()和CChild:OnButton3( )求最大值和最小值。先判斷是行還是列需要求最值,將所在行(或列)的第一個數(shù)存放在max(或min)中,并將此數(shù)與后面的數(shù)次比較。求最大值時,如果前面的數(shù)比后面的數(shù)大,則繼續(xù)向下比較。否則,將大的數(shù)存到max中。求最小值時,如果前面的數(shù)比后面的數(shù)

6、小,則繼續(xù)向下比較。否則,將小的數(shù)存到min中。比較結(jié)束之后,將最終的max(或min)輸出。第六,定義函數(shù)CChild:OnButton8()求平均值。由于第四步已經(jīng)求得了所在行(或列)的和sum,因此直接利用sum除以col或row即可得到平均值。第七,定義函數(shù)CChild:OnButton6()和函數(shù)CChild:OnButton7()進行行(列)排序。先利用函數(shù)current_col=m_FlexGrid.GetCol()獲取鼠標(biāo)所在的列的值,將所在列的所有值存入temp數(shù)組,利用選擇排序法將temp數(shù)組中所有數(shù)據(jù)進行排序,并將排好序的數(shù)組的值重新傳回表格。同理,利用函數(shù)current

7、_row=m_FlexGrid.GetRow()獲取鼠標(biāo)所在的列的值,將所在列的所有值存入temp數(shù)組,利用選擇排序法將temp數(shù)組中所有數(shù)據(jù)進行排序,并將排好序的數(shù)組的值重新傳回表格。選擇排序法部分的代碼為:for(int i=1;ii;j-)if(tempjtemplow)low=j; double tp;tp=tempi;tempi=templow;templow=tp;第八,定義函數(shù)CChild:OnButton4() 和CChild:OnButton5() 進行表格數(shù)據(jù)的存儲和讀取。第九,程序的優(yōu)化:建立函數(shù)CShezhi:OnOK(),使表格的行列數(shù)可以自行定義。其主要內(nèi)容如下:C

8、Dialog: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

9、;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_Fle

10、xGrid.GetRows() | lRow=0) /判斷點擊是否有效return; CRect rect; m_FlexGrid.GetWindowRect(&rect); /獲取FlexGrid控件的窗口矩形 ScreenToClient(&rect); /轉(zhuǎn)換為客戶區(qū)矩形 CDC* pDC=GetDC(); /MSFlexGrid 控件的函數(shù)的長度單位是“緹(twips)”,需要將其轉(zhuǎn)化為像素,1440 緹 = 1 英寸 /計算象素點和緹的轉(zhuǎn)換比例 int nTwipsPerDotX=1440/pDC-GetDeviceCaps(LOGPIXELSX); int nTwipsPerDot

11、Y=1440/pDC-GetDeviceCaps(LOGPIXELSY); /計算選中格的左上角的坐標(biāo)(象素為單位) long y = m_FlexGrid.GetRowPos(lRow)/nTwipsPerDotY; long x = m_FlexGrid.GetColPos(lCol)/nTwipsPerDotX; /計算選中格的尺寸(象素為單位)。加1是實際調(diào)試中,發(fā)現(xiàn)加1后效果更好 long width = m_FlexGrid.GetColWidth(lCol)/nTwipsPerDotX+1; long height = m_FlexGrid.GetRowHeight(lRow)/

12、nTwipsPerDotY+1; /形成選中個所在的矩形區(qū)域 CRect rc(x,y,x+width,y+height); /轉(zhuǎn)換成相對對話框的坐標(biāo) rc.OffsetRect(rect.left+1,rect.top+1); CString strValue=m_FlexGrid.GetTextMatrix(lRow,lCol); /獲取單元格內(nèi)容 m_Edit.ShowWindow(SW_SHOW); /顯示控件 m_Edit.MoveWindow(rc); /改變大小并移到選中格位置 m_Edit.SetWindowText(strValue); /顯示文本 m_Edit.SetFoc

13、us(); /獲取焦點/*輸入完畢后使edit空間隱藏,并返回值*/void CChild:OnKillfocusEdit1() / TODO: Add your control notification handler code here CString strInput; GetDlgItemText(IDC_EDIT1,strInput); /獲取輸入框內(nèi)容 m_FlexGrid.SetText(strInput); /設(shè)置單元格內(nèi)容 m_Edit.ShowWindow(SW_HIDE); /*求和*/void CChild:OnButton1() / TODO: Add your co

14、ntrol 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是將字符轉(zhuǎn)換成浮點數(shù)的函數(shù)gcvt(sum,10,t); /gcvt是將浮點數(shù)轉(zhuǎn)換成

15、字符的函數(shù)m_FlexGrid.SetTextMatrix(current_row,col+1,t); /求和結(jié)束后將結(jié)果顯示;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是將字符轉(zhuǎn)換成浮點數(shù)的函數(shù)gcvt(sum,10,t);/gcvt是將浮點數(shù)轉(zhuǎn)換成字符的函數(shù)m_FlexGrid.SetTextMatrix(row+1,current_col,t);/求和結(jié)束后將結(jié)果顯示;/*求最大值*

16、/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)/指向當(dāng)前行,求最大值/用col+2判斷是行還是列需要求最大值max=atof(m_FlexGrid.GetTextMatrix(i,current_col); /將當(dāng)前的第一個值賦給maxf

17、or( i=1;i=row;i+)if(maxatof(m_FlexGrid.GetTextMatrix(current_row,i)/max與后面的數(shù)進行比較max=atof(m_FlexGrid.GetTextMatrix(current_row,i);/如果max小于后面的數(shù),則將該數(shù)重新賦給maxgcvt(max,10,t);m_FlexGrid.SetTextMatrix(current_row,col+2,t);/將max顯示else if(row+2=current_row)/指向當(dāng)前列,求最大值/用row+2判斷是行還是列需要求最大值i=1;max=atof(m_FlexGri

18、d.GetTextMatrix(current_row,i);/將當(dāng)前的第一個值賦給maxfor( i=1;i=col;i+)if(maxatof(m_FlexGrid.GetTextMatrix(i,current_col)/max與后面的數(shù)進行比較max=atof(m_FlexGrid.GetTextMatrix(i,current_col);/如果max小于后面的數(shù),則將該數(shù)重新賦給max gcvt(max,10,t); m_FlexGrid.SetTextMatrix(row+2,current_col,t);/將max顯示;/*最小值*/void CChild:OnButton3()

19、 double min;char t10;long current_col=m_FlexGrid.GetCol(); long current_row=m_FlexGrid.GetRow();int i=1;/指向當(dāng)前行,求最小值if(col+3=current_col)/用col+3判斷是行還是列需要求最小值min=atof(m_FlexGrid.GetTextMatrix(i,col);/將當(dāng)前的第一個值賦給minfor( i=1;iatof(m_FlexGrid.GetTextMatrix(current_row,i)/min與后面的數(shù)進行比較min=atof(m_FlexGrid.Ge

20、tTextMatrix(current_row,i); /如果min小于后面的數(shù),則將該數(shù)重新賦給mingcvt(min,10,t);m_FlexGrid.SetTextMatrix(current_row,current_col,t);/將min顯示else if(row+3=current_row)/指向當(dāng)前列,求最小值/用row+3判斷是行還是列需要求最小值i=1;min=atof(m_FlexGrid.GetTextMatrix(i,current_col);/將當(dāng)前的第一個值賦給minfor( i=1;iatof(m_FlexGrid.GetTextMatrix(i,current_

21、col)/min與后面的數(shù)進行比較min=atof(m_FlexGrid.GetTextMatrix(i,current_col);/如果min小于后面的數(shù),則將該數(shù)重新賦給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; /將數(shù)組的值一次存入表格extern do

22、uble 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+)fo

23、r(int j=1;j=col;j+)memij=atof(m_FlexGrid.GetTextMatrix(i,j);m_r=row; /用全局變量記錄表格的行列數(shù)m_c=col;EndDialog(0);/*列排序*/void CChild:OnButton6() / TODO: Add your control notification handler code herelong current_col=m_FlexGrid.GetCol();/獲取鼠標(biāo)所在的列的值double temp20;char t10;for(int k=1;k=row;k+) /將所在列的所有值存入temp數(shù)組

24、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); /將排好序的數(shù)組的值重新傳回表格m_FlexGrid.SetTextMatrix(m,current_col,t);/*行排序*/void CChild:OnButton7() / TODO: Add your control not

25、ification 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); /將所在行的值存入數(shù)組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); /將排好序的數(shù)組的值回傳表格m_FlexGrid.SetTextMatrix(current_row,m,t);/*求平均值*/void CChi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論