文档章节

C Primer Plus 第10章 数组和指针 编程练习答案

idreamo
 idreamo
发布于 2016/08/14 09:08
字数 2878
阅读 190
收藏 0
点赞 0
评论 0

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

#include <stdio.h>
#define MONTHS 12
#define YEARS 5
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}
        };
    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.lf\n",2000+year,subtot);
        total+=subtot;  //所有年度的总降水量
    }
    printf("\nThe yearly average is %.1f inches.\n\n",total/YEARS);
    printf("MONTHLY AVERAGES: \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个数组都需要在主程序中声明)。制作第一份拷贝的函数使用数组符号。制作第二份拷贝的函数使用指针符号,并使用指针的增量操作。把目标数组名和要复制的元素数目做为参数传递给函数。也就是说,如果给定了下列声明,函数调用应该如下面所示:

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 <stdio.h>
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<n;i++)
        target1[i]=source[i];
    return 0;
}
void copy_ptr(double *source,double *target2,int n)
{
    int i=0;
    while(i++<n)
    *(target2++) = *(source++);
    return 0;
}

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

#include<stdio.h>
#define WIDTH 6
int 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<n;i++)
       {
          if(max < ar[i])
            max=ar[i];
       }
    return max;
}

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

#include<stdio.h>
#define WIDTH 6
int 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<n;i++)
       {
          if(ar[max] < ar[i])
            max=i;
       }
            return max;
}

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

#define WIDTH 6
float 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<n;i++)
       {
          if(max< ar[i]) max=ar[i];
          if(min> ar[i]) min=ar[i];
       }
    return (max-min);
}

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

#include <stdio.h>
#define ROWS 2
#define COLS 3
void 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<ROWS; i++)
 {
  for (j=0; j<COLS; j++)
   printf("%g\t",target[i][j]);
  printf("\n");
 }

    return 0;
}  

void copy_2d(double ( *source )[COLS], double target[][COLS], int n)
{
 int i;
 for(i=0;i<n;i++)
  copy_1d( *(source+i),target[i],COLS);
}


void copy_1d(double a1[], double *a2, int n)
{
 int i;
 for (i=0; i<n; i++)
  a2[i] = a1[i];
}

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

#include <stdio.h>
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<n;i++)
        target1[i]=source[i];
    return 0;
}
void copy_ptr(double *source,double *target2,int n)
{
    int i=0;
    while(i++<n)
    *(target2++) = *(source++);
    return 0;
}

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

#include <stdio.h>
#define ROWS 3
#define COLS 5
void 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<n;i++)
  copy_1d( *(source+i),target[i],COLS);
}


void copy_1d(double a1[], double *a2, int n)
{
 int i;
 for (i=0; i<n; i++)
  a2[i] = a1[i];
}

void show_arr(int n,int m,double ar[n][m])
{
    int i,j;
    for (i=0; i<ROWS; i++)
 {
  for (j=0; j<COLS; j++)
   printf("%g\t",ar[i][j]);
  printf("\n");
 }
}

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

#include<stdio.h>
#define COLS 4
void 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<COLS;i++)
        target[i]=a1[i]+a2[i];
    return 0;
}

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

#include<stdio.h>
#define ROWS 3
#define COLS 5
void 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<n;i++)
    {
        for(j=0;j<COLS;j++)
        printf("%d\t",ar[i][j]);
        printf("\n");
    }
    return 0;
}
void twice(int (*pt)[COLS],int n)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<COLS;j++)
        *(*(pt+i)+j)=2*(*(*(pt+i)+j));
    }
    return 0;

}

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

/*rain.c 针对若干年的降水量数据,计算年降水总量、年降水平均量、以及月降水平均量*/
#include <stdio.h>
#define MONTHS 12
#define YEARS 5
void 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<years;year++)
    {
        for(month=0,subtot=0;month<MONTHS;month++)
            subtot+=arr[year][month];
        printf("%5d %15.1f\n",2000+year,subtot);
        total+=subtot;  //所有年度总降水量
    }
    printf("\nThe yearly average is %.1f inches.\n\n",total/years);
    printf("MONTHLY AVERAGES:\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+=arr[year][month];
        printf("%4.1f ",subtot/years);
    }
    printf("\n");
    return 0;
}

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

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

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

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

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

e.打印结果

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

