天天看點

《C Primer Plus》(第6版)程式設計練習——第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}
	};
	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);
		printf("%5d %15.1f\n", 2010 + year, 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 ");
	printf(" Nov  Dec\n");

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

	return 0;
}
           

第2題

#include <stdio.h>
void copy_arr(double[], const double[], int);
void copy_ptr(double*, const double*, int);
void copy_ptrs(double[], const double[], double*);
void show_arr(const double*, int);
int main(void)
{
	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);
	copy_ptrs(target3, source, source + 5);
	printf("source array:\n");
	show_arr(source, 5);
	printf("target1 array:\n");
	show_arr(target1, 5);
	printf("target2 array:\n");
	show_arr(target2, 5);
	printf("target3 array:\n");
	show_arr(target3, 5);

	return 0;
}

void copy_arr(double art[], const double ars[], int n)
{
	int i;

	for (i = 0; i < n; i++)
		art[i] = ars[i];
}

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

void copy_ptrs(double art[], const double ars[], double* end)
{
	while (ars < end)
		*art++ = *ars++;
}

void show_arr(const double* arr, int n)
{
	int i;

	for (i = 0; i < n; i++)
		printf("%g ", arr[i]);
	printf("\n");
}
           

第3題

#include <stdio.h>
int max_arr(const int*, int);
void show_arr(const int*, int);
#define LEN 10
int main(void)
{
	int orig[LEN] = { 1,2,3,4,12,6,7,8,9,10 };
	
	show_arr(orig, LEN);
	printf("max = %d\n", max_arr(orig, LEN));

	return 0;
}

void show_arr(const int* arr, int n)
{
	int i;

	for (i = 0; i < n; i++)
		printf("%d ", arr[i]);
	printf("\n");
}

int max_arr(const int* arr, int n)
{
	int max = arr[0];
	int i;

	for (i = 1; i < n; i++)
		max = max > arr[i] ? max : arr[i];

	return max;
}
           

第4題

#include <stdio.h>
int maxindex_arr(const double*, int);
void show_arr(const double*, int);
#define LEN 10
int main(void)
{
	double orig[LEN] = { 1.1,2,3,4,12,61.3,7,8,9,10 };
	
	show_arr(orig, LEN);
	printf("The index of max value is %d\n", maxindex_arr(orig, LEN));

	return 0;
}

void show_arr(const double* arr, int n)
{
	int i;

	for (i = 0; i < n; i++)
		printf("%g ", arr[i]);
	printf("\n");
}

int maxindex_arr(const double* arr, int n)
{
	double max = arr[0];
	int maxindex = 0;
	int i;

	for (i = 1; i < n; i++)
		if (max < arr[i])
		{
			max = arr[i];
			maxindex = i;
		}

	return maxindex;
}
           

第5題

#include <stdio.h>
double dif_arr(const double*, int);
void show_arr(const double*, int);
#define LEN 10
int main(void)
{
	double orig[LEN] = { 1.1,2,3,4,12,61.3,7,8,9,10 };
	
	show_arr(orig, LEN);
	printf("The difference of max value and min value is %g\n", dif_arr(orig, LEN));

	return 0;
}

void show_arr(const double* arr, int n)
{
	int i;

	for (i = 0; i < n; i++)
		printf("%g ", arr[i]);
	printf("\n");
}

double dif_arr(const double* arr, int n)
{
	double min = arr[0];
	double max = arr[0];
	int i;

	for (i = 1; i < n; i++)
	{
		min = arr[i] < min ? arr[i] : min;
		max = arr[i] > max ? arr[i] : max;
	}

	return max - min;
}
           

第6題

#include <stdio.h>
void show_arr(const double*, int);
void inv_arr(double*, int);
#define LEN 10
int main(void)
{
	double orig[LEN] = { 1.1,2,3,4,12,61.3,7,8,9,10 };
	
	printf("The original array:\n");
	show_arr(orig, LEN);
	inv_arr(orig, LEN);
	printf("The inverted array:\n");
	show_arr(orig, LEN);

	return 0;
}

