C Primer Plus(第6版) 第十章 编程练习及参考答案
编译环境:Microsoft Visual Studio 2019
备注:本文留作作者自用,如有错误敬请指出
(针对Microsoft Visual Studio 2019的一些特性对答案进行了修改)
1.修改程序清单10.7的rain.c程序,用指针进行计算(仍然要声明并初始化数组)。
#include<stdio.h>
#include<stdlib.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;
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", 2010 + 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 += ptr[year][month];
printf("%3.1f ", subtot / YEARS);
}
printf("\n");
system("pause");
return 0;
}
2.编写一个程序,初始化一个double类型的数组,然后把该数组的内容拷贝至3个其他数组中(在main()中声明这4个数组)。使用带数组表示法的函数进行第1份拷贝。使用带指针表示法和指针递增的函数进行第2份拷贝。把目标数组名、源数组名和待拷贝的元素个数作为前两个函数的参数。第3个函数以目标数组名、源数组名和指向源数组最后一个元素后面的元素的指针。也就是说,给定以下声明,则函数调用如下所示:
double source[5]={1.1,2.2,3.3,4.4,5.5};
double target1[5];
double target2[5];
double target3[5];
copy_arr(target1,source,5);
copy_ptr(target2,source,5);
copy_ptrs(target3,source, source+5);
#include<stdio.h>
#include<stdlib.h>
void copy_arr(double *,double *,int);
void copy_ptr(double*, double*, int);
void copy_ptrs(double*, double*,double *);
int main(void)
{
double source[5] = {
1.1,2.2,3.3,4.4,5.5 };
double target1[5];
double target2[5];
double target3[5];
copy_arr(target1, source, 5);
copy_ptr(target2, source, 5);
copy_ptrs(target3, source, source + 5);
system("pause");
return 0;
}
void copy_arr(double* p1, double* p2, int n)
{
int num;
for (num = 0;num < n;num++,p1++,p2++)
*p1 = *p2;
}
void copy_ptr(double* p1, double* p2, int n)
{
int num;
for (num = 0;num < n;num++, p1++, p2++)
*p1 = *p2;
}
void copy_ptrs(double* p1, double* p2, double* p3)
{
for (;p2<p3;p1++, p2++)
*p1 = *p2;
}
3.编写一个函数,返回存储在int类型数组中的最大值,并在一个简单的程序中测试该函数。
#include<stdio.h>
#include<stdlib.h>
#define SIZE 5
int formax(int *,