Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LECPAS42.DOC
Скачиваний:
15
Добавлен:
20.04.2015
Размер:
662.53 Кб
Скачать

Вывод массива. Под выводом массива понимается вывод на экран значений элементов массива. Вывод элементов одномерного массива на экран.

write(‘Вывод элементов одномерного массива ’);

for i:=1 to 10 do

begin

writeln (i,’ ’,a[i]);

end;

Пример 7.1.Вычисление суммы 10 – и элементов массива.

Program Prog7_1;

var

a:array[1..10] of real;

i:integer;

c:real;

begin

c:=0;

writeln('Вычислить сумму элементов массива');

writeln('Введите 10 элементов массива');

for i:=1 to 10 do

begin

write(i, элемент=);

readln(a[i]);

c:=c+a[i];

end;

writeln('Сумма элементов массива',c);

writeln('Для окончания работы нажмитеEenter);

readln;

end.

Пример 7.2.Вывод на экран номера и названия предметов учебного плана, хранящихся в массивеPred

Program prog7_2;

useswinCrt;

var

Pred:аггау[1..5] of string[20];

i: integer;

begin

Pred[1] = 'Информатика';

Pred[2] = 'Управление качеством';

Pred[3] = 'Менеджмент';

Pred[4] = 'Экология';

Pred[5] = 'Английский язык';

for i:=1 to 5 do

Writeln( i:2, pred[i]);

end.

Пример 7.3.Присваивание значений элементов одного массива другому.

Одномерные массивы могут присваивать свое значение целиком, если их типы эквивалентны:

program prog7_3;

uses WinCrt;

var

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

i:byte;

begin

write (“ввод массива”)

for i:=1 to 7 do

begin

read(a[i]);

b:=a;

end;

for i:=1 to 7 do

write(b[i]);

end.

{Пример 7.4. Программа ввода символов с использованием функцииEOLN.

Встроенная функция EOLN(EndOfLiNe) проверяет есть ли вве­денные символы, и если есть, то возвращаетtrue, если последний необработанный программой символ - "конец строки", соответствующий клавише <Enter>.

Если не введено ни одного символа, функция ожидает ввода строки с клавиатуры.}

Program Prog7_4;

uses WinCrt;

const

SIZE=30;

var

buf:array[l..SIZE] of char;

n:integer; { реальная длина введенной строки }

begin

write('->');

n:=0;

repeat

if NOT EOLN then

begin

n:=n+l;

read(buf[n]) ;

end;

until EOLN or (n=SIZE);

writein('Длина введенной строки ', n,'символов.');

end.

Пример 7.5.Программа преобразования строчных букв в прописные.

Алгоритм преобразования строчных букв в прописные буквы основан на том, что код строчной буквы больше кода прописной. Код прописных букв от "а" до "п" больше кода соответствующих строчных букв на 32, а для букв от "р" до "я" -на 80 (см. таблицу кодов ASCII).}

Program Prog7_5;

Uses WinCrt;

const

size=80;{длина строки }

var

buf:array [1 .. size] of char;

n:integer;{ длина введенной строки }

i:integer;

begin

n:=0;

write('->');

repeat

if not EOLN

then begin

n:=n+1;

read(buf[n]) ;

end;

until EOLN or (n=BSIZE);

{ здесь прочитана строка и записана в массив buf }

{ преобразование строки к верхнему регистру}

for i:=1 to n do

begin

case buf[i] of

'а'..'я':buf[i]:=chr(ord(buf[i])-32);

{ 'р'..'я':buf[i]:=chr(ord(buf[i])-80);}

end;

end;

{ вывод преобразованной строки }

writeln;

for i:=1 to n do

write(buf[i] ) ;

end.

В программе использована встроенная функция ORD, которая возвращает код (номер в таблицеASCII) символа, указанного в качестве ее аргумента.

Пример работы программы:

Преобразование строчных букв в прописные

ПРЕОБРАЗОВАНИЕ СТРОЧНЫХ БУКВ В ПРОПИСНЫЕ

Преобразование массива.

Пример 7.6. Перестановка элементов массива с номерамиnиm. Алгоритм реализуется присвоением промежуточной переменнойpзначения элемента массива с индексом n , элементу массива с индексом n значения элемента массива с индексом m, а элементу массива с индексом m значения промежуточной переменной p. }

Program Prog7_6;

Uses WinCrt;

var

a:array[1..4] of real;

p:real;

i,n,m:integer;

begin

read(n,m);

for i:=1 to 4 do

read(a[i]);

p:=a[n]; {перестановка}

a[n]:=a[m];

a[m]:=p;

for i:=1 to 4 do

write(a[i]);

end.

Пример 7_7. Удаление из массива элемента с номеромk.

Алгоритм реализуется сдвигом всех элементов с k- номера

на одну позицию влево.

Program Prog7_7;

uses WinCrt;

var

a:array[1..7] of integer;

i,k:byte;

begin

randomize;

write(' номер удаляемого элемента массива = ');

read(k);

writeln ('ввод массива')

for i:=1 to 7 do

begin

a[i] := random(20);

write(a[i], ' ');

end;

writeln;

for i:=k to 7 do

begin

a[i]:=a[i+1];

end;

for i:=1 to 6 do

begin

write(a[i], ' ');

end;

end.

Пример 7.8.Перенос в конец массива элемента сk-ой позиции.

Алгоритм реализуется с помощью действий:

 сохранение k- элемента в дополнительной переменнойp:

 сдвиг элементов следующих за k-ым на одну позицию влево.

 восстановление последнего значения из переменной p.

Program Progn;

uses WinCrt;

Const

n=7;

var

a:array[1..n] of integer;

i,k:byte;

begin

randomize;

write(' номер элемента = ');

read(k);

writeln ('ввод массива')

for i:=1 to n do

begin

a[i] := random(20);

write(a[i], ' ');

end;

p:=a[k];

writeln;

for i:=k to n-1 do

begin

a[i]:=a[i+1];

end;

a[n]:=p;

for i:=1 to n do

begin

write(a[i], ' ');

end;

end.

Пример 7.9.Перенос в начало массива элемента сk-ой позиции.

Алгоритм реализуется с помощью следующих действий:

 Ввод элементов массива.

 Сохранение k-элемента в дополнительной переменнойp.

 Сдвиг всех элементов до элемента с номером kвправо.

 Записать на первое место значение из переменной р.}

Program Prog7_9;

uses WinCrt;

const

n=7;

var

a:array[1..n] of integer;

i,k:byte;

begin

randomize;

write(' номер элемента = ');

read(k);

writeln ('ввод массива')

for i:=1 to n do

begin

a[i] := random(20);

write(a[i], ' ');

end;

p:=a[k];

writeln;

for i:=k downto 2 do

begin

a[i]:=a[i-1];

end;

a[1]:=p;

for i:=1 to n do

begin

write(a[i], ' ');

end;

end.

Пример 7.10.Вывод температуры воздуха в течение недели и вычисление

сред­него значения. Для подсказок используется массив строк dey.

Var

dey:аггау[1..7]of string[11]; {названия дней недели}

temper:аггау[1..7]ofгеа1; {температура)

st:real;{сумма температур за неделю}

sred:геа1; (средняя температура за неделю}

i:integer;

begin

st:=0;

dey[1]: ='Понедельник';

dey[2]: ='Вторник';

dey[3]: ='Среда';

dey[4]: ='Четверг' ;

dey[5]:='Пятница';

dey[6]: ='Суббота' ;

dey[1]: ='Воскресенье';

Writeln('Задайте температуру воздуха за неделю.');

for i:=1 to 7 do

begin

writeln(dey[i]), ' ');

read(temper [1]) ;

st:=st+ temper [1;

end;

{ вычисление средней температуры за неделю }

sred:=st/7;

Wrtiteln('Средняя температура за неделю: ',sred:6:2) ;

end.

Сортировка массива.Под сортировкой массива подразумевается процесс перестановки элементов с целью упорядочивания их в соответствии с каким-либо критерием.

На­пример, если имеется массив целых чисел а , то после сортировки по возрастанию должно выполняться условие:

а[1] < а[2] <. ...<а[size]

где size- верхняя граница индекса массива.

Так как можно сравнивать переменные типов integer,real,char,string, то можно сортировать массивы этих типов.

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

не­упорядоченном.

Существует много методов (алгоритмов) сортировки массивов. Здесь мы рас­смотрим два метода:

 метод прямого выбора

 метод прямого обмена

Сортировка методом прямого выбора. Алгоритм сортировки массива по возрастанию методом прямого выбора мо­жет быть представлен так:

  1. Просматривая массив от первого элемента, найти минимальный и

помес­тить его на место первого элемента, а первый на место минимального.

  1. Просматривая массив от второго элемента, найти минимальный

поместить его на место второго элемента, а второй на место минимального.

3. И так далее до предпоследнего элемента.

Ниже представлена программа сортировки массива целых чисел по возрас­танию. Для демонстрации процесса сортировки программа выводит массив после каждого обмена элементов.

Program Prog7_3;

uses WinCrt;

const;

size=5;

var

а:аrrау[1..size] of integer;

i:integer; { номер элемента, от которого ведется поиск }

{ минимального эл-та }

min, nc:integer; {значение минимального элемента и его номер }

j:integer; { номер эл-та, сравниваемого с минимальным }

buf: integer; { буфер, используемый при обмене эл-тов массива }

k:integer;

begin

writeln ('Сортировка массива.');

write('Введите',size:3,'целых числа через пробел и нажмите<Enter>');

for k:=1 to size do read(a[k]);

writeln('Сортировка');

for i:=1 to size-1 do

begin

{ поиск минимального элемента массива от а[1] до а[size]}

min:=a[i];

for j:=i+1 to size do

begin

if a[i]>a[j] then

begin

min:=a[j];nc:=j;

{поменяем местами а[min] и а[i]}

buf:=a[i];

а[i]:=а[j];

а[j]:=buf;

end;

end;

{ вывод массив}

for k:=1 to size do write(a[k]), ' ');

