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;
}