天天看點

C Primer Plus(第六版)第10章 程式設計練習答案

題目字太多了略🤣有問題歡迎留言讨論~

IDE: Xcode

10-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 (* prain)[MONTHS] = rain; //因為prain指向的是一個const數組,是以要聲明一個const指針,不允許通過prain修改它指向的數組的值
    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 += *(*(prain + year) + month);
        printf("%5d %15.1f\n", 2010 + year, subtot);
        total +=subtot;  //5年的總降水量
    }
    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 Dec\n");

    for(month = 0; month < MONTHS; month++)
    {
        for(year = 0, subtot = 0; year < YEARS; year++)
            subtot += *(*(prain + year) + month);
        printf("%4.1f", subtot / YEARS);
    }
    printf("\n");

    return 0;
}
           

Output:

C Primer Plus(第六版)第10章 程式設計練習答案

10-2

#include <stdio.h>

void copy_arr(double trg[], double src[], int length);
void copy_ptr(double *trg, double *src, int length);
void copy_ptrs(double *trg, double *src_start, double *src_end);
void print_arr(double *print_arr, int length);

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

    copy_arr(target1, source, 5);
    copy_ptr(target2, source, 5);
    //C語言在配置設定空間時,指向數組最後第一個位置的指針仍是有效的指針,但儲存在此位置的值不确定,是以程式不能通路這個位置。
    copy_ptrs(target3, source, source + 5);

    print_arr(target1, 5);
    print_arr(target2, 5);
    print_arr(target3, 5);

    return 0;
}

void copy_arr(double trg[], double src[], int length)
{
    int i;
    for(i = 0; i < length; i++){
        trg[i] = src[i];
    }
}

void copy_ptr(double *trg, double *src, int length)
{
    int i;
    for(i = 0; i < length; i++){
        *trg = *src;
        trg++;
        src++;
    }
}

void copy_ptrs(double *trg, double *src_start, double *src_end)
{
    int i;
    for(i = 0; i < (src_end - src_start); i++){
        *trg = *(src_start + i);
        trg++;
    }
}

void print_arr(double *print_arr, int length)
{
    int i;
    for(i = 0; i < length; i++){
        printf("%.1f ", *(print_arr + i));
    }
    printf("\n");
}
           

Output:

C Primer Plus(第六版)第10章 程式設計練習答案

10-3

#include <stdio.h>

int max_value_in_array(int *array, int length);
void print_arr(int *print_arr, int length);

int main()
{
    int max;
    int arr[10] = {5, 86, 45, 8, 98, 1, 3, 67, 79, 5};

    max = max_in_array(arr, 10);
    print_arr(arr, 10);
    printf("max = %d\n", max);

    return 0;
}

int max_value_in_array(int *array, int length)
{
    int i;
    int max = 0;
    for(i = 0; i < length; i++){
        if(array[i] > max)
            max = array[i];
    }
    return max;
}

void print_arr(int *print_arr, int length)
{
    int i;
    for(i = 0; i < length; i++){
        printf("%d ", *(print_arr + i));
    }
    printf("\n");
}
           

Output:

C Primer Plus(第六版)第10章 程式設計練習答案

10-4

#include <stdio.h>

int max_index_in_array(double *array, int length);
void print_arr(double *print_arr, int length);

int main()
{
    int max_index;
    double arr[10] = {5.5, 86.6, 45.3, 8.9, 98.2, 1.7, 3.5, 67.1, 79.7, 5.8};

    max_index = max_index_in_array(arr, 10);
    print_arr(arr, 10);
    printf("max index = %d\n", max_index);

    return 0;
}

int max_index_in_array(double *array, int length)
{
    int i;
    int max_index = 0;
    double max_value = 0;
    for(i = 0; i < length; i++){
        if(array[i] > max_value){
            max_value = array[i];
            max_index = i;
        }
    }
    return max_index;
}

void print_arr(double *print_arr, int length)
{
    int i;
    for(i = 0; i < length; i++){
        printf("%.1f ", *(print_arr + i));
    }
    printf("\n");
}
           

Output:

C Primer Plus(第六版)第10章 程式設計練習答案

10-5

#include <stdio.h>

double diff_value_in_array(double *array, int length);
void print_arr(double *print_arr, int length);

int main()
{
    double arr_diff_value;
    double arr[10] = {5.5, 86.6, 45.3, 8.9, 98.2, 1.7, 3.5, 67.1, 79.7, 5.8};

    arr_diff_value = diff_value_in_array(arr, 10);
    print_arr(arr, 10);
    printf("The difference between the highest and the lowest values in array is %.1f\n", arr_diff_value);

    return 0;
}

double diff_value_in_array(double *array, int length)
{
    int i;
    double max_value = array[0];
    double min_value = array[0];
    double diff_value = 0;
    for(i = 0; i < length; i++){
        if(array[i] > max_value){
            max_value = array[i];
        }
        if(array[i] < min_value){
            min_value = array[i];
        }
    }
    diff_value = max_value - min_value;
    return diff_value;
}

void print_arr(double *print_arr, int length)
{
    int i;
    for(i = 0; i < length; i++){
        printf("%.1f ", *(print_arr + i));
    }
    printf("\n");
}
           

Output:

C Primer Plus(第六版)第10章 程式設計練習答案

10-6

#include <stdio.h>

void reverse_array(double *array, int length);
void print_arr(double *print_arr, int length);

int main()
{
    double arr_diff_value;
    double arr[10] = {5.5, 86.6, 45.3, 8.9, 98.2, 1.7, 3.5, 67.1, 79.7, 5.8};

    print_arr(arr, 10);
    printf("reverse this array:\n");
    reverse_array(arr, 10);
    print_arr(arr, 10);
    return 0;
}

void reverse_array(double *array, int length)
{
    int i;
    double temp;
    for(i = 0; i < length / 2; i++){
        temp = array[i];
        array[i] = array[length - 1 - i];
        array[length - 1 - i] = temp;
    }
}

void print_arr(double *print_arr, int length)
{
    int i;
    for(i = 0; i < length; i++){
        printf("%.1f ", *(print_arr + i));
    }
    printf("\n");
}
           

Output:

C Primer Plus(第六版)第10章 程式設計練習答案

10-7

#include <stdio.h>
#define ARRAY_X   2
#define ARRAY_Y   3
void copy_ptr(double *trg, double *src, int length);
void print_arr(double print_arr[ARRAY_X][ARRAY_Y]);
int main()
{
    double array[ARRAY_X][ARRAY_Y] = {{1.1, 2.2, 3.3}, {4.4, 5.5, 6.6}};
    double array_copy[ARRAY_X][ARRAY_Y];
    int i;

    for(i = 0; i < ARRAY_X; i++){
        copy_ptr(array_copy[i], array[i], 3);
    }
    printf("array:\n");
    print_arr(array);
    printf("copy array to new array:\n");
    print_arr(array_copy);

    return 0;
}

void copy_ptr(double *trg, double *src, int length)
{
    int i;
    for(i = 0; i < length; i++){
        *trg = *src;
        trg++;
        src++;
    }
}

void print_arr(double print_arr[ARRAY_X][ARRAY_Y])
{
    int i, j;
    for(i = 0; i < ARRAY_X; i++){
        for(j = 0; j < ARRAY_Y; j++){
            printf("%.1f ", print_arr[i][j]);
        }
    }
    printf("\n");
}
           

Output:

C Primer Plus(第六版)第10章 程式設計練習答案

10-8

#include <stdio.h>

void copy_ptr(double *trg, double *src, int length);
void print_arr(double *print_arr, int length);

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

    copy_ptr(array_b, &array_a[2], 3);

    printf("array a:\n");
    print_arr(array_a, 7);
    printf("copy array_a to array_b:\n");
    print_arr(array_b, 3);

    return 0;
}

void copy_ptr(double *trg, double *src, int length)
{
    int i;
    for(i = 0; i < length; i++){
        *trg = *src;
        trg++;
        src++;
    }
}

void print_arr(double *print_arr, int length)
{
    int i;
    for(i = 0; i < length; i++){
        printf("%.1f ", *(print_arr + i));
    }
    printf("\n");
}
           

Output:

C Primer Plus(第六版)第10章 程式設計練習答案

10-9

#include <stdio.h>
void copy_array(int rows, int cols, double src_arr[rows][cols], double trg_arr[rows][cols]);
void print_array(int rows, int cols, double array[rows][cols]);

