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;
}