Сообщение на тему массивы в pascal

Обновлено: 04.07.2024

Программирование. Одномерные массивы Pascal-Паскаль

  • Скачено бесплатно: 19989
  • Куплено: 414

Понятие структуры

До сих пор мы работали с простыми типами данных – логический ( boolean ), целый ( integer , word , byte , longint ), вещественный ( real ), символьный ( char ). Любой алгоритм можно запрограммировать с помощью этих четырех базовых типов. Но для обработки информации о многообразном реальном мире требуются данные, имеющие более сложное строение. Такие сложные конструкции, основанные на простейших скалярных типах, называются структурами. Структура – некоторый составной тип данных, составленный из базовых скалярных. Если структура не изменяет своего строения на протяжении всего выполнения программы, в которой она описана, то такую структуру называют статической.

Массив – однородная совокупность элементов

Самой распространенной структурой, реализованной практически во всех языках программирования, является массив.

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

Другая особенность массива состоит в том, что к любой его компоненте можно обращаться произвольным образом. Что это значит? Программа может сразу получить нужный ей элемент по его порядковому номеру (индексу).

Индекс массива

Номер элемента массива называется индексом. Индекс – это значение порядкового типа, определенного, как тип индекса данного массива. Очень часто это целочисленный тип ( integer , word или byte ), но может быть и логический и символьный.

Описание массива в Паскале. В языке Паскаль тип массива задается с использованием специального слова array (англ. – массив), и его объявление в программе выглядит следующим образом:

где I – тип индекса массива, T – тип его элементов.

Можно описывать сразу переменные типа массив, т.е. в разделе описания переменных:

Обычно тип индекса характеризуется некоторым диапазоном значений любого порядкового типа : I 1 .. I n . Например, индексы могут изменяться в диапазоне 1..20 или ' a '..' n '.

При этом длину массива Паскаля характеризует выражение:

Вот, например, объявление двух типов: vector в виде массива Паскаля из 10 целых чисел и stroka в виде массива из 256 символов:

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

Опишем переменные типа vector и stroka :

далее в программе мы можем обращаться к отдельным элементам массива a или c . Например, a [5]:=23; c [1]:=' w '; a [7]:= a [5]*2; writeln ( c [1], c [3]).

Вычисление индекса массива Паскаля

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

Пример программы с ошибкой массива Паскаля

Program primer _ error ;
Type
vector=array [1..80] of word;
var
n: integer;
a: vector;
begin
n:=45;
a[n*2]:=25;
end .

Из всего этого следует сделать вывод: программисту надо быть очень аккуратным при работе с индексами массива.

Основные действия с массивами Паскаля

Как известно, определение типа данных означает ограничение области допустимых значений, внутреннее представление в ЭВМ, а также набор допустимых операций над данными этого типа. Мы определили тип данных как массив Паскаля. Какие же операции определены над этим типом данных? Единственное действие, которое можно выполнять над массивами целиком, причем только при условии, что массивы однотипны, – это присваивание. Если в программе описаны две переменные одного типа, например,

то можно переменной a присвоить значение переменной b ( a := b ). При этом каждому элементу массива a будет присвоено соответствующее значение из массива b. Все остальные действия над массивами Паскаля производятся поэлементно (это важно!).

Ввод массива Паскаля

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

Пример фрагмента программы ввода массива Паскаля

Рассмотрим теперь случай, когда массив Паскаля заполняется автоматически случайными числами, для этого будем использовать функцию random ( N ).

Пример фрагмента программы заполнения массива Паскаля случайными числами

Вывод массива Паскаля

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

Пример фрагмента программы вывода массива Паскаля

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

Пример программы вывода массива Паскаля в столбик

На экране мы увидим, к примеру, следующие значения:

Пример решения задачи с использованием массивов Паскаля

Задача: даны два n -мерных вектора. Найти сумму этих векторов.

Решение задачи:

