Паскаль. Массивы, строки

Паскаль. Массивы, строки

До этого урока мы уже успели изучить различные режимы в Pascal’e, основы построения программы, типы данных и некоторые другие весьма полезные темы. Сегодня мы рассмотрим сложные типы величин – массив и строки. Но начнем с массива.

Когда мы проходили типы данных, была приведена такая табличка:

Итак, для начала определение. Массивом принято называть сложный тип данных, который представляет из себя таблицу, состоящую из элементов одного и того же типов.

Для описания массива необходимо в блоке описания переменных задать имя массива, после двоеточия поставить слово ARRAY (именно оно является «указателем» на то, что это массив), далее указываем диапазон индекса массива (грубо говоря, ячейки с какими номерами будут существовать в нашем массиве) и в конце задаем тип элементов. В качестве примера возьмем массив, который будет содержать названия дней недели. Его описание будет выглядеть следующим образом:

Листинг : Описание

Var week:ARRAY [1..7] of string;

Пояснение. Строковый тип выбран только потому, что в данном массиве будет содержаться название дней недели. В любых других случаях можно использовать любой тип данных (естественно, надо делать акцент на разумности использования того или иного типа данных).

Мы описали массив, но он пока что пуст. Для того, чтобы заполнить его, необходимо выполнить действие, которое называется инициализацией (проще говоря, присваивание всем элементам массива начальных значений). Можно водить элементы вне цикла и в цикле. Второй вариант более рационален, и потому предпочтительнее (именно его мы и рассмотрим).

Листинг : Описание

For I:=1 to 7 do begin writeln (‘введите ’,I,’-ый элемент массива’); readln (week<I>); end;

Нетрудно заметить, что возле имени массива появилась странная переменная в каких-то квадратных скобках. Таким образом производится выбор (а в нашем случае присвоить выбранному элементу значения) конкретного элемента массива. Стоит сделать оговорку, что в данном случае в цикле и этих скобках одинаковая переменная стоит не случайно: это позволит производить ввод данных в массив последовательно (то есть сначала 1, потом 2 и так далее). Если, например, прописать такой кусок кода:

Листинг : Описание

Writeln (week[1]); то на экране появится первое значение массива week. То есть «Понедельник», если мы к этому моменту провели инициализацию массива.

Мы запрашивали значение элементов массива, а можно предоставить эту операцию программе.

Листинг : Описание a[1]:=23; a[2]:=43;

В этом случае числа не связаны между собой и их значения точно не определены. Если необходимо, чтобы числа не были связаны между собой, а их значения не определены точно, но лежали на определенном отрезке, то надо воспользоваться следующей конструкцией:

Листинг : Описание

For I:=1 to 7 do

Begin x:=random (n); number<I>:=x+k; end;

Следует отметить, что number:=x+k; - это присвоение текущему элементу массива значения из отрезка х+k. k - начальное (минимальное) значение отрезка, а x+k - конечное (максимальное).

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

Листинг : Описание a[0]:=0;

For I:=1 to 7 do

Begin a<I>:=a[I-1]+p;

End;

Примечание: запись a[I-1] означает предыдущий элемент массива.

Вывод значений элементов происходит аналогично:

Листинг : Описание

For I:=1 to 7 do writeln (week<I>);

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

Мы рассмотрели одномерный массив, но есть еще и двумерный. Отличие двумерного массива от одномерного заключается только в том, что обыкновенный одномерный массив – строка, а двумерный – таблица чисел (матрица).

Описание двумерного массива не сильно отличается от описания одномерного массива:

Листинг : Описание

Var x:ARRAY [1..4,1..23] of integer;

Нетрудно заметить, что описывается количество элементов в строках и в столбцах.

Инициализация же массива (ее рациональный вариант) происходит не в одном цикле, а в двух (один цикл вложен в другой).

Также в рамках этого урока мы рассмотрим строки (string). Почему? Спросите Вы. Кто-то может удивиться, но строка представляет собой особую форму одномерного массива символов, имеющую существенное отличие. Массив символов имеет фиксированную длину определяющуюся при его описании. Строка имеет две разновидности длины:

1. Общая длина строки, которая характеризует размер памяти, выделяемый строке при описании;

