Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Алгоритмизация и программирование. Учебное пособие
.pdf
31
y[‘f’]:= y[‘e’] -5;
Writeln(‘Значение пятого элемента массива =’, x[5]);
Заполнить массив можно с помощью оператора присваивания, непосредственно обращаясь к каждому элементу.
Пример:
y[‘b’]:=0.5; y[‘c’]:=1; y[‘d’]:=1.5; y[‘e’]:=2.5; y[‘f’]:=0.5;
Можно организовать заполнение с клавиатуры.
Пример:
……………
for i:=1 to 10 do
begin
Write(‘введите элемент массива ’);
Readln(x[i]);
end;
Часто также используется заполнение случайными числами.
Пример:
for i:=1 to 10 do x[i]:=Random(1000);
Вывод на экран
Для вывода всех элементов массива на экран практически всегда используется жёсткий цикл.
Пример:
for i:=1 to 10 do Writeln(‘x[’, i, ’]=’, x[i]);
Задание. Заполнить массив из 5 элементов целыми числами с клавиатуры и найти сумму его элементов.
Текст программы.
Var i,s: integer;
a:array [1..5] of integer;
BEGIN
for i:=1 to 5 do begin // Заполняем массив с клавиатуры
Write('a(', i ,')=');
Readln(a[i]);
end;
s:=0;

32
for i:=1 to 5 do s:=s+a[i]; // Подсчитываем сумму элементов;
Writeln('Сумма элементов=',s);
END.
Задание. Заполнить массив из 15 элементов случайными целыми
числами [1..50], вывести его на экран, вывести индексы (то есть, номера)
нечётных элементов.
Текст программы.
Var i: integer;
a:array [1..15] of integer;
BEGIN
Randomize;
for i:=1 to 15 do a[i]:=random(50)+1; //Заполняем массив
Writeln('Исходный массив');
for i:=1 to 15 do Write(a[i], ' '); // Вывод элементов массива на экран
Writeln; //Переводим курсор на новую строку
Writeln('Индексы нечётных элементов');
for i:=1 to 15 do if (a[i] mod 2<>0) then Write(i, ' '); //Вывод индексов
END.
Задания для самостоятельной работы
1. Найти сумму цифр 7 и 5 в введённом числе (например, в числе 4755
сумма равна 17).
2. Подсчитать количество чётных цифр в введённом числе (например,
в числе 1213 количество чётных цифр равно1).
3. Найти в введённом числе количество всех цифр неравных четырём
(например, в числе 4214 таких цифр 2).
4. Подсчитать количество цифр кратных 3 в введённом числе (например,
в числе 10195 одна такая цифра).
5. Заполнить массив из 6ти чисел с клавиатуры и подсчитать сумму его
неотрицательных элементов.
6. Заполнить массив 15ю случайными числами из промежутка [1..5]. Вывести его на экран. Заменить все числа, равные 5 на 7. Вывести обработанный массив.
7. Заполнить массив 8ю случайными числами из промежутка [-7..5]. Вывести его на экран. Вывести на экран индексы элементов, которые не превосходят последний элемент массива.
8. Заполнить массив из 7и чисел с клавиатуры и подсчитать сумму его
элементов, имеющих чётные индексы.

33
9. Заполнить массив 10ю случайными числами из промежутка [-7..5]. Вывести его на экран. Заменить все положительные элементы противоположным им отрицательным числом. Вывести обработанный массив.
10. Заполнить массив 7ю случайными целыми числами из промежутка
[0..6]. Вывести его на экран. Вывести на экран индексы всех элементов,
сумма которых с первым элементом не превосходит 5.
11. Заполнить массив из 8и чисел с клавиатуры и подсчитать общее ко-
личество чётных чисел больше 5 в массиве.
12. Заполнить массив 10ю случайными числами из промежутка [-5..5].
Вывести его на экран. Заменить все отрицательные элементы их модулем. Вывести обработанный массив.
13. Заполнить массив 8ю случайными целыми числами из промежутка
[1..3]. Вывести его на экран. Вывести на экран индексы всех элементов,
равных по значению первому элементу.
14. Заполнить массив из 9ти чисел с клавиатуры и подсчитать сумму его
чётных элементов с индексами больше 4.
15. Заполнить массив 6ю случайными числами из промежутка [2..5]. Вывести его на экран. Заменить все элементы равные 2 на значение последнего элемента массива.
9. ДВУМЕРНЫЕ МАССИВЫ
Массивы, рассмотренные нами ранее, называются одномерными. Одномерный массив можно представить, как линейную структуру, в которой
элементы следуют друг за другом. В практике программирования для организации хранения данных, принадлежащих одному и тому же типу, нередко
используют более сложные структуры, например, многомерные массивы.
Так, одномерный массив может состоять из элементов, каждый из которых
также является одномерным массивом. В этом случае говорят о существовании двумерного массива. В блоке описания такой массив может быть
описан следующим образом:
Var matrix: array [1..10] of array [1..3] of integer;
Массив matrix состоит из 10 массивов, каждый из которых содержит
три элемента. Таким образом, всего в matrix содержится 30 целых чисел.
Естественной интерпретацией двумерных массивов являются двумерные
таблицы данных или математические матрицы. Обычно при работе с двумерными массивами используют не тот вариант записи, который мы привели выше, а более простой. Массив matrix можно было описать так:
Var matrix: array [1..10, 1..3] of integer;

