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
相关产品推荐
相关产品推荐

