c语言实现五种数据交换

不多bb,直接上代码

#include <stdio.h>
#include <string.h>
#include <limits.h>    	// 整型数的最大最小值定义在该文件下
#include <float.h>    	// 浮点数数的最大最小值定义在该文件下

/*数据类型,用于测试*/
#if 1
	typedef int data;
	const char* cDateType = "int";
#else 
	typedef char data;
	const char* cDateType = "char";
#endif
/*数据类型,用于测试*/

unsigned long DataMax(const char* type);
int swap1(data *m, data *n);	// 临时变量保存交换,一般推荐
int swap2(data *m, data *n);	// 加法乘法交换,只实现了加法,乘法不推荐
int swap3(data *m, data *n);	// 异或交换,推荐
int swap4(data *m, data *n);	// 说了思路,代码未实现,不推荐

// 主函数入口
int main(int argc, char const *argv[])
{
	// 测试用例
	data a = 8;
	data b = 5;

	printf("***:%d %d\n", a, b);
	
	swap1(&a, &b);
	printf("---:%d %d\n", a, b);

	swap2(&a, &b);
	printf("---:%d %d\n", a, b);

	swap3(&a, &b);
	printf("---:%d %d\n", a, b);
	
	return 0;
}

// 临时变量保存交换
int swap1(data *m, data *n)
{
	if(!m || !n)	// 对输入参数的合法性进行判断
	{
		printf("[%s][%s][%d] parameter error\n", __FILE__, __FUNCTION__, __LINE__);
		return -1;
	}
	data t;			// 引用临时变量存储
	t = *m;
	*m = *n;
	*n = t;
	return 0;
}

// 加法乘法交换(考虑越界问题,乘法更容易越界,方法和加法一样)
int swap2(data *m, data *n)
{
	if(!m || !n)	// 对输入参数的合法性进行判断
	{
		printf("[%s][%s][%d] parameter error\n", __FILE__, __FUNCTION__, __LINE__);
		return -1;
	}
	if((unsigned long)(*m + *n) > DataMax(cDateType))	// 是否越界
	{
		printf("[%s][%s][%d] parameter error\n", __FILE__, __FUNCTION__, __LINE__);
		return -1;
	}
	*m = *m + *n;
	*n = *m - *n;
	*m = *m - *n;
	return 0;
}

// 异或交换,这个方法比较推荐,不用考虑越界问题
int swap3(data *m, data *n)
{
	if(!m || !n)	// 对输入参数的合法性进行判断
	{
		printf("[%s][%s][%d] parameter error\n", __FILE__, __FUNCTION__, __LINE__);
		return -1;
	}
	*m = *m ^ *n;
	*n = *m ^ *n;
	*m = *m ^ *n;

	return 0;
}

// 还有移位交换	这个简单说下思路不实现具体代码
/*	
	如果是char类型,把它拆分为高四位和低四位,局限性在于字符型数据本身占用了5位就会运算序错误
	如果是int类型, 把它拆分为高16位和低16位,
	其他的同理,把其中一个数据的低位左移到高位,然后再右移赋值,这个和加法乘法比较类似,不过要求每个数据都只能用了一半的位,所以不建议使用
*/
int swap4(data *m, data *n)
{
	if(!m || !n)	// 对输入参数的合法性进行判断
	{
		printf("[%s][%s][%d] parameter error\n", __FILE__, __FUNCTION__, __LINE__);
		return -1;
	}

}

// 返回数据类型的最大值,用于越界判断
unsigned long DataMax(const char* type)
{
	unsigned long max;
	if(!type)
	{
		printf("[%s][%s][%d] parameter error\n", __FILE__, __FUNCTION__, __LINE__);
		return -1;
	}

	// 判断数据类型
	if(strcasecmp("char", type) == 0)	// windows是stricmp,linux是strcasecmp.不区分大小写比较字符串
	{
		max = CHAR_MAX;
	}
	else if(strcasecmp("unsigned char", type) == 0)
	{
		max = CHAR_MAX;
	}
	else if(strcasecmp("short", type) == 0)
	{
		max = SHRT_MAX;
	}
	else if(strcasecmp("unsigned short", type) == 0)
	{
		max = USHRT_MAX;
	}
	else if(strcasecmp("int", type) == 0)
	{
		max = INT_MAX;
	}
	else if(strcasecmp("long", type) == 0)
	{
		max = LONG_MAX;
	}
	else if(strcasecmp("unsigned long", type) == 0)
	{
		max = ULONG_MAX;
	}
	else	// 懒,剩下的不想写了,最小值一个道理,只是需要注意下需要用合适的数据保存值
	{
		printf("[%s][%s][%d] parameter error\n", __FILE__, __FUNCTION__, __LINE__);
		return -1;
	}
	return max;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值