Visual FoxPro 的乙個排序作業

2021-04-20 02:02:08 字數 4071 閱讀 6169

前段時間幫助乙個同學完成了一道visual foxpro的排序演算法作業題,在此記錄一下。

一、題目要求:

程式先要求使用者輸入n個數,最後依次輸出原始輸入數列、從小到大排列後的數列、從大到小排列後的數列、兩端大中間小排列後的數列。

二、程式**:

clear

numcount = 0

input "   請輸入需要排序的n個數:" to numcount

if numcount<1

? "  輸入的資料個數必須大於0!"

return

endif

dime numarr(numcount)

* accept numbers from keyboard

for i=1 to numcount

input "   請輸入第"+alltrim( str(i) )+"個數:" to numarr(i)

endfor

* print orginal numbers

? "   原始輸入數列:"

for i=1 to numcount

?? alltrim( str( numarr(i) ) ) + "  "

endfor

* sort the array

for curindex = 2 to numcount

curdata         = numarr( curindex )

sortedminindex  = 1

sortedmaxindex  = curindex - 1                      

* query the positon that the curdata should put in

do while sortedminindex <= sortedmaxindex

midindex =  ( sortedminindex + sortedmaxindex ) / 2

if numarr( midindex ) < curdata

sortedminindex = sortedminindex + 1

else

sortedmaxindex = sortedmaxindex - 1

endif       

enddo

*move data forward index from sortedminindex

for j = curindex - 1 to sortedminindex step -1

numarr( j+1 ) = numarr( j ) 

endfor

* put curdata to its position

numarr( sortedminindex ) = curdata  

endfor

* print data from min to max

? "   從小到大排序:"

for i = 1 to numcount

?? alltrim( str( numarr(i) ) ) + "  "

endfor

* print data from max to min

? "   從大到小排序:"

for i = numcount to 1 step -1

?? alltrim( str( numarr(i) ) ) + "  "

endfor

* print from both ends to center

? "   兩端大中間小:"

for i = numcount to 1 step -2

if i>0

?? alltrim( str( numarr(i) ) ) + "  "

endif

endfor

if i=0

startindex = 1

else

startindex = 2

endif

for i = startindex  to numcount step 2

if i <= numcount

?? alltrim( str( numarr(i) ) ) + "  "

endif

endfor

三、程式設計思路:

首先,我們要用乙個陣列來接收使用者輸入的原始資料。根據使用者指定的資料個數來定義陣列維數,並逐個接收使用者輸入的資料儲存到陣列裡。使用者輸入資料完畢,即可列印原始數列。

為了實現資料的從大到小、從小到大以及兩頭大中間小的排序,首先就要將該陣列從小到大遞增排序,然後實現另外兩種排序就相對簡單了。

對原始序列進行排序的方法很多,有氣泡排序、選擇排序、希爾排序及插入排序等,這裡選擇使用插入排序演算法。

總體的思路是假設已經有乙個已經排序過的序列,向該序列中插入乙個新的資料,新資料放在這個已經排序的序列中適當的位置,保證插入新資料後的序列還是乙個有序序列。

對於乙個長度為n的原始序列a [1],a[2],…a[n],我們可以認為第乙個資料a[1]是有序的(即這個有序序列只包含乙個資料a[1]),這時我們將原始序列中第2個資料a[2]插入這個只包含乙個資料的有序序列中,並保證插入後的序列「a[1],a[2]」仍然是有序的。至此,原始序列可以分為已排序和未排序的兩個部分,第1個及第2個資料「a[1],a[2]」是有序的,第3個至第n個資料「a[3],a[4],…a[n]」仍然是未排序的。這時我們繼續將第3個資料a[3]插入到有序序列中(包含第1個資料和第2個資料的序列「a[1],a[2]」)並保證插入後第1至第3個資料「a[1],a[2],a[3]」是有序的。依此類推,直到第n個資料插入到由第1個至第n-1個資料組成的   有序序列「a[1],a[2],…a[n-1]」中,並保證插入後這個n個資料都是有序的。

