实验4

实验1

问题1:一维数组x在内存中是否连续存放?x和&x[0]的值相同吗?

一维数组在内存中是连续存放的。数组的所有元素在内存中占据一段连续的地址空间元素按下标顺序依次排列,相邻元素的地址差等于单个元素的字节大小;

两者的值完全相同

 

问题2:二维数组x在内存中是否按行连续存放?x、x[0]和&x[0][0]的值相同吗?x[0]和x[1]相差多少?该差值的 含义是什么?

二维数组在内存中是按行连续存放的。C 语言的二维数组本质是 “数组的数组”,先存储第 0 行的所有元素(x[0][0]x[0][3]),再存储第 1 行的所有元素(x[1][0]x[1][3]),整体是一段连续的内存空间

三者的值完全相同;相差 16 字节

 

实验二

问题1:一维数组作为参数时(以 input 函数为例),形参、实参书写形式分别是什么?

形参 数组形式:void input(int x[], int n);指针形式:void input(int *x, int n);

实参直接传递数组名即可,数组名会隐式转换为指向数组首元素的指针。

题2:函数 input 的功能是?函数 compute 的功能是?

input 从标准输入读取 n 个整数,并依次存入一维数组 x

compute 计算数组 x 中去掉最大值和最小值后的平均值

 

实验三

问题1:两维数组作为函数参数时(以函数 output 为例),形参、实参书写形式分别是什么?

形参 数组名[ ][第二维大小]

实参 直接写数组名

问题2:两维数组作为函数形参时,第二维大小能省略吗?(以函数 output 为例,试着把形参 x[][N] 写成 x[] [] ,编译代码,观察编译器是否报错)

不能省略,会报错

问题3:函数 output 的功能是?函数 init 的功能是? 

按行列格式输出 n×n 二维数组的所有元素;

将 n×n 二维数组的所有元素赋值为指定的 value。

 

实验四

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define N 100
void input(int x[], int n);
double median(int x[], int n);

int main() {
    int x[N];
    int n;
    double ans;

    while (printf("Enter n: "), scanf("%d", &n) != EOF) {
        input(x, n);          
        ans = median(x, n);   
        printf("ans = %g\n\n", ans);
    }
    return 0;
}

void input(int x[], int n) {
    int i;
    for (i = 0; i < n; ++i) {
        scanf("%d", &x[i]);
    }
}

double median(int x[], int n) {
    int i, j, temp;

    for (i = 0; i < n - 1; ++i) {
        for (j = 0; j < n - 1 - i; ++j) {
            if (x[j] > x[j + 1]) {
                temp = x[j];
                x[j] = x[j + 1];
                x[j + 1] = temp;
            }
        }
    }

    if (n % 2 == 1) {

        return x[n / 2];
    }
    else {

        return (x[n / 2 - 1] + x[n / 2]) / 2.0;
    }
}

 

image

 

实验五

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define N 100

void input(int x[][N], int n);
void output(int x[][N], int n);
void rotate_to_right(int x[][N], int n);

int main() {
    int x[N][N];
    int n;

    printf("Enter n: ");
    scanf("%d", &n);

    input(x, n);

    printf("原始矩阵:\n");
    output(x, n);

    rotate_to_right(x, n);

    printf("变换后矩阵:\n");
    output(x, n);

    return 0;
}

void input(int x[][N], int n) {
    int i, j;
    for (i = 0; i < n; ++i) {
        for (j = 0; j < n; ++j) {
            scanf("%d", &x[i][j]);
        }
    }
}

void output(int x[][N], int n) {
    int i, j;
    for (i = 0; i < n; ++i) {
        for (j = 0; j < n; ++j) {
            printf("%4d", x[i][j]);
        }
        printf("\n");
    }
}

void rotate_to_right(int x[][N], int n) {
    int i, j;
    int temp;

    for (i = 0; i < n; ++i) {
        temp = x[i][n - 1];
        for (j = n - 1; j > 0; --j) {
            x[i][j] = x[i][j - 1];
        }
        x[i][0] = temp;
    }
}

 

image

 

实验六

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define N 100

void dec_to_n(int x, int n); 

int main() {
    int x;

    while (printf("输入十进制整数: "), scanf("%d", &x) != EOF) {
        dec_to_n(x, 2);  
        dec_to_n(x, 8);  
        dec_to_n(x, 16); 

        printf("\n");
    }
    return 0;
}

void dec_to_n(int x, int n) {
    int arr[N];
    int i = 0, j;
    int remainder;

    if (x == 0) {
        printf("0\n");
        return;
    }

    while (x != 0) {
        remainder = x % n;
        arr[i] = remainder;
        i++;
        x = x / n;
    }

    for (j = i - 1; j >= 0; j--) {
        if (arr[j] < 10) {
            printf("%d", arr[j]);
        }
        else {
            printf("%c", 'A' + (arr[j] - 10));
        }
    }
    printf("\n");
}

image

 

实验七

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define N 100

void input(int x[][N], int n);
void output(int x[][N], int n);
int is_magic(int x[][N], int n);

int main() {
    int x[N][N];
    int n;

    while (printf("输入n: "), scanf("%d", &n) != EOF) {
        printf("输入方阵:\n");
        input(x, n);

        printf("输出方阵:\n");
        output(x, n);

        if (is_magic(x, n))
            printf("是魔方矩阵\n\n");
        else
            printf("不是魔方矩阵\n\n");
    }
    return 0;
}

void input(int x[][N], int n) {
    int i, j;
    for (i = 0; i < n; ++i) {
        for (j = 0; j < n; ++j) {
            scanf("%d", &x[i][j]);
        }
    }
}

void output(int x[][N], int n) {
    int i, j;
    for (i = 0; i < n; ++i) {
        for (j = 0; j < n; ++j) {
            printf("%4d", x[i][j]);
        }
        printf("\n");
    }
}

int is_magic(int x[][N], int n) {
    int magic_sum = n * (n * n + 1) / 2; 
    int i, j, sum;

    for (i = 0; i < n; ++i) {
        sum = 0;
        for (j = 0; j < n; ++j) {
            sum += x[i][j];
        }
        if (sum != magic_sum)
            return 0;
    }

    for (j = 0; j < n; ++j) {
        sum = 0;
        for (i = 0; i < n; ++i) {
            sum += x[i][j];
        }
        if (sum != magic_sum)
            return 0;
    }

    sum = 0;
    for (i = 0; i < n; ++i) {
        sum += x[i][i];
    }
    if (sum != magic_sum)
        return 0;

    sum = 0;
    for (i = 0; i < n; ++i) {
        sum += x[i][n - 1 - i];
    }
    if (sum != magic_sum)
        return 0;

    return 1;
}

 

image

 

posted @ 2026-04-29 21:33  王佐岩  阅读(8)  评论(0)    收藏  举报