在编写C语言的过程中,我想设计一个多维数组间的加、减、乘、除运算,但是在除法运算中却没有得到预先想要的输出,直接返回上一级菜单了,请帮我查看哪里出了问题!并指正!
#include <stdio.h>
#include <stdlib.h>
#define MAX_ROW 100
#define MAX_COL 100
// 定义全局变量
int arr[MAX_ROW][MAX_COL];
int row, col;
// 函数声明
void menu();
void count_string();
void modify_array();
void transpose_array();
void sort_array();
void max_min_array();
void sum_average_array();
void operate_multi_dim_array();
int main()
{
int choice;
// 输入数组
printf("请输入数组的行数和列数:");
scanf("%d%d", &row, &col);
printf("请输入%d行%d列的数组:\n", row, col);
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
scanf("%d", &arr[i][j]);
}
}
// 显示菜单
while (1) {
menu();
printf("请输入您的选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
count_string();
break;
case 2:
modify_array();
break;
case 3:
transpose_array();
break;
case 4:
sort_array();
break;
case 5:
max_min_array();
break;
case 6:
sum_average_array();
break;
case 7:
operate_multi_dim_array();
break;
case 0:
printf("程序结束!\n");
exit(0);
default:
printf("您的输入有误,请重新输入!\n");
break;
}
}
return 0;
}
// 显示菜单
void menu()
{
printf("\n");
printf("********** 数组的综合运算 **********\n");
printf("1. 字符串统计\n");
printf("2. 数组的修改与输出\n");
printf("3. 数组的转置\n");
printf("4. 数组的排序\n");
printf("5. 求数组的最大、最小值\n");
printf("6. 计算数组行、列的值\n");
printf("7. 多维数组间的加、减、乘、除运算\n");
printf("0. 退出程序\n");
printf("*************************************\n");
}
// 字符串统计
void count_string()
{
char str[MAX_COL];
int letter_count = 0, digit_count = 0, special_count = 0;
printf("请输入一个字符串:");
scanf("%s", str);
for (int i = 0; str[i] != '\0'; i++) {
if ((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')) {
letter_count++;
} else if (str[i] >= '0' && str[i] <= '9') {
digit_count++;
} else {
special_count++;
}
}
printf("字符串中字母的个数为:%d\n", letter_count);
printf("字符串中数字的个数为:%d\n", digit_count);
printf("字符串中特殊字符的个数为:%d\n", special_count);
}
// 数组的修改与输出
void modify_array()
{
int row_index, col_index, value;
printf("请输入要修改的元素的行和列:");
scanf("%d%d", &row_index, &col_index);
printf("请输入新的元素值:");
scanf("%d", &value);
arr[row_index - 1][col_index - 1] = value;
printf("修改后的数组为:\n");
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
// 数组的转置
void transpose_array()
{
int trans_arr[MAX_COL][MAX_ROW];
for (int i = 0; i < col; i++) {
for (int j = 0; j < row; j++) {
trans_arr[i][j] = arr[j][i];
}
}
printf("转置后的数组为:\n");
for (int i = 0; i < col; i++) {
for (int j = 0; j < row; j++) {
printf("%d ", trans_arr[i][j]);
}
printf("\n");
}
}
// 数组的排序
void sort_array()
{
int temp;
for (int i = 0; i < row * col - 1; i++) {
for (int j = 0; j < row * col - 1 - i; j++) {
if (arr[j / col][j % col] > arr[(j + 1) / col][(j + 1) % col]) {
temp = arr[j / col][j % col];
arr[j / col][j % col] = arr[(j + 1) / col][(j + 1) % col];
arr[(j + 1) / col][(j + 1) % col] = temp;
}
}
}
printf("排序后的数组为:\n");
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
// 求数组的最大、最小值
void max_min_array()
{
int max = arr[0][0], min = arr[0][0];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (arr[i][j] > max) {
max = arr[i][j];
}
if (arr[i][j] < min) {
min = arr[i][j];
}
}
}
printf("数组的最大值为:%d\n", max);
printf("数组的最小值为:%d\n", min);
}
// 计算数组行、列的值
void sum_average_array()
{
int row_sum[MAX_ROW] = { 0 };
int col_sum[MAX_COL] = { 0 };
float row_avg[MAX_ROW] = { 0 };
float col_avg[MAX_COL] = { 0 };
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
row_sum[i] += arr[i][j];
col_sum[j] += arr[i][j];
}
row_avg[i] = (float)row_sum[i] / col;
}
for (int i = 0; i < col; i++) {
col_avg[i] = (float)col_sum[i] / row;
}
printf("每行的和为:\n");
for (int i = 0; i < row; i++) {
printf("%d ", row_sum[i]);
}
printf("\n");
printf("每行的平均值为:\n");
for (int i = 0; i < row; i++) {
printf("%.2f ", row_avg[i]);
}
printf("\n");
printf("每列的和为:\n");
for (int i = 0; i < col; i++) {
printf("%d ", col_sum[i]);
}
printf("\n");
printf("每列的平均值为:\n");
for (int i = 0; i < col; i++) {
printf("%.2f ", col_avg[i]);
}
printf("\n");
}
// 多维数组间的加、减、乘、除运算
void operate_multi_dim_array()
{
int row2, col2;
int arr2[MAX_ROW][MAX_COL];
int choice, continue_flag = 1;
int result[MAX_ROW][MAX_COL];
printf("请输入第二个数组的行数和列数:");
scanf("%d%d", &row2, &col2);
printf("请输入%d行%d列的数组:\n", row2, col2);
for (int i = 0; i < row2; i++) {
for (int j = 0; j < col2; j++) {
scanf("%d", &arr2[i][j]);
}
}
while (continue_flag) {
printf("请选择要进行的运算:\n");
printf("1. 加法运算\n");
printf("2. 减法运算\n");
printf("3. 乘法运算\n");
printf("4. 除法运算\n");
printf("0. 返回上一级菜单\n");
printf("请输入您的选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
result[i][j] = arr[i][j] + arr2[i][j];
}
}
break;
case 2:
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
result[i][j] = arr[i][j] - arr2[i][j];
}
}
break;
case 3:
if (col != row2) {
printf("两个数组不能进行乘法运算!\n");
continue;
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col2; j++) {
result[i][j] = 0;
for (int k = 0; k < col; k++) {
result[i][j] += arr[i][k] * arr2[k][j];
}
}
}
break;
case 4:
continue_flag = 0;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (arr2[i][j] == 0) {
printf("第二个数组中有0,不能进行除法运算!\n");
continue_flag = 1;
break;
}
result[i][j] = arr[i][j] / arr2[i][j];
}
// 判断是否需要退出循环
if (continue_flag == 1) {
break;
}
}
break;
case 0:
return;
default:
printf("您的输入有误,请重新输入!\n");
continue;
}
if (choice == 1 || choice == 2 || choice == 3) {
printf("运算结果为:\n");
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
printf("%d ", result[i][j]);
}
printf("\n");
}
}
if (continue_flag == 1) {
printf("是否继续使用加减乘除运算?(1-继续,0-返回上一级菜单):");
scanf("%d", &continue_flag);
}
}
}
你的 4 选项 ,是否继续 应该是 continue_flag = 0,没有输出是你没有判 choice == 4
在你的代码中,问题出在以下这段代码中:
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (arr2[i][j] == 0) {
printf("第二个数组中有0,不能进行除法运算!\n");
continue_flag = 1;
break;
}
result[i][j] = arr[i][j] / arr2[i][j];
}
// 判断是否需要退出循环
if (continue_flag == 1) {
break;
}
}
在这段代码中,你对数组arr2进行了遍历,检查其中是否有元素为0。如果有元素为0,你会输出错误消息并设置continue_flag
为1,然后通过break
语句退出循环。
然而,这段代码的问题在于它在检查到第一个为0的元素后,直接退出了内层循环,并没有考虑后续的元素。这导致在计算result
数组时,后续的运算也被中止了,因为continue_flag
仍然被设置为1。
你可以修改代码如下:
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (arr2[i][j] == 0) {
printf("第二个数组中有0,不能进行除法运算!\n");
continue_flag = 1;
break;
}
result[i][j] = arr[i][j] / arr2[i][j];
}
// 判断是否需要退出循环
if (continue_flag == 1) {
break;
}
// 重置continue_flag为0,以便继续进行后续的运算
continue_flag = 0;
}
通过在内层循环结束后重置continue_flag
为0,可以确保后续的运算不会被中止。这样,你就可以正确进行多维数组的除法运算了。
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |