metodicheskoe_posobie_8


Чтобы посмотреть этот PDF файл с форматированием и разметкой, скачайте его и откройте на своем компьютере.







Основы
программирования

на языке Паскаль

для учащихся
8
класса





составитель Волкова Е. И.







200
5

г.


2

Содержание



Введение

3


Повторение

4

Часть
I

I. 1.

Структурированный тип данных. Особенности
работы с одномерными массивами

15

I
. 2.

Формирование одномерных массивов

22

I. 3.

Еще задачи на одномерные массивы

25

I. 4.

Двумерные массивы. Особенности работы с
двумерными массивами

27

I. 5.

Формирование двумерных массивов

34

I. 6.

Еще задачи на двумерные массивы

39

Часть
II

II. 1.

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

42

II. 2.

Сортировка массивов. Сортировка элементов
одномерного массива методом «пузырька»

44

Часть
III

II
I
.
1
.

Символьный тип данных

47

II
I
. 2.

Строковый тип данных

49

II
I
.
3
.

Процедуры и функции работы со строковыми
величинами


52

III
.
4
.

Использование массивов в решении задач на
обработку строк

55
















3

Введение




Данное учебное пособие предназначено для изучения курса алгоритмизации и
программирова
ния в
8

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

Учебное пособие с
остоит из
трех

основных
частей
, которым предшествует краткий
курс повторения
.

Основное содержание книги


это ознакомление с новыми типами
данных и применение их в решении задач.


В первой части учебного пособия вы узнаете:

-

что такое
массив
;

-

как
ие за
дачи
можно
решать, используя этот тип данных.

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

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


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

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

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

Каждое задание помечено маркером, характеризующим специфику работы с ним:


-

задание для выполнения дома;



-

задание для выполнения в классе с помощью учителя;


-

задание дл
я самостоятельного решения во время урока;



-

задание повышенной сложности.

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

типы данных
.


















4

Повторение


Тема: Информация


Справочная информация



Сообщение, уменьшающее неопределенность знаний в два раза, несет
1 бит

информации.



Информативность сообщения (i) о том, что произошло одно из N равновероятных
событий, можн
о вычислить из формулы
N
=2
i

.



Для вычисления информативности текста (
I
), состоящего из
K

символов, каждый
из которых имеет информативность
i

, применяется формула
I
=
K

*
i

. Для
вычисления информативности символа нужно воспользоваться предыдущей
формулой, у
читывая, что
N


мощность алфавита
, в котором напечатан текст.

Задачи

1.

Какое количество информации несет в себе сообщение о том, что нужная вам
программа находится на одной из восьми дискет?


2.

Какое количество информации получит второй игрок при игре в крес
тики
-
нолики на поле 8х8, после первого хода первого игрока, играющего
крестиками?

3.

В рулетке общее количество лунок равно 128. Какое количество информации
мы получаем в зрительном сообщения об остановке шарика в одной из лунок?

4.

В корзине 16 разноцветных ша
риков. Сколько бит информации несет
сообщение о том, что вытянут красный шарик?

5.

В мешках лежат фишки: в первом


8 штук, а во втором


32 штуки. Известно,
что в каждом из мешков нет одинаковых фишек. Какое сообщение несет
информации больше: «Из первого меш
ка достали черную фишку!» или «Из
второго мешка достали черную фишку!»?
О
твет обосновать.

6.

Заполнить пропуски числами
.


а) 5 Кбайт = __ байт = __ бит,

б) __ Кбайт = __ байт = 12288 бит;

в) __ Кбайт = __ байт = 213 бит;

г) __Гбайт =1536 Мбайт = __ Кбайт;


д) 512 Кбайт = 2__ байт = 2__ бит.

7.


Найти
x

из следующих соотношений:

а) 16
x

бит = 32 Мбайт;

б) 8
x

Кбайт = 16 Гбайт.

8.

Сколько бит информации несет текст «
Казнить нельзя, помиловать!
», если
текст написан в компьютерном алфавите

(256 символов)?

9.

В резу
льтате преобразования графического изображения
20х40 пикселей
количество цветов уменьшилось с 256 до
4
.
Во сколько раз уменьшится объем
видеопамяти, занимаемый этим изображением?

10.

Какова мощность алфавита, с помощью которого записано сообщение,
содержащее 2
048 символов, если его объем составляет 1/512 часть одного
мегабайта.

11.

Пользователь компьютера, хорошо владеющий навыками ввода информации с
клавиатуры, может вводить в минуту 100 знаков. Мощность алфавита,
используемого в компьютере равна 256. Какое количе
ство информации в
байтах может ввести пользователь в компьютер за
8

минут
?


12.

*
Два текста содержат одинаковое количество символов, но информативность
первого текста в 1.5 раза больше. Известно, что мощности алфавитов обоих
текстов не превышают 10 символов,

и символы кодируются целым числом
битов.
Каковы мощности алфавитов?



5

Тема: Системы счисления


Справочная информация



Система счисления



это способ изображения чисел и соответствующие ему
правила действия над числами.



В
позиционных системах

счисления от по
зиции цифры в числе зависит величина,
которую она обозначает.



Количество используемых цифр в позиционной системе счисления называется
основанием
, а сами цифры
-

алфавитом
.


Алгоритм перевода чисел из системы с новым основанием в десятичную
систему

1.

Нумеруе
м цифры числа от запятой справа налево, начиная с 0;

2.

Составляем сумму произведений цифр, на степени основания системы
соответствующие номерам;

3.

Выполняем арифметические операции.

Например: А2
16

Х
10

А
1
2
0
16

=10*16
1
+2*16
0
=160+2=162
10


Алгоритм перев
ода чисел из десятичной системы в систему с новым
основанием

1.

Делим число на основание новой системы счисления, записывая остаток


младший разряд целой части числа в новой системе;

2.

Полученное частное снова делим, выписывая остаток;

3.

И так до тех пор, пока п
оследнее частное не станет меньше основания


старший
разряд числа.

4.

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

Например:

126
10
Х
2

126

2






126

63

2






0

62

31

2






1

30

15

2






1

14

7

2






1

6

3

2





1

2

1






1


126
10
=1111110
2

Алгоритм перевода чисел из системы с основанием 2
i

в двоичную систему
счисления

1.

Переводим по отдельности цифры числа по правилам перевода из десятичной
системы в двоичную систему;

2.

Запись к
аждой цифры должна состоять из
i

бит. В случае недостающих битов,
дописываем незначащие нули;

3.

Объединяем переводы в одно число. Приписываем индекс 2.

Например: 65
8

Х
2

А теперь переведем цифры восьмеричного числа по отдельности как десятичные
числа в

двоичную систему счисления.

6:2=3(ост. 0) 5:2=2(ост. 1)

3:2=1(ост. 1) 2:2=1(ост. 0)

110
2

101
2

Ответ: 110101
2
.


6

Алгоритм перевода чисел из двоичной системы счисления в
систему с
основанием 2
i

1.

Разбиваем число, начиная с конца по
i

символов. В случае недостающих битов,
дописываем незначащие нули;

2.

Переводим по отдельности группы в десятичную систему;

3.

Объединяем переводы в одно число. Приписываем индекс системы.

Осуществим

перевод: 111000100
2

Х
8
.


7 0 6

Ответ:706
8
.


Задачи

1.

Верно

ли записаны числа:
В8
16
,
61
6
, 19
8
,
1
2
3
,
А
3
13
?

2.

Осуществите перевод: А2
16

Х
10
,

23
6
10
Х
8
, 45
13

Х
7

.

3.

Осущ
ествите перевод
, минуя десятичную систему
:


F83
16

Х
2

,

1010011
2

Х
8
, 45
637
8


Х
4

.

4.


Решите уравнения:


252
7
-
140
6
Х
3
=111
1
2
;

1
B
12
Х
5
-
110
3
=321
4
.


5.

* Выполните действия в предложенной системе счи
сления:


2345
8
+4531
8
-
2451
8
=?;
FB
5
16
+
A
34
C
16
+138
E
16
-
66
AF
16
=
?; 11100
2
-
10001
2
+1110
2
=?





























7

Тема:
Представление чисел в памяти компьютера. Числовые типы



данных


Справочная информация


Алгоритм кодирования чисел без уче
та знака

1.

Перевести число в двоичную систему;

2.

Дополнить незначащими нулями до байта (или машинного слова).

Алгоритм кодирования чисел с учетом знака

!

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

Если число отрицат
ельное, то:

1.

Переводим в двоичную систему модуль числа;

2.

Дополняем до байта (слова);

3.

Инвертируем (единицы заменяем нулями, а нули единицами);

4.

Прибавляем единицу по правилам двоичной арифметики.

Например, закодируем

126 в одном байте.

1) Переведем модуль:

126

2






126

63

2






0

62

31

2






1

30

15

2






1

14

7

2






1

6

3

2





1

2

1






1


Получили 1111110.

2) Дополним до байта: 01111110.

3) Инвертируем: 10000001

4) Прибавим 1:


10000001

+ 1


10000010

Отве
т: 10000010.




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


0. а у отрицательных


слева 1.


Алгоритм декодирования неотрицательных чисел

1.

Перевести число в десятичную систему.


Алгоритм декодирования отрицательных чисел

1.

Инвертируем число (меняем единицы на нули, а нули на единицы);

2.

Прибавляем единицу;

3.

Переводим в десятичную систему;

4.

Перед результатом ставим знак минус.

Например. Декодировать число 10011011.


=64+32+4+1=101
10

О
твет:
-
101.


8

Задачи

1.

Закодируйте в
одном байте числа 15, 45, 138.

2.

Почему число 256 нельзя
закодировать

в одном байте?

3.

Закодируйте в одном байте числа
-
78, 39 и
-
128 с учетом их знака.

4.

Чем отличаются типы
byte

и
shortint
?
Определите диапазон значений этих
тип
ов.

5.

Даны коды чисел типа
shortint

: 10000011, 11110000 и 00001100. Что это за
числа?

6.

Сложите два числа: 11001101 и
0
1100011

с учетом их знака
.

Раскодируйте
слагаемые и результат и убедитесь в правильности сложения.


7.

Определите диапазон типа
word
.

8.

Докажите
, что диапазон типа
integer

от
-
32768 до 32767.




































9

Тема: Начала

программирования на языке Паскаль


Справочная информация

Структура программы на языке Паскаль


Описательная
ч
асть


Uses <раздел описания модулей>;

Label <раздел

описания меток>;

Const < раздел описания констант>;

Type <раздел описания типов>;

Var <раздел описания переменных>;

Procedure <раздел описания процедур>;

Function <раздел описания функций>;


Исполнительная
часть


Begin

<тело программы, состоящее из опер
аторов>;

End.


Р
азделы
описательной части

программы
, которые мы ранее использовали
:

Uses


-
для подключения модуля текстового режима
CRT

;

Var

-
для перечисления

п
еременных, исполь
з
уемых в программе с указанием их


типов
.



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

В

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


Отдельная команда языка называется
оператором
.

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

и
End
.

Сущность операторных скобок
такая же, как и у математических,


в них заключаются операторы, которые будут
выполняться в первую очередь. Операторные скобки (
Begin

End
) мы испол
ьзовали
и будем использовать в условных и циклических операторах чтобы выделить их
тело.

Запомните:

!

После каждого оператора или указателя типа в разделе Var ставится “
;
”.

!

В конце программы ставится точка.

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




Переменная


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





Для любознательных

Модуль


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

и

GRAPH
. В
модуле
CRT

собраны подпрограммы, позволяющие оформлять текст на экране, а в модуле
GRAPH

подпрограммы рисования. Чтобы познакомиться с их возможностями подробно, нужно обратиться к
специальной литературе. Мы будем использов
ать две процедуры модуля
CRT
:
Clrscr

(чистка экрана),
Readkey

(прерывание выполнения программы, пока не будет нажата клавиша).


10

