c primer plus 第六版 第十章编程练习

(编译环境 Microsoft Visual Studio 2019)

(变长数组的题用MinGW的gcc编译)

1.

/*1.*/
#include<stdio.h>
#define MONTHS 12
#define YEARS 5
int main(void)
{
    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(*py)[MONTHS], * pm;
    float subtot, total;

    printf(" YEAR   RAINFALL  (INCHES)\n");
    for (py = rain, total = 0; py < rain + YEARS; py++)
    {
        for (pm = *py, subtot = 0; pm < *py + MONTHS; pm++)
            subtot += *pm;
        printf("%5d %15.1f\n", 2010 + (py - rain), subtot);
        total += subtot;
    }
    printf("\nThe yearly average is %.1f inches.\n\n", total / YEARS);
    printf("MONTHLY AVERAGES:\n\n");
    printf(" Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dce\n");

    for (pm = *rain; pm < *rain + MONTHS; pm++)
    {
        for (py = rain, subtot = 0; py < rain + YEARS; py++)
            subtot += *(*py+(pm-*rain));
        printf("%4.1f ", subtot / YEARS);
    }
    printf("\n");

    return 0;
}

 

2.

/*2.*/
#include<stdio.h>
#define FIVE 5
void copy_arr(double* target, double* source, int n);
void copy_ptr(double* target, double* source, int n);
void copy_ptrs(double* target, double* source, double* end);
void put_array(double* ar, int n);
int main(void)
{
    double source[FIVE] = { 1.1,2.2,3.3,4.4,5.5 };
    double target1[FIVE];
    double target2[FIVE];
    double target3[FIVE];

    copy_arr(target1, source, FIVE);
    copy_ptr(target2, source, FIVE);
    copy_ptrs(target3, source, source + FIVE);
    printf("Target1= ");
    put_array(target1, FIVE);
    printf("\nTarget2= ");
    put_array(target2, FIVE);
    printf("\nTarget3= ");
    put_array(target3, FIVE);
    putchar('\n');

    return 0;
}

void copy_arr(double* target, double* source, int n)
{
    int i;

    for (i = 0; i < n; i++)
        target[i] = source[i];
}

void copy_ptr(double* target, double* source, int n)
{
    double* p;

    for (p = source; p < source + n; p++, target++)
        * target = *p;
}

void copy_ptrs(double* target, double* source, double* end)
{
    for (; source < end; source++, target++)
        * target = *source;
}

void put_array(double* ar, int n)
{
    double* p;

    for (p = ar; p < ar + n; p++)
        printf("%.1f ", * p);
}

 

3.

/*3.*/
#include<stdio.h>
#define LENGTH 5
int int_max(int* ar,int n);
int main(void)
{
    int arr[LENGTH];
    int* i;

    printf("Please enter five integers.\n");
    for (i = arr; i < arr + LENGTH; i++)
        scanf_s("%d", i);
    printf("The largest is %d\n", int_max(arr,LENGTH));

    return 0;
}

int int_max(int *ar,int n)
{
    int max = 0;
    int* p;

    for (p = ar; p < ar + n; p++)
    {
        if (*p > max)
            max = *p;
    }

    return max;
}

 

4.

/*4.*/
#include<stdio.h>
#define LENGTH 5
int max_sub(double* ar, int n);
int main(void)
{
    double arr[LENGTH];
    double* i;

    printf("Please enter five decimal.\n");
    for (i = arr; i < arr + LENGTH; i++)
        scanf_s("%lf", i);
    printf("The maximum subscript is %d\n", max_sub(arr, LENGTH));

    return 0;
}

int max_sub(double* ar, int n)
{
    double max = 0;
    int i;
    double* p;

    for (p = ar; p < ar + n; p++)
    {
        if (*p > max)
            max = *p;
    }
    for (i = 0; i < n; i++)
    {
        if (ar[i] == max)
            break;
    }

    return i;
}

 

5.

/*5.*/
#include<stdio.h>
#define LENGTH 5
double max_min(double* ar, int n);
int main(void)
{
    double arr[LENGTH];
    double* i;

    printf("Please enter five decimal.\n");
    for (i = arr; i < arr + LENGTH; i++)
        scanf_s("%lf", i);
    printf("The difference between the maximum and minimum is %.2f\n", 
        max_min(arr, LENGTH));

    return 0;
}

