第1题
/*编程练习10.1修改程序清单10.7的rain.c程序,用指针进行计算。*/
#include<stdio.h>
#define MONTHS 12
#define YEARS 5
void sum_rain(float rain[][MONTHS],int year);
void sum_rain_1(float(*p)[MONTHS], int year);
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(*p)[MONTHS] = rain;
printf(" YEAR RAINFALL (inches)\n");
sum_rain(rain, YEARS);
printf("\n");
printf(" YEAR RAINFALL (inches)\n");
sum_rain_1(*p, YEARS);
return 0;
}
//数组计算
void sum_rain(float rain[][MONTHS], int year)
{
int y, m;
float subtot, total=0;
for (y = 0; y < YEARS; y++)
{
for (m = 0,subtot=0; m < MONTHS; m++)
subtot += rain[y][m];
printf("%5d %15.1f\n", 2010 + y, 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 (m = 0; m < MONTHS; m++)
{
for (y = 0, subtot = 0; y < YEARS; y++)
subtot += rain[y][m];
printf("%4.1f ", subtot / YEARS);
}
printf("\n");
}
// 指针计算
void sum_rain_1(float(*p)[MONTHS], int year)
{
int i, j;
float subtot, total=0;
for (i = 0; i < YEARS; i++)
{
for (j = 0, subtot = 0; j < MONTHS; j++)
subtot += *(*(p + i) + j);
printf("%5d %15.1f\n", 2010 + i, 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 (j = 0; j < MONTHS; j++)
{
for (i = 0, subtot = 0; i < YEARS; i++)
subtot += *(*(p + i) + j);
printf("%4.1f ", subtot / YEARS);
}
printf("\n");
}
第2题
/*编程练习10.2 拷贝数组(略)*/
#include<stdio.h>
void copy_arr(double ar[], double sou[], int n);
void copy_ptr(double *ar, double *sou, int n);
void copy_ptrs(double *ar, double *sou, double * end);
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];
printf("source[5]={%.1f,%.1f,%.1f,%.1f,%.1f}\n",
source[0], source[1], source[2], source[3], source[4]);
copy_arr(target1, source, 5);
copy_ptr(target2, source, 5);
copy_ptrs(target3, source, source+5);
return 0;
}
void copy_arr(double ar[], double sou[], int n)
{
int i;
for (i = 0; i < n; i++)
ar[i] = sou[i];
printf("target1[5]={%.1f,%.1f,%.1f,%.1f,%.1f}\n",
ar[0], ar[1], ar[2], ar[3], ar[4]);
}
void copy_ptr(double* ar, double* sou, int n)
{
int index;
for (index = 0; index < n; index++)
*(ar+index) = *(sou+index);
printf("target2[5]={%.1f,%.1f,%.1f,%.1f,%.1f}\n",
*ar, *(ar+1),*(ar+2),*(ar+3),*(ar+4));
}
/*
void copy_ptrs(double *ar, double *sou, double* end)
{
while (sou < end)
{
*ar = *sou;
sou++;
ar++;
//由于赋值完毕后ar++,指针向后移动一位,此时首元素已经变成了(ar+1),所以下面打印*ar显示越界
}
printf("target3[5]={%.1f,%.1f,%.1f,%.1f,%.1f}\n",
*(ar + 1), *(ar + 2), *(ar + 3), *(ar + 4), *(ar + 5));
}
*/
void copy_ptrs(double* ar, double* sou, double* end)
{
double* temp = ar; //用一个中转指针指向目标指针,改变中转指针首元素位置不影响目标指针位置?
while (sou < end)
{
*temp = *sou;
sou++;
temp++;
}
printf("target3[5]={%.1f,%.1f,%.1f,%.1f,%.1f}\n",
*ar,*(ar + 1), *(ar + 2), *(ar + 3), *(ar + 4));
}
第3题
/*编程练习10.3 编写一个函数,返回存储在int类型数组中的最大值,并在一个简单的程序中测试该函数*/
#include<stdio.h>
int max_arr(int*ar, int n);
int main(void)
{
const int ar[10] = { 3,5,7,11,50,6,7,15,20,12 };
printf("Find the maximum value in the array.\n");
printf("The maximum value in the array is %d.\n", max_arr(ar, 10));
return 0;
}
int max_arr(int*ar, int n)
{
int max=0;
int index;
for (index = 0; index < n; index++)
{
if (max < *(ar + index))
max = *(ar + index);
}
return max;
}
第4题
/*编程练习10.4 编写一个函数,返回存储在double类型数组中的最大值的下标,并在一个简单的程序中测试该函数*/
#include<stdio.h>
int max_arr(double* ar, int n);
int main(void)
{
const double ar[10] = { 3.21,5.52,7.0,11.52,10.54,6.8,7.9,15.21,100.10,12.02 };
printf("Find the maximum value in the array.\n");
printf("The maximum value in the array is ar+%d.\n", max_arr(ar, 10));
return 0;
}
int max_arr(double* ar, int n)
{
double max = 0;
int index, index_max;
for (index = 0; index < n; index++)
{
if (max < *(ar + index))
max = *(ar + index);
}
for (index = 0; index < n; index++)
{
if (max = *(ar + index))
index_max = index;
}
return index_max;
}
第5题
/*编程练习10.5 编写一个函数,返回存储在double类型数组中的最大值和最小值的差值,并在一个简单的程序中测试该函数*/
#include<stdio.h>
double def_arr(double* ar, int n);
int main(void)
{
const double ar[10] = { 6.21,10.52,7.0,11.52,10.54,6.8,7.9,15.21,100.10,12.02 };
printf("Find the difference between the maximum and minimum values in the array.\n");
printf("The difference between the maximum and minimum values in the array %.2f.\n", def_arr(ar, 10));
return 0;
}
double def_arr(double* ar, int n)
{
double max = 0, min=*ar, defference; //最大值置为0,最小值默认为首元素
int index;
for (index = 0; index < n; index++)
{
if (max < *(ar + index))
max = *(ar + index);
if (min > *(ar + index))
min = *(ar + index);
}
defference = max - min;
return defference;
}
第6题
/*编程练习10.6 编写一个函数,把double类型数组中的数据倒序排列,并在一个简单的程序中测试该函数*/
#include<stdio.h>
#define SIZE 5
void reverse_order(double* target, double* source, int n);
int main(void)
{
double source[SIZE] = { 10.25,52.0,15.02,21.0,87.12 };
double target[SIZE];
int i;
//打印源数组
printf("source[%d]={", SIZE);
for (i = 0; i < SIZE-1; i++)
printf("%8.2f,", *(source + i));
printf("%8.2f}\n",*(source+SIZE-1));
//倒序排列
reverse_order(target, source, SIZE);
return 0;
}
void reverse_order(double* target, double* source, int n)
{
int i, j;
//执行倒序,引入两个变量,分别自增和自减
for (i = 0, j = n - 1; i < n&&j >= 0; i++, j--)
*(target + j) = *(source + i);
//打印目标数组
printf("target[%d]={", SIZE);
for (i = 0; i < SIZE - 1; i++)
printf("%8.2f,", *(target + i));
printf("%8.2f}\n", *(target + SIZE - 1));
}
第7题
/*编程练习10.7 编写一个程序,初始化一个double类型的二维数组,使用编程练习2中的一个拷贝函数把给数组中
的数据拷贝志另一个二维数组中。*/
#include<stdio.h>
#define SIZE 5
void copy_arr(double target[SIZE][5], double source[][5], int n); //复制二维数组
void printf_arr(double ar[SIZE][5], int n); //打印二维数组
int main(void)
{
double source[SIZE][5] = {
{20.12,52.1,36.5,142.01,521.6},
{12.21,87.12,542.12,15.0,154.1},
{10.0,25.12,125.10,12.2,5.68},
{12.25,53.02,86.6,14.4,254.1},
{8.15,7.52,65.4,11.15,0.52},
};
double target[SIZE][5];
//打印source数组
printf("source=");
printf_arr(source, SIZE);
//执行数组拷贝
copy_arr(target, source, SIZE);
//打印target数组
printf("target=");
printf_arr(target, SIZE);
return 0;
}
void printf_arr(double ar[SIZE][5], int n)
{
int i, j;
printf("{\n");
for (i = 0; i < n; i++) {
printf("{");
for (j = 0; j < 4; j++)
printf("%8.2f,", ar[i][j]);
printf("%8.2f},\n", ar[i][j]);
}
printf("};\n");
}
void copy_arr(double target[SIZE][5], double source[][5], int n)
{
int i, j;
for (i = 0; i < n; i++)
for (j = 0; j < 5; j++)
target[i][j] = source[i][j];
}
第8题
/*编程练习10.8 使用编程练习2中的拷贝函数,把一个内含7个元素的数组中的第3~第5个元素拷贝至
内含3个元素的数组钟。该函数本身不需要修改,只需要选择合适的实际参数*/
#include<stdio.h>
void copy_arr(double ar[], double sou[], int n, int start, int end);
int main(void)
{
double source[7] = { 1.1,2.2,3.3,4.4,5.5,6.6,7.7 };
double target[3];
printf("source[5]={%.1f,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f}\n",
source[0], source[1], source[2], source[3], source[4], source[5], source[6]);
copy_arr(target, source, 3, 3, 5);
return 0;
}
void copy_arr(double ar[], double sou[], int n, int start, int end)
{
int i,j;
for (i = start,j=0; i <= end&&j<n; i++,j++)
ar[j] = sou[i];
printf("target[3]={%.1f,%.1f,%.1f}\n",
ar[0], ar[1], ar[2]);
}
第9题
/*编程练习10.9 编写一个程序,初始化一个double类型的3*5二维数组,使用一个处理变长数组的函数将其拷贝
至另一个二维数组中。还要编写一个以变长数组为形参的函数以现实两个二维数组的内容。*/
//VS2019不支持变长数组
#include<stdio.h>
#define N 3
#define M 5
void copy_arr(double ar[][5], double source[][5], int n);
void prt_arr(double ar[][5], int n);
int main(void)
{
double source[N][M] = {
{1.1,2.2,3.3,4.4,5.5},
{2.2,3.3,4.4,5.5,6.6},
{3.3,4.4,5.5,6.6,7.7},
};
double target[N][M];
printf("source=");
prt_arr(source, 3);
copy_arr(target, source,3);
printf("target=");
prt_arr(target, 3);
return 0;
}
void copy_arr(double ar[][5], double source[][5], int n)
{
int i, j;
for (i = 0; i < n; i++)
for (j = 0; j < 5; j++)
ar[i][j] = source[i][j];
}
void prt_arr(double ar[][5], int n)
{
int i, j;
printf("{\n");
for (i = 0; i < n; i++) {
printf("{");
for (j = 0; j < 3; j++)
printf("%4.1f,", ar[i][j]);
printf("%4.1f},\n", ar[i][4]);
}
printf("}\n");
}
第10题
/*编程练习10.10 编写一个函数,把两个数组中相对应的元素相加,然后把结果存储道第3个数组中。*/
#include<stdio.h>
#define N 3
void sum_arr(double ar[][5], double source_1[][5], double source_2[][5], int n);
void prt_arr(double ar[][5], int n);
int main(void)
{
double source_1[N][5] = {
{1.1,2.2,3.3,4.4,5.5},
{2.2,3.3,4.4,5.5,6.6},
{3.3,4.4,5.5,6.6,7.7},
};
double source_2[N][5] = {
{4.4,5.5,6.6,7.7,8.8},
{5.5,6.6,7.7,8.8,9.9},
{6.6,7.7,8.8,9.9,10.0},
};
double target[N][5];
printf("source_1=");
prt_arr(source_1, N);
printf("source_2=");
prt_arr(source_2, N);
sum_arr(target, source_1, source_2, N);
printf("target=");
prt_arr(target, N);
return 0;
}
void sum_arr(double ar[][5], double source_1[][5], double source_2[][5], int n)
{
int i, j;
for (i = 0; i < N; i++)
for (j = 0; j < 5; j++)
ar[i][j] = source_1[i][j] + source_2[i][j];
}
void prt_arr(double ar[][5], int n)
{
int i, j;
printf("{\n");
for (i = 0; i < n-1; i++) {
printf("\t{");
for (j = 0; j < 4; j++)
printf("%6.1f,", ar[i][j]);
printf("%6.1f},\n", ar[i][4]);
}
printf("\t{");
for (j = 0; j < 4; j++)
printf("%6.1f,", ar[n-1][j]);
printf("%6.1f}\n", ar[n-1][4]);
printf("}\n");
}
第11题
/*编程练习10.11 编写一个程序,声明一个int类型的3*5二维数组,并用合适的值初始化它。该程序打印数组的值,
然后翻倍,并显示个元素的新值。编写一个函数显示数组的内容,再编写一个函数让各值翻倍。*/
#include<stdio.h>
#define MULTIPLIER 2
#define N 3
void prt_arr(int ar[][5], int n);
void mul_arr(int ar[][5], int source[][5], int n, int m);
int main(void)
{
int source[N][5] = {
{1,2,3,4,5},
{2,3,4,5,6},
{8,7,6,5,4}
};
int target[N][5];
printf("source=");
prt_arr(source, N);
mul_arr(target, source, N, MULTIPLIER);
printf("target=");
prt_arr(target, N);
return 0;
}
void prt_arr(int ar[][5], int n)
{
int i, j;
printf("{\n");
for (i = 0; i < n - 1; i++) {
printf("\t{");
for (j = 0; j < 4; j++)
printf("%4d,", ar[i][j]);
printf("%4d},\n", ar[i][4]);
}
printf("\t{");
for (j = 0; j < 4; j++)
printf("%4d,", ar[n - 1][j]);
printf("%4d}\n", ar[n - 1][4]);
printf("}\n");
}
void mul_arr(int ar[][5], int source[][5], int n, int m)
{
int i, j;
for (i = 0; i < n; i++)
for (j = 0; j < 5; j++)
ar[i][j] = m * source[i][j];
}
第12题
/*编程练习10.12 重写程序清单10.7的rain.c程序,把main()中的主要任务都改称函数来实现。*/
#include<stdio.h>
#include<stdio.h>
#define MONTHS 12
#define YEARS 5
void sum_rain(float rain[][MONTHS],int year);
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}
};
printf(" YEAR RAINFALL (inches)\n");
sum_rain(rain, YEARS);
return 0;
}
//数组计算
void sum_rain(float rain[][MONTHS], int year)
{
int y, m;
float subtot, total=0;
for (y = 0; y < YEARS; y++)
{
for (m = 0,subtot=0; m < MONTHS; m++)
subtot += rain[y][m];
printf("%5d %15.1f\n", 2010 + y, 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 (m = 0; m < MONTHS; m++)
{
for (y = 0, subtot = 0; y < YEARS; y++)
subtot += rain[y][m];
printf("%4.1f ", subtot / YEARS);
}
printf("\n");
}
第13题
/*编程练习10.13 编写一个程序,提示用户输入3组数,每组包括5个double类型的数。该程序应完成下列任务(略)*/
#include<stdio.h>
#define N 3
double average_arr(double ar[][5], int n);
double max_arr(double ar[][5], int n);
void prt_arr(double ar[][5], int n);
void assign(double ar[][5], double ar_1[1][5], double ar_2[1][5], double ar_3[1][5], int n);
void enter_arr(double ar[1][5]);
int main(void)
{
double source_1[1][5], source_2[1][5], source_3[1][5];
double source[N][5];
printf("Please enter the first 5-element array.\n");
enter_arr(source_1);
printf("Please enter the second 5-element array.\n");
enter_arr(source_2);
printf("Please enter the last 5-element array.\n");
enter_arr(source_3);
assign(source, source_1, source_2, source_3, N);
printf("source_1=");
prt_arr(source_1, 1);
printf("source_2=");
prt_arr(source_2, 1);
printf("source_3=");
prt_arr(source_3, 1);
printf("source=");
prt_arr(source, N);
printf("The average of source_1 is %8.2lf.\n", average_arr(source_1, 1));
printf("The average of source_2 is %8.2lf.\n", average_arr(source_2, 1));
printf("The average of source_3 is %8.2lf.\n", average_arr(source_3, 1));
printf("The average of source is %8.2lf.\n", average_arr(source, N));
printf("The max number of source is %8.2lf.\n", max_arr(source, N));
}
void assign(double ar[][5], double ar_1[1][5], double ar_2[1][5], double ar_3[1][5], int n)
{
int i, j;
for (i = 0; i < N; i++) {
if (i == 0)
for (j = 0; j < 5; j++)
ar[i][j] = ar_1[0][j];
if (i == 1)
for (j = 0; j < 5; j++)
ar[i][j] = ar_2[0][j];
if (i == 2)
for (j = 0; j < 5; j++)
ar[i][j] = ar_3[0][j];
}
}
void prt_arr(double ar[][5], int n)
{
int i, j;
if (n > 1) {
printf("{\n");
for (i = 0; i < n - 1; i++) {
printf("\t{");
for (j = 0; j < 4; j++)
printf("%8.2lf,", ar[i][j]);
printf("%8.2lf},\n", ar[i][4]);
}
printf("\t{");
for (j = 0; j < 4; j++)
printf("%8.2lf,", ar[n - 1][j]);
printf("%8.2lf}\n", ar[n - 1][4]);
printf("}\n");
}
else{
printf("{");
for (j = 0; j < 4; j++)
printf("%8.2lf,", ar[0][j]);
printf("%8.2lf}\n", ar[0][4]);
}
}
void enter_arr(double ar[1][5])
{
int i;
for (i = 0; i < 5; i++) {
if (scanf_s("%lf", &ar[0][i]) == 1)
continue;
else {
printf("Error!\n");
break;
}
}
}
double average_arr(double ar[][5], int n)
{
int i, j;
double sum=0, average;
for(i=0;i<n;i++)
for (j = 0; j < 5; j++)
sum += ar[i][j];
average = sum / (n * 5);
return average;
}
double max_arr(double ar[][5], int n)
{
int i, j;
double max = 0;
for(i=0;i<n;i++)
for (j = 0; j < 5; j++) {
if (max < ar[i][j])
max = ar[i][j];
continue;
}
return max;
}
第14题
/*编程练习10.14 以变长数组作为函数形参,完成变成练习13*/
/*编程练习10.13 编写一个程序,提示用户输入3组数,每组包括5个double类型的数。该程序应完成下列任务(略)*/
//由于VS2019不支持变长数组,这里简单修改变长练习13的代码,将N改称4,增加一个数组进行测试
#include<stdio.h>
#define N 4
double average_arr(double ar[][5], int n);
double max_arr(double ar[][5], int n);
void prt_arr(double ar[][5], int n);
void assign(double ar[][5], double ar_1[1][5], double ar_2[1][5], double ar_3[1][5], double ar_4[1][5], int n);
void enter_arr(double ar[1][5]);
int main(void)
{
double source_1[1][5], source_2[1][5], source_3[1][5],source_4[1][5];
double source[N][5];
printf("Please enter the first 5-element array.\n");
enter_arr(source_1);
printf("Please enter the second 5-element array.\n");
enter_arr(source_2);
printf("Please enter the third 5-element array.\n");
enter_arr(source_3);
printf("Please enter the last 5-element array.\n");
enter_arr(source_4);
assign(source, source_1, source_2, source_3, source_4, N);
printf("source_1=");
prt_arr(source_1, 1);
printf("source_2=");
prt_arr(source_2, 1);
printf("source_3=");
prt_arr(source_3, 1);
printf("source_4=");
prt_arr(source_4, 1);
printf("source=");
prt_arr(source, N);
printf("The average of source_1 is %8.2lf.\n", average_arr(source_1, 1));
printf("The average of source_2 is %8.2lf.\n", average_arr(source_2, 1));
printf("The average of source_3 is %8.2lf.\n", average_arr(source_3, 1));
printf("The average of source_4 is %8.2lf.\n", average_arr(source_4, 1));
printf("The average of source is %8.2lf.\n", average_arr(source, N));
printf("The max number of source is %8.2lf.\n", max_arr(source, N));
}
void assign(double ar[][5], double ar_1[1][5], double ar_2[1][5], double ar_3[1][5], double ar_4[1][5], int n)
{
int i, j;
for (i = 0; i < N; i++) {
if (i == 0)
for (j = 0; j < 5; j++)
ar[i][j] = ar_1[0][j];
if (i == 1)
for (j = 0; j < 5; j++)
ar[i][j] = ar_2[0][j];
if (i == 2)
for (j = 0; j < 5; j++)
ar[i][j] = ar_3[0][j];
if (i == 3)
for (j = 0; j < 5; j++)
ar[i][j] = ar_4[0][j];
}
}
void prt_arr(double ar[][5], int n)
{
int i, j;
if (n > 1) {
printf("{\n");
for (i = 0; i < n - 1; i++) {
printf("\t{");
for (j = 0; j < 4; j++)
printf("%8.2lf,", ar[i][j]);
printf("%8.2lf},\n", ar[i][4]);
}
printf("\t{");
for (j = 0; j < 4; j++)
printf("%8.2lf,", ar[n - 1][j]);
printf("%8.2lf}\n", ar[n - 1][4]);
printf("}\n");
}
else {
printf("{");
for (j = 0; j < 4; j++)
printf("%8.2lf,", ar[0][j]);
printf("%8.2lf}\n", ar[0][4]);
}
}
void enter_arr(double ar[1][5])
{
int i;
for (i = 0; i < 5; i++) {
if (scanf_s("%lf", &ar[0][i]) == 1)
continue;
else {
printf("Error!\n");
break;
}
}
}
double average_arr(double ar[][5], int n)
{
int i, j;
double sum = 0, average;
for (i = 0; i < n; i++)
for (j = 0; j < 5; j++)
sum += ar[i][j];
average = sum / (n * 5);
return average;
}
double max_arr(double ar[][5], int n)
{
int i, j;
double max = 0;
for (i = 0; i < n; i++)
for (j = 0; j < 5; j++) {
if (max < ar[i][j])
max = ar[i][j];
continue;
}
return max;
}