Файл: Методическое пособие 2013 Корректор Осипова Е. А.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 25.10.2023

Просмотров: 179

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

15
k:=k+y div x+2; y:=a–x+y mod x; end; bill:=k; end; begin repeat writeln('Введите два натуральных числа A>B'); readln(a,b); until a>=b; writeln('Количество отрезков в траектории :', bill(a,b)); end.
0>

Задача 1.12. Пусть процедура maxmin(x,y) присваивает параметру x
большее из вещественных чисел x и y, а параметру y — меньшее. Описать
данную процедуру и использовать ее для перераспределения значений ве-
щественных переменных a, b и c так, чтобы стало a>=b>=c.
var a,b,c : real; procedure maxmin( var x,y:real); var r:real; begin if xЗадача 1.13. Если среди чисел sin(x
n
) (n = 1, 2, ... ,30) есть хотя бы
одно отрицательное число, то логической переменной t присвоить значе-
ние true, а иначе — значение false.
var y,x : real; n : integer; t : boolean; begin write('Введите значение x –'); readln(x);

16
y:=1; n:=0; repeat n:=n+1; y:=x*y; t:=sin(y)<0 until t or (n=30); writeln(t); end.
Задача 1.14. Определить k — количество трехзначных натуральных
чисел, сумма цифр которых равна n (1
mod) не использовать.
var d1, d2, d3, k, n : integer; begin writeln('Введите число n, с которым будем сравнивать сумму цифр числа'); readln(n); k:=0;
{d1 – левая, d2 – средняя, d3 – правая цифры числа} for d1:=1 to 9 do for d2:=0 to 9 do for d3:=0 to 9 do if d1+d2+d3=n then begin k:=k+1; write(d1,d2,d3, ' '); end; writeln('Количество искомых чисел равно –', k); end.
Строковый тип данных
Задача 1.15. Вывести в одну строку ABBCCCDDDDE .... ZZ...Z.
Переменные: i — переменная цикла; определяет, какая буква выводится; k — количество повторений буквы; j — переменная цикла.
Алгоритм решения задачи:
1)
цикл for i:='A' to 'z' do определяет, какую букву выводим на печать;
2)
внутренний цикл for j:=1 to k do определяет, сколько раз будет пе- чататься буква;
3)
выводим заданную букву k раз на экран;
4)
после вывода всех букв закрываем строку оператором writeln.

17
var i : char; k,j : integer; begin k:=1; for i:= 'A' to 'Z' do begin for j:=1 to k do write(i); k:=k+1; end; writeln; end.
Задача 1.16. Дана строка символов. Удалить из нее все знаки препи-
нания.
Переменные: i — переменная цикла;
L — длина строки; str — строка текста; str1 — вспомогательная строка; m — множество знаков препинания.
Алгоритм решения задачи:
1)
задаем значение множества m — множества знаков препинания;
2)
вводим строку str с клавиатуры;
3)
цикл for i:=1 to l do осуществляет построение вспомогательной строки без знаков препинания: берем отдельный символ строки и прове- ряем, является ли он знаком препинания. Если да, то присоединяем этот символ к новой вспомогательной строке. Если нет, то переходим к сле- дующему элементу строки;
4)
первоначальную строку заменяем на вспомогательную;
5)
выводим сроку на экран. var str, str1 : string;
L, i : integer; m : set of char; begin m:=['.', ',', '!', ':', ';', '?', '-']; writeln('Введите текст'); readln(str); L:=length(str); str1:=''; for i:=1 to L do if not(str[i] in m) then str1:=str1+str[i]; str:=str1; writeln('Преобразованный текст ', str); end.

18
Задача 1.17. Дана строка символов. Выделить подстроку между
первой и последней точкой.
Переменные: i — номер позиции, которая соответствует точке; j — местоположение первой точки; m — местоположение последней точки; str — строка текста; s1 — вспомогательная переменная.
Алгоритм решения задачи:
1)
вводим строку str и присваиваем значение вспомогательной пере- менной s1:=str;
2)
определяем местоположение первой точки в тексте; если точка есть, то вырезаем из s1 текст до нее;
3)
ищем последнюю точку в цикле while i<>0 do; если она есть, то значение переменной m указывает на ее местоположение;
4)
в зависимости от присутствия точек выделяем подстроку s1:=copy(str,j+1,m–j–1) и выводим результат на экран. var str, s1 : string; i, m, j : integer; begin writeln('Введите текст'); readln(str); s1:=str; i:=pos('.',s1); j:=i; m:=0; if (i<>0) then begin while i<>0 do begin delete(s1,1,i); m:=m+i; i:=pos('.',s1); end; if m<>j then begin s1:=copy(str,j+1,m–j–1); writeln('Часть текста между 1-й и последней точкой'); writeln(s1); end else writeln('В тексте только одна точка'); end else writeln('В тексте нет ни одной точки'); end.
Задача 1.18. Дана строка символов. Определить, является ли она за-
писью десятичного числа, кратного трем.
Необходимо удостовериться, что введенная строка состоит только из цифр, т.е. может быть преобразована в десятичное число. Само преобразо-

