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

Информатика. Практикум

.pdf
Скачиваний:
1
Добавлен:
24.11.2025
Размер:
5.18 Mб
Скачать

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