C Primer Plus(第六版)第十章编程答案

// 修改程序清单10.7的rain.c程序,用指针进行计算(仍然要声明并初始化数组)。
#include "stdio.h" 
#define MONTHS 12
#define YEARS 5
int main(void)
{
	float (*pz) [12];
	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;
	pz=rain;
	printf("YEAR 	RAINFALL	(inches)\n");
	for (year=0,total=0;year<YEARS;year++)
	{
		for (month=0,subtot=0;month<MONTHS;month++)
			subtot+=*(*(pz+year)+month);
		printf("%5d %15.1f\n",2010,subtot);
		total+=subtot;		
	}
	printf("The yearly avarage is %.1f inches.\n",total/YEARS);
	printf("MONTHLY AVERAGES:\n");
	printf("Jan Feb Mar Apr May Jun Jul Aug Sep  Oct\n");
	for (month=0;month<MONTHS;month++)
	{
		for (year=0,subtot=0;year<YEARS;year++)
			subtot+=*(*(pz+year)+month);
		printf("%4.1f",subtot/YEARS);
	}
	return 0;
}

// 编写一个程序,初始化一个double类型的数组,然后把该数组的内容拷贝至
// 3个其他数组中(在main()函数中声明这4个数组)。使用带数组表示法的
// 函数进行第1份拷贝。使用带指针表示法和指针递增的函数进行第2份拷贝。把
// 目标数组名、原数组名和待拷贝的元素个数作为前两个函数的参数。第3个函数
// 以目标数组名、源数组名和指向原数组最后一个元素后面的元素的指针。也就是
// 说,给定以下声明,则函数调用如下所示:
// 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);
#include "stdio.h"
void copy_arr(double ar[],double ay[],int n);
void copy_ptr(double * pz,double * py,int n);
void copy_ptrs(double ab[],double ac[],double * ad);
int main(void)
{
	int i;
	double source[5]={1.1,2.2,3.3,4.4,5.5};
	double target1[5];
	double target2[5];
	double target3[5];
	for ( i = 0; i < 5; i++)
		printf("source[%d]%.1f   ",i,source[i]);
	printf("\n");
	copy_arr(target1,source,5);
	for ( i = 0; i < 5; i++)
		printf("target1[%d]%.1f   ",i,target1[i]);
	printf("\n");
	copy_ptr(target2,source,5);
	for ( i = 0; i < 5; i++)
		printf("target2[%d]%.1f   ",i,target2[i]);
	printf("\n");
	copy_ptrs(target3,source,source+5);
	for ( i = 0; i < 5; i++)
		printf("target3[%d]%.1f   ",i,target3[i]);
	return 0;
}
void copy_arr(double ar[],double ay[],int n)
{
	int i;
	for (i = 0; i < n; i++)
		ar[i]=ay[i];
}
void copy_ptr(double * pz,double * py,int n)
{
	int i;
	for (i = 0; i<n; i++)
	{
		*pz=*py;
		py++;
		pz++;
	}
}
void copy_ptrs(double ab[],double ac[],double * ad)
{
	int i=0;
	for(i=0;ac[i]<=*(ad-1);i++)	
		ab[i]=ac[i];			
}

// 编写一个函数,返回储存在int类型数组中的最大值,并在一个简单
// 的程序中测试该函数。
#include "stdio.h"
int large(int ar[],int n);
int main(void)
{
	int i,total;
	int suzu[10]={21,35,600,9,5,100,41,65,20,15};
	for ( i = 0; i < 10; i++)
		printf("suzu[%d]%d   ",i,suzu[i]);
	printf("\n");
	total=large(suzu,10);
	printf("\n");
	printf("The maximum is %d\n",total);
	return 0;
}
int large(int ar[],int n)
{
	int i,lar=0;
	for (i = 0; i < n; i++)
	{
		if (lar>ar[i])
			continue;
		else
			lar=ar[i];	
	}
	return lar;
}

(修改第三题一小部分)

// 编写一个函数,返回储存在double类型数组中的最大值的下标,并在一个简单
// 的程序中测试该函数。
#include "stdio.h"
int large(double ar[],int n);
int main(void)
{
	int i,total;
	double suzu[10]={21.0,3500.0,6.0,9.0,5.0,7000.0,41.0,650.0,200.0,15.0};
	for ( i = 0; i < 10; i++)
		printf("suzu[%d]%.1f   ",i,suzu[i]);
	printf("\n");
	total=large(suzu,10);
	printf("\n");
	printf("The maximum is %d\n",total);
	return 0;
}
int large(double ar[],int n)
{
	int i,lar=ar[1],g;
	for (i = 0; i < n; i++)
	{
		if (lar>ar[i])
			continue;
		else
		{
			g=i+1;
			lar=ar[i];	
		}
	}
	return g;
}

