這是系統級程式設計課程的第乙個實驗報告。
一、場景描述
用函式指標陣列存放各種排序演算法,通過指標去呼叫演算法進行排序。
在本程式中,一共定義了4種排序演算法——選擇排序、插入排序、希爾排序、歸併排序(當然後期還能加入更多的排序演算法,比如氣泡排序) 。定義了乙個通用排序介面void sort(void (sortalgorithm)(int,int),int *array, int n) ,在主程式中由使用者選擇使用何種排序演算法,呼叫sort方法,傳入函式指標陣列中對應的項,進行排序並且輸出排序後的結果。
二、**
/*
* 函式指標陣列的應用————多種排序演算法
* 用函式指標陣列存放各種排序演算法,通過指標去呼叫演算法進行排序
*/#include
//比較大小
int less(int v, int w)
else
return0;}
//交換位置
void exch(int *array,int v, int w)
//列印陣列
void show(int *array, int n)
printf("\n");
}//選擇排序
void selectsort(int *array, int n)
}exch(array, min, i);
}}//插入排序
void insertsort(int *array, int n)
}}//希爾排序
void shellsort(int *array, int n)
while (h >= 1)
}h = h/3;
}}//歸併排序
void merge(int *array,int lo,int mid,int hi, int *aux)
for (int l = lo; l <= hi; ++l)
}void mergesortrecursive(int *array,int lo,int hi, int *aux)
void mergesort(int *array, int n)
//通用排序介面,傳入的是函式指標,具體視傳入的是哪個排序演算法而定
void sort(void (*sortalgorithm)(int*,int),int *array, int n)
int main(int argc, char *args) ;
printf("這是乙個簡單的應用函式指標陣列的例子————多種排序演算法\n");
printf("請輸入整數的個數:");
scanf("%d", &count);
intarray[count];
printf("請輸入你想排序的整數列:");
for (int i = 0; i < count; ++i)
printf("請選擇排序方式:\n");
printf("1----選擇排序\n");
printf("2----插入排序\n");
printf("3----希爾排序\n");
printf("4----歸併排序\n");
int choice;
scanf("%d", &choice);
printf("排序後的結果如下:");
sort(sortalgorithm[choice-1], array, count);
return
0;}
三、程式優勢
在主程式中只要呼叫sort方法,就可以不需要編寫switch語句就能實現呼叫不同排序演算法的功能。
四、理解與收穫
函式指標就是指向函式的儲存空間位址的指標,可以對函式指標進行賦值並且通過函式指標來呼叫函式,它的本質是乙個指標。每乙個函式都有乙個入口位址,通過將函式名賦值給函式指標,也就是使函式指標指向該入口位址。
函式指標有兩個用途:呼叫函式和做函式的引數。本程式主要是使用了它做函式引數的功能。通過傳入不同的函式,就可以呼叫不同的排序演算法。提供了呼叫的靈活性,簡化結構,某種程式上也是實現了物件導向程式設計的多型性。
而函式指標陣列,就是乙個包含多個函式指標的陣列,這樣可以將多個函式進行統一標識。這體現在選單驅動系統中。例如本程式就是提示使用者輸入乙個整數值來選擇排序演算法選單中的乙個選項。使用者的選擇可以做函式指標陣列的下標,而陣列中的指標可以用來呼叫函式。
C語言函式指標實驗
上次看atmel的示例工程,發現人家使用了函式指標的結構體 函式指標結構體 感嘆人家的c語言功夫審核,自己費勁還是只能讀懂的份。不過,函式指標確實好用。今天就試試這個超牛的東西。now let s see how function pointers can help us.函式指標的宣告方法為 函式...
記一次實驗 複雜函式指標的呼叫
下午突然發憤決定搞定複雜指標的相關問題,看了幾篇大大們的文章後,感覺略有收穫。個人的總結 從非保留字讀起,如果有多個非保留字 如函式指標中的形參名,雖然這並沒有必要 從最左邊的讀起。此後,如果遇到右括號,則向左讀。如果遇到左括號,則向右讀,讀完所有括號後再按優先順序分析一次。我們來試一試,我會說的詳...
函式指標例程一
有兩個我認為值得分析的指標例程,希望大家看了能對大家有幫助 eg1 include int main int p1 int a 1 int p2 int int a 1 int p3 int a 1 printf d,d,d n p1 1 p2 0 p3 1 return 0 這是第乙個例程,編譯之...