int main()
{
    double array_a[3][5] = {
        {1.1, 2.2, 3.3, 4.4, 5.5},
        {6.6, 7.7, 8.8, 9.9, 10.10},
        {11.11, 12.12, 13.13, 14.14, 15.15}
    };
    double array_b[3][5];

    copy_array(3, 5, array_a, array_b);
    printf("array a:\n");
    print_array(3, 5, array_a);
    printf("copy array_a to array_b:\n");
    print_array(3, 5, array_b);

    return 0;
}

void copy_array(int rows, int cols, double src_arr[rows][cols], double trg_arr[rows][cols])
{
    int i, j;
    for(i = 0; i < rows; i++){
        for(j = 0; j < cols; j++){
            trg_arr[i][j] = src_arr[i][j];
        }
    }
}

void print_array(int rows, int cols, double array[rows][cols])
{
    int i, j;
    for(i = 0; i < rows; i++){
        for(j = 0; j < cols; j++){
            printf("%.2f ", array[i][j]);
        }
    }
    printf("\n");
}
           

Output:

C Primer Plus(第六版)第10章 程式設計練習答案

10-10

#include <stdio.h>
#define LENGTH 4

void add_array(int length, int * arr_a, int * arr_b, int * arr_sum);
void print_arr(int *print_arr, int length);

int main()
{
    int array_a[LENGTH] = {2, 4, 5, 8};
    int array_b[LENGTH] = {1, 0, 4, 6};
    int array_c[LENGTH];

    add_array(LENGTH, array_a, array_b, array_c);
    printf("array 1:\n");
    print_arr(array_a, LENGTH);
    printf("array 2:\n");
    print_arr(array_b, LENGTH);
    printf("add array 1 and array 2 element, array 3:\n");
    print_arr(array_c, LENGTH);

    return 0;
}

void add_array(int length, int * arr_a, int * arr_b, int * arr_sum)
{
    int i;
    for(i = 0; i < length; i++){
        arr_sum[i] = arr_a[i] + arr_b[i];
    }
}

void print_arr(int *print_arr, int length)
{
    int i;
    for(i = 0; i < length; i++){
        printf("%d ", *(print_arr + i));
    }
    printf("\n");
}
           

Output:

C Primer Plus(第六版)第10章 程式設計練習答案

10-11

#include <stdio.h>
#define ROW  3
#define COL  5
void double_array_value(int src_arr[][COL], int trg_arr[][COL], int rows);
void print_array(int array[][COL], int rows);

int main()
{
    int array_a[ROW][COL] = {
        {1, 2, 3, 4, 5},
        {6, 7, 8, 9, 10},
        {11, 12, 13, 14, 15}
    };
    int array_b[ROW][COL];

    double_array_value(array_a, array_b, ROW);
    printf("array:\n");
    print_array(array_a, ROW);
    printf("Double the values in the array:\n");
    print_array(array_b, ROW);

    return 0;
}

void double_array_value(int src_arr[][COL], int trg_arr[][COL], int rows)
{
    int i, j;
    for(i = 0; i < rows; i++){
        for(j = 0; j < COL; j++){
            trg_arr[i][j] = src_arr[i][j] * 2;
        }
    }
}

void print_array(int array[][COL], int rows)
{
    int i, j;
    for(i = 0; i < rows; i++){
        for(j = 0; j < COL; j++){
            printf("%d ", array[i][j]);
        }
    }
    printf("\n");
}
           

Output:

C Primer Plus(第六版)第10章 程式設計練習答案

10-12

#include <stdio.h>
#define MONTHS 12 //一年的月份數
#define YEARS 5   //年數

float rain_in_one_year(const float rain[YEARS][MONTHS], int year);
float rain_in_one_month_of_all_year(const float rain[YEARS][MONTHS], int month);

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++)
    {          //每一年,各月的降水量總和
        subtot = rain_in_one_year(rain, year);
        printf("%5d %15.1f\n", 2010 + year, subtot);
        total +=subtot;  //5年的總降水量
    }
    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 Dec\n");

    for(month = 0; month < MONTHS; month++)
    {
        subtot = rain_in_one_month_of_all_year(rain, month);
        printf("%4.1f", subtot / YEARS);
    }
    printf("\n");

    return 0;
}

float rain_in_one_year(const float rain[YEARS][MONTHS], int year)
{
    int month;
    float sum = 0;
    for(month = 0; month < MONTHS; month++)
        sum += rain[year][month];
    return sum;
}

