C Primer Plus 第六版 第10章 编程练习
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.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.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 " ) ;
printf ( " 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 个函数以目标数组名、源数组名和指向源数组的最后一个元素后面元素的指针。也就是说,给定以下声明,则函数调用如下所示:
copy_arr(target1, source, 5);
copy_ptr(target2, source, 5);
copy_ptrs(target3, source, source+5);
print(source,5);
print(target1,5);
print(target2,5);
print(target3,5);
#include <stdio.h>
void copy_arr ( double ar[ ] , double so[ ] , int n) ;
void copy_ptr ( double * ar, double * so, int n) ;
void copy_ptrs ( double * ar, double * so, double * end) ;
void print ( double * ar, int n) ;
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 ) ;
print ( source, 5 ) ;
print ( target1, 5 ) ;
print ( target2, 5 ) ;
print ( target3, 5 ) ;
}
void copy_arr ( double ar[ ] , double so[ ] , int n)
{
int i;
for ( i = 0 ; i < n; i++ )
ar[ i] = so[ i] ;
}
void copy_ptr ( double * ar, double * so, int n)
{
while ( -- n >= 0 )
* ( ar++ ) = * ( so++ ) ;
}
void copy_ptrs ( double * ar, double * so, double * end)
{
while ( so < end)
{
* ( ar++ ) = * ( so++ ) ;
}
}
void print ( double * ar, int n)
{
int i;
for ( i = 0 ; i < n; i++ )
{
printf ( "%.1f " , ar[ i] ) ;
}
printf ( "\n" ) ;
}
3.编写一个函数,返回存储在 int 类型的数组中的最大值,并在一个简单的程序中测试该函数。
#include <stdio.h>
int maxar ( int ar[ ] , int n) ;
int main ( void )
{
int ar[ 10 ] = {
12 , 2 , 9 , 8 , 7 , 6 , 5 , 4 , 11 , 2 } ;
printf ( "最大值为:%d\n" , maxar ( ar, 10 ) ) ;
return 0 ;
}
int maxar ( int ar[ ] , int n)
{
int i;
int max = ar[ 0 ] ;
for ( i = 1 ; i < n; i++ )
if ( max < ar[ i] )
max = ar[ i] ;
return max;
}
4.编写一个函数,返回存储在 double 类型数组中最大值的下标,并在一个简单的程序中测试该函数。
#include <stdio.h>
int maxar ( double ar[ ] , int n) ;
int main ( void )
{
double ar[ 10 ] = {
1.1 , 2.2 , 4.4 , 3.3 , 9.9 ,
5.5 , 10.10 , 8.8 , 7.7 , 11.11 } ;