实验4_C语言数组应用编程

任务1:

#include <stdio.h> 
#define N 4 
#define M 2 
void test1() { 
    int x[N] = {1, 9, 8, 4}; 
    int i; 
// 输出数组x占用的内存字节数 
    printf("sizeof(x) = %d\n", sizeof(x)); 
// 输出每个元素的地址、值 
    for (i = 0; i < N; ++i) 
    printf("%p: %d\n", &x[i], x[i]); 
// 输出数组名x对应的值 
    printf("x = %p\n", x); 
} 
void test2() { 
    int x[M][N] = {{1, 9, 8, 4}, {2, 0, 4, 9}}; 
    int i, j; 
// 输出二维数组x占用的内存字节数 
    printf("sizeof(x) = %d\n", sizeof(x)); 
// 输出每个元素的地址、值 
    for (i = 0; i < M; ++i) 
    for (j = 0; j < N; ++j) 
    printf("%p: %d\n", &x[i][j], x[i][j]); 
    printf("\n"); 
// 输出二维数组名x, 以及,x[0], x[1]的值
    printf("x = %p\n", x); 
    printf("x[0] = %p\n", x[0]); 
    printf("x[1] = %p\n", x[1]); 
    printf("\n"); 
} 
int main() { 
    printf("测试1: int型一维数组\n"); 
    test1(); 
    printf("\n测试2: int型二维数组\n"); 
    test2(); 
    return 0; 
}

问题 1

int 型一维数组 在内存中是连续存放的。在 test1 函数中,通过打印每个元素的地址可以看出,地址是连续递增的。

数组名 x对应的值和 &x[0]是一样的。在 test1 函数中,打印 x 的值和 &x[0] 的值,结果相同,都指向数组的首地址。

问题 2

int 型二维数组 x 在内存中是 按行连续存放的。从打印每个元素的地址可以看出,先按行遍历,地址是连续递增的。

数组名 x的值、x[0]&x[0][0]在字面上的值是一样的,都指向二维数组的首地址。

x[0] x[1]相差 4 * N个字节(假设 int 型占 4 个字节)。这个差值的意义是代表了第一行和第二行的间隔,即一行元素所占用的内存空间大小。因为二维数组在内存中是按行连续存放的,所以这个差值正好是一行的字节数。

 

任务2:

 

#include <stdio.h> 
#define N 100 
// 函数声明 
void input(int x[], int n); 
double compute(int x[], int n); 
int main() { 
    int x[N]; 
    int n, i; 
    double ans; 
    while(printf("Enter n: "), scanf("%d", &n) != EOF) { 
        input(x, n); // 函数调用 
        ans = compute(x, n); // 函数调用 
        printf("ans = %.2f\n\n", ans); 
    } 
    return 0; 
} 
// 函数定义 
void input(int x[], int n) { 
    int i;
    for(i = 0; i < n; ++i) 
    scanf("%d", &x[i]); 
} 
// 函数定义 
double compute(int x[], int n) { 
    int i, high, low; 
    double ans; 
    high = low = x[0]; 
    ans = 0; 
    for(i = 0; i < n; ++i) { 
        ans += x[i]; 
        if(x[i] > high) 
        high = x[i]; 
        else if(x[i] < low) 
        low = x[i]; 
    } 
    ans = (ans - high - low)/(n-2); 
    return ans; 
}

 

函数input的功能:

这个函数用于接收用户输入的n个整数,并将这些整数存储到给定的整数数组x中。它通过一个循环,逐个读取用户输入的整数,并将其存储到数组的相应位置。

函数compute的功能:

这个函数用于计算给定整数数组中去掉最大值和最小值后的平均值。它首先假设数组的第一个元素为最大值和最小值的初始值,然后遍历数组,更新最大值high和最小值low,同时累加数组中的所有元素到ans。遍历结束后,从总和中减去最大值和最小值,再除以数组长度减 2(去掉最大值和最小值后的元素个数),最后返回这个平均值。

 

任务3:

 

#include <stdio.h> 
#define N 100
// 函数声明 
void output(int x[][N], int n); 
void init(int x[][N], int n, int value); 
int main() { 
    int x[N][N]; 
    int n, value; 
    while(printf("Enter n and value: "), scanf("%d%d", &n, &value) != EOF) { 
        init(x, n, value); // 函数调用 
        output(x, n); // 函数调用 
        printf("\n"); 
    } 
    return 0; 
} 
// 函数定义 
void output(int x[][N], int n) { 
    int i, j; 
    for(i = 0; i < n; ++i) { 
        for(j = 0; j < n; ++j) 
        printf("%d ", x[i][j]); 
        printf("\n"); 
    } 
} 
// 函数定义 
void init(int x[][N], int n, int value) { 
    int i, j; 
    for(i = 0; i < n; ++i) 
    for(j = 0; j < n; ++j) 
    x[i][j] = value; 
}

 

