当前位置:首页 > 随笔 > 正文内容

C语言数组操作实验

访客 随笔 2026年6月3日 1

任务一:数组内存分析

#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;
}

问题分析:

  1. 一维数组中,相邻元素地址差为sizeof(int)字节
  2. 二维数组中,同行相邻元素地址差为sizeof(int)字节,相邻行首地址差为ROWS*sizeof(int)字节
  3. 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");
    }
}

问题解答:

  1. 在定义二维数组参数时,列维度不能省略,编译器需要知道每行的元素数量
  2. initialize_matrix 函数将数组所有元素赋值为指定值
  3. 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所有数字且不重复。

相关文章

可以按小时收费的VPS

很多 VPS 提供商都支持 按小时计费(hourly billing),想短期试用 / 临时搭建节点、测试网络、短期项目等场景非常合适。下面是当前最主流且靠谱的按小时 VPS 选项,分别按不同需求场景整理: 1. Vultr(全球节点,包括日本) 按小时计费 可选机房:东京 / 大阪 / 洛杉矶 / 法兰克福 / 伦敦 … 支持 PayPal(部分情况),但更常用信用卡/PayPal+卡价格参考$...

在 iPhone 上下载国外App

地区/国家限制App Store 会根据 Apple ID 的国家或地区限制应用下载。如果你的 Apple ID 绑定的是中国大陆,就可能无法下载 OpenAI 官方的 ChatGPT 应用,因为它在大陆 App Store 不上架。解决办法:换成美国、加拿大、香港等地区的 Apple ID。或者在现有 Apple ID 上更改地区。注册一个国外 Apple ID(推荐)比如注册 美国区 Appl...

Node.js 中的异步编程:回调与 Promise

Node.js 是一个基于 JavaScript 构建的单线程、非阻塞运行环境,它通过异步编程机制来高效处理多个操作。在执行如文件读取、API 请求或数据库查询等任务时,Node.js 不会等待这些操作完成,而是使用回调函数和 Promise 来避免阻塞主线程。 回调方式实现异步 那么当异步操作完成后,Node.js 如何知道接下来要做什么呢?这就要用到 回调函数(callback)。 回调本质上...

Selenium自动化测试入门指南

Selenium自动化测试入门指南

什么是自动化测试? 自动化测试是指利用软件工具自动执行测试用例,模拟用户操作,如打开网页、点击链接、输入文本等,并验证结果是否符合预期。 其主要优点包括: 大幅减少人工成本 测试速度快 可以在非工作时间运行 支持持续集成和交付 然而,它也存在一些局限性,例如开发成本较高、不适合快速变化的项目、依赖稳定的UI界面等。 自动化测试的应用条件 适合引入自动化测试的情况包括: 手动测试耗时且需要大量...

MariaDB Galera集群故障快速恢复指南

OpenStack控制节点采用三节点MariaDB Galera集群架构。当数据库集群因故障重启时,有时会出现Galera集群无法正常启动的问题。虽然有多种方法可以恢复数据库服务,但如何实现快速启动同时确保数据完整性呢? 通过分析日志发现,MariaDB Galera集群节点宕机时会在日志中输出以下信息: [Note] WSREP: 新集群视图:全局状态: 874d8e7e-5980-11e8-8...

Android 中 EventBus 的通信机制与实现原理深度解析

EventBus 核心设计思想 EventBus 是一个基于观察者模式的事件总线框架,广泛应用于 Android 平台以实现组件解耦。它通过中心化的消息分发机制,使不同层级、不同线程的对象能够以"发布-订阅"方式通信,避免了传统接口回调或广播带来的强依赖问题。 核心角色说明 事件(Event):任意 Java 对象,作为数据载体,如网络状态变更通知、用户登录信息等。 发布者(Publi...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。