博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C Primer Plus 第10章 数组和指针 编程练习答案
阅读量:5907 次
发布时间:2019-06-19

本文共 8121 字,大约阅读时间需要 27 分钟。

hot3.png

1、修改程序清单10.7中的程序rain,使它不使用数组下标,而是使用指针进行计算(程序中仍然需要声明并初始化数组)。

#include 
#define MONTHS 12#define YEARS 5int main (void){ //把数组初始化为2000年到2004年的降水量数据 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

2、编写一个程序,初始化一个double数组,然后把数组内容复制到另外两个数组(3个数组都需要在主程序中声明)。制作第一份拷贝的函数使用数组符号。制作第二份拷贝的函数使用指针符号,并使用指针的增量操作。把目标数组名和要复制的元素数目做为参数传递给函数。也就是说,如果给定了下列声明,函数调用应该如下面所示:

double source[5] = {1.1,2.2,3.3,4.4,5.5};double target1[5];double target2[5];copy_arr(source,target1,5);copy_ptr(source,target2,5);
#include 
void copy_arr(double source[],double target1[],int n);void copy_ptr(double *source,double *target2,int n);int main(void){ double source[] = {1.1, 2.2, 3.3, 4.4, 5.5}; double target1[5] = {0}; double target2[5] = {0}; printf("Before operation:\n"); printf("source :\t%g\t%g\t%g\t%g\t%g\n",source[0],source[1],source[2],source[3],source[4]); printf("target1:\t%g\t%g\t%g\t%g\t%g\n",target1[0],target1[1],target1[2],target1[3],target1[4]); printf("target2:\t%g\t%g\t%g\t%g\t%g\n",target2[0],target2[1],target2[2],target2[3],target2[4]); copy_arr(source, target1, 5); copy_ptr(source, target2, 5); printf("After operation:\n"); printf("source :\t%g\t%g\t%g\t%g\t%g\n",source[0],source[1],source[2],source[3],source[4]); printf("target1:\t%g\t%g\t%g\t%g\t%g\n",target1[0],target1[1],target1[2],target1[3],target1[4]); printf("target2:\t%g\t%g\t%g\t%g\t%g\n",target2[0],target2[1],target2[2],target2[3],target2[4]); return 0;}void copy_arr(double source[],double target1[],int n){ int i; for(i=0;i

3、编写一个函数,返回一个int数组中存储的最大值,并在一个简单的程序中测试这个函数。

#include
#define WIDTH 6int max(int ar[WIDTH],int n);int main(void){ int ar[WIDTH]={4,3,6,2,8,6}; printf("The max is %d\n",max(ar,WIDTH)); return 0;}int max(int ar[WIDTH],int n){ int i,max; for(i=1,max=ar[0];i

4、编写一个函数,返回一个double数组中存储的最大值的索引,并在一个简单的程序中测试这个函数。

#include
#define WIDTH 6int max(float ar[WIDTH],int n);int main(void){ float ar[WIDTH]={4.4,3.3,6.6,2.2,8.8,9.9}; printf("The max number's index is %d\n",max(ar,WIDTH)); return 0;}int max(float ar[WIDTH],int n){ int i,max; for(i=1,max=0;i

5、 编写一个函数,返回一个double数组中最大值和最小值之间的差值,并在一个简单的程序中测试这个函数。

#define WIDTH 6float gap(float ar[WIDTH],int n);int main(void){    float ar[WIDTH]={4.4,3.3,6.6,2.2,8.8,9.9};    printf("The gap between max and min is %.2f\n",gap(ar,WIDTH));    return 0;}float gap(float ar[WIDTH],int n){    int i;    float min,max;    for(i=1,max=ar[0],min=ar[0];i
ar[i]) min=ar[i]; } return (max-min);}

6、编写一个程序,初始化一个二维数组,并利用练习2中的任一函数来把这个二维数组复制到另一个二维数组(因为二维数组是数组的数组,所以可以使用处理一维数组的函数来复制数组的每个子数组)。

#include 
#define ROWS 2#define COLS 3void copy_2d(double source[][COLS], double target[][COLS], int );void copy_1d(double a1[], double a2[], int n);int main(void){ int i,j; double source[ROWS][COLS] = {1, 2, 3, 4, 5, 6}; double target[ROWS][COLS] = {0}; copy_2d(source, target, ROWS); for (i=0; i

7、利用练习2中的复制函数,把一个包含7个元素的数组内第3到第5元素复制到 一个包含3个元素的数组中。函数本身不需要修改,只需要选择合适的实际参数(实际参数不需要是数组名和数组大小,而只须是数组元素的地址和需要复制的元素数目)。

