Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   массив.splice (https://javascript.ru/forum/misc/41741-massiv-splice.html)

Anna77 27.09.2013 14:03

массив.splice
 
подскажите, как вставить в массив элемент? hfdysq 0

Makarov 27.09.2013 15:01

1. Отформатируй код: есть тэг JS
2. Объекты передаются по ссылке а не по значению. То есть если ты напишешь Arr2 = Arr1 а потом изменишь Arr2 то Arr1 у тебя тоже поменяется.
http://learn.javascript.ru/object
3. Если научишься пользоваться отладчиком, то твои вопросы станут куда более конкретны
http://learn.javascript.ru/debugging-chrome

Если ты это писала сама, тебе хватит) Впрочем я в этом сомневаюсь сильно)

Anna77 27.09.2013 15:47

спасибо за советы, пыталась писать сама, на определенном этапе не понимаю как сделать проверку if на отрицательные элементы массива

Makarov 27.09.2013 16:00

Да так и делать, только я бы на всякий случай к одному типу привел во избежание.
Пройдись отладчиком просто, посмотри где оно ведет себя не так как ты планируешь, а потом думай почему

Anna77 27.09.2013 16:33

отладчик просто зависает в определенном месте
вы имеете ввиду
if (Arr2[i] <== 0)
{
Arr2.splice(i<=0, 0, 0);
}

Makarov 27.09.2013 16:48

1. Почитай про splice. Ты какую-то фигню пытаешься сделать
http://javascript.ru/array/splice
2. А нужен ли тебе splice если исходный и результирующий массив могут быть разными?
3. Отладчик останавливается там где ты ему говоришь. Там где остановился можно посмотреть значения переменных чтобы понять что пошло не так, а потом двигать дальше

Demath 27.09.2013 17:00

Цитата:

Сообщение от Anna77
подскажите, как вставить в массив после каждого его отрицательного элемента элемент, равный нулю

Например, так

function Array1(A)
{
    var n = A.length;
    
    for (var i = 0; i < n; i++)
     { if (A[i] < 0)
        { for (var j = n-1; j >= i; j--) A[j+1] = A[j];
          A[i+1] = 0;
          i++; n++;
        }
     }

    return A;
}

alert( Array1([-1,1,2,-6,7,1,6,-7]) );

Anna77 27.09.2013 18:36

Спасибо большое!

Demath 27.09.2013 20:11

Цитата:

Сообщение от Demath (Сообщение 273932)
Цитата:

Сообщение от Anna77
подскажите, как вставить в массив после каждого его отрицательного элемента элемент, равный нулю

Например, так

function Array1(A)
{   var n = A.length;    
    for (var i = 0; i < n; i++)
     { if (A[i] < 0)
        { for (var j = n-1; j >= i; j--) A[j+1] = A[j];
          A[i+1] = 0;
          i++; n++;
        }
     }
    return A;
}
alert( Array1([-1,1,2,-6,7,1,6,-7]) );

Эта функция не сохраняет входной массив. Если же нужно, чтобы входной массив не изменялся, то так (даже лучше, т.к. без вложенного цикла, сложность алгоритма O(n))

function Array2(A)
{
    var n = A.length, B = [];
    
    for (var i = 0, j = 0; i < n; i++)
     { if (A[i] < 0)
        { B[j++] = A[i]; B[j++] = 0; }
       else B[j++] = A[i];
     }
    
    return B;
}

alert( Array2([-1,1,2,-6,7,1,6,-7]) );

Demath 27.09.2013 20:23

Цитата:

Сообщение от Anna77
Если не сложно, подскажите, пожалуйста, как написать программу, определяющую, является ли массив симметричным, т. е. совпадает ли его первый элемент с последним, второй с предпоследним и т. д.

Например, так

function isSymmArray(A)
{
    var n = A.length, k = Math.floor(n/2);
    
    for (var i = 0; i < k; i++)
     { if (A[i] !== A[n-1-i]) return false; }
    
    return true;
}

Anna77 27.09.2013 20:33

Да, нужно было сохранять первоначальный массив, спасибо за помощь!

Demath 27.09.2013 20:58

Цитата:

Сообщение от Anna77
Нужно определить количество максимальных элементов в массиве из 10 элементов