19
вание цифры в число сделать очень просто. Поскольку коды символьных переменных — цифр — следуют один за другим, то функция ord в выра- жении ord(s1[i])–ord('0') поможет нам сделать это.
Переменные: i — переменная цикла; s1 — строка цифр; m — длина строчки; k — счетчик цифр.
Алгоритм решения задачи:
1)
вводим строку s1;
2)
организуем в строке поиск цифр до тех пор, пока не встретим ко- нец строчки или не обнаружим наличие ошибки в арифметическом выра- жении;
3)
если встречается цифра, то добавляем ее к общей сумме цифр;
4)
после определения суммы цифр, определяем, кратна ли она трем;
5)
в зависимости от полученного результата выводим ответ на экран. var s1 : string; k, i, m : integer; begin writeln('Введите строку'); readln(s1); m:=length(s1); k:=0; i:=1; repeat case s1[i] of
'0'..'9' : k:=k+(ord(s1[i])–ord('0'));
' ' : ; else k:=–1; end; i:=i+1; until (i>m) or (k<0); if k mod 3 = 0 then writeln('Это десятичное число, кратное 3') else writeln('Это не десятичное число, кратное 3') end.
Задача 1.19. Дана строка символов. Группы символов в ней между
группами пробелов считаются словами. Посчитать, сколько слов содер-
жит данная строка.

20
Переменные: i — вспомогательная переменная; s — строка текста; k — счетчик слов.
Алгоритм решения задачи:
1)
вводим строку s;
2)
на каждом шаге внешнего цикла отыскиваем очередное слово в строке и увеличиваем счетчик слов;
3)
выводим результат на экран. var s: string; i,k: integer; begin writeln('Введите строку'); readln(s); k:=0; i:=1; while i<=length(s) do begin
{пропускаем пробелы} while (s[i]=' ') and (i<=length(s)) do i := i+1; if i<=length(s) then k := k+1;
{ищем новый пробел} while (s[i]<>' ') and (i<=length(s)) do i := i+1; end; writeln('количество слов =',k) end.
Задача 1.20. Дана строка символов. Группы символов в ней между
группами пробелов считаются словами. Определить длину самого корот-
кого и самого длинного слова.
Переменные: i — индекс очередного символа в строке; s — строка текста; beginStr и endStr — начало и конец слова; len — длина слова; max — длина наибольшего слова; min — длина наименьшего слова.
Алгоритм решения задачи:
1)
вводим строку s;
2)
устанавливаем начальные значения max и min;

21 3)
организуем внешний цикл для поиска очередного слова в строке;
4)
найдя слово, определяем его длину и при необходимости коррек- тируем max и min;
5)
выводим результат на экран. var s:string; i,min,max,beginStr,endStr,len:integer; begin writeln('Введите строку'); readln(s); max:=0; min:=255; i:=1; while i<=length(s) do begin
{пропускаем пробелы} while (s[i]=' ') and (i<=length(s)) do i:=i+1; if i<=length(s) then begin beginStr:=i;
{нашли начало слова, ищем его конец} while (s[i]<>' ') and (i<=length(s)) do i:=i+1; endStr:=i–1; writeln(beginStr,'–',endStr); len:=endStr–beginStr+1; if len>max then max:=len; if lenЗадача 1.21. Дана строка. Преобразовать строку, заменив в ней
каждую группу стоящих рядом точек одной точкой.
Переменные: s — строка текста.
Для решения задачи:
1)
вводим строку s;
2)
найдем пару стоящих рядом точек, удалим одну из них; повторим поиск. И так до тех пор, пока в строке не окажется ни одной такой пары точек;
3)
выводим результат на экран.

