Главная » Статьи » Программирование » Pascal

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

Массив – однородная совокупность элементов (примеры можно найти в комментариях и на форуме)

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

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

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

 

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

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

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

Type < имя _ типа >= array [ I ] of T;

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

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

Var a,b: array [ I ] of T;

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

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

ord ( I n )- ord ( I 1 )+1.

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

Type 
Vector=array [1..10] of integer; 
Stroka=array [0..255] of char;

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

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

Var a: vector; 
c: 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 .

Хотя данная программа полностью соответствует синтаксису языка, и транслятор «пропустит» ее, на стадии выполнения произойдет ошибка выхода за пределы массива Паскаля. При n =45 выражение n *2=90, компьютер сделает попытку обратиться к элементу массива a [90], но такого элемента нет, поскольку описан массив размерностью 80.

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

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

 

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

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

Var 
a , b : array [1..10] of real ;

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

 

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

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

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

Var 
   A : array [1..10] of integer ; 
   I : byte ; {переменная I вводится как индекс массива} 
Begin 
   For i:=1 to 10 do 
      Readln (a[i]); { ввод i- го элемента производится с клавиатуры }

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

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

Var 
   A: array [1..10] of integer; 
   I : byte ; {переменная I вводится как индекс массива} 
Begin 
   For i :=1 to 10 do 
      A [ i ]:= random (10); { i -му элементу массива присваивается «случайное» целое число в диапазоне от 0 до 10}

 

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

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

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

Var 
   A: array [1..10] of integer; 
   I : byte ; {переменная I вводится как индекс массива} 
Begin 
   For i :=1 to 10 do 
      Write ( a [ i ],’ ‘); {вывод массива осуществляется в строку, после каждого элемента печатается пробел}

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

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

Var 
   A: array [1..10] of integer; 
   I : byte ; {переменная I вводится как индекс массива} 
Begin 
   For i:=1 to 10 do 
      Writeln (‘a[‘, i,’]=’, a[i]); { вывод элементов массива в столбик }

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

a [1]=2 
a [2]=4 
a [3]=1 и т.д. 

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

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

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

  • Входными данными в этой задаче будут являться два одномерных массива. Размер этих массивов может быть произвольным, но определенным. Т.е. мы можем описать заведомо большой массив, а в программе определить, сколько элементов реально будет использоваться. Элементы этих массивов могут быть целочисленными. Тогда описание будет выглядеть следующим образом:
    var a , b : array [1..100] of integer ;
  • Выходными данными будут элементы результирующего массива, назовем его c . Тип результирующего массива также должен быть целочисленным.
  • Кроме трех массивов нам потребуется переменная – параметр цикла и индекс массива, назовем ее i , а также переменная n для определения количества элементов в каждом массиве.

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

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

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

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

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.