Ход решения задачи:

  • определим количество элементов (размерность) массивов, введем значение n ;
  • введем массив a ;
  • введем массив b ;
  • в цикле, перебирая значения индекса i от 1 до n , вычислим последовательно значения элементов массива c по формуле:

Текст программы :

Пример программы суммирования векторов

Program summa;
Var
a, b, c: array [1..100] of integer;
I, n: byte;
Begin
Write ('введите размерность массивов:');
Readln(n);
For i:=1 to n do
Readln (a[i]); < ввод массива a>
For i:=1 to n do
Readln (b[i]); < ввод массива b>
For i:=1 to n do
C[i]:=a[i]+b[i]; < вычисление суммы массивов >
For i:=1 to n do
write (c[i],' '); < вывод массива с >
end.

Программирование

Исходники Pascal (127)

Справочник

Справочник по паскалю: директивы, функции, процедуры, операторы и модули по алфавиту

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

Объявление массива

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

Описание массива в Паскале

var dlina: array [1..3] of integer; begin dlina[1]:=500; dlina[2]:=400; dlina[3]:=150; .

Объявить размер можно через константу:

размер массива через константу

Инициализация массива

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

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.

Ввод с клавиатуры:

writeln ('введите кол-во элементов: '); readln(n); for i := 1 to n do begin write('a[', i, ']='); read(a[i]); . 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 с параметром, так как обычно известно, сколько элементов в массиве, и можно использовать счетчик цикла в качестве индексов элементов.

Задача Array 0. Необходимо задать вещественный массив размерностью 6 (т.е. из шести элементов); заполнить массив вводимыми значениями и вывести элементы на экран. Использовать два цикла: первый — для ввода элементов, второй — для вывода.

[Название файла: taskArray0.pas ]

В данном примере работы с одномерным массивом есть явное неудобство: присваивание значений элементам.

Обработка массивов в Паскале, так же как и заполнение массива, происходит обычно с использованием цикла for .

for var i:=0 to a.Length-1 do a[i] += 1;

Проход по элементам (только для чтения):
Пример:

foreach var x in a do Print(x)

Функция Random в Pascal

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

Для генерации чисел от 0 до n (не включая само значение n , целые числа в интервале [0,N)) используется запись random (n) .
Перед использованием функции необходимо инициализировать датчик случайных чисел с помощью процедуры randomize .

Диапазон в Паскале тех самых случайных чисел от 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]:

var x: real; . x := random(0.0,1.0);;

или с дополнительными параметрами (диапазон [5;15]):

Задача Array 1. Необходимо задать массив размерностью 5, заполнить массив случайными числами в интервале [-1,1] и вывести элементы на экран: определить три позиции для вывода каждого элемента, с двумя знаками после запятой.

