1.修改程序清单10.7的rain.c程序,用指针进行计算(仍然要声明并初始化数组)。
#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.4,0.0,0.6,1.7,4.3,6.2},
{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(inchs)\n");
for (year =0 ,total = 0;year < YEARS;year++)
{
for (month = 0, subtot = 0;month < MONTHS;month++)
subtot += *(*(rain + year) + month);
printf("%5d %15.1f\n", 2010 + year, subtot);
total += subtot;
}
printf("The yearly average rainfall is %.1f inches.\n\n", total / YEARS);
printf("Jan Feb Apr Mar 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个其他数组中( 在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>
void copy_arr(double target[],double source[],int n);
void copy_ptr(double target[],double source[],int n);
void copy_ptrs(double target[],double source[],double * pt);
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];
int i;
copy_arr(target1, source, 5);
copy_ptr(target2, source, 5);
copy_ptrs(target3, source, source + 5);
printf("target1:");
for (i = 0;i < 5;i++)
printf("%.1lf ", target1[i]);
putchar('\n');
printf("target2:");
for (i = 0;i < 5;i++)
printf("%.1lf ", target2[i]);
putchar('\n');
printf("target3:");
for (i = 0;i < 5;i++)
printf("%.1lf ", target3[i]);
putchar('\n');
return 0;
}
void copy_arr(double target[], double source[], int n)
{
int i;
for (i = 0;i < n;i++)
target[i] = source[i];
}
void copy_ptr(double target[], double source[], int n)
{
int i;
double * ptr;
ptr = source;
for (i = 0;i < n;i++)
*(target + i) = *(ptr++);
}
void copy_ptrs(double target[], double source[], double * pt)
{
int i;
for (i = 0;source + i < pt;i++)
target[i] = source[i];
}
3.编写一个函数,返回储存在int类型数组中的最大值,并在一个简单的程序中测试该函数。
int max_arr(const int ar[], int n)
{
int i;
int max;
for (i = 0, max = ar[i];i < n - 1;i++)
if (max < ar[i + 1])
max = ar[i+1];
return max;
}
//测试函数
#include <s