当前位置:首页 > 技术 > 正文内容

一维和二维数组操作实验

访客 技术 2026年6月20日 1

任务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;
}

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

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