double max_min(double* ar, int n)
{
    double max, min;
    double diff;
    double* p;

    for (p = ar, max = *p; p < ar + n; p++)
    {
        if (*p > max)
            max = *p;
    }
    for (p = ar, min = *p; p < ar + n; p++)
    {
        if (*p < min)
            min = *p;
    }
    diff = max - min;

    return diff;
}

 

6.

/*6.*/
#include<stdio.h>
#define LENGTH 5
void re_order(double* ar, int n);
int main(void)
{
    double arr[LENGTH];
    double* p;

    printf("Please enter five decimals.\n");
    for (p = arr; p < arr + LENGTH; p++)
        scanf_s("%lf", p);
    printf("Original array: ");
    for (p = arr; p < arr + LENGTH; p++)
        printf("%.2f ", *p);
    putchar('\n');

    re_order(arr, LENGTH);
    printf("Current array: ");
    for (p = arr; p < arr + LENGTH; p++)
        printf("%.2f ", *p);
    putchar('\n');

    return 0;
}

void re_order(double* ar, int n)
{
    int i;
    double temp;

    for (i = 0; i < n / 2; i++)
    {
        temp = ar[i];
        ar[i] = ar[n - i - 1];
        ar[n - i - 1] = temp;
    }
}

 

7.

/*7.*/
#include<stdio.h>
#define ROWS 3
#define COLUMNS 6
void copy_ptrs(double* target, double* source, double* end);
void put_array(double ar[][COLUMNS], int n);
int main(void)
{
    double source[ROWS][COLUMNS] =
    {
    {3.54,2.36,1.24,0.02,1.03,8.69},
    {4.54,6.28,9.36,1.63,0.25,4.63},
    {5.69,8.69,3.26,1.54,3.65,2.36}
    };
    double target[ROWS][COLUMNS];
    int row;

    for (row = 0; row < ROWS; row++)
        copy_ptrs(target[row], source[row], source[row] + COLUMNS);
    printf("source=\n");
    put_array(source, ROWS);
    printf("\ntarget=\n");
    put_array(target, ROWS);
    return 0;
}

void copy_ptrs(double* target, double* source, double* end)
{
    for (; source < end; source++, target++)
        * target = *source;
}

void put_array(double ar[][COLUMNS], int n)
{
    int row, col;

    for ( row= 0; row < ROWS; row++)
    {
        for (col = 0; col < COLUMNS; col++)
            printf("%.2f ", ar[row][col]);
        putchar('\n');
    }
}

 

 8.

/*8.*/
#include<stdio.h>
void copy_ptrs(int* target, int* source, int* end);
void put_array(int* ar, int n);
int main(void)
{
    int source[7] = { 1,2,3,4,5,6,7 };
    int target[3];

    printf("source= ");
    put_array(source, 7);
    copy_ptrs(target, source + 2, source + 5);
    printf("\ntarget= ");
    put_array(target, 3);

    return 0;
}

void copy_ptrs(int* target, int* source, int* end)
{
    for (; source < end; source++, target++)
        * target = *source;
}

void put_array(int* ar, int n)
{
    int* p;
    for (p = ar; p < ar + n; p++)
        printf("%d ", *p);
    putchar('\n');
}

 

9.

/*9.*/
#include<stdio.h>
#define ROWS 3
#define COLUMNS 5
void copy_vla(int row, int col, double source[row][col], double target[row][col]);
void put_vla(int row, int col, double ar[row][col]);
int main(void)
{
    double source[ROWS][COLUMNS] =
    {
        {1.56,2.36,2.78,1.69,3.56},
        {3.65,5.69,2.36,8.69,1.63},
        {8.69,1.36,5.14,6.21,3.25}
    };
    double target[ROWS][COLUMNS];

    printf("source=\n");
    put_vla(ROWS, COLUMNS, source);
    copy_vla(ROWS, COLUMNS, source, target);
    printf("\ntarget=\n");
    put_vla(ROWS, COLUMNS, target);

    return 0;
}

void copy_vla(int row, int col, double source[row][col], double target[row][col])
{
    int r, c;

    for (r = 0; r < row; r++)
        for (c = 0; c < col; c++)
            target[r][c] = source[r][c];
}

