C Primer Plus 编程练习 第十章

第一题 

#include<stdio.h>
#define MONTHS 12
#define YEARS 5
void sum(int arr[][MONTHS], int);
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}
    };
    int year, month;
    float subtot, total;
    printf("YEAR RAINFALL (inches)\n");
    for (year = 0, total = 0; year < YEARS; year++)
    {
        for (month = 0; subtot = 0; month < MONTHS; month++)
            subtot += *(*(rain + year) + month);//数组表达法,转变成指针表达法
    }//去(rain+year)行的地址,找第month个地址,解引用获得数值

}//其他都是一样的

 

第二题

#include <stdio.h>
#define LEN 5
//函数声明
void copy_arr(double x[], const double source[], int n);
void copy_ptr(double *x, const double *source, int n);
void copy_ptrs(double *x, const double *source, const double *end);
void show_arr(const double x[], int n);

int main(void)
{
    double source[LEN] = {1.1, 2.2, 3.3, 4.4, 5.5};
    double target1[LEN];
    double target2[LEN];//声明数组
    double target3[LEN];

    printf("Source array:\n");
    show_arr(source, LEN);//调用第一个函数

    copy_arr(target1, source, LEN);
    printf("Target1: \n");
    show_arr(target1, LEN);

    copy_ptr(target2, source, LEN);//调用后面几个函数
    printf("Target2:\n");
    show_arr(target2, LEN);

    copy_ptrs(target3, source, source + LEN);
    printf("Target3:\n");
    show_arr(target3, LEN);

    printf("Done.\n");

    return 0;
}

void show_arr(const double x[], int n)//带数组表示法的函数
{
    for (int i = 0; i < n; i++)
    {
        printf("%.2lf ", x[i]);
    }
    putchar('\n');
}

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

void copy_ptr(double *x, const double *source, int n)
{
    for (int i = 0; i < n; i++)
    {
        *(x + i) = *(source + i);
    }
}

void copy_ptrs(double *x, const double *source, const double *end)
{
    for (int i = 0; i < end - source; i++)
    {
        *(x + i) = *(source + i);
    }
}

 

第三题

#include<stdio.h>
void max(int num, int ptr[num]);

int main(void)
{
    int number = 5;
    int arr[] = { 1, 2, 3, 4, 5 };
    max(number, arr);
}

void max(int num, int ptr[num])
{
    num = 5;
    int i;
    for (i = 0; i < num; i++)
    {
        int m;
        int n = 0;
        for (m = 0; m < num; m++)
        {
            if (ptr[i] >= ptr[m])
                n = n + 1;
        }
        if (n == 5)
            printf("%d is the biggest\n", ptr[i]);
        else
            continue;

    }
}

 

第四题

#include <stdio.h>
int max(double [], int);
int main(void)
{
    int num = 5;
    double arr[] = {1.0, 4.0, 3.0, 2.0, 5.0};
    printf("The maximum is %d", max(arr, num));
    return 0;
}

int max(double ptr[], int n)
{
    int i, j, m = 0;
    double ma;
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            if (ptr[i] > ptr[j])
            {
                m++;
            }
        }
        if (m == 5)
        {
            ma = ptr[i];
        }
    }
    return i;
}

第五题

#include <stdio.h>
int max(double [], int);
int main(void)
{
    int num = 5;
    double arr[] = {1.0, 4.0, 3.0, 2.0, 5.0};
    printf("The maximum is %d", max(arr, num));
    return 0;
}

int max(double ptr[], int n)
{
    int i, j, m = 0;
    double ma;
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            if (ptr[i] > ptr[j])
            {
                m++;
            }
        }
        if (m == 5)
        {
            ma = ptr[i];
        }
    }
    return i;
}

第六题

#include <stdio.h>
void daoxu(double [], int);
int main(void)
{
    int i, num = 5;
    double zheng[] = {1.1, 2.2, 3.3, 4.4, 5.5};
    printf("Before:\n");
    show_array(zheng, num);
    daoxu(zheng, num);
    printf("After:\n");
    show_array(zheng, num);
    return 0;
}

 void daoxu(double arr[], int n)
{
    int i, k;
    double ptr[n];

    for (i = 0, k = 4; i < n, k > -1; i++, k--)
    {
        ptr[k] = arr[i];
    }

    for (i = 0; i < n; i++)
    {
        arr[i] = ptr[i];
    }
    return;
}

