Главная
Простейшие операторы
Операторы условия
Циклы
Массивы
Массивы II
Строки
Функции I
Функции II

Одномерные массивы

Почему-то для многих массивы считаются самой сложной темой. Не знаю, лично для меня труднее были циклы. Начнем, конечно, с определения массива. Массив - это группа отдельных переменных с общим названием (каждая такая отдельная переменная называется элементом массива).
Отдельная переменная Variable1 Массив Array1
Массив можно задать несколькими способами:

<script>
var a1=new Array();
var a2=new Array(7);
var a3=new Array("Пн", "Вт", "Ср", "Чт", "Пт","Сб", "Вс");
var a4=[123, 223, 54567, 789, 0]
</script>
Первый массив пустой и для его дальнейшего заполнения нужно будет обратиться к каждому элементу:
<script>
a1[0]="А";
a1[1]="Б";
a1[2]="В";
a1[3]="Г";
</script>
Нумерация элементов массива, при любом способе объявления, начинается с нуля. Массивы, на первый взгляд, могут показаться ненужной выдумкой, но это отнюдь не так: все программирование держится на взаимодействии массивов и циклов. Это взаимодействие мы сейчас и рассмотрим.
Нередко нужно, чтобы пользователь ввел, ну, допустим, 10 значений переменных. Создавать prompt-ом 10 переменных было бы очень долго, а вот как это можно сделать с помощью цикла и массива:
<script>
var a=new Array(10);
for (i=0; i<10; ++i) {
a[i]=prompt("Введите какое-нибудь значение");
};
</script>
Обратите внимание, что размер массива указывается в круглых скобках (Array(10)), а обращение к элементу идет в квадратных скобках (a[0]) Упражнение 14
Как всегда, начинаем с простого. Пользователь вводит номер текущего дня (ну, можно и месяца), а программа выдает ему словесное название дня. Например: 1 - "Понедельник"; 4 - "Четверг".
Решение здесь не публикуется, но несколько подсказок будет. Очевидно, нам нужен массив. Наиболее удачно будет заполнить его названиями дней неделей сразу же при объявлении. После чего остается только спросить у пользователя номер дня и вывести на экран элемент массива с соответствующим номером. Решайте...
Но и пользователю и, тем более, программисту надоест постоянно заполнять массив вручную. Для неручного способа существует, как вы помните, генератор псевдослучайных чисел. Заполним некоторый массив десятью случайными числами из диапазона (0; 1):
<script>
a=new Array(10);
for (i=0; i<10; ++i) {
a[i]=Math.random();
}
</script>
Мало заполнить - надо бы еще и вывести этот массив на экран. Опять несколько способов:
<script>
for (i=0; i<10; ++i) {
alert(a[i]);
}
//Или:
alert(a);
</script>
Первый способ - поэлементный способ, а во втором - элементы массива выводятся через запятую.
Упражнение 15
Требуется вывести без повторений двадцать чисел больших нуля, но меньших 100. Довольно интересная задачка. Мы будем решать ее в два этапа. На первом этапе мы зададим эти двадцать случайных чисел и определим, есть ли среди них повторения. А для этого каждый элемент массива нам надо сравнить со всеми остальными, и если какие-то два элемента окажутся равными, то изменим значение какой-либо посторонней переменной - в общем, лучше рассмотреть код.
<script>
var a=new Array(20), povtor=false;
for (i=0; i<20; ++i) {
a[i]=Math.round(Math.random()*100); //заполнили массив
}
for (i=0; i<19; ++i) { //будем сравнивать каждый элемент массива со всеми следующими. Но последний элемент сравнивать будет не с чем, поэтому 1-й цикл выполняется с 19-ю элементами
for (j=i+1; j<20; ++j) { //сравнение происходит со следующего элемента и до конца
if (a[j] == a[i]) {povtor=true} //как только встретим повтор, сообщим об этом переменной povtor
}
}
if (povtor) {alert("Повторы есть")}
else {alert("Повторов нет")}
</script>
То, что стоит в строке после знаков // - комментарий, который программа никогда не выполняет, но зато пользователю комментарии могут очень сильно помочь, особенно, когда вы откроете свою программу через несколько месяцев: все забывается, а комментарии помогут вспомнить и ввести вас в курс программы.
Для второго этапа будем делать все то же самое, только добавиться еще один цикл, ну и начальное значение переменной povtor есть смысл поменять на противоположное:
<script>
var a=new Array(20), povtor=true;
for (i=0; i<20; ++i) {
a[i]=Math.round(Math.random()*100);
}
while (povtor) { //цикл для выполнения в случае наличия повторов
for (i=0; i<19; ++i) { //начинается сравнение
for (j=i+1; j<20; ++j) {
if (a[j] == a[i]) {a[j]=Math.round(Math.random()*100)} //заново определяем повторяющийся элемент массива
else {povtor=false} //сообщаем переменной povtor, что повторов не встретилось
}
}
}
alert(a); //выводим массив без повторов
</script>
Упражнение 16
Дано три массива размером 7 элементов: первый вводит пользователь; второй заполняется случайными числами от 1 до 10 000; третий является суммой двух предыдущих (первый элемент третьего массива равен сумме первого элемента первого массива и первого элемента второго массива)
Упражнение 17
"Арифметическая прогрессия". Пользователь вводит первый член арифметической прогрессии, ее разность и количество элементов. Задача программы вывести такую прогрессию на экран. Будем считать, что мы познакомились с массивами. На следующем уроке мы будем заниматься сортировкой массива, а для этого нам понадобится умение находить наибольший/наименьший элемент массива и умение менять местами два элемента массива. Подумайте, как это можно сделать.
Сортировка массива
А вот сегодня уже будет посложнее. Задача этого урока - отсортировать массив по возрастанию или по убыванию. В JavaScript есть похожий метод, но пользоваться им будет немногим проще, кроме того могут возникнуть некоторые проблемы.
Итак, зададим массив из десяти элементов и попробуем его рассортировать. Существует два алгоритма сортировки массивов. Первый, его называют еще пузырьковый, заключается в следующем:
1. Сравнивая первый элемент массива со всеми последующими, найти тот, который был бы меньше первого, и поменять их местами.
2. Сравнивая второй элемент массива со всеми последующими, найти тот, который был бы меньше второго, и поменять их местами.
3. Повторять подобные действия до конца массива.
Т.е. получается, что необходимо два вложенных цикла: мы берем элемент массива из первого цикла и сравниваем его с элементами другого цикла:
<script>
var a=new Array(10);
for (i=0; i<10; ++i) {
a[i]=Math.round(Math.random()*100);
} // ввели массив
for (i=0; i<10; ++i) {
for (j=i; j<10; ++j) {
if (a[i]>a[j]) { // в том случае, если встретили элемент, больший предыдущего,
zapas=a[i]; a[i]=a[j]; a[j]=zapas; //поменяли их местами
} // после этого большие элементы уходят в конец, а маленькие - в начало
} // т.обр. мы рассортировали массив в порядке возрастания
}
alert(a); // и вывели массив на экран
</script>
Перед рассмотрением циклов, рассмотрим способ перестановки двух элементов массива. (zapas=a[i]; a[i]=a[j]; a[j]=zapas;) Мы использовали переменную zapas - для чего? На житейском уровне это может выглядеть так: положите на стол, перед собой, две ручки или два карандаша - это два элемента массива. А теперь поменяйте ручки местами. Для этого вы должны будете взять на время ручку1 в руку, в это время переместить ручку2 и только после этого положить из руки ручку1 на бывшее место ручки2, и по-другому никак нельзя: перемещаемый объект должен всегда где-то хранится.


Теперь о самом алгоритме. Поначалу он может казаться немного невероятным - рассмотрим его "в действии":
Пусть у нас изначально был такой массив 5, 12, 17, 3, 1
Цикл начинается и первый элемент (5) начинает сравниваться со всеми остальными в поисках меньшего элемента. Первый такой элемент будет 3, соответственно массив принимает вид: 3, 12, 17, 5, 1
Но цикл с параметром j еще не закончен: он продолжается до конца массива. Т.е. первый элемент все еще продолжает сравниваться. Только теперь этот элемент не 5, а 3. И к концу выполнения цикла 3 заменится на 1: 1, 12, 17, 5, 3
Теперь начинается сравниваться второй элемент (12). В соседней ячейке: промежуточное изменение; вид массива к концу цикла 1, 5, 17, 12, 3;   1, 3, 17, 12, 5
--"-- 1, 3, 12, 17, 5;   1, 3, 5, 17, 12
  1, 3, 5, 12, 17
Для проверки можете попробовать вставить в цикл с j вывод массива на экран.
Возможно, второй способ покажется вам попроще:
1. Взять первый элемент и сравнить его со вторым: если первый больше, то поменять их местами
2. Взять второй элемент и сравнить его с третьим: если третий больше, то поменять их местами
3. Повторить эти действия с каждым элементом
В программе это будет выглядеть еще проще:
<script>
var a=new Array(10);
for (i=0; i<10; ++i) {
a[i]=Math.round(Math.random()*100);
}
for (i=0; i<10; ++i) {
for (j=0; j<9; ++j) {
if (a[j]>a[j+1]) { // меняем местами два соседних элемента,
zapas=a[j]; a[j]=a[j+1]; a[j+1]=zapas; //если первый из них больше второго
}
}
}
alert(a);
</script>
Заметьте, что второй цикл начинается с начала массива, а не с i-ого элемента, как это было в предыдущем способе. И заканчивается второй цикл предпоследним элементом. Ведь, действительно, если бы цикл работал со всеми элементами, то с чем бы сравнивался последний элемент, a[9]? Конечно же, с a[9+1], т.е. с a[10], а значение такого элемента равно undefined, ибо массив объявлялся для элементов a[0]-a[9].
Если мы возьмем тот же массив, что и в предыдущем способе (см. таблицу), то в программе он будет изменяться следующим образом:
5, 12, 17, 3, 1

5, 12, 3, 17, 1 → 5, 12, 3, 1, 17

5, 3, 12, 17, 1 → 5, 3, 12, 1, 17

3, 5, 1, 12, 17

3, 1, 5, 12, 17 → 1, 3, 5, 12, 17
Упражнение 18
Отсортируйте массив, который состоит из нескольких фамилий, введенных пользователем (пользователь вводит фамилии до тех пор, пока ему не надоест и он не введет ничего ("")). При этом пользователь должен также сам определить как ему отсортировать: в алфавитном порядке или в обратном. Для одного из вариантов решения вам может понадобится свойство определения длины массива - a.length (это выражение должно быть присвоено какой-либо переменной), впрочем, этим свойством мы уже пользовались.
Упражнение 19
Повторение. Заполнить массив из тридцати элементов случайными числами от 0 до 100. Попросить пользователя ввести любое число от 0 до 100 и сообщить имеется ли такое число в массиве.

Hosted by uCoz