[Название файла: 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.

На данном примере, становится понятен принцип работы с числовыми рядами. Обычно, для вывода числового ряда находится формула определения каждого элемента данного ряда. Так, в случае с числами Фибоначчи, эта формула-правило выглядит как f[i]:=f[i-1]+f[i-2] . Поэтому ее необходимо использовать в цикле for при формировании элементов массива.

Задача Array 2. Дан ряд из 10 произвольных чисел: a[1], a[2], . , a[10] (использовать функцию random() ). Подсчитать и напечатать суммы троек стоящих рядом чисел: a[1]+a[2]+a[3] , a[2]+a[3]+a[4] , a[3]+a[4]+a[5] , …… , a[8]+a[9]+a[10]

[Название файла: taskArray2.pas ]

Задача Array 3. Написать программу решения задачи о печати ряда чисел 2 4 8 16 32 . 512 ; для заполнения массива использовать цикл Repeat
[Название файла: taskArray3.pas ]

Максимальный (минимальный) элемент массива

максимальный элемент по номеру

Поиск максимального элемента по его индексу:

// … var (min, minind) := (a[0], 0); for var i:=1 to a.Length-1 do if a[i]

[Название файла: taskArray_min.pas ]

Задача Array 4. Дан массив из 10 целочисленных элементов. Найти количество отрицательных и вывести количество на экран.

[Название файла: taskArray4.pas ]

Задача Array 5. Найти минимальное и максимальное из n введенных чисел (массива). Определить расстояние между этими элементами.

[Название файла: taskArray5.pas ]

Задача Array 6. Дан целочисленный массив размера N. Вывести все содержащиеся в данном массиве четные числа в порядке убывания их индексов, а также их количество K.

[Название файла: taskArray6.pas ]

Задача Array 7. Ввести с клавиатуры массив из 5 элементов, найти в нем два максимальных элемента и их номера.

Пример:

[Название файла: 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.

Рассмотрим эффективное решение:

Задача: найти в массиве элемент, равный X , или установить, что его нет.

Алгоритм:

  • начать с 1-го элемента ( i:=1 );
  • если очередной элемент ( A[i] ) равен X , то закончить поиск иначе перейти к следующему элементу.

решение на Паскале Вариант 2. Цикл While:

Поиск элемента в массиве

Поиск элемента в массиве

Предлагаем посмотреть подробный видео разбор поиска элемента в массиве (эффективный алгоритм):

Задача Array 8. Заполнить массив из 10 элементов случайными числами в интервале [0..4] и вывести номера всех элементов, равных X .

Пример:

[Название файла: taskArray8.pas ]

Циклический сдвиг

циклический сдвиг

Пример: сдвинуть элементы массива влево на 1 позицию, первый элемент становится на место последнего.

Решение:

// … 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;

Задача Array 9. Заполнить массив из 10 элементов случайными числами в интервале [-10..10] и выполнить циклический сдвиг влево без первого элемента.
Пример:

[Название файла: taskArray9.pas ]

Перестановка элементов в массиве

Рассмотрим, как происходит перестановка или реверс массива.

реверс массива

Пример: переставить элементы массива в обратном порядке

Решение:

2

Псевдокод:

перестановка элементов массива

Программа:

begin var a: array of integer := (1,3,5,7); var n := a.Length; for var i:=0 to n div 2 - 1 do Swap(a[i],a[n-i-1]); End.

Решение 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.

Задача Array 10. Заполнить массив из 10 элементов случайными числами в интервале [-10..10] и сделать реверс всех элементов, кроме последнего.
Пример:

[Название файла: taskArray10.pas ]

Выбор элементов и сохранение в другой массив

Пример: найти в массиве элементы, удовлетворяющие некоторому условию (например, отрицательные), и скопировать их в другой массив

Решение:

Решение: подсчитывать количество найденных элементов с помощью счетчика count, очередной элемент устанавливать на место B[count]. Переменой count необходимо присвоить 1.

сохранение элементов массива в другой


Вывод массива B:

writeln('Выбранные элементы'); for i:=1 to count-1 do write(B[i], ' ')

// . for var i := 0 to a.length - 1 do if a[i]

Задача Array 11. Заполнить массив случайными числами в интервале [20,100] и записать в другой массив все числа, которые оканчиваются на 0.
Пример:

[Название файла: taskArray11.pas ]

Сортировка элементов массива

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

сортировка методом пузырька

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;

for var i := 0 to arr.High - 1 do for var j := arr.High - 1 downto i do if arr[j] > arr[j + 1] then Swap(arr[j], arr[j + 1]);

Задача Array 12. Заполнить массив из 10 элементов случайными числами в интервале [0..100] и отсортировать первую половину массива по возрастанию, а вторую – по убыванию (методом ‘Пузырька’).

[Название файла: taskArray12.pas ]

  • в массиве ищется минимальный элемент и ставится на первое место (меняется местами с A[1]);
  • среди оставшихся элементов также производится поиск минимального, который ставится на второе место (меняется местами с A[2]) и т.д.

сортировка методом вставки

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 ]

    Выбирается и запоминается средний элемент массива (присвоим X):

быстрая сортировка

Рубрики:

См. пузырьковая сортировка.
При второй итерации цикла (согласно вашим рисункам и коду ) нет надобности сравнивать первый элемент со вторым. Снова вы всех путаете =)

