拖更严重,但还是祝大家新春快乐~情人节快乐!
/* 10-1.c -- 修改程序清单10.7的rain.c程序,用指针进行计算(仍然要声明并初始化数组)*/
#include<stdio.h>
#define MONTHS 12
#define YEARS 5
int main(void)
{
// 用2010~2014年的降水量数据初始化数组
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 %.lf inches.\n\n",total / YEARS);
printf("MONTHLY AVERAGES:\n\n");
printf(" Jab Feb Mar Apr May Jun Jul Aug Sep Oct ");
printf(" 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;
}
/* 10-2.c -- 练习数组表示法、指针表示法等 */
#include<stdio.h>
#define SIZE 5
void copy_arr(double ard[], double sod[], int n);
void copy_ptr(double *ard, double *sod, int n);
void copy_ptrs(double *ard, double *sod, double *new_sod);
int main(void)
{
double source[SIZE] = { 1.1,2.2,3.3,4.4,5.5 };
double target1[SIZE];
double target2[SIZE];
double target3[SIZE];
copy_arr(target1, source, SIZE);
copy_ptr(target2, source, SIZE);
copy_ptrs(target3, source, source + SIZE);
printf("%5s %8s %8s %8s\n","index","target1","target2","target3");
for (int i = 0; i < SIZE; i++)
printf(" %d %.2lf %.2lf %.2lf\n",i,target1[i],target2[i],target3[i]);
return 0;
}
void copy_arr(double ard[], double sod[], int n)
{
for (int i = 0; i < n; i++)
ard[i] = sod[i];
}
void copy_ptr(double *ard, double *sod, int n)
{
for (int i = 0; i < n; i++)
ard[i] = *sod++;
}
void copy_ptrs(double *ard, double *sod, double *new_sod)
{
while (sod < new_sod)
*ard++ = *sod++;
}
/* 10-3.c -- 返回存储在int类型数组中的最大值 */
#include<stdio.h>
#define SIZE 5
int Max_value(int arr[],int n); // 数组表示法
// int Max_value(int *arr,int n); 指针表示法
int main(void)
{
int arr[SIZE];
printf("请输入五个整数值:");
for (int i = 0; i < SIZE; i++)
scanf("%d",&arr[i]);
printf("该五个整数中,最大的整数是%d\n",Max_value(arr,SIZE));
return 0;
}
int Max_value(int arr[], int n)
{
int max = 0;
for (int i = 0; i < n; i++)
{
if (arr[i] > max)
max = arr[i];
}
return max;
}
/* 10-4.c -- 返回储存在double类型数组中最大值的下标 */
#include<stdio.h>
#define SIZE 5
int Return_index(double arr[], int n);
int main(void)
{
double arr[SIZE];
double *max;
int index;
printf("请输入五个双精度浮点类型的数值:");
for (int i = 0; i < SIZE; i++)
scanf("%lf",&arr[i]);
index = Return_index(arr, SIZE);
printf("最大值的下标为:%d\n",index);
return 0;
}
// 如果该数组中有两个相等的最大值,那么可以附加一下条件,这里只演示一般情况
int Return_index(double arr[], int n)
{
int index;
double max1 = 0.0;
for (int i = 0; i < n; i++)
{
if (arr[i] > max1)
{
max1 = arr[i];
index = i;
}
}
return index;
}
/* 10-5.c -- 返回存储在double类型数组中最大值和最小值的差值 */
#include<stdio.h>
#define SIZE 5
double Max_sub_Min(double *arr, int n);
int main(void)
{
double arr[SIZE] = { 10.5 ,2.5,6.8,9.7,1.2 };
printf("该数组中最大值和最小值的差为:%.2lf\n",Max_sub_Min(arr,SIZE));
return 0;
}
double Max_sub_Min(double *arr, int n)
{
double max = 0.0;
double min = 100.0;
for (int i = 0; i < n; i++)
{
if (max < arr[i])
max = arr[i];
if (min > arr[i])
min = arr[i];
}
return max - min;
}
/* 10-6.c -- 将double数组的数倒序排列 */
#include<stdio.h>
#define SIZE 5
void Invertod_arr(double *arr, int n);
int main(void)
{
double arr[SIZE] = {1.2,5.6,9.8,4.2,3.2};
Invertod_arr(arr, SIZE);
for (int i = 0; i < SIZE; i++)
printf("%.2lf ",arr[i]);
printf("\n");
return 0;
}
void Invertod_arr(double *arr, int n)
{
double temp;
for (int i = 0; i < n / 2; i++)
{
temp = arr[i];
arr[i] = arr[n - i - 1];
arr[n - i - 1] = temp;
}
}
/* 10-7.c -- 拷贝一个二维数组 */
#include<stdio.h>
#define ROW 3
#define COL 3
void copy_arr(double arr[][COL],double new_arr[][COL]);
/* *arr指代的是arr[ROW] */
int main(void)
{
double new_arr[ROW][COL];
double arr[ROW][COL] = {
{1.0,2.0,3.0},
{4.0,5.0,6.0},
{6.0,7.0,8.0},
};
copy_arr(arr,new_arr);
return 0;
}
void copy_arr(double arr[][COL], double new_arr[][COL])
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
new_arr[i][j] = arr[i][j];
}
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
printf("%.2lf ", new_arr[i][j]);
printf("\n");
}
}
/* 10-8.c -- 把一个内含7个元素的数组中第3~第5个数组元素拷贝到内含3个元素的数组中 */
#include<stdio.h>
#define SIZE 7
void copy_arr(double *ptr, int n);
int main(void)
{
double arr[SIZE] = {5.5,7.7,8.1,9.6,3.1,2.0,4.8};
copy_arr(arr + 2, 3);
printf("\n");
return 0;
}
void copy_arr(double * ptr, int n)
{
double temp[3];
for (int i = 0; i < n; i++)
{
temp[i] = *ptr++;
}
for (int i = 0; i < n; i++)
{
printf("%.2lf ",temp[i]);
}
}
/* 10-9.c -- 编译器不支持变长数组 */
#include<stdio.h>
#define ROW 3
#define COL 5
void copy_arr(double arr[][COL]);
void show_arr(double arr[][COL], double temp[][COL]);
int main(void)
{
double arr[ROW][COL] = {
{1.0,2.0,3.0,4.0,5.0},
{2.0,3.0,4.0,5.0,6.0},
{3.0,4.0,5.0,6.0,7.0},
};
copy_arr(arr);
return 0;
}
void copy_arr(double arr[][COL])
{
// 这里不允许temp[][COL]
double temp[ROW][COL];
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
temp[i][j] = arr[i][j];
}
show_arr(arr,temp);
}
void show_arr(double arr[][COL], double temp[][COL])
{
printf("原数组的值为:\n");
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
printf("%.2lf ",arr[i][j]);
}
printf("\n");
}
printf("复制后数组的值为:\n");
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
printf("%.2lf ", temp[i][j]);
}
printf("\n");
}
}
/* 10-10.c -- 将两个数组的元素相加到第三个数组 */
#include<stdio.h>
#define SIZE 5
void Add_array(int arr1[], int arr2[], int arr3[], int n);
int main(void)
{
int arr1[SIZE] = {2, 3, 4, 5, 6};
int arr2[SIZE] = {11, 10, 9, 8, 7};
int arr3[SIZE];
Add_array(arr1, arr2, arr3, SIZE);
printf("\n");
return 0;
}
void Add_array(int arr1[], int arr2[], int arr3[], int n)
{
for (int i = 0; i < n; i++)
{
arr3[i] = arr1[i] + arr2[i];
printf("%d ",arr3[i]);
}
}
/* 10-11.c -- 超级加倍 */
#include<stdio.h>
#define ROW 3
#define COL 5
void show_arr(int arr[][COL], int row);
void Double_arr(int arr[][COL], int row);
int main(void)
{
int arr[ROW][COL];
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
scanf("%d",&arr[i][j]);
}
printf("\n该数组为:\n");
show_arr(arr, ROW);
printf("翻倍后的数组为:\n");
Double_arr(arr, ROW);
return 0;
}
void show_arr(int arr[][COL], int row)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < COL; j++)
printf("%d ",arr[i][j]);
printf("\n");
}
printf("\n");
}
void Double_arr(int arr[][COL], int row)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < COL; j++)
printf("%d ", 2 * arr[i][j]);
printf("\n");
}
printf("\n");
}
/* 10-12.c -- 重新编写rain.c */
#include<stdio.h>
#define MONTHS 12 // 一年的月份数
#define YEARS 5 // 年数
void Year_rain(const float arr[][MONTHS]);
void Month_rain(const float arr[][MONTHS]);
int main(void)
{
// 用2010~2014年的降水量数据初始化数组
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");
Year_rain(rain);
printf("MONTHLY AVERAGES:\n\n");
printf(" Jan Feb Mar Apr May Jun Jul Aug Sep Oct ");
printf("Nov Dec\n");
Month_rain(rain);
printf("\n");
return 0;
}
void Year_rain(const float arr[][MONTHS])
{
float subtot = 0.0;
float total = 0.0;
for (int year = 0; year < YEARS; year++)
{
for (int month = 0; month < MONTHS; month++)
subtot += arr[year][month];
printf("%5d %15.1f\n", 2010 + year, subtot);
total += subtot;
}
printf("\nThe yearly average is %.1f inches.\n\n", total / YEARS);
}
void Month_rain(const float arr[][MONTHS])
{
float subtot = 0.0;
for (int month = 0; month < MONTHS; month++)
{
for (int year = 0; year < YEARS; year++)
subtot += arr[year][month];
printf("%4.1f ", subtot / YEARS);
}
}
/* 10-13.c */
#include<stdio.h>
#define ROW 3
#define COL 5
// 将输入的数据存储在3x5的数组中
void Storage_arr(double temp[][COL],double arr1[],double arr2[],double arr3[]);
// 计算每组数据的平均值
double Average_value(double arr[]);
// 计算所有数据的平均值
double All_average(double temp[][COL]);
// 找出这15个数的最大值
double Max_value(double temp[][COL]);
// 打印结果
void show_arr(double temp[][COL]);
int main(void)
{
double temp[ROW][COL];
double arr1[COL];
double arr2[COL];
double arr3[COL];
printf("请输入三组包含五个double类型的数值:");
for (int i = 0; i < ROW; i++)
{
if (i == 0)
{
for (int j = 0; j < COL; j++)
scanf("%lf",&arr1[j]);
}
if (i == 1)
{
for (int j = 0; j < COL; j++)
scanf("%lf", &arr2[j]);
}
if (i == 2)
{
for (int j = 0; j < COL; j++)
scanf("%lf", &arr3[j]);
}
}
// task a
Storage_arr(temp, arr1, arr2, arr3);
// task b
for (int i = 0; i < ROW; i++)
{
if (i == 0)
printf("第一组的平均值为:%.2lf",Average_value(arr1));
if (i == 1)
printf("第二组的平均值为:%.2lf", Average_value(arr2));
if (i == 2)
printf("第三组的平均值为:%.2lf", Average_value(arr3));
printf("\n");
}
// task c
printf("所有数据的平均值为:%.2lf\n",All_average(temp));
// task d
printf("所有数据中的最大值为:%.1lf\n",Max_value(temp));
// task e
show_arr(temp);
return 0;
}
void Storage_arr(double temp[][COL],double arr1[], double arr2[], double arr3[])
{
for (int i = 0; i < ROW; i++)
{
if (i == 0)
for (int j = 0; j < COL; j++)
temp[i][j] = arr1[j];
if (i == 1)
for (int j = 0; j < COL; j++)
temp[i][j] = arr2[j];
if (i == 2)
for (int j = 0; j < COL; j++)
temp[i][j] = arr3[j];
}
}
double Average_value(double arr[])
{
double sum = 0.0;
for (int i = 0; i < COL; i++)
sum += arr[i];
return (sum / COL);
printf("\n");
}
double All_average(double temp[][COL])
{
double sum = 0.0;
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
sum += temp[i][j];
}
return sum / (ROW * COL);
}
double Max_value(double temp[][COL])
{
double max = 0.0;
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
if (max <= temp[i][j])
max = temp[i][j];
}
}
return max;
}
void show_arr(double temp[][COL])
{
for (int i = 0; i < ROW; i++)
{
for (int j = 0; j < COL; j++)
{
printf("%.1lf ", temp[i][j]);
}
printf("\n");
}
}
笔者编译器不支持边长数组VLA,所以在这里不再赘述第十四题。