34
Индексы элементов двумерного массива можно ассоциировать с координатами точек на плоскости. Договоримся, что первый диапазон двумерного массива будет отвечать за “столбцы”, а второй за “строки”. То
есть приведённый в примере массив можно рассматривать как таблицу
целых чисел, состоящую из 10 столбцов и трёх строк. Обращение к элементам двумерного массива осуществляется аналогично одномерным
массивам – указывается имя массива и в квадратных скобках через запятую индексы его элемента (по нашей договорённости, сначала номер
столбца, потом номер строки).
Пример:
matrix[7,2]:=9 - седьмому элементу второй строки присваиваем 9.
matrix[5,2]:= matrix[3,1];
matrix[2,7]:= 15 - ОШИБКА! В массиве нет седьмой строки.
matrix[3,3]:= 12.5 - ОШИБКА! Значения должны быть целыми.
При работе с двумерными массивами практически всегда используются вложенные жёсткие циклы.
Задание. Заполнить двумерный массив 4х5 целыми числами с клавиатуры, вывести его на экран и найти сумму его элементов.
Текст программы.
Var x, y, s: integer;
a:array[1..4, 1..5] of integer;
BEGIN
Writeln(‘Введите элементы массива’); // Заполняем массив
//с клавиатуры
for y:=1 to 5 do for x:=1 to 4 do begin
Write(‘a[’,x,’,’,y,’]=’);
Readln a[x,y];
end;
Writeln(‘Заполненный массив’); //Выводим массив (построчно)
// на экран
for y:=1 to 5 do begin
for x:=1 to 4 do Write(a[x,y],’ ‘);
Writeln
end;
s:=0;
for y:=1 to 5 do for x:=1 to 4 do s:=s+a[x,y]; // Находим сумму
//элементов
Writeln(‘сумма элементов массива=’,s);
END.

35
Задание. Заполнить массив 5Х4 случайными вещественными числами из
диапазона [0,2]. Все элементы чётных строк и столбцов заменить нулями.
Текст программы.
Var x,y: integer;
a:array[1..5, 1..4] of real;
BEGIN
// Заполняем массив
Randomize;
for y:=1 to 4 do for x:=1 to 5 do a[x,y]:=random*2;
// Построчно выводим массив на экран
Writeln('Заполненный массив');
for y:=1 to 4 do begin
for x:=1 to 5 do Write(a[x,y]:5:5,' ');
Writeln
end;
// Обрабатываем массив
for y:=1 to 4 do for x:=1 to 5 do
if (x mod 2 =0) or (y mod 2=0) then a[x,y]:=0;
// Выводим обработанный массив
Writeln('Обработанный массив');
for y:=1 to 4 do begin
for x:=1 to 5 do Write(a[x,y]:5:5,' ');
Writeln
end;
END.
В заключение сделаем несколько замечаний:
1) Как и одномерные массивы, двумерные массивы могут быть
сформированы на основе диапазонов, построенных из значений любых
порядковых типов. Это не обязательно должны быть числа. Если используются числовые диапазоны, то они не обязательно должны начинаться с
единицы.
Пример:
Var z: array [5..10, 3..12] of real;
Mb: array[‘a’..’k’,1..10] of real;
2) В языке программирования Паскаль для одинаковых массивов до-
пустима операция присваивания массива массиву.

