10.13 编程练习
来源:互联网 发布:剑桥史系列知乎 编辑:程序博客网 时间:2024/05/29 08:38
1.修改程序清单10.07中的程序rain,使它不适用数组下标,而是使用指针进行计算(程序中仍然需要声明并初始化数组)
2.编写一个程序,初始化第一个double数组,然后把数组内容复制到另外两个数组(3个数组都需要在主程序中声明)。制作第一份拷贝的函数使用数组符号。制作第二份拷贝的函数使用指针符号,并使用指针的增量操作。把目标数组名和要复制的元素数目作为参数传递给函数。也就是说,如果给定下列声明,函数调用应该如下面所示。
3.编写一个函数,返回int数组中存储的最大值,并在一个简单的程序中测试这个函数
4.编写一个函数,返回一个double数组中存储的最大值的索引,并在一个简单程序中测试这个函数
5.编写一个函数,返回一个double数组中最大的和最小的元素之间的差值,并在一个简单的程序中测试这个函数。
6.编写一个程序,初始化一个二维double数组,并利用练习2中的任一一个函数来把这个数组复制到另外一个二维数组。
7.利用练习2中的函数,把一个包含7个元素的数组内第3到第5元素复制到一个包含3个元素的数组中。函数本身不需要修改,只需要选择合适的实际参数。
8.编写一个程序,初始化一个3x5二维数组,并利用一个基于变长数组的函数把这个数组复制到另一个二维数组,还要编写一个基于变长数组的函数来显示两个数组的内容。这两个函数应该能够处理任意的NxM的数组。(如果没有可以支持边长数组的编译器,就使用传统C中处理Nx5数组的函数方法)。
本程序使用Nx5的函数。
9.编写一个函数,把两个数组内的相应元素相加,把结果存储到第三个数组内。也就是说,如果数组1具有值2,4,5,8,数组2具有值1,0,4,6,则函数对数组3赋值为3,4,9,14.函数的参数包括三个数组明和数组大小。并在一个简单的程序中测试这个函数。
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.打印出结果
13.利用变长数组做函数为函数参量重做练习12.
编译器不支持边长数组。等换了编译器再做此题
#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
- 10.13 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- 编程练习
- Swift基础3.3——便利构造函数
- [Getting and Cleaning data] Week 3
- C语言实现单链表
- JAVA深复制(深克隆)与浅复制(浅克隆)
- composer安装过程超时的问题以及解决方案
- 10.13 编程练习
- 第22课:RDD的依赖关系彻底解密
- 在OpenWRT上部署DNS服务器以方便访问谷歌
- jsp页面获取后台数据
- EditText 输入值限定最小值和最大值
- LVM 类型的 Storage Pool - 每天5分钟玩转 OpenStack(8)
- 冒泡排序-字符篇
- 1857: [Scoi2010]传送带 三分套三分
- 冒泡排序-数字篇