问题 1

两维数组作为函数形参时,第一维的大小可以省略,第二维的大小不能省略。因为在传递二维数组时,实际上传递的是指向数组首元素的指针,而编译器需要知道第二维的大小以便正确地访问数组元素。

问题 2

函数 output 的功能是输出二维数组 x 的内容。它通过两层循环遍历二维数组的每一个元素,并以特定的格式输出每个元素的值,每行输出完一个元素后输出一个空格,每行输出完所有元素后输出一个换行符。

函数 init 的功能是初始化二维数组 x。它通过两层循环遍历二维数组的每一个元素,并将每个元素都初始化为给定的 value 值。

 

任务4:

 

#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 temp;
    int i, j;
    // 排序
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - i - 1; 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;
    }
}

 

 

任务5:

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

// 函数定义 
// 功能: 输入一个 n*n 的矩阵 x 
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]); 
    } 
} 

// 函数定义 
// 功能: 输出一个 n*n 的矩阵 x 
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"); 
    } 
} 

// 函数 rotate_to_right 定义 
// 功能: 把一个 n*n 的矩阵 x,每一列向右移, 最右边被移出去的一列绕回左边 
void rotate_to_right(int x[][N], int n) {
    int temp;
    int i;
    for (i = 0; i < n; i++) {
        temp = x[i][n - 1];
        int j;
        for (j = n - 1; j > 0; j--) {
            x[i][j] = x[i][j - 1];
        }
        x[i][0] = temp;
    }
}

 

任务6:

#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); // 函数调用: 把 x 转换成二进制输出 
        dec_to_n(x, 8); // 函数调用: 把 x 转换成八进制输出 
        dec_to_n(x, 16); // 函数调用: 把 x 转换成十六进制输出 
        printf("\n"); 
    } 
    return 0; 
} 

// 函数定义 
// 功能: 把十进制数 x 转换成 n 进制,打印输出 
void dec_to_n(int x, int n) {
    int stack[N];
    int top = 0;
    while (x > 0) {
        stack[top++] = x % n;
        x /= n;
    }
    if (top == 0) {
        stack[top++] = 0;
    }
    while (top > 0) {
        int digit = stack[--top];
        if (digit < 10) {
            printf("%d", digit);
        } else {
            printf("%c", digit - 10 + 'A');
        }
    }
    printf("\n");
}

 

任务7:

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

// 函数定义 
// 功能: 输入一个 n*n 的矩阵 x 
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]); 
    } 
} 

// 功能: 输出一个 n*n 的矩阵 x 
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"); 
    } 
} 

// 功能: 判断一个 n 阶方阵是否为魔方矩阵,如果是,返回 1,否则,返回 0 
int is_magic(int x[][N], int n) {
    int sum = 0;
    int i;
    // 计算第一行的和作为基准和
    for (i = 0; i < n; i++) {
        sum += x[0][i];
    }
    // 检查每行的和是否等于基准和
    for (i = 1; i < n; i++) {
        int rowSum = 0;
        int j;
        for (j = 0; j < n; j++) {
            rowSum += x[i][j];
        }
        if (rowSum!= sum) {
            return 0;
        }
    }
    // 检查每列的和是否等于基准和
    for (i = 0; i < n; i++) {
        int colSum = 0;
        int j;
        for (j = 0; j < n; j++) {
            colSum += x[j][i];
        }
        if (colSum!= sum) {
            return 0;
        }
    }
    // 检查主对角线的和是否等于基准和
    int diagSum1 = 0;
    for (i = 0; i < n; i++) {
        diagSum1 += x[i][i];
    }
    if (diagSum1!= sum) {
        return 0;
    }
    // 检查副对角线的和是否等于基准和
    int diagSum2 = 0;
    for (i = 0; i < n; i++) {
        diagSum2 += x[i][n - 1 - i];
    }
    if (diagSum2!= sum) {
        return 0;
    }
    return 1;
}

 

任务8:

#include <stdio.h>
int isUniqueDigits(int num) {
    int digits[10] = {0};
    int square = num * num;
    int cube = num * num * num;

    while (square > 0) {
        digits[square % 10]++;
        square /= 10;
    }

    while (cube > 0) {
        digits[cube % 10]++;
        cube /= 10;
    }

    for (int i = 0; i < 10; i++) {
        if ((i == 0 && digits[i] == 0) || (i > 0 && digits[i]!= 1)) {
            return 0;
        }
    }

    return 1;
}

int main() {
    int num = 1;
    while (1) {
        if (isUniqueDigits(num)) {
            printf("%d\n", num);
            break;
        }
        num++;
    }
    return 0;
}

 

posted @ 2024-11-09 10:22  顾谢耀202383290109  阅读(4)  评论(0编辑  收藏  举报