void show_arr(const double* arr, int n)
{
	int i;

	for (i = 0; i < n; i++)
		printf("%g ", arr[i]);
	printf("\n");
}

void inv_arr(double* arr, int n)
{
	double temp;
	int i;

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

第7題

#include <stdio.h>
void copy_arr(double*, const double*, int);
#define ROWS 2
#define COLS 5
int main(void)
{
	double orig[ROWS][COLS] = { {1.1,2,3,4,12},{61.3,7,8,9,10} };
	double target[ROWS][COLS];
	int i, j;
	int index;
	for (index = 0; index < ROWS; index++)
		copy_arr(target[index], orig[index], COLS);
	printf("target array:\n");
	for (i = 0; i < ROWS; i++)
	{
		for (j = 0; j < COLS; j++)
			printf("%g ", target[i][j]);
		printf("\n");
	}

	return 0;
}

void copy_arr(double* art, const double* ars, int n)
{
	int i;

	for (i = 0; i < n; i++)
		art[i] = ars[i];
}
           

第8題

#include <stdio.h>
void copy_arr(double*, const double*, int);
void show_arr(const double*, int);
#define LEN1 7
#define LEN2 3
int main(void)
{
	double orig[LEN1] = { 1.1,2,3,4,12,61.3,7 };
	double target[LEN2];
	
	copy_arr(target, orig + 2, LEN2);
	printf("original array:\n");
	show_arr(orig, LEN1);
	printf("target array:\n");
	show_arr(target, LEN2);

	return 0;
}

void copy_arr(double* art, const double* ars, int n)
{
	int i;

	for (i = 0; i < n; i++)
		art[i] = ars[i];
}

void show_arr(const double* arr, int n)
{
	int i;

	for (i = 0; i < n; i++)
		printf("%g ", arr[i]);
	printf("\n");
}
           

第9題

// 變長數組版本(本人IDE不支援,無法編譯)
#include <stdio.h>
#define ROWS 3
#define COLS 5
void copy_vla(int rows, int cols, double art[rows][cols], const double ars[rows][cols]);
void show_vla(int rows, int cols, const double arr[rows][cols]);
int main(void)
{
	double source[ROWS][COLS] = {
			{1,2,3,4,5},
			{6,7,8,-2,10},
			{11,12,13,14,15}
	};
	double target[ROWS][COLS];

	copy_vla(ROWS, COLS, target, source);
	printf("source array:\n");
	show_vla(ROWS, COLS, source);
	printf("target array:\n");
	show_vla(ROWS, COLS, target);

	return 0;
}

void copy_vla(int rows, int cols, double art[rows][cols], const double ars[rows][cols])
{
	int i, j;

	for (i = 0; i < rows; i++)
		for (j = 0; j < cols; j++)
			art[i][j] = ars[i][j];
}

void show_vla(int rows, int cols, const double arr[rows][cols])
{
	int i, j;

	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
			printf("%g ", arr[i][j]);
		printf("\n");
	}
	printf("\n");
}
           
// 傳統數組版本
#include <stdio.h>
#define ROWS 3
#define COLS 5
void copy_arr(double[][COLS], const double[][COLS], int);
void show_arr(const double[][COLS], int);
int main(void)
{
	double source[ROWS][COLS] = {
			{1,2,3,4,5},
			{6,7,8,-2,10},
			{11,12,13,14,15}
	};
	double target[ROWS][COLS];

	copy_arr(target, source, ROWS);
	printf("source array:\n");
	show_arr(source, ROWS);
	printf("target array:\n");
	show_arr(target, ROWS);

	return 0;
}

void copy_arr(double art[][COLS], const double ars[][COLS], int n)
{
	int i, j;

	for (i = 0; i < n; i++)
		for (j = 0; j < COLS; j++)
			art[i][j] = ars[i][j];
}