void put_vla(int row, int col, double ar[row][col])
{
    double(*pr)[col];
    double* pc;

    for (pr = ar; pr < ar + row; pr++)
    {
        for (pc = *pr; pc < *pr + col; pc++)
            printf("%.2f ", *pc);
        putchar('\n');
    }
}

 

10.

/*10.*/
#include<stdio.h>
#define LENGTH 4
void add_per(int* source1, int* source2, int* target, int n);
void put_array(int* ar, int n);
int main(void)
{
    int source1[LENGTH] = { 1,2,3,4 };
    int source2[LENGTH] = { 1,2,3,4 };
    int target[LENGTH];

    printf("source1= ");
    put_array(source1, LENGTH);
    printf("\nsource2= ");
    put_array(source2, LENGTH);
    add_per(source1, source2, target, LENGTH);
    printf("\n\ntarget= ");
    put_array(target, LENGTH);
    putchar('\n');

    return 0;
}

void add_per(int* source1, int* source2, int* target, int n)
{
    int i;

    for (i = 0; i < n; i++)
        target[i] = source1[i] + source2[i];
}

void put_array(int* ar, int n)
{
    int* p;

    for (p = ar; p < ar + n; p++)
        printf("%d ", *p);
}

 

11.

/*11.*/
#include<stdio.h>
#define ROWS 3
#define COLUMNS 5
void doub(int ar[][COLUMNS], int n);
void put_array(int ar[][COLUMNS], int n);
int main(void)
{
    int arr[ROWS][COLUMNS] =
    {
    {1 ,2 ,3 ,4 ,5 },
    {6 ,7 ,8 ,9 ,10},
    {11,12,13,14,15}
    };

    printf("Original array=\n");
    put_array(arr, ROWS);
    doub(arr, ROWS);
    printf("\nCurrent array=\n");
    put_array(arr, ROWS);

    return 0;
}

void doub(int ar[][COLUMNS], int n)
{
    int(*pr)[COLUMNS];
    int* pc;

    for (pr = ar; pr < ar + n; pr++)
        for (pc = *pr; pc < *pr + COLUMNS; pc++)
            *pc *= 2;
}

void put_array(int ar[][COLUMNS], int n)
{
    int(*pr)[COLUMNS];
    int* pc;

    for (pr = ar; pr < ar + n; pr++)
    {
        for (pc = *pr; pc < *pr + COLUMNS; pc++)
            printf("%d ",*pc);
        putchar('\n');
    }
}

 

12.

/*12.*/
#include<stdio.h>
#define YEARS 5
#define MONTHS 12
float year_rain(const float ar[][MONTHS], int n);
void month_rain(const float ar[][MONTHS], int n);
int main(void)
{
    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}
    };
    float total;

    printf(" YEAR   RAINFALL  (inches)\n");
    total = year_rain(rain,YEARS);
    printf("\nThe yearly average is %.1f inches.\n\n", total / YEARS);
    printf("MONTHLY AVERAGES:\n\n");
    printf(" Jan  Feb  Mar  Apr  May  Jun  Jun  Aug  Sep  Oct  Nov  Dec\n");
    month_rain(rain, YEARS);

    return 0;
}

float year_rain(const float ar[][MONTHS], int n)
{
    const float(*pr)[MONTHS];
    const float* pc;
    float subtot, total;

    for (pr = ar, total = 0; pr < ar + n; pr++)
    {
        for (pc = *pr, subtot = 0; pc < *pr + MONTHS; pc++)
            subtot += *pc;
        printf("%5d %15.1f\n", 2010 + (pr - ar), subtot);
        total += subtot;
    }
    return total;
}

void month_rain(const float ar[][MONTHS], int n)
{
    const float(*pr)[MONTHS];
    const float* pc;
    float subtot;

    for (pc = *ar; pc < *ar + MONTHS; pc++)
    {
        for (pr = ar, subtot = 0; pr < ar + n; pr++)
            subtot += *((*pr) + (pc - *ar));
        printf("%4.1f ", subtot / YEARS);
    }
    putchar('\n');
}

 

13.