(修改第三题)

// 编写一个函数,返回储存在int类型数组中的最大值和最小值的差值,
// 并在一个简单的程序中测试该函数。
#include "stdio.h"
double large(double ar[],int n);
int main(void)
{
	int i;
	double total;
	double suzu[10]={21.0,35.0,6.0,9.0,5.0,100.0,41.0,65.0,20.0,15.0};
	for ( i = 0; i < 10; i++)
		printf("suzu[%d]%.1f   ",i,suzu[i]);
	printf("\n");
	total=large(suzu,10);
	printf("\n");
	printf("The maximum is %.1f\n",total);
	return 0;
}
double large(double ar[],int n)
{
	int i;
	double lar=ar[0],min=ar[0];
	for (i = 0; i < n; i++)
	{
		if (lar>ar[i])
			continue;
		else
			lar=ar[i];	
	}
	printf("%.1f\n",lar);
	for (i = 0; i < n; i++)
	{
		if (min<ar[i])
			continue;
		else
			min=ar[i];	
	}
	printf("%.1f\n",min);
	return lar-min;
}

// 编写一个函数,把double类型数组中的数据倒序排列,并在一个简单
// 的程序中测试该函数。
#include "stdio.h"
double large(double ar[],int n);
int main(void)
{
	int i;
	double suzu[10]={21.0,35.0,6.0,9.0,5.0,100.0,41.0,65.0,20.0,15.0};
	for ( i = 0; i < 10; i++)
		printf("suzu[%d]%.1f   ",i,suzu[i]);
	printf("\n");
	large(suzu,10);
	for ( i = 0; i < 10; i++)
		printf("suzu[%d]%.1f   ",i,suzu[i]);
	return 0;
}
double large(double ar[],int n)
{
	double temp[n];
	int i,j=9;
	for (i=0;i<n;i++)
	{
		temp[i]=ar[j];
		j--;
	}
	for (i=0;i<n;i++)
	{
		ar[i]=temp[i];
	}
}

// 编写一个程序,初始化一个double类型的二维数组,使用编程练习2中的一个
// 拷贝函数把该数组中的数据拷贝至另一个二维数组中(因为二维数组是数组的
// 数组,所以可以使用处理一维数组的拷贝函数来处理数组中的每个子数组)
#include "stdio.h"
void copy_ptr(double (* pz)[4],double (* py)[4],int n,int m);
int main()
{
	int i,m;
	double source[2][4]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8};
	double target1[2][4];
	copy_ptr(target1,source,2,4);
	for ( i = 0; i < 2; i++)
	{
		for (m = 0; m < 4; m++)
		{
			printf("source[%d][%d]%.1f   ",i,m,source[i][m]);
		}
	}
	printf("\n");
	for ( i = 0; i < 2; i++)
	{
		for (m = 0; m < 4; m++)
		{
			printf("target1[%d][%d]%.1f   ",i,m,target1[i][m]);
		}
	}
	return 0;
}
void copy_ptr(double (* pz)[4],double (* py)[4],int n,int m)
{
	int i,j;
	for (i = 0; i<n; i++)
	{
		for (j=0;j<m;j++)
		{
			*(*(pz)+j)=*(*(py)+j);
		}
		py++;
		pz++;
	}
}

/*使用编程练习2中的拷贝函数,把一个内含7个元素的数组第3~5个元素
拷贝至内含3个元素的数组中。该函数本身不需要修改,只需要选择合适
的实际参数(实际参数不需要是数组名和数组大小,只需要是数组元素
的地址和待处理元素的个数)*/
#include "stdio.h"
void copy_ptr(int * pz,int * py,int n);
int main(void)
{
	int source[7]={1,2,3,4,5,6,7};
	int target[3];
	int i;
	copy_ptr(target,&source[2],3);
	for ( i = 0; i < 3; i++)
		printf("target[%d]%d    ",i,target[i]);
	return 0;
}
void copy_ptr(int * pz,int * py,int n)
{
	int i;
	for ( i = 0; i < n; i++)
	{
		*pz=*py;
		py++;
		pz++;
	}
}


