C Primer Plus第十章编程题

1.编程题一
编写一个程序,初始化一个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>
#define LENGTH 5
void copy_arr(double target[],double source[],int n);//数组表示法拷贝数组 
void copy_ptr(double target[],double source[],int n);//指针表示法拷贝元素 
void copy_ptrs(double target[],double source[],double* n);//利用尾指针拷贝函数
void show_arr(double arr[],int n);//打印数组 
int main(void)
{
    double source[LENGTH]={1.1,2.2,3.3,4.4,5.5};
	double target1[LENGTH];
	double target2[LENGTH];
	double target3[LENGTH];
	
	printf("source[%d]=",LENGTH); 
	show_arr(source,LENGTH);
	
	printf("target1[%d]=",LENGTH); 
	copy_arr(target1,source,LENGTH);
	show_arr(target1,LENGTH);
	
	printf("target2[%d]=",LENGTH); 
	copy_ptr(target2,source,LENGTH);
	show_arr(target2,LENGTH);
	
	printf("target3[%d]=",LENGTH); 
	copy_ptrs(target3,source,source+LENGTH);
	show_arr(target3,LENGTH);
    
    return 0;
}
void copy_arr(double target[],double source[],int n)
{
	int i;
	
	for(i=0;i<n;i++)
	{
		target[i]=source[i];//数组表示法循环拷贝元素 
	}
}
void copy_ptr(double target[],double source[],int n)
{
	int i;
	
	for(i=0;i<n;i++)
	{
		*(target+i)=*(source+i);//指针表示法循环拷贝元素 
	}
}
void copy_ptrs(double target[],double source[],double* n)
{
	int i;
	
	for(i=0;i<n-source;i++)
	{
		*(target+i)=*(source+i);//循环拷贝元素 
	}
}
void show_arr(double arr[],int n)
{
	int i; 
	
	for(i=0;i<n;i++)
	{
		if(i==(n-1))//数组最后一个元素 
		{
			printf("%g}\n",arr[i]);
		}
		else if(i==0)//数组第一个元素 
		{
			printf("{%g,",arr[i]);	
		}
		else//数组除首尾之外的元素 
		{
			printf("%g,",arr[i]);	
		}
	}
}
2.编程题二
编写一个函数,把double类型数组中的数据倒序排列,并在一个简单的程序中测试该函数。

倒序排列和倒序不同
倒序排列是将原来放在数组最后一个位置的数据放到第一个,以此类推
倒序是按从大到小或从小到大的顺序放置数据

#include <stdio.h> 
#define LEN 10  

void  reverse_arr( double  ar[], int n); //声明倒序排列函数 
void show_arr( double  ar[], int n); //声明显示数组函数 

int main(void) 
{     
	double  orig[LEN] = {1.1,2,3,4,12,61.3,7,8,9,10};     
	double  max;
	show_arr(orig, LEN);//调用显示数组函数  
	reverse_arr(orig, LEN);//调用倒序排列函数              
	show_arr(orig, LEN);//调用显示数组函数 
	          
	return 0;
} 
void  reverse_arr( double  ar[], int n) //定义倒序排列函数
{     
	long int i; 
	double t;    
	         
	for (i = 0; i < n/2; i++)
//循环一半即可,实际上是元素之间的互相交换,所以只循环一半可完成倒序操作   
	{         
		double t = ar[i];
		ar[i] = ar[n - 1 - i];
		ar[n - 1 - i] = t; 
	}     

}
void show_arr( double  ar[], int n)//定义显示数组函数  
{     
	long long int i;
	          
	for (i = 0; i < n; i++)         
		printf("%g\t", ar[i]);     
	putchar('\n'); 
} 
3.编程题三

编写一个程序,初始化一个double类型的二维数组,使用编程练习2中的一个拷贝函数把该数组中的数据拷贝至另一个二维数组中(因为二维数组是数组的数组,所以可以使用处理一维数组的拷贝函数来处理数组中的每个子数组) 

#include<stdio.h>
#define ROWS 3
#define COLS 4
void show_arr(double arr[][COLS],int rows);//打印二维数组
void copy_arr(double target[][COLS],double source[][COLS],int rows);//数组表示法拷贝数组
int main(void)
{
    double source[ROWS][COLS]=
	{
		{1.5,2.6,3.4,4.8},
		{5.6,6.7,8.2,9.1},
		{10.6,10.8,11.6,13.5}
	};//原二维数组 
	double target[ROWS][COLS]={0};//用于拷贝的数组
	 
	printf("source[%d][%d]=\n",ROWS,COLS); 
	show_arr(source,ROWS);//打印原二维数组
	
	printf("target[%d][%d]=\n",ROWS,COLS);
	show_arr(target,ROWS);//打印拷贝前数组 
	
	copy_arr(target,source,ROWS);//调用函数拷贝数组
	printf("target[%d][%d]=\n",ROWS,COLS);
	show_arr(target,ROWS);//打印拷贝后数组 
	  
    return 0;
}
void show_arr(double arr[][COLS],int rows)
{
	int i;
	int j;
	
	printf("{\n");
	for(i=0;i<rows;i++)
	{
		printf("	");
		for(j=0;j<COLS;j++)
		{
			if(j==(COLS-1))//每行最后一个元素 
			{
				if(i!=(rows-1))//不是最后一行 
				{
					printf("%g},\n",arr[i][j]);
				}
				else//是最后一行 
				{
					printf("%g}\n",arr[i][j]);
				}
			}
			else if(j==0)//每行第一个元素 
			{
				printf("{%g,",arr[i][j]);	
			}
			else//每行除首尾之外的元素 
			{
				printf("%g,",arr[i][j]);	
			}
		}
	}
	printf("};\n");
}
void copy_arr(double target[][COLS],double source[][COLS],int rows)
{
	int i;
	int j;
	
	for(i=0;i<rows;i++)//按行的顺序来拷贝 
	{
		for(j=0;j<COLS;j++)//拷贝一行 
		{
			target[i][j]=source[i][j];
		}
	}
}
 4.编程题四