void show_array(const double show[], int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("%.2lf ", show[i]);
    }
    printf("\n");
}

第七题

#include <stdio.h>
void copy(double arr[][5], double ptr[][5], int);
void show(double show[][5], int);
int main(void)
{
    int num = 3;
    double before[][5] = {{1.0, 2.0, 3.0, 4.0, 5.0},{1.1, 2.1, 3.1, 4.1, 5.1},{1.2, 2.2, 3.2, 4.2, 5.2}};
    double after[num][5];
    printf("Before:\n");
    show(before, num);
    copy(before, after, num);
    printf("After:\n");
    show(after, num);
    return 0;
}

void copy(double arr[][5], double ptr[][5], int n)
{
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < 5; j++)
        ptr[i][j] = arr[i][j];
    }
    return;
}

void show(double show[][5], int n)
{
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < 5; j++)
            printf("%.2lf ", show[i][j]);
        putchar('\n');
    }
    return 0;
}

第八题

#include<stdio.h>
void show_arr(const double x[], int n);
void copy_arr(double x[], const double source[], int n);
int main(void)
{
    double source[7] = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7};
    double target[3];

    copy_arr(target, source, 3);


    show_arr(target, 3);

}

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

void show_arr(const double x[], int n)//带数组表示法的函数
{
    for (int i = 0; i < n; i++)
    {
        printf("%.2lf ", x[i]);
    }
    putchar('\n');
}

第九题

#include <stdio.h>
#define ROW 3
#define COL 5
double copy(int n, int m, double arr[n][m], double ptr[n][m]);
void show(int n, int m, double ptr[n][m]);
int main(void)
{
    double before[ROW][COL] = {{1.0, 2.0, 3.0, 4.0, 5.0},{1.1, 2.1, 3.1, 4.1, 5.1},{1.2, 2.2, 3.2, 4.2, 5.2}};
    double after[ROW][COL];
    copy(ROW, COL, before, after);
    printf("Before:\n");
    show(ROW, COL, before);
    printf("After:\n");
    show(ROW, COL, after);
    return 0;
}

double copy(int n, int m, double arr[n][m], double ptr[n][m])
{
    int i, j;
    for (i = 0; i < ROW; i++)
    {
        for (j = 0; j < COL; j++)
        {
            ptr[i][j] = arr[i][j];
        }
    }
    return;
}

void show(int n, int m, double ptr[n][m])
{
    int i, j;
    for (i = 0; i < ROW; i++)
    {
        for (j = 0; j < COL; j++)
        {
            printf("%.2lf ", ptr[i][j]);
        }
        putchar('\n');
    }
    return 0;;
}

第十题

#include <stdio.h>
#define NUM 4
int sum(int arr1[], int arr2[], int sum3[], int n);
void show(int show[], int n);
int main(void)
{
    int ptr1[NUM] = { 2, 4, 5, 8 };
    int ptr2[NUM] = { 1, 0, 4, 6 };
    int ptr3[NUM];
    printf("The first array is:\n");
    show(ptr1, NUM);
    printf("The second array is:\n");
    show(ptr2, NUM);
    sum(ptr1, ptr2, ptr3, NUM);
    printf("Their sum is:\n");
    show(ptr3, NUM);
    return 0;
}

int sum(int arr1[], int arr2[], int sum3[], int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        sum3[i] = arr1[i] + arr2[i];
    }
    return 0;
}

void show(int show[], int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("%d ", show[i]);
    }
    printf("\n");
    return 0;
}

第十一题

#include<stdio.h>
void show(int show[][5], int);
int two(int two[][5], int);
int main(void)
{
    int arr[3][5] = {{1, 2, 3, 4, 5},{2, 3, 4, 5, 6},{3, 4, 5, 6, 7}};
    printf("Before:\n");
    show(arr, 3);
    two(arr, 3);
    printf("After:\n");
    show(arr, 3);
    return 0;
}

int two(int two[][5], int n)
{
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < 5; j++)
        {
            two[i][j] = two[i][j] * 2;
        }
    }
    return;
}

void show(int show[][5], int n)
{
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < 5; j++)
            printf("%d ", show[i][j]);
        putchar('\n');
    }
    return 0;
}

第十二题

