#define _CRT_SECURE_NO_MARNINGS 1标签:sz,arr,进阶,10,int,void,sizeof,指针 From: https://blog.51cto.com/u_15812356/5801963
#include<stdio.h>
//复习
//int ADD(int x, int y)
//{
// return x + y;
//}
//int main()
//{
// //int arr[2] = { 1,2 };
// ////指针数组
// //int* arr[10];
// ////数组指针
// //int (* pa)[10] = &arr;
// ////函数指针
// //int (*p)(int, int) = &ADD;
// //int sun=(*p)(1, 2);//int sun=p(1,2)
// //printf("%d\n", sun);//函数指针调用
// ////函数指针数组
// //int (*pp[4])(int, int) = { ADD,ADD,ADD,ADD };
// //指向函数指针数组的指针
// //int* ((*ppp[4])(int, int)) = &pp;
//
// return 0;
//}
//回调函数的应用
//1.冒泡排序
//#include<Stdio.h>
//void bubble_sort(int arr[10], int sz)
//{
// int i = 0, j = 0;
// for (i = 0; i < sz-1; i++)//sz-1表示需要进行sz-1趟对比
// {
// for (j = 0; j < sz-1-i; j++)
// {
// if (arr[j] > arr[j + 1])//升序
// {
// int itemp=arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = itemp;
//
// }
// }
// }
//}
//int main()
//{
// int arr[10] = { 0,9,8,7,6,5,4,3,2,1 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// bubble_sort(arr, sz);
// for (int i = 0; i < 10; i++)
// {
// printf("%d ", arr[i]);
// }
// return 0;
//}
//2.证明冒泡排序不能进行多种类型数据排序
//#include<Stdio.h>
//void bubble_sort(int arr[10], int sz)
//{
// int i = 0, j = 0;
// for (i = 0; i < sz - 1; i++)//sz-1表示需要进行sz-1趟对比
// {
// for (j = 0; j < sz - 1 - i; j++)
// {
// if (arr[j] > arr[j + 1])//升序
// {
// int itemp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = itemp;
//
// }
// }
// }
//}
//struct stu
//{
// char name[20];
// int age;
//};
//int main()
//{
// int arr[10] = { 0,9,8,7,6,5,4,3,2,1 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// struct stu s[3] = { {"zhangsan",20},{"lisi",30},{"wangwu",10} };//冒泡排序不能排序这类型数据
// float f[] = { 9.0,8.0,7.0,6.0,5.0,4.0,3.0 };//冒泡排序不能排序这类型数据
// //bubble_sort(f, sz);//错误代码因为此时的冒泡排序只能拍int类型的数组,不能排序其他类型,说明该冒泡排序不好,原因是该冒泡排序不能够通用;
// bubble_sort(arr, sz);
// for (int i = 0; i < 10; i++)
// {
// printf("%d ", arr[i]);
// }
// return 0;
//}
//3.qstor函数的介绍及演示
//(1)介绍
//#include<stdio.h>
//int main()
//{
// //qsort-库函数-排序(快速任意类型的数据排序) 函数申明:#include<stdlib.h>
// //qosrt有四个参数
// void qsort(
// void* base, //1.void类型的指针且指针名为base
// size_t num,//2.数组的大小(数组有几个元素)
// size_t width,//3. 宽度。(一个元素有几个字节)
// //4.比较函数
// int( * compare)(const void* eem1, const void* elem2));//4.函数指针:指针名称:compare,函数指针名:*(compare),数据类型const void,名字:eem1,eem2
// //elem1与elem2是要比较的那个两个参数的地址(接收要比较元素的地址)
// //void*的解释:
// int a = 10;
// //int* p = &a;
// //char* pc = &a;//错误代码:因为不能接收不同类型的元素的地址
// //char ch = 'w';
// void* p = &a;//void*可以接收任意类型的地址(可以理解为一个可以存放任何数据地址的万能桶)
// *p = 0;//报错:表达式必须是指向完整对象类型的指针
// //原因是void*是无类型的数据,如若解引用也不知道该如何使用所以报错;
// //结论:void*指针不能进行解引用操作;
// p++;
// //同理:void*的指针不能进行“+、-”操作:原因:进行“+、-”运算前要定义类型
// //对qsort函数的要求如下:
// // //1.当e1(比较的第一个元素)<e2(比较的第二个元素)函数返回一个小于0的数
// //2.当e1(比较的第一个元素)>e2(比较的第二个元素)函数返回一个大于0的数
// //3.当e1(比较的第一个元素)=e2(比较的第二个元素)函数返回一个等于0的数
// return 0;
//}
//(2)演示:让冒泡排序排各种数据
//#include<Stdio.h>
//#include<stdlib.h>
//#include<string>
//void bubble_sort(int arr[10], int sz)
//{
// int i = 0, j = 0;
// for (i = 0; i < sz - 1; i++)//sz-1表示需要进行sz-1趟对比
// {
// for (j = 0; j < sz - 1 - i; j++)
// {
// if (arr[j] > arr[j + 1])//升序
// {
// int itemp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = itemp;
//
// }
// }
// }
//}
// 整形比较
//int cmp_int(const void* e1, const void* e2)
//{
// //比较两个整型数据
// return *(int*)e1 - *(int*)e2;
//
//}
//void test()
//{
//int arr[10] = { 0,9,8,7,6,5,4,3,2,1 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// qsort(arr, sz, sizeof(arr[0]), cmp_int);
// for (int i = 0; i < 10; i++)
// {
// printf("%d ", arr[i]);
// }
//}
//int main()
//{
// test();
// return 0;
//}
//浮点型数据比较
//int cmp_float(const void* e1, const void* e2)
//{
// return *(float*)e1 - *(float*)e2;
//}
//void test2()
//{
// float f[10] = { 10.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0,1.0 };
// int sz = sizeof(f) / sizeof(f[0]);
// qsort(f, sz, sizeof(f[0]), cmp_float);
// for (int i = 0; i < 10; i++)
// {
// printf("%f ",f[i]);
// }
//}
//int main()
//{
// test2();
// return 0;
//}
#include<Stdio.h>
#include<stdlib.h>
#include<string>
//结构体比较
struct stu
{
char name[20];
int age;
};
int cmp_sturst_by_age(const void* e1, const void* e2)
{
return ((struct stu*)e1)->age -((struct stu*)e2)->age;
}
int cmp_sturst_by_name(const void* e1, const void* e2)
{
//比较名字的比较字符串
//字符串比较不能直接用><=来比较,应该用strcmp函数(头文件为#include<string.h)比较;
return strcmp(((struct stu*)e1)->name , ((struct stu*)e2)->name);
}
void test3()
{
struct stu s[3] = { {"zhangsan",20},{"lisi",30},{"wangwu",10} };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), cmp_sturst_by_age);
qsort(s, sz, sizeof(s[0]), cmp_sturst_by_name);
for (int i = 0; i < 3; i++)
{
printf(" %d %f ", s[i]);
}
}
int main()
{
test3();
return 0;
}