22
var s : string; begin writeln('Введите строку'); readln(s); while pos('..', s) <> 0 do delete (s, pos('..', s), 1); writeln('Полученная строка : ', s); end.
Задача 1.22. Присвоить литерным переменным с2, с1 и с0 соответ-
ственно левую, среднюю и правую цифры трехзначного числа k.
var c0, c1, c2 : char; n0, k, d : integer; begin writeln('Введите трехзначное число'); readln(k); n0:=ord('0'); d:=k div 100; c2:=chr(n0+d); d:=k mod 100 div 10; c1:=chr(n0+d); d:=k mod 10; c0:=chr(n0+d); writeln('c2= ', c2); writeln('c1= ',c1); writeln('c0= ',c0); end.
Задача 1.23. Используя только литерный ввод, т.е. процедуру
readln(c), где с — литерная переменная, ввести непустую последователь-
ность цифр, перед которой может находиться знак «+» или «–» и за ко-
торой следует пробел, и, получив соответствующее число, присвоить его
целой переменной k.
var c : char; sign, n0, k : integer; begin
{определение знака числа:} sign:=1; readln(c); if c='–' then begin sign:=–1; readln(c) end else if c='+' then readln(c);
{чтение цифр (первая – в c) и вычисление абсолютной величины чис- ла k по схеме Горнера:} n0:=ord('0'); k:=0;

23
repeat k:=10*k+ord(c)–n0; readln(c) until c=' ';
{учет знака:} k:=sign*k; writeln(k); end.
Задача 1.24. Программа. Напечатать заданную непустую строку:
а) удалив из нее все цифры и удвоив знаки «+» и «–»:
var s : string; i : integer; begin writeln('Введите строку:'); readln(s); for i:=1 to length(s) do if (s[i]='+')or(s[i]='–') then write(s[i],s[i]) else if (s[i]<'0')or(s[i]>'9') then write(s[i]); writeln end.
б) удалив из нее все знаки «+», непосредственно за которыми идет
цифра:
var a, b : char; {a – очередная литера строки, b – следующая} s : string; i : integer; begin writeln('Введите строку:'); readln(s); for i:=1 to length(s) do begin a:=s[i]; if a<>'+' then write(a) else if i'9') then write(a) end else write(a); end; writeln end.

24
Варианты
заданий
лабораторной
работы

1
Вариант 1
Задача 1
Определить число, получаемое выписыванием в обратном порядке цифр заданного натурального числа n. Вводите число n как значение типа integer. Например, если n = 1234, то ответ равен 4321. Строки не использовать.
Подсказка. Как получать цифры целого числа, см. учебное пособие В.М. Зюзькова «Программирование», раздел 3.5.
Задача 2
Для заданной строки определить длину содержащейся в ней максимальной подстроки, не имеющей латинских букв.
Вариант 2
Задача 1
Даны целое n>2 и вещественные числа a
1
, b
1
, ..., a n
, b n
(a i
< b i
).
Рассматривая пары a i
и b i
как левые и правые концы отрез- ков на одной и той же прямой, определить концы отрезка, являющегося пересечением всех этих отрезков. Если такого отрезка нет, сообщить об этом. Например, если n = 3 и a
1
= 0, b
1
= 10, a
2
= 1, b
2
= 11, a
3
= –1, b
3
= 5, то результатом будет отрезок [1, 5].
Задача 2
Дана строка S. Создать новые строки из строки S: а) заменить все восклицательные знаки точками; б) заменить каждую точку многоточием (т.е. тремя точка- ми); в) заменить каждую из групп стоящих рядом точек одной точкой; г) заменить каждую из групп стоящих рядом точек много- точием (т.е. тремя точками).
Вариант 3
Задача 1
Не используя стандартные функции, вычислить с точно- стью eps > 0 2
4
n
2n x
x
( 1) x y
cos(x) 1 2!
4!
(2n)!

=
= −
+
− +
+

Считать, что требуемая точность достигнута, если очеред- ное слагаемое по модулю меньше eps; все последующие слагаемые можно уже не учитывать. Вложенные циклы не использовать.
Подсказка: в двух разных переменных храните отдельно числитель и знаменатель очередного слагаемого и на каж-

25
дом шаге вычисляйте новые числитель и знаменатель через предыдущие значения.
Задача 2
В заданную непустую строку входят только цифры и буквы.
Определить, удовлетворяет ли строка следующему свойст- ву: строка содержит (помимо букв) только одну цифру, при- чем ее числовое значение равно длине строки.
Вариант 4
Задача 1
Даны натуральные числа n, m. Получить сумму m послед- них цифр числа n. Число n вводить как величину типа integer, и строки не использовать.
Пример. Пусть n = 12345, m = 3, тогда ответ равен 3 + 4 + 5 =
= 12.
Подсказка. Как получать цифры целого числа, см. учебное пособие В.М. Зюзькова «Программирование», раздел 3.5.
Задача 2
Для каждой цифры '0', '1', ... , '9' подсчитать количество вхождений в данную строку S.
Вариант 5
Задача 1
Определить функцию f(n), значением которой является на- туральное число, получаемое выбрасыванием из записи на- турального числа n первой справа цифры 0 или 5. Напри- мер, f(13510) = 1351, f(1351) = 131. Для данного натурального числа m, примените функцию f последовательно необходи- мое число раз, так чтобы в записи m не осталось цифр 0 и 5.
Подсказка. Как получать цифры целого числа, см. учебное пособие В.М. Зюзькова «Программирование», раздел 3.5.
Задача 2
Составьте программу, в результате выполнения которой в первой заданной строке удваивается каждый символ, при- надлежащий также второй строке.
Вариант 6
Задача 1
Дано натуральное n > 0. Найти произведение первых n про- стых чисел.
Подсказка: используйте булевскую функцию для проверки, является число простым числом или нет.
Задача 2
Из данной строки удалить все цифры и малые латинские буквы.

26
Вариант 7
Задача 1
Даны длины a, b и c сторон некоторого треугольника. Найти медианы треугольника, сторонами которого являются ме- дианы исходного треугольника. Замечание: длина медианы, проведенной к стороне a, равна
0,5 *
2 2
2 2 * b
2 * c a
+

Определите функцию для вычисления медианы и исполь- зуйте ее необходимое число раз.
Задача 2
Ввести две строки S1 и S2, состоящие только из цифр. Оп- ределить, в какой строке сумма цифр большая.
Вариант 8
Задача 1
Дано: натуральное n, действительные a
1
, a
2
,...,a n
. Вычис- лить: a
1
+ a
2
* (a
2
–1) + a
3
* (a
3
–1) * (a
3
– 2) + a
4
* (a
4
– 1) *
* (a
4
– 2) * (a
4
– 3) + ... + a n
* (a n
– 1) * (a n
– 2) *...* (a n
– n +1).
Задача 2
В данной строке найти самую длинную подстроку, состоя- щую из одинаковых символов.
Вариант 9
Задача 1
Пусть n — натуральное число. Обозначим через n!! произ- ведение 1 * 3 * ... * n для нечетного n и 2 * 4 * 6 * ...* n для четного n. Дано натуральное n. Получить n!!.
Задача 2
Дана строка S, и дано натуральное n. Удалить из строки S все группы длиной n подряд стоящих одинаковых симво- лов.
Указание: если ввести строку, например ‘kjhdahhhasaaaaa’, а значение n ввести равное 2, то необходимо получить
‘kjhdahasaaa’.
Вариант 10
Задача 1
Дано n вещественных чисел. Найти порядковый номер того из них, которое наиболее близко к квадрату какого-нибудь целого числа. Например, если n = 10 и вводим числа 110,
90, 80, 30, 50, 40, 40, 30, 22, 60, то ответ равен 3 или 5 (име- ем |80 – 9 2
| = | 50 – 7 2
| = 1).
Подсказка: определите функцию f(k), которая вычисляет абсолютную величину разности k и ближайшего целого квадрата (ближайшим целым квадратом будет (trunc(
k
))
2
или (trunc(
k
) + 1)
2
).

27
Задача 2
Для заданной строки определить длину содержащейся в ней максимальной подстроки, не имеющей латинских букв.
Вариант 11
Задача 1
Вычислить бесконечную сумму с заданной точностью E
(E > 0). i
i 0
( 1)
i!

=