36
Пример:
Var A,B: array[1..50,1..60] of real;
…………….
A:=B;
…………….
3) По аналогии с двумерными вводятся трёхмерные, четырёхмерные
и т.д. массивы. Например, для хранения координат точек в пространстве
может быть использован следующий трёхмерный массив.
Var koor: array[1..100, 1..100, 1..100] of real;
Задания для самостоятельной работы
1. Заполните двумерный массив 2Х5 с клавиатуры. Выведите его на экран.
Замените все отрицательные элементы массива нулями. Выведите обработанный массив на экран.
2. Заполните двумерный массив 4Х3 случайными целыми числами из диапазона [1, 6]. Выведите его на экран. Найдите сумму элементов каждого
столбца.
3. Заполните двумерный массив 3Х3 с клавиатуры. Выведите его на экран.
Замените все чётные элементы номерами столбцов, в которых они расположены. Выведите обработанный массив на экран.
4. Заполните двумерный массив 5Х6 случайными целыми числами из диапазона [3, 9]. Выведите его на экран. Найдите произведение элементов,
расположенных в строках с нечётным номером.
5. Заполните двумерный массив 3Х3 с клавиатуры. Выведите его на экран.
Замените все нечётные элементы массива значением центрального элемента. Выведите обработанный массив на экран.
6. Заполните двумерный массив 4Х5 случайными целыми числами от [-2,8]
Выведите его на экран. Выведите на экран отрицательные элементы второго и третьего столбца
7. Заполните двумерный массив 4Х5 случайными вещественными числами
из диапазона [-1, 1]. Выведите его на экран. Подсчитайте общее количе-
ство неотрицательных элементов в массиве.
8. Заполните двумерный массив 3Х4 целыми числами с клавиатуры. Выве-
дите его на экран. Найдите сумму элементов каждой строки.
9. Заполните двумерный массив 4Х5 случайными вещественными числами
из диапазона [-2, 5]. Выведите его на экран. Подсчитайте общее количе-
ство элементов, модуль которых больше единицы.
10. Заполните двумерный массив 4Х4 целыми числами с клавиатуры. Выведите его на экран. Найдите произведение нечётных элементов второй
строки.

37
11. Заполните двумерный массив 5Х3 случайными вещественными числами из диапазона [-7, 5]. Выведите его на экран. Найдите сумму неотрицательных элементов второго и пятого столбца.
12. Заполните двумерный массив 3Х3 целыми числами с клавиатуры. Выведите его на экран. Все чётные элементы массива увеличите на 1. Выведите обработанный массив на экран.
13. Заполните двумерный массив 3Х6 случайными целыми числами из
диапазона [-6, 15]. Найдите максимальный элемент массива.
14. Заполните двумерный массив 3Х3 целыми числами с клавиатуры. Поменять местами строки и столбцы этой массива. Вывести содержимое массива до обработки и после обработки.
15. Заполните двумерный массив 5Х5 случайными целыми числами от
[-3,10] Выведите его на экран. Найдите сумму элементов, расположен-
ных выше главной диагонали.
10. СИМВОЛЬНЫЙ И СТРОКОВЫЙ ТИПЫ ДАННЫХ
Обработка текста является чрезвычайно распространённой задачей
программирования. В Паскале при работе с текстовыми данными используются две основные группы типов: символы и строки.
Символ ‒ это одна элементарная единица текста, буква, цифра, какой-либо знак. Для работы с символами используется тип сhar. Каждый
символ имеет свой уникальный номер (ASCII-код) от 0 до 255 . Узнать
код символа можно с помощью функции Ord(символ), обратное действие выполняет функция Chr(код) или команда #код.
Пример:
Ord(‘A’) = 65.
Chr(65)=’A’.
#65=’A’.
Задание. Вывести на экран таблицу символов ASCII.
Текст программы.
Var i:integer;
Begin
for i:=1 to 255 do writeln(i, '-', chr(i));
End.
Некоторые символы таблицы ASCII имеют код, но не имеют визуального отображения. Эти символы используются для обработки событий

