C prime plus 第十章 编程练习答案

拖更严重,但还是祝大家新春快乐~情人节快乐!

/* 10-1.c -- 修改程序清单10.7的rain.c程序,用指针进行计算(仍然要声明并初始化数组)*/ 
#include<stdio.h>

#define MONTHS 12
#define YEARS 5
int main(void)
{
	// 用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 }
	};
	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 %.lf inches.\n\n",total / YEARS);
	printf("MONTHLY AVERAGES:\n\n");
	printf(" Jab  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;
}
/* 10-2.c -- 练习数组表示法、指针表示法等 */
#include<stdio.h>

#define SIZE 5
void copy_arr(double ard[], double sod[], int n);
void copy_ptr(double *ard, double *sod, int n);
void copy_ptrs(double *ard, double *sod, double *new_sod);

int main(void)
{
	double source[SIZE] = { 1.1,2.2,3.3,4.4,5.5 };
	double target1[SIZE];
	double target2[SIZE];
	double target3[SIZE];
	copy_arr(target1, source, SIZE);
	copy_ptr(target2, source, SIZE);
	copy_ptrs(target3, source, source + SIZE);
	printf("%5s %8s %8s %8s\n","index","target1","target2","target3");
	for (int i = 0; i < SIZE; i++)
		printf("  %d     %.2lf      %.2lf     %.2lf\n",i,target1[i],target2[i],target3[i]);
	return 0;
}

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

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

void copy_ptrs(double *ard, double *sod, double *new_sod)
{
	while (sod < new_sod)
		*ard++ = *sod++;
}
/* 10-3.c -- 返回存储在int类型数组中的最大值 */
#include<stdio.h>

#define SIZE 5
int Max_value(int arr[],int n); // 数组表示法
// int Max_value(int *arr,int n);  指针表示法	
int main(void)
{
	int arr[SIZE];

	printf("请输入五个整数值:");
	for (int i = 0; i < SIZE; i++)
		scanf("%d",&arr[i]);
	printf("该五个整数中,最大的整数是%d\n",Max_value(arr,SIZE));

	return 0;
}

int Max_value(int arr[], int n)
{
	int max = 0;
	for (int i = 0; i < n; i++)
	{
		if (arr[i] > max)
			max = arr[i];
	}
	return max;
}
/* 10-4.c -- 返回储存在double类型数组中最大值的下标  */
#include<stdio.h>

#define SIZE 5
int Return_index(double arr[], int n);


int main(void)
{
	double arr[SIZE];
	double *max;
	int index;
	printf("请输入五个双精度浮点类型的数值:");
	for (int i = 0; i < SIZE; i++)
		scanf("%lf",&arr[i]);
	index = Return_index(arr, SIZE);
	printf("最大值的下标为:%d\n",index);

	return 0;
} 
// 如果该数组中有两个相等的最大值,那么可以附加一下条件,这里只演示一般情况
int Return_index(double arr[], int n)
{
	int index;
	double max1 = 0.0;
	for (int i = 0; i < n; i++)
	{
		if (arr[i] > max1)
		{
			max1 = arr[i];
			index = i;
		}
	}
	return index;
}
/* 10-5.c -- 返回存储在double类型数组中最大值和最小值的差值  */
#include<stdio.h>

#define SIZE 5
double Max_sub_Min(double *arr, int n);

int main(void)
{
	double arr[SIZE] = { 10.5 ,2.5,6.8,9.7,1.2 };

	printf("该数组中最大值和最小值的差为:%.2lf\n",Max_sub_Min(arr,SIZE));
	return 0;
}

double Max_sub_Min(double *arr, int n)
{
	double max = 0.0;
	double min = 100.0;
	for (int i = 0; i < n; i++)
	{
		if (max < arr[i])
			max = arr[i];
		if (min > arr[i])
			min = arr[i];
	}
	return max - min;
}
/* 10-6.c -- 将double数组的数倒序排列 */
#include<stdio.h>

#define SIZE 5
void Invertod_arr(double *arr, int n);
int main(void)
{
	double arr[SIZE] = {1.2,5.6,9.8,4.2,3.2};

	Invertod_arr(arr, SIZE);
	for (int i = 0; i < SIZE; i++)
		printf("%.2lf ",arr[i]);
	printf("\n");
	return 0;
}

