C primer plus 指针练习题

纯手打的答案,如有错误欢迎交流

目录

第一题

第二题

第三题

第四题

第五题

第六题

第七题

第八题

第九题

第十题

第十一题

第十二题

第十三题


第一题

#include<stdio.h>

#define MONTHS 12
#define YEARS  5

int main()
{
    const float rain[YEARS][MONTHS] =
        {
            {4.3, 4.3, 4.3, 3.0, 2.0, 1.2, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6},
            {8.5, 8.2, 1.2, 1.6, 2.4, 0.0, 5.2, 0.9, 0.3, 0.9, 1.4, 7.3},
            {9.1, 8.5, 6.7, 4.3, 2.1, 0.8, 0.2, 0.2, 1.1, 2.3, 6.1, 8.4},
            {7.2, 9.9, 8.4, 3.3, 1.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 6.2},
            {7.6, 5.6, 3.8, 2.8, 3.8, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 5.2}};

    const float(*p)[MONTHS] = rain;
    int year, month;
    float total, subtot;

    printf(" YEAR           RAINFALL  (inches)\n");

    for (year = 0, subtot = 0; year < YEARS; year++, p++) // p控制年份
    {
        for (month = 0, subtot = 0; month < MONTHS; month++)
            subtot += *(*p + month); // 每一个年,每个月的降雨量
        printf("%5d  %15.1f\n", 2010 + year, subtot);
        total += subtot; // 5年的总降水量
    }
    printf("\nThe yearly average is %.1f inches. \n\n", total / YEARS);
    printf("MONTHS AVERAGES: \n\n");
    printf(" Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec\n");

    p -= 5; // 恢复p
    for (month = 0; month < MONTHS; month++)
    {
        for (year = 0, subtot = 0; year < YEARS; year++)
            subtot += *(*(p + year) + month); // p + year(定位行),*(p + yeay) + month(定位列),最后取值
        printf("%4.1f ", subtot / YEARS);
    }
    printf("\n");

    return 0;
}

第二题

#include<stdio.h>

void copy_arr(double target1[], double source[], int n)
{
    int i;
    for (i = 0; i < n; i++)
        target1[i] = source[i];
}

void copy_ptr(double target2[], double source[], int n)
{
    double *p = target2;
    int i;
    for (i = 0; i < n; i++, p++)
        *p = source[i];
}

void copy_ptrs(double *target3, double *source, double *end)
{
    while (source < end)
    {
        *target3 = *source;
        target3++;
        source++;
    }
}

int main()
{
    double source[5] = {1.1, 2.2, 3.3, 4.4, 5.5};
    double target1[5], target2[5], target3[5];
    int i;

    // 方法一:
    copy_arr(target1, source, 5); // 带数组表示法的拷贝

    printf("target1: \n");
    for (i = 0; i < 5; i++)
        printf("target1[%d] = %.1lf\n", i, target1[i]);
    printf("\n");

    // 方法二:
    copy_ptr(target2, source, 5); // 带指针表示法和指针递增的拷贝

    printf("target2: \n");
    for (i = 0; i < 5; i++)
        printf("target2[%d] = %.1lf\n", i, target2[i]);
    printf("\n");

    // 方法三:
    copy_ptrs(target3, source, source + 5); // 带最后一个元素后面的指针的拷贝

    printf("target3: \n");
    for (i = 0; i < 5; i++)
        printf("target3[%d] = %.1lf\n", i, target3[i]);
    printf("\n");

    return 0;
}

第三题

#include<stdio.h>
#define SIZE 10

int Max_array(const int b[])
{
    // int temp = 0; 无法处理负数
    int temp = b[0];
    int i;

    for (i = 1; i < SIZE; i ++)
        if (b[i] > temp)
            temp = b[i];

    return temp;
}

int main()
{
    int array[SIZE];

    printf("请输入元素:\n");

    int i;
    for (i = 0; i < SIZE; i ++)
        scanf("%d", &array[i]);

    printf("最大值为:%d\n", Max_array(array));

    return 0;
}

第四题

#include<stdio.h>
#define SIZE 10

int Max_index(const double b[])
{
    int temp = b[0];
    int index = 0;
    int i;

    for (i = 1; i < SIZE; i ++)
        if (b[i] > temp)
        {
            temp = b[i];
            index = i;
        }

    return index;
}

int main()
{
    double array[SIZE];

    printf("请输入元素:\n");

    int i;
    for (i = 0; i < SIZE; i ++)
        scanf("%lf", &array[i]);

    printf("最大值的下标为:%d\n", Max_index(array));

    return 0;
}

