c语言12-断言的使用、const使用、筛选法求素数、选择法排序

1.断言的使用-assert

assert断言:

在这里插入图片描述
assert 的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先打印一条出错信息,然后通过调用 abort 来终止程序运行。
(注:使用 assert 的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。)

头文件:

#include <assert.h>

使用

assert(表达式);
表达式为真,则什么都不做;
---------为假,则程序崩溃,并提示崩溃位置;
非常实用。
在debug版本有效,在release版本自动失效。

例子:

函数

int Div1(int a,int b)
{
	return a/b;
}
int Div2(int a,int b)
{
	assert(b != 0);
	if(b == 0)
	{
		return 0;
	}
	return a/b;
}

int main()
{
	//printf("%d\n",Div1(10,2));
	//printf("%d\n",Div1(5,2));
	//printf("%d\n",Div1(0,2));
	//printf("%d\n",Div1(10,0));//除0错误

	printf("%d\n",Div2(10,2));
	printf("%d\n",Div2(5,2));
	printf("%d\n",Div2(0,2));
	printf("%d\n",Div2(10,0));//除0错误

	return 0;
}

会崩溃
在这里插入图片描述
在这里插入图片描述

release版本自动失效,会崩溃,但不会弹出窗口

在这里插入图片描述

加了 if(b == 0){return 0;}后

release版本不会崩溃
在这里插入图片描述
debug版本还是会崩溃
在这里插入图片描述

指针传参数使用较多

在这里插入图片描述
NULL:空指针,无效指针,不能解引用;

2.const使用

const:定义常变量,值不能修改,只读;
在这里插入图片描述

(1)基本类型对于const是透明的

const int ca = 10;
等价于
int const cb = 10;

(2)const 修饰直接右边,将其变为只读

const int *cp1 = &a;
//cp1 = &b;//可以
//*cp1 = 100;//error
int const *cp2 = &a;
//cp2 = &b;//可以
//*cp2 = 100;//error
int *const cp3 = &a;
//cp3 = &b;//error
//*cp3 = 100;//可以

(3)权限只能同等传递或者缩小传递

int main()
{
	int a = 10;
	int b = 20;
	const int ca = 10;
	const int cb = 20;
	int *p1 = &a;
	//*p1 = 100;
	//p1 = &b;
	//int *p2 = &ca;//error
	//*p2 = 100;//与ca不能改相冲突
	const int *p3 = &a;
	const int *p4 = &ca;
	//*p4 = 100;//error
	int *const p5 = &a;
	//p5 = &b;//error
	//int *const p6 = &ca;//error
	const int *const p7 =&a;//不用,不能读不能写,没有实用价值
	//p7 = &b;//error
	//*p7 = 100;//error

	return 0;
}

3.筛选法求素数

思想:从2开始,开始加加,逐个将当前数字的倍数删除;
难点:如何删除?
方案一:标记。用另一个数组标记
在这里插入图片描述

代码实现:

void SiftPrime()//暂时没有优化,没有使用动态内存
{
	int arr[101];//标记变量
	int i;
	for(i=0;i<101;i++)
	{
		arr[i]=1;
	}

	arr[1]=arr[0] =0;//0和1不参与

	for(i=2;i<101;i++)
	{
		for(int j=i+1;j<101;j++)
		{
			if(j%i == 0)//j是i的倍数,则j不是素数
			{
				arr[j] = 0;
			}
		}
	}

	for(i=0;i<101;i++)
	{
		if(arr[i] == 1)//是素数
		{
			printf("%d\n",i);
		}
	}
}

int main()
{
	SiftPrime();

	return 0;
}

结果:

在这里插入图片描述

4、选择法排序

思路:

逐个选出当前的最小值;
在这里插入图片描述

代码:

//选择法排序
void SelectSort(int *arr,int len)
{
	int tmp;
	int minledex;//保存最小值的下标
	for(int i=0;i<len-1;++i)
	{
		minledex=i;
		for(int j=i;j<len;j++)
		{
			if(arr[j] < arr[minledex])
			{
				minledex =j;
			}
		}

		//将待排序第一个值和第一个值和最小值交换
		tmp = arr[minledex];
		arr[minledex] = arr[i];
		arr[i] = tmp;
	}
}

void Show(const int *arr,int len)
{
	for(int i=0;i<len;i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[]={0,52,1,23,41,52,12,6,8,4,2};

	SelectSort(arr,sizeof(arr)/sizeof(arr[0]));

	Show(arr,sizeof(arr)/sizeof(arr[0]));

	return 0;
}

结果:

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值