!

Имя переменной

ил
и д
ругого программног
о объекта н
азывается
идентификатором
.

Идентификатор


это слово, состоящее из латинских букв (в слове могут быть
использованы цифры и знак
_

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

!

Чтобы написать программу нужно:

1.

Внимательно прочитать задачу;

2.

Определить исходные данные и дать идентификаторы

переменным, в которые
они будут помещены
;

3.

Определиться с идентификаторами результатов;

4.

Определить типы переменны
х, в которых будут храниться данные и результаты;

5.

Оформить описательную часть;

6.

Оформить исполнительную часть по следующей схеме:

Begin

<ввод данных>;

-

помещаем данные в переменные


<обработка данных>;

-

набор операторов, выполняя которые, комп
ьютер из


переменных
-
данных заполнит переменные
-
результаты

<вывод результатов>;

-

печатаем содержимое переменных
-
результатов на экран

End.

7.

Дополнить описательную часть, если

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


Краткий обзор операторов языка Паскаль

Формат

Назначение

Правила
использования

Read(
список

ввода
�);

Read(a,b,c);

Readln(a,b);

Процедура ввода
данных

в память
компьютера
.
.

Данные вводятся в порядке
перечисления их
идентификато
ров, с учетом
типа.

write(

список

вывода

);
write(

сумма
:
’,sum
);
writeln(
a,b,c
);

Write(р:6:4);
-
для переменных
вещественного типа.

Процедура вывода на
экран. Происходит
вывод значений
указанных переменных
и текста.

Значения выводятся в
порядке перечисл
ения в
списке. Элементы списка
вывода отделяются друг от
друга запятой. Текст
заключается в апострофы.

Окончание
ln

означает, что после выполнения оператора курсор перейдет в новую
строку.



«переменная»:= «выражение».


Оператор
присваивания.
Происходит
присвоение
переменной
значения
указанного
выражения.

Необходимо, чтобы значение
выражения и переменная
были совместимы по типу.

If


условие

then

begin



операторы1



end


else
begin



операторы
�2


end
;

-

полная форма


If


условие

then

begin



операторы



end
;

Условный
оператор. В
зависимости от
исти
нности
условия
выполняет ту или
иную серию
операторов.

Then



тогда ,
else

-

иначе.

Перед else ; не ставится.

Если
по той или иной ветви
оператор один, то его можно
не заключать в операторные
скобки. Если условие
сложное то используются
логические операци
и and, or,
not и части условия берутся в
алгебраические скобки.



11


-

краткая форма

Формат

Назначение

Правила использования

Case

<выражение>
of

<значение1>:
begin



<операторы1>


end
;

<значение2>:
begin


<опе
раторы2>


end
;

.

.


значение
N
�:
begin



операторы
N



end



else

begin


операторы


end
;

end
;

Оператор выбора.
Находит значение
выражения, ищет
его в списке
вариантов
значений и

выполняет
соответствующую
серию операторов.

Если по ветви оператор один,
то операторные скобки
можно не писать.

Веточку «иначе» иногда не
используют.


While


условие

do

begin



тело

цикла



end
;

Оператор цикла с
предусловием.
Пока условие
истинно
повторяется тело
цикла.

Условие может быть простым
и сложным. Если тело цикла
состоит из одного оператора,
то операторные скобки не
пишут.

Repeat


<тело цикла>

Until
<условие>;

Оператор цикла с
посту
словием
.

Повторяй тело
цикла
, до
выполн
ения

услови
я.

Те же правила.

Тело цикла хоть раз да
выполнится.


For
<п
а
р
.
>:=<н
.
з
.
�to
(
downto)

к
.
з
�.
do

begin




тело

цикла




end
;


Оператор цикла с
параметром
.

Повторяй тело
цикла,
пока

параметр цикла не
достигнет
конечного
значения
.

to



увеличить параметр на 1,
downto



уменьшить
параметр на 1.
Параметр
цикла
не
может быть
вещественного типа.

Е
сли
тело цикла состоит из
одного
оператор
а
, то операторные
скобки

не пишут
.



Арифметическое в
ыражение

задает порядок выполнения действий над
числовыми величинами. Оно составляется из чисел, переменных, арифметических
операций, функций, скобок.

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

+,
-
, *, /,
div

(деление нацело: 26
d
iv

7=3
)
,
mod

(деление с остатком: 26 mod 7=5)
.

Если эти операции выполняются над целыми числами, то результатом будет целое
число (
!

Исключение составляет операция
/
-

результат, при выполнении этой
операции
-

вещественное число
real
)
.

Операции
div

и
mod

вы
полнимы только с целыми числами.

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

Abs
(
x
)
-
модуль числа х
,

sqr
(
x
)
-

квадрат числа х
,

sqrt
(
x
)
-
квадратный корень из числа х,

tranc
(
x
)
-

целая часть числа х
,

round
(
x
)
-

округление числа х до цело
го.

Правила записи арифметических выражений:

1.

Выражение записывается в строчку без пробелов и переносов.

2.

Не допускается следование двух знаков подряд.

3.

Выражения в скобках выполняются в первую очередь.

4.

Операции выполняются в порядке приоритета:
-

функция

-

*, /, div, mod

-

+,
-
.


12

Задачи

1.

Составить
программу, вычисляющую значение арифметического выражения:

.

2.

Составить программу к решению задачи: «Дано пятизначное число. Посчитать
сумму его цифр».

3.

Составить программу к решению задачи:
«
Дано

пятизначное число. Если первые
две его цифры четные, а последняя ноль, или первая и последняя нечетные, то
выведите на экран его среднюю цифру, а иначе посчитать сумму цифр
»
.

4.

Определить

результат

выполнения

программы
, составив таблицу истинности
условия
:

Var a, b, c:integer;

Begin

A:=10; b:=2; c:=6;

If ((a mod 2=0) or (a mod 3=0)) and (not(�bc) and (a�b)) then write(a) else write(b);

End
.

5.

Составить программу к решению задачи:

«
Дано число
a
. Вывести ответ: каким
будет значение выражения (
a
+2)
2
-
24 (отрицател
ьным, положительным, нулем)
»
.

6.

Составить программу к решению задачи:
«
Дано трехзначное число. Найти в нем
максимальную цифру
»
.

7.

Составить программу к решению задачи:

«
Даны четыре различных числа. Найти
сумму не максимального и не минимального из них
»
.

8.

Соста
вить программу к решению задачи:
«
По номеру дня недели вывести его
название
»
.

10. *
Составить программу к решению задачи:

«
Попадет ли точка в заштрихованную
область?
»
.















Комментарий:

Точка попадет в заштрихованную область, если она будет расположена над прямыми
L

и
осью
X
,
правее
оси

У и внутри
окружности.

y=kx+b


уравнение прямой, проходящей через две точки.

То есть точка лежит на прямой, если выполняется равенство: y=kx+b.

А если точка лежит под прямой, то должно выполняться неравенство y
А если точка лежит над прямой, то должно выполнят
ься неравенство y>kx+b.


-

уравнение окружности с центром в начале координат и радиусом
R
.

То есть точка лежит на окружности, если выполняется равенство:


А если точка лежит внутри окружности, то должно выполн
яться неравенство
.

А если точка лежит вне окружности, то должно выполняться неравенство
.

Осталось найти уравнения линий и составить условие.


4

1,5

3

0

L


13

11.

Составить программу к решению задачи:

«
Попадет ли точка в заштрихованную
обл
асть?»















12.

Составить программу к решению задачи:

«Вывести на экран 100 раз «Привет!»».

13.

Составить программу к решению задачи:

«Вывести на экран
n

раз «Привет!»».

14.

Составить программу к решению задачи:

«Ввести с клавиатуры
n

чисел».

15.

Составить прогр
амму к решению задачи:

«
Найти среднее арифметическое
n

чисел
,

введенных с клавиатуры
»
.

16.

Составить программу к решению задачи:

«
Найти
количество четных
положительных чисел из
n

чисел
,

введенных с клавиатуры
»
.

17.

Составить программу к решению задачи:

«
Найти
макс
имальное число из
n

чисел
,

введенных с клавиатуры
»
.

18.

Составить программу к решению задачи:

«
Вывести на экран ряд, в котором будут
записаны степени числа 3, начиная с нулевой и заканчивая десятой
»
.

19.

Составить программу к решению задачи:

«
Найти факториал задан
ного числа
»
.

20.

Составить программу к решению задачи:

«
Найти а
х
».

21.

Составить программу к решению задачи:

«
Найти делители числа

n
»
.

22.

Составить программу к решению задачи:

«
Определить, является ли число
простым
»
.

23.

Составить программу к решению задачи:

«
Вводить чи
сл
а

с клавиатуры, пока не
будет введен
о задуманное число, при этом выводить сообщение «много» или
«мало»
.

24.

Составить программу к решению задачи:

«
Вводить числа с клавиатуры, пока они
следуют по возрастанию»
.

25.

Составить программу к решению задачи:

«
Вводить чи
сла, пока их сумма не
превысит
заданное число»
.

26.

Составить программу к решению задачи:

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

27.

Составить программу к решению задачи:

«
Вывести все простые числа из
диапа
зона от 2 до
n
»
.

28.

Составить программу к решению задачи:

«
Напечатать в возрастающем порядке
все трехзначные числа в записи которых нет одинаковых цифр
»
.

29.

Составить программу к решению задачи: «Вам выдали зарплату х рублей,
купюрами по 100, 50, 10 и 1 рублю.
Какие возможны варианты выдачи
зарплаты
»
. Ответ выводить в форме:

По 100р


а купюр.

По 50р


b купюр.

По 10р


с купюр.

По 1р


d

купюр.



4

6

10

0


14

30.

Составить программу к решению задачи:

«
Дано число
n
. Найти сумму и
количество его цифр
»
.

31.

Составить программу к ре
шению задачи:

«
Дано число
n
.
Убр
ать его первую и
последнюю цифры
»
.

32.

Составить программу к решению задачи:

«
Дано число
n
. Поменять местами его
первую и последнюю цифры
»
.

33.

Составить программу к решению задачи:

«
Дано число
n
. Найти его
максимальную цифру
»
.

34.

Сост
авить программу к решению задачи:

«
Дано число
n
. Перевернуть число
»
.

35.

Составить программу к решению задачи:

«
Дано число
n
. Дописать к нему цфру
k

в начало и конец
»
.

36.

Составить программу к решению задачи:

«
Дано число. Возвести его в степень.
Равную последней
цифре
»
.

37.

Составить программу к решению задачи:

«
Даны числа
n

и
k
. И дана цифра
m
.
Проверить, есть ли в записи числа
n
k

цифра
m
»
.

38.

Составить программу к решению задачи:

«
Дано число
n
. Поменять местами
максимальную цифру с минимальной
»
.

39.

*
Составить программу к

решению задачи:

«
Дано число
n
. Проверить, будут ли
все цифры различными
»
.



































15

Часть
I


I
.1.
Структурированный т
ип данных



массив. Особенности работы
с одномерными массивами





Массив



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


Массивы бывают одномерные, двумерные и т.д.
n
-
мерные. Это зависит от
нумерации. Наиболее используемыми являются одномерные и двумерные массивы.
Разберемся сначала с одномерным
и массивами.

В повседневной и научной практике часто приходится иметь дело с информацией,
представленной в табличной форме.

Пример
.

Представьте себе поезд «Москва


Петербург», в состав которого входят
n

вагонов

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

Данные об этом можно было бы представить в следующей таблице:


Поезд «Москва


Петербург»

№ вагона

1

2

3

4


……………..

n
-
1

n

Количество
пассажиров

20

35

12

50


……………..

52

12


Таблица имеет имя «Москва


Петербург», элемен
тами таблицы являются
количества пассажиров в вагонах. Количества пассажиров


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

Чтобы

выполнить

с помощью компьютера

ма
тематическую обработку данных

такой
таблицы, ее имя следует заменить идентификатором (например,
Mosk
_
Peter
,

или

M
_
P
,

или
A
,
или
tab

и т.п.). К данным таблицы следует обращаться по номерам
вагонов (например, если задали имя
M
_
P
, то
M
_
P
[1],
M
_
P
[
n
],

и т.д.).

Номер элемента


не может быть вещественным
число
м!

Тип элементов массива, может быть и не целым.

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


Rost



1

2

3

4


……………………..

N

рост

1
,
56

1
,
70

1
,
48

1
,
69


…………
………….

1
,
65

Пусть
x



номер ученика, тогда все
Rost
[
x
]

будут типа
real
.


Описание массивов

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

в
разделе описания переменных.


Var

<идентификатор>:
array
[<тип индекса>]
of

<тип элемент
ов>;


Идентификатор



имя
переменной
-
массива
.

Т
ип индекса



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

Пример
.

Var M_P: array[1..100] of byte;



Rost
:
array
[1..50]
of

real
;


16

Зд
есь мы описали
два
массив
а:

1)

