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