C语言经典案例——第五章 指针(上)

本篇提供了关于C语言程序设计中指针部分的经典案例,可供C语言的初学者们进行一个学习和编译练习。

/*Case 1
爸爸在哪儿
晚餐时间,妈妈做好了美味的晚餐,去楼上叫爸爸和宝宝吃饭,到了卧室,发现只有宝宝,妈妈想:“爸爸在哪?”。
妈妈先让宝宝下楼去餐桌旁,然后走到书房,在书房找到正在看书的爸爸。
假设将宝宝和爸爸视为变量,书房和卧室视为存储空间,请编程求出他们在内存中的位置*/

int main() {
    int father = 1;                         //定义爸爸变量
    int baby = 2;                           //定义宝宝变量
    int* sturoom, * bedroom;                //定义指针
    int* dad = &father;                     //获取爸爸的地址
    sturoom = dad;                          //使用爸爸变量的地址为指针sturoom赋值
    bedroom = &baby;                        //取宝宝变量的地址赋值给指针bedroom
    //输出地址
    printf("爸爸所在的地址为:%x\n", sturoom);
    printf("宝宝所在的地址为:%x\n", bedroom);
    // 输出变量存储的数值
    printf("爸爸为:%d\n", *sturoom);
    printf("宝宝为:%d\n", *bedroom);
    return 0;
}

C语言经典案例——第五章 指针(上)_第1张图片

/*Case 2
猜宝游戏
某个课间,甲和乙一起玩猜硬币的游戏:初始时,甲的左手握着一枚硬币,游戏开始后,甲进行有限次或真或假的交换,最后由乙来猜测这两只手中是否有硬币
编写程序,实现游戏过程*/

//函数定义
void exc1(int l, int r) {
    int temp;
    temp = l;            //交换形参的值
    l = r;
    r = temp;
}
void exc2(int* l, int* r) {
    int* temp;
    temp = l;            //交换形参的值
    l = r;
    r = temp;
}
void exc3(int* l, int* r) {
    int temp;
    temp = *l;           //交换形参变量指向内容的值
    *l = *r;
    *r = temp;
}
函数声明
//void exc1(int l, int r);
//void exc2(int* l, int* r);
//void exc3(int* l, int* r);
//游戏模拟
//使用随机函数获取交换的次数,和每次交换所选择的函数
int main() {
    int a = 0, i = 0, j;
    int l = 1, r = 0;
    srand((unsigned int)time(NULL));
    i = 5 + (int)(rand() % 5);             //随机设置交换的次数
    j = i;
    printf("a:%d,i:%d\n", a, i);
    printf("原始状态:\n");
    printf("l=%d,r=%d\n\n", l, r);
    while (i>0)
    {
        i--;
        a = 1 + (int)(rand() % 3);
        switch (a)
        {
        case 1:
            exc1(l, r);
            printf("exc1-第%d次交换后的状态\n", j - i);
            printf("l=%d,r=%d\n\n", l, r);
            break;
        case 2:
            exc2(&l, &r);
            printf("exc2-第%d次交换后的状态\n", j - i);
            printf("l=%d,r=%d\n\n", l, r);
            break;
        case 3:
            exc3(&l, &r);
            printf("exc3-第%d次交换后的状态\n", j - i);
            printf("l=%d,r=%d\n\n", l, r);
            break;
        default:
            break;
        }
    }
    return 0;
}

C语言经典案例——第五章 指针(上)_第2张图片

 /*Case 3
幻方
它是将从一到若干个数的自然数排成纵横各为若干个数的正方形,使在同一行、同一列和同一对角线上的几个数的和都相等。
编写程序,实现奇数阶的幻方*/

//函数声明
void array();
//主函数
int main() {
    array();          //函数调用
    return 0;
}
void array() {
    int n, i, j, idx, num, MAX;
    int* M;           //定义一个一维数组指针,按行优先存储矩阵中的元素
    printf("请输入n:");
input:
    scanf("%d", &n);
    if (n%2==0)       //n是偶数则重新输入
    {
        printf("n不为奇数,请重新输入:");
        goto input;
    }
    MAX = n * n;      //MAX为幻方中的最大值,也是元素个数
    M = (int*)malloc(sizeof(int) * MAX);  //分配存储空间
    M[n / 2] = 1;                         //获取数值1的列标
    i = 0;
    j = n / 2;
    //从2开始确定每个数的存放位置
    for ( num = 2; num <= MAX; num++)
    {
        i = i - 1;
        j = j + 1;
        if ((num-1)%n==0)                 //当前数是n的倍数
        {
            i = i + 2;
            j = j - 1;
        }
        if (i<0)                          //当前数在第0行
        {
            i = n - 1;
        }
        if (j>n-1)                        //当前数在最后一列,即n-1列
        {
            j = 0;
        }
        idx = i * n + j;                  //根据二维数组下标与元素的对应关系
        M[idx] = num;                     //找到当前数在数组中的存放位置
    }
    //打印生成的幻方
    printf("生成的%d阶幻方:", n);
    idx = 0;
    for ( i = 0; i < n; i++)
    {
        printf("\n");
        for ( j = 0; j < n; j++)
        {
            printf("%3d", M[idx]);
            idx++;
        }
    }
    printf("\n");
    free(M);
}

C语言经典案例——第五章 指针(上)_第3张图片

/*Case 4
快速排序
用指针实现快速排序算法,并将排序结果逐个输出*/

void QuickSort(int* arr, int left, int right) {
    //若果左边的索引大于或等于右边索引,说明该序列整理完毕
    if (left>=right)
    {
        return;
    }
    int i = left;
    int j = right;
    int key = *(arr + i);   //使用k来保护作为键值的数据
    //本轮排序开始,当i=j时本轮排序结束,将值赋给arr[i]
    while (i=arr[i]))
        {
            i++;            //不符合条件,继续向后寻找
        }
        //直到i

C语言经典案例——第五章 指针(上)_第4张图片

 本篇的所有代码是在VS编译环境下操作的,如有错误,望大家指正!!!

你可能感兴趣的:(题目,c语言,c++)