Массив
, максимальное количество элементов которого 100 штук, и все они
являются данными целого типа

byte
;

2)

Массив
, максимальное количество элементов которого
5
0 штук, и все они
являются данными
вещественного
типа

real
.


Описание
массива определяет
, во
-
первых, размещение массива в памяти, во
-
вторых,
правила его дальнейшего употребления в программе.

В
первом

случае,
ячейка памяти
M
_
P

разобьется на
100 подряд идущих
разделов
,
размером по
одному

байт
у

кажд
ый
. В них, после ввода массив
а, будут расположены
данные
M
_
P
[1],
M
_
P
[2] и т.д.
Сама переменная
-
массив будет занимать 100 байтов
памяти.

В
о втором

случае,
ячейка
Rost

разобьется

на 5
0 подряд идущих
разделов
, размером
по
6

байт кажд
ый
. В них, после ввода массива, будут расположены дан
ные
Rost
[1],
Rost
[2] и т.д.
Весь массив будет занимать
3
00 байтов памяти.

Не обязательно, что все ячеек
и

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


Ввод массива


Ввод массива осуществляется по
-
элементно
. Каждый элемент массив
а вводится
процедурой

read
.

Таким образом, если нужно ввести
n

элементов массива, то следует
использовать оператор цикла.


Var A:array[1..100] of integer;

I
,
n
:
integer
;

Begin

Read
(
n
); {ввели количество элементов массива}

For

i
:=1
to

n

do

read
(
a
[
i
]); {от 1 до последнего каждый элемент вводится с


клавиатуры}

End
.


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


Вывод массива осуществляется по
-
элем
ентно. Каждый элемент массива выводится
процедурой

write
.


Var A:array[1..1000] of
integer;

I
,
n
:
integer
;

Begin

Read
(
n
); {ввели количество элементов массива}

For

i
:=1
to

n

do

read
(
a
[
i
]); {от 1 до последнего каждый элемент вводится с


клавиатуры}

For

i
:=1
to

n

do

write
(
a
[
i
],’
‘); {от 1 до последнего каждый элемент выводится



на экран}

End
.



Действия над массивом как единым целым


1.

Можно значения одного массива присвоить другому (при этом массивы должны
быть однотипны):


17

Va
r A,B:array[1..500] of integer;


I
,
n
:
integer
;

Begin

Read
(
n
); {ввели количество элементов массива}

For

i
:=1
to

n

do

read
(
a
[
i
]); {от 1 до последнего каждый элемент массива А


вводится с клавиатур
ы }

For

i
:=1
to

n

do

read
(
b
[
i
]); {от 1 до последнего каждый элемент массива В



вводится с клавиатуры}

A
:=
B
; {все элементы массива А станут равны




соответствующим элементам массива В}

For

i
:=1
to

n

do

write
(
a
[
i
],’ ‘); {от 1 до последнего каждый элемент массива А


выводится на экран}

End
.;


2.

Можно

массивы сравнивать на «равно» и «не равно».


Const

t=100;

Var A,B:array[1..t] of integer;

I
,
n
:
integer
;

Begin

Read
(
n
); {ввели количество элементов массива}

For

i
:=1
to

n

do

read
(
a
[
i
]); {от 1 до последнего каждый элемент массива А



вводится с клавиатуры}

For

i
:=1
to

n

do

read
(
b
[
i
]); {от 1 до последнего каждый элемент массива В



вводится с клавиатуры}

if

A
=
B

then

wrte
(‘все элементы массива А равн
ы соответствующим элементам



массива В’);

if

A

B

then

wrte
(‘среди элементов массивов А и В есть хотябы одна пара не




совпавших’);

End
.


Работа с элементами массива


Каждый элемент массива имеет свое уникальное имя, которое складывается из
имени массива и порядкового номера элемента:
A
[1],
A
[2],
A
[
i
],
A
[
n

div

2],
A
[
n
-
2],
A
[
n
] и т.д.

Так к ним и надо обращаться в программе.

Пример.

Составить программу

к решению задачи: «В состав поезда «Москва


Петербург» входят
n

вагонов

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

Определит
ь:

а)

количество пассажиров поезда;

б)

количество пустых вагонов;





Здесь предложен другой способ описания массива и использован нов
ый раздел описательной части
программы. Раздел
Const


предназначен для описания постоянных величин. Ячейка памяти
t

на
протяжении всей программы будет хранить значение 100 и ее нельзя изменить при помощи
операторов в исполнительной части программы. Констан
ты могут быть и вещественными и
структурированными


их тип определяется написанием. Например.


Const

r

=56.89;


t
=10;


Massiv

:
array
[1..
t
]
of

integer
=(4, 8, 0, 123, 0, 8, 5, 34, 4, 4);

Здесь описаны одна константа веществен
ного типа, одна


целого и одна константа
-
массив, элементы
которого перечислены в круглых скобках.


18

в)

номера пустых вагонов;

г)

наибольшее количество пассажиров в вагоне;

д)

номера вагонов с наибольшим количеством пассажиров».



Дано:

M
_
P



массив, значениями которого будут количества

пассажиров поезда
(элементы типа
byte
);

n



количество вагонов в поезде(
integer
)
.

а)

Найти:

Sum

-

количество пассажиров поезда (
integer
)
.

Решение.


Чтобы найти количество пассажиров поезда, нужно сложить количества
пассажиров в каждом из вагонов, т
о есть, найти сумму элементов массива.

Пусть

i



номера элементов массива, т.е. переменная, принимающая целые значения
от 1 до
n

(
integer
)
. Если перебирать с помощью цикла с параметром
i

номера
элементов

массива, к самим элементам можно обращаться по имен
ам
M
_
P
[
i
]

и
добавлять их к общей сумме
Sum
. Программа к решению такой задачи будет
выглядеть так:


Var

M
_
P
:
array
[1..100]
of

byte
;


n
,
i
,
Sum
:
integer
;

Begin

Writeln
(‘введите количество вагонов поезда’);

Read(n);

For i:=1 to n do begin



Writeln
(‘введите количество пассажиров в ‘,
i
,’
-
ом вагоне’);


Read(M_P[i]);


end;

Sum:=0;

For i:=1 to n do Sum:=Sum+M_P[i];

Writeln
(‘Количество пассажиров поезда ’,
Sum
,’ человек’);

End
.



б)

Най
ти:

kol

-

количество пустых вагонов поезда (
byte
)
.

Решение.


Чтобы найти количество пустых вагонов поезда, нужно увеличивать переменную
kol

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

Программа к решению такой задачи будет выглядеть так:


Var M_P:array[1..100] of byte;


n, i:integer; kol:byte;

Begin

Writeln
(‘введите количество вагонов поезда’);

Readln(n);

For i:=1 to n do begin


Writeln
(‘введите к
оличество пассажиров в ‘,
i
,’
-
ом вагоне’);


Read(M_P[i]);


end;

kol:=0;

For i:=1 to n do if M_P[i]=0 then kol:=kol+1;

Writeln
(‘В данном поезде ’,
kol
,’ пустых вагонов’);

End
.


19

в
)

Найти:

i

-

номера пу
стых вагонов поезда (
integer
)
.

Решение.


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

Программа к решению такой задачи будет выглядеть так:


Var

M
_
P
:
array
[1..100]
of

byte
;



n
,
i
:
integer
;

Begin

Writeln
(‘введите количество вагонов поезда’);

Readln(n);

For i:=1 to n do begin


Writeln
(‘введите количество пассажиров в ‘,
i
,’
-
ом вагоне’);


Read(M_P[i]);



end;

For i:=1 to n do if M_P[i]=0 then Writeln(‘
Вагон

с

номером

’,i,’
пустой
’);

End
.



г
)

Найти:

max



наибольшее количество пассажиров в вагоне (
byte
)
.

Решение.


Чтобы найти наибольшее количество пассажиров в вагоне поезда, нужно
определить максима
льный элемент массива. Примем за «максимальный» первый
элемент массива (занесем его значение в переменную
max
)
. Остальные будем с ним
сравнивать (если элемент массива больше, чем
max
, то его значение будет занесено в
переменную

max
)
. В итоге, когда будут п
росмотрены все элементы массива, в
переменной
max

окажется максимальный элемент.

Программа к решению такой задачи будет выглядеть так:


Var M_P:array[1..100] of byte;


n, i:integer; max:byte;

Begin

Writeln
(‘введите количество вагонов поезда’);

Readl
n(n);

For i:=1 to n do begin


Writeln
(‘введите количество пассажиров в ‘,
i
,’
-
ом вагоне’);


Read(M_P[i]);


end;

max:=M_P[1];

For i:=2 to n do if M_P�[i]max then max:=M_P[i];

Writ
eln
(‘Максимальное количество пассажиров в одном вагоне этого
поезда’,
max
,’ человек’);

End
.


д
)

Найти:

i



номера вагонов с наибольшим количеством пассажиров (
integer
)
.


Решение.


Пусть
max



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

задачи будет выглядеть так:



20

Var

M
_
P
:
array
[1..100]
of

byte
;


n, i:integer; max:byte;

Begin

Writeln
(‘введите количество вагонов поезда’);

Readln(n);

For i:=1 to n do begin


Writeln
(‘введите количество пассажиров в ‘,
i
,’
-
ом в
агоне’);


Read(M_P[i]);


end;

max:=M_P[1];

For i:=2 to n do if M_P�[i]max then max:=M_P[i];

For

i
:=1
to

n

do

if

M
_
P
[
i
]=
max

then

Writeln
(‘В ’,
i
,’
-
ом вагоне проезжает
максимальное количество пассажиров’);

End
.


Вопросы и
задания:


Первый блок


Дайте определение массива.


Каково предназначение одномерных массивов
?


Где и как описывать одномерный массив?


Как производить ввод и вывод одномерного массива?


Какие операции можно производить над одномерными массивами
? В каком
случае эти операции выполнимы?


Как производится обращение к элементам одномерного массива?


Составить программу к решению задачи: «Дан одномерный массив целых
чисел. Вывести на экран его элементы

а) кратные 5;



б) неотрицательные;


в) четные;


г) с четными номерами;


д) одн
означные;


е) номера, которых являются




степенями 2».


Составить программу к решению задачи: «Да
н одномерный массив целых
чисел. Посчитать количество элементов массива а) кратных 3;




б
) отрицательных;





в) нечетных».


Второй блок



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


Составить программу к решению задачи: «Дан одном
ерный массив целых
чисел. Заменить четные элементы массива единицей, а нечетные нулем».



Составить программу к решению задачи: «Дан одномерный массив целых
чисел, состоящий из n элементов (n>8). Вывести элементы массива с третьей
позиции по восьмую».


Соста
вить программу к решению задачи: «Дан одномерный массив целых
чисел, состоящий из n элементов и целые числа a и b. Если a и b, могут быть
номерами элементов данного массива, то вывести элементы массива с а
-
позиции до b
-
позиции».