编写一个程序,提示用户输入3组数,每组数包含5个double类型的数(假设用户都正确地响应,不会输入非数值数据)。该程序应完成下列任务。
a. 把用户输入的数据储存在3X5的数组中
b.计算每组(5个)数据的平均值
c.计算所有数据的平均值
d.找出这15个数据中的最大值
e.打印结果
每个任务都要用单独的函数来完成(使用传统C处理数组的方式)。完成任务b,要编写一个计算并返回一维数组平均值的函数,利用循环调用该函数3次。对于处理其他任务的函数,应该把整个数组作为参数,完成任务c和d的函数应把结果返回主调函数

 

#include<stdio.h>
#define ROWS 3
#define COLS 5
void input(double arr[][COLS],int rows);//输入数组元素 
void show_arr(double arr[][COLS],int rows);//打印二维数组
double row_avg(double arr[][COLS],int rows);//计算每组的平均值
double arr_avg(double arr[][COLS],int rows);//计算所有数的平均值 
double arr_max(double arr[][COLS],int rows);//得到数组中的最大值 
int main(void)
{
	double array[ROWS][COLS]={0};//初始化二维数组 
	int i;//用于循环 
	double avg_row;//每组平均值 
	double avg;//数组平均值
	double max;//数组最大值 
	
	input(array,ROWS);//调用函数输入数组元素 
	
	printf("array[%d][%d]=\n",ROWS,COLS);
	show_arr(array,ROWS);//打印输入元素后的二维数组
	
	for(i=0;i<ROWS;i++)//循环调用计算每组平均值的函数 
	{
		avg_row=row_avg(array,i);
	}
	
	avg=arr_avg(array,ROWS);//调用函数获取数组平均值
	printf("数组的平均值是:%g\n",avg);
	
	max=arr_max(array,ROWS);//调用函数获取数组最大值
	printf("数组最大值是:%g\n",max); 
	
	
	return 0;
}
void input(double arr[][COLS],int rows)
{
	int i;
	int j;
	
	printf("请输入3组数据,每组有5个数:\n");//一个一个输入数组元素 
	for(i=0;i<rows;i++)
	{
		printf("请输入第%d组数据,有5个数:\n",i+1);
		for(j=0;j<COLS;j++)
		{
			printf("请输入第%d个数:",j+1);
			scanf("%lf",&arr[i][j]);
		}		
	}
}
void show_arr(double arr[][COLS],int rows)
{
	int i;
	int j;
	
	printf("{\n");
	for(i=0;i<rows;i++)
	{
		printf("	");
		for(j=0;j<COLS;j++)
		{
			if(j==(COLS-1))//每行最后一个元素 
			{
				if(i!=(rows-1))//不是最后一行 
				{
					printf("%g},\n",arr[i][j]);
				}
				else//是最后一行 
				{
					printf("%g}\n",arr[i][j]);
				}
			}
			else if(j==0)//每行第一个元素 
			{
				printf("{%g,",arr[i][j]);	
			}
			else//每行除首尾之外的元素 
			{
				printf("%g,",arr[i][j]);	
			}
		}
	}
	printf("};\n");
}
double row_avg(double arr[][COLS],int rows)
{
	double total_arr=0;//每组总和 
	int i;
	double avg_row;//每组平均值 
	
	for(i=0;i<COLS;i++)
	{
		total_arr+=arr[rows][i];//每组总和 
	}
	avg_row=total_arr/COLS;
	
	printf("第%d组的平均值是:%g\n",rows+1,avg_row);
	
	return 	avg_row;
}
double arr_avg(double arr[][COLS],int rows)
{
	double total=0;//总和 
	int i;
	int j; 
	double avg;//平均值 
	
	for(i=0;i<rows;i++)
	{
		for(j=0;j<COLS;j++)
		{
			total+=arr[i][j];//数组总和
		}	 
	}
	avg=total/(ROWS*COLS);
	
	return avg;
}
double arr_max(double arr[][COLS],int rows)
{
	int i;
	int j;
	double max=arr[0][0];
	
	for(i=0;i<rows;i++)
	{
		for(j=0;j<COLS;j++)
		{
			if(arr[i][j]>max)
			{
				max=arr[i][j];//比较后,把最大值赋给max 
			}
		}	 
	}
	
	return max;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值