writeln;

end;

writeln ('Массив отсортирован.');

end.

Пример работы программы:

Сортировка массива.

Введите 5 целых в одной строке через пробел и нажмите <Еnter>

12 -3 56 47 10

Сортировка

-3 12 56 47 10

-3 10 56 47 12

-3 10 12 47 56

-3 10 12 47 56

Массив отсортирован.

Сортировка методом прямого обмена. В основе алгоритма - обмен значениями соседних элементов массива. Каждый эле­мент массива, начиная с первого, сравнивается со следующим и если он больше следующего, то элементы меняются местами. Таким образом, эле­менты с меньшим значением сдвигаются к началу массива (всплывают), а элементы с большим значением - к концу массива (тонут), поэтому этот метод иногда называют "пузырьковым". Этот процесс повторяется на едини­цу меньше раз, чем элементов в массиве.

На рис. 7.1. показан пример процесса сортировки массива. Буквой ("а") обо­значено исходное состояние массива и перестановки на первом проходе, буквой ("б") - состояние после перестановок на первом проходе и переста­новки на втором проходе и так далее. Ниже представлена программа сортировки массива целых чисел по возрастанию. Программа выводит массив после каждого цикла обмена.

i=1

3

2

2

2

1

i=2

2

3

3

1

2

i=3

4

4

1

3

3

i=4

5

1

4

4

4

i=5

1

5

5

5

5

а б в г д

Пример 7.4.Программа сортировки массива целых чисел по возрастанию с

помощью метода прямого обмена.

Program Prog7_4;

uses wincrt;

const

size=5;

var

a:array[1..size] of integer;

i:integer; { счетчик циклов }

buf: integer; { буфер для обмена эл-тов массива }

k:integer; {текущий индекс элемента массива}

begin

writeln ('Сортировка массива пузырьковым методом');

write('Введите',size:3,' целых числа через пробел и нажмите enter');

for k:=1 to size do read(a[k]);

writeln('Сортировка');

for i:=1 to size-1 do

begin

for k:=1 to size-1 do

begin

if a[k]>a[k+1] then begin

{меняем местами а[k] и а[k+1]}

buf:=a[k];

a[k]:=a[k+1];

a[k+1]:=buf;

end;

end;

{ выведем массив}

for k:=1 to size do write(a[k],' ');

writeln;

end;

writeln ('Массив отсортирован.');

end.

Пример работы программы:

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

Введите 5 целых в одной строке через пробел и нажмите <Еnter>

3 2 4 5 1

Сортировка.

2 3 4 1 5 '

2 3 1 4 5

2 1 3 4 5

1 2 3 4 5

Массив отсортирован.

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

Поиск минимального (максимального) элемента массива. Алгоритм поиска минимального (максимального) элемента массива очевиден: делается предположение, что первый элемент массива является минимальным (максимальным), затем остальные элементы массива сравниваются с этим элементом. Если обнаруживается, что проверяемый элемент меньше (больше) принятого за минимальный (максимальный), то этот элемент

принимается за минимальный (максимальный) и продолжается про­верка оставшихся элементов.

Пример 7.5.Программа поиска мини­мального элемента в массиве целых

чисел.

Program Prog7_5;

uses WinCrt;

const

n=10;

vаг

a:array[1. .n] of integer; { массив целых }

min:integer; { номер минимального эл-та массива }

i:integer; { номер эл-та сравниваемого с минимальным }

begin

{ ввод массива }

min:=a[1];{ пусть первый элемент минимальный }

for i:=2 to n do

If a[i] <min then min:=a[i]; nc:=i;

writeln('Минимальный элемент массива:',min);

wtiteln('Номер элемента:',nc);

end.

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