// 编写一个程序初始化一个double类型的3×5二维数组,使用一个处理边长数组
// 的函数将其拷贝至另一个二维数组中。还要编写一个以变长数组为形参的函数
// 以显示两个数组的内容。这两个函数应该能处理任意N×M数组(如果编译器不
// 支持变长数组,就使用传统C函数处理N×5的数组)。
#include "stdio.h"
#define N 3
#define M 5
void copy_ptr(int rows,int cols,double ar[rows][cols],double (*pz)[5]);
void prin(int rows,int cols,double ar[rows][cols]);
int main(void)
{
	double target1[N][M];
	double source[N][M]=
	{
		{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},
	};
	copy_ptr(N,M,source,target1);
	prin(N,M,source);
	printf("\n\n");
	prin(N,M,target1);
	return 0;
}
void copy_ptr(int rows,int cols,double ar[rows][cols],double (*pz)[5])
{
	int i,j;
	for ( i = 0; i < rows; i++)
	{
		for ( j = 0; j < cols; j++)
		{
			*(*(pz)+j)=ar[i][j];
		}
		pz++;
	}
}
void prin(int rows,int cols,double ar[rows][cols])
{
	int i,m;
	for ( i = 0; i < 3; i++)
	{
		for (m = 0; m < 5; m++)
		{
			printf("target1[%d][%d]%.2f   ",i,m,ar[i][m]);
		}
	}
}

// 编写一个函数,把两个数组中相对应的元素相加,然后把结果储存到第3
// 个数组中。也就是说,如果数组1中包含的值是2、4、5、8,数组2中包含的
// 值是1、0、4、6,那么该函数把3、4、9、14赋给第3个数组。函数接受3个数组
// 名和一个数组大小。在一个简单的程序中测试该函数。
#include "stdio.h"
void addition(int * pz,int * py,int *pr,int n);
int main(void)
{
	int i;
	int sub1[4]={2,4,5,8};
	int sub2[4]={1,0,4,6};
	int target[4];
	addition(sub1,sub2,target,4);
	for ( i = 0; i < 4; i++)
		printf("%d\n",target[i]);
	return 0;
}
void addition(int * pz,int * py,int *pr,int n)
{
	int i,j;
	for ( i = 0; i < n; i++)
	{
		*pr=*pz+*py;		
		pz++;
		pr++;
		py++;
	}
}

十一

// 编写一个程序,声明一个int类型的3×5二维数组,并用合适的值初始化它。
// 该程序打印数组中的值。然后各值翻倍(即是原值的2倍),并显示出各元素
// 的新值。编写一个函数显示数组的内容,再编写一个函数把各元素的值翻倍。
// 这两个函数都以函数名和行数作为参数。
#include "stdio.h"
#define COLS 5
void display(int ar[][COLS],int row);
void doubl(int pz[][COLS],int row);
int main(void)
{
	int i,j;
	int source[3][5]=
	{
		{1,2,3,4,5},
		{6,7,8,9,10},
		{11,12,13,14,15},
	};
	display(source,3);
	printf("\n\n\n");
	doubl(source,3);
	display(source,3);
	return 0;
}
void doubl(int pz[][COLS],int row)
{
	int i,j;
	for (i = 0; i <row; i++)
	{
		for (j = 0; j < COLS; j++)
			pz[i][j]*=2;
	}
}
void display(int ar[][COLS],int row)
{
	int i,j;
	for (i = 0; i <row ; i++)
	{
		for (j = 0; j <COLS; j++)
			printf("source[%d][%d]%d    ",i,j,ar[i][j]);				
	}
}

十二

// 重写程序清单10.7的rain.c程序,把main()中主要的任务都改成用函数来完成。
#include "stdio.h" 
#define MONTHS 12
#define YEARS 5
float ptr(float (*pz)[12],int rows,int cols);
void ptr_zz(float (*pz)[12],int rows,int cols);
int main(void)
{
	int year,month;
	float subtot,total;
	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}
	};
	total=ptr(rain,YEARS,MONTHS);
	printf("The yearly avarage is %.1f inches.\n",total/YEARS);
	printf("MONTHLY AVERAGES:\n");
	printf("Jan Feb Mar Apr May Jun Jul Aug Sep  Oct\n");
	ptr_zz(rain,YEARS,MONTHS);
	return 0;
}
float ptr(float (*pz)[12],int rows,int cols)
{
	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+=*(*(pz+year)+month);
		printf("%5d %15.1f\n",2010,subtot);
		total+=subtot;		
	}
	return total;
}
void ptr_zz(float (*pz)[12],int rows,int cols)
{
	int year,month;
	float subtot,total;
	for (month=0;month<MONTHS;month++)
	{
		for (year=0,subtot=0;year<YEARS;year++)
			subtot+=*(*(pz+year)+month);
		printf("%4.1f",subtot/YEARS);
	}
}

十三