Считать, что требуемая точность достигнута, если вычисле- на сумма нескольких первых слагаемых и очередное сла- гаемое оказалось по модулю меньше, чем Е; это и все по- следующие слагаемые можно уже не учитывать. Вложенные циклы не использовать.
Подсказка: вместо вычисления факториала вычисляйте ве- личину, обратную факториалу, тем самым вы избежите це- лочисленного переполнения (см. учебное пособие В.М. Зюзь- кова «Программирование», раздел 3.6, задача 3).
Задача 2
Дана строка S. Каждую подстроку длиной n > 1, состоящую из одинаковых символов, заменить на подстроку из тех же символов в количестве 2*n штук.
Например, дана строка ‘kjhhsdaaa’. Необходимо получить и вывести на зкран строку: ‘kjhhhhsdaaaaaa’.
Вариант 12
Задача 1
Числа Фибоначчи: F
0
= 0, F
1
= 1, а любое следующее число
Фибоначчи равно сумме двух предыдущих: F
n
= F
n – 1
+ F
n – 2
Известно, что при достаточно больших n справедливо при- ближенное равенство n
n
1 1
5
F
*
2 5


+
=




Определите наименьший номер n, начиная с которого ра- венство выполняется с точностью до заданного eps.
Задача 2
Определить, является ли заданная строка правильной запи- сью вещественного числа (возможно, со знаком, а также с пробелами спереди и/или сзади).
Указание: вещественное число может быть представлено либо в виде числа с фиксированной десятичной точкой (–214.78), либо в виде числа с плавающей десятичной точкой (–
2.1478Е+02).

28
Вариант 13
Задача 1
Рассмотрим последовательность e
1
, e
2
, e
3
,..., образованную по следующему закону e k
= k
1 1
k


+




, k = 1,2,....
Дано действительное eps. Найти первый член e n
этой по- следовательности, для которого |e n
– e n–1
| < eps. (Существо- вание e n
гарантируется одной из теорем математического анализа: чем меньше eps, тем ближе e n
к числу е =
= 2,718281828... .)
Задача 2
В заданном предложении найти пару слов, из которых одно является обращением другого.
Указание: воспользуйтесь массивом строк для хранения слов.
Вариант 14
Задача 1
Даны натуральные n, m. Получить все меньшие n натураль- ные числа, сумма цифр которых равна m.
Подсказка. Как получать цифры целого числа, см. учебное пособие В.М. Зюзькова «Программирование», раздел 3.5.
Задача 2
Проверить, правильно ли в данной строке расставлены круглые скобки (т.е. находится ли справа от каждой откры- вающей скобки соответствующая закрывающая скобка, а слева от каждой закрывающей — соответствующая откры- вающая). Ответ — «да» или «нет».
Используйте следующий алгоритм:
На каждом шаге цикла во время просмотра строки символов текущее значение количества открывающих скобок больше или равно текущему значению количества закрывающих скобок.
После окончания цикла количество открывающих скобок равно количеству закрывающих скобок.
Вариант 15
Задача 1
Пусть дано натуральное число n. Составить программу вычисления n
3
как суммы нечетных чисел исходя из того, что:
1 3
= 1; 2 3
= 3 + 5; 3 3
= 7 + 9 + 11; 4 3
= 13 + 15 + 17 + 19;
5 3
= 21+ 23 + 25 + 27 + 29; …

29
Задача 2
Исключить из данной строки группы символов, располо- женные между скобками ( , ). Сами скобки тоже должны быть исключены.
Указание: предполагается, что внутри каждой пары скобок нет других скобок.
Вариант 16
Задача 1
Вычислить с точностью eps>0 бесконечную сумму
4 4
4 1
1 1
1 3
5 7
+
+
+
+
Считать, что требуемая точность достигнута, если очеред- ное слагаемое по модулю меньше eps; все последующие слагаемые можно уже не учитывать.
Задача 2
Даны две строки S1 и S2. Создать строку, состоящую из символов, входящих либо в S1, либо в S2, но не в обе сразу.
Вариант 17
Задача 1
Вычислить с точностью eps>0 бесконечную сумму
1 1
1 1 3 3 5 5 7
+
+
+



Считать, что требуемая точность достигнута, если очеред- ное слагаемое по модулю меньше eps; все последующие слагаемые можно уже не учитывать.
Задача 2
Даны две строки S1 и S2. Создать строку, состоящую из ла- тинских букв, не принадлежащих какой-либо строке S1 и S2.
Указание: результирующая строка должна содержать те ла- тинские буквы, которых вообще нет ни в строке S1, ни в строке S2.
Вариант 18
Задача 1
Составить программу вычисления значения функции
Z(x) = x
x
1
x
2
x
3
x
100 101
+
+
+
+

30
Задача 2
Для заданных трех строк S1, S2 и S3 напечатать те латин- ские буквы, которые входят только в одну из этих строк.
Указание: например, ввели строки S1 — ‘asfgsas’, S2 —
‘qweasdyu’, S3 — ‘mnbqwef’. Ответом должно служить сле- дующее: ‘Только в первую строку входят буквы — g’,
‘Только во вторую строку входят буквы — dyu’, ‘Только в третью строку входят буквы — mnb’.
Вариант 19
Задача 1
Вводим вещественные числа x
1
, x
2
, … до тех пор, пока не введем отрицательное число (первое число
− неотрицатель- ное). И пусть x
1
, x
2
, …, x n
— члены данной последователь- ности, предшествующие отрицательному числу. Посчитать количество полных квадратов среди чисел x
1
, x
2
, …, x n
Подсказка. Число k является полным квадратом, если вы- полнено равенство k = (trunc(
k
))
2
Задача 2
Для заданных трех строк S1, S2 и S3 определить, какая из них является десятичной записью числа, кратного 3.
Указание: строка может быть любой длины, поэтому пере- водить строку целиком в число не рекомендуется. Вспом- ните и используйте другой метод определения кратности числа 3.
Вариант 20
Задача 1
Даны натуральное число n, действительные числа x
1
, x
2
, …, x
n
. Найти длину наименьшего отрезка числовой оси, содер- жащего все числа x
1
, x
2
, …, x n
Задача 2
Для заданных трех строк S1, S2 и S3 определить, какая из них является палиндромом. Назовем строку палиндромом, если его запись читается одинаково с начала и с конца (как, например, ‘казак’, ‘алла’, ‘fffjjjfff’). Указание: определить булевскую функцию f(s) для проверки, является ли строка s палиндромом. Результатом должен быть ответ «да» или
«нет».

31
0>
1   2   3   4   5

ЛАБОРАТОРНАЯ
РАБОТА

2
Лабораторная работа № 2 посвящена созданию программ с исполь- зованием массивов (одномерных и матриц) и множеств. В этих программах полезно использовать подпрограммы.
Задание состоит из двух задач, требующих написания программ на языке Паскаль. Программы должны быть написаны в рамках структурного программирования. В частности, запрещается использовать операторы пе- рехода и метки.
Примеры
решения
задач
Одномерные массивы
Задача 2.1. Дан массив чисел. Найти, сколько в нем пар одинаковых
соседних элементов.
Переменные: mas — массив чисел; n — размер массива; i — переменная цикла; k — количество одинаковых пар соседних элементов.
Алгоритм решения задачи:
1)
вводим длину массива n, значение элементов массива и устанавли- ваем начальное значение k;
2)
последовательно просматриваем элементы, и если очередной mas[i] равен следующему mas[i+1], то увеличиваем значение k на единицу;
3)
выводим результат. const m=100; var mas : array [1..m] of integer; i, k, n : integer; begin write('Введите размер массива n='); readln(n); k:=0; for i:=1 to n do begin write('Введите элемент массива'); readln(mas[i]); end; for i:=1 to n–1 do

32
if mas[i]=mas[i+1] then k:=k+1; wrietln('Одинаковых пар соседних элементов ',k); end.
Задача 2.2. Программа. Дано 100 целых чисел. Распечатать их в об-
ратном порядке по 6 чисел в строке.
const n=100; d=6; var x : array [1..n] of integer; i, k : integer; begin
{ввод массива:} writeln('Введите массив из ', n,' чисел'); for i:=1 to n do read(x[i]);
{вывод массива по d чисел в строке:} k:=0; {номер числа в строке} for i:=n downto 1 do begin k:=k+1; write(x[i]:4); if k=d then begin k:=0; writeln end end; if k<>0 then writeln end.
Задача 2.3. Сортировка слиянием
const k=50; m=20; n=70; {n=k+m}
var x : array [1..k] of real;
y : array [1..m] of real;
z : array [1..n] of real;
i,p,j : integer;
Элементы каждого из массивов x и y упорядочены по неубыванию. Объе- динить элементы этих двух массивов в один массив z так, чтобы они снова оказались упорядоченными по неубыванию.
const k=50; m=20; n=70; {n=k+m} var x : array [1..k] of real; y : array [1..m] of real; z : array [1..n] of real;

