Главная
Простейшие операторы
Операторы условия
Циклы
Массивы
Массивы 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 и сообщить
имеется ли такое число в массиве.
|