关于#C语言#的问题,如何解决?

请问我编写的代码在测试过程中,无论输入哪个数字程序都会闪退?能否帮我看看代码是否有错误,哪里需要更改才能达到预先需要的功能?如果能将修改后的代码告诉我,我将感激不尽!谢谢!


#include <stdio.h>
#include <stdlib.h>

//函数声明
void input(int **a, int m, int n);    //输入数组
void output(int **a, int m, int n);   //输出数组
void transpose(int **a, int **b, int m, int n);   //数组转置
void sort(int **a, int m, int n);     //数组排序
void maxmin(int **a, int m, int n);   //最大最小值
void sum(int **a, int m, int n);      //行列值
void operate(int **a, int **b, int **c, int m, int n, int p);   //多维数组加减乘除

int main()
{
    int m, n, p, i, j, choice;
    int **a, **b, **c;
    printf("欢迎使用数组综合运算程序!\n");
    printf("请输入数组的行数和列数:");
    scanf("%d%d", &m, &n);
    a = (int **)malloc(m * sizeof(int *));
    for (i = 0; i < m; i++)
    {
        a[i] = (int *)malloc(n * sizeof(int));
    }
    printf("请按行输入数组的元素:\n");
    input(a, m, n);
    printf("请选择需要执行的功能:\n");
    printf("1. 输出数组\n");
    printf("2. 数组转置\n");
    printf("3. 数组排序\n");
    printf("4. 最大最小值\n");
    printf("5. 行列值\n");
    printf("6. 多维数组加减乘除\n");
    scanf("%d", &choice);
    switch (choice)
    {
    case 1:
        output(a, m, n);
        break;
    case 2:
        b = (int **)malloc(n * sizeof(int *));
        for (i = 0; i < n; i++)
        {
            b[i] = (int *)malloc(m * sizeof(int));
        }
        transpose(a, b, m, n);
        output(b, n, m);
        break;
    case 3:
        sort(a, m, n);
        output(a, m, n);
        break;
    case 4:
        maxmin(a, m, n);
        break;
    case 5:
        sum(a, m, n);
        break;
    case 6:
        printf("请输入第二个多维数组的行数和列数:");
        scanf("%d%d", &n, &p);
        b = (int **)malloc(n * sizeof(int *));
        for (i = 0; i < n; i++)
        {
            b[i] = (int *)malloc(p * sizeof(int));
        }
        printf("请按行输入第二个多维数组的元素:\n");
        input(b, n, p);
        c = (int **)malloc(m * sizeof(int *));
        for (i = 0; i < m; i++)
        {
            c[i] = (int *)malloc(p * sizeof(int));
        }
        operate(a, b, c, m, n, p);
        output(c, m, p);
        break;
    default:
        printf("输入错误!\n");
        break;
    }
    for (i = 0; i < m; i++)
    {
        free(a[i]);
    }
    free(a);
    if (choice == 2 || choice == 6)
    {
        for (i = 0; i < n; i++)
        {
            free(b[i]);
        }
        free(b);
    }
    if (choice == 6)
    {
        for (i = 0; i < m; i++)
        {
            free(c[i]);
        }
        free(c);
    }
    return 0;
}

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

void output(int **a, int m, int n)
{
    int i, j;
    printf("数组的元素为:\n");
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
}

void transpose(int **a, int **b, int m, int n)
{
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            b[i][j] = a[j][i];
        }
    }
}

void sort(int **a, int m, int n)
{
    int i, j, temp;
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n - 1; j++)
        {
            if (a[i][j] > a[i][j + 1])
            {
                temp = a[i][j];
                a[i][j] = a[i][j + 1];
                a[i][j + 1] = temp;
            }
        }
    }
}

void maxmin(int **a, int m, int n)
{
    int i, j, max, min;
    max = min = a[0][0];
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            if (a[i][j] > max)
            {
                max = a[i][j];
            }
            if (a[i][j] < min)
            {
                min = a[i][j];
            }
        }
    }
    printf("数组中的最大值为%d,最小值为%d\n", max, min);
}