一般的,假設序列中第1個至第i( 1<=ia[m],則繼續將a[i+1]與「a[m+1]…a[n]」的中間資料進行比較,反之則與「a[1]…a[m-1]」的中間資料進行比較。依次類推,直至最終找到a[i+1]的位置。

在進行a[1]…a[n]的排序後,就可以按1..n的順序列印出遞增數列及按從n…1的序列列印出遞減數列。

為了列印出兩頭大中間小的序列,分兩步列印。第一步從n..1的順序間隔列印,即列印a[n]、a[n-2]、a[n-4]… a[3]、a[1]。(如果n是偶數則列印a[n]、a[n-2]、a[n-4]… a[4]、a[2])。第二步從1…n的順序間隔列印a[2]、a[4]…a[n-1](如果n是偶數則列印a[1]、a[3]、…a[n-1])。

四、 程式分析

1. 將使用者輸入的「資料個數」儲存到變數numcount,宣告乙個長度為numcount的陣列numarr,依次接收使用者輸入的資料儲存到陣列numarr裡。

2. 用乙個迴圈輸出陣列numarr裡的所有資料,即輸出使用者輸入的原始數列。

3. 對陣列numarr進行遞增排序。從第2個資料開始至最後乙個資料迴圈插入到前面已經排序的數列中。

1) curindex 為當前迴圈中待插入的資料,即到此迴圈時,第1個到curindex-1個資料是已經排序的;sortedminindex和sortedmaxindex為已經排序的序列的最小和最大的索引;

2) 用折中查詢法在已經排序的數列中找到第curindex個資料應該存放的位置(即最終sortedminindex所在的位置);

3) 將sortedminindex的到curindex-1的資料依次後移;

4) 將curindex所在位置的原來資料放到sortedminindex位置上,從而達到從1到curindex的資料都是排序過的目的。

4.將已經排序的陣列numarr從1到numcount的順序輸出,即輸出從小到大的數列;

5.將已經排序的數足從numcount到1 的順序輸出,即輸出從大到小的數列;

6.輸出兩頭大中間小的數列:

1)從numcount到1的順序間隔輸出數列,既迴圈變數i的步長為-2。

2) 第一步輸出完畢後,最後乙個輸出的資料只能是numarr陣列的第乙個資料或第二個資料,即迴圈終止後i的值是-1或0。如果i是0,則第一步最後輸出的是numarr的第2個資料,本次輸出應該從第1個資料開始;否則上次最後輸出的是numarr的第1個資料,本次迴圈應該從2個資料開始輸出。且本次迴圈直到numcount間隔輸出。

4 如何隱藏Visual FoxPro的主視窗

4 如何隱藏visual foxpro的主視窗 難度係數 人氣指數90 在程式編譯後啟動時,總是首先顯示visual foxpro的主視窗,然後才執行所設計的應用程式 這樣顯得非常不美觀,誰都不想在顯示自己程式的畫面時,後面還帶有乙個visual foxpro的主視窗,那如何來隱藏visual fo...

乙個乙個的輸入資料

有兩個需要注意的點 1.while中的內容 whlie ch getchar 0 ch eof 注意這兩個書寫的形式是不一樣的 2.while中就不用再寫getchar了,因為while中本身就有ch getchar 輸入描述 一行,字串行,包含a或b,輸入以字元0結束。輸出描述 一行,乙個字元,a...

乙個決定,乙個轉折

距離2012年9月已經是第四個年頭,對於我,我想這是我這輩子做的第一件我很自豪,很開心的乙個決定,從生物轉向計算機,一直以來,我對自己的期望總是很高,比如說上高中的時候,希望自己至少考個二本,學習個自己喜歡的專業,然後為之奮鬥,有乙個非常激動人心的大學四年,再比如說以後賺很多很多錢,擁有屬於自己的公...