引言

     这是关于C中如何使用异常机制的讨论.顺带讲一讲C中魔法函数的setjmp内部机制.
通过它实现高级的异常try...catch. 允许我先扯一段面试题. 对于计算机面试题. 算法题等.觉得还是有意义的.

在你封装基础库的时候会简单用的.因为大家都会得你也会那是及格.如果你想及格+1的话...

开始吧,题目是这样的

/*
 *  面试问题 假如有数组 int a[] = {1,2,3,4,5,6,7}, n = 7表示长度, k = 2表示移动步长
 * 移动结果变成 1234567=> 6712345. 
 * 同样假如 k=3移动三步 1234567=> 5671234
 * 实现一个移动函数
 * void convert(int a[], int n, int k);
 */

的时候基本基本说算法. 这里主要想通过这个问题引导异常机制上来.直接贴代码

// 数组移动函数
void 
convert(int a[], int n, int k) {
    int t=1, i, j;// t是为了数据记录终止条件的
    // 前面两个是没有移动的必要, 后面是已经整除形成周期了也不需要移动
    if ((!a) || (n <= 1) || !(k %= n)) return;
    // 计算最优的k和n
    k = k < 0 ? k + n : k;
        
    // 开始真的移动了, 首先确定趟数, 一般趟就够了,特殊的就是能够整除的需要多趟
    
    for (i = 0; t<n && i < k; ++i) {
        //开始循环了, 结束条件式循环到头了
        for (j = (i + k) % n; j != i; j = (j + k) % n) {
            ++t;
            int tmp = a[i];
            a[i] = a[j];
            a[j] = tmp;
        }
    }
}

关于上面

    // 前面两个是没有移动的必要, 后面是已经整除形成周期了也不需要移动
    if ((!a) || (n <= 1) || !(k %= n)) return;

就是C中最简单的异常机制听过事先 if判断条件达到异常应对作用. 应该是最简单的异常处理, 也是常用的一种方式.

附录完整的测试demo.c

#include <stdio.h>
#include <stdlib.h>

// 数组打印函数
void aprint(int a[], int n);
// 数组移动函数
void convert(int a[], int n, int k);

//添加一个数组打印宏, a只能是数组
#define ALEN(a) \
    sizeof(a)/sizeof(*a)
#define APRINT(a) \
    aprint(a, ALEN(a))

/*
 *  面试问题 假如有数组 int a[] = {1,2,3,4,5,6,7}, n = 7表示长度, k = 2表示移动步长
 * 移动结果变成 1234567=> 6712345. 
 * 同样假如 k=3移动三步 1234567=> 5671234
 * 实现一个移动函数
 * void convert(int a[], int n, int k);
 */
int main(int argc, char* argv[]) {
    // 实现主体逻辑
    int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    
    APRINT(a);
    convert(a, ALEN(a), 4);
    APRINT(a);
    convert(a, ALEN(a), -4);
    APRINT(a);

    return system("pause");
}

// 数组打印函数
void 
aprint(int a[], int n) {
    int i = -1;
    printf("now data: ");
    while (++i < n)
        printf("%d", a[i]);
    putchar('\n');
}

// 数组移动函数
void 
convert(int a[], int n, int k) {
    int t=1, i, j;// t是为了数据记录终止条件的
    // 前面两个是没有移动的必要, 后面是已经整除形成周期了也不需要移动
    if ((!a) || (n <= 1) || !(k %= n)) return;
    // 计算最优的k和n
    k = k < 0 ? k + n : k;
        
    // 开始真的移动了, 首先确定趟数, 一般趟就够了,特殊的就是能够整除的需要多趟
    
    for (i = 0; t<n && i < k; ++i) {
        //开始循环了, 结束条件式循环到头了
        for (j = (i + k) % n; j != i; j = (j + k) % n) {
            ++t;
            int tmp = a[i];
            a[i] = a[j];
            a[j] = tmp;
        }
    }
}
View Code

相关文章: