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

在编写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);
        }
    }
}


img

你的 4 选项 ,是否继续 应该是 continue_flag = 0,没有输出是你没有判 choice == 4

img

在你的代码中,问题出在以下这段代码中:

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,可以确保后续的运算不会被中止。这样,你就可以正确进行多维数组的除法运算了。