Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Алгоритмизация и программирование. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
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. Заполнить массив случайными целыми числами из промежутка [0..6]. Вывести его на экран. Вывести на экран индексы всех элементов, сумма которых с первым элементом не превосходит 5.
11. Заполнить массив из чисел с клавиатуры и подсчитать общее ко- личество чётных чисел больше 5 в массиве.
12. Заполнить массив 10ю случайными числами из промежутка [-5..5]. Вывести его на экран. Заменить все отрицательные элементы их моду­лем. Вывести обработанный массив.
13. Заполнить массив случайными целыми числами из промежутка [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. Проверить, является ли введённое слово палиндромом, то есть, читается
ли оно одинаково справа и слева (например, казак – палиндром, собака – не палиндром).
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]