指针-回调函数

        今天学习了c语言的指针,不得不说c语言的指针真的是一块难啃的骨头啊,指针就一直在zu绕回来,绕回去,反复的套娃,而且今天的代码,是我写的最像代码的代码,虽然不是我写的,但是是我照着视频的思路一个字母一个敲出来的,虽然并没有完全记住,想要一次性记住似乎是不可能的只有不断的练习才可以逐渐的掌握,才可以写出更加有意义的代码,今天是我学习C语言的第14天,14天了,时间过得很快,我现在基本上每天都是在学习,c语言至少学习3小时,然后还会学习一些算法,并且还会看一些数学的知识,每日看一下高楼,以及这学期的高楼,睡前看一些哲学的视频,给我精神食粮。好像程序的生活没有我之前认为的那么枯燥无味,现在的我反而认为程序是一种美妙的存在,尽管很多的程序依旧是看不懂,尽管leetcode的算法题目一个都看不懂,但是怀揣着最初的信念,不抛弃不放弃,我还是相信能学好这一行的,未来就业应该是可以找的到工作的。好的下面进入今天的正题-----指针,代码内容不完全对,有一些错误,欢迎指出,非常愿意接受。

目录

1.简单函数

2.冒泡排序

3.冒泡排序升级版


1.简单函数

先通过一个简单函数来引出

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdlib.h>
#include<stdio.h>
//实现一个计算器可以计算加减乘除
void menu()
{ 
	printf("*******************************\n");
	printf("*******1.Sum    2.Sub    ******\n");
	printf("*******3.Mul    4.Div    ******\n");
	printf("***********0.exit**************\n");
}
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;
}
int main()
{
	int x = 0;
	int y = 0;
	int input=0;
	do
	{
		menu();
		printf("请输入:>");
		scanf("%d ",  &input);
		switch (input)
		{
		case 1:
			printf("请输入两个操作数:>");
			scanf("%d %d", &x, &y);
			printf("%d\n", Add(x, y));
			break;
		case 2:
			printf("请输入两个操作数:>");
			scanf("%d %d", &x, &y);
			printf("%d\n", Sub(x, y));
			break;
		case 3:
			printf("请输入两个操作数:>");
			scanf("%d %d", &x, &y);
			printf("%d\n", Mul(x, y));
			break;
		case 4:
			printf("请输入两个操作数:>");
			scanf("%d %d", &x, &y);
			printf("%d\n", Div(x, y));
			break;
		case 0:
			printf("退出");
			break;
		default:
			printf("选择错误");
			break;
		}
	} while (input);
}

这个代码实现的是计算机的一个功能,首先是一个menu函数,这个是自己定义的,设计一个菜单,1是加法2是减法3是乘法4是除法0是退出。然后自己定义了四个函数,分别来定义加减乘除,再用一个do while函数来循环,要有一个input变量来控制循环,循环内部是一个switch函数有6个分支,可以返回上面的函数。

2.冒泡排序

接下来是一个冒泡排序

#include<stdio.h>
#include<stdlib.h>
void bubble_Solt(int arr[],int sz)
{
	int i = 0;
	for (i = 0; i <sz-1 ;i++)
	{
		int j = 0;
		int tmp;
		for (j = 0; j < sz - 1-i;j++)
		{
			if (arr[j] > arr[j + 1])
			{
				tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int main()
{
	int i = 0;
	int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
	int sz = sizeof(arr) / sizeof(arr[0]); 
    bubble_Solt(arr, sz);
}

这个代码是先创建个数组存放数字,然后再使用sizeof函数计算数组一共有多少个元素,并给他们一个下标,把他们放到sz变量上面,最后也是函数的主体部分,在for循环里面还有一个for循环用来控制交换的如果左边的那个数比右边的那个数大那么就交换一次。这个冒泡排序在前面的文章也介绍过了这里就不作详细解说了。

3.冒泡排序升级版

在冒泡排序的基础上,我们从只可以对数进行排序扩展到对字符进行排序,扩展到对小数进行排序,但是整型数组只能存放整型,字符数组只能存放字符,浮点型数组只能存放浮点型,那么怎么把他们都使用冒泡排序进行传参调用呢,

这里就需要回调函数和qsort这个函数,这个是我目前学过最复杂的代码,由于今天晚上刚刚学完,所以我也并没有完全搞懂,还需要在以后的学习中才能逐渐搞懂,下面代码也会有几个错误,欢迎指正

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Stu
{
	char name[20];
	int age;
};
//实现bubble_soft函数的程序员,他是否知道未来排序的数据类型-不知道
//那程序员也不知道带比较的两个元素类型
//
void Swap(char* buf1,char* buf2,int width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}
void bubble_soft(void* base, int sz, int width,int (*cmp)(void*e1,void*e2))
{
	int i = 0;
	//趟数
	for (i = 0; i < sz; i++)
	{
		int j = 0;
		//每一趟比较对数
		for (j = 0; j < sz - 1 - i; j++)
		{
			//两个元素的比较
			if (cmp((char*)base+j*width,(char*)base+(j+1)*width)>0)
			{
				//交换
				Swap((char*)base + j*width, (char*)base + (j + 1)*width,width);
			}
		}
	}
}
int cmp_int(const void *e1,const void * e2)
{
	return *(int*)e1 - *(int*)e2;
}
int cmp_stu_by_age(const void* e1, void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
int cmp_stu_by_name(const void* e1, void *e2)
{

	return strcmp (((struct Stu*)e1)->name,((struct Stu*)e2)->name);
}
void test4()
{
	int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//使用bubble_soft的程序员一定知道自己排序的是什么数据
	//就应该知道如何比较带排序数组中的元素
	bubble_soft(arr,sizeof(arr[0]),cmp_int);
}
void test5()
{
	struct Stu s[3] = { {"zhangsan",19}, {"lisi",12}, {"wangwu",14} };
	int sz = sizeof(s) / sizeof(s[0]); 
	bubble_soft(s,sz,sizeof(s[0]),cmp_stu_by_age);
	bubble_soft(s, sz, sizeof(s[0]), cmp_stu_by_name);
}
int main()
{
	test4();
	test5();
	system("pause");
	return 0;
}

总结:只有不断的努力才能成功,做自己喜欢的事,让别人说去吧。自由!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值