第五题

#include<stdio.h>
#define SIZE 10

void quick_sort(double array[], int l, int r) // 快排
{
    if (l == r)
        return;

    int i = l - 1, j = r + 1;
    double x = array[(l + r) >> 1];

    while (i < j)
    {
        do
            i++;
        while (array[i] < x);

        do
            j--;
        while (array[j] > x);

        if (i < j)
        {
            double temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }

    quick_sort(array, l, j);
    quick_sort(array, j + 1, r);
}

double Gap(double b[])
{
    quick_sort(b, 0, SIZE - 1);

    return b[SIZE - 1] - b[0];
}

int main()
{
    double array[SIZE];

    printf("请输入元素:\n");

    int i;
    for (i = 0; i < SIZE; i++)
        scanf("%lf", &array[i]);

    printf("最大值和最小值的差值为:%lf\n", Gap(array));

    return 0;
}

第六题

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define SIZE 10

void quick_sort(double array[], int l, int r) // 快排
{
    if (l == r)
        return;

    int i = l - 1, j = r + 1;
    double x = array[(l + r) >> 1];

    while (i < j)
    {
        do
            i++;
        while (array[i] > x);

        do
            j--;
        while (array[j] < x);

        if (i < j)
        {
            double temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }

    quick_sort(array, l, j);
    quick_sort(array, j + 1, r);
}

int main()
{
    double array[SIZE];

    int i;

    srand((double)time(NULL)); // 种子

    for (i = 0; i < SIZE; i++)
        array[i] = rand() % 1000 + 1; // 生成随机数

    for (i = 0; i < SIZE; i++)
        printf("%.1lf ", array[i]); // 排序前

    printf("\n");

    quick_sort(array, 0, SIZE - 1); // 从小到大排序

    for (i = 0; i < SIZE; i++)
        printf("%.1lf ", array[i]); // 排序后

    return 0;
}

第七题

#include<stdio.h>

void copy_arr(double (*p)[5], double (*q)[5], int row, int col) // 需要指明维度(只有第一维可以省略)
{
    int i, j;

    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            *(*(p + i) + j) = *(*(q + i) + j);
        }
    }
}

int main()
{
    double source[5][5];
    double target[5][5];
    int i, j;

    for (i = 0; i < 5; i++)
        for (j = 0; j < 5; j++)
            source[i][j] = i + j;

    printf("source: \n");
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
            printf("source[%d][%d] = %.1lf  ", i, j, source[i][j]);
        printf("\n");
    }

    copy_arr(target, source, 5, 5);

    printf("target: \n");
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
            printf("target[%d][%d] = %.1lf  ", i, j, target[i][j]);
        printf("\n");
    }
    printf("\n");

    return 0;
}

第八题

#include<stdio.h>

void copy_ptr(double *p, double *q, int n)
{
    int i;
    for (i = 0; i < n; i++)
        *(p + i) = *(q + i);
}

int main()
{
    double source[7] = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7};
    double target[3];
    int i;

    copy_ptr(target, source + 2, 3); // 带指针表示法和指针递增的拷贝

    printf("target: \n");
    for (i = 0; i < 3; i++)
        printf("target[%d] = %.1lf\n", i, target[i]);
    printf("\n");

    return 0;
}

第九题

#include<stdio.h>
// 编译器不支持C99,无法使用变长数组

void copy(int row, int col, int target[row][col], const int source[row][col]) // 防止源数组被修改
{
    int i, j;

    for (i = 0; i < row; i++)
        for (j = 0; j < col; j++)
            target[i][j] = source[i][j];
}

