《C Primer Plus 第五版》第十章编程练习

2、编写一个程序,初始化一个double数组,然后把数组内容复制到另外两个数组(3个数组都需要在主程序中声明)。制作第一份拷贝的函数使用数组符号。制作第二份拷贝的函数使用指针符号,并使用指针的增量操作。把目标数组名和要复制的元素数目作为参数传递给函数。也就是说,如果给定了下列声明,函数调用应该如下面所示:

double source[5]={1.1,2.2,3.3,4.4,5.5};

double target1[5];

double target2[5];

copy_arr(source,target1,5);

copy_ptr(source,target2,5);

#include <stdio.h>
void copy_arr(double [],double [],int);
void copy_ptr(double *,double *,int);
int main(void)
{
	double source[5]={1.1,2.2,3.3,4.4,5.5};
	double target1[5];
	double target2[5];
	int num=5;
	int a;

	printf(" Source:");
	for(a=0;a<5;a++)
		printf(" %g ",source[a]);
	copy_arr(source,target1,5);
	copy_ptr(source,target2,5);
	
	return 0;
}
void copy_arr(double source[],double target1[],int i)
{
	int a;
	printf("\ntarget1:");
	for(a=0;a<i;a++)
	{
		target1[a]=source[a];
		printf(" %g ",target1[a]);
	}
}
void copy_ptr(double *source,double *target2,int i)
{
	int b;
	printf("\ntarget2:");
	for(b=0;b<i;b++)
	{
		 *(target2 + b) = *(source + b) ;  
		 printf(" %g ",target2[b]);
	}
}

4.编写一个函数,返回一个double数组中储存的最大数值的索引,并在一个简单程序中测试这个函数。

#include <stdio.h>
#define N 6 

int max_arr(const double [], int );
void show_arr(const double [], int );

int main(void)
{
    double num[N] = {2.1,2.2,4.2,1.3,5.2,3.1};
    int max;
    
    show_arr(num,N);
    max = max_arr(num,N);
    printf("[%d] = largest\n", max);
    
    return 0;
}

int max_arr(const double ar[], int n)
{
    int i,m=0;
    int max = ar[0];
    
    for (i = 1; i < n; i++)
        if (max < ar[i])
	{
            max = ar[i];
	    m=i;
	}
    return m;
}

void show_arr(const double ar[], int n)
{
    int i;
    
    for (i = 0; i < n; i++)
        printf("%g ", ar[i]);
    putchar('\n');
}


6.编写一个程序,初始化一个二维数组,并利用练习2中的任一函数来把这个数组复制到另一个二维数组(因为二维数组是数组的数组,所以可以使用处理一维数组的函数来复制数组的每一个子数组)。

#include <stdio.h>
#define A 4
#define B 6
void copy_arr(double [][6],double [][6],int,int);
int main(void)
{
	double source[A][B]={
		{1.1,2.2,3.3,4.4,5.5,6.6},
		{6.6,5.5,4.4,3.3,2.2,1.1},
		{1.1,2.2,3.3,4.4,5.5,6.6},
		{6.6,5.5,4.4,3.3,2.2,1.1},
	};
	double target[A][B];
	int a,b;

	printf("Source:\n");
	for(a=0;a<A;a++)
	{
		for(b=0;b<B;b++)
		printf(" %g ",source[a][b]);
		putchar('\n');
	}
	copy_arr(source,target,4,6);
	
	return 0;
}
void copy_arr(double source[][6],double target[][6],int i,int ii)
{
	int a,b;
	printf("Target:\n");
	for(a=0;a<i;a++)
		for(b=0;b<ii;b++)
		target[a][b]=source[a][b];
	for(a=0;a<A;a++)
	{
		for(b=0;b<B;b++)
		printf(" %g ",target[a][b]);
		putchar('\n');
	}
}

7.利用练习2中的复制函数,把—个包含7个元素的数组内第3到第5元素复制到一个包含3个元素的数组中。函数本身不需要修改,只需要选择合适的实际参数(实际参数不需要是数组名和数组大小,而只须是数组元素的地址和需要复制的元素数目)。