21



Составить программу к решен
ию задачи: «Вывести на экран все элементы
начиная с позиции минимального до позиции максимального».


Составить программу к решению задачи: «Дан одномерный массив целых
чисел, состоящий из n элементов. Если среди элементов массива есть ноль, то
вывести элеме
нты массива до позиции нуля. Иначе вывести сообщение».


Третий блок



Составить программу к решению задачи:

«
Дан массив
, элементами которого
являются

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


Составить программу к решению задачи:

«
Дан массив
, элементами которого
являются

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


Составить про
грамму к решению задачи:

«
Дан массив
, элементами которого
являются

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


Составить программу к решению зада
чи:

«Дан массив, элементами которого
являются данные о росте учеников класса. Найти рост самого высокого и
самого низкого учеников класса».


Составить программу к решению задачи:

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

























22

I
.
2.

Формирование одномерных
массив
ов


Заполнение одномерных массивов производится не только в результат
е ввода с
клавиатуры. Иногда решение задачи требует формирование одномерного массива по
определенному принципу. Тогда заполнение массива следует производить при
помощи оператора присваивания.


Пример

1
.

«На начальной станции производится посадка на поезд «
Москва
-
Петербург». По приказу начальника станции состав следует укомплектовать
следующим образом: посадку пассажиров производить только в вагоны с нечетными
номерами; в первый вагон посадить 40 человек, а в каждый последующий на два
человека меньше, чем в
предыдущий. Вывести на экран распределение пассажиров,
если поезд состоит из
n

вагонов».


Дано:

n



количество вагонов поезда (
integer
).

Найти:

M_P


массив, элементами которого будут количества пассажиров поезда.

Решение:

Чтобы заполнить массив, необходим
о обратиться к каждому из его
элементов
M
_
P
[
i
],

где
i



номер элемента (от 1 до
n
). Это можно осуществить
посредством оператора цикла с параметром. Заполнять

M
_
P
[
i
]
мы будем только
тогда, когда
i



нечетное число. Следовательно, в теле цикла будет условны
й
оператор. Каждому элементу массива с нечетным номером будет присвоено
определенное значение. Пусть это значение формируется в переменной
k
.
Первоначальное значение этой переменной 40, но после каждого присваивания
значение переменной должно уменьшаться н
а 2.

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

на 2, мы в конце
-
концов начнем получать отрицательные
числа. Такого быть не должно. Поэтому процесс заполнения элементо
в массива
должен продолжаться только в случае положительного значения переменной
k
.
Таким образом, в условном операторе следует поставить сложное условие.

Программа к решению задачи может выглядеть так:


Var n,i:integer; k:byte;


M_P:array[1..100]

of byte;

Begin

Writeln
(‘введите количество вагонов поезда’);

Read(n);

K:=40;

For i:=1 to n do if (i mod 2=1) and� (k0) then begin


M
_
P
[
i
]:=
k
;



k
:=
k
-
2;


end
;

Writeln
(‘пассажиры распределятся следующим образом:’);

for i:=1 to n do write(M_P[i],’ ‘);

End
.


Пример 2.

«Из товарного состава, везущег
о уголь, следует сформировать новый,
исключив пустые вагоны. Каков будет новый состав, если первый состоял из
n

вагонов, по
-
разному загруженных углем?».


Дано:

n



количество вагонов поезда (
integer
).


U1


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

будут массы угля
в тоннах в каждом из вагонов
(
real)
.


23

Найти:

U2



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

будут массы угля в тоннах в каждом из
вагонов, после исключения пустых вагонов (
real)
.

Решение:

Чтобы заполнить массив
U
2
, необходимо обратиться к каждому из
элементов
U
1
[
i
],

где
i



номер элемента (от 1 до
n
). Это можно осуществить
посредством оператора цикла с параметром. Заполнять

U
2
[
i
]
мы будем только тогда,
когда
U
1[
i
]



число

не равное 0. Следовательно, в теле цикла будет условный
оператор. Чтобы вывести на экран полученный
массив, необходимо знать
количество элементов в нем. Пусть
k



количество элементов массива
U
2
. Вначале
значение этой переменной равно 0. Перед каждым присваиванием элементу массива
U
2
его значения, значение переменной
k

должно увеличиваться на 1.

Программ
а к решению задачи может выглядеть так:


Var n, i, k: integer;


U1, U2:array[1..100] of real;

Begin

Writeln
(‘введите количество вагонов первого состава’);

Read(n);

For i:=1 to n do begin


Writeln
(‘введите
вес угля

в ‘,
i
,’
-
о
м вагоне’);


Read(
U1
[i]);


end;


k:=0;

For i:=1 to n do if U1[i]� 0 then begin


k
:=
k
+1;


U
2[
k
]:=
U
1[
i
];




end
;

Writeln
(‘новый состав будет следующим:’);

for i:=1 to k do write(U2[i],’ ‘);

End
.




Вопросы и
задания:


Первый блок


Дайте опр
еделение массива.


Каково предназначение одномерных массивов
?


Как производить ввод и вывод одномерного массива?


Какими способами можно сформировать одномерный массив?


Составить программу к решению задачи: «Сформировать массив
:

1

2

3

4…
n
»
.


Составить программ
у к решению задачи: «Сформировать массив


из
n

элементов
:

5 0 5 0
…»
.



Составить программу к решению задачи: «
Сформировать массив из степеней
числа
2 с первой по десятую

степень»
.



Составить программу к решению задачи: «
Сформировать массив:



1 1 1 2 2 2 3 3 3…n n n
»
.


Составить программу к решению задачи: «Сформировать массив из степеней
числа 3 с первой по 15
-
ую, исключив числа кратные 9.




24

Второй блок



Составить програм
му к решению задачи: «Дан массив, элементами которого
являются данные о количестве конфет в новогодних подарках. Сформировать
новый массив, исключив из исходного массива данные о подарках, где меньше
10 конфет или больше 150».


Составить программу к решению

задачи: «
Получить массив b, выбросив из
массива a все элементы, совпадающие с заданным числом k
»
.


Составить программу к решению задачи:

«Получить массив С, записав на
четные места элементы массива А, а на нечетные


элементы массива В».


Составить программ
у к решению задачи:

«
Дан массив а. Сформировать массив
в, выбросив из а каждый второй элемент
»
.



Составить программу к решению задачи:

«
Сжать массив а, выбросив из него
каждый второй элемент, не используя второго массива
».


Составить программу к решению зада
чи:

«
Сформировать массив из чисел
Фибоначчи
»
.

Последовательность чисел Фибоначчи: 1 1 2 3 5 8 13 … (каждое
последующее число равно сумме предыдущих двух).

































25

I
.
3
.
Еще задачи на одномерные
массив
ы


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


Пример.

Составить программу к решению задачи:

«Чтобы не нарушить равновесие
товарного состава, необходимо поменять местами вагоны с максимальной и
минимальной массой груза».


Дано:

Sostav



массив, значениями которого бу
дут массы груза в каждом из вагонов
(элементы типа
real
);

n



количество вагонов в составе(
integer
)
.

Найти:

Sostav



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

Решение.


Чтобы поменять местами два элемента массива, необходимо знать их места,

то
есть номера этих элементов. Чтобы найти максимальный элемент массива и его
номер, примем за «максимальный» первый элемент массива (занесем его значение в
переменную
max
)
. Номер «максимального» элемента соответственно равен единице
(занесем его значени
е в переменную
nommax
)
. Остальные элементы будем
сравнивать с переменной

max

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

окажется максимальный элемент, а в пер
еменной
nommax

его
номер. Аналогично отыщем значения переменных
min

и

nommin
. Теперь осталось
поставить на место максимального элемента минимальный (
Sostav
[
nommax
]:=
min
), а
на место минимального


максимальный

(
Sostav
[
nommin
]:=
max
)

или поменять
местами зн
ачения переменных
Sostav
[
nommax
]

и
Sostav
[
nommin
]

используя третью
переменную.

Программа к решению такой задачи может выглядеть так:


Var Sostav:array[1..100] of real;


Nommax, nommin, n, i:integer;


max
,
min
:
real
;

Begin

Writeln
(‘введите ко
личество вагонов поезда’);

Readln(n);

For i:=1 to n do begin


Writeln
(‘введите количество пассажиров в ‘,
i
,’
-
ом вагоне’);


Read(Sostav[i]);


end;

max:= Sostav[1]; nommax:=1; min:
= Sostav[1]; nommin:=1;

For i:=1 to n do begin


If Sostav�[i]max then begin max:= Sostav[i]; nommax:=i; end;


If Sostav[i]min then begin min:= Sostav[i]; nommin:=i; end;


End;



Sostav[nommax]:=min;


Sostav[nommin];:=max;

Writeln
(‘
После перемены вагонов местами, состав примет вид:’);

For i:=1 to n do write(Sostav[i]:4:2);

End
.






26

Вопросы и
задания:


Первый блок


Дайте определение одномерного массива.


Как производится обращение к элементам одномерного массива?


Что необходимо знать, ч
тобы поменять местами два элемента одномерного
массива?


Составить программу к решению задачи: «Дан одномерный массив. Поменять
местами первый и последний элементы массива».


Составить программу к решению задачи: «Дан одномерный массив и число k.
Если среди
его элементов есть число k, то поменять его местами с
максимальным элементом».


Составить программу к решению задачи: «Дан одномерный массив и число k.
Заменить каждый его элемент, меньший числа k, числом a[i] k.


Второй блок



Составить программу к решению з
адачи: «Определить количество одинаковых
элементов в массиве (считается, что повторяющийся элемент один)».



Составить программу к решению задачи: «В массиве а найти размер группы
(группа одна)».



Составить программу к решению задачи: «В массиве а найти самую

длинную
группу».
































27

I
.
4.

Двумерные массивы
. Особенности работы с двумерными
массивами



До сих пор

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

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


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


Данные о весе учащихся восьмой параллели


1

2

3

4

……………………………………….

n
-
1

n

8a

50.8

55.9

40.3

45.8

……………………………………….

45.8

50.9

8
б

45.6

43.0

50.8

48.7

……………………………………….

49.0

47.7



50.7

48.9

45.8

44.9

………………………………………..

45.0

45.0



54.0

56.9

45.7

40
.7

………………………………………..

43.8

54.0


Чтобы обратиться к элементу такой таблицы, недостаточно номера ученика,
необходимо, в первую очередь, наименование класса. Теперь элемент имеет два
номера: «номер строки

таблицы» и «номер столбца

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

двумерный

массив
.


Описание массив
ов


Описание двумерных массивов аналогично описанию одномерных
.


Var

<идентификатор>:
array
[<типы индексов>]
of

<тип элементов>;


Идентификатор


имя массива
.

У элементов

двумерного массива два индекса (номера), поэтому,

в качестве тип
ов

индекс
ов
указывают интервал
ы

значений, которые может принимать номер
строки
элемента массива

и номер столбца.


Например
:


Var Ves: array[1..4,1..35] of real;


Здесь описа
н

массив
,

максимальное количество элементов которого
4*35=140

штук, и все они являются данными
вещественного
типа

real
. Такой массив как раз
подойдет для хранения таблицы данных о весе учащихся восьмой параллели.

В
памяти компьютера

выделится
ячейка, которая разобье
тся на
1
4
0
разделов
,
размером по
6

байт. В них, после ввода массива, будут расположены данные
Ves
[1
,1
],
Ves
[
1,
2]
,

.
Ves
[1,
n
],
Ves
[2,1],
Ves
[2,2]

и т.д.
Весь массив будет занимать
840

байтов памяти.

Не обязательно, что все яче
й
к
и

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



Ввод массива


Ввод массива осуществляется покомпонентно. Каждый элемент массива вводится
оператором
read
.


28


Var A:array[1..10,1..10] of integer;