void Invertod_arr(double *arr, int n)
{
	double temp;
	for (int i = 0; i < n / 2; i++)
	{
		temp = arr[i];
		arr[i] = arr[n - i - 1];
		arr[n - i - 1] = temp;
	}
}
/* 10-7.c -- 拷贝一个二维数组 */
#include<stdio.h>

#define ROW 3
#define COL 3
void copy_arr(double arr[][COL],double new_arr[][COL]);
/* *arr指代的是arr[ROW] */
int main(void)
{
	double new_arr[ROW][COL];
	double arr[ROW][COL] = {
		{1.0,2.0,3.0},
		{4.0,5.0,6.0},
		{6.0,7.0,8.0},
	};
	copy_arr(arr,new_arr);
	return 0;
}

void copy_arr(double arr[][COL], double new_arr[][COL])
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
			new_arr[i][j] = arr[i][j];
	}
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
			printf("%.2lf ", new_arr[i][j]);
		printf("\n");
	}
}
/* 10-8.c -- 把一个内含7个元素的数组中第3~第5个数组元素拷贝到内含3个元素的数组中 */
#include<stdio.h>

#define SIZE 7
void copy_arr(double *ptr, int n);

int main(void)
{
	double arr[SIZE] = {5.5,7.7,8.1,9.6,3.1,2.0,4.8};

	copy_arr(arr + 2, 3);
	printf("\n");
	return 0;
}

void copy_arr(double * ptr, int n)
{
	double temp[3];
	for (int i = 0; i < n; i++)
	{
		temp[i] = *ptr++;
	}
	for (int i = 0; i < n; i++)
	{
		printf("%.2lf ",temp[i]);
	}
}
/* 10-9.c -- 编译器不支持变长数组 */
#include<stdio.h>

#define ROW 3
#define COL 5

void copy_arr(double arr[][COL]);
void show_arr(double arr[][COL], double temp[][COL]);
int main(void)
{
	double arr[ROW][COL] = {
		{1.0,2.0,3.0,4.0,5.0},
		{2.0,3.0,4.0,5.0,6.0},
		{3.0,4.0,5.0,6.0,7.0},
	};
	copy_arr(arr);
	return 0;
}

void copy_arr(double arr[][COL])
{
	// 这里不允许temp[][COL]
	double temp[ROW][COL];
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
			temp[i][j] = arr[i][j];
	}
	show_arr(arr,temp);
}

void show_arr(double arr[][COL], double temp[][COL])
{
	printf("原数组的值为:\n");
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			printf("%.2lf ",arr[i][j]);
		}
		printf("\n");
	}
	printf("复制后数组的值为:\n");
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			printf("%.2lf ", temp[i][j]);
		}
		printf("\n");
	}
}
/* 10-10.c -- 将两个数组的元素相加到第三个数组 */
#include<stdio.h>

#define SIZE 5
void Add_array(int arr1[], int arr2[], int arr3[], int n);

int main(void)
{
	int arr1[SIZE] = {2, 3, 4, 5, 6};
	int arr2[SIZE] = {11, 10, 9, 8, 7};
	int arr3[SIZE];

	Add_array(arr1, arr2, arr3, SIZE);
	printf("\n");
	return 0;
}

void Add_array(int arr1[], int arr2[], int arr3[], int n)
{
	for (int i = 0; i < n; i++)
	{
		arr3[i] = arr1[i] + arr2[i];
		printf("%d ",arr3[i]);
	}
}
/* 10-11.c -- 超级加倍 */
#include<stdio.h>

#define ROW 3
#define COL 5
void show_arr(int arr[][COL], int row);
void Double_arr(int arr[][COL], int row);

int main(void)
{
	int arr[ROW][COL];
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
			scanf("%d",&arr[i][j]);
	}
	printf("\n该数组为:\n");
	show_arr(arr, ROW);
	printf("翻倍后的数组为:\n");
	Double_arr(arr, ROW);
	return 0;
}

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

void Double_arr(int arr[][COL], int row)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < COL; j++)
			printf("%d ", 2 * arr[i][j]);
		printf("\n");
	}
	printf("\n");
}
/* 10-12.c -- 重新编写rain.c */
#include<stdio.h>
#define MONTHS 12	// 一年的月份数
#define YEARS 5		// 年数