void sum(int **a, int m, int n)
{
    int i, j, sumr, sumc;
    for (i = 0; i < m; i++)
    {
        sumr = 0;
        for (j = 0; j < n; j++)
        {
            sumr += a[i][j];
        }
        printf("第%d行的元素之和为%d\n", i + 1, sumr);
    }
    for (j = 0; j < n; j++)
    {
        sumc = 0;
        for (i = 0; i < m; i++)
        {
            sumc += a[i][j];
        }
        printf("第%d列的元素之和为%d\n", j + 1, sumc);
    }
}

void operate(int **a, int **b, int **c, int m, int n, int p)
{
    int i, j, k;
    printf("请选择多维数组的运算方式:\n");
    printf("1. 加法\n");
    printf("2. 减法\n");
    printf("3. 乘法\n");
    printf("4. 除法\n");
    scanf("%d", &k);
    switch (k)
    {
    case 1:
        for (i = 0; i < m; i++)
        {
            for (j = 0; j < p; j++)
            {
                c[i][j] = a[i][j] + b[i][j];
            }
        }
        break;
    case 2:
        for (i = 0; i < m; i++)
        {
            for (j = 0; j < p; j++)
            {
                c[i][j] = a[i][j] - b[i][j];
            }
        }
        break;
    case 3:
        for (i = 0; i < m; i++)
        {
            for (j = 0; j < p; j++)
            {
                c[i][j] = 0;
                for (k = 0; k < n; k++)
                {
                    c[i][j] += a[i][k] * b[k][j];
                }
            }
        }
        break;
    case 4:
        for (i = 0; i < m; i++)
        {
            for (j = 0; j < p; j++)
            {
                if (b[i][j] == 0)
                {
                    printf("第%d行第%d列的元素为0,无法进行除法运算!\n", i + 1, j + 1);
                    return;
                }
                c[i][j] = a[i][j] / b[i][j];
            }
        }
        break;
    default:
        printf("输入错误!\n");
        break;
    }
}

img

img

菜单循环,修改如下,菜单第6项功能多维数组加减乘除运算结果不对,逻辑有问题未修改,供参考:

#include <stdio.h>
#include <stdlib.h>

//函数声明
void input(int** a, int m, int n);    //输入数组
void output(int** a, int m, int n);   //输出数组
void transpose(int** a, int** b, int m, int n);   //数组转置
void sort(int** a, int m, int n);     //数组排序
void maxmin(int** a, int m, int n);   //最大最小值
void sum(int** a, int m, int n);      //行列值
void operate(int** a, int** b, int** c, int m, int n, int p);   //多维数组加减乘除

int main()
{
    int m, n, p, i, j, choice;
    int** a, ** b, ** c;
    printf("欢迎使用数组综合运算程序!\n");
    printf("请输入数组的行数和列数:");
    scanf("%d%d", &m, &n);
    a = (int**)malloc(m * sizeof(int*));
    for (i = 0; i < m; i++)
    {
        a[i] = (int*)malloc(n * sizeof(int));
    }
    printf("请按行输入数组的元素:\n");
    input(a, m, n);
    do {                                  // 修改
        printf("请选择需要执行的功能:\n");
        printf("1. 输出数组\n");
        printf("2. 数组转置\n");
        printf("3. 数组排序\n");
        printf("4. 最大最小值\n");
        printf("5. 行列值\n");
        printf("6. 多维数组加减乘除\n");
        printf("0. 退出运行\n");        // 修改 
        scanf("%d", &choice);             
        switch (choice)               
        {
        case 1:
            output(a, m, n);
            break;
        case 2:
            b = (int**)malloc(n * sizeof(int*));
            for (i = 0; i < n; i++)
            {
                b[i] = (int*)malloc(m * sizeof(int));
            }
            transpose(a, b, m, n);
            output(b, n, m);
            break;
        case 3:
            sort(a, m, n);
            output(a, m, n);
            break;
        case 4:
            maxmin(a, m, n);
            break;
        case 5:
            sum(a, m, n);
            break;
        case 6:
            printf("请输入第二个多维数组的行数和列数:");
            scanf("%d%d", &n, &p);
            b = (int**)malloc(n * sizeof(int*));
            for (i = 0; i < n; i++)
            {
                b[i] = (int*)malloc(p * sizeof(int));
            }
            printf("请按行输入第二个多维数组的元素:\n");
            input(b, n, p);
            c = (int**)malloc(m * sizeof(int*));
            for (i = 0; i < m; i++)
            {
                c[i] = (int*)malloc(p * sizeof(int));
            }
            operate(a, b, c, m, n, p);
            output(c, m, p);
            break;
        case 0:break;             // 修改
        default:
            printf("输入错误!\n");
            break;
        }
    } while (choice);              // 修改
    for (i = 0; i < m; i++)
    {
        free(a[i]);
    }
    free(a);
    if (choice == 2 || choice == 6)
    {
        for (i = 0; i < n; i++)
        {
            free(b[i]);
        }
        free(b);
    }
    if (choice == 6)
    {
        for (i = 0; i < m; i++)
        {
            free(c[i]);
        }
        free(c);
    }
    return 0;
}

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