I,j,n,m: integer;

Begin

Read
(
n
,
m
); {ввели количество с
трок и столбцов массива}

For

i
:=1
to

n

do

{перебираем номера строк}

For

j
:=1
to

m

do

read
(
a
[
i
,
j
]); {от 1 до последнего каждый элемент вводится с


клавиатуры: вначале элементы первой строк
и,


затем второй и т.д.}

End
.


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


Вывод массива осуществляется покомпонентно. Каждый элемент массива выводится
оператором
write
.


Const t=100;

Var A:array[1..t,1..t] of integer;

I,j,n,m: inte
ger;

Begin

Read
(
n
,
m
); {ввели количество элементов массива}

For i:=1 to n do For j:=1 to m do read(a[i,j]); { ввод массива с клавиатуры}

For i:=1 to n do begin


For i:=1 to n do write(a[i,j],’ ‘); {вывод элементов i
-
ой

строки
}



Writeln
; {переход на новую строку}



end
;

End
.


Двумерные массивы часто называют матрицами.


Д
ействия над элементами массива


Каждый элемент массива имеет свое уникальное имя, которое складывается из
имени массива и порядко
вого номера элемента:
A
[1,6],
A
[4,2],
A
[
i
,
j
],
A
[
n

div

2,4],
A
[
n
-
2,
m
-
7],
A
[
n
,
m
] и т.д.

Так к ним и надо обращаться в программе.

В основном все задачи на двумерные массивы решаются аналогично, как и на
одномерные. Только не следует забывать, что элемент имее
т два индекса, а
таблица
состоит из строк и столбцов.


Пример.
В школе проводилась олимпиада по математике среди учащихся восьмых
классов. В ней приняли участие по
n

представителей от каждого класса. Данные об
олимпиаде


это количество баллов, набранное к
аждым из учеников.

Необходимо посчитать:

а) общий балл, набранный в параллели;

б) средний балл по параллели;

в) количество учеников в параллели, не набравших ни одного балла;

г) максимальный балл по параллели;

д) номера победителей по параллели;

е) номера

победителей в каждом из классов.




29

Дано:

A



массив, значениями которого будут баллы участников олимпиады


(элементы типа
byte
);


n



количество классов в восьмой параллели (
byte
)
;


m



количество представителей от класса
(
byte
)
.

а)

Найти:

Oball



общий балл, набранный в параллели (
integer
)
.


Решение.


Чтобы найти общий балл, нужно сложить баллы, набранные каждым из уч
еников,
то есть, найти сумму элементов массива. Пусть

i



номера строк массива, т.е.
переменная, принимающая целые значения от 1 до
n

(
byte
)
, а
j



номера столбцов

массива, т.е.

переменная, принимающая целые значения от 1 до
m

(
byte
)
. Если
перебирать с пом
ощью цикла с параметром
i

номера строк массива, а с помощью
вложенного цикла с параметром
j

номера столбцов, то к самим элементам можно
обращаться по именам А
[
i
,
j
]

и добавлять их к общей сумме
Oball
.

Программа к решению такой задачи будет выглядеть так:


Var A:array[1..10,1..35] of byte;


n, m, i, j:byte; Oball:integer;

Begin

Writeln
(‘введите количество классов в параллели’);

Read
(
n
);

Writeln
(‘введите количество участников от каждого из классов’);

Readln(m);

For i:=1 to n do For j:=1 to m do begin


Writeln
(‘введите балл ’,

j
, ‘
-
го ученика в ’,
i
, ‘
-
ой группе’);


Read(A[i,j]);


end;

Oball:=0;

For i:=1 to n do For j:=1 to m do Oball:=Oball+A[i,j];

Writeln
(‘Общий балл по пара
ллели
-

’,
Oball
);

End
.


б)

Найти:

Sball



средний балл по параллели (
real
)
.


Решение.


Для решения этой задачи, необходимо разделить общий балл по параллели на
количество всех участников, которое равно
n
*
m
.

Программа к решению такой задачи будет вы
глядеть так:


Var A:array[1..10,1..35] of byte;


n, m, i, j:byte; Oball:integer; Sball:real;

Begin

Writeln
(‘введите количество классов в параллели’);
Read
(
n
);

Writeln
(‘введите количество участников от каждого из классов’);
Read
(
m
);

For i:=1 to n
do For j:=1 to m do begin


Writeln
(‘введите балл ’,

j
, ‘
-
го ученика в ’,
i
, ‘
-
ой группе’);


Read(A[i,j]);


end;

Oball:=0;

For i:=1 to n do For j:=1 to m do Oball:=Oball+A[i,j];

Sball:=Oball/(n*m);

Writeln(‘
Средний

балл

по

параллели
-

’,Sball:4:2);

End
.



30

в)

Найти:

Kol
-

количество учеников в параллели, не набравших ни одного балла
(
byte).

Решение.

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

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


Var

A
:
array
[1.
.10,1..35]
of

byte
;


n, m, i, j, kol:byte;

Begin

Writeln
(‘введите количество классов в параллели’);

Read
(
n
);

Writeln
(‘введите количество участников от каждого из классов’);

Read(m);

For i:=1 to n do For j:=1 to m do begin



Writeln
(‘введите балл ’,
j
, ‘
-
го ученика в ’,
i
, ‘
-
ой группе’);


Read(A[i,j]);


end;

kol:=0;

For i:=1 to n do For j:=1 to m do if A[i,j]=0 then kol:=kol+1;

Writeln
(‘Ни одного балла не набрали ’,
kol
,’ у
чеников’);

End
.


г
)

Найти:

Max



максимальный балл по параллели (
byte
)
.


Решение.


Решение задачи сводится к нахождению максимального элемента массива. Примем
за «максимальный» первый элемент массива (занесем его значение в переменную
max
)
. Остальные

будем с ним сравнивать (если элемент массива больше, чем
max
, то
его значение будет занесено в переменную

max
)
. В итоге, когда будут просмотрены
все элементы массива, в переменной
max

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


Var

A
:
array
[1..10,1..35]
of

byte
;


n, m, i, j, max:byte;

Begin

Writeln
(‘введите количество классов в параллели’);

Read
(
n
);

Writeln
(‘введите количество участников от каждого из классов’);

Read(m);

For i:=1 to n do For j:=1 to m do beg
in


Writeln
(‘введите балл ’,
j
, ‘
-
го ученика в ’,
i
, ‘
-
ой группе’);


Read(A[i,j]);


end;

max:=A[
1
,
1
];

For i:=1 to n do For j:=1 to m do if A�[i,j]max then max:=a[i,j];

Writeln
(‘
Максимальный балл по параллели
-

’,
max
);

End
.





31

д)

Найти:

i

,
j



номера победителей по параллели (
byte
)
.


Решение.


Пусть
max



максимальный балл по параллели. Это переменная типа
byte
,
значение которой мы уже умеем находить. Чтобы найти номера
победителей,
достаточно вывести на экран номера строк и столбцов элементов массива равных
значению переменной
max
.

Программа к решению такой задачи будет выглядеть так:


Var A:array[1..10,1..35] of byte;


n, m, i, j, max:byte;

Begin

Writeln
(‘введи
те количество классов в параллели’);

Read
(
n
);

Writeln
(‘введите количество участников от каждого из классов’);

Read(m);

For i:=1 to n do For j:=1 to m do begin


Writeln
(‘введите балл ’,
j
, ‘
-
го ученика в ’,
i
, ‘
-
ой группе’);



Read(A[i,j]);


end;

max:=A[
1
,
1
];

For i:=1 to n do For j:=1 to m do if A�[i,j]max then max:=a[i,j];

Writeln
(‘Номера победителей

);

Writeln
(‘
N

группы
N

ученика ’);

For i:=1 to n do For j:=1 to m do if A[i,j]=m
ax then writeln( ‘ ’, i, ‘ ’, ‘ ’,j);

End
.


е)
Найти:

i
,
j



номера победителей в каждом из классов.

Решение.

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

*************************************************************************

{обрабат
ываем первую строку}

i
:=1;

{в качестве «максимального» выбираем первый элемент в

рассматриваемой

строке}


max
:=
A
[
i
,1];

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

номером

i
,
равным

1}

For

j
:=1
to

m

do



if

A
[
i
,
j
�]
max

then

max
:=
a
[
i
,
j
]; {
ищем

максимальный

элемент

в

строке
}


Writeln
(‘
Номера

победителей

’,
i
, ‘
-
ой

строки
’);

{
выводим

номера

элементов
,
равных по величине значению переменной
max
}

For

j
:=1
to

m

do

if

A
[
i
,
j
]=
max

then

writeln
( ‘ ’,
j
);

*****************************
********************************************

Аналогичным образом, необходимо обработать все строки массива. Переменная
i

, отвечающая за номер строки, должна постепенно принять все свои значения от 1
до
n
. Предложенный фрагмент следует сделать телом цикла
по параметру
i

.


32

Программа к решению такой задачи будет выглядеть так:


Var A:array[1..10,1..35] of byte;


n, m, i, j, max:byte;

Begin

Writeln
(‘введите количество классов в параллели’);

Read
(
n
);

Writeln
(‘введите количество участников от каждого из
классов’);

Read(m);

For i:=1 to n do For j:=1 to m do begin


Writeln
(‘введите балл ’,
j
, ‘
-
го ученика в ’,
i
, ‘
-
ой группе’);


Read(A[i,j]);


end;

For i:=1 to n do begin



max:=A[i,1];


For j:=1 to m do if A�[i,j]max then max:=a[i,j];


Writeln
(‘Номера победителей ’,
i
, ‘
-
ой строки’);


For j:=1 to m do if A[i,j]=max then writeln(
‘ ’, j);


end
;

End
.


Вопросы и
задания:


Первый блок


Дайте определение массива.


Каково предназначение двумерных массивов
?


Где и как описывать двумерный массив?


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


Как произво
дится обращение к элементам двумерного массива?


Составить программу к решению задачи «
Дан двумерный массив

целых чисел
.
Найти
произведение

его элементов
»
.


Составить программу к решению задачи «
Дан двумерный массив

целых чисел
и число х
. Найти
количество че
тных
элементов

массива больших по модулю
числа х»
.


Составить программу к решению задачи «
Дан двумерный массив

целых чисел
.
Вывести на экран двузначные элементы массива, имеющие четные номера»
.


Второй блок


Составить программу к решению задачи «
Дан двумерны
й массив

вещественных чисел
.
Найти среднее арифметическое элементов е
го

первой
строки
»
.


Составить программу к решению задачи «
Дан двумерный массив

целых чисел
.
Найти
сумму

четных
элементов е
го

k
-
го
столбца
»
.


Составить программу к решению задачи «
Дан двумер
ный массив

целых чисел
.
Заменить элементы с нечетными номерами

суммой

однозначных
элементов е
го

четных
столбц
ов»
.


Составить программу к решению задачи «
Дан двумерный массив

целых чисел
.

Вывести его максимальный элемент с указанием его местоположения в
масс
иве
»
.


Составить программу к решению задачи

«
Дан двумерный массив. Вывести его
,

поменяв местами максимальный элемент с минимальным
».


33

Третий блок



Составить программу к решению задачи «
Дан двумерный массив

целых чисел
(
квадратная матрица
)
.

Посчитать
количеств
о отрицательных
элементов на
главной диагонали. Если так
их

элемен
тов

нет, то сообщить об этом
»
.



Составить программу к решению задачи «
Дан
а квадратная матрица целых
чисел
.

Найти количество нулей на ее побочной диагонали».


Составить программу к решению задач
и «
Дан
а квадратная матрица целых
чисел
. Найти сумму положительных элементов, расположенных над главной
диагональю и сумму отрицательных, расположенных под главной
диагональю
»
.


Составить программу к решению задачи «
Дана квадратная матрица

целых
чисел
. Найти

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




































34

I
.
5.

Формирование двумерных
массив
ов