void show_arr(const double arr[][COLS], int n)
{
	int i, j;

	for (i = 0; i < n; i++)
	{
		for (j = 0; j < COLS; j++)
			printf("%g ", arr[i][j]);
		printf("\n");
	}
	printf("\n");
}
           

第10題

#include <stdio.h>
#define LEN 4
void add_arr(const int[], const int[], int[], int);
void show_arr(const int[], int);
int main(void)
{
	int arr1[LEN] = { 2,4,5,8 };
	int arr2[LEN] = { 1,0,4,6 };
	int arr3[LEN];

	add_arr(arr1, arr2, arr3, LEN);
	printf("array 1:\n");
	show_arr(arr1, LEN);
	printf("array 2:\n");
	show_arr(arr2, LEN);
	printf("The added array:\n");
	show_arr(arr3, LEN);

	return 0;
}

void add_arr(const int arr1[], const int arr2[], int arr3[], int n)
{
	int i;

	for (i = 0; i < n; i++)
		arr3[i] = arr1[i] + arr2[i];
}

void show_arr(const int arr[], int n)
{
	int i;

	for (i = 0; i < n; i++)
		printf("%d ", arr[i]);
	printf("\n");
}
           

第11題

#include <stdio.h>
#define ROWS 3
#define COLS 5
void dou_arr(int[][COLS], int);
void show_arr(const int[][COLS], int);
int main(void)
{
	int orig[ROWS][COLS] = {
			{1,2,3,4,5},
			{6,7,8,-2,10},
			{11,12,13,14,15}
	};

	printf("Original array:\n");
	show_arr(orig, ROWS);
	dou_arr(orig, ROWS);
	printf("Doubled array:\n");
	show_arr(orig, ROWS);

	return 0;
}

void dou_arr(int arr[][COLS], int n)
{
	int i, j;

	for (i = 0; i < n; i++)
		for (j = 0; j < COLS; j++)
			arr[i][j] *= 2;
}

void show_arr(const int arr[][COLS], int n)
{
	int i, j;

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

第12題

#include <stdio.h>
#define MONTHS 12
#define YEARS   5
void rainfall_year(const float[][MONTHS], int);
void rainfall_month(const float[][MONTHS], int);
int main(void)
{
	// initializing rainfall data for 2010 - 2014
	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}
	};
	
	rainfall_year(rain, YEARS);
	rainfall_month(rain, YEARS);

	return 0;
}

void rainfall_year(const float arr[][MONTHS], int years)
{
	int y, m;
	float subtot, total;
	
	printf(" YEAR    RAINFALL  (inches)\n");
	for (y = 0, total = 0; y < years; y++)
	{
		for (m = 0, subtot = 0; m < MONTHS; m++)
			subtot += arr[y][m];
		printf("%5d %15.1f\n", 2010 + y, subtot);
		total += subtot;
	}
	printf("\nThe yearly average is %.1f inches.\n\n",
		total / years);
}

void rainfall_month(const float arr[][MONTHS], int years)
{
	int y, m;
	float subtot, total;

	printf("MONTHLY AVERAGES:\n\n");
	printf(" Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct ");
	printf(" Nov  Dec\n");
	for (m = 0; m < MONTHS; m++)
	{
		for (y = 0, subtot = 0; y < years; y++)
			subtot += arr[y][m];
		printf("%4.1f ", subtot / years);
	}
	printf("\n");
}
           

第13題