void output(int** a, int m, int n)
{
    int i, j;
    printf("数组的元素为:\n");
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
}

void transpose(int** a, int** b, int m, int n)
{
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            b[i][j] = a[j][i];
        }
    }
}

void sort(int** a, int m, int n)
{
    int i, j, temp;
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n - 1; j++)
        {
            if (a[i][j] > a[i][j + 1])
            {
                temp = a[i][j];
                a[i][j] = a[i][j + 1];
                a[i][j + 1] = temp;
            }
        }
    }
}

void maxmin(int** a, int m, int n)
{
    int i, j, max, min;
    max = min = a[0][0];
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            if (a[i][j] > max)
            {
                max = a[i][j];
            }
            if (a[i][j] < min)
            {
                min = a[i][j];
            }
        }
    }
    printf("数组中的最大值为%d,最小值为%d\n", max, min);
}

void sum(int** a, int m, int n)
{
    int i, j, sumr, sumc;
    for (i = 0; i < m; i++)
    {
        sumr = 0;
        for (j = 0; j < n; j++)
        {
            sumr += a[i][j];
        }
        printf("第%d行的元素之和为%d\n", i + 1, sumr);
    }
    for (j = 0; j < n; j++)
    {
        sumc = 0;
        for (i = 0; i < m; i++)
        {
            sumc += a[i][j];
        }
        printf("第%d列的元素之和为%d\n", j + 1, sumc);
    }
}

void operate(int** a, int** b, int** c, int m, int n, int p)
{
    int i, j, k;
    printf("请选择多维数组的运算方式:\n");
    printf("1. 加法\n");
    printf("2. 减法\n");
    printf("3. 乘法\n");
    printf("4. 除法\n");
    scanf("%d", &k);
    switch (k)
    {
    case 1:
        for (i = 0; i < m; i++)
        {
            for (j = 0; j < p; j++)
            {
                c[i][j] = a[i][j] + b[i][j];
            }
        }
        break;
    case 2:
        for (i = 0; i < m; i++)
        {
            for (j = 0; j < p; j++)
            {
                c[i][j] = a[i][j] - b[i][j];
            }
        }
        break;
    case 3:
        for (i = 0; i < m; i++)
        {
            for (j = 0; j < p; j++)
            {
                c[i][j] = 0;
                for (k = 0; k < n; k++)
                {
                    c[i][j] += a[i][k] * b[k][j];
                }
            }
        }
        break;
    case 4:
        for (i = 0; i < m; i++)
        {
            for (j = 0; j < p; j++)
            {
                if (b[i][j] == 0)
                {
                    printf("第%d行第%d列的元素为0,无法进行除法运算!\n", i + 1, j + 1);
                    return;
                }
                c[i][j] = a[i][j] / b[i][j];
            }
        }
        break;
    default:
        printf("输入错误!\n");
        break;
    }
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^