C语言函数指针编程练习

前言

以下代码是我自己想的一个情景,并通过编程实现,通过本次编程熟悉了一下函数指针的操作,供大家参考!
函数指针概念的链接如下:
https://blog.csdn.net/qq_55648035/article/details/121660141

一、功能描述

本程序实现了一个编码解码的功能,设置了雇主和雇员两个结构体,雇主只需进行编码,而雇员需要解码和编码,雇主的编码方式是将需要发送的内容首先进行字符串转化为整型数组,之后再将每一个元素的值加50;
(原因:雇主拥有最高权力,他只需要编码,不需要解码)
雇员的解码方式是首先判断雇主发送来的编码最后一位的情况,如果是“ r ”,则将编码升序排列,如果是“ f ”,则将编码降序排列,最后将排好的编码每个元素减50输出需要的信息;
(原因:雇员不仅需要接收雇主发来的编码,还需要接收其他雇员的编码,所以在接收编码后需要对编码进行排序,后再解码)
雇员的编码方式是将每一位转化为字符,最后组成字符串输出;
(原因:雇主发送的编码是乱序的,而雇员之间传递的编码是正序的,雇主到雇员值之间需要进行排序解码,而雇员值之间传递不需要)

二、部分代码展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、整体代码(供大家学习调试)

#include <stdio.h>
#include<string.h>

/* 声明雇主编码函数 bian1 和雇员编码函数 bian2 以及雇员解码函数jie */

void bian1(char*, int*, int);
void bian2(char*, int*, int);
void jie(int*, int, int*(*p)(int*, int));

/* 定义雇员和雇主结构体,将不同的功能封装到对应的结构体中 */

typedef struct 
{
    int num;
    char a[15];
    int b[15];
    void (*code)(char*, int*, int) = bian1; 
}employer;

typedef struct 
{
    int num;
    char a[15];
    int b[15];
    void (*decode)(int *, int , int* (*p)(int*, int)) = jie; 
    void (*code)(char*, int*, int) = bian2;
}employee;

/* 采用冒泡排序的方法进行解码排序 */

