主观题:指针典型应用
用指针实现下面 11 个函数。
(1)指针访问数组元素
不用下标而用指针实现数组清零、数组输入和数组输出。
函数原型如下:
c
// 将数组 a 中 n 个元素全部清零
void zeros(int a[], int n);
// 输入数组 a 中 n 个元素
void input(int a[], int n);
// 输出数组 a 中 n 个元素
void print(int a[], int n);
> 参考测试程序:
>
> c
> int main(void)
> {
> int a[10];
>
> // 清零后打印
> zeros(a, 10);
> print(a, 10);
>
> // 输入后打印
> printf("Enter 10 integer numbers: ");
> input(a, 10);
> print(a, 10);
>
> return 0;
> }
>
>
> 某次测试结果如下:
>
>
> 0 0 0 0 0 0 0 0 0 0
> Enter 10 integer numbers: 1 2 3 4 5 6 7 8 9 0
> 1 2 3 4 5 6 7 8 9 0
>
(2)指针做函数参数
用指针做函数参数可以实现交换两个元素、找数组最大和最小值等功能。
函数原型如下:
c
// 交换指针 a、b 指向的两个元素的值
void swap(int *a, int *b);
// 找出数组 a[n] 中的最大元素和最小元素,并分别保存到指针 max 和 min 指向的变量中
void max_min(int a[], int n, int *max, int *min);
> 参考测试程序:
>
> c
> int main(void)
> {
> // 交换元素
> int x = 3, y = 5;
>
> printf("Before swap: x = %d, y = %d\n", x, y);
> swap(&x, &y);
> printf("After swap: x = %d, y = %d\n", x, y);
>
> // 求最大最小值
> int a[10] = {2, 7, 1, 8, 2, 8, 4, 5, 9, 0};
> int max, min;
>
> max_min(a, 10, &max, &min);
> printf("max = %d, min = %d\n", max, min);
>
> return 0;
> }
>
>
> 结果是:
>
>
> Before swap: x = 3, y = 5
> After swap: x = 5, y = 3
> max = 9, min = 0
>
(3)返回指针
利用指针返回两个数中的最大值或最小值。
函数原型:
c
// 求两个数中的最大值
int *max(int *a, int *b);
// 求两个数中的最小值
int *min(int *a, int *b);
>参考测试程序:
>
>c
>int main(void)
>{
> int x = 3, y = 5;
>
> int *pmax = max(&x, &y);
> int *pmin = min(&x, &y);
> printf("max = %d, min = %d%", *pmax, *pmin);
>
> return 0;
>}
>
>
>结果是:
>
>
>max = 5, min = 3
>
(4)字符串
用指针处理字符串是最方便的,请利用指针和尽可能少的语句实现求字符串长度、复制字符串、字符串连接、字符串比较。
函数原型:
c
// 求字符串 s 的长度
int mystrlen(const char *s);
// 将字符串 s 复制到字符数组 t 中,返回复制后的字符串
char *mystrcpy(char *t, const char *s);
// 将字符串 s 连接到字符串 t 之后,返回连接后的字符串
char *mystrcat(char *t, const char *s);
// 比较字符串 s 和 t,返回正、负和零分别表示串 s>t、s<t 和 s==t
int mystrcmp(const char *s, const char *t);
> 参考测试程序:
>
> c
> int main(void)
> {
> char *s = "Hello";
> char t[80];
>
> printf("%d\n", mystrlen(s)); // 5
> printf("%s\n", mystrcpy(t, s)); // Hello
> printf("%s\n", mystrcat(t, " world")); // Hello world
> printf("%d\n", mystrcmp("abc", "") > 0); // 1
> printf("%d\n", mystrcmp("Abc", "abc") < 0); // 1
> printf("%d\n", mystrcmp("Abc", "Abc") == 0); // 1
>
> return 0;
> }
>
>
> 执行结果:
>
>
> 5
> Hello
> Hello world
> 1
> 1
> 1
>
答案:(1)首先用伪代码描述算法思路,然后实现之。
(2)测试程序仅供参考,无需写在报告中。
(1)指针访问数组元素
不用下标而用指针实现数组清零、数组输入和数组输出。
函数原型如下:
c
// 将数组 a 中 n 个元素全部清零
void zeros(int a[], int n);
// 输入数组 a 中 n 个元素
void input(int a[], int n);
// 输出数组 a 中 n 个元素
void print(int a[], int n);
> 参考测试程序:
>
> c
> int main(void)
> {
> int a[10];
>
> // 清零后打印
> zeros(a, 10);
> print(a, 10);
>
> // 输入后打印
> printf("Enter 10 integer numbers: ");
> input(a, 10);
> print(a, 10);
>
> return 0;
> }
>
>
> 某次测试结果如下:
>
>
> 0 0 0 0 0 0 0 0 0 0
> Enter 10 integer numbers: 1 2 3 4 5 6 7 8 9 0
> 1 2 3 4 5 6 7 8 9 0
>
(2)指针做函数参数
用指针做函数参数可以实现交换两个元素、找数组最大和最小值等功能。
函数原型如下:
c
// 交换指针 a、b 指向的两个元素的值
void swap(int *a, int *b);
// 找出数组 a[n] 中的最大元素和最小元素,并分别保存到指针 max 和 min 指向的变量中
void max_min(int a[], int n, int *max, int *min);
> 参考测试程序:
>
> c
> int main(void)
> {
> // 交换元素
> int x = 3, y = 5;
>
> printf("Before swap: x = %d, y = %d\n", x, y);
> swap(&x, &y);
> printf("After swap: x = %d, y = %d\n", x, y);
>
> // 求最大最小值
> int a[10] = {2, 7, 1, 8, 2, 8, 4, 5, 9, 0};
> int max, min;
>
> max_min(a, 10, &max, &min);
> printf("max = %d, min = %d\n", max, min);
>
> return 0;
> }
>
>
> 结果是:
>
>
> Before swap: x = 3, y = 5
> After swap: x = 5, y = 3
> max = 9, min = 0
>
(3)返回指针
利用指针返回两个数中的最大值或最小值。
函数原型:
c
// 求两个数中的最大值
int *max(int *a, int *b);
// 求两个数中的最小值
int *min(int *a, int *b);
>参考测试程序:
>
>c
>int main(void)
>{
> int x = 3, y = 5;
>
> int *pmax = max(&x, &y);
> int *pmin = min(&x, &y);
> printf("max = %d, min = %d%", *pmax, *pmin);
>
> return 0;
>}
>
>
>结果是:
>
>
>max = 5, min = 3
>
(4)字符串
用指针处理字符串是最方便的,请利用指针和尽可能少的语句实现求字符串长度、复制字符串、字符串连接、字符串比较。
函数原型:
c
// 求字符串 s 的长度
int mystrlen(const char *s);
// 将字符串 s 复制到字符数组 t 中,返回复制后的字符串
char *mystrcpy(char *t, const char *s);
// 将字符串 s 连接到字符串 t 之后,返回连接后的字符串
char *mystrcat(char *t, const char *s);
// 比较字符串 s 和 t,返回正、负和零分别表示串 s>t、s<t 和 s==t
int mystrcmp(const char *s, const char *t);
> 参考测试程序:
>
> c
> int main(void)
> {
> char *s = "Hello";
> char t[80];
>
> printf("%d\n", mystrlen(s)); // 5
> printf("%s\n", mystrcpy(t, s)); // Hello
> printf("%s\n", mystrcat(t, " world")); // Hello world
> printf("%d\n", mystrcmp("abc", "") > 0); // 1
> printf("%d\n", mystrcmp("Abc", "abc") < 0); // 1
> printf("%d\n", mystrcmp("Abc", "Abc") == 0); // 1
>
> return 0;
> }
>
>
> 执行结果:
>
>
> 5
> Hello
> Hello world
> 1
> 1
> 1
>
答案:(1)首先用伪代码描述算法思路,然后实现之。
(2)测试程序仅供参考,无需写在报告中。