33
i, p, j : integer; begin writeln('Введите массив x'); for i:=1 to k do read(x[i]); writeln; writeln('Введите массив y'); for i:=1 to m do read(y[i]); writeln; writeln('Введенные Вами массивы'); writeln('Массив x'); for i:=1 to k do write(x[i]:7:3); writeln; writeln('Массив y'); for i:=1 to m do write(y[i]:7:3); writeln; p:=1; {индекс очередного элемента из z} i:=1; {из х} j:=1; {из y}
{пока есть нерассмотренные элементы и в x, и в y: } repeat if x[i]k)or(j>m);
{один из массивов x или y исчерпан --> перепись в z оставшихся элементов другого массива:} if i>k {исчерпан массив x:} then repeat z[p]:=y[j]; j:=j+1; p:=p+1 until j>m else repeat z[p]:=x[i]; i:=i+1; p:=p+1 until i>k; writeln('Полученный массив: '); for i:=1 to n do write(z[i]:7:3); end.
Задача 2.4. type shift=1..99;
scale=array [1..100] of real;
Описать процедуру move(s,k), которая преобразует шкалу s, цикли-
чески сдвигая ее элементы на k позиций влево, где k — параметр типа
shift.


34
type shift=1..99; scale=array [1..100] of real; var a:scale; m:shift;n,i:integer; procedure move( var s:scale; k:shift); var i:integer; t:scale; {вспомогательный массив} begin
{t[n–k+1..n]:=s[1..k]:} for i:=1 to k do t[n–k+i]:=s[i];
{t[1..n–k]:=s[k+1..n]:} for i:=k+1 to n do t[i–k]:=s[i]; s:=t end; begin writeln('Введите размер массива'); readln(n); writeln('Введите массив'); for i:=1 to n do read(a[i]); writeln('Введите цикл сдвига <=', n–1); readln(m); writeln('Исходный массив'); for i:=1 to n do write(a[i]:7:2); writeln; move(a,m); writeln('Полученный массив'); for i:=1 to n do write(a[i]:7:2); writeln; end.
Многомерные массивы
Задача 2.5. Дана матрица N
¥
M, состоящая из натуральных чисел.
Выбрать в строках самые левые наименьшие элементы и поставить их в
первый столбец.
Для решения этой задачи нужно сначала найти самый левый мини- мальный элемент в каждой строке и запомнить его местоположение, а за- тем поменять его местами с элементом в первом столбце.
Переменные: a — двумерный массив; n, m — количество строк и столбцов массива; i, j — переменные цикла; jm — столбец минимального элемента для каждой строки; min — текущий минимум.

35
Алгоритм решения задачи:
1)
вводим размеры массива А и значения его элементов;
2)
просматриваем строки массива слева направо, ищем минимальное значение и запоминаем значения индексов;
3)
для каждой строки меняем местами минимальный элемент и эле- мент в первом столбце;
4)
выводим матрицу на экран. const t=100; s=100; var a : array [1..t,1..s] of integer; n, m, jm, i, j, min : integer; begin write('Введите количество строк n='); readln(n); write('Введите количество столбцов m='); readln(m); for i:=1 to n do begin write('Введите через пробел', m,'чисел'); for j:=1 to m do read(a[i,j]); end; for i:=1 to n do begin min:= a[i,1]; jm:=1; for j:=1 to m do if min > a[i,j] then begin jm:=j; min:=a[i,j]; end; a[i,jm]:=a[i,1]; a[i,1]:=min; end; for i:=1 to n do {вывод матрицы на экран в виде таблицы} begin for j:=1 to m do write(a[i,j]:4); writeln; end end.

36
Задача 2.6. Дана квадратная матрица N
×N, состоящая из нату-
ральных чисел. Зеркально отразить ее элементы относительно побочной
диагонали. Вывести результат на экран.
Рассмотрим матрицу 3
×3 и посмотрим, что происходит с элементами при зеркальном отображении:
A11 A12 A13 A33 A23 A13
A21 A22 A23 <-> A32 A22 A12
A31 A32 A33 A31 A21 A11
Если считать, что после преобразования у нас появилась новая мат- рица B, то соответствие между элементами устанавливается следующим образом:
B11 <-> A33
B12 <-> A23
B21 <-> A32
B22 <-> A22 и т.д., т.е. B[I,J] <-> A[L,M]
Внимательно изучив соответствие, можно утверждать, что для эле- ментов матрицы NxM справедлива следующая система уравнений:
I+M = N+1,
J+L = N+1.
Отсюда правило преобразования элементов выглядит следующим образом:
B[I,J] = A[N+1–J,N+1–I].
Переменные: a, b — двумерные массивы; m — количество строк и столбцов массива; i, j — переменные цикла; k — вспомогательная переменная.
Алгоритм решения задачи:
1)
вводим размеры массива A и присваиваем значения его элементам;
2)
присваиваем значения элементам матрицы B по представленным выше формулам и выводим их на экран.
Программа, решающая данную задачу, выглядит так: const n=100; var a,b : array [1..n] of integer; k, m, i, j : integer; begin write('Введите размер матрицы m=');