admin

Именно поэтому в коде : for j:=N-1 downto i do

downto i — то есть мы доходим сначала до первого элемента, потом до второго и т.д.

Bronislav

Владимир

А как насчёт странного способа поменки оандомням образом, конечно это долго , но все таки есть
Var
A: array[1..10] of integer;
I,e,r,r1: integer;
Begin
While i в 02:05

В сохранении в другой массив ошибка. Надо поменять местами счётчик и команду сохранения. В массиве В нет элемента 0.

Aurangzeb

А как заполнить случайными числами (из файла!) такой массив: Type mass=array[1..n] of smallint; var A:array[1..n] of mass… В файле они введены, допустим, квадратно! Потом её нужно перевернуть и записать в выходной файл! Подумайте!

Что такое массивы и матрицы. Как их объявить и использовать в языке программирования Pascal. Открытые массивы.

Комментарии

Сколько значений чётных в массиве и сколько нечётных

Заполнить массив случайными числами из промежутка 1-100 и определить в массиве, сколько значений чётных и сколько нечётных.

Решение

Массивы в Pascal

Ответ на Решение от Гость (не проверено)

В каждой строке заменить все восклицательные знаки точками.

Решение

Задача

Школьников отправили на распределение яблок из кучи. Количество яблок в куче не известно. Распределяют яблоки на 4 корзины. 1(Красные), 2(Зеленые), 3(Желтые), 4(Испорченные). Требуется написать программу для распределения и подсчета яблок в каждой корзине и куче. Количество яблок в куче должно быть рандомизировано. Если цифра один, то в первую корзину ,если 2 то во вторую ,а если 3 ,то в 3 ,ну а если 4 то в 4 (когда выпадает ноль то все конец).

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

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

1. Определение и типы массивов

Массив - это множество однотипных элементов, объединённых общим именем и занимающих в компьютере определённую область памяти. Количество элементов в массиве всегда конечно. В общем случае массив - это структурированный тип данных, состоящий из фиксированного числа элементов, имеющих один и тот же тип.

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

Массивы могут быть:

· одномерными (одна строка – несколько столбцов);

· многомерными (несколько строк – несколько столбцов).

Для создания массива его предварительно необходимо описать либо в разделе var, либо в разделе type. Для задания массива используется зарезервированное слово array , после которого указывается тип индекса (-ов) компонент (в квадратных скобках) и после слова of - тип самих компонент:

= array [ ] of ;

: array [ ] of ;

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

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

Например ,

arr = array [1..3] of real;

matrix = array [1..3, 1..2] of integer;

mas1: arr = (1, 2, 3);

mas2: matrix = ((1, 2), (3, 4), (5, 6));

Тип массив можно вводить и непосредственно при определении соответствующих переменных или типизированных констант.

m1, m2 : array [1..3] of integer;

matr : array [1..3, 1..3] of real;

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

Например, m1 [2], matr[i,j].

Для обработки массива и последовательного доступа к данным, как правило, используется цикл FOR.

Например ,

for i:=1 to 10 do read(mas[i]);

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

for i:=1 to 10 do

for j:=1 to 10 do read(mas[i, j]);

Над элементами массива можно производить те же операции, которые допустимы для данных его базового типа. Если два массива имеют одинаковые типы индексов и одинаковые типы элементов, то к ним применимы булевы операции (<>=).

2. Основные операции обработки массивов

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

· определить максимальную размерность массива (как правило, вполне достаточно 100 ячеек);

· дать возможность пользователю указать количество требуемых ячеек (writeln(“Введите размерность массива”);

readln(n)- теперь n обозначает размерность).

Для того чтобы заполнить массив необходимо последовательно перебрать все ячейки (компоненты) массива и записать в них некоторые значения. Для перебора ячеек массива используется цикл for , в котором с помощью счетчика перебираются индексы ячеек. Заносимые в массив данные могут запрашиваться как с клавиатуры, так и выбираться случайным образом с помощью генератора случайных чисел Random.

Читайте также: