请问我编写的代码在测试过程中,无论输入哪个数字程序都会闪退?能否帮我看看代码是否有错误,哪里需要更改才能达到预先需要的功能?如果能将修改后的代码告诉我,我将感激不尽!谢谢!
#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;
}
}
菜单循环,修改如下,菜单第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;
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话: