Информатика. Практикум
.pdf
2. ЗАДАЧИ ПОВЫШЕННОЙ СЛОЖНОСТИ ПО СОСТАВЛЕНИЮ АЛГОРИТМОВ И ПРОГРАММ
2.1. Задачи с элементами теории множеств
Задача 2.1. Разработать схему алгоритма и программу для определения количества точек (x, y), удовлетворяющих системе неравенств
3x 4 y 41,5;
5x y 1,2;
xy x y.
Все используемые точки (x, y) должны удовлетворять множеству, определяемому по правилам x = 1; 20 (0,1), y = 0; 10 (0,2). Число комбинаций точек вывести на экран.
Решение задачи
При решении задачи следует использовать табуляцию функции (п. 1.4). Схема алгоритма решения задачи представлена на рис. 2.1.
Обозначение схемы алгоритма
Count – число точек, удовлетворяющих системе неравенств.
Программа
Program Task2_1;
Var
X, Y : Real; Count : Integer;
Begin {начало раздела операторов программы} Count := 0; X:=1; {начальные значения переменных Count, X}
While X <= 20 do
Begin {начало цикла 1 - для перебора значений Х} Y:=0; {начальное значение переменной Y}
While Y <= 10 do
Begin {начало цикла 2 - для перебора значений Y} {если X, Y удовлетворяют условию, Count увеличивается на 1}
If (3*X+4*Y < 41.5) and (5*X-Y > 1.2) and (X*Y > X+Y)
61
|
Then Count:=Count + 1; |
Y:= Y + 0.2; |
{приращение переменной Y} |
end; |
{конец цикла 2} |
X:= X + 0.1; |
{приращение переменной X} |
end; |
{конец цикла 1} |
{вывод результата на экран}
Writeln('Число комбинаций точек (x, y) равно ', Count);
Readln; |
{ожидание нажатия клавиши Enter} |
End. |
{конец программы} |
1 |
Начало |
|
|
2 |
|
|
|
|
Count=0 |
|
|
|
X=1 |
|
|
3 |
X<20 |
нет |
|
|
|
||
4 |
да |
|
|
|
|
||
|
Y=0 |
|
|
5 |
Y<10 |
нет |
|
|
|
||
6 |
да |
3x+4y<41.5 |
|
|
|||
да |
Условие |
||
5x-y>1.2 |
|||
7 |
|||
верно? |
xy>x+y |
||
Count= |
нет |
|
|
=Count+1 |
|
|
|
8 |
|
|
|
|
Y=Y+0.2 |
|
|
9 |
|
|
|
|
X=X+0.1 |
|
|
10 |
Вывод |
|
|
|
|
||
|
Count |
|
|
11 |
Конец |
|
|
|
|
||
|
Рис. 2.1 |
|
62
Результат работы программы
Число комбинаций точек (x, y) равно 2108
Задача 2.2. Разработать схему алгоритма и программу вычисления и вывода на экран общего количества точек (x, y) Q, принадлежащих одновременно двум окружностям, заданным системой неравенств
|
(x a )2 |
( y b )2 |
R2; |
||
Q |
|
1 |
|
1 |
1 |
(x a |
|
)2 |
( y b )2 |
R2. |
|
|
|
||||
|
2 |
|
2 |
2 |
|
Q
R1 |
|
R2 |
|
(a1; b1) |
(a2; b2) |
|
|
Аргументы х и y изменяются по законам x = 0; 200 (0,1), y = 0; 300 (0,2). С клавиатуры вводятся координаты центров кругов (a1, b1) и (a2, b2) и значения радиусов R1, R2.
Решение задачи
Схема алгоритма решения задачи представлена на рис. 2.2.
Обозначение схемы алгоритма
Count – количество точек (x, y), принадлежащих первому и второму кругу.
Программа
Program Task2_2;
Uses Crt;
63
Var
a1, a2, b1, b2, R1, R2, x, y : Real;
Count : Word; |
|
Begin |
{начало раздела операторов программы} |
ClrScr; |
{очистка экрана} |
{ввод данных} |
|
Write('Введите координаты центров кругов a1,a2,b1,b2: '); Readln(a1, a2, b1, b2);
Write('Введите радиусы кругов R1, R2: '); Readln(R1, R2);
{расчет}
x:= 0; Count:= 0; {первоначальные значения переменных х, Count}
While x <= 200 do
Begin |
{начало цикла 1 – для перебора значений х} |
y:= 0; |
{первоначальное значение y} |
While y <= 300 do |
|
Begin |
{начало цикла 2 – для перебора значений y} |
{проверка условия принадлежности точки (x, y) кругам}
If ((x-a1)*(x-a1) + (y-b1)*(y-b1) <= R1*R1) and ((x-a2)*(x-a2) + (y-b2)*(y-b2) <= R2*R2)
|
|
|
Then Count:=Count+1; |
y:= y + 0.2; |
{приращение |
переменой y} |
|
end; |
{конец |
цикла 2} |
|
x:= x + 0.1; |
{приращение |
переменой x} |
|
end; |
{конец |
цикла 1} |
|
{вывод результата на экран}
Write('Число точек, принадлежащих двум кругам = ', Count);
Readln; |
{ожидание нажатия клавиши Enter} |
End. |
{конец программы} |
|
Результат работы программы |
Введите координаты центров кругов a1, a2, b1, b2: 1 2 3 4 Введите радиусы кругов R1, R2: 10 20
Число точек, принадлежащих двум кругам = 6130
64
|
1 |
Начало |
|
|
|
|
2 |
Ввод |
|
|
|
|
|
a1,a2,b1, |
|
|
|
|
|
b2,R1,R2 |
|
|
|
|
3 |
|
|
|
|
|
|
x=0 |
|
|
|
|
|
Count=0 |
|
|
|
|
4 |
x<200 |
нет |
|
|
|
|
|
|||
|
|
|
|
||
|
5 |
|
да |
|
|
|
|
y=0 |
|
|
|
|
6 |
y<300 |
нет |
|
|
|
|
|
|||
|
|
|
|
||
|
7 |
|
да |
|
|
да |
(x,y) |
Q |
|
(x-a1)2+(y-b1)2<R12 и |
|
8 |
|
|
(x-a2)2+(y-b2)2<R22 |
||
Count= |
|
|
нет |
|
|
=Count+1 |
|
|
|
|
|
|
9 |
|
|
|
|
|
|
y=y+0.2 |
|
|
|
|
10 |
|
|
|
|
|
|
x=x+0.1 |
|
|
|
|
11 |
Вывод |
|
|
|
|
|
|
|
||
|
|
Count |
|
|
|
|
12 |
Конец |
|
|
|
|
|
|
|
||
|
|
|
Рис. 2.2 |
|
|
65
2.2. Задачи табуляции функций нескольких переменных
Задача 2.3. Разработать схемы алгоритмов и программы табуляции функции z = x2 + y3, в которой переменные x, y изменяются в различных математических формах.
а) Переменные x, y изменяются следующим образом:
x = xn; xk (h1),
y = yn; yk (h2),
где xn, yn – начальные значения переменных x, y; xk, yk – конечные значения переменных x, y; h1, h2 – шаги изменения переменных x, y.
Значения xn, yn, xk, yk, h1, h2 ввести с клавиатуры. Значения x, y, z вывести на экран.
б) Переменные x, y заданы в виде массивов размерами n1 и n2 элементов. Размеры и значения массивов ввести с клавиатуры. Значения функции z представить в виде массива. На экран вывести значения x, y, z.
в) Переменные x, y заданы смешанными законами, а именно, x – одномерный массив размером n, а переменная y изменяется с заданным шагом y = yn; yk (h), где yn, yk – начальное и конечное значения переменной y; h – шаг изменения переменной y. Значения yn, yk, h, а также значения элементов и размер массива x ввести с клавиатуры. При написании программы использовать оператор for. Значения x, y, z вывести на экран в виде таблицы.
Решение задачи
Схемы алгоритмов решений подзадач 2.3, а, 2.3, б, 2.3, в представлены соответственно на рис. 2.3, а–в.
66
1 |
Начало |
|
|
|
|
2 |
Ввод |
|
|
Xn,Yn,Xk, |
|
|
Yk,h1,h2 |
|
3 |
|
|
|
X=Xn |
|
4 |
X<Xk |
нет |
|
|
|
5 |
да |
|
|
Y=Yn |
|
6 |
Y<Yk |
нет |
|
||
|
|
|
7 |
да |
|
|
Z=X2+Y3 |
|
8 |
Вывод |
|
|
|
|
|
X, Y, Z |
|
9 |
|
|
|
Y=Y+h2 |
|
10 |
|
|
|
X=X+h1 |
|
11 |
Конец |
|
|
|
|
|
а |
|
1 |
Начало |
|
1 |
Начало |
|
2 |
|
|
|
||
Ввод |
|
2 |
Ввод |
|
|
|
|
|
|||
|
N1 |
|
|
|
|
3 |
|
|
N |
|
|
A |
|
3 |
A |
|
|
|
|
|
|
||
|
I=1, N1 |
Ввод |
4 |
I=1, N |
Ввод |
4 |
|
|
|||
Ввод |
массива Х |
Ввод |
массива Х |
||
|
|
|
|
||
|
X[I] |
|
|
X[I] |
|
|
|
5 |
|
|
|
5 |
|
|
|
|
|
|
|
|
A |
|
|
|
A |
|
|
|
|
|
|
|
|
|
|
6 |
|
|
6 |
Ввод |
|
Ввод |
|
|
Yn, |
Вычисление |
|
|
|
|
Yk, h |
||
|
N2 |
|
7 JMax= (Yk- |
числа итера- |
|
7 |
|
|
|||
B |
|
|
-Yn)/h + 1 |
ций для цикла |
|
|
|
|
перебора пе- |
||
8 |
J=1,N2 |
Ввод |
8 |
B |
ременной Y |
|
массива Y |
|
|
||
Ввод |
|
J=1,JMax |
|
||
|
|
9 |
|
|
|
|
Y[J] |
|
Y[J]=Yn+ |
Формирование |
|
9 |
B |
|
10 |
+(J-1)h |
массива Y |
|
|
|
|
||
10 |
|
|
|
B |
|
K=0 |
|
|
|
|
|
|
|
11 |
K=0 |
|
|
11 |
|
|
|
|
|
C |
|
12 |
|
|
|
|
|
C |
|
||
|
I=1, N1 |
|
|
||
|
|
|
|
||
12 |
D |
|
|
I=1, N |
|
|
13 |
|
|
||
|
|
D |
|
||
13 |
J=1,N2 |
|
|
|
|
K=K+1 |
|
14 |
J=1,JMax |
|
|
|
Вычисление |
K=K+12 |
Вычисление |
||
|
Z[K]=X[I]2+ |
|
|||
|
3 |
массива Z |
|
Z[K]=X[I] + |
массива Z |
14 |
Y[J] |
|
Y[J]3 |
||
Вывод |
|
15 |
Вывод |
|
|
|
X[I], |
|
|
|
|
|
|
|
X[I],Y[J], |
|
|
|
Y[J],Z[K] |
|
|
|
|
|
|
|
Z[K] |
|
|
15 |
|
|
16 |
|
|
|
|
|
|
||
|
D |
|
|
D |
|
16 |
|
|
17 |
|
|
|
|
|
C |
|
|
|
C |
|
|
|
|
|
|
|
|
|
|
17 |
|
|
18 |
Конец |
|
Конец |
|
|
|
||
|
|
|
|
|
|
|
|
б |
|
|
в |
|
Рис. 2.3 |
|
|
|
|
Обозначения схем алгоритмов |
|
|
|||
K – дополнительная переменная для индексирования результирующего массива Z;
X[I] – xi элемент массива X; Y[J] – yj элемент массива Y; Z[K] – zk элемент массива Z;
67
JMax – число итераций для цикла, в котором производится перебор значений переменной Y.
Программа для решения подзадачи 2.3, а
Program Task2_3a;
Var
Xn, Yn, Xk, Yk, h1, h2 : Real;
X, Y, Z |
: Real; |
Begin |
|
{ввод значений для перебора переменных X и Y}
Write('Введите начальные значения переменных X и Y: '); Readln(Xn, Yn);
Write('Введите конечные значения переменных X и Y: ');
Readln(Xk, Yk);
Write('Введите шаги изменения переменных X и Y: ');
Readln(h1, h2); |
|
|
|
{расчет} |
|
|
|
X:= Xn; |
|
{начальное значение переменной Х} |
|
While X <= Xk do |
|
|
|
Begin |
{начало цикла 1 - для перебора значений Х} |
||
Y:= Yn; |
|
{начальное значение переменной Y} |
|
While Y <= Yk do |
|
||
Begin |
{начало цикла 2 - для перебора значений Y} |
||
Z:= X*X + Y*Y*Y; |
{вычисление Z} |
||
{вывод результатов} |
|
||
Writeln('X = ', X:4:2, ' Y = ', Y:4:2, ' Z = ', Z:7:3); |
|||
Y:= Y + h2; |
{приращение переменной Y} |
||
end; |
|
{конец цикла 2} |
|
X:= X + h1; |
{приращение переменной Х} |
||
end; |
|
{конец цикла 1} |
|
Readln; |
|
{ожидание нажатия клавиши Enter} |
|
End. |
|
{конец программы} |
|
Результат работы программы
Введите начальные значения переменных X и Y: 1 3 Введите конечные значения переменных X и Y: 5 4
Введите шаги |
изменения |
переменных X и Y : 2 0.5 |
||
X = 1.00 Y = |
3.00 Z = |
28.000 |
||
X = 1.00 Y = |
3.50 Z = |
43.875 |
||
X = 1.00 |
Y = |
4.00 |
Z = |
65.000 |
X = 3.00 |
Y = |
3.00 |
Z = |
36.000 |
X = 3.00 |
Y = |
3.50 |
Z = |
51.875 |
X = 3.00 |
Y = |
4.00 |
Z = |
73.000 |
68
X = 5.00 |
Y = 3.00 |
Z = |
52.000 |
|||
X = |
5.00 |
Y |
= |
3.50 |
Z = |
67.875 |
X = |
5.00 |
Y |
= |
4.00 |
Z = |
89.000 |
Программа для решения подзадачи 2.3, б
Program Task2_3b;
Var
X, Y : Array [1..20] of Real;
Z : Array [1..400] of Real; N1, N2, I, J, K :Integer;
Begin {начало раздела операторов программы} {ввод значений}
Write('Введите размер массива X (<=20): '); Readln(N1); Write('Введите значения массива X: ');
for I := 1 to N1 do Read(X[I]); {ввод массива Х} Write('Введите размер массива Y (<=20): '); Readln(N2);
Write('Введите значения массива Y: ');
for J := 1 to N2 do Read(Y[J]); {ввод массива Y}
{расчет}
K:=0; {первоначальное значение индекса массива Z} for I:=1 to N1 do {цикл 1 – для перебора значений Х} for J:=1 to N2 do{цикл 2 – для перебора значений Y}
begin {начало циклов 1, 2}
K:= K + 1; {увеличение индекса массива Z на 1}
Z[K]:=X[I]*X[I] + Y[J]*Y[J]*Y[J]; {вычисление функции Z}
{вывод результатов на экран}
Writeln('X = ',X[I]:4:2,' Y = ',Y[J]:4:2,' Z = ',Z[K]:6:2);
end; |
{конец |
цикла 2, конец цикла 1} |
End. |
{конец |
программы} |
Результат работы программы
Введите размер массива |
X (число <=20): 3 |
|||
Введите значения массива X: 1 3 5 |
||||
Введите размер массива |
Y (число <=20): 3 |
|||
Введите значения массива Y: 3 3.5 4 |
||||
X = 1.00 Y |
= 3.00 Z = |
28.00 |
||
X = 1.00 Y |
= 3.50 Z = |
43.87 |
||
X = 1.00 Y |
= 4.00 Z = |
65.00 |
||
X = 3.00 Y |
= 3.00 Z = |
36.00 |
||
X = 3.00 Y |
= 3.50 Z = |
51.88 |
||
X = 3.00 |
Y |
= 4.00 |
Z = |
73.00 |
X = 5.00 |
Y |
= 3.00 |
Z = |
52.00 |
X = 5.00 |
Y |
= 3.50 |
Z = |
67.87 |
X = 5.00 |
Y |
= 4.00 |
Z = |
89.00 |
69
Программа для решения подзадачи 2.3, в
Program Task2_3c; |
|
Var |
|
Yn, Yk, h, Y, Z |
: Real; |
N, I, J, JMax, K |
: Integer; |
X : Array [1..100] of Real; |
|
Begin |
{начало раздела операторов программы} |
{ввод значений}
Write('Введите размер массива X (<=100): '); Readln(N); Write('Введите значения элементов массива X: ');
for I:=1 to N do Read(X[I]);{ввод значений элементов массива Х}
Write('Введите начальное, конечное значения и шаг изменения Y: ');
Readln(Yn, Yk, h);
{расчет}
JMax:= Trunc((Yk - Yn)/h + 1); {число итераций для цикла 2}
K:=0; |
|
|
{вывод названий столбцов на экран} |
|
|
Writeln('|------------------------------ |
|
|'); |
Writeln('|Номер| X | |
Y | Z |
|'); |
Writeln('|------------------------------ |
|
|'); |
for I:=1 to N do {начало цикла 1–для перебора значений Х}
for J:=1 to JMax do |
|
|
|
|
Begin |
{начало цикла 2- для перебора значений Y} |
|||
K:= K + 1; |
|
|
|
|
Y:= Yn + (J-1)*h; |
{вычисление |
переменной |
Y} |
|
Z:= X[I]*X[I] + Y*Y*Y; |
{вычисление |
функции Z} |
|
|
{вывод результатов на экран}
Writeln('|', K:4,' |',X[I]:6:2,' |',Y:6:2,' |',Z:7:2,' |');
end; |
{конец цикла 1, конец цикла 2} |
Writeln('| |
------------------------------|'); |
Readln; |
{ожидание нажатия клавиши Enter} |
End. |
{конец программы} |
Результат работы программы
Введите |
размер массива X (<=100): 3 |
|||||||
Введите |
значения |
элементов массива X: 1 3 5 |
||||||
Введите начальное, конечное значения и шаг изменения Y: 3 4 0.5 |
||||||||
| |
------------------------------ |
|
|
|
|
|
|
| |
|Номер| |
X |
| |
Y |
| |
Z |
| |
||
|------------------------------ |
|
|
|
|
|
|
|
| |
| |
1 |
| |
1.00 |
| |
3.00 |
| |
28.00 |
| |
| |
2 |
| |
1.00 |
| |
3.50 |
| |
43.87 |
| |
| |
3 |
| |
1.00 |
| |
4.00 |
| |
65.00 |
| |
| |
4 |
| |
3.00 |
| |
3.00 |
| |
36.00 |
| |
70
