c primer plus 第十章编程题

来源:互联网 发布:js获取指定的时间戳 编辑:程序博客网 时间:2024/06/05 12:40
第一题:修改程序清单10.7中的程序rain,使它不使用数组下标,而是使用指针进行计算(程序中仍然需要声明并初始化数组)。
解:
代码如下:
#include <stdio.h>
#define MONTHS 12
#define YEARS 5
int 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;
    const float (*ptr) [MONTHS];
    ptr = rain;

    printf(" YEAR   RAINFALL(inches) \n");
    for(year = 0,total = 0;year < YEARS;year++)
    {
        for(month= 0,subtot = 0;month < MONTHS;month++)
            subtot += *(*(ptr + 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  Ict ");
    printf(" Nov  Dec \n");

    for(month = 0;month < MONTHS;month++)
    {
        for(year = 0,subtot = 0;year < YEARS;year++)
            subtot += *(*(ptr + year) + month);
        printf("%4.1f ",subtot/YEARS);
    }
    printf("\n");
    return 0;
}
———————————————分割线—————————————————
第二题:编写一个程序,初始化一个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>
#include <string.h>
#define SIZE 5
void copy_arr(double * source,double * target ,int n);
void copy_ptr(double * source,double * target ,int n);
int main(void)
{
    double source[SIZE] =  {1.1,2.2,3.3,4.4,5.5};
    double *ptr;
    ptr = source;
    double target1[SIZE];
    double target2[SIZE];
  
    copy_arr(source,target1,5);
    copy_ptr(source,target2,5);
    return 0;
}
void copy_arr(double * sou,double * tar ,int n)
{
    int count;

    printf("target1:");
    for(count = 0;count < n;count++)
    {
        tar[count] = sou[count];
        printf(" %.1f",tar[count]);
    }
    printf("\n");
}
void copy_ptr(double * sou,double * tar ,int n)
{
    int count;

    printf("target2:");
    for(count = 0;count < n;count++,sou++,tar++)
    {
        *tar = *sou;
        printf(" %.1f",*tar);
    }
    printf("\n");
}
———————————————分割线—————————————————
第三题:编写一个函数,返回一个int数组中存储的最大值,并在一个简单的程序中测试这个函数。
解:
代码如下:
#include <stdio.h>
#define SIZE 5
int max_arr(int * ptr,int n);
int main(void)
{
    int arr[SIZE] = {67,22,73,35,47};
    int * ptr;
     ptr = arr;

    printf("The max number of arr is %d\n",max_arr(ptr,SIZE));
    return 0;
}
int max_arr(int * ptr,int n)
{
    int i,re;

    for(i = 0,re = 0;i < n;i++,ptr++)
        re = (*ptr > re)?*ptr:re;
    return re;
}
———————————————分割线—————————————————
第四题:编写一个函数,返回一个double数组中存储的最大数值的索引,并在一个简单的程序中测试这个函数。
解:
代码如下:
#include <stdio.h>
#define SIZE 5
int max_arr_index(double * ptr,int n);
int main(void)
{
    double arr[SIZE] = {67.4,22.4,73.4,35.4,47.4};
    double * ptr;
     ptr = arr;

    printf("The max number's index of arr is %d\n",max_arr_index(ptr,SIZE));
    return 0;
}
int max_arr_index(double * ptr,int n)
{
    int i,re;
    double d,* p;
    p = ptr;

    for(i = 0,d = 0.0;i < n;i++,ptr++)
        d = (*ptr > d)?*ptr:d;
    for(i = 0;i < n;i++)
        if(d == p[i])
             re = i;
    return re;
}
———————————————分割线—————————————————
第五题:编写一个函数,返回一个double数组中最大和最小的数之间的差值,并在一个简单的程序中测试这个函数。
解:
代码如下:
#include <stdio.h>
#define SIZE 5
double cha_arr(double * ptr,int n);
int main(void)
{
    double arr[SIZE] = {67.4,22.4,73.4,35.4,47.4};
    double * ptr;
     ptr = arr;

    printf("The dif of max and min about arr is %.1f\n",cha_arr(ptr,SIZE));
    return 0;
}
double cha_arr(double * ptr,int n)
{
    int i;
    double max,min,* p1,* p2;
    p1 = p2 = ptr;

    for(i = 0,max = *p1;i < n;i++,p1++)
        max = (*p1 > max)?*p1:max;
    for(i = 0,min = *p2;i < n;i++,p2++)
        min = (*p2 > min)?min:*p2;
    return max - min;
}
———————————————分割线—————————————————
第六题:编写一个程序,初始化一个二维double数组,并利用第二题中的任意一函数来把这个函数赋值到另一个二维数组(因为二维数组是数组的数组,所以可以使用处理一维数组的函数来赋值数组的每一个子数组)。
解:
代码如下:
#include <stdio.h>
#include <string.h>
#define SIZE1 2
#define SIZE2 5
void copy_arr(double (* source)[SIZE2],double (* target)[SIZE2] ,int n,int m);
int main(void)
{
    double source[SIZE1][SIZE2] =  {
                                          {1.1,2.2,3.3,4.4,5.5},
                                          {6.6,7.7,8.8,9.9,0.0}
                                                          };
    double target[SIZE1][SIZE2];
  
    copy_arr(source,target,SIZE1,SIZE2);
    return 0;
}
void copy_arr(double (* source)[SIZE2],double (* target)[SIZE2] ,int n,int m)
{
    int count1,count2;

    printf("target:\n");
    for(count1 = 0;count1 < n;count1++)
    {
        for(count2 = 0;count2 < m;count2++)
        {
            target[count1][count2] = source[count1][count2];
            printf("%.1f,",target[count1][count2]);
        }
        printf("\n");
    }
    printf("\n");
}
———————————————分割线—————————————————
第七题:利用第二题中的复制函数,把一个包含7个元素的数组内第3到第5元素赋值到一个包含3个元素的数组中。函数本身不需要修改,只需要选择合适的实际参数(实际参数不需要是数组名和数组大小,而只需是数组元素的地址和需要赋值的元素数目)。
解:
代码如下:
#include <stdio.h>
#include <string.h>
#define SIZE1 7
#define SIZE2 3
void copy_ptr(double * source,double * target ,int n);
int main(void)
{
    double source[SIZE1] =  {1.1,2.2,3.3,4.4,5.5,6.6,7.7};
    double *ptr;
    ptr = source + 2;
    double target[SIZE2];
  
    copy_ptr(ptr,target,SIZE2);
    return 0;
}
void copy_ptr(double * sou,double * tar ,int n)
{
    int count;

    printf("target:");
    for(count = 0;count < n;count++,sou++,tar++)
    {
        *tar = *sou;
        printf(" %.1f",*tar);
    }
    printf("\n");
}
———————————————分割线—————————————————
第八题:编写一个程序,初始化一个3X5的二维double数组,并利用一个基于变长数组的函数把该数组赋值到另一个二维数组。还要编写一个基于变长数组的函数来显示两个数组的内容。这两个函数应该能够处理任意的NXM数组(如果没有可以指出变长数组的编译器,就使用传统C处理NX5数组的函数方法)。
解:
代码如下:
#include <stdio.h>
#define ROW 3
#define COL 5
void copy_vla(int row,int col,double (*ptr)[COL],double arr[row][col]);
void print_vla(int row,int col,double (*ptr)[COL],double arr[row][col]);
int main(void)
{
    double source[ROW][COL] = {
                     {1.1,2.2,3.3,4.4,5.5},
                     {6.6,7.7,8.8,9.9,10.0},
                     {11.0,12.0,13.0,14.0,15.0}
                                                     };
    int row;
    int col;
    printf("Input how many row(less than 4) and col(less than 6) do you want:\n");
    scanf("%d %d",&row,&col);
    double target[row][col];

    copy_vla(row,col,source,target);
    print_vla(row,col,source,target);
    return 0;
}
void copy_vla(int row,int col,double (*ptr)[COL],double arr[row][col])
{
    int i,j;
    
    for(i = 0;i < row;i++)
    {
        for(j = 0;j < col;j++)
            arr[i][j] = ptr[i][j];
    }
}
void print_vla(int row,int col,double (*ptr)[COL],double arr[row][col])
{
    int i,j;
    
    printf("source:\n");
    for(i = 0;i < ROW;i++)
    {
        for(j = 0;j < COL;j++)
            printf(" %.1f",ptr[i][j]);
    }
    printf("\ntarget:\n");
    for(i = 0;i < row;i++)
    {
        for(j = 0;j < col;j++)
            printf(" %.1f",arr[i][j]);
    }
    printf("\n");
}
———————————————分割线—————————————————
第九题:编写一个函数,把两个数组内的相应元素相加,结果存储到第三个数组内,也就是说,如果数组1具有值2,3,4,8,数组2具有值1,0,4,6,则函数对数组3赋值3,4,9,14。函数的参数包括3个数组名和数组大小。并在一个简单的程序中测试这个函数。
解:
代码如下:
#include <stdio.h>
#define SIZE 4
void add_arr(int * p1,int * p2,int * p3,int n);
void print_arr(int * p,int n);
int main(void)
{
    int s1[SIZE] = {2,4,5,8};
    int s2[SIZE] = {1,0,4,6};
    int result[SIZE];

    add_arr(s1,s2,result,SIZE);
    printf("s1:\n");
    print_arr(s1,SIZE);
    printf("s2:\n");
    print_arr(s2,SIZE);
    printf("result:\n");
    print_arr(result,SIZE);
    return 0;
}
void add_arr(int * add1,int * add2,int * result,int n)
{
    int i;

    for(i = 0;i < n;i++,add1++,add2++,result++)
        *result = *add1 + *add2;
}
void print_arr(int * p,int n)
{
    int i;
 
    for(i = 0;i < n;i++,p++)
        printf(" %d",*p);
    printf("\n");
}
———————————————分割线—————————————————
第十题:编写一个程序,声明一个3x5的数组并初始化,具体数值可以随意。程序打印出数值,然后数值翻一番,戒指再次打印出新值。编写一个函数来显示数组的内容,再编写另一个函数执行翻倍功能。数组名和数组行数作为参数有程序传递给函数。
解:
代码如下:
#include <stdio.h>
#define ROW 3
#define COL 5
void doub(double (*ptr)[COL],int row);
void print(double (*ptr)[COL],int row);
int main(void)
{
    double source[ROW][COL] = {
                     {1.1,2.2,3.3,4.4,5.5},
                     {6.6,7.7,8.8,9.9,10.0},
                     {11.0,12.0,13.0,14.0,15.0}
                                                     };

    print(source,ROW);
    doub(source,ROW);
    print(source,ROW);
    return 0;
}
void doub(double (*ptr)[COL],int row)
{
    int i,j;
    
    for(i = 0;i < row;i++)
    {
        for(j = 0;j < COL;j++)
            ptr[i][j] = ptr[i][j] * 2.0;
    }
}
void print(double (*ptr)[COL],int row)
{
    int i,j;
    
    printf("source:\n");
    for(i = 0;i < row;i++)
    {
        for(j = 0;j < COL;j++)
            printf(" %.1f",ptr[i][j]);
    }
    printf("\n");
}
———————————————分割线—————————————————
第十一题:重写程序清单10.7的程序rain,main()中的主要功能改为由函数来执行。
解:
代码如下:
#include <stdio.h>
#define MONTHS 12
#define YEARS 5
void yearly(const float (*ptr)[MONTHS],int n,int m);
void monthly(const float (*ptr)[MONTHS],int n,int m);
int 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}
                                      };
    const float (*ptr) [MONTHS];
    ptr = rain;

    yearly(ptr,YEARS,MONTHS);
    monthly(ptr,YEARS,MONTHS);
    return 0;
}
void yearly(const float (*ptr)[MONTHS],int n,int m)
{
    int year,month;
    float subtot,total;

    printf(" YEAR   RAINFALL(inches) \n");
    for(year = 0,total = 0;year < n;year++)
    {
        for(month= 0,subtot = 0;month < m;month++)
            subtot += *(*(ptr + year) + month);
        printf("%5d %15.1f\n",2000 + year,subtot);
        total += subtot;
    }
    printf("\nThe yearly average is %.1f inches.\n\n",total/n);
}
void monthly(const float (*ptr)[MONTHS],int n,int m)
{
    int year,month;
    float subtot;

    printf("MONTHLY AVERAGES: \n\n");
    printf(" Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Ict ");
    printf(" Nov  Dec \n");

    for(month = 0;month < m;month++)
    {
        for(year = 0,subtot = 0;year < n;year++)
            subtot += *(*(ptr + year) + month);
        printf("%4.1f ",subtot/n);
    }
    printf("\n");
}
———————————————分割线—————————————————
第十二题:编写一个程序,提示用户输入3个数集,每个数集包括5个double值。程序应当事先下列所有功能:
a.把输入信息存储到一个3x5的数组中
b.计算出每个数集(包括5个数值)的平均值
c.计算所有数值的平均数
d.找出这15个数中的最大值
e.打印出结果
每个任务需要用一个单独的函数来实现(使用传统C处理数组的方法)。对于人物b,需要编写计算并返回一维数组平均值的函数,循环3此调用该函数实现人物b。对于其他任务,函数应当把整个数组作为参数,并且完成人物c和d的函数应该向它的调用函数返回答案。
解:
代码如下:
#include <stdio.h>
#define ROW 3
#define COL 5
void get_arr(double (* arr)[COL],int n,int m);
void print_row_avg(double * arr,int m);
double avg(double (* arr)[COL],int n,int m);
double max(double (* arr)[COL],int n,int m);
void print_arr(double (* arr)[COL],int n,int m);
int main(void)
{
    double arr[ROW][COL];
    int i;
 
    get_arr(arr,ROW,COL);
    for(i = 0;i < ROW;i++)
        print_row_avg(arr[i],COL);
    printf("The average of arr is %.2f\n",avg(arr,ROW,COL));
    printf("The max of arr is %.2f\n",max(arr,ROW,COL));
    print_arr(arr,ROW,COL);
    return 0;
}
void get_arr(double (* arr)[COL],int n,int m)
{
    int i,j;

    printf("Input 15 double:\n");
    for(i = 0;i < n;i++)
    {
        for(j = 0;j < m;j++)
            scanf("%f",&arr[i][j]);
    }
}
void print_row_avg(double * arr,int m)
{
    int i;
    double total = 0.0;

    for(i = 0;i < m;i++)
        total += arr[i];
    printf("average is %.2f\n",total / (float)m);
}
double avg(double (* arr)[COL],int n,int m)
{
    int i,j;
    double total = 0.0;

    for(i = 0;i < n;i++)
    {
        for(j = 0;j < m;j++)
            total +=arr[i][j];
    }
    return total / (float)(n * m);
}
double max(double (* arr)[COL],int n,int m)
{
    int i,j;
    double max = arr[0][0];
    
    for(i = 0;i < n;i++)
    {
        for(j = 0;j < m;j++)
            max = (max > arr[i][j])?max:arr[i][j];
    }
    return max;
}
void print_arr(double (* arr)[COL],int n,int m)
{
    int i,j;

    for(i = 0;i < n;i++)
    {
        for(j = 0;j < m;j++)
            printf(" %.2f",arr[i][j]);
        printf("\n");
    }
}
———————————————分割线—————————————————
第十三题:利用变长数组作为函数参数重做练习12。
解:
代码如下:
#include <stdio.h>
void get_arr(int n,int m,double arr[n][m]);
void print_row_avg(int m,double arr[m]);
double avg(int n,int m,double arr[n][m]);
double max(int n,int m,double arr[n][m]);
void print_arr(int n,int m,double arr[n][m]);
int main(void)
{
    int n,m;
    printf("Input the row and col:\n");
    scanf("%d %d",&n,&m);
    double arr[n][m];
    int i;
 
    get_arr(n,m,arr);
    for(i = 0;i < n;i++)
        print_row_avg(m,arr[i]);
    printf("The average of arr is %.2f\n",avg(n,m,arr));
    printf("The max of arr is %.2f\n",max(n,m,arr));
    print_arr(n,m,arr);
    return 0;
}
void get_arr(int n,int m,double arr[n][m])
{
    int i,j;

    printf("Input %d double:\n",n * m);
    for(i = 0;i < n;i++)
    {
        for(j = 0;j < m;j++)
            scanf("%lf",&arr[i][j]);
    }
}
void print_row_avg(int m,double arr[m])
{
    int i;
    double total = 0.0;

    for(i = 0;i < m;i++)
        total += arr[i];
    printf("average is %.2f\n",total / (float)m);
}
double avg(int n,int m,double arr[n][m])
{
    int i,j;
    double total = 0.0;

    for(i = 0;i < n;i++)
    {
        for(j = 0;j < m;j++)
            total +=arr[i][j];
    }
    return total / (float)(n * m);
}
double max(int n,int m,double arr[n][m])
{
    int i,j;
    double max = arr[0][0];
    
    for(i = 0;i < n;i++)
    {
        for(j = 0;j < m;j++)
            max = (max > arr[i][j])?max:arr[i][j];
    }
    return max;
}
void print_arr(int n,int m,double arr[n][m])
{
    int i,j;

    for(i = 0;i < n;i++)
    {
        for(j = 0;j < m;j++)
            printf(" %.2f",arr[i][j]);
        printf("\n");
    }
}
阅读全文
0 0
原创粉丝点击