一
// 修改程序清单10.7的rain.c程序,用指针进行计算(仍然要声明并初始化数组)。
#include "stdio.h"
#define MONTHS 12
#define YEARS 5
int main(void)
{
float (*pz) [12];
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;
pz=rain;
printf("YEAR RAINFALL (inches)\n");
for (year=0,total=0;year<YEARS;year++)
{
for (month=0,subtot=0;month<MONTHS;month++)
subtot+=*(*(pz+year)+month);
printf("%5d %15.1f\n",2010,subtot);
total+=subtot;
}
printf("The yearly avarage is %.1f inches.\n",total/YEARS);
printf("MONTHLY AVERAGES:\n");
printf("Jan Feb Mar Apr May Jun Jul Aug Sep Oct\n");
for (month=0;month<MONTHS;month++)
{
for (year=0,subtot=0;year<YEARS;year++)
subtot+=*(*(pz+year)+month);
printf("%4.1f",subtot/YEARS);
}
return 0;
}
二
// 编写一个程序,初始化一个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"
void copy_arr(double ar[],double ay[],int n);
void copy_ptr(double * pz,double * py,int n);
void copy_ptrs(double ab[],double ac[],double * ad);
int main(void)
{
int i;
double source[5]={1.1,2.2,3.3,4.4,5.5};
double target1[5];
double target2[5];
double target3[5];
for ( i = 0; i < 5; i++)
printf("source[%d]%.1f ",i,source[i]);
printf("\n");
copy_arr(target1,source,5);
for ( i = 0; i < 5; i++)
printf("target1[%d]%.1f ",i,target1[i]);
printf("\n");
copy_ptr(target2,source,5);
for ( i = 0; i < 5; i++)
printf("target2[%d]%.1f ",i,target2[i]);
printf("\n");
copy_ptrs(target3,source,source+5);
for ( i = 0; i < 5; i++)
printf("target3[%d]%.1f ",i,target3[i]);
return 0;
}
void copy_arr(double ar[],double ay[],int n)
{
int i;
for (i = 0; i < n; i++)
ar[i]=ay[i];
}
void copy_ptr(double * pz,double * py,int n)
{
int i;
for (i = 0; i<n; i++)
{
*pz=*py;
py++;
pz++;
}
}
void copy_ptrs(double ab[],double ac[],double * ad)
{
int i=0;
for(i=0;ac[i]<=*(ad-1);i++)
ab[i]=ac[i];
}
三
// 编写一个函数,返回储存在int类型数组中的最大值,并在一个简单
// 的程序中测试该函数。
#include "stdio.h"
int large(int ar[],int n);
int main(void)
{
int i,total;
int suzu[10]={21,35,600,9,5,100,41,65,20,15};
for ( i = 0; i < 10; i++)
printf("suzu[%d]%d ",i,suzu[i]);
printf("\n");
total=large(suzu,10);
printf("\n");
printf("The maximum is %d\n",total);
return 0;
}
int large(int ar[],int n)
{
int i,lar=0;
for (i = 0; i < n; i++)
{
if (lar>ar[i])
continue;
else
lar=ar[i];
}
return lar;
}
四(修改第三题一小部分)
// 编写一个函数,返回储存在double类型数组中的最大值的下标,并在一个简单
// 的程序中测试该函数。
#include "stdio.h"
int large(double ar[],int n);
int main(void)
{
int i,total;
double suzu[10]={21.0,3500.0,6.0,9.0,5.0,7000.0,41.0,650.0,200.0,15.0};
for ( i = 0; i < 10; i++)
printf("suzu[%d]%.1f ",i,suzu[i]);
printf("\n");
total=large(suzu,10);
printf("\n");
printf("The maximum is %d\n",total);
return 0;
}
int large(double ar[],int n)
{
int i,lar=ar[1],g;
for (i = 0; i < n; i++)
{
if (lar>ar[i])
continue;
else
{
g=i+1;
lar=ar[i];
}
}
return g;
}
五(修改第三题)
// 编写一个函数,返回储存在int类型数组中的最大值和最小值的差值,
// 并在一个简单的程序中测试该函数。
#include "stdio.h"
double large(double ar[],int n);
int main(void)
{
int i;
double total;
double suzu[10]={21.0,35.0,6.0,9.0,5.0,100.0,41.0,65.0,20.0,15.0};
for ( i = 0; i < 10; i++)
printf("suzu[%d]%.1f ",i,suzu[i]);
printf("\n");
total=large(suzu,10);
printf("\n");
printf("The maximum is %.1f\n",total);
return 0;
}
double large(double ar[],int n)
{
int i;
double lar=ar[0],min=ar[0];
for (i = 0; i < n; i++)
{
if (lar>ar[i])
continue;
else
lar=ar[i];
}
printf("%.1f\n",lar);
for (i = 0; i < n; i++)
{
if (min<ar[i])
continue;
else
min=ar[i];
}
printf("%.1f\n",min);
return lar-min;
}
六
// 编写一个函数,把double类型数组中的数据倒序排列,并在一个简单
// 的程序中测试该函数。
#include "stdio.h"
double large(double ar[],int n);
int main(void)
{
int i;
double suzu[10]={21.0,35.0,6.0,9.0,5.0,100.0,41.0,65.0,20.0,15.0};
for ( i = 0; i < 10; i++)
printf("suzu[%d]%.1f ",i,suzu[i]);
printf("\n");
large(suzu,10);
for ( i = 0; i < 10; i++)
printf("suzu[%d]%.1f ",i,suzu[i]);
return 0;
}
double large(double ar[],int n)
{
double temp[n];
int i,j=9;
for (i=0;i<n;i++)
{
temp[i]=ar[j];
j--;
}
for (i=0;i<n;i++)
{
ar[i]=temp[i];
}
}
七
// 编写一个程序,初始化一个double类型的二维数组,使用编程练习2中的一个
// 拷贝函数把该数组中的数据拷贝至另一个二维数组中(因为二维数组是数组的
// 数组,所以可以使用处理一维数组的拷贝函数来处理数组中的每个子数组)
#include "stdio.h"
void copy_ptr(double (* pz)[4],double (* py)[4],int n,int m);
int main()
{
int i,m;
double source[2][4]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8};
double target1[2][4];
copy_ptr(target1,source,2,4);
for ( i = 0; i < 2; i++)
{
for (m = 0; m < 4; m++)
{
printf("source[%d][%d]%.1f ",i,m,source[i][m]);
}
}
printf("\n");
for ( i = 0; i < 2; i++)
{
for (m = 0; m < 4; m++)
{
printf("target1[%d][%d]%.1f ",i,m,target1[i][m]);
}
}
return 0;
}
void copy_ptr(double (* pz)[4],double (* py)[4],int n,int m)
{
int i,j;
for (i = 0; i<n; i++)
{
for (j=0;j<m;j++)
{
*(*(pz)+j)=*(*(py)+j);
}
py++;
pz++;
}
}
八
/*使用编程练习2中的拷贝函数,把一个内含7个元素的数组第3~5个元素
拷贝至内含3个元素的数组中。该函数本身不需要修改,只需要选择合适
的实际参数(实际参数不需要是数组名和数组大小,只需要是数组元素
的地址和待处理元素的个数)*/
#include "stdio.h"
void copy_ptr(int * pz,int * py,int n);
int main(void)
{
int source[7]={1,2,3,4,5,6,7};
int target[3];
int i;
copy_ptr(target,&source[2],3);
for ( i = 0; i < 3; i++)
printf("target[%d]%d ",i,target[i]);
return 0;
}
void copy_ptr(int * pz,int * py,int n)
{
int i;
for ( i = 0; i < n; i++)
{
*pz=*py;
py++;
pz++;
}
}
九
// 编写一个程序初始化一个double类型的3×5二维数组,使用一个处理边长数组
// 的函数将其拷贝至另一个二维数组中。还要编写一个以变长数组为形参的函数
// 以显示两个数组的内容。这两个函数应该能处理任意N×M数组(如果编译器不
// 支持变长数组,就使用传统C函数处理N×5的数组)。
#include "stdio.h"
#define N 3
#define M 5
void copy_ptr(int rows,int cols,double ar[rows][cols],double (*pz)[5]);
void prin(int rows,int cols,double ar[rows][cols]);
int main(void)
{
double target1[N][M];
double source[N][M]=
{
{1.1,2.2,3.3,4.4,5.5},
{6.6,7.7,8.8,9.9,10.10},
{11.11,12.12,13.13,14.14,15.15},
};
copy_ptr(N,M,source,target1);
prin(N,M,source);
printf("\n\n");
prin(N,M,target1);
return 0;
}
void copy_ptr(int rows,int cols,double ar[rows][cols],double (*pz)[5])
{
int i,j;
for ( i = 0; i < rows; i++)
{
for ( j = 0; j < cols; j++)
{
*(*(pz)+j)=ar[i][j];
}
pz++;
}
}
void prin(int rows,int cols,double ar[rows][cols])
{
int i,m;
for ( i = 0; i < 3; i++)
{
for (m = 0; m < 5; m++)
{
printf("target1[%d][%d]%.2f ",i,m,ar[i][m]);
}
}
}
十
// 编写一个函数,把两个数组中相对应的元素相加,然后把结果储存到第3
// 个数组中。也就是说,如果数组1中包含的值是2、4、5、8,数组2中包含的
// 值是1、0、4、6,那么该函数把3、4、9、14赋给第3个数组。函数接受3个数组
// 名和一个数组大小。在一个简单的程序中测试该函数。
#include "stdio.h"
void addition(int * pz,int * py,int *pr,int n);
int main(void)
{
int i;
int sub1[4]={2,4,5,8};
int sub2[4]={1,0,4,6};
int target[4];
addition(sub1,sub2,target,4);
for ( i = 0; i < 4; i++)
printf("%d\n",target[i]);
return 0;
}
void addition(int * pz,int * py,int *pr,int n)
{
int i,j;
for ( i = 0; i < n; i++)
{
*pr=*pz+*py;
pz++;
pr++;
py++;
}
}
十一
// 编写一个程序,声明一个int类型的3×5二维数组,并用合适的值初始化它。
// 该程序打印数组中的值。然后各值翻倍(即是原值的2倍),并显示出各元素
// 的新值。编写一个函数显示数组的内容,再编写一个函数把各元素的值翻倍。
// 这两个函数都以函数名和行数作为参数。
#include "stdio.h"
#define COLS 5
void display(int ar[][COLS],int row);
void doubl(int pz[][COLS],int row);
int main(void)
{
int i,j;
int source[3][5]=
{
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15},
};
display(source,3);
printf("\n\n\n");
doubl(source,3);
display(source,3);
return 0;
}
void doubl(int pz[][COLS],int row)
{
int i,j;
for (i = 0; i <row; i++)
{
for (j = 0; j < COLS; j++)
pz[i][j]*=2;
}
}
void display(int ar[][COLS],int row)
{
int i,j;
for (i = 0; i <row ; i++)
{
for (j = 0; j <COLS; j++)
printf("source[%d][%d]%d ",i,j,ar[i][j]);
}
}
十二
// 重写程序清单10.7的rain.c程序,把main()中主要的任务都改成用函数来完成。
#include "stdio.h"
#define MONTHS 12
#define YEARS 5
float ptr(float (*pz)[12],int rows,int cols);
void ptr_zz(float (*pz)[12],int rows,int cols);
int main(void)
{
int year,month;
float subtot,total;
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}
};
total=ptr(rain,YEARS,MONTHS);
printf("The yearly avarage is %.1f inches.\n",total/YEARS);
printf("MONTHLY AVERAGES:\n");
printf("Jan Feb Mar Apr May Jun Jul Aug Sep Oct\n");
ptr_zz(rain,YEARS,MONTHS);
return 0;
}
float ptr(float (*pz)[12],int rows,int cols)
{
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+=*(*(pz+year)+month);
printf("%5d %15.1f\n",2010,subtot);
total+=subtot;
}
return total;
}
void ptr_zz(float (*pz)[12],int rows,int cols)
{
int year,month;
float subtot,total;
for (month=0;month<MONTHS;month++)
{
for (year=0,subtot=0;year<YEARS;year++)
subtot+=*(*(pz+year)+month);
printf("%4.1f",subtot/YEARS);
}
}
十三
// 编写一个程序,提示用户输入3组数,每组数包含5各double类型的数(假设用户
// 都正确地响应,不会输入非数值数据。)该程序应完成下列任务。
// a.把用户输入的数据储存在3×5的数组中
// b.计算每组(5个)数据的平均值
// c.计算所有数据的平均值
// d.找出这15个数据中的最大值
// e 打印结果
// 每个任务都要用单独的函数来完成(使用传统C处理数组方式)。完成任务b,要编写
// 一个计算并返回一维数组平均值的函数,利用循环调用该函数3次。对于处理其他任务
// 的函数,应该把整个数组作为参数,完成任务c和d的函数应把结果返回主调函数。
#include "stdio.h"
void input(double (* pz)[5],int rows,int cols);
void scan(double (* pr)[5],int rows,int cols);
void average(double ar[][5],int rows);
double allave(double (* py)[5],int rows,int cols);
double max(double (* ps)[5],int rows,int cols);
int main(void)
{
double ave,max1;
int rows,cols;
double arr[3][5];
input(arr,3,5);
average(arr,0);
average(arr,1);
average(arr,2);
ave=allave(arr,3,5);
printf("All averages %.2lf\n",ave);
max1=max(arr,3,5);
printf("Maximum number%.2lf\n",max1);
scan(arr,3,5);
return 0;
}
void input(double (* pz)[5],int rows,int cols)
{
int i,j;
printf("Please enetr number of 15 double types\n");
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
scanf("%lf",*(pz+i)+j);
}
}
void scan(double (* pr)[5],int rows,int cols)
{
int i,j;
for ( i = 0; i <rows; i++)
{
for ( j = 0; j <cols ; j++)
printf("%.2lf ",*(*(pr+i)+j));
}
}
void average(double ar[][5],int rows)
{
int j;
double ave=0;
for (j = 0; j <5; j++)
ave+=ar[rows][j];
printf("%dgroup%.2lf\n",rows+1,ave/5);;
}
double allave(double (* py)[5],int rows,int cols)
{
int i,j;
double ave=0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
ave+=*(*(py+i)+j);
}
return ave/15;
}
double max(double (* ps)[5],int rows,int cols)
{
int i,j;
double maxs=**ps;
for ( i = 0; i < rows; i++)
{
for ( j = 0; j < cols; j++)
{
if (maxs>*(*(ps+i)+j))
continue;
else
maxs=*(*(ps+i)+j);
}
}
return maxs;
}
十四
// 以变长数组作为函数形参,完成编程练习13.
#include "stdio.h"
void input(int rows,int cols,double pz[rows][cols]);
void scan(int rows,int cols,double pr[rows][cols]);
void average(int rows,double ar[rows],int n);
double allave(int rows,int cols,double py[rows][cols]);
double max(int rows,int cols,double ps[rows][cols]);
int main(void)
{
double ave,max1;
int rows,cols;
double arr[3][5];
input(3,5,arr);
average(5,arr[0],0);
average(5,arr[1],1);
average(5,arr[2],2);
ave=allave(3,5,arr);
printf("All averages %.2lf\n",ave);
max1=max(3,5,arr);
printf("Maximum number%.2lf\n",max1);
scan(3,5,arr);
return 0;
}
void input(int rows,int cols,double pz[rows][cols])
{
int i,j;
printf("Please enetr number of 15 double types\n");
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
scanf("%lf",*(pz+i)+j);
}
}
void scan(int rows,int cols,double pr[rows][cols])
{
int i,j;
for ( i = 0; i <rows; i++)
{
for ( j = 0; j <cols ; j++)
printf("%.2lf ",*(*(pr+i)+j));
}
}
void average(int rows,double ar[rows],int n)
{
int j;
double ave=0;
for (j = 0; j <5; j++)
ave+=ar[j];
printf("%dgroup%.2lf\n",n+1,ave/rows);;
}
double allave(int rows,int cols,double py[rows][cols])
{
int i,j;
double ave=0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
ave+=*(*(py+i)+j);
}
return ave/15;
}
double max(int rows,int cols,double ps[rows][cols])
{
int i,j;
double maxs=**ps;
for ( i = 0; i < rows; i++)
{
for ( j = 0; j < cols; j++)
{
if (maxs>*(*(ps+i)+j))
continue;
else
maxs=*(*(ps+i)+j);
}
}
return maxs;
}
如有问题请留言,会及时回复。