38
от управляющих клавиш. Так, клавиша Enter имеет код 13, Escape - 27,
пробел - 32, Tab - 9 и т.д.
Строка – это набор символов, любая их последовательность. Один
символ может также рассматриваться как строка, состоящая из одного
символа. Для работы со строками в Паскале используется несколько типов.
Значения типа string – это строки не длиннее 255 символов. Для работы с
более короткими строками можно использовать ограниченный строковый
тип string[n], где n- максимальная длина строки. Конкретные строковые и
символьные значения в тексте программы заключаются в апострофы.
Пример:
S:=‘моя строка’;
Writeln(’Привет!’);
В первых версиях Паскаля строки определялись как массивы символов. Некоторые приёмы работы со строками и сегодня напоминают действия с массивами. Так, к любому символу строки можно обратиться через
его номер. Например, заменить первый символ строки “F” можно так:
s[1]:=’F’;
Основной операцией со строками является сложение (склеивание).
Она реализуется с помощью функции concat или операции “+”.
Пример:
Concat( 'пар','о’,‘ход’) = ‘пароход’.
'пар' +'о’+ ‘ход’ = ‘пароход’.
Поскольку каждая строка ‒ это последовательность символов, а
каждый символ имеет свой порядковый номер, то над строками допустимы операции сравнения (>, <, =, >=, <=, <> ). Эти операции осуществляются путём последовательного сравнения кодов соответствующих символов строк.
Пример:
'банан’<’бидон’ = true так как ord(‘а’) < ord(‘и’).
Основные функции и процедуры для работы со строками
Length(s) ‒ возвращает длину строки s (количество символов в стоке s).
Copy(s, позуция, длина) ‒ возвращает подстроку строки s заданной
длины, начиная с указанной позиции.

39
Delete(s, позиция, количество) ‒ удаляет из строки s заданное количество символов начиная с указанной позиции.
Insert(подстрока, s, позиция) ‒ вставляет подстроку в строку s
начиная с указанной позиции.
Pos(подстрока, s) ‒ возвращает позицию первого вхождения под-
строки в строке s (или 0, если подстрока отсутствует).
Str(x,s) ‒ преобразует число x в строку s.
Val(s, x, code) ‒ преобразует строку s в целое число x. Если преобра-
зование прошло успешно, то в целочисленную переменную code возвращается 0, в противном случае возвращается некоторое ненулевое значение.
Задание. Написать программу, заменяющую в слове все буквы “а”
на “б”.
Решение. Сформируем новую строку, в которую возьмём все буквы
исходной строки, отличные от “а”, а вместо букв “а” запишем “б”.
Текст программы.
Var s,sr: string;
i:integer;
BEGIN
Writeln('Введите строку'); Readln(s);
sr:=''; // Вводим рабочую строку и присваиваем ей пустую строку
for i:=1 to length(s) do if s[i]<>'а' then sr:=sr+s[i] else sr:=sr+'б';
Writeln(‘Обработанная строка-’,sr);
END.
Задание. Написать программу, удаляющую из введённого слова все
символы “а”.
Решение. Сформируем новую строку, в которую возьмём все буквы
исходной строки, отличные от “а”.
Текст программы.
Var s,sr: string;
i:integer;
BEGIN
Writeln('Введите строку'); Readln(s);
sr:=''; // Вводим рабочую строку и присваиваем ей пустую строку
for i:=1 to length(s) do if s[i]<>'а' then sr:=sr+s[i];
Writeln(‘Обработанная строка-’,sr);
END.

40
Решение (второй вариант). Мы можем удалять символ из слова,
если его позиция соответствует подстроке “а” в слове. Этот процесс
будет продолжаться до тех пор, пока в слове будет присутствовать
буква “а”, то есть позиция “a” в слове отлична от нуля.
Var s:string;
BEGIN
Writeln('Введите строку');
Readln(s);
While Pos('а',s) > 0 do Delete(s, Pos('а',s),1);
Writeln(‘Обработанная строка-’, s);
END.
Задание. Написать программу, подсчитывающую сумму цифр в строке.
Решение. Будем перебирать все символы строки и пытаться преобразовывать их в числа. В случаях, когда такое преобразование окажется
успешным, добавим полученные результаты к общей сумме.
Текст программы.
Var s: string;
i,sum,x,cod:integer;
BEGIN
Writeln('Введите строку');
Readln(s);
sum:=0; // Обнуляем сумму
for i:=1 to length(s) do begin
val(s[i],x,cod); // Преобразуем текущий символ в число
if cod=0 then sum:=sum+x; // если ошибки не произошло, добавляем
// результат к сумме
end;
Writeln('Сумма цифр=',sum);
END.
Задания для самостоятельной работы
1. В ведённой строке удвойте каждое вхождение букв “о” и “я” (например,
яблоко → яяблоокоо).
2. Подсчитать, сколько раз в строке встречается её последняя буква.
3. Проверить, является ли введённое слово палиндромом, то есть, читается
ли оно одинаково справа и слева (например, казак – палиндром, собака –
не палиндром).
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
