10.13 编程练习

来源:互联网 发布:剑桥史系列知乎 编辑:程序博客网 时间:2024/05/29 08:38
1.修改程序清单10.07中的程序rain,使它不适用数组下标,而是使用指针进行计算(程序中仍然需要声明并初始化数组)
#include <stdio.h>#define MONTHS 12#define YEARS 5int main(void){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,sum;for(year=0,total=0.0;year<YEARS;year++){for(month=0,subtot=0.0;month<MONTHS;month++){subtot+=*(*(rain+year)+month);}printf("%d年降水总量为%0.2f,本年月平均降水量为%0.2f\n",year+1,subtot,subtot/MONTHS);total+=subtot;}printf("%d年的降水总量是%0.2f,五年年降水平均值为%.2f\n",YEARS,total,total/YEARS);for(month=0;month<MONTHS;month++){for(year=0,sum=0.0;year<YEARS;year++){sum+=*(*(rain+year)+month);}printf("每年%d月份的降水平均值为%0.1f\n",month+1,sum/YEARS);} return 0;}


2.编写一个程序,初始化第一个double数组,然后把数组内容复制到另外两个数组(3个数组都需要在主程序中声明)。制作第一份拷贝的函数使用数组符号。制作第二份拷贝的函数使用指针符号,并使用指针的增量操作。把目标数组名和要复制的元素数目作为参数传递给函数。也就是说,如果给定下列声明,函数调用应该如下面所示。
#include <stdio.h>  void copy_arr(const double source[],double target1[],int size);  void copy_ptr(const double *source,double *target2,double *end);  void print(const double ar[],int size); int main(void)  {      double source[5]={1.1,2.2,3.3,4.4,5.5};      double target1[5];      double target2[5];      int size=5;                    printf("source array:\n");      print(source,size);            copy_arr(source,target1,size);      printf("target1 array:\n");      print(target1,size);          copy_ptr(source,target2,source+size);      printf("target2 array:\n");      print(target2,size);      return 0;  }  void copy_arr(const double source[],double target1[],int size)  {      int i;      for(i=0;i<size;i++)          target1[i]=source[i];  }  void copy_ptr(const double *source,double *target2,double *end)  {   while(source<end){*target2=*source;source++;target2++;} }  void print(const double ar[],int size)  {      int i;      for(i=0;i<size;i++)          printf("%.1f  ",ar[i]);      printf("\n");  }  


3.编写一个函数,返回int数组中存储的最大值,并在一个简单的程序中测试这个函数
#include <stdio.h>void print(int ar[],int *end);  int max(int ar[],int *end);int main(void){const int SIZE=5;int array[SIZE]={3, 6, 9, 2, 5, };print(array,array+SIZE);printf("数组中最大的数是%d\n",max(array,array+SIZE));return 0;}void print(int ar[],int *end) {  for(;ar<end;ar++){printf("%d  ",*ar);}    printf("\n");  }  int max(int ar[],int *end){int max=*ar;for(ar+=1;ar<end;ar++){if(*ar>max)max=*ar;}return max;}


4.编写一个函数,返回一个double数组中存储的最大值的索引,并在一个简单程序中测试这个函数
#include <stdio.h>  void print(double ar[],double *end);  int max_index(double ar[],int size);int main(void){const int SIZE=5;double array[SIZE]={3.0, 6.1, 9.3, 2.7, 5.5, };print(array,array+SIZE);printf("数组中最大数的下标是%d.\n",max_index(array,SIZE));return 0;}void print(double ar[],double *end) {  for(;ar<end;ar++){printf("%.2f  ",*ar);}    printf("\n");  }  int max_index(double ar[],int size){int max_index=0;int i;for(i=1;i<size;i++){if(*(ar+i)>*(ar+max_index))max_index=i;}return max_index;}


5.编写一个函数,返回一个double数组中最大的和最小的元素之间的差值,并在一个简单的程序中测试这个函数。
#include <stdio.h>  void print(double ar[],double *end);  double max_minus_min(double ar[],double *end);int main(void){const int SIZE=5;double array[SIZE]={3.0, 6.1, 9.3, 2.7, 5.5, };print(array,array+SIZE);printf("数组中最大值减去最小值等于%.1f",max_minus_min(array,array+SIZE));return 0;}void print(double ar[],double *end) {  for(;ar<end;ar++){printf("%.2f  ",*ar);}    printf("\n");  }  double max_minus_min(double ar[],double *end){double max=ar[0];double min=ar[0];double rt;for(ar+=1;ar<end;ar++){if(*ar>max)max=*ar;if(*ar<min)min=*ar;}rt=max-min;return rt;}