// 编写一个程序,提示用户输入3组数,每组数包含5各double类型的数(假设用户
// 都正确地响应,不会输入非数值数据。)该程序应完成下列任务。
// a.把用户输入的数据储存在3×5的数组中
// b.计算每组(5个)数据的平均值
// c.计算所有数据的平均值
// d.找出这15个数据中的最大值
// e 打印结果
// 每个任务都要用单独的函数来完成(使用传统C处理数组方式)。完成任务b,要编写
// 一个计算并返回一维数组平均值的函数,利用循环调用该函数3次。对于处理其他任务
// 的函数,应该把整个数组作为参数,完成任务c和d的函数应把结果返回主调函数。
#include "stdio.h"
void input(double (* pz)[5],int rows,int cols);
void scan(double (* pr)[5],int rows,int cols);
void average(double ar[][5],int rows);
double allave(double (* py)[5],int rows,int cols);
double max(double (* ps)[5],int rows,int cols);
int main(void)
{
	double ave,max1;
	int rows,cols;
	double arr[3][5];
	input(arr,3,5);
	average(arr,0);
	average(arr,1);
	average(arr,2);
	ave=allave(arr,3,5);
	printf("All averages %.2lf\n",ave);
	max1=max(arr,3,5);
	printf("Maximum number%.2lf\n",max1);
	scan(arr,3,5);
	return 0;
}
void input(double (* pz)[5],int rows,int cols)
{
	int i,j;
	printf("Please enetr number of 15 double types\n");
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)		
			scanf("%lf",*(pz+i)+j);
	}
}
void scan(double (* pr)[5],int rows,int cols)
{
	int i,j;
	for ( i = 0; i <rows; i++)
	{
		for ( j = 0; j <cols ; j++)
		printf("%.2lf    ",*(*(pr+i)+j));
	}
}
void average(double ar[][5],int rows)
{
	int j;
	double ave=0;
	for (j = 0; j <5; j++)
		ave+=ar[rows][j];
	printf("%dgroup%.2lf\n",rows+1,ave/5);;
}
double allave(double (* py)[5],int rows,int cols)
{
	int i,j;
	double ave=0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
			ave+=*(*(py+i)+j);
	}
	return ave/15;
}
double max(double (* ps)[5],int rows,int cols)
{
	int i,j;
	double maxs=**ps;
	for ( i = 0; i < rows; i++)
	{
		for ( j = 0; j < cols; j++)
		{
			if (maxs>*(*(ps+i)+j))
				continue;
			else
				maxs=*(*(ps+i)+j);
		}
	}
	return maxs;
}

十四

// 以变长数组作为函数形参,完成编程练习13.
#include "stdio.h"
void input(int rows,int cols,double pz[rows][cols]);
void scan(int rows,int cols,double pr[rows][cols]);
void average(int rows,double ar[rows],int n);
double allave(int rows,int cols,double py[rows][cols]);
double max(int rows,int cols,double ps[rows][cols]);
int main(void)
{
	double ave,max1;
	int rows,cols;
	double arr[3][5];
	input(3,5,arr);
	average(5,arr[0],0);
	average(5,arr[1],1);
	average(5,arr[2],2);
	ave=allave(3,5,arr);
	printf("All averages %.2lf\n",ave);
	max1=max(3,5,arr);
	printf("Maximum number%.2lf\n",max1);
	scan(3,5,arr);
	return 0;
}
void input(int rows,int cols,double pz[rows][cols])
{
	int i,j;
	printf("Please enetr number of 15 double types\n");
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)		
			scanf("%lf",*(pz+i)+j);
	}
}
void scan(int rows,int cols,double pr[rows][cols])
{
	int i,j;
	for ( i = 0; i <rows; i++)
	{
		for ( j = 0; j <cols ; j++)
		printf("%.2lf    ",*(*(pr+i)+j));
	}
}
void average(int rows,double ar[rows],int n)
{
	int j;
	double ave=0;
	for (j = 0; j <5; j++)
		ave+=ar[j];
	printf("%dgroup%.2lf\n",n+1,ave/rows);;
}
double allave(int rows,int cols,double py[rows][cols])
{
	int i,j;
	double ave=0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
			ave+=*(*(py+i)+j);
	}
	return ave/15;
}
double max(int rows,int cols,double ps[rows][cols])
{
	int i,j;
	double maxs=**ps;
	for ( i = 0; i < rows; i++)
	{
		for ( j = 0; j < cols; j++)
		{
			if (maxs>*(*(ps+i)+j))
				continue;
			else
				maxs=*(*(ps+i)+j);
		}
	}
	return maxs;
}

如有问题请留言,会及时回复。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

X在学了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值