C语言语法学习记录
目录
启用断言测试宏
//#undef _EXAM_ASSERT_TEST_ //禁用
#define _EXAM_ASSERT_TEST_ //启用
#ifdef _EXAM_ASSERT_TEST_ //启用断言测试
void assert_report(const char * file_name, const char * function_name, unsigned int line_no)
{
printf("\n[EXAM]Error Report file_name: %s, function_name: %s, line %u\n",
file_name, function_name, line_no);
abort();
}
#define ASSERT_REPORT( condition ) \
do{ \
if ( condition ) \
NULL; \
else \
assert_report( __FILE__, __func__, __LINE__ ); \
}while(0)
#else // 禁用断言测试
#define ASSERT_REPORT( condition ) NULL
#endif /* end of ASSERT */
插入法排序
#include<stdio.h>
#include<stdlib.h>
#define N 100
void main()
{
int arr[N], nj, ni, i, h;
for (i = 0; i < N; i++)
{
arr[i] = rand();
}
for (i = 1; i < N; i++)
{
h = arr[i];.
for (ni = i - 1; ni >= 0; ni--)
{
if (h < arr[ni])
{
arr[ni + 1] = arr[ni];
arr[ni] = h;
}
}
}
for (i = 0; i < N; i++)
{
printf("%d\t", arr[i]);
}
system("pause");
}
函数并不能改变实参的值
- 下面的例子将证明,即使用swap函数对a,b做了交换,也是没有效果的。
#include<stdio.h>
void swap(int a, int b);
void main()
{
int a, b;
a = 1;
b = 2;
swap(a, b);
printf("%d,%d\t", a, b);
system("pause");
}
void swap(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
- 但是用指针来作为传递就会有效。我们对上面的例子稍作更改,如下:
#include<stdio.h>
void swap(int a, int b);
void main()
{
int a, b;
a = 1;
b = 2;
swap(&a, &b);
printf("%d,%d\t", a, b);
system("pause");
}
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
数组的函数传递均为引用传递,即将数组的首地址传给函数的形参。所以形参的数组如何定义都可。如:void nzp(int a[])
或者void nzp(int a[10])
。都是没问题的。
并归排序
- 这里只给出函数,如需测试请在主函数中调用
mergesort()
函数。
#include <stdlib.h> /*含ma l l o c ( ) 的头文件*/
#include <stdio.h>
void merge(int *arr, int p, int q, int r) {//定义arr指向数组首地址(这里定义为arr[]或arr[“随意数字”]也可以),p为数组首位,q为中间位,r为末位
int n1, n2, i, j, k, *arrl, *arrr;
n1 = q - p + 1;//定义n1为p到q的元素个数
n2 = r - q;//定义n2为q+1到r的元素个数
arrl = (int*)calloc(n1, sizeof(int));//为arrl动态分配n1个int内存
arrr = (int*)calloc(n2, sizeof(int));//未arrr动态分配内存
if (arrl == NULL || arrr == NULL)//判断内存是否分配成功,如果不成功则关闭程序
{
abort();
}
for (i = 0; i < n1; i++)//将arr数组的前p到q个赋给arrl
{
arrl[i] = arr[p + i];
}
for (i = 0; i < n2; i++)//将arr数组的q+1到r个赋给arrr
{
arrr[i] = arr[q + 1 + i];
}
i = j = 0;//i,j重新归零,指向数组的首个位置
for (k = p; k <= r; k++)//数组合并并排序
{
if ((arrl[i]<arrr[j] && i<n1) || j >= n2)//i<n1是防止arrl越界,j >= n2是防止arrr越界。越界的值很有可能为0,造成条件一直成立。
{
arr[k] = arrl[i++];//将小的值放到arr数组中并且i加1
}
else
{
arr[k] = arrr[j++];
}
}
free(arrl);//释放arrl动态内存
free(arrr);//释放arrr动态内存
arrl = arrr = NULL;//将指针归零,此步骤不可省去,否则会产生野指针
}
void mergesort(int *arr, int p, int r) {
if (p < r)
{
int q;
q = (r + p) / 2;
mergesort(arr, p, q);
mergesort(arr, q + 1, r);
merge(arr, p, q, r);
}
}