You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套循环逻辑疑问:为何同时修改两行二维数组元素?

问题分析与修复

原代码片段

#include <stdio.h>
#define ROWS 2
#define COLS 5

int main(void)
{
    unsigned int rooms[ROWS][COLS] = {0}, selection, building, room;
    int i, j;
    for(i = 0; i < ROWS; i++)
    {
        for(j = 0; j < COLS; j++)
        {
            if(rooms[i][j] == 0)
            {
                rooms[i][j] = 1;
                printf("\nBuilding[%.2d]|Room[%.2d]: Reservation Succesfull.\n\n", i + 1, j + 1);
                break;
            }
        }
    }
    return 0;
}

问题原因

原代码的外层for循环会遍历每一行(ROWS=2),每进入一行就执行内层循环找到该行第一个为0的元素并标记为1,随后break跳出内层循环,接着外层循环直接进入下一行重复操作。这就导致一次运行中,两行的第一个房间会被同时预定,不符合“每次只找整个数组中第一个未被预定房间”的需求。

修复方案

要实现每次仅定位整个数组中第一个0元素的逻辑,需要调整循环结构:找到目标元素后立即终止所有遍历,而非让外层循环继续处理下一行。结合你已实现的do-while循环,可采用以下两种方式修复:

方式1:使用标志位控制循环终止

#include <stdio.h>
#define ROWS 2
#define COLS 5

int main(void)
{
    unsigned int rooms[ROWS][COLS] = {0};
    int has_empty, found;
    do {
        has_empty = 0;
        found = 0;
        // 遍历数组,找到第一个空房间后立即停止
        for(int i = 0; i < ROWS && !found; i++)
        {
            for(int j = 0; j < COLS && !found; j++)
            {
                if(rooms[i][j] == 0)
                {
                    rooms[i][j] = 1;
                    printf("\nBuilding[%.2d]|Room[%.2d]: Reservation Succesfull.\n\n", i + 1, j + 1);
                    has_empty = 1;
                    found = 1;
                }
            }
        }
        // 此处添加用户退出判断逻辑,例如询问是否继续预定
        // 示例:printf("是否继续?(1=是/0=否): "); scanf("%u", &selection);
    } while(has_empty /* && 用户选择继续 */);

    return 0;
}

方式2:使用goto跳出多层循环(适合简单场景)

#include <stdio.h>
#define ROWS 2
#define COLS 5

int main(void)
{
    unsigned int rooms[ROWS][COLS] = {0};
    int has_empty;
    do {
        has_empty = 0;
        for(int i = 0; i < ROWS; i++)
        {
            for(int j = 0; j < COLS; j++)
            {
                if(rooms[i][j] == 0)
                {
                    rooms[i][j] = 1;
                    printf("\nBuilding[%.2d]|Room[%.2d]: Reservation Succesfull.\n\n", i + 1, j + 1);
                    has_empty = 1;
                    // 找到目标后直接跳出所有循环
                    goto end_search;
                }
            }
        }
    end_search:
        // 添加用户退出判断逻辑
    } while(has_empty /* && 用户选择继续 */);

    return 0;
}

关键说明

修复后的逻辑是每次进入do-while循环时,从数组第一个元素开始顺序遍历,找到第一个未被预定的房间后立即停止遍历,确保每次仅完成一个房间的预定。结合do-while的循环条件,即可实现“重复预定直到房间满或用户退出”的需求。

内容的提问来源于stack exchange,提问作者Panji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:35:17