6.编写一个程序,初始化一个二维double数组,并利用练习2中的任一一个函数来把这个数组复制到另外一个二维数组。
#include <stdio.h>    #define ROWS 3#define COLS 5void copy_arr(const double s[],double t[],int size); void print( double ar[],int cols); int main(void)    {        double source[ROWS][COLS]={{0.1, 0.2, 0.3, 0.4, 0.5},{1.1, 1.2, 1.3, 1.4, 1.5},{2.1, 2.2, 2.3, 2.4, 2.5},};    double target[ROWS][COLS];double (*sour)[COLS]; //数组名本质上是一个const的指针,不能做增量操作,所以用一个变量得到二维数组的地址,来做增量操作 double (*tar)[COLS];   double (*rows_end)[COLS]=source+ROWS;//定义出数组指针的end。 for(sour=source,tar=target;sour<rows_end;sour++,tar++){copy_arr(*sour,*tar,COLS);}printf("target array:\n");for(tar=target;tar<target+ROWS;tar++){print(*tar,COLS);}    return 0;    }    void copy_arr(const double s[],double t[],int size)  {      int i;      for(i=0;i<size;i++)          t[i]=s[i];  }    void print( double ar[COLS],int cols)    {    int i;for(i=0;i<cols;i++){printf("%.1f  ",ar[i]);}printf("\n");}    


7.利用练习2中的函数,把一个包含7个元素的数组内第3到第5元素复制到一个包含3个元素的数组中。函数本身不需要修改,只需要选择合适的实际参数。
#include <stdio.h>    void copy_arr(const double source[],double target[],int size);      void print(const double ar[],int size);    int main(void)    {        double source[7]={0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7};    double target[3];            copy_arr(source+2,target,3);printf("target array:\n");print(target,3);      return 0;    }    void copy_arr(const double source[],double target[],int size)    {        int i;        for(i=0;i<size;i++)        target[i]=source[i];    }      void print(const double ar[],int size)    {        int i;        for(i=0;i<size;i++)            printf("%.1f  ",ar[i]);        printf("\n");    }    


8.编写一个程序,初始化一个3x5二维数组,并利用一个基于变长数组的函数把这个数组复制到另一个二维数组,还要编写一个基于变长数组的函数来显示两个数组的内容。这两个函数应该能够处理任意的NxM的数组。(如果没有可以支持边长数组的编译器,就使用传统C中处理Nx5数组的函数方法)。
本程序使用Nx5的函数。
#include <stdio.h>    #define ROWS 3#define COLS 5void copy_arr( double s[][COLS],double t[][COLS],int rows); void print( double s[][COLS],int rows); int main(void)    {        double source[ROWS][COLS]={{0.1, 0.2, 0.3, 0.4, 0.5},{1.1, 1.2, 1.3, 1.4, 1.5},{2.1, 2.2, 2.3, 3.4, 3.5},};    double target[ROWS][COLS];double (*sour)[COLS]; //数组名本质上是一个const的指针,不能做增量操作,所以用一个变量得到二维数组的地址,来做增量操作 double (*tar)[COLS];   copy_arr(source,target,ROWS);printf("source array\n");print(source,ROWS);printf("target array\n");print(target,ROWS);    return 0;    } void copy_arr( double s[][COLS],double t[][COLS],int rows){double (*i)[COLS]=s;int j;for(i=s;i<s+rows;i++,t++){for(j=0;j<COLS;j++){*(*t+j)=*(*i+j);}}}void print( double s[][COLS],int rows){double (*i)[COLS]=s;int j;for(i=s;i<s+rows;i++){for(j=0;j<COLS;j++){printf("%.1f  ",*(*s+j));}printf("\n");}}


  
9.编写一个函数,把两个数组内的相应元素相加,把结果存储到第三个数组内。也就是说,如果数组1具有值2,4,5,8,数组2具有值1,0,4,6,则函数对数组3赋值为3,4,9,14.函数的参数包括三个数组明和数组大小。并在一个简单的程序中测试这个函数。
#include <stdio.h>    #define SIZE 4void sum_array(const int a[],const int b[],int sum[],int size);void print(const int ar[],int size);int main(void)    {int a[SIZE]={2,4,5,8};int b[SIZE]={1,0,4,6};int sum[SIZE];sum_array(a,b,sum,SIZE);printf("array a:\n");print(a,SIZE);printf("array b:\n");print(b,SIZE);printf("array sum:\n");print(sum,SIZE);}void sum_array(const int a[],const int b[],int sum[],int size){int i;for(i=0;i<size;i++){sum[i]=a[i]+b[i];}}void print(const int ar[],int size){int i;for(i=0;i<size;i++)printf("%d  ",ar[i]);printf("\n");}