/*13.*/
#include<stdio.h>
#define ROWS 3
#define COLUMNS 5
void get_array(double ar[][COLUMNS], int n);
double per_average(double* ar, int n);
double tot_average(double* ave, int n);
double max_array(double ar[][COLUMNS], int n);
void put_result(double* ave, int n, double ave_tot, double max);
int main(void)
{
    double arr[ROWS][COLUMNS];
    double ave[3], ave_tot;
    double max;
    int i;

    printf("Please enter three groups decimals,each for five.\n");
    get_array(arr, ROWS);
    for (i = 0; i < ROWS; i++)
        ave[i] = per_average(arr[i], COLUMNS);
    ave_tot = tot_average(ave, ROWS);
    max = max_array(arr, ROWS);
    printf("\nResult:\n");
    put_result(ave, ROWS, ave_tot, max);

    return 0;
}

void get_array(double ar[][COLUMNS], int n)
{
    double(*pr)[COLUMNS];
    double* pc;

    for (pr = ar; pr < ar + n; pr++)
        for (pc = *pr; pc < *pr + COLUMNS; pc++)
            scanf_s("%lf", pc);
}

double per_average(double* ar, int n)
{
    double* p;
    double total = 0;

    for (p = ar; p < ar + n; p++)
        total += *p;
    return total / n;
}

double tot_average(double* ave, int n)
{
    double* p;
    double total = 0;

    for (p = ave; p < ave + n; p++)
        total += *p;
    return total / n;
}

double max_array(double ar[][COLUMNS], int n)
{
    double(*pr)[COLUMNS];
    double* pc;
    double max = 0;

    for (pr = ar; pr < ar + n; pr++)
        for (pc = *pr; pc < *pr + COLUMNS; pc++)
        {
            if (*pc > max)
                max = *pc;
        }
    return max;
}

void put_result(double* ave, int n, double ave_tot, double max)
{
    double* p;

    printf(" GROUP   AVERAGE\n");
    for (p = ave; p < ave + n; p++)
        printf("%4d %10.2f\n", p - ave + 1, *p);
    printf("Average of all data: %.2f\n", ave_tot);
    printf("Maximum value of all data: %.2f\n", max);
}

 

14.

/*14.*/
#include<stdio.h>
#define ROWS 3
#define COLUMNS 5
void get_array(int rows,int cols,double ar[rows][cols]);
double per_average(double* ar, int n);
double tot_average(double* ave, int n);
double max_array(int rows,int cols,double ar[rows][cols]);
void put_result(double* ave, int n, double ave_tot, double max);
int main(void)
{
    double arr[ROWS][COLUMNS];
    double ave[3], ave_tot;
    double max;
    int i;

    printf("Please enter three groups decimals,each for five.\n");
    get_array(ROWS,COLUMNS,arr);
    for (i = 0; i < ROWS; i++)
        ave[i] = per_average(arr[i], COLUMNS);
    ave_tot = tot_average(ave, ROWS);
    max = max_array(ROWS,COLUMNS,arr);
    printf("\nResult:\n");
    put_result(ave, ROWS, ave_tot, max);

    return 0;
}

void get_array(int rows,int cols,double ar[rows][cols])
{
    double(*pr)[COLUMNS];
    double* pc;

    for (pr = ar; pr < ar + rows; pr++)
        for (pc = *pr; pc < *pr + cols; pc++)
            scanf_s("%lf", pc);
}

double per_average(double* ar, int n)
{
    double* p;
    double total = 0;

    for (p = ar; p < ar + n; p++)
        total += *p;
    return total / n;
}

double tot_average(double* ave, int n)
{
    double* p;
    double total = 0;

    for (p = ave; p < ave + n; p++)
        total += *p;
    return total / n;
}

double max_array(int rows,int cols,double ar[rows][cols])
{
    double(*pr)[COLUMNS];
    double* pc;
    double max = 0;

    for (pr = ar; pr < ar + rows; pr++)
        for (pc = *pr; pc < *pr + cols; pc++)
        {
            if (*pc > max)
                max = *pc;
        }
    return max;
}

void put_result(double* ave, int n, double ave_tot, double max)
{
    double* p;

    printf(" GROUP   AVERAGE\n");
    for (p = ave; p < ave + n; p++)
        printf("%4d %10.2f\n", p - ave + 1, *p);
    printf("Average of all data: %.2f\n", ave_tot);
    printf("Maximum value of all data: %.2f\n", max);
}

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值