int* rise(int *a, int len)
{
    int t;
    for (int i = 0; i < len; i++)
    {
        for (int j = 0; j < len - 1 - i; j++)
            if (a[j] > a[j + 1])
            {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
    }        
    return a;
}

int* fall(int *a, int len)
{
    int t;
    for (int i = 0; i < len; i++)
    {
        for (int j = 0; j < len - 1 - i; j++)
            if (a[j] < a[j + 1])
            {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
    }    
    return a;
}

/* 选择合适的解码排序方式,并将其赋值给函数指针,函数指针在解码函数中发挥作用 */

void jie(int *a, int len, int* (*p)(int*, int))
{
    a = (*p)(a, len - 1);
    for(int i = 0; i < len - 1; i++)
    {
        a[i] = a[i] - 50;                //雇员解码方式,先排序在给每个数组元素减 50
    }
}

void bian1(char* a, int* b, int len)
{
    for(int i = 0; i < len - 1; i++)
    {
        b[i] = a[i] - '0' + 50;          //雇主编码方式,字符转化为整型数据并加 50
    }
    b[len-1] = a[len-1];
}

void bian2(char* a, int* b, int len)
{
    for(int i = 0; i < len - 1; i++)
    {
        a[i] = b[i] + 48;                //雇员编码方式,整型数据转化为字符
    }
    a[len-1] = b[len-1];
}

int main()
{
    employer boss1;                      //定义两个结构体 boss 和 staff
    employee staff1;
    int len = 0;
    printf("请输入编码:");               //boss输入编码到编码数组 a
    scanf("%s", boss1.a);
    len = strlen(boss1.a);
    boss1.code(boss1.a, boss1.b, len);
    printf("编码结果为:");               //boss编码结果输出到编码数组 b 中并输出展示
    for(int i = 0; i < len-1; i++)
    {
        printf("%d", boss1.b[i]);
    }
    printf("\n");
    printf("正在将编码发给雇员,请稍后……");
    printf("\n");
    for(int i = 0; i < len; i++)
    {
        staff1.b[i] = boss1.b[i];        //boss的编码结果一个个赋值到 staff 解码数组 b中
    }
    switch(staff1.b[len-1])              //通过判断最后一位数据来确定解码方式
    {
        case 'r': staff1.decode(staff1.b, len, rise); break;
        case 'f': staff1.decode(staff1.b, len, fall); break;
    }
    printf("雇员解码结果为:");
    for(int i = 0; i < len - 1; i++)
    {
        printf("%d", staff1.b[i]);        //输出解码结果
    }
    printf("\n");
    staff1.code(staff1.a, staff1.b, len); //通过 staff 解码数组重新编码后放到编码数组 a 中
    printf("雇员编码为:");
    printf("%s\n", staff1.a);
    return 0;
}


四、结果展示

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 指针是C语言中非常重要的概念,它可以用来存储和操作内存地址。通过指针,可以直接访问或者修改内存中的数据。 在C语言中,有很多关于指针的编程练习题。下面我举两个简单的例子来说明: 1. 编写一个程序,使用指针将两个变量的值进行交换。 ``` #include <stdio.h> void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main() { int x = 10; int y = 20; printf("交换前:x=%d, y=%d\n", x, y); swap(&x, &y); printf("交换后:x=%d, y=%d\n", x, y); return 0; } ``` 这个例子中,我们定义了一个交换函数`swap`,它接收两个指针参数,然后交换这两个指针所指向的值。在`main`函数中,我们定义了两个变量`x`和`y`,然后调用`swap`函数交换它们的值。 2. 编写一个程序,使用指针找到数组中的最大值和最小值。 ``` #include <stdio.h> void findMinMax(int *array, int size, int *min, int *max) { *min = *max = array[0]; for (int i = 1; i < size; i++) { if (array[i] < *min) { *min = array[i]; } if (array[i] > *max) { *max = array[i]; } } } int main() { int array[] = {6, 2, 8, 1, 9, 4}; int min, max; findMinMax(array, sizeof(array) / sizeof(int), &min, &max); printf("最小值:%d\n", min); printf("最大值:%d\n", max); return 0; } ``` 这个例子中,我们定义了一个`findMinMax`函数,它接收一个整型数组、数组大小以及两个指针作为参数。函数中,我们使用两个指针来记录当前的最小值和最大值,并遍历数组,逐个比较更新最小值和最大值。在`main`函数中,我们声明了一个数组,并调用`findMinMax`函数来找到这个数组的最小值和最大值。 通过这些练习题,可以加深对指针的理解,并提高C语言编程的能力。当然,这只是两个简单的例子,实际上还有很多其他有趣和复杂的指针相关的编程题目等待我们去探索。 ### 回答2: 指针在C语言编程中扮演着重要的角色,它允许我们直接访问内存地址,以便于对内存中的数据进行操作和管理。下面我将通过一个具体的编程练习题来展示指针的应用。 我们假设有一个整型数组arr,数组中存储了10个整数。现在我们要编写一个函数,该函数接受一个指针参数,用于将数组中的每个元素都加1。 首先,我们定义一个函数addOne,该函数接受一个整型指针作为参数,并且没有返回值。函数体内,我们使用for循环来遍历数组的每个元素,对每个元素执行加1操作。示例代码如下: ```c void addOne(int* ptr) { int i; for(i=0; i<10; i++) { *(ptr + i) += 1; } } ``` 在主函数中,我们创建一个整型数组arr,并将其传递给addOne函数。这样,函数内部对数组进行的加1操作就会生效。示例代码如下: ```c int main() { int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; printf("加1前的数组:"); for(int i=0; i<10; i++) { printf("%d ", arr[i]); } addOne(arr); printf("\n加1后的数组:"); for(int i=0; i<10; i++) { printf("%d ", arr[i]); } return 0; } ``` 运行这段代码,输出的结果将是: 加1前的数组:1 2 3 4 5 6 7 8 9 10 加1后的数组:2 3 4 5 6 7 8 9 10 11 通过这个练习题,我们可以看到指针的作用。指针可以传递数组的首地址给函数,在函数内部使用指针对数组进行操作,使得函数可以修改数组的元素。这样的操作提高了程序的效率和灵活性,并在一些场景下十分有用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值