Массивы в Паскале используются двух типов: одномерные и двумерные. Определение одномерного массива в Паскале звучит так: одномерный массив — это определенное количество элементов, относящихся к одному и тому же типу данных, которые имеют одно имя, и каждый элемент имеет свой индекс — порядковый номер. Описание массива в Паскале (объявление) и обращение к его элементам происходит следующим образом:
Объявить размер можно через константу:
Инициализация массива
Кроме того, массив может быть сам константным, т.е. все его элементы в программе заранее определены. Описание такого массива выглядит следующим образом:
const a:array[1..4] of integer = (1, 3, 2, 5);
Заполнение последовательными числами:
var a: array of integer; var n:=readInteger; a:=new integer[n];
var a: array of integer; var n:=readInteger; SetLength(a,n); // устанавливаем размер
begin var a: array of integer; a := new integer[3]; a[0] := 5; a[1] := 2; a[2] := 3; end.
begin var a: array of integer; a := new integer[3](5,2,3); print(a) end.
Ввод с клавиатуры:
var a:=ReadArrInteger(5); // целые var a:=ReadArrReal(5); // вещественные
Вывод элементов массива
var a: array[1..5] of integer; <массив из пяти элементов>i: integer; begin a[1]:=2; a[2]:=4; a[3]:=8; a[4]:=6; a[5]:=3; writeln(‘Массив A:’); for i := 1 to 5 do write(a[i]:2); <вывод элементов массива>end.
Для работы с массивами чаще всего используется в Паскале цикл for с параметром, так как обычно известно, сколько элементов в массиве, и можно использовать счетчик цикла в качестве индексов элементов.
[Название файла: taskArray0.pas ]
В данном примере работы с одномерным массивом есть явное неудобство: присваивание значений элементам.
for var i:=0 to a.Length-1 do a[i] += 1;
Проход по элементам (только для чтения): Пример:
foreach var x in a do Print(x)
Функция Random в Pascal
Диапазон в Паскале тех самых случайных чисел от a до b задается формулой:
var f: array[1..10] of integer; i:integer; begin randomize; for i:=1 to 10 do begin f[i]:=random(10); < интервал [0,9] >write(f[i],’ ‘); end; end.
Для вещественных чисел в интервале [0,1]:
или с дополнительными параметрами (диапазон [5;15]):
[Название файла: taskArray1.pas ]
Числа Фибоначчи в Паскале
Наиболее распространенным примером работы с массивом является вывод ряда чисел Фибоначчи в Паскаль. Рассмотрим его.
Получили формулу элементов ряда.
var i:integer; f:array[0..19]of integer; begin f[0]:=1; f[1]:=1; for i:=2 to 19 do begin f[i]:=f[i-1]+f[i-2]; writeln(f[i]) end; end.
[Название файла: taskArray2.pas ]
Максимальный (минимальный) элемент массива
Поиск максимального элемента по его индексу:
// … var (min, minind) := (a[0], 0); for var i:=1 to a.Length-1 do if a[i]
[Название файла: taskArray_min.pas ]
[Название файла: taskArray4.pas ]
[Название файла: taskArray5.pas ]
[Название файла: taskArray6.pas ]
Пример:
[Название файла: taskArray7.pas ]
Поиск в массиве
Рассмотрим сложный пример работы с одномерными массивами:
Для решения поставленной задачи понадобится оператор break — выход из цикла. Решение Вариант 1. Цикл for:
var f: array[1..10] of integer; flag:boolean; i,c:integer; begin randomize; for i:=1 to 10 do begin f[i]:=random(10); write(f[i],’ ‘); end; flag:=false; writeln(‘введите образец’); readln(c); for i:=1 to 10 do if f[i]=c then begin writeln(‘найден’); flag:=true; break; end; if flag=false then writeln(‘не найден’); end.
begin var a := new integer[10]; a := arrRandomInteger(5,0,5); //[1,3,5,4,5] print(a.IndexOf(3)) // 1 end.
или метод a.Contains(x) наравне с x in a :
begin var a := new integer[10]; a := arrRandomInteger(5,0,5); //[1,3,5,4,5] print(a.Contains(3)); // True print(3 in a)// True end.
Рассмотрим эффективное решение:
Алгоритм:
решение на Паскале Вариант 2. Цикл While:
Поиск элемента в массиве
Предлагаем посмотреть подробный видео разбор поиска элемента в массиве (эффективный алгоритм):
Пример:
[Название файла: taskArray8.pas ]
Циклический сдвиг
Решение:
Программа:
// … var v := a[0]; for var i:=0 to a.Length-2 do a[i] := a[i+1]; a[a.Length-1] := v;
// … var v := a[a.Length-1]; for var i:=a.Length-1 downto 1 do a[i] := a[i-1]; a[0] := v;
[Название файла: taskArray9.pas ]
Перестановка элементов в массиве
Рассмотрим, как происходит перестановка или реверс массива.
Решение:
Псевдокод:
Программа:
Решение 2 (стандартная процедура Reverse() ):
begin var a:=new integer[10]; a:=arrRandomInteger(10); print(a);// [41,81,84,63,12,26,88,25,36,72] Reverse(a); print(a) //[72,36,25,88,26,12,63,84,81,41] end.
[Название файла: taskArray10.pas ]
Выбор элементов и сохранение в другой массив
Решение:
Вывод массива B:
writeln(‘Выбранные элементы’); for i:=1 to count-1 do write(B[i], ‘ ‘)
[Название файла: taskArray11.pas ]
Сортировка элементов массива
Pascal
PascalABC.NET
for i:=1 to N-1 do begin for j:=N-1 downto i do if A[j] > A[j+1] then begin с := A[j]; A[j] := A[j+1]; A[j+1] := с; end; end;
[Название файла: taskArray12.pas ]
Pascal
PascalABC.NET
for i := 1 to N-1 do begin min:= i ; for j:= i+1 to N do if A[j] i then begin c:=A[i]; A[i]:=A[min]; A[min]:=c; end; end;
for var i := 0 to a.High-1 do begin var (min,imin) := (a[i],i); for var j := i + 1 to a.High do if a[j] [Название файла: taskArray13.pas ]
Рубрики:
См. пузырьковая сортировка. При второй итерации цикла (согласно вашим рисункам и коду ) нет надобности сравнивать первый элемент со вторым. Снова вы всех путаете =)
admin
Именно поэтому в коде : for j:=N-1 downto i do
downto i — то есть мы доходим сначала до первого элемента, потом до второго и т.д.
Bronislav
Смотрите. Ваш код работает. Но работает не так, как вы пишете перед этим. Он просеивает минимальный элемент с конца через весь массив до первой позиции (первого индекса если хотите). А не так как вы пишете: «При второй итерации цикла нет надобности сравнивать последний элемент с предпоследним. Последний элемент уже стоит на своем месте, он самый большой.» Соответственно вашему коду и вашим рисункам на второй итерации не сравнивается первый элемент (минимальный) со вторым, а не последний (который вообще не факт что максимальный) с предпоследним. Вот об чем речь. Или код меняйте или описание алгоритма перед кодом.
Владимир
В сохранении в другой массив ошибка. Надо поменять местами счётчик и команду сохранения. В массиве В нет элемента 0.
Aurangzeb
А как заполнить случайными числами (из файла!) такой массив: Type mass=array[1..n] of smallint; var A:array[1..n] of mass… В файле они введены, допустим, квадратно! Потом её нужно перевернуть и записать в выходной файл! Подумайте!
Как распечатать в строку элементы одномерного массива по 5 значений?
Функция Random генерирует и возвращает случайное число. Синтаксис функции следующий:
Функция возвращает случайное число большее или равное 0 и строго меньше L (то есть L не входит в диапазон возвращаемых значений). Если параметр опущен (последний вариант из трёх приведённых выше), то возвращается вещественное число между 0 и 1 (0 включительно, 1 не входит в диапазон возвращаемых значений).
Математически это можно записать так:
ПРИМЕЧАНИЕ FreePascal использует в процедуре Random имитацию случайностей Мерсенна Твистера. Эта реализация имеет большее статистическое распределение, чем, например, алгоритм Линейного Конгруэнтного генератора, но работает значительно медленнее, чем последний. Если скорость выполнения программы критична, то должны быть рассмотрены альтернативные генераторы случайных чисел.
Процедура Randomize в Паскале запускает генератор случайных чисел. Синтаксис:
Процедура Randomize инициализирует генератор случайных чисел FreePascal, задавая значение переменной Randseed, вычисленное с помощью системных часов.
Как запустить генератор случайных чисел в Паскале
Пример программы, где используются разные варианты получения случайных чисел, приведён ниже:
ВАЖНО! Перед использованием функции Random надо обязательно вызвать процедуру Randomize, чтобы запустить генератор случайных чисел. Иначе функция Random будет возвращать НЕ случайное число.
Процедура Randomize вызывается ТОЛЬКО ОДИН РАЗ в начале программы. Типичная ошибка новичков заключается в том, что они вызывают Randomize перед каждым вызовом Random. Этого делать не надо.
Что такое Randseed
Давайте сначала попробуем не использовать процедуру Randomize. Например, так:
В этом примере функция Random будет возвращать какое-то значение, но оно НЕ будет случайным числом. Сколько бы раз вы не запускали программу, она всегда будет выводить одинаковые числа.
В моём случае это были числа 54 и 59. В вашем случае это могут быть другие числа, но суть не в этом, а в том, что они будут всегда одинаковыми.
Теперь попробуем сделать так:
Теперь числа будут другими. В моём случае 69 и 7. Правда, они тоже не будут изменяться, то есть не будут случайными.
Однако эти числа изменились. Потому что мы изменили значение глобальной переменной Randseed.
Эта переменная задаёт начальное значение для генератора случайных чисел. Опираясь на это значение функция Random генерирует случайное число. Но, если значение переменной Randseed будет всегда одинаковым, то никаких случайных чисел мы не получим.
Поэтому при запуске программы надо хотя бы один раз вызвать процедуру Randomize, которая устанавливает начальное значение переменной Randseed, получая системное время и из этих данных формируя значение для переменной Randseed.
Так как программа запускается в какое-то случайное время, то и значение переменной Randseed будет случайным. А, следовательно, и функция Random будет возвращать случайные значения.
Давайте попробуем написать свою процедуру Randomize. Она может быть, например, такой:
Я не буду в подробностях разъяснять работу процедуры DecodeTime. Скажу только, то она возвращает, час, минуту, секунду и миллисекунду текущего времени компьютера. Мы используем миллисекунду, значение которой и присваиваем переменной Randseed.
Можете попробовать использовать эту процедуру вместо стандартной процедуры Randomize и убедиться, что функция Random возвращает случайные значения. Не забудьте подключить к программе модуль SysUtils, в котором объявлена процедура DecodeTime, иначе программа не откомпилируется.
ПРИМЕЧАНИЕ Исходя из того, что процедура Randomize задаёт начальное значение переменной Randseed на основе текущего времени компьютера, можно предположить, что, например, если запустить программу сегодня в 12:00:00 и завтра в это же время, то функция Random вернёт одинаковые числа.
К сожалению, проверить это очень трудно, так как запустить программу в одно и то же время с точностью до миллисекунды будет практически невозможно.
Часто в задачах требуется выполнить различные действия с большим количеством чисел. В таких случаях вводить все числа становится просто неудобно и долго. Для этого в Паскале придуман генератор случайных чисел — оператор random.
От программиста лишь требуется задать числовые промежутки ( например от 2 до 50 ), все остальное программа выполнит сама. Итак как добавить к коду программы оператор random.
Для начала необходимо предварительно описать оператор (то есть фактически мы сообщаем программе, что будет использован генератор случайных чисел). Для этого необходимо ввести оператор randomize в промежутке после begin и до random (обычно оператор randomize ставят сразу после begin, так как это упрощает чтение кода). Затем идет присвоение оператора random к выбранной переменной. Делается это так: Для Turbo Pascal
Здесь 4 — это результат выражения 5-2+1.
Для Pascal ABC
Здесь можно применять оператор random так же как и для Turbo Pascal, однако есть еще один вариант, более простой в использовании.
Чтобы разница лучше просматривалась решим тот же пример генератора случайных чисел от 2 до 5 этим способом.
Как уже стало заметно второй способ гораздо проще, однако его можно использовать только в Pascal ABC. А для тех, кого интересует код программы, где используется рандом без повтора генерируемых чисел я написал этот пост. В нем при генерации каждого числа происходит сравнение с предыдущем числом.
Разработчику о работе с 1С:Предприятие, Pascal, Паскаль
Pascal (Паскаль) функция Random, процедура Randomize.
Pascal (Паскаль) функция Random, процедура Randomize. 1. Общие сведения. Функция Random в Паскале определяет диапазон случайных чисел.
В результате исполнения кода появляется практически одно и тоже число. На самом деле в Паскале, как в прочем во всех языках, используется ряд псевдослучайных чисел. Чтобы запускать новый ряд псевдослучайных чисел, каждый раз при работе программы, необходимо использовать процедуру в Паскале: Randomize.
Добавим в наш код возможность повторения кода, то есть вводим цикл while. Так же удалим (комментарий) процедуру Randomize.
Код только Random.
Скомпилируем наш код. Запускаем несколько раз полученную программу Код только Random (без Randomize). При каждом запуске, в окне увидим один и тот же ряд чисел.
Результат работы кода только один Random.
Убираем комментарий, вводим оператор Randomize. Снова компилируем, теперь выводится новый ряд чисел при каждом запуске программы. Вывод: Генератор псевдослучайных числ работает только с функцией Random и процедурой Randomize вместе.
2. Использование параметра Random. Набираем такой код:
Компилируем программу — выскакивает ошибка:
Ошибка компиляции функция Random.
Почему возникла ошибка компиляции? Функция Random без параметров возвращает тип значения real в интервале [0…1]. А переменная sN тип integer. Изменим ее тип на real. Компиляция прошла без ошибок.
Random без указания параметра.
Ошибка возникла потому, что язык Паскаль является строго типизированным. Нельзя присваивать переменной типа Integer, значение другого типа.
Если необходимо получить не только значения целых чисел в определенном интервале, но и значения вещественных чисел в определенном интервале, например [0…10], перепишем код:
Random вывод вещественных чисел в интервале от 0 до 10.
Function Random [ ( sN : Word) ] : тип параметра; Возвращает: Если sN неопределенный, тогда значение случайного числа от 0 до 1, включая ноль. Если sN определенный, тогда значение случайного числа от 0 до sN. включая ноль.
Все, что необходимо начинающему и опытному программисту
Задание значений переменных датчиком случайных чисел
Есть еще один способ занесения данных в переменные — вызов датчика случайных чисел, когда компьютер сам выдает случайное число из указанного диапазона.
Зададим этим способом цвет экрана. Вместо второго блока в программе поставим вызов датчика случайных чисел Random(X). Но перед этим обязательно нужно выполнить процедуру инициализации датчика, иначе он будет выдавать нам неслучайные числа:
ЗАМЕЧАНИЕ На самом деле настоящий программный датчик случайных чисел создать невозможно. Функция Random выдает псевдослучайные числа. Это значит, что числа, выдаваемые функцией, порождаются по определенной закономерности. Эта закономерность придумана так, чтобы казалось, что числа получаются случайными. Однако если не использовать процедуру randomize, каждый раз при запуске программы последовательность чисел будет одинаковой. Процедура randomize «встряхивает» начальное значение последовательности. После этого порождаемая последовательность чисел становится почти уникальной.
Рассмотрим еще несколько примеров использования функции Random. Пусть нам необходимо получить случайное двузначное число, то есть число от 10 до 99. Логика проста: нам нужно одно случайное число из 90 (именно столько двузначных чисел). Значит, будем использовать функцию Random, которая выдаст одно число из 90, то есть Random(90). Но результат тогда будет лежать в диапазоне 0..89, а нам требуется 10..99! Значит, нужно сдвинуть полученный диапазон вправо на 10. Это делает операция +10. В итоге получаем следующее: Random(90)+10.
Задание 2.12. Напишите программу, которая выдает сообщение в текстовое окно. Координаты окна и координаты для сообщения должны вводиться с клавиатуры. Цвет экрана и цвет символов задайте с помощью датчика случайных чисел.
Задание 2.13. Напишите программу, которая выдает сообщение на полный экран (без текстового окна). Координаты сообщения, цвет экрана и цвет символов задайте с помощью датчика случайных чисел.
ЗАПОМНИТЕ! Заливка экрана или текстового окна выполняется вызовом двух процедур: установка цвета экрана — процедурой TextBackGround(. ), а очистка экрана — процедурой ClrScr.
Зачем нужны константы в программе?
Бывают случаи, когда некоторые величины не меняются по ходу выполнения программы. Для удобства работы с такими величинами в Паскале предусмотрена отдельная категория — константы. Для начала простой пример:
Для наглядности в формуле вычисления скорости падения мы использовали переменную G, которая, однако, в действительности не менялась. И это неудивительно: она представляет ускорение свободного падения, которое, как известно, есть величина постоянная.
Для того чтобы явно указать в программе, что величина G не может измениться, перенесем ее описание в особый раздел — раздел описания постоянных величин, или констант (см. следующий пример). Тем самым мы покажем Паскалю и человеку, который будет читать нашу программу, что эту величину нельзя менять по ходу выполнения программы. Она получает свое значение один раз и не может быть изменена.
. Использование констант выполняет еще две функции. Во-первых, описывая величину в разделе констант мы подстраховываем сами себя, чтобы случайно не изменить ее в программе. (Вам, наверное, это замечание кажется глупым: как можно так ошибиться! Но при написании больших, многостраничных программ это становится актуальным) Во-вторых, константы оказываются нужны при объявлении новых типов данных — массивов.
Задание 2.14. Вычислите длину окружности и площадь круга. Радиус должен вводиться с клавиатуры.
1. Данные, с которыми работает программа, хранятся в ячейках. Каждая ячейка имеет имя и тип данных. Изменяемые ячейки называются переменными, неизменяемые — постоянными. 2. Ячейки, используемые в программе, описываются в разделах const и var. 3. Для хранения целых чисел используется тип данных integer, а для хранения вещественных — real. 4. Каждый тип данных имеет свои операции и функции. Особенно это важно для типа integer, который имеет две операции деления — div и mod. 5. Для преобразования значений типа real к типу integer используются специальные функции — trim с и round. 6. При записи арифметических выражений нужно помнить о приоритете операций и о типе данных, который получается в результате. 7. Начальные значения переменных можно задавать путем ввода с клавиатуры или с помощью датчика случайных чисел.
Контрольные вопросы
1. Где хранятся все данные, с которыми работает программа? 2. Чем различаются понятия имя ячейки, адрес ячейки и значение ячейки? 3. Какой тип данных используется для хранения целых чисел? А для дробных? 4. Что следует сделать, если в программе используется величина, не изменяющаяся за все время работы программы? 5. В чем отличие между операциями mod, div и /? 6. Зачем нужны функции trunc и round? В чем между ними разница? 7. Какое максимальное значение может принимать переменная типа integer? Что делать, если необходимо сохранить целое число, в 10 раз большее этого значения? 8. Как записать на Паскале «2,5 в степени 16,7»? 9. Что означает запись «1Е5», «ЗЕ-4», «.2Е7»? 10. Что нужно использовать, чтобы изменить приоритет выполнения математических операций? 11. Чему равно и какой тип данных имеет выражение trunc(sqrt(2+52 div 8))-sqr(15 mod 4/3)?