程序设计范式测验二

第二次测验的主要内容是通用算法的设计,题量比上一次测验稍微大一些。

1、有的算法可以适用于不同的数据结构,将这些较为通用的算法从数据结构中独立出来,可以使得预定义的操作作用于不同类型的数据,以此提高类型的安全性和程序的重用性,这就是?

答案:泛型技术

2、要交换两个变量的值,要设计通用代码,交换数据的函数原型应设计为?

答案:

void swap(void *a, void *b, int size);

3、要交换两个变量的值,要实现通用算法(交换任意数据类型的数据),可以用内存管理函数复制要交换的两块内存空间的值,例如,可以利用?

答案:memcpy

4、要调用 void swap(void *a, void *b, int size) 函数交换两个字符串

char *s1 = strdup("hello");
char *s2 = strdup("world");

调用语句为?

答案:

swap(&s1, &s2, sizeof(char *));

5、对于指定数据类型的数组,由于已知每个元素的数据类型,每个元素的值所占内存空间就是已知的,编译器可根据数组的首地址下标计算某元素的实际地址。

6、对于通用搜索函数void *search(void *a, void *k, int n, int m),参数 n 表示元素个数,m 表示的是什么?

答案:要查找的数据的数据类型所占字节数

7、对于void *search(void *a, void *k, int n, int m),在具体实现时,每搜索一个元素,就要先计算该元素的地址。第 i 个元素的地址计算公式为?

答案:loc = (char *)a + i * m

8、查找某值时,如果不知道数据类型,就只能按两块内存地址的位模式进行比较。例如,用 memcmp。memcmp 的调用格式:memcmp(内存地址1,内存地址2,要比较的字节数)。该函数比较两个内存块,如果它们的位模式相同就返回?

答案:0

9、对于通用搜索函数void *search(void *a, void *k, int n, int m),假如有

char *osl = {"dos", "win", "centos", "ubuntu", "mac"};
char *k = "linux";

正确的调用语句是?

答案:

int *r = NULL;
for (int j = 0; j < 5; j++) {
    r = search(os[j], k, 5, sizeof(char));
    if (r != NULL)
        break;
}

10、不同的数据类型用同样的 memcmp 实现,针对简单数据类型没有什么问题,对于较为复杂的数据结构,如数组、结构体等会失去通用性。因此,通用搜索函数的解决方案之一是再增加一个参数,用于传入特定数据类型的比较函数。这样的函数原型如下:void *search(void *a, void *k, int n, int m, int (*compare)(void *, void *));,其中,compare 是一个:

答案:指向一个比较函数的指针

11、对于通用搜索函数 void *search(void *a, void *k, int n, int m, int (*compare)(void *, void *)),假如有

char *osl = {“dos", "win", "centos", "ubuntu", "mac"};
char *k = "linux";

cmp 是一个比较函数,则正确的调用语句是?

答案:

search(os, &k, 5, sizeof(char *), cmp);

12、要实现通用栈,设计 stack,定义类型为:

typedef struct {
    int *d;
    int n;
    int m;
    int b;
} stack;

其中,d 为指向元素的指针,n 为元素个数,m 为栈容量,b 为元素所占字节数。入栈函数为?

void push(stack *s, void *v) {
    ____;
    ____;
    s->n++;
}

答案:

void *a = (char *)s->d + s->n * s->b;
memcpy(a, v, s->b);

13、要实现通用队列,设计 queue,定义类型为:

typedef struct {
    void *buf;
    int front, rear;
    int max;
    int size;
} queue;

其中,buf 为队列的首地址,front 指向队头,rear 指向对尾,max 为队列容量,size 为队列元素所占字节数。元素出队列的函数 void out(queue *q, void *val) 的代码为?

答案:

void *addr = (char *)q->buf + q->rear * q->size;
memcpy(val, addr, q->size);
q->rear++;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值