Вы должны показать схему индексирования, используемую для печати выходных данных (т.е. как вы ожидаете, что индексы работают): ваш выбор использования вектора вместо матрицы затруднит корректировку кода.Конечно, я вижу следующие моменты, которые не имеют четкой связи с шаблоном ввода:
1) с каждым прочитанным числом вы увеличиваете индекс rowNum.Вместо этого строка должна быть увеличена с шагом 1, 1 + 2, 1 + 2 + 3, ...
2) colNum должен находиться в диапазоне от 0 до текущего rowNum, вместо этого предполагается, что он равен 0,1 * 1005.*
3) нет возможности заполнить строку (скажем, первую), прежде чем читать (скажем, последнюю).Вы могли бы сделать, если бы ввод был 1 2 3 4 1 6 7 1 9 1
, все эти точки связаны и происходят из-за неправильного представления данных, что усложняет тривиальную задачу.
В C ++ очень эффективным способом решения этих проблем является сокрытие данных: подумайте, как легко мы можем написать класс, который дает правильное логическое представление и не тратит пространство:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
template <class T = double>
class upper_triangular_matrix
{
std::vector<T> Matrix;
public:
upper_triangular_matrix(std::string input)
{
// trade time for space: store the values, compute indexing
std::replace(input.begin(), input.end(), ',', ' ');
std::istringstream inputStream(input);
T value;
while (inputStream >> value)
Matrix.push_back(value);
// validate size: ok 1,1+2,1+2+3 etc
}
T operator()(int r, int c) const
{
// compute indexing accounting for miss duplicated
if (c > r)
std::swap(c, r);
int p = 0, n = 1;
while (r > 0)
{
p += n++;
r--;
}
return Matrix[p + c];
}
};
int main()
{
upper_triangular_matrix<> m("1,2,1,3,6,1,4,7,9,1");
for (int r = 0; r < 4; ++r)
{
for (int c = 0; c < 4; ++c)
std::cout << m(r, c) << ' ';
std::cout << std::endl;
}
}
при запуске, этоотпечатки
1 2 3 4
2 1 6 7
3 6 1 9
4 7 9 1