void Year_rain(const float arr[][MONTHS]);
void Month_rain(const float arr[][MONTHS]);
int main(void)
{
	// 用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 }
	};

	printf(" YEAR		RAINFALL  (inches)\n");
	Year_rain(rain);
	printf("MONTHLY AVERAGES:\n\n");
	printf(" Jan Feb Mar Apr May Jun Jul Aug Sep Oct ");
	printf("Nov Dec\n");
	Month_rain(rain);
	printf("\n");

	return 0;
}

void Year_rain(const float arr[][MONTHS])
{
	float subtot = 0.0;
	float total = 0.0;
	for (int year = 0; year < YEARS; year++)
	{
		for (int month = 0; month < MONTHS; month++)
			subtot += arr[year][month];
		printf("%5d %15.1f\n", 2010 + year, subtot);
		total += subtot;
	}
	printf("\nThe yearly average is %.1f inches.\n\n", total / YEARS);
}

void Month_rain(const float arr[][MONTHS])
{
	float subtot = 0.0;
	for (int month = 0; month < MONTHS; month++)
	{
		for (int year = 0; year < YEARS; year++)
			subtot += arr[year][month];
		printf("%4.1f ", subtot / YEARS);
	}
}
/* 10-13.c */
#include<stdio.h>

#define ROW 3
#define COL 5
// 将输入的数据存储在3x5的数组中
void Storage_arr(double temp[][COL],double arr1[],double arr2[],double arr3[]);
// 计算每组数据的平均值
double Average_value(double arr[]);
// 计算所有数据的平均值
double All_average(double temp[][COL]);
// 找出这15个数的最大值
double Max_value(double temp[][COL]);
// 打印结果
void show_arr(double temp[][COL]);
int main(void)
{
	double temp[ROW][COL];
	double arr1[COL];
	double arr2[COL];
	double arr3[COL];

	printf("请输入三组包含五个double类型的数值:");
	for (int i = 0; i < ROW; i++)
	{
		if (i == 0)
		{
			for (int j = 0; j < COL; j++)
				scanf("%lf",&arr1[j]);
		}
		if (i == 1)
		{
			for (int j = 0; j < COL; j++)
				scanf("%lf", &arr2[j]);
		}
		if (i == 2)
		{
			for (int j = 0; j < COL; j++)
				scanf("%lf", &arr3[j]);
		}
	}
	// task a 
	Storage_arr(temp, arr1, arr2, arr3);
	// task b
	for (int i = 0; i < ROW; i++)
	{
		if (i == 0)
			printf("第一组的平均值为:%.2lf",Average_value(arr1));
		if (i == 1)
			printf("第二组的平均值为:%.2lf", Average_value(arr2));
		if (i == 2)
			printf("第三组的平均值为:%.2lf", Average_value(arr3));
		printf("\n");
	}
	// task c
	printf("所有数据的平均值为:%.2lf\n",All_average(temp));
	// task d
	printf("所有数据中的最大值为:%.1lf\n",Max_value(temp));
	// task e
	show_arr(temp);
	return 0;
}

void Storage_arr(double temp[][COL],double arr1[], double arr2[], double arr3[])
{
	for (int i = 0; i < ROW; i++)
	{
		if (i == 0)
			for (int j = 0; j < COL; j++)
				temp[i][j] = arr1[j];
		if (i == 1)
			for (int j = 0; j < COL; j++)
				temp[i][j] = arr2[j];
		if (i == 2)
			for (int j = 0; j < COL; j++)
				temp[i][j] = arr3[j];
	}
}

double Average_value(double arr[])
{
	double sum = 0.0;
	for (int i = 0; i < COL; i++)
		sum += arr[i];

	return (sum / COL);
	printf("\n");
}

double All_average(double temp[][COL])
{
	double sum = 0.0;
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
			sum += temp[i][j];
	}
	return sum / (ROW * COL);
}

double Max_value(double temp[][COL])
{
	double max = 0.0;
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			if (max <= temp[i][j])
				max = temp[i][j];
		}
	}

	return max;
}

void show_arr(double temp[][COL])
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			printf("%.1lf ", temp[i][j]);
		}
		printf("\n");
	}
}

笔者编译器不支持边长数组VLA,所以在这里不再赘述第十四题。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值