Заполнение двумерных массивов производится не только в результате ввода с
клавиатуры. Иногда

решение задачи требует формирование двумерного массива по
определенному принципу. Тогда заполнение массива следует производить при
помощи оператора присваивания.

Пример

1
.

Сформировать таблицу умножения, имеющую вид:


1

2

3

..

m

2

4

6

..

2m

3

6

9

..

3m

.

.

.

.

.

.

.

.

.

.

n

2n

3n

..

mn


Дано:

n



количество строк массива (
integer
);


m



количество столбцов массива (
integer
).

Найти:

А



массив
-
«таблица умножения».

Решение:

Чтобы заполнить массив, необходимо обратиться к каждому из его
элемент
ов
A
[
i
,
j
],

где
i



номер строки (от 1 до
n
), а
j



номер столбца (от 1 до
m
). Это
можно осуществить с помощью вложенных циклов с параметром. Заполнять

А
[
i
,
j
]
мы будем произведением его номера строки и столбца.

Программа к решению задачи может выглядеть та
к:


Var n, m, i, j:integer;


A:array[1..30,1..30] of integer;

Begin

Writeln
(‘
введите

количество

строк

и

столбцов
’);

Read(n,m);

For i:=1 to n do


For j:=1 to m do A[i,j]:=i*j;

Writeln(‘
Таблица

умножения
’);

for i:=1 to n do begin


for j:=1
to m do write(A[i,j],’ ‘);


writeln
;


end
;

End
.













35

Пример 2.

Сформировать таблицу степеней, имеющую вид:

1

2

3

….

m

1

4

9

….

m
2

1

8

27

….

m
3

1

16

81

….

m
4

.

.

.

.

.

.

….

….

1
n

2
n

3
n

….

m
n


Дано:

n



максимальн
ый показатель степени в таблице (
integer
);


m



максимальное основание степени (
integer
).

Найти:

А



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

будут степени чисел (
longint
)
.

Решение:

Чтобы заполнить массив
A
, необходимо обратиться к каждому из
элементов
A
[
i
,
j
]
. Очев
идно, что элементы заполняются по формуле
A
[
i
,
j
]:=
i

j

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

можно применить следующий фрагмент программы.

*************************************************************************

{первый элемент столбца равен номеру столбца}


A
[1,
j
]:=
j
;

{остальные элементы заполняются по

выше сказанному принципу}

For i:=2 to n do A[i,j]:=A[i
-
1,j]*j

*************************************************************************

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

при
нимает значения от 1 до
m
.


Программа к решению такой задачи может выглядеть так:


Var A:array[1..10,1..10] of longint;


n, m, i, j:byte;

Begin

Read
(
n
);

Read(m);

For j:=1 to m do begin

A[1,j]:=j;

For i:=2 to n do A[i,j]:=A[i
-
1,j]*j;

end;

For i:=1

to n do begin


For j:=1 to m do Write(A[i,j],’ ‘);


writeln
;


end
;

End
.






36

Вопросы и
задания:


Первый блок


Дайте определение массива.


Каково предназначение двумерных массивов
?


Где и как описывать двумерный массив?


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


Как производится обращение к элементам двумерного массива?

Составить программу
формирова
ния

массив
а:


а
)

1

2

...

..

n

2

0

0

0

n
-
1

..
.

0

0

0



..
.

0

0

0



n

n
-
1





1




б
)

1

1

...

..

1

2

0

0

0

2

..
.

0

0

0



..
.

0

0

0



n

n

n

n

n




в
)

1

2

...

..

n

2

3



n

0

3

4



0

0

..
.









n

0





0




Второй блок

Составить программу
формирова
ния

массив
а:



г)

0

0

...

..

1

0

0



2

0

..
.





0

0

0

n
-
1



0

0

n

0





0







37



д
)

1

2

...

..

n

n

n
-
1





1

1

2





n

n

n
-
1





1













е
)

n

0

...

..

0

0

n
-
1



0

0

..
.









0

0



2

0

0

0





1



ж
)

1

1

...

1

1

1

0



0

1

..
.









1

0



0

1

1

1



1

1





з
)

1

1

...

1

1

0

1



1

0

..
.



1





0

1



1

0

1

1



1

1



и
)

1

0

...

0

1

1

1



1

1

..
.



1





1

1



1

1

1

0



0

1



Третий блок

Составить программу
формирова
ния

массив
а:



к
)

1

1

...

..

1

2

2



2

0

...





0

0

n
-
1

n
-
1



0

0

n

0





0



38



л)




n




11…..1122..…22


11…..1122…..22
n


………….………


11…..1122..…22


33…..3344..…44



33..…3344…..44


……….…………


33…..3344…..44



Составить программу к решению задачи: «Дано целое число х. Сформировать
массив:


1

Х
1

Х
2



X
n

X
1

0

0

0



X
2

0

0

0

X
2









X
1

X
n

X
n
-
1



X
1

1



























39


I
.
6.

Еще задачи на двумерные массивы


Как вы убедились, двумерный массив это модель прямоугольной таблицы. В
повседневной практике современному человеку часто приходится сталкиваться с
такого рода таблицами, особ
енно если его работа связана с базами данных. Умение
работать с данными сейчас требуется в большинстве профессий: библиотекарь,
инженер, бухгалтер, банковский работник, товаровед и т.д., можно перечислять
бесконечно. Для компьютерной обработки данных в наш
е время разработано
множество программных продуктов, которые наглядны и легки в освоении. К таким
программным пакетам относятся табличные процессоры (например,
Excel
), системы
управления базами данных (например,
Access
), с которыми вы обязательно будете
оз
накомлены. Но в основе этих систем лежат скрытые программы обработки
массивов данных. В этой главе, как и в предыдущих главах, будут разобраны и
предложены для самостоятельного решения типовые задачи, связанные с обработкой
таблиц.

Пример 1.

Проводя фин
ансовый отчет, бухгалтер обнаружила неточность в
таблице данных о зарплате. Для исправления неточности следует поменять местами
два столбца с номерами
n
1
и
n
2
.


Дано:

Z



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



(элементы типа
real
);


m



количество строк таблицы (
byte
)
;


n



количество столбцов таблицы
(
byte
)
;


n
1,
n
2



номера столбцов, подлежащи
х обмену
(
byte
)
.

Результат
:

Z



измененный массив.

Решение.


Для решения задачи необходимо последовательно поменять местами элементы,
как показано на рисунке.



m/n

1

2



n1



n2



n

1

$

$



$



$



$

2

$

$



$



$



$

3

$

$



$



$



$

:

:

:

:

:

:

:

:

:

m

$

$



$



$



$


Необходимо поменять местами
Z
[1,
n
1]

c

Z
[1,
n
2],
Z
[2,
n
1]

c

Z
[2,
n
2]

и т.д.,
Z
[
m
,
n
1]

c

Z
[
m
,
n
2]
. Нетрудно заметить, что эти пары отличаются номером строки,
который изменяется с шагом +1. Следует повторять один и тот же про
цесс (менять
две переменные местами) при этом изменять номер строки. Пусть
i



номер строки,
который изменяется от 1 до
m
, при этом производим обмен переменных
Z
[
i
,
n
1]
и
Z
[
i
,
n
2]

с помощью третей переменной
x

(

типа
real
, как и элементы массива).

Программа

к решению такой задачи будет выглядеть так:


Var

Z
:
array
[1..10,1..
10
]
of

real
;


n
,
m
,
i
,
j,

n1,n2
:

byte
;
x : real
;

Begin

Writeln
(‘введите количество
строк и столбцов
’);

Read
(
m
,
n
);


Writeln
(‘
введите

таблицу
’);

For i:=1 to
m

do For j:=1 to
n

do

Rea
d(
Z
[i,j]);


40

Writeln
(‘введите
номера столбцов для обмена
’);

Read(
n1,n2)
;

For i:=1 to
m

do
begin x:=Z[i,n1]; Z[i,n1]:=Z[i,n2]; Z[i,n2]:=x; end;


Writeln
(‘
измененный

массив

);

For i:=1 to
m

do

begin


For j:=1 to
n

do

write
(
Z
[i,j]
,’ ‘
);


Writeln
;



End
;

End
.


Пример 2.

Для финансового отчета бухгалтеру требуется обработать таблицу
ежемесячных отчислений в пенсионный фонд работников предприятия. Для этого
ему следует организовать в таблице две дополнительные колонки: «среднее
ариф
метическое» и «всего». См. пример таблицы:




Табельный номер
работника

номер месяца

дополнение

1

2

3

4



n

Ср.ар.

Всего

1

$

$

$

$



$



2

$

$

$

$



$



3

$

$

$

$



$



:

:

:

:

:

:

:



m

$

$

$

$



$




В столбец «Ср.ар.» необходимо занести

среднее арифметическое каждой строки,
а в столбец «Всего»
-

сумму данных каждой строки.


Дано:

P



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


фонд (элементы типа
real
);


m



количество строк табл
ицы (
byte
)
;


n



количество столбцов таблицы
(
byte
)
;

Результат
:

P



дополненный массив.

Решение.


Для решения задачи необходимо заполнить столбцы с номерами
n
+1 и
n
+2.
А
следовательно, для каждой строки необходимо найти сумму

(
S
)

и средн
ее
арифметическое

(
Ar
)

ее элементов.
S

и

Ar

переменные типа
real
.

В первой строке элементы имеют номера
P
[1,
j
]
, где
j

принимает значения от 1 до
n
.

Во второй строке элементы имеют номера
P
[
2
,
j
]
, где
j

принимает значения от 1 до
n
.

И т.д.

В
m
-
ой строке элем
енты имеют номера
P
[
m
,
j
]
, где
j

принимает значения от 1 до
n
.

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

Программа к решению такой задачи может выглядеть так:


Var

P
:
array
[1..1
0,1..
10
]
of

real
;


n
,
m
,
i
,
j,

n1,n2
:

byte
;
S,Ar : real
;

Begin

Writeln
(‘введите количество
строк и столбцов
’);

Read
(
m
,
n
);


Writeln
(‘
вве
дите

таблицу
’);


41

For i:=1 to
m

do For j:=1 to
n

do

Read(
P
[i,j]);

For i:=1 to
m

do
begin


S:=0;


Ar:=0;


For j:=1 to n do S:=S+P[I,j];


Ar:=S/n;


P[i,n+1]:=Ar;


P[i,n+2]:=S; end;


Writeln
(‘
измененный

массив

);

For i:=1 to
m

do

begin


For j
:=1 to
n+2

do

write
(
P
[i,j]
,’ ‘
);


Writeln
;


End
;

End
.


Вопросы и
задания:


Первый блок


Дайте определение массива.


Каково предназначение двумерных массивов
?


Где и как описывать двумерный массив?


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


Как производится обращение к элементам двумерного массива?


Дан двумерный массив. Поменять строку с номером к1 со строкой с номером
к2.


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


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


Второй блок



Переставить строки и столбцы массива так,

чтобы его максимальный элемент
оказался в нижнем правом углу.


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


Дан двумерный массив
.

Переставить строки и столбцы массива так, чтобы его
минимальный элемент оказался в третьей строке втором столбце.


Переставить строки и столбцы массива так, чтобы ег
о максимальный элемент
оказался в центре.


Вывести его минимальный элемент с указанием его местоположения в массиве.


Дан массив. Найти максимальный элемент на его главной диагонали.


Дан массив. Найти минимальный элемент на его побочной диагонали.


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


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


Дан массив. Проверить, есть ли в
нем

одинаковые элементы.






42

Часть

II


II
.1.
Сортировка массивов. Сорти
ровка элементов одномерного
массива методом простого выбора


Сортировка


один из наиболее распространенных процессов современной
обработки данных.




Сортировкой

называется расстановка данных по определенному признаку.


Возьмем, к примеру, библиотеку. Книги

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

Последовательность чисел является
возрастающей
, если каждый последующий