2. Текущая длина строки (всегда меньше или равна общей длине), которая показывает количество смысловых символов строки в каждый конкретный момент времени.

Максимальная длина строки может быть 255 символов. Также можно сказать, что каждый символ требует памяти в 1 байт.

Описание переменной строкового типа происходит также как и любой другой переменной, но с одним небольшим отличием: может быть указана длина строки.

Листинг : Описание var s:string [n]; где, как нетрудно догадаться, n – длина строки.

Какие действия доступны с переменными строкового типа.

Очень полезная функция – Length (s), которая определяет длину строки s.

Листинг : Описание

L:=Length (s);

Процедура, позволяющая из строки удалить несколько нужных нам символов, скорее всего, тоже найдет применение в ваших программах.

Листинг : Описание

Delete (s, I,c); где s – строковая переменная, I – стартовая позиция (с которой удалять), c – количество удаляемых символов.

Также довольно удобная функция вставки подстроки в заданную строку:

Листинг : Описание

Insert (sn, s,i); где sn – подстрока, которую необходимо вставить, s – строка, в которую необходимо вставить подстроку, I – символ, перед (обратите внимание на этот нюанс) которым будет осуществляться вставка.

Предположим, возникла такая ситуация, когда Вам жизненно необходимо запросить у пользователя текстовую переменную, а потом использовать ее еще и как число (или наоборот). На этот неожиданный случай разработчики языка предусмотрели функцию STR (X, S), которая переводит переменную числового типа Х в строковый формат S, и функцию VAL (S, X,C), которая, соответственно, переводит строковую переменную S в число Х, a C – позиция в строке, которую необходимо переопределить.

Для понимания всего вышесказанного небольшой примерчик:

Листинг : Описание program example; uses crt; var s:string; q:real; w:integer; begin clrscr; writeln (‘Введем текстовую строку’); readln (s); val (s, w,w); val (s, q,w); str (q, s); writeln (‘Вещественный тип ’,q:2:2); writeln (‘Целый тип ’,w); writeln (‘Снова строковый тип (из вещественного типа) ’,s); str (w, s); writeln (‘И опять строка (из целого типа) ’,s); readln; end.

Когда скомпилируем программу, на экране появится вот такая картина (если мы введем строку, состоящую из цифр)

На скриншоте легко увидеть, что переменная текстового типа преобразуется в переменную вещественного типа. При выводе этой переменной на экран, мы избавились от научного типа, но, как видим потом, при очередном преобразовании переменной вещественного типа в строковую, возвращается научный формат.

Если же начать извращаться и ввести текстовую строку (не числовую), а потом пытаться перевести ее в вещественную или целочисленную переменную, то получится следующая история:

Полезных данных нет вообще. Даже если ввести пустую строку, ее перевод в целый тип будет иметь значение равное ровно единице (1).

Рассмотрим еще 2 функции, относящиеся к переменным текстового типа.

Функция Copy (s, I,c), которая возвращает подстроку строки s из с символов, начиная с символа с номером i.

Функция Pos (sn, s) возвращает номер символа, с которого в строке s начинается подстрока sn (позицию первого вхождения подстроки в строку). Если такой подстроки нет (то есть подстрока sn не входит в строку s), то возвращается ноль.

В качестве традиционного примера, на котором можно показать использование некоторых команд из сегодняшнего урока (а также вспомнить ветвление и циклы), напишем программу, в которую заносятся названия дней недели, а потом (по желанию пользователя) выводится название дня недели и длина его названия.

Листинг : Описание program example; uses crt; var week:ARRAY [1..7] of string; dlina:ARRAY [1..7] of integer; a, a1,i:integer; begin clrscr; for i:=1 to 7 do begin writeln (‘Введите названия ’,i,’ дня недели’); readln (week<i>); l:=length (week<i>); dlina<i>:=l; end; repeat writeln (‘Если хотите посмотреть информацию о дне недели, нажмите 1, если нет - 0’); readln (a); if a=1 then begin writeln (‘Введите номер дня недели для получения информации о нем’); readln (a1); writeln (‘Название: ’,week[a1]); writeln (‘Длина названия: ’,dlina[a1],’ символа (ов)’); end; until a=0; writeln (‘До свидания’); readln; end.


Карта сайта


Информационный сайт Webavtocat.ru