Не понятно поведение кода заполнения массива по диагонали
Не могу понять почему 2d-массив ext_right_x полностью заполняется единицами, когда должна быть занята только диагональ. (функция make_basis_table, второй цикл for)
Код программы:
const print = require('./utils/print.js').print;
const scan = require('./utils/scan.js').scan;
function parse_vals(vals) {
let res = {};
let args = vals.split(' ');
for (el of args) {
if (el.length > 2 && el[el.length-2] == 'x') {
res['x'+el[el.length-1]] = +el.split('x')[0];
}
else if (['=','<','>','<=','>='].includes(el)) {
res['lim_sign'] = el;
}
else if (('min','max').includes(el)) {
res['tar_func'] = el;
}
else if (el != '->' && el != '+') {
res['free_val'] = +el;
}
}
return res;
}
function show_limits(limits) {
for (el of limits) {
let x = 0;
for (tokname in el) {
if (tokname.startsWith('x')) {
print(el[tokname]+tokname)
if (x < Object.keys(el).length-3) {
print('+', {start:' '});
x += 1;
}
print({end:' '});
}
else {
x = 0
print(el[tokname], end=' ');
}
}
print({end:'\n'});
}
}
function get_x(obj) {
let res = [];
for (n in obj) {
if (n.startsWith('x')) {
res.push(obj[n]);
}
}
return res;
}
function get_func() {
let line = scan();
return parse_vals(line);
}
function get_limits() {
let limits = [];
let line = '0';
while (line != '') {
line = scan();
if (line != '') {
limits.push(parse_vals(line));
}
}
return limits;
}
function set_canonical(limits) {
let i = Object.keys(limits[0]).length-1;
for (cur of limits) {
let temp_lim_sign = cur['lim_sign'];
let temp_free_val = cur['free_val'];
delete cur['lim_sign'];
delete cur['free_val'];
cur['x'+i] = 1;
cur['lim_sign'] = temp_lim_sign;
cur['free_val'] = temp_free_val;
i++;
}
return limits
}
function set_positive(limits) {
for (let i = 0; i < limits.length; i++) {
if (limits[i]['free_val'] < 0) {
print((i+1)+"-ое неравенство содержит отрицательный свободный член.\nУмножение всего неравенства на -1:")
for (el in limits[i]) {
if (typeof limits[i][el] == 'number') {
limits[i][el] *= -1;
}
}
}
}
return limits;
}
function make_basis_table(func, limits) {
let func_x = get_x(func);
let limits_x = [];
limits.forEach((row) => {
limits_x.push(get_x(row));
});
console.log(func_x);
console.log(limits_x);
let w = (Object.keys(limits_x[0]).length-1)+(limits_x.length);
let offset = w - limits_x.length;
let right_x = [];
let ext_right_x = new Array(limits_x.length).fill(new Array(offset).fill(0));
for (let i = 0; i < limits_x.length; i++) {
right_x.push(limits_x[i][limits_x[i].length-1]);
limits_x[i].pop();
}
for (let i = 0; i < right_x.length; i++) {
ext_right_x[i][i] = right_x[i];
}
console.log(right_x);
console.log(ext_right_x);
}
function main(argv) {
print('Z = ')
let func = get_func();
console.log(func);
print("Ограничения:",{start:'\n',end:'\n'});
let limits = get_limits();
console.log(limits);
print("Приведение к каноничному виду:",{start:'\n',end:'\n'});
limits = set_canonical(limits);
console.log(limits);
show_limits(limits);
print("Новые ограничения:",{start:'\n',end:'\n'});
limits = set_positive(limits);
console.log(limits);
show_limits(limits);
b_tbl = make_basis_table(func, limits);
}
main(process.argv);
Так работает:
let arr = [[0,0,0],[0,0,0],[0,0,0]];
let to = [1,1,1];
for (let i = 0; i < to.length; i++) {
arr[i][i] = to[i];
}
console.log(arr);