纯手打的答案,如有错误欢迎交流
目录
第一题
#include<stdio.h>
#define MONTHS 12
#define YEARS 5
int main()
{
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;
int year, month;
float total, subtot;
printf(" YEAR RAINFALL (inches)\n");
for (year = 0, subtot = 0; year < YEARS; year++, p++) // p控制年份
{
for (month = 0, subtot = 0; month < MONTHS; month++)
subtot += *(*p + month); // 每一个年,每个月的降雨量
printf("%5d %15.1f\n", 2010 + year, subtot);
total += subtot; // 5年的总降水量
}
printf("\nThe yearly average is %.1f inches. \n\n", total / YEARS);
printf("MONTHS AVERAGES: \n\n");
printf(" Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\n");
p -= 5; // 恢复p
for (month = 0; month < MONTHS; month++)
{
for (year = 0, subtot = 0; year < YEARS; year++)
subtot += *(*(p + year) + month); // p + year(定位行),*(p + yeay) + month(定位列),最后取值
printf("%4.1f ", subtot / YEARS);
}
printf("\n");
return 0;
}
第二题
#include<stdio.h>
void copy_arr(double target1[], double source[], int n)
{
int i;
for (i = 0; i < n; i++)
target1[i] = source[i];
}
void copy_ptr(double target2[], double source[], int n)
{
double *p = target2;
int i;
for (i = 0; i < n; i++, p++)
*p = source[i];
}
void copy_ptrs(double *target3, double *source, double *end)
{
while (source < end)
{
*target3 = *source;
target3++;
source++;
}
}
int main()
{
double source[5] = {1.1, 2.2, 3.3, 4.4, 5.5};
double target1[5], target2[5], target3[5];
int i;
// 方法一:
copy_arr(target1, source, 5); // 带数组表示法的拷贝
printf("target1: \n");
for (i = 0; i < 5; i++)
printf("target1[%d] = %.1lf\n", i, target1[i]);
printf("\n");
// 方法二:
copy_ptr(target2, source, 5); // 带指针表示法和指针递增的拷贝
printf("target2: \n");
for (i = 0; i < 5; i++)
printf("target2[%d] = %.1lf\n", i, target2[i]);
printf("\n");
// 方法三:
copy_ptrs(target3, source, source + 5); // 带最后一个元素后面的指针的拷贝
printf("target3: \n");
for (i = 0; i < 5; i++)
printf("target3[%d] = %.1lf\n", i, target3[i]);
printf("\n");
return 0;
}
第三题
#include<stdio.h>
#define SIZE 10
int Max_array(const int b[])
{
// int temp = 0; 无法处理负数
int temp = b[0];
int i;
for (i = 1; i < SIZE; i ++)
if (b[i] > temp)
temp = b[i];
return temp;
}
int main()
{
int array[SIZE];
printf("请输入元素:\n");
int i;
for (i = 0; i < SIZE; i ++)
scanf("%d", &array[i]);
printf("最大值为:%d\n", Max_array(array));
return 0;
}
第四题
#include<stdio.h>
#define SIZE 10
int Max_index(const double b[])
{
int temp = b[0];
int index = 0;
int i;
for (i = 1; i < SIZE; i ++)
if (b[i] > temp)
{
temp = b[i];
index = i;
}
return index;
}
int main()
{
double array[SIZE];
printf("请输入元素:\n");
int i;
for (i = 0; i < SIZE; i ++)
scanf("%lf", &array[i]);
printf("最大值的下标为:%d\n", Max_index(array));
return 0;
}
第五题
#include<stdio.h>
#define SIZE 10
void quick_sort(double array[], int l, int r) // 快排
{
if (l == r)
return;
int i = l - 1, j = r + 1;
double x = array[(l + r) >> 1];
while (i < j)
{
do
i++;
while (array[i] < x);
do
j--;
while (array[j] > x);
if (i < j)
{
double temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
quick_sort(array, l, j);
quick_sort(array, j + 1, r);
}
double Gap(double b[])
{
quick_sort(b, 0, SIZE - 1);
return b[SIZE - 1] - b[0];
}
int main()
{
double array[SIZE];
printf("请输入元素:\n");
int i;
for (i = 0; i < SIZE; i++)
scanf("%lf", &array[i]);
printf("最大值和最小值的差值为:%lf\n", Gap(array));
return 0;
}
第六题
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define SIZE 10
void quick_sort(double array[], int l, int r) // 快排
{
if (l == r)
return;
int i = l - 1, j = r + 1;
double x = array[(l + r) >> 1];
while (i < j)
{
do
i++;
while (array[i] > x);
do
j--;
while (array[j] < x);
if (i < j)
{
double temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
quick_sort(array, l, j);
quick_sort(array, j + 1, r);
}
int main()
{
double array[SIZE];
int i;
srand((double)time(NULL)); // 种子
for (i = 0; i < SIZE; i++)
array[i] = rand() % 1000 + 1; // 生成随机数
for (i = 0; i < SIZE; i++)
printf("%.1lf ", array[i]); // 排序前
printf("\n");
quick_sort(array, 0, SIZE - 1); // 从小到大排序
for (i = 0; i < SIZE; i++)
printf("%.1lf ", array[i]); // 排序后
return 0;
}
第七题
#include<stdio.h>
void copy_arr(double (*p)[5], double (*q)[5], int row, int col) // 需要指明维度(只有第一维可以省略)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
*(*(p + i) + j) = *(*(q + i) + j);
}
}
}
int main()
{
double source[5][5];
double target[5][5];
int i, j;
for (i = 0; i < 5; i++)
for (j = 0; j < 5; j++)
source[i][j] = i + j;
printf("source: \n");
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
printf("source[%d][%d] = %.1lf ", i, j, source[i][j]);
printf("\n");
}
copy_arr(target, source, 5, 5);
printf("target: \n");
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
printf("target[%d][%d] = %.1lf ", i, j, target[i][j]);
printf("\n");
}
printf("\n");
return 0;
}
第八题
#include<stdio.h>
void copy_ptr(double *p, double *q, int n)
{
int i;
for (i = 0; i < n; i++)
*(p + i) = *(q + i);
}
int main()
{
double source[7] = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7};
double target[3];
int i;
copy_ptr(target, source + 2, 3); // 带指针表示法和指针递增的拷贝
printf("target: \n");
for (i = 0; i < 3; i++)
printf("target[%d] = %.1lf\n", i, target[i]);
printf("\n");
return 0;
}
第九题
#include<stdio.h>
// 编译器不支持C99,无法使用变长数组
void copy(int row, int col, int target[row][col], const int source[row][col]) // 防止源数组被修改
{
int i, j;
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
target[i][j] = source[i][j];
}
void show (int row, int col, const int array[row][col])
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf("%d ", array[i][j]);
}
printf("\n");
}
}
int main()
{
int n = 3, m = 5;
int target[n][m];
int array[][5] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
copy(n, m, target, array);
show(n, m, target);
return 0;
}
第十题
#include<stdio.h>
#define SIZE 5
void Add_array(int *a, int *b, int *c, int n)
{
int i;
for (i = 0; i < n; i ++)
*(c + i) = *(a + i) + *(b + i);
}
int main()
{
int array1[SIZE] = {1, 2, 3, 4, 5};
int array2[SIZE] = {1, 2, 3, 4, 5};
int target[SIZE];
int i;
Add_array(array1, array2, target, 5);
for (i = 0; i < SIZE; i++)
printf("%d ", target[i]);
return 0;
}
第十一题
#include<stdio.h>
#define ROW 3
#define COL 5
void Double_element(int row, int array[][5])
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < 5; j++)
array[i][j] *= 2;
}
}
void Show_element(int row, int array[][5])
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < 5; j++)
printf("array[%d][%d] = %d ", i, j, array[i][j]);
printf("\n");
}
}
int main()
{
int array[ROW][COL];
int i, j;
for (i = 0; i < ROW; i++)
for (j = 0; j < COL; j++)
array[i][j] = i + j;
Double_element(ROW, array);
Show_element(ROW, array);
return 0;
}
第十二题
#include<stdio.h>
#define MONTHS 12
#define YEARS 5
void Avg_year(const float (*p)[MONTHS])
{
int year, month;
float total, subtot;
printf(" YEAR RAINFALL (inches)\n");
for (year = 0, subtot = 0; year < YEARS; year++, p++) // p控制年份
{
for (month = 0, subtot = 0; month < MONTHS; month++)
subtot += *(*p + month); // 每一个年,每个月的降雨量
printf("%5d %15.1f\n", 2010 + year, subtot);
total += subtot; // 5年的总降水量
}
printf("\nThe yearly average is %.1f inches. \n\n", total / YEARS);
}
void Avg_moth(const float (*p)[MONTHS])
{
int year, month;
float total, subtot;
printf("MONTHS 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 += *(*(p + year) + month); // p + year(定位行),*(p + yeay) + month(定位列),最后取值
printf("%4.1f ", subtot / YEARS);
}
printf("\n");
}
int main()
{
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;
Avg_year(rain);
Avg_moth(rain);
return 0;
}
第十三题
#include<stdio.h>
// 使用const防止数据被意外修改
void Input(const double (*p)[5], int row); // 初始化数组
void Avg_col(const double (*p)[5], int row); // 每行的平均值
void Avg_tol(const double (*p)[5], int row); // 所有数据的平均值
void Max_element(const double (*p)[5], int row); // 所有数据的最大值
int main()
{
double array[3][5];
Input(array, 3);
Avg_col(array, 3);
Avg_tol(array, 3);
Max_element(array, 3);
return 0;
}
void Input(const double (*p)[5], int row)
{
int i, j;
for (i = 0; i < row; i++)
{
printf("请输入第%d组数据: ", i + 1);
for (j = 0; j < 5; j++)
scanf("%lf", *(p + i) + j);
}
printf("\n");
}
void Avg_col(const double (*p)[5], int row)
{
int i, j;
double sum;
for (i = 0, sum = 0; i < row; i++)
{
for (j = 0, sum = 0; j < 5; j++)
{
sum += *(*(p + i) + j);
}
printf("第%d组数据的平均值为: %lf\n", i + 1, sum / 5);
}
printf("\n");
}
void Avg_tol(const double (*p)[5], int row)
{
int i, j;
double sum;
for (i = 0, sum = 0; i < row; i++)
for (j = 0; j < 5; j++)
sum += *(*(p + i) + j);
printf("所有数据的平均值为: %lf\n", sum / (5 * row));
printf("\n");
}
void Max_element(const double (*p)[5], int row)
{
double temp = **p;
int i, j;
for (i = 0; i < row; i++)
for (j = 0; j < 5; j++)
if (*(*(p + i) + j) > temp)
temp = *(*(p + i) + j);
printf("所有数据的最大值为:%lf\n", temp);
printf("\n");
}