GRAPH在PowerBuilder中的應用

2021-04-07 05:55:33 字數 2610 閱讀 5048

graph在powerbuilder中的應用

在使用powerbuilder時,有時會用到graph。它作為一種輸出工具 ,直觀地顯示使用者想要看到的資料及資料間的關係(我們一般不通過它進行資料輸入)。可以有兩種方法將gr aph放入使用者介面。其一是通過資料窗,使graph成為資料視窗的一部分,或本身即為資料窗。這種方法常常是從資料庫獲取資料,具有易於操作、易於實現等優點。其二是把gra ph作為控制項放進某一視窗或使用者物件中,這種方法一般是從記憶體或外部檔案中獲取資料。實際應用中常使用第一種方法。但是 ,對於第一種方法,在建立graph資料窗時,若選擇的graph type是line 型別時,則可能會出現一些問題。line型別的graph是用來表示離散資料的,它可以將相鄰的離散值用直線連線起來。但是,當乙個graph包含兩個或兩個以上的序列(series)時,可能會在執行結果圖上看到一些序列斷點。如下圖所示:圖1

上圖中,序列a在橫座標為2時是乙個斷點,序列b在橫座標為5時是乙個斷點。同時,我們注意到,橫座標的間隔點值分別為1、2、4、5、 7、8、9、10。數值相差並不均勻,但在座標軸上卻均勻間隔,這使得我們看到的圖形並不能反映真實情況。為什麼出現這種情況呢?這是因為:powerbuilder按ca值從小到大順序自動從資料庫中取點連線。它並不考慮這些點橫座標的意義,所以只按所取點的不同橫座標數均勻分割橫座標軸。在這種情況下,graph只能取確實存在於資料庫中的資料。對於序列a,資料庫中不存在ca為4的記錄;對於序列b,資料庫中不存在ca為7的記錄。powerbuilder取點連線時,以乙個指標(假定為p )記錄當前ca值,以另乙個指標(假定為q)記錄其前乙個ca值。當p值為 4時,只取到b序列的乙個點(b,4,13),因此時q值為2,故與b序列中ca為 2的點(b,2,10)相連,a序列中ca為2的點(a,2,5)此時沒有與之相連的點。然後p指標前移,指向a值為5,q指標前移,指向ca值為4。此時取到兩點(a,5,14)、(b,5,11)。但因q值為4,所以(b,5,11)與b序列ca值為 4折點 (b ,4,13)相連,而(a,5,14)卻無a序列ca值為4的點相連,故不 連。然後p、q指標再次後移。這樣就造成點(a,2,5)被跳過,成為a序列的斷點。同理,b序列在(b,5,11)處也是斷點。如何解決這些問題呢 ?我們不能離開原始資料本身去修改運算結果,即不能在graph上直接修改,而應考慮資料來源。因為在只做查詢時,資料庫中資料一般不能修改,一種辦法是將欲顯示的資料從資料庫中讀出,經過處理後放入某一外部檔案,然後令graph從該檔案讀取資料,形成顯示結果圖。這就要結合上面所述的使用graph的第二種方法:將graph作為控制項放入某一視窗中。下面舉例說明其實現方法:在某一視窗如w—graph中放入一 個graph控制項(gr—1),在該控制項的constructor指令碼中加入以下script 語句:

li—filenum

long ff

string str

li—filenum= fileopen ("c:/try.txt", linemode!,write!,lo ckwrite!,replace !)

fileseek(li—filenum,0,frombeginning!)

for i=1 to seriescount

//seriescount為圖中序列個數,各序列名稱在series[ ]中

for j=1 to categorycount

/*categorycount為橫座標的座標點數。由要顯示的資料ca值範圍及相鄰ca值的最小間隔長度決定。例如:要顯示的資料ca值在1到10 的範圍內,若不同ca值最小相隔為0.5,則此時categorycount值為20, 橫座標值為0.5,1,1.5,2……;若不同ca值最小相隔為1,則此時catego rycount值為10,橫座標值為1,2,3……。各橫座標值在category中 */

varca=0

select ca

intvarca

from querydb

where abs(querydb.ca-:category[j])<=1e-6:

if varca=0 and j>1 then

/*插補的ca值原資料庫中不存在,對應va值要進行修正。方法是找出當前ca值(cate gory[j])其前最臨近的乙個(第m個)、資料庫中 存在的ca值對應的va值(pva)、其後最臨近的乙個(第n個)、資料庫中存在的ca值對應的va值(sva),取(sva-pva)*(j-m)/(n-m)作為當前va 值。賦予value[1,j]*/

修正 //程式略

end if

** str=series[i]+" "+category[j]+" "+value[i,j]

filewrite(li—filenum,str)

next

next

ff=filelength("c:/try.txt")

gr_1.importfile("c:/try.txt",1,ff)

//程式結束

在**行,series[i]中存放當前序列名稱,如"a"、"b"、"c"等(i=1 ,2……);category [j]中存放當前橫座標分隔點 名稱,如"1"、"2"、 "3"、"4"等(j=1,2……)。value[i,j] 中存放對應於當前序列及橫座標的相應縱座標值。雙引號中不是空格,而是tab鍵,如果鍵入的是空 格,則代表換行,tab鍵則表示在本行中空乙個字元。

這樣在w_graph視窗開啟後,該圖形將有如下顯示形式,而不存在斷點問題:圖2

演算法小結(Graph)

133.clone graph 要求 圖的轉殖 思路 無思路 ac 採用遞迴的方式,每次都呼叫clone 207 course schedule 要求 給定輸入的選修課程,每乙個課程都有先修課,判斷能否完成當前課程 思路 判斷有向圖是否有環這個採用bfs就可以做,超時。如果判斷兩個無向圖是否有環,用...

GRE詞根整理 graph

利用詞根記憶gre詞彙是一種較為快捷牢固的方法了,通過詞根可以將一連串gre詞彙串聯記憶。下面是gre詞彙詞根的graph部分,希望能夠幫助各位考生快速記憶gre詞彙。graph write,writing,an instrument for records 寫,畫,文字,圖形,記錄器 602.ph...

Graph的基本表示

鄰接矩陣和鄰接表 鄰接矩陣 a i j 1 代表i點和j點之間存在邊,a i j 0 代表i點和j點不存在邊。鄰接矩陣是乙個a v v 的陣列,空間占用o v v 其 表示方法 private int v private int e private int adj public adjmatrix ...