float rain_in_one_month_of_all_year(const float rain[YEARS][MONTHS], int month)
{
    int year;
    float sum = 0;
    for(year = 0; year < YEARS; year++)
        sum += rain[year][month];
    return sum;
}
           

Output:

C Primer Plus(第六版)第10章 程式設計練習答案

10-13

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

void input_double_dimentional_array(double array[ROW][COL]);
double average_in_row(double array[COL]);
double average_in_array(double array[ROW][COL]);
double max_in_array(double array[ROW][COL]);

int main()
{
    double array[ROW][COL];
    int i;
    double avg_in_row, avg_in_arr, max_in_arr;

    //task a
    printf("Please enter 3 groups of numbers, each containing 5 double types:\n");
    input_double_dimentional_array(array);
    //task b
    for(i = 0; i < ROW; i++){
        avg_in_row = average_in_row(array[i]);
        printf("The average in group %d: %.2f\n", i, avg_in_row);
    }
    //task c
    avg_in_arr = average_in_array(array);
    printf("The average of all numbers : %.2f\n", avg_in_arr);
    //task d
    max_in_arr = max_in_array(array);
    printf("The max of all numbers : %.2f\n", max_in_arr);

    return 0;
}

void input_double_dimentional_array(double array[ROW][COL])
{
    int i, j;
    for(i = 0; i < ROW; i++){
        for(j =0; j <COL; j++){
            scanf("%lf", &array[i][j]);
        }
    }
}

double average_in_row(double array[COL])
{
    int i;
    double average = 0, sum = 0;
    for(i = 0; i < COL; i++){
        sum += array[i];
    }
    average = sum / COL;
    return average;
}

double average_in_array(double array[ROW][COL])
{
    int i;
    double avg_in_row_sum = 0, average = 0;
    for(i = 0; i < ROW; i++){
        avg_in_row_sum += average_in_row(array[i]);
    }
    average = avg_in_row_sum / ROW;
    return average;
}

double max_in_array(double array[ROW][COL])
{
    int i, j;
    double max = 0;
    for(i = 0; i < ROW; i++){
        for(j =0; j <COL; j++){
            if(array[i][j] > max)
                max = array[i][j];
        }
    }
    return max;
}
           

Output:

C Primer Plus(第六版)第10章 程式設計練習答案

10-14

#include <stdio.h>

void input_double_dimentional_array(int row, int col, double array[row][col]);
double average_in_row(int col, double array[col]);
double average_in_array(int row, int col, double array[row][col]);
double max_in_array(int row, int col, double array[row][col]);

int main()
{
    double array[3][5];
    int i;
    double avg_in_row, avg_in_arr, max_in_arr;
    
    //task a
    printf("[Use VLA]\n");
    printf("Please enter 3 groups of numbers, each containing 5 double types:\n");
    input_double_dimentional_array(3, 5, array);
    //task b
    for(i = 0; i < 3; i++){
        avg_in_row = average_in_row(5, array[i]);
        printf("The average in group %d: %.2f\n", i, avg_in_row);
    }
    //task c
    avg_in_arr = average_in_array(3, 5, array);
    printf("The average of all numbers : %.2f\n", avg_in_arr);
    //task d
    max_in_arr = max_in_array(3, 5, array);
    printf("The max of all numbers : %.2f\n", max_in_arr);
    
    return 0;
}

void input_double_dimentional_array(int row, int col, double array[row][col])
{
    int i, j;
    for(i = 0; i < row; i++){
        for(j =0; j <col; j++){
            scanf("%lf", &array[i][j]);
        }
    }
}

double average_in_row(int col, double array[col])
{
    int i;
    double average = 0, sum = 0;
    for(i = 0; i < col; i++){
        sum += array[i];
    }
    average = sum / col;
    return average;
}

double average_in_array(int row, int col, double array[row][col])
{
    int i;
    double avg_in_row_sum = 0, average = 0;
    for(i = 0; i < row; i++){
        avg_in_row_sum += average_in_row(col, array[i]);
    }
    average = avg_in_row_sum / row;
    return average;
}

double max_in_array(int row, int col, double array[row][col])
{
    int i, j;
    double max = 0;
    for(i = 0; i < row; i++){
        for(j =0; j <col; j++){
            if(array[i][j] > max)
                max = array[i][j];
        }
    }
    return max;
}
           

Output:

C Primer Plus(第六版)第10章 程式設計練習答案

繼續閱讀