嵌套循环逻辑疑问:为何同时修改两行二维数组元素?
问题分析与修复
原代码片段
#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
相关产品推荐
相关产品推荐