void show (int row, int col, const int array[row][col])
{
    int i, j;

    for (i = 0; i < row; i++)
    { 
        for (j = 0; j < col; j++)
        {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }   
            
}

int main()
{
    int n = 3, m = 5;
    int target[n][m];
    int array[][5] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

    copy(n, m, target, array);
    show(n, m, target);

    return 0;
}

第十题

#include<stdio.h>
#define SIZE 5


void Add_array(int *a, int *b, int *c, int n)
{
    int i;

    for (i = 0; i < n; i ++)
        *(c + i) = *(a + i) + *(b + i);
}

int main()
{
    int array1[SIZE] = {1, 2, 3, 4, 5};
    int array2[SIZE] = {1, 2, 3, 4, 5};
    int target[SIZE];
    int i;

    Add_array(array1, array2, target, 5);

    for (i = 0; i < SIZE; i++)
        printf("%d ", target[i]);

    return 0;
}

第十一题

#include<stdio.h>
#define ROW 3
#define COL 5

void Double_element(int row, int array[][5])
{
    int i, j;

    for (i = 0; i < row; i++)
    {
        for (j = 0; j < 5; j++)
            array[i][j] *= 2;
    }
}

void Show_element(int row, int array[][5])
{
    int i, j;

    for (i = 0; i < row; i++)
    {
        for (j = 0; j < 5; j++)
            printf("array[%d][%d] = %d  ", i, j, array[i][j]);
        printf("\n");
    }
}

int main()
{
    int array[ROW][COL];
    int i, j;

    for (i = 0; i < ROW; i++)
        for (j = 0; j < COL; j++)
            array[i][j] = i + j;

    Double_element(ROW, array);

    Show_element(ROW, array);

    return 0;
}

第十二题

#include<stdio.h>

#define MONTHS 12
#define YEARS  5

void Avg_year(const float (*p)[MONTHS])
{
    int year, month;
    float total, subtot;

    printf(" YEAR           RAINFALL  (inches)\n");

    for (year = 0, subtot = 0; year < YEARS; year++, p++) // p控制年份
    {
        for (month = 0, subtot = 0; month < MONTHS; month++)
            subtot += *(*p + month); // 每一个年,每个月的降雨量
        printf("%5d  %15.1f\n", 2010 + year, subtot);
        total += subtot; // 5年的总降水量
    }
    printf("\nThe yearly average is %.1f inches. \n\n", total / YEARS);
}

void Avg_moth(const float (*p)[MONTHS])
{
    int year, month;
    float total, subtot;

    printf("MONTHS AVERAGES: \n\n");
    printf(" Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec\n");

    for (month = 0; month < MONTHS; month++)
    {
        for (year = 0, subtot = 0; year < YEARS; year++)
            subtot += *(*(p + year) + month); // p + year(定位行),*(p + yeay) + month(定位列),最后取值
        printf("%4.1f ", subtot / YEARS);
    }
    printf("\n");
}

int main()
{
    const float rain[YEARS][MONTHS] =
        {
            {4.3, 4.3, 4.3, 3.0, 2.0, 1.2, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6},
            {8.5, 8.2, 1.2, 1.6, 2.4, 0.0, 5.2, 0.9, 0.3, 0.9, 1.4, 7.3},
            {9.1, 8.5, 6.7, 4.3, 2.1, 0.8, 0.2, 0.2, 1.1, 2.3, 6.1, 8.4},
            {7.2, 9.9, 8.4, 3.3, 1.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 6.2},
            {7.6, 5.6, 3.8, 2.8, 3.8, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 5.2}};

    const float(*p)[MONTHS] = rain;

    Avg_year(rain);

    Avg_moth(rain);

    return 0;
}

第十三题

#include<stdio.h>

// 使用const防止数据被意外修改
void Input(const double (*p)[5], int row); // 初始化数组
void Avg_col(const double (*p)[5], int row); // 每行的平均值
void Avg_tol(const double (*p)[5], int row); // 所有数据的平均值
void Max_element(const double (*p)[5], int row); // 所有数据的最大值  

int main()
{
    double array[3][5];

    Input(array, 3);

    Avg_col(array, 3);

    Avg_tol(array, 3);

    Max_element(array, 3);

    return 0;
}

void Input(const double (*p)[5], int row) 
{
    int i, j;

    for (i = 0; i < row; i++)
    {
        printf("请输入第%d组数据: ", i + 1);
        for (j = 0; j < 5; j++)
            scanf("%lf", *(p + i) + j);
    }

    printf("\n");
}

void Avg_col(const double (*p)[5], int row)
{
    int i, j;
    double sum;

    for (i = 0, sum = 0; i < row; i++)
    {
        for (j = 0, sum = 0; j < 5; j++)
        {
            sum += *(*(p + i) + j);
        }
        printf("第%d组数据的平均值为: %lf\n", i + 1, sum / 5);
    }

    printf("\n");
}

void Avg_tol(const double (*p)[5], int row)
{
    int i, j;
    double sum;

    for (i = 0, sum = 0; i < row; i++)
        for (j = 0; j < 5; j++)
            sum += *(*(p + i) + j);

    printf("所有数据的平均值为: %lf\n", sum / (5 * row));
    printf("\n");
}

void Max_element(const double (*p)[5], int row)
{
    double temp = **p;
    int i, j;

    for (i = 0; i < row; i++)
        for (j = 0; j < 5; j++)
            if (*(*(p + i) + j) > temp)
                temp = *(*(p + i) + j);

    printf("所有数据的最大值为:%lf\n", temp);
    printf("\n");
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值