#include <stdio.h>
#define A 7
#define B 3
void copy_arr(int [],int [],int );
int main(void)
{
	const int source[A]={2,4,6,8,10,12,14};
	int target[B];
	int a;

	printf("Source:\n");
	for(a=0;a<A;a++)
		printf(" %d ",source[a]);
	copy_arr(&source[2],target,3);
	
	return 0;
}
void copy_arr(int source[],int target[],int i)  
{  
    int a;  
    printf("\nTarget:\n");  
    for(a=0;a<i;a++)  
    {  
        target[a]=source[a];  
        printf(" %d ",target[a]);  
    }  
}  

9.编写一个函数,把两个数组内的元素相加,结果存到第三个数组内。也就是说,如果数组1具有值2、4、5、8,数组2具有值1、0、4、6,则函数对数组3赋值为3、4、9、14。函数的参数包含3个数组命和数组大小。并在一个简单的程序中测试这个函数。

#include <stdio.h>
#define A 4
void add(int [],int [],int [],int );
int main(void)
{
	const int one[A]={1,3,5,7};
	const int two[A]={2,4,6,8};
	int three[A];
	int a;

	printf("one:");
	for(a=0;a<A;a++)
		printf(" %d ",one[a]);
	printf("\ntwo:");
	for(a=0;a<A;a++)
		printf(" %d ",two[a]);
	add(one,two,three,A);
	
	return 0;
}
void add(int one[],int two[],int three[],int i) 
{  
    int a;  
    printf("\none+two=:");  
    for(a=0;a<i;a++)  
    {  
        three[a]=one[a]+two[a];  
        printf(" %d ",three[a]);  
    }  
}


2.编写一个程序,提示用户输入3个数集,每个数集包括5个double值。程序应当实现下列所有功能:
    a.把输入信息存储到一个3x5的数组中
    b.计算出每个数集(包含5个数值)的平均值
    c.计算所有数值的平均数
    d.找出这15个数中的最大值.
    e.打印出结果
    每个任务需要用一个单独的函数来实现(使用传统C处理数组的方法)。对于任务b,需要编写计算并返回一维数组平均值的函数,循环3次调用该函数来实现任务b。对于其他任务,函数应当把整个数组做为参数,并且完成任务c和d的函数应该向它的调用函数返回答案。

#include <stdio.h>
#define ROWS 3
#define COLS 5 

void store(double [], int n);
double average2d(int , int , double [][5]);
double max2d(int , int , double [][5]);
void showarr2(int , int , double [][5]);
double average(const double [], int );

int main(void)
{
    double stuff[ROWS][COLS];
    int row;
    
    for (row = 0; row < ROWS; row++)
    {
        printf("Enter %d numbers for row %d\n", COLS, row + 1);
        store(stuff[row], COLS);
    }
    
    printf("array contents:\n");
    showarr2(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("largest value = %g\n", max2d(ROWS, COLS, stuff)); 
    printf("Bye!\n");    
    return 0;
}

void store(double ar[], int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("Enter value #%d: ", i + 1);
        scanf("%lf", & ar[i]);
    }
}
    

double average2d(int rows, int cols, double ar[][5])
{
    int r, c;
    double sum = 0.0;
    
    for (r = 0; r < rows; r++)
        for (c = 0; c < cols; c++)
            sum += ar[r][c];
    if (rows * cols > 0)
        return sum / (rows * cols);
    else
        return 0.0;
}

double max2d(int rows, int cols, double ar[][5])
{
    int r, c;
    double max = ar[0][0];
    
    for (r = 0; r < rows; r++)
        for (c = 0; c < cols; c++)
            if (max < ar[r][c])
                max = ar[r][c];
    return max;

}

void showarr2(int rows, int cols, double ar[][5])
{
    int row, col;
    
    for (row = 0; row < rows; row++)
    {
        for (col = 0; col < cols; col++)
            printf("%g ", ar[row][col]);
        putchar('\n');
    }
}

double average(const double ar[], int n)
{
    int i;
    double sum = 0.0;
    
    for (i = 0; i < n; i++)
        sum += ar[i];
    if (n > 0)
        return sum / n;
    else
        return 0.0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值