#include<stdio.h>
#define MONTHS 12
#define YEARS 5
float month(float arr[][MONTHS], int);
float year(float arr[][MONTHS], int);
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 }
    };

    printf("YEAR RAINFALL(inches)\n");
    year(rain, YEARS);
    printf("\nThe yearly average is %.1f inches.\n\n", (year(rain, YEARS)) / YEARS);//年平均雨量
    printf("MONTHLY AVERAGES:\n\n");
    printf("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\n");
    month(rain, YEARS);
    return 0;
}

float year(float arr[][MONTHS], int n)
{
    int y, m;
    float suby, total;
    for (y = 0, total = 0; y < YEARS; y++)
    {
        for (m = 0, suby = 0; m < MONTHS; m++)
            suby += arr[y][m];//
        printf("%5d %15.1f\n", 2010 + y, suby);//每年下雨总量
        total += suby;//下雨总量
    }
    return total;
}

float month(float arr[][MONTHS], int n)
{
    int y, m;
    float subm;
    for (m = 0; m < MONTHS; m++)
    {
        for (y = 0, subm = 0; y < YEARS; y++)
        {
            subm += arr[y][m];//单月下雨总量
        }
        printf("%4.1f", subm / YEARS);//单月平均雨量
    }
}

第十三题

#include <stdio.h>
void get(double ptr[3][5]);
double average(double ptr[][5], int row);
double total(double ptr[3][5]);
double max(double ptr[3][5]);
int main(void)
{
    double array[3][5];
    double aver[3];
    printf("Please enter 15 numbers for 3 rows:\n");
    get(array);
    int row;
    printf("Their averages are:\n");
    for (row = 0; row < 3; row++)
    {
        aver[row] = average(array, row);
        printf("%.3lf ", aver[row]);
    }
    putchar('\n');
    printf("The average for all of them is:\n");
    total(array);
    printf("%.3lf", (total(array)) / 15);
    printf("\n");
    printf("The biggest number of them is:\n");
    printf("%.3lf", max(array));
}

void get(double ptr[3][5])
{
    int i, j;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 5; j++)
        {
            scanf("%lf", &ptr[i][j]);
        }
    }
    return 0;
}

double average(double ptr[][5], int row)
{
    int i;
    double subtot = 0, aver;
    for (i = 0; i < 5; i++)
    {
        subtot += ptr[row][i];
    }
    aver = subtot / 5;
    return aver;
}

double total(double ptr[3][5])
{
    int i, j;
    double tot = 0;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 5; j++)
        {
            tot += ptr[i][j];
        }
    }
    return tot;
}

double max(double ptr[3][5])
{
    int i, j;
    double a = 0;
    for (i = 0; i < 3; i++)
    {
        for(j = 0; j < 5; j++)
        {
            if (a < ptr[i][j])
                a = ptr[i][j];
        }
    }
    return a;
}

第十四题

#include <stdio.h>
void get(int n, int m, double ptr[n][m]);
double average(int row, int m, double ptr[row][m]);
double total(int n, int m, double ptr[n][m]);
double max(int n, int m, double ptr[n][m]);
int main(void)
{
    double array[3][5];
    double aver[3];
    printf("Please enter 15 numbers for 3 rows:\n");
    get(3, 5, array);
    int row;
    printf("Their averages are:\n");
    for (row = 0; row < 3; row++)
    {
        aver[row] = average(row, 5, array);
        printf("%.3lf ", aver[row]);
    }
    putchar('\n');
    printf("The average for all of them is:\n");
    total(3, 5, array);
    printf("%.3lf", (total(3, 5, array)) / 15);
    printf("\n");
    printf("The biggest number of them is:\n");
    printf("%.3lf", max(3, 5, array));
}

void get(int n, int m, double ptr[n][m])
{
    int i, j;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 5; j++)
        {
            scanf("%lf", &ptr[i][j]);
        }
    }
    return 0;
}

double average(int row, int m, double ptr[row][m])
{
    int i;
    double subtot = 0, aver;
    for (i = 0; i < 5; i++)
    {
        subtot += ptr[row][i];
    }
    aver = subtot / 5;
    return aver;
}

double total(int n, int m, double ptr[n][m])
{
    int i, j;
    double tot = 0;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 5; j++)
        {
            tot += ptr[i][j];
        }
    }
    return tot;
}

double max(int n, int m, double ptr[n][m])
{
    int i, j;
    double a = 0;
    for (i = 0; i < 3; i++)
    {
        for(j = 0; j < 5; j++)
        {
            if (a < ptr[i][j])
                a = ptr[i][j];
        }
    }
    return a;
}

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值