10.编写一个程序,声明一个3x5的数组并且初始化,具体数组可以随意,陈旭打印出数值,然后数组翻一倍,接着再次打印出新值。编写一个函数来显示数组的内容。再编写另一个函数执行翻倍功能。数组名和行数作为参数由程序传递给函数。
#include <stdio.h>    
#define ROWS 3
#define COLS 5
void  double_array(double ar[][COLS],int rows);
void print( double s[][COLS],int rows); 
int main(void)    
{    


    double source[ROWS][COLS]={
{0.1, 0.2, 0.3, 0.4, 0.5},
{1.1, 1.2, 1.3, 1.4, 1.5},
{2.1, 2.2, 2.3, 3.4, 3.5},


};
printf("The source array:\n");
print(source,ROWS);

double_array(source,ROWS);

printf("after function double_array\n");
print(source,ROWS);




    return 0;    



void print( double s[][COLS],int rows)
{
double (*i)[COLS]=s;
int j;

for(i=s;i<s+rows;i++)
{
for(j=0;j<COLS;j++)
{
printf("%.1f  ",*(*i+j));
}
printf("\n");
}
}


void  double_array(double ar[][COLS],int rows)
{
int i,j;
for(i=0;i<rows;i++)
{
for(j=0;j<COLS;j++)
ar[i][j]*=2;
}
}
11.重写程序清单10.7中的程序rain,main()中的主要功能改为由函数来执行


12.编写一个程序,提示用户输入3个数集,每个数集包括5个double值,程序应当实现下列所有功能:a.把输入的信息存储到一个3x5的数组中。
b.计算出每个数集的的平均值。
c计算所有数的平均值。
d.找出这15个数中的最大值。
e.打印出结果
#include <stdio.h>    #define ROWS 3#define COLS 5void scan(double s[][COLS],int rows);void average_cols(double s[][COLS],int rows);void average_total(double s[][COLS],int rows);void max(double s[][COLS],int rows);void print(double s[][COLS],int rows); int main(void)    {        double source[ROWS][COLS];    scan(source,ROWS);printf("The source array:\n");print(source,ROWS);average_cols(source,ROWS);average_total(source,ROWS);max(source,ROWS);    return 0;    } void scan(double s[][COLS],int rows){int i,j;char error;printf("Please enter 3x5 number for a array including 3 rows and 5 columns\n");for(i=0;i<rows;i++){printf("NOW,please enter the %d rows.\n",i+1);for(j=0;j<COLS;j++){while(scanf("%lf",&s[i][j])!=1){while((error=getchar())=='\n');putchar(error);printf(" is not a legal number.\n");}}}}void average_cols(double s[][COLS],int rows){double average_col;double sum=0;int i,j;for(i=0;i<rows;i++){for(average_col=0,sum=0,j=0;j<COLS;j++){sum+=s[i][j];}average_col=sum/COLS;printf("The average of %d rows is %.2f:\n",i+1,average_col);}}void average_total(double s[][COLS],int rows){double average_total=0;double sum=0;int i,j;for(i=0;i<rows;i++){for(j=0;j<COLS;j++){sum+=s[i][j];}}average_total=sum/(rows*COLS);printf("The average of entire array is %.2f:\n",average_total);}void max(double s[][COLS],int rows){int i,j;double max=s[0][0];for(i=0;i<rows;i++){for(j=0;j<COLS;j++){if(max<s[i][j])max=s[i][j];}}printf("The maximun number of array is %.2f",max);}void print( double s[][COLS],int rows){double (*i)[COLS]=s;int j;for(i=s;i<s+rows;i++){for(j=0;j<COLS;j++){printf("%.1f  ",*(*i+j));}printf("\n");}}


13.利用变长数组做函数为函数参量重做练习12.
编译器不支持边长数组。等换了编译器再做此题
0 0
原创粉丝点击