37
readln(m); writeln('Исходная матрица'); k:=1; for i:=1 to m do for j:=1 to m do begin a[i,j]:=k; k:=k+1; if jЗадача 2.7. Вычислить: а) С = A + B
Создадим две процедуры: tab_in(var a1 : mas) — для ввода элементов массива с клавиатуры.
Параметр а1 — формируемый массив; tab_out(var b1 : mas) — для вывода массива на экран. Параметр b1 — имя выводимого массива. type mas=array [1..40,1..40] of real; vec=array[1..40] of real; var a,b,c : mas; x,y : vec; i, j, n, k : integer; r, s : real; procedure tab_in(var a1 : mas); var i, j : integer; begin for i:=1 to n do for j:=1 to n do read(a1[i,j]); writeln; end;

38
procedure tab_out(var b1 : mas); var i,j:integer; begin for i:=1 to n do begin for j:=1 to n do write(b1[i,j]:7:3); writeln; end; end; begin writeln('Введите размер матрицы'); readln(n); writeln('Введите матрицу A'); tab_in(a); writeln('Введите матрицу B'); tab_in(b); writeln('Матрица A'); tab_out(a); writeln('Матрица B'); tab_out(b); for i:=1 to n do for j:=1 to n do c[i,j]:=a[i,j]+b[i,j]; writeln('Полученная матрица C=A+B'); tab_out(c); end.
б) y = A * x
Основная программа begin writeln('Введите размер матрицы'); readln(n); writeln('Введите матрицу A'); tab_in(a); writeln('Введите вектор x'); for i:=1 to n do read(x[i]); writeln; writeln('Матрица A'); tab_out(a); writeln('Введенный вектор x');

39
for i:=1 to n do write(x[i]:7:2); writeln; for i:=1 to n do begin s:=0; for j:=1 to n do s:=s+A[i,j]*x[j]; y[i]:=s end; writeln('Полученный вектор y=A*x'); for i:=1 to n do write (y[i]:7:3); writeln; end.
в) С = A * B
Основная программа begin writeln('Введите размер матрицы'); readln(n); writeln('Введите матрицу A'); tab_in(a); writeln('Введите матрицу B'); tab_in(b); writeln('Матрица A'); tab_out(a); writeln('Матрица B'); tab_out(b); for i:=1 to n do for j:=1 to n do begin s:=0; for k:=1 to n do s:=s+a[i,k]*b[k,j]; c[i,j]:=s; end; writeln('Полученная матрица C=A+B'); tab_out(c); end.

40
г) транспонированную матрицу B
Основная программа begin writeln('Введите размер матрицы'); readln(n); writeln('Введите матрицу B'); tab_in(b); writeln('Матрица B'); tab_out(b); for i:=1 to n–1 do for j:=i+1 to n do begin r:=b[i,j]; b[i,j]:=b[j,i]; b[j,i]:=r; end; writeln; writeln('Полученная транспонированная матрица B'); tab_out(b); end.
Множества
Задача 2.8. type str=string[100];
Описать функцию count(s), подсчитывающую общее количество
цифр и знаков '+', '–' и '*', входящих в строку s.
Переменные: а) в функции count: s — строка (формальный параметр); i — счетчик цикла (локальная переменная); k — общее количество цифр и знаков ‘+’, ‘*’, ‘–‘ в заданной строке
(локальная переменная); б) в основной программе: s1 — введенная строка (локальная переменная); k1 — общее количество цифр и знаков ‘+’, ‘*’, ‘–‘ в заданной строке s1 (фактический параметр).
Алгоритм решения задачи:
1)
создаем функцию count, подсчитывающую общее количество цифр и знаков ‘+’, ‘*’, ‘–‘ в заданной строке;
2)
вводим строку s1;
3)
вызываем функцию count и выводим значение счетчика k1 на экран;
4)
завершаем работу программы.