#include <stdio.h>
#define ROWS 3
#define COLS 5
void 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<rows;i++)
    {
        for(j=0;j<COLS;j++)
            scanf("%lf",&ar[i][j]);
    }
}
double average_row(double ar[COLS])
{
    int i;
    double sum=0;
    for(i=0;i<COLS;i++)
       sum += ar[i];
    return sum/COLS;
}
double average_tot(double ar[][COLS],int rows)
{
    int i,j;
    double sum=0;
    for(i=0;i<rows;i++)
    {
        for(j=0;j<COLS;j++)
            sum+=ar[i][j];
    }
    return sum/(ROWS*COLS);
}
double f_max(double ar[][COLS],int rows)
{
    int i,j;
    double max = ar[0][0];
    for(i=0;i<rows;i++)
        for(j=0;j<=COLS;j++)
            if (max < ar[i][j])
            max=ar[i][j];

    return max;
}
void display(double ar[][COLS],int rows,double average0,double average1,double average2,double average_total,
             double max)
{
    int i,j;
    printf("a.\narray = \n");
    for(i=0;i<rows;i++)
    {
        for(j=0;j<COLS;j++)
            printf("%g\t",ar[i][j]);
        printf("\n");
    }
    printf("b.\n");
    printf("average0 = %g\n",average0);
    printf("average1 = %g\n",average1);
    printf("average2 = %g\n",average2);

    printf("c.\n");
    printf("total average = %g\n",average_total);

    printf("d.\n");
    printf("max = %g\n",max);
}

 

© 著作权归作者所有

共有 人打赏支持
idreamo
粉丝 12
博文 139
码字总数 224743
作品 0
青岛
产品经理
[编程语言]C陷阱与缺陷

内容摘要 作者以自己1985年在Bell实验室时发表的一篇论文为基础,结合自己的工作经验扩展成为这本对C程序员具有珍贵价值的经典著作。写作本书的出发点不是要批判C语言,而是要帮助C程序员绕过...

21gprs ⋅ 2014/05/23 ⋅ 0

书单及进度(每日更新2015-7-13)

jQuery Mobile Web Development Essentials.pdf 写的很好5 Apache Cordova 3 Programming.pdf 写的比较啰嗦,不过找不到其它的书了3 Web Development with Node and Express.pdf ING(这个已经......

cyper ⋅ 2014/05/14 ⋅ 7

关东升的《从零开始学Swift》第2版已经出版

关东升的《从零开始学Swift》第2版已经出版 大家好: 苹果2015WWDC大会发布了Swift2.0,它较之前的版本Swift1.x有很大的变化,所以我即将出版《从零开始学Swift》 《从零开始学Swift》将在《...

tony关东升 ⋅ 2016/02/24 ⋅ 0

关东升的《从零开始学Swift》3月9日已经上架

大家一直期盼的《从零开始学Swift》于3月9日已经上架,它是关东升老师历时8个月的呕心沥血所编著,全书600多页,此本书基于Swift 2.x,通过大量案例全面介绍苹果平台的应用开发。全书共分5 部...

tony关东升 ⋅ 2016/03/11 ⋅ 0

关东升的《从零开始学Swift》3月9日已经上架

大家一直期盼的《从零开始学Swift》于3月9日已经上架,它是关东升老师历时8个月的呕心沥血所编著,全书600多页,此本书基于Swift 2.x,通过大量案例全面介绍苹果平台的应用开发。全书共分5 部...

智捷课堂 ⋅ 2016/03/11 ⋅ 0

C Primer Plus 第11章 11.13 编程练习答案

1、设计并测试一个函数,可以从输入读取n个字符(包括空格、制表符和换行符),把结果存储在一个数组中,这个数组的地址通过参数来传递。 2、修改并测试练习1中的函数,使得可以在n个字符后,...

idreamo ⋅ 2016/09/22 ⋅ 0

关东升的《《从零开始学Swift》即将出版

大家好: 苹果2015WWDC大会发布了Swift2.0,它较之前的版本Swift1.x有很大的变化,所以我即将出版《从零开始学Swift》《从零开始学Swift》将在《Swift开发指南》第1版的基础上添加Swift2.0的...

智捷课堂 ⋅ 2015/08/17 ⋅ 0

C Primer Plus 第10章 数组和指针 10.3 指针和数组

我们举一个这种变相使用的例子:数组名同时也是该数组首元素的地址。也就是说,如果flizny是一个数组,下面的式子是正确的: flizny == &flizny[0] //数组名是该数组首元素的地址 flizny和&...

idreamo ⋅ 2016/07/25 ⋅ 0

2014年值得学习的编程语言书

经过数据分析和研究 Jobs Tractor 的 45000 个开发人员招聘职位数据,我们得到了上图的结果: 自上一年,主要的变化如下: PHP和Java换了位置,但是仍旧是高居不下 Java的Android已经取代了S...

modernizr ⋅ 2014/05/22 ⋅ 16

C Primer Plus 第6章 C控制语句 6.16 编程练习及答案

1、编写一个程序,创建一个具有26个元素的数组,并在其中存储26个小写字母。并让该程序显示该数组的内容。 6、编写一个程序把一个单词读入一个字符数组,然后反向打印这个词。提示:使用str...

idreamo ⋅ 2016/06/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部