1.修改程序清单10.7的rain.c程序,用指针进行计算(仍然要声明并初始 化数组)。
#include <stdio.h>
#include <stdlib.h>
#define MONTHS 12
#define YEARS 5
int main()
{
const 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;
printf("Year rainfall (inches)\n");
for (year=0,total=0 ; year<YEARS ; year++)
{
for(month=0,subtot=0;month<MONTHS;month++)
subtot += *(*(rain+year)+month);
printf("%5d %15.1f\n",2010+year,subtot);
total+= subtot;
}
printf("\n The yearly average is %.1f inches.\n\n",total/YEARS);
printf("Monthly average:\n\n");
printf("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\n");
for(month=0;month<MONTHS;month++){
for(year=0, subtot=0 ; year<YEARS; year++)
subtot+= *(*(rain+year)+month);
printf("%4.1f",subtot/YEARS);
}
printf("\n");
return 0;
}
2.编写一个程序,初始化一个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>
#include <stdlib.h>
void copy_arr(double ar[],double source[],int n);
void copy_ptr(double *target,double *source,int n );
void copy_ptrs(double *target ,double *start ,double *end);
void put_shuzu(double *p,int n,int number);
int main()
{
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);
put_shuzu(target1,5,1);
put_shuzu(target2,5,2);
put_shuzu(target3,5,3);
}
void copy_arr(double ar[],double source[],int n ){
for(int i=0;i<n;i++){
ar[i]=source[i];}
}
void copy_ptr(double *target,double *source,int n ){
for(int i=0;i<n;i++){
*(target+i)=*(source+i);}
}
void copy_ptrs(double *target ,double *start ,double *end){
for(int j=0;start+j<end;j++){
*(target+j)=*(start+j);
}
}
void put_shuzu(double *p,int n,int number){
for(int i=0;i<n;i++){
printf("target%d[%d]=%.2lf ",number,i, *(p+i));
}
printf("\n");
}
3.编写一个函数,返回储存在int类型数组中的最大值,并在一个简单的程序中测试该函数。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
int return_max(int p[],int n);
int main()
{
int max;
int number[SIZE]={18,24,3,41,5,36,7,48,-12,-1};
max=return_max(number,SIZE);
printf("max=%d",max);
return 0;
}
int return_max(int p[],int n){
int maximum=p[n-1];
for(int i=0;i<n-1;i++)
{
if(p[i]>maximum)
maximum=p[i];
}
return maximum;
}
4.编写一个函数,返回储存在double类型数组中最大值的下标,并在一 个简单的程序中测试该函数。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
int max_index(int p[],int n);
int main()
{
int index;
int number[SIZE]={8,64,3,41,5,36,7,48,-12,-1};
index=max_index(number,SIZE);
printf("max=number[%d]",index);
return 0;
}
int max_index(int p[],int n){
int maximum=p[n-1];
int index=0;
for(int i=0;i<n-1;i++)
{
if(p[i]>maximum)
{ maximum=p[i];
index=i;}
}
return index;
}
5.编写一个函数,返回储存在double类型数组中最大值和最小值的差值,并在一个简单的程序中测试该函数。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
double diff(double *p,int n);
int main()
{
double ar[SIZE]={1.11111,2.22222,3.33333,
4.44444,5.55555,6.66666,
7.77777,8.88888,9.99999,10.11111};
printf("The D-value is %lf",diff(ar,SIZE));
return 0;
}
double diff(double *p,int n){
double min=p[0];
double max=p[0];
for(int i=1;i<n;i++)
{if(p[i]>max)
max=p[i];
if(p[i]<min)
min=p[i];
}
return max-min;
}
6.编写一个函数,把double类型数组中的数据倒序排列,并在一个简单 的程序中测试该函数。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
void order_reserve(double *p,int n);
int main()
{
double ar[SIZE]={1,2,3,4,5,6,7,8,9,10};
printf(" Originally,\nar= {");
for(int j=0;j<SIZE;j++)
{
printf(" %-10.6lf",ar[j]);
}
printf("}\n");
order_reserve(ar,SIZE);
printf(" Then,\nar= {");
for(int j=0;j<SIZE;j++)
{
printf(" %-10.6lf",ar[j]);
}
printf("}");
return 0;
}
void order_reserve(double *p,int n){
double temp;
for(int i=0;i<n/2;i++){
temp=p[i];
p[i]=p[n-1-i];//n为奇数时,a[n/2]正好是中心位置,循环在此之前结束,中点数没有
p[n-1-i]=temp;//和其他数交换; n为偶数时,a[n/2]是后面一半的第一个数,循环在此
} //之前结束。
}
7…编写一个程序,初始化一个double类型的二维数组,使用编程练习2中的一个拷贝函数把该数组中的数据拷贝至另一个二维数组中(因为二维数组是数组的数组,所以可以使用处理一维数组的拷贝函数来处理数组中的每个子数组)。
#include <stdio.h>
#include <stdlib.h>
#define ROW 4
#define COLUMN 4
void copy_ptrs(double *target ,double *start ,double *end);
int main()
{
double array_a[ROW][COLUMN]={ {1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16} };
double array_b[ROW][COLUMN];
for(int i=0;i<ROW;i++){
copy_ptrs(array_b[i],array_a[i],array_a[i]+COLUMN);}
/* zippo[i]是数组zippo[i]中第一个元素zippo[i][0]的地址,zippo[i]+就得到
zippo[i][j]的地址;zippo得到的是zippo[0]的地址,zippo+i得到的是zippo[i]的地址*/
printf("array_b[%d][%d]={ ",ROW,COLUMN);
for(int i=0;i<ROW;i++){
for(int j=0;j<COLUMN;j++){
printf("%-4.1lf%c ",array_b[i][j],(i*j==9)?' ':',');
}
}
printf("}");
return 0;
}
void copy_ptrs(double *target ,double *start ,double *end){
for(int j=0;start+j<end;j++){
*(target+j)=*(start+j); }//该函数只能执行一个数组的copy,要全部完成需要循环ROW次
}
8.使用编程练习2中的拷贝函数,把一个内含7个元素的数组中第3~第5个元素拷贝至内含3个元素的数组中。该函数本身不需要修改,只需要选择合适的实际参数(实际参数不需要是数组名和数组大小,只需要是数组元素的地址和待处理元素的个数)。
#include <stdio.h>
#include <stdlib.h>
void copy_arr(double ar[],double source[],int n );
int main()
{
double shuzu[7]={1,2,3,4,5,6,7};
double target[3];
copy_arr(target,&shuzu[2],3 );
printf("target[3]={");
for(int i=0;i<3;i++)
printf("%lf%c ",target[i],(i==2)?' ':',');
printf("}");
}
void copy_arr(double ar[],double source[],int n ){
for(int i=0;i<n;i++){
ar[i]=source[i];}
}
9.编写一个程序,初始化一个double类型的3×5二维数组,使用一个处理 变长数组的函数将其拷贝至另一个二维数组中。还要编写一个以变长数组为形参的函数以显示两个数组的内容。这两个函数应该能处理任意N×M数组 (如果编译器不支持变长数组,就使用传统C函数处理N×5的数组)。
#include <stdio.h>
#include <stdlib.h>
void copy_vla(int row,int column,double origin[row][column],double then[row][column]);
void show_array(int row,int column,double shuzu[row][column]);
int main (){
double source[2][5]={ {1,2,3,4,5}, {6,7,8,9,10} };
double target[2][5];
printf("For source,");
show_array(2,5,source);
copy_vla(2,5,source,target);
printf("For target,");
show_array(2,5,target);
return 0;
}
void show_array(int row,int column,double shuzu[row][column]){
printf(" array={ ");
for(int i=0;i<row;i++){
for(int j=0;j<column;j++){
printf( "%-3.1lf%c ", shuzu[i][j], ( (i+1)*(j+1)==row*column)?' ':',' );
}
}
printf("}\n");
}
void copy_vla(int row,int column,double origin[row][column],double then[row][column]){
for(int i=0;i<row;i++){
for(int j=0;j<column;j++){
then[i][j]=origin[i][j];
}}
}
10.编写一个函数,把两个数组中相对应的元素相加,然后把结果储存到第3个数组中。也就是说,如果数组1中包含的值是2、4、5、8,数组2中包含的值是1、0 、4、6,那么该函数把3、4、9、14赋给第3个数组。函数接受3个数组名和一个数组大小。在一个简单的程序中测试该函数。
#include <stdio.h>
#include <stdlib.h>
void sum_array(int *ar1, int *ar2, int *sum, int n);
int main()
{
int array_1[4]={2,4,5,8};
int array_2[4]={1,0,4,6};
int sum_ar[4];
int i=0;
sum_array(array_1,array_2,sum_ar,4);
while(i<4){
printf("sum_ar[%d]=%d ",i,sum_ar[i]);
i++;
}
return 0;
}
void sum_array(int *ar1, int *ar2, int *sum, int n){
for(int i=0;i<4;i++){
*(sum+i)=*(ar1+i)+*(ar2+i); }
}
11.编写一个程序,声明一个int类型的3×5二维数组,并用合适的值初始化它。该程序打印数组中的值,然后各值翻倍(即是原值的2倍),并显示出各元素的新值。编写一个函数显示数组的内容,再编写一个函数把各元素 的值翻倍。这两个函数都以数组数名和行数作为参数。
#include <stdio.h>
#include <stdlib.h>
double_ar(int ar[][5],int row);
show_ar(int rr[][5],int row);
int main()
{
int source[3][5]={ {1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15} };
double_ar(source,3);
show_ar(source,3);
return 0;
}
double_ar(int ar[][5],int row){
for(int i=0;i<row;i++){
for(int j=0;j<5;j++){
ar[i][j]*=2;
}
}
}
show_ar(int rr[][5],int row){
printf("array={");
for(int i=0;i<row;i++){
for(int j=0;j<5;j++){
printf("%d%c ",rr[i][j], ( (i+1)*(j+1)==row*5)?' ':',');
}}
printf("}\n");
}
12.重写程序清单10.7的rain.c程序,把main()中的主要任务都改成用函数来完成。
#include <stdio.h>
#include <stdlib.h>
#define MONTHS 12
#define YEARS 5
void show_rain_per_year(float ar[][MONTHS],float subtotal[],int year);
void show_yearly_average(float ar[],int n);
void rain_average_monthly(float ar[][MONTHS],int month,int year);
int main()
{
const 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}
};
float rain_subtot[YEARS];
show_rain_per_year(rain,rain_subtot,YEARS);
show_yearly_average(rain_subtot,YEARS);
rain_average_monthly(rain,MONTHS,YEARS);
return 0;
}
void show_rain_per_year(float ar[][MONTHS],float subtotal[],int year){
printf("Year rainfall (inches)\n");
for (int i=0; i<year ; i++){
subtotal[i]=0;
for(int j=0; j<MONTHS; j++){
subtotal[i] += ar[i][j];}
printf("%5d %15.1f\n",2010+i,subtotal[i]);}
}
void show_yearly_average(float ar[],int n){
float sum=0;
for(int i=0;i<n;i++)
sum+=ar[i];
printf("\nThe yearly average is %.1lf inches.\n",sum/n);
}
void rain_average_monthly(float ar[][MONTHS],int month,int year){
float subtot_month[month];
printf("Monthly average:\n\n");
printf(" Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\n");
for(int i=0;i<month;i++)
{
subtot_month[i]=0;
for(int j=0;j<year;j++)
{
subtot_month[i]+=ar[j][i];
}
printf("%4.1f",subtot_month[i]/year);
}
}
13.编写一个程序,提示用户输入3组数,每组数包含5个double类型的数 (假设用户都正确地响应,不会输入非数值数据)。该程序应完成下列任务:
a.把用户输入的数据储存在3×5的数组中
b.计算每组(5个)数据的平均值
c.计算所有数据的平均值
d.找出这15个数据中的最大值
e.打印结果
每个任务都要用单独的函数来完成(使用传统C处理数组的方式)
完成任务b,要编写一个计算并返回一维数组平均值的函数,利用循环调用该函数3次。对于处理其他任务的函数,应该把整个数组作为参数,完成任务c和d的函数应把结果返回主调函数。
#include <stdio.h>
#include <stdlib.h>
void input_shuzu(double shuzu[][5],int row);
void show_array(double shuzu[][5],int row);
double aver_(double shuzu[][5],int row_number);
double total_aver(double ar[],int n);
double fin_max( double arr[][5],int row);
int main()
{
double arr[3][5];
double aver_row[3];
input_shuzu(arr,3);
show_array(arr,3);
for(int i=0;i<3;i++)
aver_row[i]=aver_(arr,i);
printf("The total average number=%lf\n",total_aver(aver_row,3));
printf("The maximum data is :%.2lf\n",fin_max(arr,3));
return 0;
}
void input_shuzu(double shuzu[][5],int row){
for(int r=0;r<row;r++){
printf("Enter the data in row %d:\n",r+1);
for(int c=0;c<5;c++){
scanf("%lf",&shuzu[r][c]);
}
}
}
void show_array(double shuzu[][5],int row){
for(int r=0;r<row;r++){
for(int c=0;c<5;c++){
printf("arr[%d][%d]=%-5.1lf ",r,c,shuzu[r][c]);}
printf("\n");
}
}
double aver_(double shuzu[][5],int row_number){
double acc=0;
int c=0;
while(c<5){
acc+=shuzu[row_number][c];
c++;
}
printf("The average number of line %d=%.2lf\n",row_number+1,acc/5);
return acc/5;
}
double total_aver(double ar[],int n){
double sum=0;
for(int i=0;i<n;i++)
sum+=ar[i];
return sum/n;
}
double fin_max( double arr[][5],int row){
double max=arr[0][0];
for(int r=0;r<row;r++){
for(int c=0;c<5;c++){
if (arr[r][c]>max)
max=arr[r][c];
}
}
return max;
}
14.以变长数组作为函数形参,完成编程练习13。
#include <stdio.h>
#include <stdlib.h>
void input_shuzu(int row, int column, double shuzu[row][column]);
void show_array(int row, int column, double shuzu[row][column]);
double aver_(int row, int column,double arr[row][column]);
double total_aver(int n,double ar[n]);
double fin_max(int row,int column, double arr[row][column]);
int main()
{
double arr[3][5];
double aver_row[3];
input_shuzu(3,5,arr);
show_array(3,5,arr);
for(int i=0;i<3;i++)
aver_row[i]=aver_(i,5,arr);
printf("The total average number=%lf\n",total_aver(3,aver_row));
printf("The maximum data is :%.2lf\n",fin_max(3,5,arr));
return 0;
}
void input_shuzu(int row, int column, double shuzu[row][column]){
for(int r=0;r<row;r++){
printf("Enter the data in row %d:\n",r+1);
for(int c=0;c<column;c++){
scanf("%lf",&shuzu[r][c]);
}
}
}
void show_array(int row, int column, double shuzu[row][column]){
for(int r=0;r<row;r++){
for(int c=0;c<column;c++){
printf("arr[%d][%d]=%-5.1lf ",r,c,shuzu[r][c]);}
printf("\n");
}
}
double aver_(int row, int column,double arr[row][column]){
double acc=0;
int c=0;
while(c<column){
acc+=arr[row][c];
c++;
}
printf("The average number of line %d=%.2lf\n",row+1,acc/column);
return acc/column;
}
double total_aver(int n,double ar[n]){
double sum=0;
for(int i=0;i<n;i++)
sum+=ar[i];
return sum/n;
}
double fin_max(int row,int column, double arr[row][column]){
double max=arr[0][0];
for(int r=0;r<row;r++){
for(int c=0;c<column;c++){
if (arr[r][c]>max)
max=arr[r][c];
}
}
return max;
}