У Вас почти верно.

function nummax(Arr)
{
    var n = Arr.length, max = Arr[0], count = 1;
    
    for (var i = 1; i < n; i++)
     { if (Arr[i] > max)
        { max = Arr[i]; count = 1; }
       else
        { if (Arr[i] == max) count++; }
     }

    return [max,count];
}

// Пример вызова функции

var A = nummax([-1,7,2,-6,7,1,7,-7,4,5]);
alert("Максимальное значение массива: " + A[0] + ", его количество: " + A[1]);

Anna77 27.09.2013 22:02

Спасибо Вам большое! Приятно, что есть такие отзывчивые люди!

user222 28.09.2013 01:10

Цитата:

Сообщение от Anna77 (Сообщение 273983)
Скажите, а как сделать, чтобы в конце отображался введенный пользователем массив(из prompt)? и исходя из него выбиралось nummax?

Я тут мимо проходил, вот набросал функцию. Вызываете её, она отдаёт вам массив и можете делать с ним всё, что душе угодно.
function get_array_from_user() {
    var ret = []; // то, что будем возвращать
    var err = ""; // будем хранить ошибку для показа пользователю
    var str = ""; // объявляем строку

    while(str.indexOf('!') < 0) { 	// пока в ответе пользователя нет "!". Если строка "20!", то 20 будет добавлен в массив и цикл завершится
        str = prompt((err?err + '\n\n' : '') + //если есть ошибка, показываем её
            "Введите элемент массива, завершение ввода - символ '!':");
        err = ''; // обнуляем ошибку
        var num = parseInt(str);

        // тут обрабатываем ошибки
        if(str === null) {	// если нажата отмена. По идее лучше бы завершить ввод, но мы ждём "!".
        					// Eсли хотите завершить, замените "continue" на "break"
			err = 'Ошибка: Вы отменили ввод!'; // записываем ошибку
			str = ''; 	// иначе у null нет свойства indexOf и скрипт авершится с ошибкой без результатов.
            continue; // обрываем "круг" цикла.
        } else
        if(!str) { // если пользователь ничего не ввёл
        	err = 'Ошибка: Вы ничего не ввели!'; // записываем ошибку
            continue; // обрываем "круг" цикла.
        } else
        if(isNaN(num)) { //если не число
            err = 'Ошибка: "' + str + '" не является числом!'; // записываем ошибку
            continue; // обрываем "круг" цикла.
        }

        ret.push(num); // если всё нормально, то записываем в массив
    }

    return ret;
}

// демонстрация:
var user_array = get_array_from_user(); // записываем в user_array то, что вернёт наша функция
alert('Пользователь ввёл: ' + user_array);

Anna77 28.09.2013 01:48

Подскажите, почему в конце не выводится document.write?

user222 28.09.2013 02:12

Anna77,
Я вообще не уверен как у вас это работает.
У вас "break;" вынесен за пределы if'a. А после него фигурные скобки. Вы толи else хотели там, толи другой if
И не понятно что вообще делает надпись "Массив симметричный" в цикле проверки. Только после окончания проверки мы может сказать симметричен массив, или нет.
Видимо вы хотели вот так
var Arr = [];
var i = 0;
do
{
    var str = prompt("Введите элемент массива, завершение ввода - символ '!':");
    if (!isNaN(+str) && +str == parseInt(str))
    {
        Arr[i++] = str;
    }
}
while(str !== "!")
document.write("Исходный массив Arr: " + Arr + "<br/>");
var x = true;
var n = Arr.length;

for (var i = 0; i < (n-1)/2; i++)
{
    if (Arr[i] !== Arr[n-1-i])
    {
        x = false;
        break;
    } 
}

if(x) {
	document.write("Массив симметричный");
}else{
	document.write("Массив несимметричный");
}

Demath 28.09.2013 02:27

Цитата:

Сообщение от Anna77 (Сообщение 273949)
Если не сложно, подскажите, пожалуйста, как написать программу, определяющую, является ли массив симметричным, т. е. совпадает ли его первый элемент с последним, второй с предпоследним и т. д.

Цитата:

