![繪制成績分布圖_第1頁](http://file4.renrendoc.com/view/da3e93063b277802c97653db606040c0/da3e93063b277802c97653db606040c01.gif)
![繪制成績分布圖_第2頁](http://file4.renrendoc.com/view/da3e93063b277802c97653db606040c0/da3e93063b277802c97653db606040c02.gif)
![繪制成績分布圖_第3頁](http://file4.renrendoc.com/view/da3e93063b277802c97653db606040c0/da3e93063b277802c97653db606040c03.gif)
![繪制成績分布圖_第4頁](http://file4.renrendoc.com/view/da3e93063b277802c97653db606040c0/da3e93063b277802c97653db606040c04.gif)
![繪制成績分布圖_第5頁](http://file4.renrendoc.com/view/da3e93063b277802c97653db606040c0/da3e93063b277802c97653db606040c05.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Visual c+可視化程序 設(shè)計報告繪制成績分布圖系別:電氣系班級: 電子092班姓名:杜力朝繪制成績分布圖報告、設(shè)計內(nèi)容介紹:本示例主要的功能是通過給定的一組成績數(shù)據(jù)繪制出成績的分布圖(包括直方圖和圓 餅圖)。這里沒有用到數(shù)據(jù)庫,因為是一個簡單的成績分布圖,而用數(shù)據(jù)庫的話在轉(zhuǎn)到另一 臺機子上還要重新建表,對于學生信息也要涉及到錄入問題,不容易實際操作,所以本示 例采用了更為方便的通過手動錄入數(shù)據(jù)或者是從文件(txt格式文本文檔,第一個數(shù)為總 人數(shù),其余為分數(shù),分數(shù)之間用逗號隔開)導入數(shù)據(jù)兩種方式繪制出其統(tǒng)計圖。錄入的成 績可查看可修改,直方圖采用了立體圖模式,看起來更直觀,各個分數(shù)段都有明
2、顯的分數(shù) 人數(shù)標注,看起來直觀形象。餅形圖也同樣標注了各顏色對應的分數(shù)段及人數(shù),看起來很 直觀。數(shù)據(jù)錄入部分與繪圖部分集成在一個對話框上面,沒有在單個文檔中調(diào)用,減少了 不必要的繁瑣過程。二、設(shè)計思路方法、過程在早期一段時間做過界面設(shè)計,多媒體的制作以及網(wǎng)絡部分的程序,而對于繪圖一部 分一直以來都為觸及到,所以在這方面采用了查找樣本借鑒修改的方法來完成本實驗。通過查閱資料分析一共得到兩個差不多的實例,其中一個是創(chuàng)建一個繪圖類,然后在 繪制過程中創(chuàng)建該類,將該類實例化以后繪制出相應的圖形;另一個是直接從給出的數(shù)據(jù) 中繪出直方圖和餅圖來。因為學 C+處未達到一定層次,對于建類來說并不是一件容易的
3、事,所以采用了第二種直接繪圖的方法,即在繪制按鈕中添加所有繪制代碼。因為給定的是一個在單文檔中繪制的實例,而且數(shù)據(jù)是直接繪出的,本實例是需要從 所給分數(shù)數(shù)據(jù)中統(tǒng)計出各分數(shù)段人數(shù),然后將其分布圖繪制出來,所以在將其源碼打出來 以后,在其基本框架上加以修改而來,將當文檔換成為基本對話框,并且數(shù)據(jù)經(jīng)過處理以 后顯示在對話框右側(cè)部分。所給實例只是一個簡單的繪制圖形的實例,僅在單機是進行繪制,而本例則在導入數(shù) 據(jù)或者錄入數(shù)據(jù)后繪制圖形,所以在調(diào)試過程中加入了很多變量,和局部變量。通過全局 變量將局部變量聯(lián)系到一起,從而實現(xiàn)了要求所述的基本功能。老師說,一個軟件的好與 壞區(qū)別在其制作時考慮是否全面,要將其
4、可能出現(xiàn)的用戶所要求的所有情況都加以完善, 所以本示例在基本功能完成后的完善部分做了很大一部分工作,主要有在繪制時沒有繪制數(shù)據(jù)時報錯提醒,導入時沒有導入文件報錯提醒,文件錄入查看及錄入修改,重新錄入等,錄入人數(shù)不可大于總?cè)藬?shù),在錄入?yún)^(qū)域及標注上也做了相應調(diào)整,還有在程序從得到焦點重繪圖形的過程上加以了完善。最后程序基本上就成型了,不過程序還有一點問題就是在導入文件時的問題現(xiàn)在還未想到解決方法。在導入數(shù)據(jù)的時候要做一個檢測,檢測路徑框是否為空,如果為空則提示錯誤,不為空則導入數(shù)據(jù),這時如果路徑框中路徑不對的話,那么導入數(shù)據(jù)時程序便會終止。因為不知道怎么見得文件時候合法,所以這個問題暫時還沒有解決
5、方案。不過一般按正確操作的話是不會出現(xiàn)問題的。三、設(shè)計結(jié)果示范本示例主要有兩個結(jié)果:、直方圖繪制效果圖、圓餅圖繪制效果圖四、設(shè)計心得體會通過這個小小的程序設(shè)計,對程序設(shè)計有了一個新的認識,也使自己在生活過程中用一種新的思維審視世界。曾聽過這樣的一段話:在玩游戲的過程中看到的不是畫面,而是各種數(shù)據(jù)在有規(guī)律的運動,計算,時刻進行著各種循環(huán)和假設(shè)判斷,我玩的已不是游戲,而是方程式這段話深刻的反映出了游戲的設(shè)計過程。同樣也折射出了程序設(shè)計的原理。在繪圖這方面以前只設(shè)計過簡單的直線曲線自由線畫圖,而對于這樣的數(shù)據(jù)自動繪圖沒有涉及到,在設(shè)計出來前就曾想過做一個圖像處理程序,不過在看過程序的復雜性以及時間短
6、暫的原因,沒有著手哪方面的準備,在這之后課題為繪圖設(shè)計正好可以彌補這方面的空缺。設(shè)計時由于沒有任何的基礎(chǔ),所以搜索了很多資料,最終鎖定了一個比較簡單的模板,將模板打出來是很簡單的事情,但是真正有趣的是后面的調(diào)試完善工作,其中各種環(huán)節(jié)都是圍繞繪制矩形和繪制扇形而來,大量的工作就是將數(shù)據(jù)導入數(shù)組并將其處理分組得到其人數(shù)以后將其轉(zhuǎn)化為矩形以及為立體而設(shè)計的平行四邊形的坐標,扇形的坐標。其他的一些完善代碼大部分都是輔助的,不過在設(shè)計過程中也是十分有趣的。在設(shè)計過程中遇到了很多問題,從最簡單的矩形圖數(shù)據(jù)分析到后來的文件操作以及畫刷顏色的隨機選取,模擬按鍵消息,各種錯誤的報錯提醒等等問題都一一排除,通過查
7、閱大量資料來進行各種完善。因為學過其他的編程軟件,所以在編程的過程中,也在比較兩者的區(qū)別,各自的特點以及缺點,不同和相同之處。C+勺各類分的比較詳細,在創(chuàng)建變量時也是通過對話框創(chuàng)建,結(jié)構(gòu)性比較好,適合于團隊協(xié)作;而另一個編程軟件(delphi )則在類于類之間比較模糊,所有的工作都在Form上操作,不過這樣操作起來比較方便,整合的控件也相當多,直接擺放即可,適合個人應用。不管哪種軟件都是為編程而服務的,其目的是一樣的,只是在操作上不同而已,通過兩個軟件的比較是自己更好的掌握了其類的概念,控件的用途,在函數(shù)以及屬性的設(shè)計上都有了更深的理解。語言都是想通的,在學過一門語言以后其他的便可以讀懂了。最
8、開始學習的是C+,而后又接觸了delphi ,在剛開始學習delphi 的過程中基本上都可以讀懂其中的代碼,而后再學習Visual C+ 便輕松多了。在剛開始講課的時候幾乎不知道怎么去分析處理,因為有了前者使用的習慣,所以在后者使用時總會想當然的以為該那樣,其實兩者在程序使用中有很大的不同,即使到了考試時也不是很明白該怎么去使用它。直到現(xiàn)在設(shè)計這個小程序時才系統(tǒng)的將這個軟件大致的掌握了其使用方法。在變量聲明以及轉(zhuǎn)換顯示,屬性的動態(tài)修改等等都有了一個新的認 識。那么剩下的在編程方面的思想以及 windows API接口函數(shù)的使用都是相通的。只不過 實現(xiàn)的過程不一樣而已。在設(shè)計過程中遇到了很多錯誤
9、,軟件自身帶有的DEBU助能有一定的好處,但是這個功能不怎么會用,而在查閱資料的時候記得看到過用 MessageBo冰調(diào)試程序的用法,如果 出錯了,那么就用MessageBo江看看到底程序執(zhí)行到了什么步驟,出現(xiàn)對話框,則說明之 前的都執(zhí)行過了,如果沒出現(xiàn),則程序沒執(zhí)行到這里就已經(jīng)產(chǎn)生了錯誤。MessageBo斑可以顯示所處理的數(shù)據(jù)或者字符串的變化。用起來相當簡單。這個小技巧是自己在調(diào)試過程 中效率提高了不少,在源代碼中,這些 MessageBox并沒有刪除,只是注釋掉了,在以后分 析的時候這也是相當有幫助的。五、由現(xiàn)的錯誤及改正方法.剛開始是將瀏覽和導入的函數(shù)集成到一個按鈕“瀏覽”里面,但是在
10、調(diào)試中發(fā)現(xiàn)如 果單擊瀏覽而不選中文件的話, 會出現(xiàn)錯誤二終止。 通過分析其主要原因是因為函數(shù)理念 有導入數(shù)據(jù)的代碼,單擊后會一并執(zhí)行,如果沒有選中文件那么就無法導入數(shù)據(jù)產(chǎn)生錯誤。解決方法:將瀏覽和導入功能分裝到兩個按鈕里面,并在導入數(shù)據(jù)的時候檢測是否有 文件導入。如果沒有則報錯提醒。.在繪制直方圖或圓餅圖時如果沒有數(shù)據(jù)則會出現(xiàn)錯誤而自動終止程序,原因是數(shù)組 當中沒有數(shù)據(jù)而無法繪圖。解決方法:定義全局變量,在導入后全局變量變?yōu)?,繪制時檢測全局變量是否為1,是則繪制,否則報錯提醒。.在錄入過程中難免會錄入錯誤,所以查看錄入和重新錄入就顯得很重要了。而在錄 入的過程中會出現(xiàn)錄入人數(shù)大于所規(guī)定的人數(shù)
11、的,這樣在數(shù)組存放數(shù)據(jù)時就會產(chǎn)生錯誤。解決方法:增加重新錄入和查看錄入成績的功能,為了方便起見,每行顯示五個成績, 而且在錄入時對錄入人數(shù)做了一個判斷,如果大于所輸人數(shù),則提示成績錄入完畢。.在做圓餅圖時發(fā)現(xiàn)如果某一分數(shù)段的人數(shù)為0的話,就會產(chǎn)生這樣的結(jié)果這種結(jié)果并不是我們想要的。圖中可以看到本來沒有的分數(shù)段70-80覆蓋掉了原有的60和60-70的分數(shù)段。解決方法:在繪制過程中對繪制扇形一部分做了檢測,發(fā)現(xiàn)如果所繪制分數(shù)段如果為 零則不繪制這段扇形。這樣結(jié)果便正常了。. 由于繪圖部分并不是在OnPaint 函數(shù)里所寫的,而是直接在按鈕里添加的,所以在程序重新得到焦點重繪的過程中會產(chǎn)生這樣的錯
12、誤:一部分被擋住的圖形丟失了。雖說可以重新點擊繪圖重繪,不過這樣的事情最好不要發(fā)生。解決方法:在程序重繪的過程中在OnPaint 事件里添加如下代碼:if(DrawMode=1) PostMessage(WM_COMMAND,IDC_BUTTON1,BN_CLICKED); else if(DrawMode=2)PostMessage(WM_COMMAND,IDC_BUTTON2,BN_CLICKED);這是模擬單機事件的次碼,在重繪過程不自動模擬單機不件。DrawModel定義的一個繪圖模式,若單機繪制直方圖, DrawMode=1單機繪制圓餅圖,DrawMode=2在重繪過程 中自動模擬但
13、是過程。省去了使用者再次點擊的過程。六、設(shè)計中的關(guān)鍵源程序1、繪制直方圖代碼:void CMy09228DulichaoDlg:OnButton1()if(True=0)MessageBox(未導入數(shù)據(jù)!,錯誤!);elseCClientDC *pDC=new CClientDC(this);const int x0=280,y0=35,x1=780,y1=395;/定義繪制的矩形區(qū)域/CFileDialog ofn(TRUE,NULL,*.txt,OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST,Text files (*.txt)0*.txt0);/ofn.DoMod
14、al();/FILE *fp=fopen(ofn.GetPathName(),rt);int N,*a;int i,x,y;CString s;/for(fscanf(fp,%d,&N),a=new intN,i=0;iN;+i)/fscanf(fp,%d,&ai);/fclose(fp);N=Num;a=new intN;/int aN;for(i=0;iN;+i)ai=Scorei;/ CString str1;/ str1.Format(%d,ai);/ MessageBox(str1,);/ 將全局變量Scorei 里的數(shù)據(jù)傳遞給局部變量ai/MessageBox(),;int Sc5
15、;Sc0=0;Sc1=0;Sc2=0;Sc3=0;Sc4=0;for(i=0;iN;i+)if(ai60)Sc0+;elseif(ai70)/統(tǒng)計各個分段中的人數(shù)Sc1+;elseif(ai80)Sc2+; elseif(ai90)Sc3+;elseSc4+;int Max=0;for(i=0;iMax) /確定五個分段中最大的個數(shù)Max=Sci;/MessageBox(adfasdf,sss); /調(diào)試所用const int dx=(x1-x0)/5,M=30,dy=(y1-y0)/10,h=dx/4,dh=(y1-y0)/Max;CPoint v4;CBrush br;CPen pen,*
16、p_pen;#define R rand()%56+200BYTE r,g,b;br.CreateSolidBrush(RGB(126,126,126);pDC-SelectObject(&br);/srand(unsigned)time(NULL);CRect rc;GetClientRect(&rc);畫出繪制區(qū)域pDC-Rectangle(x0-40,0,rc.right,rc.bottom); /br.DeleteObject();pDC-MoveTo(x0,y1);pDC-LineTo(x=x1+80,y1);pDC-MoveTo(x,y1);pDC-LineTo(x-12,y1-3
17、);pDC-MoveTo(x,y1);pDC-LineTo(x-12,y1+3); / 畫出 x 軸pDC-MoveTo(x0,y1);pDC-LineTo(x0,0);pDC-MoveTo(x0,0);pDC-LineTo(x0-3,12);pDC-MoveTo(x0,0);pDC-LineTo(x0+3,12);/ 畫出 y 軸pen.DeleteObject();/pDC-SetROP2(R2_MASKPEN);/pen.CreatePen(PS_DOT,1,RGB(70,70,70);/p_pen=pDC-SelectObject(&pen);pDC-MoveTo(x1+55,0);p
18、DC-LineTo(x1+55,y1);pen.CreatePen(PS_SOLID,2,RGB(0,0,0);p_pen=pDC-SelectObject(&pen);for(i=0,x=x0;iSelectObject(&br);pDC-Rectangle(x,y1-dh*Sci,x+dx,y1); /畫出矩形區(qū)域v0.x=x+dx;v0.y=y1-dh*Sci;v1.x=v0.x+h;v1.y=v0.y-h;v2.x=v1.x-dx;v2.y=v1.y;v3.x=v2.x-h;v3.y=v2.y+h; /畫出頂部平行四邊形區(qū)域pDC-Polygon(v,4);pDC-SelectStoc
19、kObject(WHITE_BRUSH);br.DeleteObject();if(i=4|SciSci+1)br.CreateSolidBrush(RGB(r*0.7,g*0.7,b*0.7);pDC-SelectObject(&br);v2.x=v1.x;v2.y=v1.y+dh*Sci;v3.x=x+dx;v3.y=y1;pDC-Polygon(v,4); / 畫出側(cè)邊四邊形區(qū)域pDC-SelectStockObject(WHITE_BRUSH);br.DeleteObject();pDC-SelectObject(p_pen);pen.DeleteObject();pen.Create
20、Pen(PS_DOT,1,RGB(70,70,70);p_pen=pDC-SelectObject(&pen);pDC-SetROP2(R2_MASKPEN);for(y=y1,i=0;y=y0;+i,y-=dh)if(y!=y0&y!=y1)pDC-MoveTo(x0,y);pDC-LineTo(x1+h+30,y); / 沿 y 軸標注s.Format(%3d,i);pDC-TextOut(250,y-8,s);CString ren;ren= 人 ;s.Format(%s,ren);pDC-TextOut(260,10,s);pDC-SelectObject(p_pen);pen.Del
21、eteObject();CString Str5; TOC o 1-5 h z Str0=90分 ;for(i=0;iTextOut(x0+i*dx+(dx-s.GetLength()*8)/2,y1+4,s);/沿 x 軸標注s.Format(%d 人 ,Sci);pDC-TextOut(x0+i*dx+(dx-s.GetLength()*8)/2+6,y1-20-dh*Sci,s);/ 頂層標注人數(shù)CString fen;fen= 分數(shù) ;s.Format(%s,fen);pDC-TextOut(x0+i*dx+(dx-s.GetLength()*8)/2+30,y1+4,s);delet
22、e pDC; / 刪除指針if(a!=NULL) delete a;/Num=1;/ 將最大數(shù)清零DrawMode=1;True=1;繪制餅形圖源代碼if(True=0)MessageBox(未導入數(shù)據(jù)!,錯誤!);elseCClientDC* pDC=new CClientDC(this);#define Sum sn-1const int r=170,p=20;const int x0=r+20,y0=r+20,x1=x0-r,y1=y0-r,x2=x0+r,y2=y0+r;int n=5,*data=new intn,*s=new intn;static int promin=0;/*i
23、nt N,*a;int i,x,y;/CString s;N=Num;a=new intN;/int aN;for(i=0;iN;+i)aiai=Scorei; / 將全局變量Scorei 里的數(shù)據(jù)傳遞給局部變量int Sc5;Sc0=0;Sc1=0;Sc2=0;Sc3=0;Sc4=0;for(i=0;iN;i+)if(ai60)Sc0+; elseif(ai70)/統(tǒng)計各個分段中的人數(shù)Sc1+;elseif(ai80)Sc2+;elseif(ai90)Sc3+;elseSc4+;int Max=0;for(i=0;iGetTextMetrics(&txMetric);/br.CreateSo
24、lidBrush(RGB(r1=R,g=R,b=R);/ pDC-SelectObject(&br);CString str;br.CreateSolidBrush(RGB(126,126,126);pDC-SelectObject(&br);pDC-Rectangle(240,0,rc.right,rc.bottom);br.DeleteObject();/ 繪圖區(qū)域for(s0=data0,i=1;in;+i)si=si-1+datai;/求總和srand(unsigned)time(NULL);CString Str15; TOC o 1-5 h z Str10=90分 ;for(the
25、ta3=0.0,x3=x0+r/*x0=r+20*/,y3=y0/*y0=r+20*/,i=0;iSelectObject(&br);pDC-Pie(x1+tx+250,y1+ty,x2+tx+250,y2+ty/*邊 緣 矩 陣*/,x4+tx+250,y4+ty/* 起始點 */,x3+tx+250,y3+ty/* 終止點 */); / 第一個是邊緣矩陣,第二個是起始點,第三個是終止點str.Format(%d,datai); /各個分段數(shù)據(jù)pDC-TextOut(x0+tx-txMetric.tmAveCharWidth*str.GetLength()*0.5+r*0.7*cos(the
26、tam)+250,y0+ty-(txMetric.tmExternalLeading+txMetric.tmHeight)*0.5+r*0.7*sin(thetam),str,str.GetLength(); /顯示分段數(shù)據(jù)pDC-Rectangle(700,150+i*40,720,170+i*40);str.Format(%s,Str1i);pDC-TextOut(740,150+i*40,str);theta3=theta4;x3=x4;y3=y4;pDC-SelectObject(p_br);br.DeleteObject();delete data;delete s;delete pDC;promin=(promin+1)%n;DrawMode=2;瀏覽代碼:void CMy09228DulichaoDlg:OnButton7()CFileDialogofn(TRUE,NULL,*.txt,OFN_FILEM
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年前列腺射頻治療儀系統(tǒng)行業(yè)深度研究分析報告
- 2025年船用裝飾材料項目投資可行性研究分析報告-20241226-205913
- 以租代買房合同范本
- 個人銷售欠款合同范本
- 關(guān)于公司承包合同范本
- 2025年度道路劃線施工與交通信號優(yōu)化合同范本
- 一汽解放車銷售合同范本
- 代理電商合同范本
- 代建房合同范本
- 《如何做一名好教師》課件
- 2016-2023年婁底職業(yè)技術(shù)學院高職單招(英語/數(shù)學/語文)筆試歷年參考題庫含答案解析
- 貴陽市2024年高三年級適應性考試(一)一模英語試卷(含答案)
- 地理標志專題通用課件
- 魚類和淡水生態(tài)系統(tǒng)
- 全國大學高考百科匯編之《哈爾濱工業(yè)大學》簡介
- 學校安全教育教你如何遠離危險
- 【人教版】九年級化學上冊全冊單元測試卷【1-7單元合集】
- 中國傳統(tǒng)文化課件6八卦五行
- 《胃癌課件:病理和分子機制解析》
- 口腔科導診分診技巧(PPT課件)
評論
0/150
提交評論