Пример 7.6.Программа поиска методом простого перебора.

Перебор элементов массива осуществляет инструкция REPEAT, в теле которой инст­рукцияIFсравнивает текущий элемент массива с образцом и присваивает переменнойpoiskзначениеTrue, если текущий элемент равен образцу. Цикл завершается, если в массиве обнаружен элемент, равный образцу (poisk=True), или если проверены все элементы массива. По завершении цикла, по значению переменнойfoundможно определить, успешен поиск или нет.

Program Prog7_6;

var

mas:аггау[1. . 10] of integer; { массив целых}

obr: integer; { образец для поиска }

naiden:boolean; { признак совпадения с образцом )

i: integer;

begin

(ввод 10 целых чисел}

Write('Введите 10 целых чисел в одной строке через пробел ');

Writeln('и нажмите <Еnter>');

For i:=1 to 10 do read (mas[i]); { числа введены в массив }

Write('Введите образец для поиска (целое число)-> ');

Read(obr) ;

( поиск простым перебором }

naiden:=false;; ( совпадений нет }

i:=1; { проверяем с первого элемента массива }

гереаt

if mas[i] =obr then naiden:= true { совпадение с образцом }

elsei:=i+1;{ переход к следующему элементу }

Until(i>10)ornaiden; {завершим, если совпадение с образцом или}

{проверен последний элемент массива }

Ifnaidenthenwrite('Поиск успешен. Элемент ',i, ' найден');

else write ('Совпадений с образцом нет.');

end.

Пример работы программы:

Поиск в массиве.

Введите 10 целых в одной строке через пробел и нажмите <Enterг>

->123 45 -17 23 56 2 -8 0 14 324

Введите образец для поиска (целое число)->2

Совпадение с элементом номер 6. Поиск успешен.

Данный алгоритм может использоваться для поиска как в числовых, так и в строковых массивах.

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

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

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

1

-5

1

-5

verh

2

-1

2

-1

3

0

verh

3

0

sred

4

2

sred

4

2

5

13

5

13

niz

6

44

niz

6

44

7

70

7

70

8

75

8

75

9

91

9

91

Рис . Выбор среднего элемента массива при бинарном поиске

Если средний элемент равен образцу, то задача считается решенной.

Если средний элемент меньше образца, то искомый элемент расположен выше среднего элемента (между элементами с номерами verhиsred).

Если средний элемент больше образца, то искомый элемент расположен :

ниже среднего (между элементами с номерами sredиniz.

После того как определена часть массива, в которой может располагать ис­комый элемент, поиск проводят в этой части, выделяя новый средний эле­мент. Номер среднего элемента вычисляется по формуле (niz-verh)/2+verh.

Ниже(рис ) представлены алгоритм и текст программы бинарного поиска в массиве. В про­грамму добавлены операторы вывода значений переменных verh,nizиsred. Выводимая информация полезна для понимания сути алгоритма. Кроме того, переменнаяnпозволяет оценить эффективность этого алгоритма по сравнению с поиском методом простого перебора (для массивов, упорядо­ченных по возрастанию).

Program prog7_7;

Uses WinCrt;

var

а:аггау [1. . 9] оf integer; { массив целых }

obr: integer; { образец для поиска }

sred,niz,verh:integer; { номера среднего, верхнего и нижнего}

{ эл-тов массива}

naiden.bolean; { признак совпадения с образцом }

n:integer; ( счетчик сравнений с образцом }

i: integer;

begin

{ ввод 9 целых чисел }

writeln('Бинарный поиск в массиве.');

write('Введите 9 целых в одной строке через пробел ');

writeln ('и нажмите <Enter>');

for i:=1 to 9 do read(а[i]); { ввод массива }

writeln('Введите образец для поиска (целое число) ');

read(obr) ;

{ бинарный поиск }

verh:=1;

niz:=9;

naiden:=false;

n:=0 ;

writeln(' verh, niz, sred');

repeat

sred:=(niz-verh) div 2+ verh;

writeln(verh:6,niz:б,sred:6) ;

n:=n+1;

if a[sred] =obr then naiden:= true

else begin

if obr<a [sred] then niz:=sred-1

else verh:=sred+1;

end;

until (verh>niz) or naiden;

if naiden then writeln ('Совпадение с элементом номер ',

sred,'. Выполнено ',n,' сравнений.')

elsewriteln('Образец в массиве не найден.');

readln;

end.

Пример работы программы

Бинарный поиск в массиве.

Ваедите 9 целых в одной строке через пробел и нажмите <Enter>

-5 -1 0 2 13 44 70 75 91

Введите образец для поиска (целое число) 70

verh niz sred

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]