《C Primer Plus 第五版》第十章编程练习

来源:互联网 发布:js控制div缓慢移动 编辑:程序博客网 时间:2024/05/01 15:47

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 [],double [],int);void copy_ptr(double *,double *,int);int main(void){double source[5]={1.1,2.2,3.3,4.4,5.5};double target1[5];double target2[5];int num=5;int a;printf(" Source:");for(a=0;a<5;a++)printf(" %g ",source[a]);copy_arr(source,target1,5);copy_ptr(source,target2,5);return 0;}void copy_arr(double source[],double target1[],int i){int a;printf("\ntarget1:");for(a=0;a<i;a++){target1[a]=source[a];printf(" %g ",target1[a]);}}void copy_ptr(double *source,double *target2,int i){int b;printf("\ntarget2:");for(b=0;b<i;b++){ *(target2 + b) = *(source + b) ;   printf(" %g ",target2[b]);}}

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

#include <stdio.h>#define N 6 int max_arr(const double [], int );void show_arr(const double [], int );int main(void){    double num[N] = {2.1,2.2,4.2,1.3,5.2,3.1};    int max;        show_arr(num,N);    max = max_arr(num,N);    printf("[%d] = largest\n", max);        return 0;}int max_arr(const double ar[], int n){    int i,m=0;    int max = ar[0];        for (i = 1; i < n; i++)        if (max < ar[i]){            max = ar[i];    m=i;}    return m;}void show_arr(const double ar[], int n){    int i;        for (i = 0; i < n; i++)        printf("%g ", ar[i]);    putchar('\n');}


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

#include <stdio.h>#define A 4#define B 6void copy_arr(double [][6],double [][6],int,int);int main(void){double source[A][B]={{1.1,2.2,3.3,4.4,5.5,6.6},{6.6,5.5,4.4,3.3,2.2,1.1},{1.1,2.2,3.3,4.4,5.5,6.6},{6.6,5.5,4.4,3.3,2.2,1.1},};double target[A][B];int a,b;printf("Source:\n");for(a=0;a<A;a++){for(b=0;b<B;b++)printf(" %g ",source[a][b]);putchar('\n');}copy_arr(source,target,4,6);return 0;}void copy_arr(double source[][6],double target[][6],int i,int ii){int a,b;printf("Target:\n");for(a=0;a<i;a++)for(b=0;b<ii;b++)target[a][b]=source[a][b];for(a=0;a<A;a++){for(b=0;b<B;b++)printf(" %g ",target[a][b]);putchar('\n');}}

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

#include <stdio.h>#define A 7#define B 3void copy_arr(int [],int [],int );int main(void){const int source[A]={2,4,6,8,10,12,14};int target[B];int a;printf("Source:\n");for(a=0;a<A;a++)printf(" %d ",source[a]);copy_arr(&source[2],target,3);return 0;}void copy_arr(int source[],int target[],int i)  {      int a;      printf("\nTarget:\n");      for(a=0;a<i;a++)      {          target[a]=source[a];          printf(" %d ",target[a]);      }  }  

9.编写一个函数,把两个数组内的元素相加,结果存到第三个数组内。也就是说,如果数组1具有值2、4、5、8,数组2具有值1、0、4、6,则函数对数组3赋值为3、4、9、14。函数的参数包含3个数组命和数组大小。并在一个简单的程序中测试这个函数。

#include <stdio.h>#define A 4void add(int [],int [],int [],int );int main(void){const int one[A]={1,3,5,7};const int two[A]={2,4,6,8};int three[A];int a;printf("one:");for(a=0;a<A;a++)printf(" %d ",one[a]);printf("\ntwo:");for(a=0;a<A;a++)printf(" %d ",two[a]);add(one,two,three,A);return 0;}void add(int one[],int two[],int three[],int i) {      int a;      printf("\none+two=:");      for(a=0;a<i;a++)      {          three[a]=one[a]+two[a];          printf(" %d ",three[a]);      }  }


2.编写一个程序,提示用户输入3个数集,每个数集包括5个double值。程序应当实现下列所有功能:
    a.把输入信息存储到一个3x5的数组中
    b.计算出每个数集(包含5个数值)的平均值
    c.计算所有数值的平均数
    d.找出这15个数中的最大值.
    e.打印出结果
    每个任务需要用一个单独的函数来实现(使用传统C处理数组的方法)。对于任务b,需要编写计算并返回一维数组平均值的函数,循环3次调用该函数来实现任务b。对于其他任务,函数应当把整个数组做为参数,并且完成任务c和d的函数应该向它的调用函数返回答案。

#include <stdio.h>#define ROWS 3#define COLS 5 void store(double [], int n);double average2d(int , int , double [][5]);double max2d(int , int , double [][5]);void showarr2(int , int , double [][5]);double average(const double [], int );int main(void){    double stuff[ROWS][COLS];    int row;        for (row = 0; row < ROWS; row++)    {        printf("Enter %d numbers for row %d\n", COLS, row + 1);        store(stuff[row], COLS);    }        printf("array contents:\n");    showarr2(ROWS, COLS, stuff);        for (row = 0; row < ROWS; row++)        printf("average value of row %d = %g\n", row + 1, average(stuff[row], COLS));    printf("average value of all rows = %g\n", average2d(ROWS, COLS, stuff));    printf("largest value = %g\n", max2d(ROWS, COLS, stuff));     printf("Bye!\n");        return 0;}void store(double ar[], int n){    int i;    for (i = 0; i < n; i++)    {        printf("Enter value #%d: ", i + 1);        scanf("%lf", & ar[i]);    }}    double average2d(int rows, int cols, double ar[][5]){    int r, c;    double sum = 0.0;        for (r = 0; r < rows; r++)        for (c = 0; c < cols; c++)            sum += ar[r][c];    if (rows * cols > 0)        return sum / (rows * cols);    else        return 0.0;}double max2d(int rows, int cols, double ar[][5]){    int r, c;    double max = ar[0][0];        for (r = 0; r < rows; r++)        for (c = 0; c < cols; c++)            if (max < ar[r][c])                max = ar[r][c];    return max;}void showarr2(int rows, int cols, double ar[][5]){    int row, col;        for (row = 0; row < rows; row++)    {        for (col = 0; col < cols; col++)            printf("%g ", ar[row][col]);        putchar('\n');    }}double average(const double ar[], int n){    int i;    double sum = 0.0;        for (i = 0; i < n; i++)        sum += ar[i];    if (n > 0)        return sum / n;    else        return 0.0;}


原创粉丝点击