#define _CRT_SECURE_NO_WARNINGS 1
//實列2:分析以下代碼
//代碼1
//(*(viod(*)())0)();
//解釋如下:
// 現有一個數為:0,将0的類型強制轉化為void(*)()的函數指針類型:(void(*)())0,調用0這個位址處的該函數(*(void(*)())0)()
//代碼2
//void (*signa1(int, void(*)(int)))(int);
//
//解釋如下:
// 1.整體解釋
//有一個名為signa1(int, void(*)(int))的函數指針,元素類型為int,傳回值為void.
// 2.函數指針名解釋:
// 有一個名為signal的函數,元素類型為int和void(*)(int)(函數指針類型)
// 簡寫:
//typedef void(*pfun_t)(int);
//pfun_t signal(int,pfun_t);
//解釋如下:
//将void(*)(int)傳回值為void的函數指針類型且元素類型為int的函數指針類型通過typedef對整體重新命名為pfun_t:typedef void(*pfun_t)(int);
//用通過typedef整體重新命名為pfun_t的函數指針類型,帶入函數名為signal的函數且函數的元素類型為int和通過typedef整體重新命名為pfun_t的函數指針類型;
//#include<stdio.h>
//int ADD(int z, int y)
//{
// return z + y;
//}
//int main()
//{
// int (*pa)(int, int) = ADD;
// printf("%d\n", (pa)(2, 3));
// printf("%d\n", (*pa)(2, 3));//"*"作用不大可省略,若要用必須加上“()”
// return 0;
//}
//
//
//函數指針數組
//列題1:
//#include<stdio.h>
//int ADD(int z, int y)
//{
// return z + y;
//}
//#include<stdio.h>
//int SUB(int z, int y)
//{
// return z -y;
//}
//#include<stdio.h>
//int MUL(int z, int y)
//{
// return z * y;
//}
//#include<stdio.h>
//int DIV(int z, int y)
//{
// return z / y;
//}
//int main()
//{
// //指針數組
// int* arr[5];
// //pa存放的是一個函數指針
// int (*pa)(int, int) = ADD;
////函數指針數組:若需要存放多個函數指針既要用到數組形式如下
// //注意:數組是存放相同類型資料的存儲空間;
// int(*parr[4])(int, int)={ADD,SUB,MUL,DIV};//函數指針數組
// int i = 0;
// for(i = 0; i < 4; i++)
// {
// printf("%d\n", parr[i](2, 3));
// }
// return 0;
//}
//列題2:
//char* my_strcpy(char* dest, const char* src);
////1.通過上面函數寫一個函數指針pf,能夠指向my_strcpy;
//
////2.寫一個函數指針數組,能夠存放四個my_strcpy函數的位址;
//#include<stdio.h>
//int main()
//{
// //1.答
// char* (*pf)(char*,const char*) = my_strcpy;
// //2.答
// char* (*pfArr[4])(char*, const char*) = { my_strcpy,my_strcpy,my_strcpy,my_strcpy };
// return 0;
//}
//列題3:函數指針數組的用途:轉移表
//列子:計算機
//1.普通輸出
//#include<stdio.h>
//
//int ADD(int x, int y)
//{
// return x + y;
//}
//int SUB(int x, int y)
//{
// return x - y;
//}
//int MUL(int x, int y)
//{
// return x * y;
//}
//int DIV(int x, int y)
//{
// return x / y;
//}
//void menu()
//{
// printf("***************************\n");
// printf("*****1.ADD*******2.SUB*****\n");
// printf("*****3.DIV*******4.MUL*****\n");
// printf("***********0.退出**********\n");
// printf("***************************\n");
//}
//int main()
//{
// int input = 0;
// int x, y;
// do {
// menu();
// printf("請輸入資料:\n");
// scanf("%d", &input);
// switch (input)
// {
// case 1:
// printf("請輸入兩個資料:\n");
// scanf("%d%d", &x, &y);
// printf("%d\n",ADD(x,y));
// break;
// case 2:
// printf("請輸入兩個資料:\n");
// scanf("%d%d", &x, &y);
// printf("%d\n", SUB(x, y));
// break;
// case 3:
// printf("請輸入兩個資料:\n");
// scanf("%d%d", &x, &y);
// printf("%d\n", MUL(x, y));
// break;
// case 4:
// printf("請輸入兩個資料:\n");
// scanf("%d%d", &x, &y);
// printf("%d\n", DIV(x, y));
// break;
// case 0:
// printf("退出\n");
// break;
// default:
// printf("輸入錯誤,請重新輸入:");
// break;
// }
// } while (input);
// return 0;
//}
//2.利用函數指針數組的形式解決:
//#include<stdio.h>
//
//int ADD(int x, int y)
//{
// return x + y;
//}
//int SUB(int x, int y)
//{
// return x - y;
//}
//int MUL(int x, int y)
//{
// return x * y;
//}
//int DIV(int x, int y)
//{
// return x / y;
//}
//void menu()
//{
// printf("***************************\n");
// printf("*****1.ADD*******2.SUB*****\n");
// printf("*****3.DIV*******4.MUL*****\n");
// printf("***********0.退出**********\n");
// printf("***************************\n");
//}
//int main()
//{
// int input=0,x=0,y=0;
// int (*pfARR[5])(int, int) = { 0,ADD,SUB,MUL,DIV};//這樣的函數指針數組被稱為轉移表
// do
// {
// menu();
// printf("請輸入選擇:\n");
// scanf("%d", &input);
// if (input >= 1&&input <= 4)
// {
//
// printf("請輸入兩個資料:\n");
// scanf("%d%d", &x, &y);
// printf("%d\n", (*pfARR[input])(x, y));
// }
// else if (input == 0)
// {
// printf("退出\n");
// }
// else
// printf("輸入錯誤請從新輸入:");
// } while (input);
// return 0;
//}
//3.回調函數;觀察可知case:以下的多條語句形式一緻則可建立一個函數進行回調
//回調函數就是一個通過函數指針調用的函數.如果你把函數的指針(位址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,
// 我們說它就是回調函數。回調函數不是有函數的實作方直接調用,而是在特定的事件或者條件時由;另外的一方調用的。用于對該事件或條件進行響應;
// (1)列1:
//#include<stdio.h>
//
//int ADD(int x, int y)
//{
// return x + y;
//}
//int SUB(int x, int y)
//{
// return x - y;
//}
//int MUL(int x, int y)
//{
// return x * y;
//}
//int DIV(int x, int y)
//{
// return x / y;
//}
//void menu()
//{
// printf("***************************\n");
// printf("*****1.ADD*******2.SUB*****\n");
// printf("*****3.DIV*******4.MUL*****\n");
// printf("***********0.退出**********\n");
// printf("***************************\n");
//}
//void Cale(int (*pf)(int, int))//回調函數
//{
// int x = 0, y = 0;
// printf("請輸入兩個資料:\n");
// scanf("%d%d", &x, &y);
// printf("%d\n", (*pf)(x, y));
//}
//int main()
//{
// int input = 0;
// int x, y;
// do {
// menu();
// printf("請輸入資料:\n");
// scanf("%d", &input);
// switch (input)
// {
// case 1:
// Cale(ADD);
// break;
// case 2:
// Cale(SUB);
// break;
// case 3:
// Cale(MUL);
// break;
// case 4:
// Cale(DIV);
// break;
// case 0:
// printf("退出\n");
// break;
// default:
// printf("輸入錯誤,請重新輸入:");
// break;
// }
// } while (input);
// return 0;
//}
// (2)列2:冒泡排序
//1>普通冒泡排序
//了解qosort
#include<stdio.h>
void sort(int arr[], int M)
{
int i, iTemp;
for (i = 0; i < M - 1; i++)
{
int j;
int DUI = 1;
for (j = 0; j < M - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
iTemp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = iTemp;
DUI = 0;
}
}
if (DUI == 1)
{
break;
}
}
}
int main()
{
int arr[] = { 3,4,1,2,6,5,8,7,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
sort(arr, sz);
for (int i = 0; i < sz; i++)
{
printf(" %d ", arr[i]);
}
return 0;
}
//4.指向函數指針數組的指針
//#include<stdio.h>
//int ADD(int x, int y)
//{
// return x + y;
//}
//int main()
//{
// int arr[10] = { 0 };
// int(*p)[10] = &arr;//指向數組指針的指針
//
// int(*pf)(int, int) = &ADD;//指向函數指針的指針
// int (*pfArr[4])(int, int)={ADD,ADD,ADD,ADD};//函數指針數組
// int * (*ppfArr[4])(int, int) = &pfArr;//指向函數指針數組的指針
//
// return 0;
//}