Снежная лавина
Вот задача для болельщика: отсортировать команды в турнирной таблице чемпионата по убыванию набранных ими очков. Команд немного, всего 16. После каждого тура количество очков меняется, и таблица сортируется заново. Корпеть над этим вручную? – это не для нас! Итак, будущая программа должна принимать с клавиатуры очки, набранные командами, и распечатывать команды в порядке убывания этих чисел. При этом набранные очки мы будем вводить всегда в одном и том же порядке.
Сделаем это сначала для двух команд, пусть ими будут «Динамо» и «Спартак». Сортировка двух команд – что может быть проще?
{ ввод и сортировка двух команд (в программе 14 строк) }
var T1, T2 : integer;
begin
Readln (T1, T2); { Ввод очков для «Динамо» и «Спартак» }
if T1>T2
then begin
Writeln('1.Динамо');
Writeln('2.Спартак');
end
else begin
Writeln('1.Спартак');
Writeln('2.Динамо');
end;
Readln;
end.
Здесь для каждой из команд отведена переменная, хранящая набранные очки: T1 – для «Динамо» и T2 – для «Спартака». Вариантов расстановки всего два, поэтому и программа очень проста – всего 14 строк, не считая комментария.
Теперь добавим в чемпионат команду «Зенит». Вариантов расстановки стало втрое больше – шесть, и программа заметно усложнилась, вот она.
{ сортировка трех команд (в этой программе 45 строк) }
var T1, T2, T3 : integer;
begin
Readln (T1, T2, T3); { «Динамо», «Спартак», «Зенит» }
if (T1>T2) and (T1>T3)
then begin
Writeln('1.Динамо');
if T2>T3
then begin
Writeln('2.Спартак');
Writeln('3.Зенит');
end
else begin
Writeln('2.Зенит');
Writeln('3.Спартак');
end
end
else begin
if (T2>T1) and (T2>T3)
then begin
Writeln('1.Спартак');
if T1>T3
then begin
Writeln('2.Динамо');
Writeln('3.Зенит');
end
else begin
Writeln('2.Зенит');
Writeln('3.Динамо');
end
end
else begin
Writeln('1.Зенит');
if T1>T2
then begin
Writeln('2.Динамо');
Writeln('3.Спартак');
end
else begin
Writeln('2.Спартак');
Writeln('3.Динамо');
end
end
end;
Readln;
end.
Здесь уже 45 строк, что втрое больше, чем для двух команд. С добавлением последующих команд программа продолжит разбухать, как снежный ком. Для четырех команд она станет длиннее ещё в 4 раза (180 строк), для пяти – ещё в 5 раз (900 строк) и так далее. Дойдя до шестнадцати команд, мы насчитаем в программе триллионы строк. А ведь триллион – это «всего лишь» миллион миллионов! Скорей свернем с этой гибельной тропы, пока снежная лавина не накрыла нас с головой!
А где же волшебная палочка?
Вы ощущаете причину трудностей? В моих решениях нет циклов, способных выполнять огромное количество однообразных действий. Так, например, одним оператором цикла печатается хоть тысяча, хоть миллион чисел. Увы! Применить цикл к переменным с именами T1, T2 и T3 не получится. Хотя цифры в этих именах означают для нас порядковые номера команд, для компилятора они – всего лишь часть имени переменной, и не более. Как же втолковать компилятору то, чего мы добиваемся нумерацией переменных?
Для этого есть особый тип данных – массив переменных или, проще – массив. Вот она, спасительная волшебная палочка!
Массивы вокруг нас
Массив объединяет несколько однотипных переменных под одним общим именем. Отдельные переменные в массиве называют его элементами, и доступ к ним возможен по их номерам. Массивы придумали отнюдь не программисты. Возьмите любую спортивную команду – футбольную или хоккейную. Здесь, кроме фамилии, игрок снабжен номером, который лучше виден на поле. И это не единственный пример массива. Если отдельную переменную уподобить ящику с хранящейся в нём информацией, то массив переменных будет комодом с пронумерованными ящиками (рис. 88).
Рис.88 – Примеры простых переменных (слева) и массивов (справа)
Итак, массив – это собранные в одну команду переменные. Они получают общее на всех имя – имя своей команды. А внутри команды каждая переменная – элемент массива – обладает своим номером. Ну, чем не игроки?
Читать дальше