Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Калькулятор матриц JS (https://javascript.ru/forum/misc/68533-kalkulyator-matric-js.html)

Dani_Traxo 22.04.2017 16:35

Калькулятор матриц JS
 
Всем привет! Пишу калькулятор матриц, столкнулся с проблемой, что в массив arrResult записывается значение NaN. Что я упустил, подскажите пожалуйста?
//узнаем размер матрицы
	while (a==null){
	var a =+prompt("Размер матрицы A");
	if(a<2 || a>6)
		{
			alert("Ошибка, введите размер матрицы A снова");
			a = null;
		};
	};
	while (b==null){
	var b =+prompt("Размер матрицы B");
	if(b<2 || b>6)
		{
			alert("Ошибка, введите размер матрицы B снова");
			b = null;
		};
	};
	//заполняем массив матрицы данными
	var sizeA = a*a;
	var sizeB = b*b;
	var sizeResul= a*b;
	var n = 0;
	var arrA = [];
	var arrB = [];
	var arrResult = [];
	var br=0;
	for(i=0;i<a; i++){
		arrA[i] = new Array();
			for(j=0; j<a; j++){

				arrA[i][j] =+prompt("Введите "+ i +" "+ j +" элемент матрицы A");
			}
	}
	for(i=0;i<b; i++){
		arrB[i] = new Array();
			for(j=0; j<b; j++){
			
				arrB[i][j] =+prompt("Введите "+ i +" "+ j +" элемент матрицы B");
			}
	}
	//считаем произведение матриц
	for(i=0;i<a;i++){
		arrResult[i] = new Array();
		for(k=0;k<arrA.length;k++){
			for(j=0;j<b; j++){
			arrResult[i][j] =+ arrA[i][k]*arrB[k][i];
			}
		}
	}
	//выводим результат на экран
	var tableA = document.createElement('table');
	var str ="";
	document.body.innerHTML += "Матрица А: <br>";
	for( i=0; i<a; i++){
		for( j=0; j<b; j++){
		if(br==a){
			str+="<tr><td>" + arrA[i][j] ;
			br=1;
		}
		else{
			str+="<td>" + arrA[i][j] +"</td>";
			br++;
		}
		tableA.innerHTML=str;
		}
	}
	document.body.appendChild(tableA);

	var tableB = document.createElement('table');
	str ="";
	br=0;
	document.body.innerHTML += "Матрица B: <br>";
	for( i=0; i<b; i++){
		for( j=0; j<b; j++){
		if(br==b){
			str+="<tr><td>" + arrB[i][j] ;
			br=1;
		}
		else{
			str+="<td>" + arrB[i][j] +"</td>";
			br++;
		}
		tableB.innerHTML=str;
		}
	}
	document.body.appendChild(tableB);

	var table = document.createElement('table');
	document.body.innerHTML += "<br>Итоговая матрица: <br>";
	str ="";
	br=0;
	for( i=0; i<arrResult.length; i++){
		for( j=0; j<arrResult.length; j++){
		if(br==arrResult.length){
			str+="<tr><td>" + arrResult[i][j] ;
			br=1;
		}
		else{
			str+="<td>" + arrResult[i][j] +"</td>";
			br++;
		}
		table.innerHTML=str;
	}
}
	document.body.appendChild(table);

Nexus 22.04.2017 17:32

http://javascript.ru/number.nan
Вероятно произвели математическую операцию числа и строки.

рони 22.04.2017 17:33

Dani_Traxo,
может при разном размере матриц вы умножаите несуществующие элементы?

Dani_Traxo 22.04.2017 19:05

рони,
Не думаю, размер матриц задаю одинаковый
В этой строчке arrResult[i][j] =+ arrA[i][k]*arrB[k][i];
значение считается, но оно одинаковое во всей строке
а если вместо "=+" ставить "+=" то записывает в массив значение "NaN".
Но мне же нужен именно "+=", ведь элемент массива - это сумма произведений нескольких элементов матриц.

Nexus 22.04.2017 20:10

Dani_Traxo, https://jsfiddle.net/vf3sx8ur/1/
Если размеры массивов одинаковые, то, вроде, все нормально работает.
А если размеры разные, то в циклах происходит обращение к несуществующим ключам.

Dani_Traxo 22.04.2017 20:59

Nexus,
Он то считает, но считает не правильно. Потому что если ставить оператор =+, то в массив записывается последнее значение из цикла, а мне нужна сумма всех значений - в этом поможет оператор "+=", но он почему-то записывает в массив значение NaN, вот в чем мой вопрос.

Nexus 23.04.2017 10:15

Цитата:

Сообщение от Dani_Traxo (Сообщение 450756)
Nexus,
Он то считает, но считает не правильно. Потому что если ставить оператор =+, то в массив записывается последнее значение из цикла, а мне нужна сумма всех значений - в этом поможет оператор "+=", но он почему-то записывает в массив значение NaN, вот в чем мой вопрос.

https://jsfiddle.net/vf3sx8ur/2/
Это неудивительно, ведь изначально у вас
Код:

arrResult[i][j]===undefined
, а undefined+numeric=NaN.


Часовой пояс GMT +3, время: 22:02.