элемент
больш
е предыдущего.

Последовательность чисел является
убывающей
, если каждый последующий

элемент
меньше предыдущего.

Последовательность чисел является
невозрастающей
, если каждый последующий

элемент
не больше (меньше или равен) предыдущего.

Последовательность ч
исел является
неубывающей
, если каждый последующий

элемент
не меньше (больше или равен) предыдущего.

Из определений, очевидно, что основным отличием является знак между
элементами. Поэтому достаточно найти решение одной из задач, а все остальные
будут реше
ны простой сменой знака.

Существует огромное множество методов сортировок


от самых простых
(которые будут разобраны в этой книге) до самых сложных (скоростных, которые
будут разобраны позже).

Пример.

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


Дано:

A



массив, значениями которого будут целые числа (элементы типа
integer
);


n



количество элементов массива
(
byte
)
;

Результат
:

A



отсортированный массив.

Решение.

Рассмотрим наиболее простой
метод сортировки


метод простого выбора.

Суть: Среди элементов массива находится минимальный и меняется местами с
первым. Затем, среди элементов кроме первого, снова находится минимальный и
меняется местами со вторым и т.д.

Пусть наш массив состоит из пя
ти элементов (
n
=5
): 5 8 3 9 1.

Первый шаг:

5

8


3


9


1

В результате: 1 8 3 9 5.


Второй шаг: 1 8 3 9 5 В результате: 1 3 8 9 5.


Третий шаг: 1 3 8 9 5 В результате:

1 3 5 9 8.


Четвертый шаг: 1 3 5 9 8 В результате: 1 3 5 8 9.



43

Вывод: при количестве элементов 5 штук, массив сортируется за четыре шага.
Значит, при количестве элементов
n

штук


массив будет отсортирован за
n
-
1

шаг.

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

Пусть
i



номер шага (от 1 до
n
-
1
),
j
-

номера элементов, среди которых будет
отыскиваться минимальный. Тогда
j

будет изменяться от
i


до

n
.


Программа

сортировки будет следующей
:


Const t=50;

Var
A
: array[1..t] of integer;

i
,j,n,min,nom: integer;

Begin

Read(n);

For i:=1 to n do read(
A
[i]);

For i:=1 to n
-
1 do

Begin

Min:=
A
[i]; nom:=i
;

For j:=i to n do if
A
[

j]

min then begin min:=
A
[

j]; nom:=j end;

A
[nom]:=
A
[i];
A
[i]:=min;

end;

for i:=1 to n do write(
A
[i],’ ‘);

end
.


Вопросы и
задания:



Дайте определение массива.


Каково предназначение массивов
?


Что такое сортировка? Приведите примеры.


В чем заключается суть сортировки методом простого выбора?
Проиллюстрируйте на примере массива: 5 78 3 9 14 25 14 5


Закройте учебник и восстановите программу сортировки элементов массива по
возрастанию.


Дан массив. Отсортировать его по убыванию.


Да
н массив. Отсортировать по возрастанию его первую половину


Дан массив. Отсортировать по убыванию его вторую половину.


Дан массив. Отсортировать по возрастанию его первую половину, а по
убыванию
-

вторую.
















44

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

элементов одномерного
массива методом «пузырька»


Несмотря на простоту предыдущего

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

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


Пример.

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


Дано:

A



массив, значениями которого будут целые числа (элементы типа
integer
);


n



количество элементов массива
(
byte
)
;

Результат
:

A



отсортированный

массив.

Решение.

Суть: Рассматривают последовательность элементов, попарно сравнивая их

друг с
другом,
и меня
ют

местами

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

элемент оказывается на последнем
месте (
всплывает в

конце как пузырек
)
. Затем,
тот же процесс производят в группе
элемент
ов

кроме последнего
. В результате на предпоследнее место снова
«всплывает»
максимальный
. И
т.д.

Пусть наш массив состоит из пяти элементов (
n
=5
): 5 8 3 9 1.


Первый шаг
.




1 пара:
5 8


3


9


1

В результате: 5 8 3 9 1.



2 пара:
5
8 3


9


1

В результате: 5 3 8 9 1.




3 пара
: 5
3

8 9


1

В результате: 5 3 8 9 1.



4 па
ра:
5
3

8

9 1

В результате: 5 3 8 1
9


всплыл первый пузырек!


Второй шаг:


1 пара:
5
3


8

1
9

В результате: 3 5 8 1
9
.



2 пара: 3
5 8

1
9

В результате: 3 5

8 1
9
.




3 пара
:
3 5
8 1

9

В результате: 3 5 1
8

9



всплыл второй пузырек!


Третий шаг:



1 пара:
3 5

1
8

9

В результате:
3 5 1
8

9
.



2 пара:
3
5 1

8


9

В результате:
3
1

5

8

9
-

всплыл третий пузырек!


Четвертый шаг:



1 пара:
3 1

5

8

9

В результате: 1
3

5

8

9
-

всплыл четвертый пузырек!


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

Вывод: при количестве элементов 5 штук, мас
сив сортируется за четыре шага.
Значит, при количестве элементов
n

штук


массив будет отсортирован за
n
-
1

шаг.

Каждый шаг количество рассматриваемых пар уменьшается на 1: вначале
n
-
1
пара,
затем
n
-
2

пары и т.д. до 1 пары. Следовательно, каждый шаг количес
тво пар равно


45

(
n
-
номер шага).

Пусть
i



номер шага (от 1 до
n
-
1
),
j
-

количество пар. Тогда
j

будет изменяться от 1


до

n
-
i
.


Программа

сортировки будет следующей
:


Const

t
=50;

Var
A
: array[1..t] of integer;

I,j,n,x: integer;

Begin

Read(n);

For i:=1 to n d
o read(
A
[i]);

For i:=1 to n
-
1 do

For j:=1 to n
-
i do if
A
[

j]�
A
[

j+1] then begin x:=
A
[

j];
A
[

j]:=
A
[

j+1];
A
[

j+1]:=x; end;

for i:=1 to n do write(
A
[i],’ ‘);

end
.


Вопросы и
задания:


Первый блок


Дайте определение массива.


Каково предназначение массивов
?


Чт
о такое сортировка? Приведите примеры.


В чем заключается суть сортировки методом «пузырька»? Проиллюстрируйте
на примере массива: 5 78 3 9 14 25 14 5


Закройте учебник и восстановите программу сортировки элементов массива по
возрастанию

методом «пузы
рька».


Дан массив. Отсортировать его по убыванию.


Дан массив. Отсортировать по возрастанию его первую половину


Дан массив. Отсортировать по убыванию его вторую половину.


Дан массив. Отсортировать по возрастанию его первую половину, а по
убыванию
-

вторую.


Второй блок



Дан массив. Отсортировать по возрастанию
до

позиции максимального
элемента
.



Дан массив. Отсортировать по возрастанию его часть после минимального

элемента
.


Дан массив. Отсортировать по убыванию от позиции максимального до
позиции минимального
.


Дан массив. Отсортировать по убыванию до позиции максимального
(минимального) и после позиции минимального (максимального).



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


Третий блок



Объединить в один массив два отсортированных по возрастанию массива.


Для одномерного массива размерности n по заданному числу k определить
элемент, который останется в массиве в результате исключения
каждого k

го
по счету элемента.



46

Четвертый блок



Дан
двумерный массив
. Отсортировать элементы
в
его

строк
ах

по
возрастанию.


Дан
двумерный
массив. Отсортировать по возрастанию элементы четных строк
массива
.



Дан
двумерный
массив. Отсортировать по убыванию э
лементы нечетных
столбцов массива
.



Задача: Дан массив. Отсортировать элементы его первого столбца по
убыванию
.


Дан массив. Отсортировать элементы его первой строки по возрастанию.












































47

Часть
III


III
.1.
Символьный тип
данных


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



Символьный тип данных


это один из простых (скалярных) типо
в языка
Паскаль.


Переменная символьного типа занимает один байт памяти и может принимать
одно из 256 значений (символов компьютерного алфавита).

В компьютерном алфавите 256 символов, они занесены в специальную таблицу
кодировки
ASCII
, имеющую мировой ста
ндарт. В первой части этой таблицы
перечислены специальные символы, цифры и символы латинского алфавита. Вторая
часть является альтернативной и содержит символы национального алфавита. Все
символы в таблице пронумерованы от 0 до 255. Каждому символу сопост
авлен
двоичный код его номера.

В памяти компьютера символьная величина храниться в виде двоичного кода
своего номера в таблице кодировки символов.

Переменная символьного типа в разделе описания переменных идентифицируется
служебным словом
char
.


Формат:

идентификатор
� :
char
;


Пример
.

Var

a
,
b
:
char
;

Begin

A:=’t’;

B:=’+’;

A
:=
b
;



…. и т.д.

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

Для работы с этими переменными существуют
функции
:


Y
:=Ord(a)
,
где
a
-
величинна символьного типа.

Результат
Y



целое число в диапазоне от 0 до 255 (номер символа в
таблице
кодировки).


B
:=
Pred
(a)
, где
a
-

величина символьного типа.

Результат
B



предыдущий символ
из
таблиц
ы

кодировки.


B
:=
S
ucc
(a)
,
где
a
-
величина символьного типа.

Результат


последующий символ таблице кодировки.


A
:=
Chr
(
Y
)
,
где
Y
-
величина целочисл
енного типа в диапазоне от 0 до 255.

Результат
A



символьная величина, где
Y



номер

ее

символа в таблице кодировки.



48

Вопросы и
задания:



Для чего используется символьный тип данных?


Как хранится символ в памяти компьютера
?


Что собой представляет таблиц
а кодировки
ASCII
?


Какие действия можно осуществлять над переменной символьного типа?


Какие функции работы с переменной символьного типа вы знаете? Как они
выполняются?



Составьте

программу вывода на экран таблицы кодировки
ASCII

так, чтобы
удобно было р
ас
смотреть порядок расположения символов.



Написать программу вывода на экран символов латинского алфавита.


Написать программу вывода на экран цифр.


Написать программу вывода на экран русский алфавит в форме АаБбВв….


Написать программы перехода заданной цифры

а (величина целого типа) в
символ ’
a
’ и обратно.

































49

III
.2.

Строковый тип данных


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


строковый
.




Строка



это последовательность символов таблицы кодировки
компьютера.



Строковый тип данных относится к числу структурированных типов.

Частично ее
можно сравнить с одномерным массивом, элементы кот
орого имеют тип
char
.
Однако количество элементов массива мы обязаны четко оговаривать в
описательной части программы, а количество символов в строке может изменяться в
ходе выполнения программы от 0 до 255.




Количество символов в строке называют ее
длиной
. Длина может лежать в
диапазоне от 0 до 255.


Переменные строкового типа описывают в разделе описания переменных
служебным словом
string
.
Для экономии памяти

после этого слова указывают в
квадратных скобках максимальную длину строки. Если максимальная дли
на не
будет указана, то подразумевают длину 255.

К
аждый
символ

занимает один байт
памяти (код
ASCII
).
Для строки из
k

символов в памяти компьютера отводится
k
+1
байт (
k

байт для хранения символов строки, а один байт для значения текущей
длины строки).


0
байт

1 байт

2 байт

3 байт


k

байт


текущая длина строки

символы строки


По описанию легко определить, сколько места в памяти компьютера займет та
или иная строка.


Формат:

идентификатор
� :
string
[
максимальная длина строки
]
;


Пример
.

Var
S

: string[20] ;
S
tr : string;


В этом примере строка
S

займет в памяти компьютера 21 байт, а строка
Str

по
умолчанию займет 256 байт.


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

Пример
.


Var
S

: string[20] ;

Begin

S :=’computer’;

строковые

константы

Writeln
(
S
,’
-

компьютер’);


Для обозначения пустой строки с
тавится два апострофа подряд (
S
:=’’
;


пустая
строка
)
.


