C语言数组操作实验
任务一:数组内存分析
#include <stdio.h>
#define ROWS 4
#define COLS 2
void demonstrate_one_dim()
{
int data[ROWS] = {1, 9, 8, 4};
int index;
printf("数组总大小: %ld 字节\n", sizeof(data));
for (index = 0; index < ROWS; index++)
printf("地址 %p: 值 %d\n", &data[index], data[index]);
printf("数组首地址: %p\n", data);
}
void demonstrate_two_dim()
{
int matrix[COLS][ROWS] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
int row, col;
printf("数组总大小: %ld 字节\n", sizeof(matrix));
for (row = 0; row < COLS; row++)
{
for (col = 0; col < ROWS; col++)
printf("地址 %p: 值 %d\n", &matrix[row][col], matrix[row][col]);
printf("\n");
}
printf("数组首地址: %p\n", matrix);
printf("第一行地址: %p\n", matrix[0]);
printf("第二行地址: %p\n", matrix[1]);
printf("\n");
}
int main()
{
printf("演示一: 整型一维数组\n");
demonstrate_one_dim();
printf("演示二: 整型二维数组\n");
demonstrate_two_dim();
return 0;
}
问题分析:
- 一维数组中,相邻元素地址差为sizeof(int)字节
- 二维数组中,同行相邻元素地址差为sizeof(int)字节,相邻行首地址差为ROWS*sizeof(int)字节
- matrix[0]和matrix[1]分别指向二维数组的第一行和第二行的起始地址
任务二:数组平均值计算
#include <stdio.h>
#define MAX_SIZE 100
void populate_array(int values[], int size);
double calculate_adjusted_average(int values[], int size);
int main() {
int numbers[MAX_SIZE];
int count, i;
double result;
while(printf("请输入元素个数: "), scanf("%d", &count) != EOF) {
populate_array(numbers, count);
result = calculate_adjusted_average(numbers, count);
printf("调整后的平均值 = %.2f\n\n", result);
}
return 0;
}
void populate_array(int values[], int size) {
int i;
for(i = 0; i < size; ++i)
scanf("%d", &values[i]);
}
double calculate_adjusted_average(int values[], int size) {
int i, max, min;
double sum;
max = min = values[0];
sum = 0;
for(i = 0; i < size; ++i) {
sum += values[i];
if(values[i] > max)
max = values[i];
else if(values[i] < min)
min = values[i];
}
sum = (sum - max - min)/(size-2);
return sum;
}
功能说明:
populate_array函数用于从用户输入获取数组元素calculate_adjusted_average函数用于去除数组中的最大值和最小值后计算剩余元素的平均值
任务三:二维数组初始化与输出
#include <stdio.h>
#define DIMENSION 100
void display_matrix(int matrix[][DIMENSION], int size);
void initialize_matrix(int matrix[][DIMENSION], int size, int fill_value);
int main()
{
int grid[DIMENSION][DIMENSION];
int size, fill_value;
while (printf("请输入矩阵大小和填充值: "), scanf("%d%d", &size, &fill_value) != EOF)
{
initialize_matrix(grid, size, fill_value);
display_matrix(grid, size);
printf("\n");
}
return 0;
}
void initialize_matrix(int matrix[][DIMENSION], int size, int fill_value)
{
int i, j;
for (i = 0; i < size; i++)
{
for (j = 0; j < size; j++)
{
matrix[i][j] = fill_value;
}
}
}
void display_matrix(int matrix[][DIMENSION], int size)
{
int i, j;
for (i = 0; i < size; i++)
{
for (j = 0; j < size; j++)
printf("%d", matrix[i][j]);
printf("\n");
}
}
问题解答:
- 在定义二维数组参数时,列维度不能省略,编译器需要知道每行的元素数量
initialize_matrix函数将数组所有元素赋值为指定值display_matrix函数以矩阵形式输出二维数组
任务四:数组排序与中位数计算
#include <stdio.h>
#define CAPACITY 100
void sort_elements(int data[], int length)
{
for (int i = 0; i < length; i++)
{
for (int j = 0; j < length - i - 1; j++)
{
int temporary;
if (data[j] > data[j + 1])
{
temporary = data[j];
data[j] = data[j + 1];
data[j + 1] = temporary;
}
}
}
}
void read_values(int data[], int length)
{
for (int i = 0; i < length; i++)
{
scanf("%d", &data[i]);
}
}
int find_median(int data[], int length)
{
int middle;
if (length % 2 == 0)
{
middle = (data[length / 2] + data[length / 2 - 1]) / 2;
}
else
{
middle = data[length / 2];
}
return middle;
}
int main()
{
int values[CAPACITY];
int length;
double median;
while (printf("请输入元素个数: "), scanf("%d", &length) != EOF)
{
read_values(values, length);
sort_elements(values, length);
median = find_median(values, length);
printf("中位数 = %g\n\n", median);
}
return 0;
}
任务五:矩阵右旋操作
#include <stdio.h>
#define SIZE 100
void read_matrix(int matrix[][SIZE], int dimension);
void print_matrix(int matrix[][SIZE], int dimension);
void rotate_right(int matrix[][SIZE], int dimension);
int main()
{
int grid[SIZE][SIZE];
int dimension;
printf("请输入矩阵维度: ");
scanf("%d", &dimension);
read_matrix(grid, dimension);
printf("原始矩阵:\n");
print_matrix(grid, dimension);
printf("旋转后矩阵:\n");
rotate_right(grid, dimension);
print_matrix(grid, dimension);
return 0;
}
void read_matrix(int matrix[][SIZE], int dimension)
{
int i, j;
for (i = 0; i < dimension; i++)
for (j = 0; j < dimension; j++)
scanf("%d", &matrix[i][j]);
}
void print_matrix(int matrix[][SIZE], int dimension)
{
int i, j;
for (i = 0; i < dimension; i++)
{
for (j = 0; j < dimension; j++)
printf("%3d", matrix[i][j]);
printf("\n");
}
}
void rotate_right(int matrix[][SIZE], int dimension)
{
int temp[SIZE];
// 保存最后一列
for (int i = 0; i < dimension; i++)
{
temp[i] = matrix[i][dimension - 1];
}
// 将每列向右移动一位
for (int i = dimension - 1; i > 0; i--)
{
for (int j = 0; j < dimension; j++)
{
matrix[j][i] = matrix[j][i - 1];
}
}
// 将保存的最后一列放到第一列
for (int i = 0; i < dimension; i++)
{
matrix[i][0] = temp[i];
}
}
任务六:进制转换
#include <stdio.h>
#define MAX_DIGITS 100
void convert_base(int number, int base);
int main()
{
int decimal_number;
while (printf("请输入十进制整数: "), scanf("%d", &decimal_number) != EOF)
{
printf("二进制: ");
convert_base(decimal_number, 2);
printf("八进制: ");
convert_base(decimal_number, 8);
printf("十六进制: ");
convert_base(decimal_number, 16);
printf("\n");
}
return 0;
}
void convert_base(int number, int base)
{
int i, j;
char digits[MAX_DIGITS];
char symbols[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
for (i = 0; number > 0; i++)
{
digits[i] = symbols[number % base];
number /= base;
}
for (j = i - 1; j >= 0; j--)
{
printf("%c", digits[j]);
}
printf("\n");
}
任务七:魔方矩阵判断
#include <stdio.h>
#define DIM 100
void fill_matrix(int matrix[][DIM], int size);
void print_matrix(int matrix[][DIM], int size);
int is_magic_square(int matrix[][DIM], int size);
int main()
{
int square[DIM][DIM];
int size;
while (printf("请输入矩阵维度: "), scanf("%d", &size) != EOF)
{
printf("请输入方阵元素:\n");
fill_matrix(square, size);
printf("方阵内容:\n");
print_matrix(square, size);
if (is_magic_square(square, size))
printf("这是一个魔方矩阵\n\n");
else
printf("这不是魔方矩阵\n\n");
}
return 0;
}
void fill_matrix(int matrix[][DIM], int size)
{
int i, j;
for (i = 0; i < size; i++)
{
for (j = 0; j < size; j++)
{
scanf("%d", &matrix[i][j]);
}
}
}
void print_matrix(int matrix[][DIM], int size)
{
int i, j;
for (i = 0; i < size; i++)
{
for (j = 0; j < size; j++)
{
printf("%4d", matrix[i][j]);
}
printf("\n");
}
}
int is_magic_square(int matrix[][DIM], int size)
{
int i, j;
int total_sums[2 * size + 2] = {0};
int sum_index = 0;
// 计算每行和
for (i = 0; i < size; i++)
{
for (j = 0; j < size; j++)
{
total_sums[sum_index] += matrix[i][j];
}
sum_index++;
}
// 计算每列和
for (i = 0; i < size; i++)
{
for (j = 0; j < size; j++)
{
total_sums[sum_index] += matrix[j][i];
}
sum_index++;
}
// 计算主对角线
for (i = 0; i < size; i++)
{
total_sums[sum_index] += matrix[i][i];
}
sum_index++;
// 计算副对角线
for (i = 0; i < size; i++)
{
total_sums[sum_index] += matrix[i][size - i - 1];
}
// 检查所有和是否相等
for (i = 0; i < sum_index; i++)
{
if (total_sums[i] != total_sums[0])
return 0;
}
return 1;
}
任务八:数字特性检查
#include <stdio.h>
int has_unique_digits(int number);
int main()
{
int number;
for (number = 1; number <= 100; number++)
{
if (has_unique_digits(number))
printf("%d\n", number);
}
return 0;
}
int has_unique_digits(int number)
{
int square, cube;
int digit_count[10] = {0};
square = number * number;
cube = number * number * number;
// 检查平方数的各位数字
while (square > 0)
{
if (digit_count[square % 10])
return 0;
digit_count[square % 10] = 1;
square /= 10;
}
// 检查立方数的各位数字
while (cube > 0)
{
if (digit_count[cube % 10])
return 0;
digit_count[cube % 10] = 1;
cube /= 10;
}
// 检查是否包含所有0-9的数字
for (int i = 0; i < 10; i++)
{
if (digit_count[i] == 0)
return 0;
}
return 1;
}
功能说明: 该程序找出1-100中满足以下条件的数字:其平方数和立方数的各位数字组合起来包含0-9所有数字且不重复。
