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

C++ CNC激光切割模拟程序问题:命令解析与输出异常排查

CNC激光切割模拟程序问题修复

原代码核心问题

  • 方向逻辑完全错误:把R/L命令直接当成x坐标增减,没有维护激光朝向变量,导致激光只能朝右移动,仅输出直线。正确逻辑是激光有右、下、左、上四个方向,R为顺时针转90度,L为逆时针转90度。
  • 前进命令仅支持朝右:A n命令只处理x轴移动,未根据当前方向处理y轴变化,也未检查y轴边界。
  • 网格初始化不完整:仅初始化第一个元素为空格,其余元素值未定义,可能导致输出乱码。
  • 不符合作业参数:作业要求最大10行50列,原代码用了80列50行,超出限制。
  • 无无效命令处理:遇到非指定命令时未终止程序并报错。
  • 输出符号错误:作业要求用*标记切割位置,原代码用了#。
  • 未分函数实现:所有逻辑堆在main函数中,不符合模块化要求。

修复后的完整代码

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>

using namespace std;

// 定义激光朝向枚举
enum Direction { RIGHT, DOWN, LEFT, UP };

// 初始化网格所有元素为空格
void initGrid(char grid[][50], int rows, int cols) {
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            grid[i][j] = ' ';
        }
    }
}

// 处理右转:顺时针切换方向
Direction turnRight(Direction dir) {
    return static_cast<Direction>((dir + 1) % 4);
}

// 处理左转:逆时针切换方向
Direction turnLeft(Direction dir) {
    return static_cast<Direction>((dir + 3) % 4);
}

// 处理前进命令,返回是否越界
bool moveForward(char grid[][50], int rows, int cols, int& x, int& y, Direction dir, int steps, bool cutting) {
    for (int i = 0; i < steps; ++i) {
        // 切割状态下标记当前位置
        if (cutting) {
            grid[y][x] = '*';
        }
        // 根据方向移动并检查边界
        switch (dir) {
            case RIGHT:
                if (x + 1 >= cols) return false;
                x++;
                break;
            case DOWN:
                if (y + 1 >= rows) return false;
                y++;
                break;
            case LEFT:
                if (x - 1 < 0) return false;
                x--;
                break;
            case UP:
                if (y - 1 < 0) return false;
                y--;
                break;
        }
    }
    // 标记最后一步的位置(切割状态下)
    if (cutting) {
        grid[y][x] = '*';
    }
    return true;
}

// 打印最终网格
void printGrid(char grid[][50], int rows, int cols) {
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            cout << grid[i][j];
        }
        cout << endl;
    }
}

int main() {
    const int MAX_ROWS = 10;
    const int MAX_COLS = 50;
    char grid[MAX_ROWS][MAX_COLS];
    int x = 0, y = 0;
    bool cutting = false;
    Direction currentDir = RIGHT;
    char command;

    // 初始化网格
    initGrid(grid, MAX_ROWS, MAX_COLS);

    // 读取文件并打开
    string fileName;
    cout << "Enter the file name: ";
    cin >> fileName;

    ifstream file(fileName);
    if (!file) {
        cout << "Error, cannot open file." << endl;
        return EXIT_FAILURE;
    }

    while (file >> command) {
        bool isValid = true;
        switch (command) {
            case 'I':
                cutting = true;
                break;
            case 'O':
                cutting = false;
                break;
            case 'R':
                currentDir = turnRight(currentDir);
                break;
            case 'L':
                currentDir = turnLeft(currentDir);
                break;
            case 'A': {
                int steps;
                // 检查步数是否合法
                if (!(file >> steps) || steps <= 0 || steps > 80) {
                    cout << "Error: Invalid step count for 'A' command." << endl;
                    isValid = false;
                    break;
                }
                // 执行前进并检查边界
                if (!moveForward(grid, MAX_ROWS, MAX_COLS, x, y, currentDir, steps, cutting)) {
                    cout << "Error: Movement out of grid bounds." << endl;
                    isValid = false;
                }
                break;
            }
            default:
                cout << "Error: Invalid command '" << command << "'." << endl;
                isValid = false;
                break;
        }
        // 遇到错误立即终止
        if (!isValid) {
            file.close();
            return EXIT_FAILURE;
        }
    }

    file.close();
    printGrid(grid, MAX_ROWS, MAX_COLS);

    return EXIT_SUCCESS;
}

修复关键点说明

  1. 新增Direction枚举维护激光朝向,通过turnRight/turnLeft函数处理方向切换逻辑。
  2. initGrid函数统一初始化网格为空格,避免未定义值问题。
  3. moveForward函数根据当前方向处理x/y坐标变化,同时检查边界,切割状态下标记路径为*。
  4. 添加了无效命令、非法步数、越界的错误处理,完全符合作业要求。
  5. 调整网格参数为作业要求的最大10行50列。
  6. 拆分功能为多个独立函数,满足模块化实现要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:05:01