50

В отличие от массива строка вводится в память компьютера и выводится на экран
целиком, а не поэлементно.
Для ввода

строки
использ
уется процедура

ввода
(
readln
)
. Название переводится как «читай строку».

Для вывода

на экран используют процедуру вывода
write

(или
writeln
).

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

Строки можно соединять друг с другом, используя операцию

с
цепления «+».

Пример
.


Var
S

: string[20] ;
S1, S2 : string;


Begin

S

:=’
computer

;

S1 :=’IBM PC’;

S
2 :=
S
+’ ‘+
S
1+’
-
популярный компьютер
’;


Writeln
(
S
2);

End
.


В результате на экран будет выведена строка
:



computer

IBM

PC
-
популярный

компьютер


Если в результате присваивания получается строка недопустимой длины, то все
лишние символы справа отбрасываются.

Строки можно сравнивать друг с другом используя
операции отношения




�&#x, 00;&#x, 00;(=, , , , =, =)
.




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


Пример.


abc
1’<’
abc
2’ ‘
abc
1
bbbb
’<’
abc
2’ ‘
AAA
’<’
aaa
’ ‘123’=’123’


Аналогично как и в одномерном массиве, к отдельному символу строки можно
обратиться по номеру.

Пример
.


Var
S

: string[20]
;
S1, S2 : string;


Begin

S

:=’
ДОМ

;

S1 :=’
САД
’;

S
2 :=
S[1]
+
S
1
[2]+S[3]
;


Writeln
(
S
2
, S1[2]
);

End
.


В результате на экран будет выведен
о: ДАМА


Пример.

Составить программу, формирующую строку, состоящую из
n

‘*’.


Дано:

n



количество звездочек (
byte
);

Найт
и:

S



строка (
string
)
;

Решение:



Пусть
S



пустая строка,
‘*’



символ или строка, состоящая из одного символа.
Если
n

раз к строке
S

прицепить строку

*

, то получим то что требовалось.
Используем оператор цикла с параметром
i
.
Где
i



количество сцепл
ений(
byte
)
.


51

Программа решения задачи может быть такой:



Var
S

: string
; n, i : byte;


Begin

S

:=’’
;

For i :=1 to n do S:=S+’
*
’;

Writeln
(
S
, ‘
-
строка из звездочек
’);

End
.


Для определения
текущей длины

строки существует функция:


Y
:=
Length
(
s
)

S



величин
а строкового типа.

Результат
Y


текущая длина строки.


Пример.
Дана строка. Подсчитать сколько в ней цифр.


Дано:

S



строка (
string
)
;

Найти:

k



количество цифр (
byte
);

Решение:



Для решения задачи необходимо просмотреть все символы строки и выяснить
ра
сположены ли они в таблице
ASCII


в промежутке от
‘0’
до
‘9’
. Для этого могут
быть использованы операции отношения. Прежде чем просмотреть все символы
нужно узнать длину строки (
y
).

Программа решения задачи может быть такой:



Var
S

: string
; k, y, i :

byte;


Begin

Readln(
S
);

Y:=length(S);

For i :=1 to y do if (‘0’<=S[i]) and (S[i]<=’9’) then k:=k+1;

Writeln
(
k
, ‘
-
количество цифр в строке
’);

End
.




Вопросы и
задания:



Что такое строка?


Как производится описание строки?


Что называют длиной строки?


Как хр
анится строка в памяти компьютера
?


Что такое строковая константа? Каково правило ее написания?


Как осуществить ввод и вывод строки?


Какие операции допустимы над строковыми величинами?


Как производится сравнение строк?


Как обратиться к символам строки?


Дана

строка определить сколько в не знаков
‘*’, ‘;’

и

‘:’
.



Составить программу, которая дублирует символы в строке (‘
abc




aabbcc
’).


Составить программу, которая добавляет к строке столько ‘+’, сколько в ней
было символов первоначально.


Составить программу,

проверяющую является ли строка «перевертышем».



52

III
.
3
.

Процедуры и функции работы со строковыми величинами


С одной из функций обработки строк вы уже ознакомлены. Это функция
определения
длины строки
.

В этой главе будут рассмотрены наиболее часто
использу
емые процедуры и функции обработки строк.

Для работы с величинами строкового типа существуют функции
:


S1 :=Copy(S, Poz, N)


S



величина строкового типа.

Poz
,
N



значения целого типа.

Результат
S
1


подстрока, длиной в
N

символов, выделенная из строки
S
,
начиная с
позиции
Poz
.


Пример.

Получить из слова «дисковод» слово «воск».


Дано:

«дисковод»



строковая константа, которую можно сохранить в переменной
S
1
(типа
string
)
;

Получить
:

«воск»


строковую константу, которую можно разместить в переменной
S
2

(
str
ing
);

Решение
:


С помощью функции
Copy

вырежем из данной строки две подстроки «во» и «ск» и
сцепим их операцией сцепления.

Программа решения задачи может быть такой:



Var
S
1
, S2

: string
;


Begin

S1 :=’
дисковод
’;

S2:=copy(S1,6,2)+copy(s1,3,2);

Writeln
(
S2
);

End
.


Y :=Pos
(
S
1,
S
)


S
1,
S



величины строкового типа.

Результат
Y


целое число, равное номеру позиции, с которой строка
S
1
располагается в строке
S
. Если
S
1 не является подстрокой
S
, то результат равен 0.


Пример.

Даны строка
S

и подстрока
St
. Выяснить

входит ли эта подстрока в данную
строку. Если входит, то напечатать номер символа строки
S
, с которого подстрока
St

входит в эту строку.


Дано
:

S
,
St


строки

(
типа

string
);

Найти
:

k



номер позиции, с которой строка
S
t

располагается в строке
S
.
В
противно
м случае распечатать сообщение.

Решение
:


С помощью функции
pos

определим номер вхождения.

Если
S
t

не является подстрокой
S
, то результат равен 0.

Программа решения задачи может быть такой:






53

Var
St, S

: string
;

k:byte;

Begin

Readln(S);

Readln(St);

k
:=
pos
(
St
,
S
);

if

k
䀀0
then

writeln
(‘
подстрока

‘,
St
, ‘
входит

в

строку

‘,
S
,’

начиная с позиции
’,
k
)


else

writeln
(‘
подстрока

‘,
St
, ‘
не

входит

в

строку

‘,
S
);

End
.


Для работы с переменными строкового типа существуют процедуры:


Delete
(
S
,
Poz
,
N
)



удаляет из строки
S

подстроку, длиной в
N

символов, начиная с
позиции
Poz
.


S



величина строкового типа.

Poz
,
N



значения целого типа.


Insert
(
S
1,
S
2,
Poz
)



вставка строки
S
1 в строку
S
2 начиная с позиции
Poz
.


S
1,
S
2


величины строкового типа.

Poz



зна
чение целого типа.


Пример.


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

S1 на
комбинацию символов

S2 и подсчитывает количество замен.


Дано
:

S
,
S
1,

S2


строки

(
типа

string
);

Найти
:

S



измененная строка (
string
),
kol



количество замен (
byte
).

Решение
:


Рассмотрим строку
S
. С помощью функции
pos

определим номер вхождения

k

(
byte
)
строки
S
1
в строку
S
. Если
S
1

не является подстрокой
S
, то значение функции

Pos

станет равным 0. При выполнении условия
k
�0

следует удалить слово
S
1

(
(
S
,
k
,
y
)
, где
y



длина слова
S
1
) и вставить слово
S
2

на его место
(
Insert
(
S
2,
S
,
k
)).

При этом следует увеличить значение счетчика замен на единицу
(
kol

:=
kol
+1
).


Такую операц
ию нужно повторить столько раз, сколько слово
S
1

встречается в
строке

S
. Но именно это нам неизвестно. Следовательно, операцию нужно повторять
до
k
=0
.

Программа решения задачи может быть такой:

Var S,S1,S2

:

string;

kol,

k,y

:

byte;

Begin

Readln(S);

Rea
dln(S1);

Readln(S2);

y

:=Length(S1);

Repeat


k

:=Pos(S1,S);


�if k0 then begin

Insert(S2,S,k);

kol:=kol+1;
end
;

U
ntil
(
k=0
);

writeln(S);

writeln(kol,’
-
замен
’);

End
.


54


Вопросы и
задания:



Что такое строка?


Как хранится строка в памяти к
омпьютера
?


Какие операции допустимы над строковыми величинами?


Как производится сравнение строк?


Как обратиться к символам строки?


Назовите процедуры и функции обработки строк. Каковы их формат и
назначение?


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


Составить программу, удаляющую из строки все пробелы.


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


Составить программу, которая считает количество символов в строке до
первого сим
вола ‘!’.



Составить программу, считающую, сколько букв «к» встречается в последнем
слове строки.


Составить программу, считающую, сколько букв «к» встречается в
первом
слове строки.
































55


III
.
4
.

Использование

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


Усложним предыдущую задачу.


Пример.


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

S1
словом

S2 и п
одсчитывает
количество замен.


Дано
:

S
,
S
1,

S2


строки

(
типа

string
);

Найти
:

S



измененная строка (
string
),
kol



количество замен (
byte
).

Решение
:


В этом случае, функция Pos нам вряд ли поможет. S1 может оказаться не словом, а
подстрокой (например, слов
о «бам» в слове «Алабама»), тогда такая комбинация
символов не требует замены.


Одним из выходов в данной ситуации может быть составление одномерного
массива
A
, элементами которого будут слова
slov

(
string
) строки
S

и группы,
разделяющих их пробелов
probe
l

(
string
)
.

Слово собираем до пробела.


slov:=’’;



While (S[i]䀀' ')and(i=y) do begin slov:=slov+S[i]; i:=i+1; end;

Затем

заносим слово в массив и пропускаем

пробелы
.

A[k]:=slov; k:=k+1;

Probel :=’’;


While
S[i]=' ')and(i=y)
do begin probel :=pro
bel+’ ‘; i:=i+1; end;

Этот процесс повторяем пока не будет достигнут конец строки.

Полученн
ый массив состоит из
k

слов.

Последовательно сравниваем элементы массива со словом
S
1
и, при совпадении,
заменяем на слово
S
2

и считаем замены.

Обнуляем строку
S
. За
ново собираем строку
S

из элементов массива
A
.

Программа решения задачи может быть такой:


Var S,S1,S2
,
slov, probel
:

string;


kol,

y
, i, k
:

byte;


A : array[1..100] of string;

Begin

Readln(S);

Readln(S1);

Readln(S2);

y

:=Length(S);

i:=
1;

k:=1;

Repeat


slov:=’’;



While (S[i]䀀' ')and(i=y) do begin slov:=slov+S[i]; i:=i+1; end;


A[k]:=slov; k:=k+1;


Probel :=’’;


While
S[i]=' ')and(i=y)
do begin probel :=probel+’ ‘; i:=i+1; end;


A[k]:=probel; k:=k+1;

U
ntil
(i�y)
;

For
i:=1 to k do if A[i]=S1 then begin A[i]:=S2; kol:=kol+1; end;


56

S:=’’;

For i:=1 to k do S:=S+A[i];

writeln(S);

writeln(kol,’
-
замен
’);

End
.


Вопросы и
задания:


Первый блок


Что такое строка?


Как хранится строка в памяти компьютера
?


Как обратиться к символам
строки?


Как производится сравнение строк?


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


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


Составить программу, которая из заданной строки выбирает

и распечатывает
все слова состоящие из
k

букв.


Составить программу, которая из заданной строки
заменяет

все слова
состоящие из
k

букв

на слово «три»
.


Второй блок



Составить программу, упорядочивающую слова в строке по алфавиту.


Составить программу поиска
самого длинного и самого короткого слова.


Составить программу,
перевертывающую строку
.








Приложенные файлы

  • pdf 1070494
    Размер файла: 678 kB Загрузок: 0

Добавить комментарий