Федеральное агенство по образованию
ГОУ ВПО Тульский государственный педагогический
университет им. Л.Н. Толстого
Курсовая работа
«Массивы в языке Паскаль»
Выполнила
студентка3 курса
группыБ, ф-та МФиИ
ДикшеваО.А.
Проверила
Торина
Тула 2009
Оглавление
Введение
1. Виды массивов
1.1. Одномерные массивы
1.2. Примеры задач
1.3. Двумерные массивы
1.4. Примеры задач
2. Сортировка массивов
2.1Метод простых обменов (Пузырьковая сортировка)
2.2. Сортировка простым выбором
2.3 Сортировка простым включением (Метод вставки и сдвига)
3. Параметры-массивы и параметры-строки
Список литературы
/>Введение
Существуютразличные типы данных в языке Паскаль. Рассмотрим производные типы. Каждоезначение любого из этих типов в общем случае представляет собой уженетривиальную структуру, т.е. обычно это значение имеет более чем однукомпоненту. При этом каждая компонента структуры может быть как отдельнымданным, так и в свою очередь нетривиальной структурой, т.е, значением любого изпроизводных типов. Таким образом, значения производных типов в общем случаеимеют иерархическую структуру, на самом нижнем уровне которой фигурируют толькоотдельные данные. Этим компонентам нижнего уровня могут присваиваться значенияи они могут присутствовать в выражениях, как и значения переменных скалярноготипа. Данные, являющиеся значениями скалярных типов, занимают сравнительно маломеста в памяти ЭВМ. Отдельная литера, например, обычно представляется однимбайтом (8 двоичных разрядов). Для чисел различны типов в зависимости отреализации отводят несколько байтов. Данные же, составляющие значениепроизводного типа, обычно занимают значительный объем памяти ЭВМ. В связи сэтим при написании программ для ЭВМ, имеющих сравнительно небольшой объемпамяти, встает проблема экономного ее использования. В паскале предусмотренавозможность указания транслятору на необходимость экономного представлениязначений производных типов. Для этого задание производного типа необходимо начатьсо служебного слова packed, что означает упакованный. Но введя требование наупакованность данных, необходимо четко представлять себе, что, с одной стороны,это требование не всегда может быть выполнено транслятором (если, например,более экономного представления, чем обычное неупакованное представление дляданных этого типа, в ЭВМ просто не существует). А с другой стороны, если оновыполнимо, то приводит к увеличению времени исполнения программы. Поясним напримере, за счет чего это происходит. Как уже указывалось ранее, одна литеразанимает один байт. Машинная ячейка памяти, с которой работают команды ЭВМ, вобщем случае состоит из нескольких байтов. Поэтому, если в ячейку поместитьодну литеру, го большая ее часть не будет использована. На самом деле в однуячейку можно поместить несколько литер (упакованное представление). Но тогдакаждый раз, когда необходимо выполнить действие над отдельной литерой, придетсяпроизводить выделение этой литеры из ячейки (распаковку литеры из ячейки).Аналогично, при записи отдельной литеры в память машины придется определять томесто в ячейке, куда ее необходимо поместить, и заносить литеру именно туда, неизменяя содержимое остальных разрядов (запаковка литеры в ячейку). Такиедополнительные действия могут занимать значительную часть общего времени работыпрограммы. Поэтому принимать решение об использовании упакованногопредставления данных должен всегда программист, в зависимости от конкретныхусловий и целей, которые он преследует. Итак, значения производных типов могутбыть представлены в памяти ЭВМ в упакованном и неупакованном виде. Упакованноепредставление требует, вообще говоря, меньшего объема памяти, но замедляетпроцесс выполнения программы. Мы рассмотрим наиболее употребительныйпроизводный тип, а именно регулярный тип. Значение регулярного типа обычноназывают массивом. Итак, массив — это упорядоченный набор фиксированногоколичества некоторых значений (компонент массива). Все компоненты должны бытьодного и того же типа, который называют типом компонент или базовым (длямассива) типом.
Типданных Массив позволяет одному идентификатору задать несколько значений,которые отличаются порядковым номером. Номер элемента массива указывается послеидентификатора в квадратных скобках {M[5] – пятый элемент массива М}. Приописании массива указывается диапазон номеров элементов массива и тип, ккоторому относится каждый его элемент. Массивы могут быть одно-, двух- имногомерными.
/>
Рис.Изображение одно-, двух- и трехмерных массивов.
Пример описания изаполнения элементов массива.
Var {описание массивов}
M: array [1..5] ofinteger; {одномерныймассив М с номерами элементов от 1 до 5, состоящий из целых чисел}
M1: array [2..3,11..15]of char; {двумерныймассив М1 с номерами строк от 2 до 3, с номерами столбцов от 11 до 15,состоящий из символов}
Begin {заполнение массива}
М[2]:=100; {второму элементу численного массиваМ присвоено значение 100}
М1[2,3]:=’d’; {элементу второй строки и третьегостолбца символьного двухмерного массива М1 присвоено значение ’d’}
End.
/>1. Виды массивов/>1.1 Одномерные массивы
Каждомуиспользуемому в программе конкретному массиву должно быть дано свое имя. Этоимя будем называть полной переменной, поскольку ее значение есть весь массив.Каждая компонента массива может быть явно обозначена путем указания именимассива, за которым следует селектор компоненты — взятый в квадратные скобкииндекс, задающий правило вычисления номера нужной компоненты. Это отличие отпривычной записи индекса в математике, когда он указывается справа в нижнейпозиции, объясняется необходимостью использования линейной записи программы,так что многоуровневая запись должна быть исключена. При ссылке на компонентымассива индекс записывается на одном уровне с именем и заключается в квадратныескобки. Таким образом, для ссылки на отдельные компоненты используется записьвида (имя массива) [] которую будем называть частичной переменной(поскольку ее значением является не весь массив, а отдельная его компонента,номер которой задается индексом) — применительно к массивам она называется переменнойс индексом. В нашем примере массив получит имя v, а ссылки на отдельные егокомпоненты производятся с помощью частичных переменных v[ 1], v[2], ...,v[1ОО]. В общем случае в качестве индекса может, быть использовано выражение,значение которого и определяет номер компоненты массива. При этом важно, что виндексное выражение могут входить переменные, так что при изменении их значенийменяется и значение индекса, которое определяет номер компоненты массива. Такимобразом, одна и та же переменная с индексом в процессе выполнения программыможет обозначать различные компоненты массива. Тип значения индексноговыражения называют типом индекса. Множество значений типа индекса должно бытьперенумерованным множеством, тем самым определяя количество компонент и ихупорядоченность. При задании регулярного типа кроме типа индекса необходимозадать тип компонент. Задание такого регулярного типа, как одномерный массив,т.е. вектор, имеет вид:
аrrау[(тип индекса)] оf , где — имя илизадание типа./>/>1.2Примеры задач
Задача 1. Дан линейный массив целых чисел.Подсчитать, сколько в нем различных чисел.
{Подсчет количества различныхчисел в линейном массиве}.
ИДЕЯ РЕШЕНИЯ: заводимвспомогательный массив, элементами
которого являютсялогические величины (False — если элемент
уже встречался ранее,True — иначе)}
ProgramRazlichnye_Elementy;
Var I, N, K, Kol:Integer;
A: Array [1..50] OfInteger;
Lo: Array [1..50] OfBoolean;
Begin
Write('Введите количествоэлементов массива: '); ReadLn(N);
FOR I := 1 TO N DO
Begin
Write('A[', I, ']=');ReadLn (A[I]);
Lo[I] := True; {Заполняемвспомогательный массив значениями True}
End;
Kol := 0; {переменная, вкоторой будет храниться количество различных чисел}
FOR I := 1 TO N DO
IF Lo[I] THEN
Begin
Kol := Kol + 1;
FOR K := I TO N DO
{Во вспомогательныймассив заносим значение False,
если число ужевстречалось ранее или совпадает с текущим элементом A[I]}
Lo[K] := (A[K] A[I]) And Lo[K];
End;
WriteLn('Количестворазличных чисел: ', Kol)
END.
Тест: N = 10; элементы массива- 1, 2, 2, 2, -1, 1, 0, 34, 3, 3. Ответ: 6.
Задача 2. Дан линейный массив. Упорядочить егоэлементы в порядке возрастания.
{Сортировка массивавыбором (в порядке возрастания)}.
Идея решения: пусть частьмассива (по K-й элемент включительно)
отсортирована. Нужнонайти в неотсортированной части массива
минимальный элемент ипоменять местами с (K+1)-м}
Program Sortirovka;
Var N, I, J, K, Pr:Integer; A: Array [1..30] Of Integer;
Begin
Write('Введите количествоэлементов: '); ReadLn(N);
For I := 1 To N Do
Begin
Write('Введите A[', I, ']'); Readln(A[I]);
End;
WriteLn;
For I := 1 To N — 1 Do
Begin
K := I;
For J := I + 1 To N Do IfA[J]
Pr := A[I]; A[I] := A[K];A[K] := Pr;
End;
For I := 1 To N DoWrite(A[I], ' ');
End.
Тест: N = 10; элементымассива — 1, 2, 2, 2, -1, 1, 0, 34, 3, 3.
Ответ: -1, -1, 0, 1, 2,2, 2, 3, 3, 34.1.3 Двумерные массивы
Двумерный массив(прямоугольная таблица (матрица, набор векторов)) — это пример массива, вкотором элементы нумеруются двумя индексами.
В качестве номера(индекса) элемента массива используется выражение порядкового типа (чащеinteger).
Двумерным массивомназывается таблица, состоящая из строк и столбцов. Для описания массиваиспользуются два индекса.
А11 А12 А13 … А1m
A21 A22 A23 ... А2m
... ... ... ... ...
... ... ... ... ...
... ... ... ... ...
An1 An2 An3 ... Anm
Описание массива
Способ 1. В разделеописания переменных
var
ИмяМассива: array[Верх.Гр.1… Ниж.Гр.1, Верх.Гр.2… Ниж.Гр.2] of ТипЭлементов;
Способ 2. В разделеописания типов
ИмяМассива: array[Верх.Гр.1… Ниж.Гр.1, Верх.Гр.2… Ниж.Гр.2] of ТипЭлементов;
Способ 3. В разделеописания констант
const
ИмяМассива:array[1..3,1..3] of real=((1.2,2.4,0.4),(0.045,-0.47,0.003),(1.24,1,-7.4));
Заполнение массиваданными (ввод элементов)
Массив, описанный кактипизированная константа, уже содержит данные. Массивы, объявленные в разделеописания переменных, необходимо заполнить данными, прежде чем выполнять с нимикакие-либо действия.
Значения элементовмассива также можно задать следующими способами: при вводе данных с клавиатуры:
write('Введите количествострок и столбцов');
readln(n,m);
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']=');{Можно эту строчку в программе не использовать}
readln(a[i,j]);
end;
с помощью датчикаслучайных чисел:
randomize;
writeln('Введитеколичество элементов массива');
readln(n);
for i:=1 to n do
begin
a[i]:=random(50);
writeln('a[',i,',',j,']=',a[i,j]);
end;
присваением заданныхзначений (например по формуле i*i/i+2):
writeln('Введитеколичество элементов массива');
readln(n);
for i:=1 to n do
begin
a[i]:=i*i/i+2;
writeln('a[',i,',',j,']=',a[i,j]);
end;
Вывод массива
вывод в столбец:
for i:=1 to n do
writeln(a[i,j]);
по строкам и столбцам:
for i:=1 to n do
begin
for j:=1 to m do
begin
write(a[i,j]:3);
end;
readln;
end;
Обработка массивов
Часто требуется вычислитьсумму элементов массива, их среднее арифметическое значение или найти значенияи номера максимального и минимального элементов, а также изменить значенияэлементов массива и т.д. Особенность работы с двумерными массивами заключаетсяв том, что расширяется возможность обработки массива (появились новые элементы:строки, столбцы — являющиеся одномерными массивами). Подробно все действияможно рассмотреть в задачах разобранных в этом разделе.
Квадратная матрица
Квадратной называетсятакая матрица, в которой количество строк равно количеству столбцов. Выделяютследующие элементы квадратной матрицы:
главная диагональ;
побочная диагональ;
элементы, расположенныевыше главной диагонали;
элементы, расположенныениже главной диагонали;
элементы, расположенныевыше побочной диагонали;
элементы, расположенныениже побочной диагонали;
Главная диагональ. Еслизначения индексов (i, j) элемента равны, то элементы расположены на главнойдиагонали.
А11 А12 А13 А14
A21 A22 A23 А24
A31 A32 A33 А34
A41 A42 A43 А44
if i=j then
Побочная диагональ. Еслидля значений индексов (i, j) элементов выполняется равенство: i+j=n+1, тоэлементы расположены на побочной диагонали.
А11 А12 А13 А14
A21 A22 A23 А24
A31 A32 A33 А34
A41 A42 A43 А44
if i+j=n+1 then
Для элементов,расположенных выше главной диагонали необходимо использовать один из следующихфрагментов программы:
А11 А12 А13 А14
A21 A22 A23 А24
A31 A32 A33 А34
A41 A42 A43 А44
for i:=1 to n do
for j:=1 to n do
if i
for i:=1 to n-1 do
for j:=i+1 to n do
Если элементы расположенына главной диагонали и выше её необходимо использовать следующий фрагментпрограммы:
А11 А12 А13 А14
A21 A22 A23 А24
A31 A32 A33 А34
A41 A42 A43 А44
for i:=1 to n do
for j:=1 to n do
if i
Для элементов,расположенных ниже главной диагонали необходимо использовать следующий фрагментпрограммы:
А11 А12 А13 А14
A21 A22 A23 А24
A31 A32 A33 А34
A41 A42 A43 А44
for i:=1 to n do
for j:=1 to n do
if i>j then
Для элементов,расположенных ниже главной диагонали и не ней необходимо использовать следующийфрагмент программы:
А11 А12 А13 А14
A21 A22 A23 А24
A31 A32 A33 А34
A41 A42 A43 А44
for i:=1 to n do
for j:=1 to n do
if i>=j then
Если элементы,расположены выше побочной диагонали, то необходимо использовать следующийфрагмент программы:
А11 А12 А13 А14
A21 A22 A23 А24
A31 A32 A33 А34
A41 A42 A43 А44
for i:=1 to n-1 do
for j:=1 to n-1 do
if i+j
Если элементы,расположены ниже побочной диагонали, то необходимо использовать следующийфрагмент программы:
А11 А12 А13 А14
A21 A22 A23 А24
A31 A32 A33 А34
A41 A42 A43 А44
for i:=2 to n do
for j:=2 to n-1 do
if i+j>n+1 then
Транспонирование матрицы.
Транспонированнойматрицей называется матрица, у которой столбцы соответствуют строкам исходнойквадратной матрицы. При этом элементы главной диагонали исходной итранспонированной матриц, одни и те же.
Операция транспонированиясводится к обмену элементов матрицы, расположенных симметрично главнойдиагонали.
Исходная матрица
Транспонированная матрица
1
5
9
13
1
2
3
4
Фрагмент программытранспонирования матрицы:
for i:=1 to n do {Просмотрвсех строк матрицы}
for j:=i+1 to n do {Просмотрвсех элементов в строке, расположенных выше главной диагонали}
begin
k:=a[i,j];
a[i,j]:= a[j,i];
a[j,i]:= k;
end;
/>1.4 Примеры задач
1. Найти сумму всехэлементов некоторого двумерного массива и сравнить их с произведением элементовнекоторой строки.
program zadacha_1;
uses crt;
var
a: array[1..50,1..50] ofinteger; {массив}
i,j: integer; {переменныесчетчики}
n,m: integer; {количествострок и столбцов массива}
s: integer; {суммаэлементов массива}
p: integer; {произведениеэлементов некоторой строки}
q: integer; {некотораястрока}
begin
clrscr;
write('Введите количествострок: ');
readln(n);
write('Введите количествостолбцов: ');
readln(m);
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
writeln('Матрица:');
for i:=1 to n do
begin
for j:=1 to m do
begin
write(a[i,j]:3);
end;
readln;
end;
for i:=1 to n do
for j:=1 to m do
begin
s:=s+a[i,j];
end;
write('Введите номерстроки для работы: ');
readln(q);
p:=1;
for j:=1 to m do
begin
p:=p*a[q,j];
end;
writeln('Сумма элементовматрицы: ',s);
writeln('Произведениеэлементов строки ',q,' равна ',p);
if s>p then
begin
writeln('Сумма большепроизведения');
end
else
begin
writeln('Произведениебольше произведения');
end;
readln;
end.
2.Поменять второй столбецматрицы с предпоследним.
program zadacha_2;
uses crt;
var
a: array [1..50,1..50] ofinteger;
b: array [1..50,1..50] ofinteger;
m,n,i,j: integer;
begin
clrscr;
writeln('Количествострок');
readln(n);
writeln('Количествостолбцов');
readln(m);
for i:= 1 to n do
for j:= 1 to m do
begin
write('a[',i,',',j,']=');
readln (a[i,j]);
end;
writeln('Исходнаяматрица:');
for i:=1 to n do begin
for j:=1 to m do
write (a[i,j]);
writeln;
end;
for i:=1 to n do begin
for j:=1 to m do
b[i,j]:=a[i,j];
end;
for i:=1 to n do begin
a[i,2]:=b[i,m-1];
end;
for i:=1 to n do begin
a[i,m-1]:=b[i,2];
end;
writeln('Полученнаяматрица:');
for i:=1 to n do begin
for j:=1 to m do
write (a[i,j]);
writeln;
end;
readln;
end.
3.Дана матрицаразмерности m*n. Расположить элементы последнего столбца по убыванию.
program zadacha_3;
uses crt;
var
a:array [1..50] ofinteger;
b:array [1..50] of integer;
k,i,m,j,n,r,l:integer;
begin
clrscr;
write('Введите количествострок');
readln(n);
write('Введите количествостолбцов');
readln(m);
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,']={b[',j,']=}');
readln(a[i]);
end;
for i:=1 to n-1 do
for k:=i+1 to n do
{for j:=1 to m do}
if a[k]>a[i] then
begin
r:=a[i];
a[i]:=a[k];
a[k]:=r;
end;
writeln('Отсортированыймассив:');
for i:=1 to n do
writeln(a[i]:4);
readln;
end.
4. Дана квадратнаяматрица. Транспонировать её. Посчитать сумму всех нечётных элементовтранспонированной матрицы.
program zadacha_4;
uses crt;
var
a:array [1..5,1..5] ofinteger;
S,i,j,n,c:integer;
begin
clrscr;
write ('введите кол-вострок и столбцов ');
readln (n);
for i:=1 to n do
for j:=1 to n do
begin
write('a[',i,',',j,']=');
readln (a[i,j]);
end;
for i:=1 to n do
for j:=i+1 to n do
begin
c:=a[i,j];
a[i,j]:=a[j,i];
a[j,i]:=c;
end;
S:=0;
for j:=1 to n do
for i:=1 to n do
begin
if a[j,i] mod 2 0then
begin
S:=S+a[j,i];
end;
end;
writeln ('S=',S);
readln;
end.
5. Дан двумерный массив.Посчитать сумму его двух столбцов, вывести большую сумму.
program zadacha_5
uses crt;
var
a:array[1..3,1..3] ofinteger;
i,j,m,n,s,s1,p,p1,max,p3:integer;
begin
clrscr;
write('введите количествострок');
readln(n);
write('введите количествостолбцов');
readln(m);
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
begin
write('введите номерстолбца');
readln(p);
for i:=1 to n do
for j:=1 to m do
if j=p then s:=s+a[i,p];
write('s=',s);
readln;
end;
s1:=0;
begin
write('введите номердругого столбца');
readln(p1);
for i:=1 to n do
for j:=1 to m do
if j=p1 thens1:=s1+a[i,p1];
write ('s1=', s1);
readln;
end;
begin
max:=s;
if s
begin
max:=s1;
write('максимальная сумма',max);
readln;
write('вывести на экранномер столбца большей суммы', p3);
readln(p3);
end;
end;
end.
end.
6. Заполнить матрицу пообразцу:
program zadacha_6;
uses crt;
var
a:array [1..50,1..50] ofinteger;
n:integer;
i,j,k:integer;
begin
clrscr;
write ('Введитеколичество строк и столбцов в матрице');
readln (n);
k:=0;
for i:=1 to n do
for j:=1 to n do
if i=j then
begin
a[i,j]:=k;
k:=k+1;
end
else
begin
a[i,j]:=0;
end;
for i:=1 to n do
for j:=1 to n do
begin
writeln('a[',i,',',j,']=',a[i,j]);
readln;
end;
readln; end.
7. Дана квадратнаяматрица порядка N. В матрице вычислить среднее арифметическое положительныхэлементов, стоящих на главной диагонали
program zadacha_7;
uses crt;
Var
a:array[1..50,1..50] ofinteger;{массив}
i,j:integer;
s,n,k:integer;
sr:real;
begin
clrscr;
write('введите кол-вострок');
readln(n);
write('введите кол-востолбцов');
readln(n);
write ('введите кол-вочисел');
readln(k);
for i:=1 to n do
for j:=1 to n do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
s:=0;
begin
for i:=1 to n do
for j:=1 to n do
if a[i,j] > 0 then
s:=s+a[i,j];
sr:=s/n;
end;
write('sr=',sr);
readln;
end.
8. Найти сумму всехэлементов квадратной матрицы, расположенных по главной диагонали и выше ее.
program zadacha_8;
uses crt;
var
a: array [1..30,1..30] ofinteger;
i,j,s,n: integer;
begin
clrscr;
writeln ('введитеколичество строк и столбцов: ');
readln (n);
for i:=1 to n do
for j:=1 to n do
begin
write('a[',i,',',j,']=');
readln (a[i,j]);
end;
for i:=1 to n do
for j:=i+1 to n do
begin
if j>=i then
begin
s:=s+a[i,j];
end;
end;
writeln('s=',s);
readln;
end.
9. Дана вещественнаяматрица размерности n*m. Удалить k столбец матрицы.
program zadacha_9;
uses crt;
var
a: array [1..100,1..100]of real;
b: array [1..100,1..100]of real;
i,j: integer; {переменныесчётчики}
n,m: integer; {количествострок и столбцов в массиве}
k: integer; {№ строкикоторую необходимо удалить}
begin
clrscr;
write ('Введитеколичество строк в массиве');
readln (n);
write ('введитеколичество столбцов в массиве');
readln (m);
write ('Введите № строкикоторую надо удалить');
readln (k);
randomize; {ввод массиваслучайных чисел}
for i:=1 to n do
for j:=1 to m do
begin
a[i,j]:=random(100);
end;
for i:=1 to n do
for j:=1 to m do
begin
writeln('a[',i,',',j,']=',a[i,j]);
end;
writeln ('Новый массив');
for i:=1 to n do
for j:=1 to m do
begin
if jk then
{Проверка условия №столбца
неравен № столбца,
которыйнеобходимоудалить}
begin
b[i,j]:=a[i,j];
{если да, то новомумассиву
присваиваем проверяемыйэлемент }
end;
end;
for i:=1 to n do {выводнового массива}
for j:=1 to m do
writeln('b[',i,',',j,']=',b[i,j]);
readln;
end.
10. Дана вещественнаяматрица размерности n*m. Вывести номера столбцов, содержащих толькоотрицательные элементы.
program zadacha_10;
uses crt;
var
a: array[1..50,1..50] ofreal;
i,j: integer;
n,m: integer;
begin
clrscr;
write('введите кол-вострок ');
readln(n);
write('введите кол-востолбцов ');
readln(m);
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']=');
readln(a[i,j]);
end;
for j:=1 to m do
begin
if a[i,j]
begin
writeln ('номер столбца,в котором все элементы отрицательные= ', J);
readln;
end
else
begin
writeln ('в столбце ',J,'нет отрицательных или не
все отрицательныеэлементы ');
end;
end;
readln;
end.
11. В двумерном массивенайти минимальное число и определить в какой строке и каком столбце оннаходится.
program zadacha_11;
uses crt;
var
a:array [1..50,1..50] ofinteger; {описание масива}
i,j:integer; {переменные-счетчики}
min: real; { минимальноечисло}
n,m: integer; { кол-вострок, кол-во столбцов}
begin {начало программы}
clrscr;
write('введите кол-вострок '); {ввод кол-ва строк}
readln(n);
write('введите кол-востолбцов '); {ввод кол-ва столбцов}
readln(m);
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']='); { ввод элементов массива }
readln(a[i,j]);
end;
min:=a[1,1];
for i:=1 to n do
for j:=1 to m do
begin
if a[i,j]
min:=a[i,j];
end;
for i:=1 to n do
for j:=1 to m do
begin
if a[i,j]=min then
begin
writeln('минимальноечисло = ',min:5);
{вывод минимальногочисла}
writeln('номер элементаi=',i,',','j=',j);
{вывод номера мин.чис-ла}
end;
end;
readln;
end.
12. Развернуть квадратнуюматрицу на 90 градусов по часовой стрелке.
program zadacha_12;
uses crt;
var
a: array [1..30,1..30] ofinteger; {исходная матрица}
b: array [1..30,1..30] ofinteger; {промежуточная матрица}
c: array [1..30,1..30] ofinteger; {Матрица развёрнута на 90?}
i,j: integer; {переменныесчётчики}
m,n: integer; {количествострок и столбцов}
begin
clrscr;
write ('введитеколичество строк и столбцов ');
readln (n);
for i:=1 to n do {вводэлементов массива}
for j:=1 to n do
begin
write('a[',i,',',j,']=');
readln (a[i,j]);
end;
for i:=1 to n do
for j:=1 to n do
begin
b[i,j]:=a[n+1-i,j]; {промежуточнойматрицы присваиваем
элементы первоначальнойматрицы по закону: первому элементу
присваиваем строкипоследний, последнему первый, второму
элементу предпоследний,предпоследнему второй и тд.}
end;
writeln ('Матрицаразвёрнута на 90?.');
for i:=1 to n do
for j:=1 to n do
begin
c[i,j]:=b[j,i]; {третьейматрице присваиваем
элементы промежуточной позакону: первая строка
становится первымстолбцом и тд. }
writeln('c[',i,',',j,']=',c[i,j]); {печать массива развёрнутого на 90?}
readln;
end;
end.
2. Сортировка массивов
Задача сортировки(упорядочения) элементов массива в соответствии с их значениями относится кклассу классических задач, которые решались еще на первых е- mail –ах.
В настоящее времяразработано достаточно много различных методов сортировки. Одни из нихотносятся к методам простых сортировок. Другие к улучшенным. Однако досегодняшнего момента задача разработки метода, сочетал бы в себе все лучшиекачества остается открытой. Договоримся, что линейный массив, которыйнеобходимо упорядочить уже задан, т.е. описан и сгенерирован.
Различают следующие типысортировок:
1) по возрастанию
2) по убыванию
3) по не убыванию
4) по не возрастанию
При рассмотрении каждогометода будем сортировать элементы по неубыванию.2.1 Метод простых обменов (Пузырьковая сортировка)
Идея метода: Весь массиврассматривается несколько раз, причем при каждом рассмотрении сравниваютсязначения 2-х соседних элементов. Если они стоят в неправильном порядке, топроизводится их перестановка. Так происходит до тех пор, пока не будетвыполнено ни одной перестановки. Метод называют пузырьковой сортировкой потомучто меньшие значения элементов постепенно «всплывают», как пузырикивоздуха в воде, перемещаясь в начало массива, а «тяжелые» элементы «оседаютна дно».
7 0 -4 3 1 -2 5
-4 7 0 -2 3 1 5
-4 -2 7 0 1 3 5
-4 -2 0 7 1 3 5
-4 -2 0 1 7 3 5
-4 -2 0 1 3 7 5
-4 -2 0 1 3 5 5
Фрагмент:
For i:=2 to n do
For j:=n downto i do
if v[j]
begin
x:=v[j];
v[j]:=v[j-1];
v[j-1]:=x;
end;2.2 Сортировка простым выбором
Идея метода: весь массивпросматривается несколько раз и на каждом шаге ищется минимальный элемент изапоминается его порядковый номер. Затем найденный минимальный элемент меняетсязначением с первым, вторым, третьим и т.д. предпоследним элементом массива иисключается из рассмотрения
7 0 -4 3 1 -2 5
-4 0 7 3 1 -2 5
-4 -2 7 3 1 0 5
-4 -2 0 3 1 7 5
-4 -2 0 1 3 7 5
-4 -2 0 1 3 5 7
For i:= to n do
Begin
min:=v[i];
ind :=i;
for j:= i to n-1 do
if v[j]
bedin
min:=v[j];
ind:=j;
end;
x:=v[i];
v[i]:=v[ind];
v[ind]:=x;
end;2.3 Сортировка простым включением (Метод вставки исдвига)
Идея метода: делаетсяпредположение, что первые р элементов массива уже упорядочены и рассматриваетсяр+1 элемент. Если окажется, что он меньше чем какой либо из первых р, то онзанимает место большего, а участок массива ограниченный его новым местом истарым смещается в право.
7 0 -4 3 1 -2 5
0 7 -4 3 1 -2 5
-4 0 7 3 1 -2 5
-4 0 3 7 1 -2 5
-4 0 1 3 7 -2 5
-4 -2 0 1 3 7 5
-4 -2 0 1 3 5 7
For i:=2 to n do
For j:=1 to i-1 do
if v[i]
begin
x:=v[i];
for h:=1 downto j+1 do
v[h]:=i[h-1];
v[j]:=x;
end.
3. Параметры — массивы и параметры – строкиМожетсложиться впечатление, что объявление переменных в списке формальных параметровподпрограммы ничем не отличается от объявления их в разделе описания переменных.Действительно, в обоих случаях много общего, но есть одно существенноеразличие: типом любого параметра в списке формальных параметров может бытьтолько стандартный или ранее объявленный тип. Поэтому нельзя, например,объявить следующую процедуру:
Procedure S (a: array[1..10] of Real);
так как в спискеформальных параметров фактически объявляется тип-диапазон, указывающий границыиндексов массива.
Если мы хотим передатькакой-то элемент массива, то проблем, как правило, не возникает, но если вподпрограмму передается весь массив, то следует первоначально описать его тип.Например:
type
atype = array [1..10]ofReal;
Procedure S (a: atype);
Поскольку строка являетсяфактически своеобразным массивом, ее передача в подпрограмму осуществляется аналогичнымобразом:
type
intype = String [15] ;
outype = String [30] ;
Function St (s: intype):outype;
Требование описать любойтип-массив или тип-строку перед объявлением подпрограммы на первый взглядкажется несущественным. Действительно, в рамках простейших вычислительных задачобычно заранее известна структура всех используемых в программе данных, поэтомустатическое описание массивов не вызывает проблем. Однако разработкапрограммных средств универсального назначения связана со значительными трудностями.По существу, речь идет о том, что в Турбо Паскале невозможно использовать вподпрограммах массивы с «плавающими» границами изменения индексов.Например, если разработана программа, обрабатывающая матрицу 10х10 элементов,то для обработки матрицы 9x11 элементов необходимо переопределить тип, т.е.перекомпилировать всю программу (речь идет не о динамическом размещениимассивов в куче, а о статическом описании массивов и передаче их как параметровв подпрограммы). Этот недостаток, как и отсутствие в языке средств обработкиисключительных ситуаций (прерываний), унаследован из стандартного Паскаля ипредставляет собой объект постоянной и вполне заслуженной его критики.Разработчики Турбо Паскаля не рискнули кардинально изменить свойства базовогоязыка, но, тем не менее, включили в него некоторые средства, позволяющие визвестной степени смягчить отмеченные недостатки.Эти недостатки практическиполностью устранены в языке Object Pascal, используемом в визуальной средепрограммирования Delphi.
Прежде всего, в средеТурбо Паскаля можно установить режим компиляции, при котором отключаетсяконтроль за совпадением длины фактического и формального параметра-строки (см.прил.1). Это позволяет легко решить вопрос о передаче подпрограмме строкипроизвольной длины. При передаче строки меньшего размера формальный параметрбудет иметь ту же длину, что и параметр обращения; передача строки большегоразмера приведет к ее усечению до максимального размера формального параметра.Следует сказать, что контроль включается только при передаче строки,объявленной как формальный параметр-переменная. Если, соответствующий параметробъявлен параметром-значением, эта опция игнорируется и длина неконтролируется.
Значительно сложнееобстоит дело с передачей массивов произвольной длины. Наиболее универсальнымприемом в этом случае будет, судя по всему, работа с указателями ииспользование индексной арифметики. Несколько проще можно решить эту проблемупри помощи нетипизированных параметров (см. п.8.5). В версии Турбо Паскаля 7.0язык поддерживает так называемые открытые массивы, легко решающие проблемупередачи подпрограмме одномерных массивов переменной длины.
Открытый массивпредставляет собой формальный параметр подпрограммы, описывающий базовый типэлементов массива, но не определяющий его размерности и границы:
ProcedureMyProc(OpenArray: array of Integer);
Внутри подпрограммы такойпараметр трактуется как одномерный массив с нулевой нижней границей. Верхняяграница открытого массива возвращается функцией HIGH, упоминавшейся в п.4.1.1. Используя0 как минимальный индекс и значение, возвращаемое функцией HIGH, какмаксимальный индекс, подпрограмма может обрабатывать одномерные массивыпроизвольной длины:
{Иллюстрацияиспользования открытых массивов: программа выводит на экран содержимое двуходномерных массивов разной длины с помощью одной процедуры ArrayPrint}
Procedure ArrayPrint(aArray:array of Integer);
var
k: Integer;
begin
for k := 0 toHigh(aArray) do
Write(aArray[k]:8);
WriteLn
end;
const
A:array [-1..2] ofInteger = (0,1,2,3);
B: array [5..7] ofInteger = (4,5,6);
begin
ArrayPrint(A);
ArrayPrint(B)
end.
Как видно из этогопримера, фактические границы массивов А и В, передаваемых в качестве параметроввызова процедуре ArrayPrint, не имеют значения. Однако размерность открытых массивов(количество индексов) всегда равна 1 — за этим следит компилятор. Если бы,например, мы добавили в программу двумерный массив С
var
С: array [1..3,1..5] ofInteger;
то обращение
ArrayPrint(С)
вызывало бы сообщение обошибке
Error26: Type mismatch.
(Ошибка 26:Несоответствие типов.)
Список литературы
1.Пильщиков В.Н. Сборник упражнений по языку Паскаль: Учеб.пособие для вузов.-М.: Наука, 1989.-160с.
2. Семашко Г.Л., Салтыков А.И. Программирование на языкеПаскаль. М.: Наука 1988.-128с.
3. Введение в язык Паскалью./Абрамов В.Г. Трифонов Н.П.Трифонова Г.Н. Учеб. пособие .- М.: Наука 1988.-320с.
4.Могилев А.В. Практикум по инф-ке. Учебное пособие длястудентов уч. Заведений\ Могилев А.В., Пак Н.И., Хеннер Е.К., М.: Академия, 2001.-608с.