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

C++程序中如何从文本文件读取二维数组替代硬编码?

解决从文本文件读取三角形数组的问题

没问题,我帮你把硬编码的二维数组改成从文本文件读取的版本,同时保留你原来的动态规划逻辑。下面是完整的修改方案,我会一步步拆解说明:

第一步:定义输入文件格式

首先咱们得约定文本文件的格式,比如把三角形的每一行单独写一行,数字之间用空格分隔。举个例子,triangle.txt的内容可以是:

3
7 4
2 4 6
8 5 9 3

这对应一个4层的三角形,和你原来硬编码的N=4结构一致。

第二步:修改代码实现文件读取

我用C++的vector来动态存储数组(比静态数组更灵活,不用预先定义大小),替换原来的硬编码数组。修改后的完整代码如下:

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <algorithm> // 用于max函数

using namespace std;

bool checkPrimeNumber(int n) {
    bool flag = true;
    if (n <= 1) flag = false;
    for(int a = 2; a <= n/2; ++a) {
        if(n % a == 0) {
            flag = false;
            break;
        }
    }
    return flag;
}

int main() {
    // 1. 打开文件
    ifstream inputFile("triangle.txt");
    if (!inputFile.is_open()) {
        cerr << "无法打开文件!" << endl;
        return 1;
    }

    // 2. 读取三角形的每一行,构建二维vector
    vector<vector<int>> triangle;
    string line;
    while (getline(inputFile, line)) {
        vector<int> row;
        stringstream ss(line);
        int num;
        while (ss >> num) {
            row.push_back(num);
        }
        if (!row.empty()) { // 跳过空行
            triangle.push_back(row);
        }
    }
    inputFile.close();

    // 检查三角形是否合法(每一行的元素数应该等于行号+1,从0开始)
    bool isValid = true;
    for (int i = 0; i < triangle.size(); ++i) {
        if (triangle[i].size() != i + 1) {
            isValid = false;
            break;
        }
    }
    if (!isValid) {
        cerr << "文件格式错误:三角形的行元素数不符合要求!" << endl;
        return 1;
    }

    int n = triangle.size();
    if (n == 0) {
        cerr << "文件为空!" << endl;
        return 1;
    }

    // 3. 动态规划计算最大和(适配动态大小的数组)
    vector<int> sumRec(n);
    // 初始化最后一行
    for (int i = 0; i < n; ++i) {
        sumRec[i] = triangle[n-1][i];
    }

    // 从倒数第二行往上计算
    for (int i = n-2; i >= 0; --i) {
        for (int j = 0; j <= i; ++j) {
            sumRec[j] = triangle[i][j] + max(sumRec[j], sumRec[j+1]);
        }
    }

    cout << "三角形的最大路径和为:" << sumRec[0] << endl;

    // 如果需要使用你的checkPrimeNumber函数,比如判断最大和是否为质数
    if (checkPrimeNumber(sumRec[0])) {
        cout << "最大和是质数!" << endl;
    } else {
        cout << "最大和不是质数!" << endl;
    }

    return 0;
}

关键改动说明

  • 动态数组存储:用vector<vector<int>>代替原来的静态数组tri[N][N],这样不管三角形有多少层都能适配,不用修改代码里的常量。
  • 文件读取逻辑:
    • 用ifstream打开文件,先检查是否成功打开,避免程序崩溃。
    • 逐行读取文件内容,用stringstream分割每行的数字,存入对应的行vector。
    • 增加了格式校验,确保每一行的元素数量符合三角形的结构(第i行有i+1个元素)。
  • DP逻辑适配:把原来固定N=4的逻辑改成用n = triangle.size()来获取层数,让代码更通用。

注意事项

  • 确保你的文本文件和程序在同一目录下,或者在ifstream里写完整的文件路径(比如"C:/Users/xxx/triangle.txt")。
  • 如果文件里有多余的空行,代码会自动跳过,不影响读取。

内容的提问来源于stack exchange,提问作者salih dağdur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:27:16