一维和二维数组操作实验
任务1
源代码
#include <stdio.h>
#define SIZE 4
#define ROWS 2
void array_info() {
int data[SIZE] = {1, 9, 8, 4};
int i;
printf("数组data的大小: %d 字节\n", sizeof(data));
for (i = 0; i < SIZE; ++i)
printf("地址: %p 值: %d\n", &data[i], data[i]);
printf("数组名data的值: %p\n", data);
}
void matrix_info() {
int matrix[ROWS][SIZE] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
int i, j;
printf("矩阵matrix的大小: %d 字节\n", sizeof(matrix));
for (i = 0; i < ROWS; ++i)
for (j = 0; j < SIZE; ++j)
printf("地址: %p 值: %d\n", &matrix[i][j], matrix[i][j]);
printf("\n");
printf("矩阵名matrix的值: %p\n", matrix);
printf("matrix[0]的值: %p\n", matrix[0]);
printf("matrix[1]的值: %p\n", matrix[1]);
}
问题1:一维数组data在内存中是连续存放的,其名称与第一个元素的地址相同。
问题2:二维数组matrix在内存中按行连续存放,其名称与首元素地址相同。matrix[0]与matrix[1]之间的差值表示一行占用的内存大小。
任务2
源代码
#include <stdio.h>
#define MAX_SIZE 100
void read_input(int arr[], int size);
double calc_average(int arr[], int size);
int main() {
int arr[MAX_SIZE];
int size;
double avg;
while(printf("输入数组大小: "), scanf("%d", &size) != EOF) {
read_input(arr, size);
avg = calc_average(arr, size);
printf("平均值(去最大最小): %.2f\n\n", avg);
}
return 0;
}
void read_input(int arr[], int size) {
for(int i = 0; i < size; ++i)
scanf("%d", &arr[i]);
}
double calc_average(int arr[], int size) {
int max_val = arr[0], min_val = arr[0], total = 0;
double avg;
for(int i = 0; i < size; ++i) {
total += arr[i];
if(arr[i] > max_val) max_val = arr[i];
else if(arr[i] < min_val) min_val = arr[i];
}
avg = (total - max_val - min_val) / (size - 2);
return avg;
}
任务3
源代码
#include <stdio.h>
#define ARRAY_SIZE 100
void print_matrix(int mat[][ARRAY_SIZE], int size);
void initialize_matrix(int mat[][ARRAY_SIZE], int size, int value);
int main() {
int mat[ARRAY_SIZE][ARRAY_SIZE];
int size, val;
while(printf("输入矩阵大小和初始化值: "), scanf("%d%d", &size, &val) != EOF) {
initialize_matrix(mat, size, val);
print_matrix(mat, size);
printf("\n");
}
return 0;
}
void print_matrix(int mat[][ARRAY_SIZE], int size) {
for(int i = 0; i < size; ++i) {
for(int j = 0; j < size; ++j)
printf("%d ", mat[i][j]);
printf("\n");
}
}
void initialize_matrix(int mat[][ARRAY_SIZE], int size, int value) {
for(int i = 0; i < size; ++i)
for(int j = 0; j < size; ++j)
mat[i][j] = value;
}
任务4
源代码
#include <stdio.h>
#define ARRAY_LIMIT 100
void get_elements(int arr[], int count);
double find_median(int arr[], int count);
int main() {
int arr[ARRAY_LIMIT];
int count;
double median;
while(printf("输入数组大小: "), scanf("%d", &count) != EOF) {
get_elements(arr, count);
median = find_median(arr, count);
printf("中位数: %g\n\n", median);
}
return 0;
}
void get_elements(int arr[], int count) {
for(int i = 0; i < count; ++i)
scanf("%d", &arr[i]);
}
double find_median(int arr[], int count) {
for(int i = 0; i < count-1; ++i)
for(int j = 0; j < count-i-1; ++j)
if(arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
if(count % 2 == 1)
return arr[count/2];
else
return (arr[count/2 - 1] + arr[count/2]) / 2.0;
}
任务5
源代码
#include <stdio.h>
#define MATRIX_SIZE 100
void fill_matrix(int mat[][MATRIX_SIZE], int dim);
void display_matrix(int mat[][MATRIX_SIZE], int dim);
void rotate_right(int mat[][MATRIX_SIZE], int dim);
int main() {
int mat[MATRIX_SIZE][MATRIX_SIZE];
int dim;
printf("输入矩阵维度: ");
scanf("%d", &dim);
fill_matrix(mat, dim);
printf("原始矩阵:\n");
display_matrix(mat, dim);
rotate_right(mat, dim);
printf("旋转后的矩阵:\n");
display_matrix(mat, dim);
return 0;
}
void fill_matrix(int mat[][MATRIX_SIZE], int dim) {
for(int i = 0; i < dim; ++i)
for(int j = 0; j < dim; ++j)
scanf("%d", &mat[i][j]);
}
void display_matrix(int mat[][MATRIX_SIZE], int dim) {
for(int i = 0; i < dim; ++i) {
for(int j = 0; j < dim; ++j)
printf("%4d", mat[i][j]);
printf("\n");
}
}
void rotate_right(int mat[][MATRIX_SIZE], int dim) {
int temp;
for(int i = 0; i < dim; ++i) {
temp = mat[i][dim-1];
for(int j = dim-1; j > 0; --j)
mat[i][j] = mat[i][j-1];
mat[i][0] = temp;
}
}
任务6
源代码
#include <stdio.h>
#define BUFFER_SIZE 100
void decimal_to_base(int num, int base);
int main() {
int num;
while(printf("输入十进制数: "), scanf("%d", &num) != EOF) {
decimal_to_base(num, 2);
decimal_to_base(num, 8);
decimal_to_base(num, 16);
printf("\n");
}
return 0;
}
void decimal_to_base(int num, int base) {
char digits[] = "0123456789ABCDEF";
char result[BUFFER_SIZE] = "";
int index = 0;
do {
result[index++] = digits[num % base];
num /= base;
} while(num > 0);
for(int i = index - 1; i >= 0; --i)
printf("%c", result[i]);
printf("\n");
}
任务7
源代码
#include <stdio.h>
#define SQUARE_SIZE 100
void input_matrix(int mat[][SQUARE_SIZE], int size);
void show_matrix(int mat[][SQUARE_SIZE], int size);
int check_magic_square(int mat[][SQUARE_SIZE], int size);
int main() {
int mat[SQUARE_SIZE][SQUARE_SIZE];
int size;
while(printf("输入方阵大小: "), scanf("%d", &size) != EOF) {
printf("输入方阵元素:\n");
input_matrix(mat, size);
printf("显示方阵:\n");
show_matrix(mat, size);
if(check_magic_square(mat, size))
printf("这是一个魔方阵\n\n");
else
printf("这不是一个魔方阵\n\n");
}
return 0;
}
void input_matrix(int mat[][SQUARE_SIZE], int size) {
for(int i = 0; i < size; ++i)
for(int j = 0; j < size; ++j)
scanf("%d", &mat[i][j]);
}
void show_matrix(int mat[][SQUARE_SIZE], int size) {
for(int i = 0; i < size; ++i) {
for(int j = 0; j < size; ++j)
printf("%4d", mat[i][j]);
printf("\n");
}
}
int check_magic_square(int mat[][SQUARE_SIZE], int size) {
int sum = 0, row_sum = 0, col_sum = 0, diag_sum1 = 0, diag_sum2 = 0;
for(int i = 0; i < size; ++i)
sum += mat[0][i];
for(int i = 0; i < size; ++i) {
row_sum = col_sum = 0;
for(int j = 0; j < size; ++j) {
row_sum += mat[i][j];
col_sum += mat[j][i];
}
if(row_sum != sum || col_sum != sum)
return 0;
}
for(int i = 0; i < size; ++i) {
diag_sum1 += mat[i][i];
diag_sum2 += mat[i][size - 1 - i];
}
if(diag_sum1 != sum || diag_sum2 != sum)
return 0;
return 1;
}