#include <stdio.h>
#define ROWS 3
#define COLS 5
void store(double[][COLS], int);
void show_arr(const double[][COLS], int);
double average(const double[], int);
double average2d(const double[][COLS], int);
double max(const double[][COLS], int);
int main(void)
{
	double stuff[ROWS][COLS];
	int row;

	store(stuff, ROWS);
	printf("\narray contents:\n");
	show_arr(stuff, ROWS);
	for (row = 0; row < ROWS; row++)
		printf("average value of row %d: %g\n", row + 1, average(stuff[row], COLS));
	printf("average value of all rows: %g\n", average2d(stuff, ROWS));
	printf("lagest value = %g\n", max(stuff, ROWS));
	printf("Bye.\n");

	return 0;
}

void store(double ar[][COLS], int n)
{
	int i, j;

	for (i = 0; i < n; i++)
	{
		printf("Enter %d numbers for row %d:\n", COLS, i + 1);
		for (j = 0; j < COLS; j++)
		{
			printf("Enter value #%d: ", j + 1);
			scanf("%lf", &ar[i][j]);
		}
	}
}

void show_arr(const double ar[][COLS], int n)
{
	int i, j;

	for (i = 0; i < n; i++)
	{
		for (j = 0; j < COLS; j++)
			printf("%g ", ar[i][j]);
		printf("\n");
	}
	printf("\n");
}

double average(const double ar[], int n)
{
	int i;
	double sum = 0;

	for (i = 0; i < n; i++)
		sum += ar[i];

	return sum / n;
}

double average2d(const double ar[][COLS], int n)
{
	int i, j;
	double sum = 0;

	for (i = 0; i < n; i++)
		for (j = 0; j < COLS; j++)
			sum += ar[i][j];

	return sum / (n * COLS);
}

double max(const double ar[][COLS], int n)
{
	int i, j;
	double max = ar[0][0];

	for (i = 0; i < n; i++)
		for (j = 0; j < COLS; j++)
			if (ar[i][j] > max)
				max = ar[i][j];

	return max;
}
           

第14題

// 本人IDE不支援變長數組,無法編譯
#include <stdio.h>
#define ROWS 3
#define COLS 5
void store(int r,int c,double ar[r][c]);
void show_arr(int r, int c, const double ar[r][c]);
double average(const double[], int);
double average2d(int r, int c, const double ar[r][c]);
double max(int r, int c, const double ar[r][c]);
int main(void)
{
	double stuff[ROWS][COLS];
	int row;

	store(ROWS, COLS, stuff);
	printf("\narray contents:\n");
	show_arr(ROWS, COLS, stuff);
	for (row = 0; row < ROWS; row++)
		printf("average value of row %d: %g\n", row + 1, average(stuff[row], COLS));
	printf("average value of all rows: %g\n", average2d(ROWS, COLS, stuff));
	printf("lagest value = %g\n", max(ROWS, COLS, stuff));
	printf("Bye.\n");

	return 0;
}

void store(int r, int c, double ar[r][c])
{
	int i, j;

	for (i = 0; i < r; i++)
	{
		printf("Enter %d numbers for row %d:\n", c + 1, i + 1);
		for (j = 0; j < c; j++)
		{
			printf("Enter value #%d: ", j + 1);
			scanf("%lf", &ar[i][j]);
		}
	}
}

void show_arr(int r, int c, const double ar[r][c])
{
	int i, j;

	for (i = 0; i < r; i++)
	{
		for (j = 0; j < c; j++)
			printf("%g ", ar[i][j]);
		printf("\n");
	}
	printf("\n");
}

double average(const double ar[], int n)
{
	int i;
	double sum = 0;

	for (i = 0; i < n; i++)
		sum += ar[i];

	return sum / n;
}

double average2d(int r, int c, const double ar[r][c])
{
	int i, j;
	double sum = 0;

	for (i = 0; i < r; i++)
		for (j = 0; j < c; j++)
			sum += ar[i][j];

	return sum / (r * c);
}

double max(int r, int c, const double ar[r][c])
{
	int i, j;
	double max = ar[0][0];

	for (i = 0; i < r; i++)
		for (j = 0; j < c; j++)
			if (ar[i][j] > max)
				max = ar[i][j];

	return max;
}