• 抬起头,继续前进吧,去把这个不完美的故事,变成你成所期望的样子
  • 登山路上我们会放弃很多东西,但这些被我们丢掉在我们登上山顶之际,都会一一回来
  • 不论开发还是逆向,数学水平的高低直接决定了”你的饭碗里有没有肉”
  • 万丈高楼平地起,勿在浮沙筑高台

《C语言程序设计:现代方法》第十一章练习

C 菜鸟 1年前 (2018-05-26) 11009次浏览 已收录 0个评论
[隐藏]

        本篇为菜鸟在学习《C 语言程序设计:现代方法》中第十一章指针时做的练习题,如果有错误或疑问的话,欢迎大家指正~

1、指针格式

如果 i 是变量,并且 p 指向 i,那么下列那个表达式是 i 的别名?
(a) *p
(b) &p
(c) *&p
(d) &*p
(e) *i
(f) &i
(g) *&i
(h) &*i
答:(a)和(g)

2、指针赋值

如果 i 是 int 变量,并且 p 和 q 是指向 int 的指针,下列哪一个赋值是合法的?
(a) p = i;
(b) *p = &i;
(c) &p = q;
(d) p = &p;
(e) p = &q;
(f) p = q;
(g) p = *q;
(h) *p = q;
(i) *p = *q;
答:(f)(i)

3、修改错误

下列函数假设用来计算数组 a 中的元素的和以及平均值,且数组 a 长度为 n。avg 和 sum 指向函数需要修改的变量。
函数有几处错误,找出这些错误并修改

void avg_sum(float a[], int n, float *avg, float *sum)
{
    int i;
    
    sum  = 0.0;
    for (i = 0; i < n; i++) {
        sum += a[i];
    }
    avg = sum / n;
}

答:avg 和 sum 是作为指针传入的,在函数中要将 sum 修改为*sum,avg 修改为*avg

4、数值交换

编写下列函数
void swap(int *p, int *q);
当传递两个变量的地址时,swap 函数应该交换两者的值
swap(&x, &y); /* exchange values of x and y */
利用此函数修改第 9 章中的练习 9 的程序,使它完成此工作
答:

#include <stdio.h>

void swap(int *p, int *q);

main()
{
    int x = 1, y = 2;

    swap(&x, &y);
    printf("x = %d, y = %d\n", x, y);
    return 0;
}

void swap (int *p, int *q)
{
    int temp;

    temp = *q;
    *q = *p;
    *p = temp;
}

5、时间换算

编写下列函数
void split_time(long int total_sec, int *hr, int *min, int *sec)
total_sec 是以从午夜计算的秒数表示的时间。hr、min 和 sec 都是指向变量的指针,
这些变量在函数中将分别存储着按小时计算(0-23)、按分钟计算(0-59)和按秒计算(0-59)的等价时间
答:

#include <stdio.h>

void split_time(long int total_sec, int *hr, int *min, int *sec);

main()
{
    long int total_sec;
    int hr, min, sec;

    printf("Enter the second from the midlenight: ");
    scanf("%ld", &total_sec);

    split_time(total_sec, &hr, &min, &sec);

    printf("hr : %d\nmin : %d\nsec: %d\n", hr, min, sec);

    return 0;
}

void split_time(long int total_sec, int *hr, int *min, int *sec)
{
    *hr = total_sec / 3600;
    *min = (total_sec % 3600) / 60;
    *sec = (total_sec % 3600) % 60;
}

6、元素搜索

编写下列函数
void find_two_largest(int a[], int n, int *largest, int *second_largest);
当传递长度为 n 的数组 a 时,函数将在数组 a 中搜寻最大元素和第二大元素,把它们分别存储在 largest 和 second_largest 指向的变量中。
答:

#include <stdio.h>

#define N 5

void find_two_largest(int a[], int n, int *largest, int *second_largest);

main()
{
    int i, a[N], largest, second_largest;
    printf("Enter 5 Number: ");
    for(i = 0; i < N; i++) {
        scanf("%d", &a[i]);
    }

    find_two_largest(a, N, &largest, &second_largest);

    printf("Largest Number: %d\n", largest);
    printf("Second Largest Number: %d\n", second_largest);

    return 0;
}

void find_two_largest(int a[], int n, int *largest, int *second_largest)
{
    int i, j, temp;
    for (i = 0; i < (n - 1); i++) {
        for (j = i + 1; j < n; j++) {
            if (a[i] > a[j]) {
                temp = a[j];
                a[j] = a[i];
                a[i] = temp;
            }
        }
    }

    *largest = a[n - 1];
    *second_largest = a[n - 2];
}

7、指针型返回值

编写下列函数
int *find_middle(int a[], int n);
当传递长度为 n 的数组 a 时,函数将返回指向数组的中间元素的指针。(如果 n 是偶数,选择较大下标的中间元素。例如,如果 n=4,中间元素是 a[2])
答:

#include <stdio.h>

#define N 8

int *find_middle(int a[], int n);

main()
{
    int i, a[N], midleElement, *p = &midleElement;

    printf("Enter %d number: ", N) ;
    for (i = 0; i < N; i++) {
        scanf("%d", &a[i]);
    }

    p = find_middle(a, N);
    printf("The midle element is: %d\n", *p);
    
    return 0;
}

int *find_middle(int a[], int n)
{
    int i;
    for (i = 0; i < n; i++) {
        if (((i * 2 + 1) == n) || ((i * 2 + 2) == n)) {
            return &a[n - (i + 1)];
        }
    }
}

学习心得 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明《C 语言程序设计:现代方法》第十一章练习
喜欢 (6)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址