Сообщение от Anna77 (Сообщение 273993)
Подскажите, почему в конце не выводится document.write, когда массив симметричный?
var Arr = [];
var i = 0;
do
{
var str = prompt("Введите элемент массива, завершение ввода - символ '!':");
if (!isNaN(+str) && +str == parseInt(str))
{
Arr[i++] = str;
}
}
while(str !== "!")
document.write("Исходный массив Arr: " + Arr + "<br/>");
var x = true;
var n = Arr.length;

for (var i = 0; i < (n-1)/2; i++)
{
if (Arr[i] !== Arr[n-1-i])
{
x = false;
document.write("Массив несимметричный" + "<br/>");
} break;
{
document.write("Массив симметричный");
}
}

Вот так примерно

var Arr = [], i = 0;

do { var str = prompt("Введите элемент массива, завершение ввода - символ '!':");
     if (!isNaN(+str) && +str == parseInt(str)) Arr[i++] = str;
   } while (str !== "!");
   
document.write("Исходный массив: Arr = [" + Arr + "]<br/>");

var x = "симметричный",
    n = Arr.length,
    k = (n%2==1) ? n/2 : (n-1)/2;

for (var i = 0; i < k; i++)
 { if (Arr[i] !== Arr[n-1-i]) 
    { x = "несимметричный"; break; }
 }

document.write("Массив " + x);

user222 28.09.2013 02:51

Anna77,
В общем вот вам готовый результат. Симметричность проверяется другим "необычным" способом. Всё прокомментировал, изучайте.
function get_array_from_user() { // функция получения массива пользователя
    var ret = []; // то, что будем возвращать
    var err = ""; // будем хранить ошибку для показа пользователю
    var str = ""; // объявляем строку

    while(str.indexOf('!') < 0) { 	// пока в ответе пользователя нет "!". Если строка "20!", то 20 будет добавлен в массив и цикл завершится
        str = prompt((err?err + '\n\n' : '') + //если есть ошибка, показываем её
            "Введите элемент массива, завершение ввода - символ '!':");
        err = ''; // обнуляем ошибку
        var num = parseInt(str);

        // тут обрабатываем ошибки
        if(str === null) {	// если нажата отмена. По идее лучше бы завершить ввод, но мы ждём "!"
            // Eсли хотите завершить, замените "continue" на "break"
            err = 'Ошибка: Вы отменили ввод!'; // записываем ошибку
            str = ''; 	// иначе у null нет свойства indexOf и скрипт авершится с ошибкой без результатов.
            continue; // обрываем "круг" цикла
        } else
        if(!str) { // если пользователь ничего не ввёл
            err = 'Ошибка: Вы ничего не ввели!'; // записываем ошибку
            continue; // обрываем "круг" цикла
        } else
        if(isNaN(num)) { //если не число
            err = 'Ошибка: "' + str + '" не является числом!'; // записываем ошибку
            continue; // обрываем "круг" цикла
        }

        ret.push(num); // если всё нормально, то записываем в массив
    }

    return ret;
}

function is_symmetrical(arr) { // функция проверки симметричности
    var len = arr.length; // получаем длину массива
    if(len <= 1) return false; // если в массиве меньше 2 элементов, нам проверять нечего
    var to = Math.floor(len/2); // получаем половину длины
    var arr_1 = arr.slice(0, to).reverse(); // отрезаем первую половину от массива и разворачиваем его наоборот. Был 123 станет 321
    if(len%2) to++; // если длина не кратна двум, то пропускаем средний элемент
    var arr_2 = arr.slice(to); // отрезаем вторую половину
    return !(arr_1<arr_2 || arr_2<arr_1); // возвращаем результат проверки
}

//демо
var user_arr = get_array_from_user(); // получаем массив пользователя
var symmetrical = is_symmetrical(user_arr); // проверяем симметричность 

alert('Пользователь ввёл: ' + user_arr + '\nМассив симметричен: ' + (symmetrical?'Да':'Нет')); // выводим результат

Anna77 28.09.2013 19:19

Спасибо огромное!!!:thanks:

Anna77 28.09.2013 19:22

Благодарю за ценную и исчерпывающую информацию!!!Четко и доступно!

Anna77 28.09.2013 19:24

Спасибо! Теперь все работает!

Anna77 28.09.2013 20:26

Спасибо!


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