Источник: http://www.pascal.helpov.net/
Категория: Pascal | Добавил: Алексей (11.02.2015) | Автор: Фролов Алексей E
Просмотров: 8644 | Комментарии: 14 | Теги: паскаль, cod, pascal, массив, программирование | Рейтинг: 5.0/1
Всего комментариев: 141 2 »
avatar
0
1
Задание
Вычистить длину круга, площадь круга и объем слоя одной и того же заданного радиуса.
Выбор алгоритма решения задачи
В данном задании нужно ввести радиус. И вычислить длину, площадь и объем.
Описание решения задачи
Для решения данного задания введем три переменные: v, l, s. Тогда формулы можно записать так: v:= (4*pi*(R*r*r)) /3; l:= 2*pi*r; s:= pi*(R*r);
Код
program Radius;
var
r: real;
l: real;
v: real;
s: real;
begin
write('Vvedite radius: ');
readln(r);
v:= (4*pi*(R*R*R))/3;
l:= 2*pi*R;
s:= pi*(R*R);
writeln('Obyom shara: ',v);
writeln('Dlina okruzhnosti: ',l);
writeln('Ploshad kruga: ',s);
end.
avatar
0
2
Выбор алгоритма решения задачи
Для решения этой задачи, необходимо ввести 10 действительных значений. И подсчитать количество отрицательных и позитивных чисел.
Описание схемы алгоритма решения задачи
В данной программе необходимо объявить массив а, ввести у него и сделать два условия: 1. а[i]>0 2. а[i]<0. И подсчитать количество таких чисел.
Код
program laba1;
var
a: array[1..10] of real; {massiv iz 10 chisel}
i: integer;  {nomer elementa massiva}
p: integer;  {kolichestvo polozhitelnyh chisel}
t: integer;  {kolichestvo otricatelnyh chisel}
begin
i:=1;  {snachala i=1, t.k. nachinaem prosmotr massiva s pervogo elementa}
writeln('Vvedite elementy'); {na ekrane poyavlyaetsya stroka s prosboy vvesti elementy}
while i<=10 do  {eto cikl, kotoryy budet rabotat' do teh por, poka 'i' libo < libo = 10}
begin
readln(a[i]);  {poyavlyayetsya kursor, kotoryy zhdet, kogda my vvedem chislo
s klaviatury, eto chislo zapisyvaetsya v massiv 'a' pod nomerom 'i'}
i:=i+1;  {zatem 'i' uvelichilos na 1, t.k. perehodim k sleduyushemu elementu massiva}
end;
t:=0;  {obnulyayem 't', t.k. v nachale ne znayem skolko otricatelnyh elementov}
p:=0;  {takzhe postupayem s 'p'}
i:=1;  {nachinaem prosmatrivat massiv zanovo na nalichie polozhit. i otricat. elementov}
while i<=10 do  {opyat zavodim cikl, takoy zhe, kak i pri vvode}
begin
if a[i]>0 then  {proveryayem, element massiva pod nomerom 'i' bolshe 0 ?}
begin  {esli da, to...}
p:=p+1;  {uvelichivaem 'p' na edinicu}
i:=i+1;  {perehodim k sleduyushemu elementu massiva}
end;  {opyat idem na cikl 'while', t.e. na proverku, ne zakonchilis li eshe elementy v massive ?}
if a[i]<0 then  {eto budet v tom sluchae, esli element ne polozhitelnyy,
t.e. kogda smotreli 'a[i]>0'(da ili net), otvet byl net, t.e. etot element ne bolshe 0}
begin  {esli da, to...}
t:=t+1;  {uvelichivaem 't'}

  end;  {idem opyat na cikl}
i:=i+1;  {perehodim na sled. element}
end;  {zdes vyhodim iz cikla, kogda proverili vse elementy massiva}
writeln('Polozhitelnyh chisel: ',p); {raspechatayem kol-vo polozh. chisel}
writeln('Otricatelnyh chisel: ',t);  {raspechatayem kol-vo otric. chisel}
readln;
end.
avatar
0
3
Число пробелов в строке.
Код
program CountSpacesInString;
var
  str: string;

function CountSpaces (s: string): integer;
var
  i, count: integer;
begin
  count := 0;
  for i:=1 to length(s) do
  if s[i]=' ' then
  count := count+1;
  CountSpaces := count;
end;
avatar
0
4
Цикл с предусловием.

Код
program cycle_while;
Var   
   x,y,sum:real; otv:char;
begin
   sum:=0;
   otv:='Д';
   while (otv='Д') or (otv='д') do
   begin
   write('Введите числа x,y > 0 ');
   readln(x,y);
   writeln('Их произведение = ',x*y:8:3);
   sum:=sum+x+y;

   write('Завершить программу (Д/Н)? ');
   readln(otv);
   end;
   writeln('Общая сумма = ',sum:8:3);
   readln
end.
Ответ: В приведенной программе циклически будет вычисляться произведение двух введенных чисел. Для продолжения работы программы необходимо периодически на ее вопрос отвечать утвердительным символом Д или д. Паскаль выводит вещественные числа в так называемой экспоненцмальной форме. Для их обычного представления необходимо после выводимой переменной указать параметры вывода в виде двух чисел после двоеточий.
avatar
0
5
Нахождение минимального числа из введенных.
Код
Program MIN;
Var
  A, I : Integer;
  Min : Integer;

Begin
  Min:=32767;
  For I:=1 to 10 do
  Begin
  Write('Vvedi chislo ');
  Readln(A);
  If A < Min then Min:=A;
  end;
  Writeln('MIN=',Min);
  Readln;
end.

Простая программа демонстрирует цикл со счетчиком, и работу условных операторов. В начале анализа в качестве минимального задано максимально возможное из целых положительных целочисленного типа. (Попробуйте реализовать этот алгоритм по другому.)
avatar
0
6
Заполнение и вывод двумерного массива.
Код
Program MASS-DV;
var
  mas:array[1..5,1..5] of integer; {объявление двухмерного массива}
  i ,j:integer;
begin
{Ввод значений элементов массива}
  for i:=1 to 5 do
  for j:=1 to 5 do readln(mas[i,j]);
{Вывод значений элементов массива}
  for i:=1 to 5 do  
  begin
  for j:=1 to 5 do
  write(' ',mas[i,j]);
  writeln;
  end;  
end.
Демонстрация ручного заполнения двумерного массива с последующим выводом его на экран.
avatar
0
7
Лохотрон - найди шарик
Код
Uses Crt;
Var
  A, C, B : Integer;

Begin
  clrscr;
  Randomize;
  gotoXY(20,10); Writeln('Где шарик? Введи номер стакана…');
  A:=Random(99);
  If A<=33 then B:=1 Else If A>66 then B:=3 else B:=2;
  GotoXY(20,11); Writeln(' _ _ _');
  GotoXY(20,12); Writeln('/ \ / \ / \');
  GotoXY(20,13); Writeln(' 1 2 3');
  Readln(C);
If C=B then Write('Вы угадали!!!') else Write('Вы ошиблись!');
  GotoXY(20,11); Writeln(' ');
  GotoXY(20,12); Writeln('\_/ \_/ \_/');
  GotoXY(17+4*B,12); Write('O');

Readln; end.

Кто ж не видел лохотронщиков, ловко катающих шарик под колпачками. Здесь это делает программа. Но, только она не будет вас обманывать, а в конце честно, покажет, в каком стаканчике шарик. Программа демонстрирует вывод в определенную точку экрана, перемещая в нее курсор процедурой GoToXY из модуля CRT.
avatar
0
8
Корни квадратного уравнения - 1
Код
Program Sq1;

Var A, B, C, D, X1, X2 : Real;

Begin
  Writeln ('Введите коэффициенты квадратного уравнения');
  Readln (A,B,C);
  D:=B*B-4*A*C;
  If D<0 Then Writeln ('Корней нет! ')
  Else
  Begin
  X1:=(-B+SQRT(D))/2/A;
  X2:=(-B-SQRT(D))/2/A;
  Writeln ('X1=', X1:8:3, ' X2=',X2:8:3)
  End;
End.
Классическая программа вычисления корней квадратного уравнения с контролем дискриминанта. Обратите внимание, как в Паскале формируются вычислительные выражения.
avatar
0
9
Корни квадратного уравнения - 2.
Код
Program Sq2;
Var A, B, C, D, X, X1, X2 : Real;
Begin
  Writeln ('Введите коэффициенты уравнения (A, B, C) ');
  If A=0 Then
  If B=0 Then
  If C=0 Then Writeln('X - любое число')
  Else Writeln('Корней нет! ')
  Else Begin X:=-C/B; Writeln('X=',X:8:3) End
  Else
  Begin End;

End.
В программе проанализированы ситуации, когда какой либо из коэффищиентов равен 0. Обратите внимание на использование пустого оператора Begin End; Оказывается иногда без него никак не обойтись.
avatar
0
10
Количество цифр в числе.
Код
Program KolCifr;
Var
  I, S, N : Longint;
Begin
  Writeln('Введите целое'); Readln(I);
  N:=1;
  While I > 10 DO
  BEGIN
  I:=I DIV 10;
  Inc(N);
  end;
Write('Количество цифр = ',N);
Readln; end.
Простая программа определяет количество цифр в числе. Используется алгоритмическая структура цикл с предусловием.
1-10 11-14
ComForm">
avatar