#include 
void copy_arr(double source[],double target1[],int n);void copy_ptr(double *source,double *target2,int n);int main(void){ double source[] = {1.1, 2.2, 3.3, 4.4, 5.5}; double target1[3] = {0}; double target2[5] = {0}; printf("Before operation:\n"); printf("source :\t%g\t%g\t%g\t%g\t%g\n",source[0],source[1],source[2],source[3],source[4]); printf("target1:\t%g\t%g\t%g\n",target1[0],target1[1],target1[2]); printf("target2:\t%g\t%g\t%g\t%g\t%g\n",target2[0],target2[1],target2[2],target2[3],target2[4]); copy_arr(&source[2], target1, 3); copy_ptr(source, target2, 5); printf("After operation:\n"); printf("source :\t%g\t%g\t%g\t%g\t%g\n",source[0],source[1],source[2],source[3],source[4]); printf("target1:\t%g\t%g\t%g\n",target1[0],target1[1],target1[2]); printf("target2:\t%g\t%g\t%g\t%g\t%g\n",target2[0],target2[1],target2[2],target2[3],target2[4]); return 0;}void copy_arr(double source[],double target1[],int n){ int i; for(i=0;i

8、编写一个程序,初始化一个3x5的二维double数组,并利用一个基于变长数组的函数把该数组复制到另一个二维数组。还要编写一个基于变长数组的函数来显示两个数组的内容。这两个函数应该能够处理任意的NXM数组。

#include 
#define ROWS 3#define COLS 5void copy_2d(int n,int m,double source[n][m], double target[n][m]);void copy_1d(double a1[], double a2[], int n);void show_arr(int n,int m,double ar[n][m]);int main(void){ int i,j; double source[ROWS][COLS] = {
{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}}; double target[ROWS][COLS] = {0}; printf("Before operation :\n"); show_arr(ROWS,COLS,source); copy_2d(ROWS,COLS,source,target);printf("After operation :\n"); show_arr(ROWS,COLS,target); return 0;}void copy_2d(int n,int m,double source[n][m], double target[n][m]){ int i; for(i=0;i

9、编写一个程序,把两个数组内的相应元素相加,结果存储到第三个数组内。函数的数组名包含3个数组名和数组大小,并在一个简单的程序中测试这个函数。

#include
#define COLS 4void sum(int a1[],int a2[],int target[],int n);int main(void){ int a1[COLS]={2,4,5,8}; int a2[COLS]={1,0,4,6}; int target[COLS]={0}; sum(a1,a2,target,COLS); printf("a1[0]=%d\t a1[1]=%d\t a1[2]=%d\t a1[3]=%d\n",a1[0],a1[1],a1[2],a1[3]); printf("a2[0]=%d\t a2[1]=%d\t a2[2]=%d\t a2[3]=%d\n",a2[0],a2[1],a2[2],a2[3]); printf("target[0]=%d\t target[1]=%d\t target[2]=%d\t target[3]=%d\n",target[0],target[1],target[2],target[3]); return 0;}void sum(int a1[],int a2[],int target[],int n){ int i; for(i=0;i

10、编写一个程序,声明一个3x5的数组并初始化,具体数值可以随意。程序打印出数值,然后数值翻一番,接着再次打印出新值。编写一个函数来显示数组的内容,再编写另一个函数执行翻倍功能。数组名和数组行数作为参数由程序传递给函数。

#include
#define ROWS 3#define COLS 5void show_arr(int ar[][COLS],int n);void twice(int (*pt)[COLS],int n);int main(void){ int ar[ROWS][COLS] = {
{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}}; printf("Before:\n"); show_arr(ar,ROWS); twice(ar,ROWS); printf("After:\n"); show_arr(ar,ROWS); return 0;}void show_arr(int ar[][COLS],int n){ int i,j; for(i=0;i

11、重写程序清单10.7的程序rain,main()中的主要功能改为由函数来执行。

/*rain.c 针对若干年的降水量数据,计算年降水总量、年降水平均量、以及月降水平均量*/#include 
#define MONTHS 12#define YEARS 5void display(float arr[][MONTHS],int years);int main (void){ //把数组初始化为2000年到2004年的降水量数据 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} }; display(rain,YEARS); return 0;}void display(float arr[][MONTHS],int years){ int year,month; float subtot,total; printf("YEAR RAINALL(inches) \n"); for(year=0,total=0;year

12、编写一个程序,提示用户输入3个数集,每个数集包括5个double值。程序应当实现下列所有功能:

a.把输入信息存储到一个3*5的数组中;

b.计算出每个数集(包含5个数值)的平均值;

c.计算所有数值的平均值;

d.找出这15个数的最大值;

e.打印结果

每个任务需要用一个独立的函数来完成(使用传统C处理数组的方法)。对于任务b,需要编写计算并返回一维数组平均值的函数,循环3次调用该函数来实现任务b。对于其他任务,函数应当把整个数组做为参数,并且完成任务c和d的函数应该向它的调用函数返回答案。

#include 
#define ROWS 3#define COLS 5void store(double ar[][COLS],int rows);double average_row(double ar[COLS]);double average_tot(double ar[][COLS],int rows);double f_max(double ar[][COLS],int rows);void display(double ar[][COLS],int rows,double average0,double average1,double average2,double average_total, double max);int main(void){ double array[ROWS][COLS]; double average0,average1,average2,average_total,max; store(array,ROWS); average0=average_row(&array[0]); average1=average_row(&array[1]); average2=average_row(&array[2]); average_total=average_tot(array,ROWS); max = f_max(array,ROWS); display(array,ROWS,average0,average1,average2,average_total,max); return 0;}void store(double ar[][COLS],int rows){ int i,j; printf("Please input 3 array of 5 numbers:"); for(i=0;i

 

转载于:https://my.oschina.net/idreamo/blog/732323

你可能感兴趣的文章
机器学习小记——KNN(K近邻) ^_^ (一)
查看>>
获取MAC地址方法
查看>>
C# 矩阵作业
查看>>
poj 1730 Perfect Pth Powers
查看>>
POJ 1328 Radar Installation
查看>>
HDU 1072 Nightmare【广搜】
查看>>
HDU 1556 Color the ball【树状数组】
查看>>
类型(type)
查看>>
读书笔记-String
查看>>
技术只是工具,你不能用它来代替生活
查看>>
java 导出Execl
查看>>
KMP算法模板
查看>>
5月21日日志
查看>>
centos下mysql数据迁移方法
查看>>
面向对象编程(十一)——组合以及与继承的区别
查看>>
Docker镜像(二)
查看>>
一道很有意思的面试题目(转)
查看>>
BA技术 - 流程图软件
查看>>
【PGM】概率图模型基础
查看>>
北京易维清的自荐
查看>>