Циклы. Сочетания цикла и разветвления

РАЗВЕТВЛЕНИЯ

 

Независимость программы от данных часто требует в зависимости от конкретного набора данных ( или промежуточных результатов) выбирать один из двух или более различных вариантов, вычислительного процесса, т.е. осуществлять разветвление вычислительного процесса. В языке PASCAL для таких случаев предусмотрены условный оператор, оператор выбора варианта и оператор перехода.

Условный оператор может принимать одну из двух конструкций:

IF B THEN S1 ELSE S2

IF B THEN S1

где B - логическое выражение, а S1, S2 - операторы. Эти операторы могут быть простыми или составными (т.е. сгруппированными вместе при помощи операторных скобок Begin End).

В первом варианте если логическое выражение истинно, то выполняется оператор S1, если логическое выражение ложно, то выполняется оператор S2.

 

Пример. Вычислить A=k+40, если 15<k<25. При всех других значениях k A=20k.

Условный оператор имеет вид

If (k>15) and (k<25) then A:=K+40 else A:=20*k

Другой вариант решения этой же задачи предполагает использование краткой формы условного оператора

A:=20*k

If (k>15) and (k<25) then A:=K+40

Оператор выбора варианта используется в тех случаях, когда в зависимости от значения какого-либо выражения необходимо выполнить один из нескольких операторов. Этот оператор имеет вид:

Case (селектор) OF

(список констант 1 ) : (Оператор 1);

(список констант 2 ) : (Оператор 2);

. . . . .

(список констант N ) : (Оператор N);

End;

 

Если значение селектора равно одной из констант, то выполняется оператор помеченный этой константой.

 

Пример. Пусть k - переменная целого типа.

Case k of

1 : A:=Sin(x);

2, 3 : A:=Sin(x)+2;

4..10, 15 : A:=Cos(x)+Sin(x);

End;

 

Если требуется нарушить естественный порядок выполнения операторов можно воспользоваться оператором безусловного перехода, имеющим вид

GOTO (Метка)

Метка является числом или идентификатором, описанным в разделе описания меток, например

Label 10, 20, Lab1, Metka;

 

Целью данной работы является получение практических навыков использования условных операторов и операторов выбора.

 

ЗАДАНИЕ. Напишите программу решения задачи, с использованием операторов организующих разветвления.

 

ВАРИАНТЫ ЗАДАНИЙ.

 

1. Если сумма трех попарно различных чисел x, y, z меньше 10, то наименьшее из этих трех чисел заменить полусуммой двух других, в противном случае заменить меньшее из x и y полусуммой двух оставшихся значений.

 

 

2. Для заданного числа a найти корень уравнения f(x)=0, где

 

3. Дано число x. Напечатать в порядке возрастания Ln(x), 1+|x|, (1+x2)x.

 

4. Даны числа A1, B1, C1, A2, B2, C2. Напечатать координаты точки пересечения прямых, описываемых уравнениями

A1*X + B1*Y + C1 = 0

A2*X + B2*Y + C2 = 0

либо сообщить, что эти прямые совпадают, не пересекаются либо вообще не существуют.

 

 

5. Даны произвольные числа a, b, c. Если нельзя построить треугольник с такими длинами сторон, то сообщить об этом, в противном случае сообщить является ли треугольник равносторонним, равнобедренным или треугольником общего вида.

 

6. Даны действительные числа x,y. Определить принадлежит ли точка с координатами (x,y) заштрихованной части плоскости рис.1, б.

 

7. Даны действительные числа x,y. Определить принадлежит ли точка с координатами (x,y) заштрихованной части плоскости рис.1, в.

 

8. Даны действительные числа x,y. Определить принадлежит ли точка с координатами (x,y) заштрихованной части плоскости рис.1, д.

 

9. Даны действительные числа x,y. Определить принадлежит ли точка с координатами (x,y) заштрихованной части плоскости рис.1, е.

 

10. Даны действительные числа x,y. Определить принадлежит ли точка с координатами (x,y) заштрихованной части плоскости рис.1, ж.

 

11. Даны действительные числа x,y. Определить принадлежит ли точка с координатами (x,y) заштрихованной части плоскости рис.1, з.

 

12. Даны действительные числа . Определить принадлежит ли точка с координатами (x,y) заштрихованной части плоскости рис.1, и.

 

13. Даны действительные числа x,y. Определить принадлежит ли точка с координатами (x,y) заштрихованной части плоскости рис.1, к.

 

14. Пусть D-заштрихованная часть плоскости (рис 2. а) и пусть U определяется по x,y следующим образом (запись (x,yD означает, что точка с координатами x,y принадлежит D)

 

Даны действительные числа x,y. Определить U.

 

15. Пусть D-заштрихованная часть плоскости (рис 2. б) и пусть U определяется по x,y следующим образом (запись (x,yD означает, что точка с координатами х,у принадлежит D)

Даны действительные числа х,у. Определить U.

 

16. Пусть D-заштрихованная часть плоскости (рис 2. в) и пусть U определяется по x,y следующим образом (запись (x,yD означает, что точка с координатами х,у принадлежит D)

Даны действительные числа х,у. Определить U.

 

17. Пусть D-заштрихованная часть плоскости (рис 2. г) и пусть U определяется по x,y следующим образом (запись (x,yD означает, что точка с координатами х,у принадлежит D)

Даны действительные числа х,у. Определить U.

 

 

18. Пусть D-заштрихованная часть плоскости (рис 2. д) и пусть U определяется по x,y следующим образом (запись (x,yD означает, что точка с координатами х,у принадлежит D)

Даны действительные числа х,у. Определить U.

 

19. Пусть D-заштрихованная часть плоскости (рис 2. е) и пусть U определяется по x,y следующим образом (запись (x,yD означает, что точка с координатами х,у принадлежит D)

Даны действительные числа х,у. Определить U.

 

20. Известно, что астрологи делят год на 12 периодов и каждому из них ставят в соответствие один из знаков Зодиака.

20.01 - 18.02 - Водолей 23.07 - 22.08 - Лев

19.02 - 20.03 - Рыбы 23.08 - 22.09 - Дева

21.03 - 19.04 - Овен 23.09 - 22.10 - Весы

20.04 - 20.05 - Телец 23.10 - 22.11 - Скорпион

21.05 - 21.06 - Близнецы 23.11 - 21.12 - Стрелец

22.06 - 22.07 - Рак 22.12 - 19.01 - Козерог

Напишите программу, которая вводит дату некоторого дня года и печатает название соответствующего знака Зодиака.


рис 1.

 

рис 2.


Работа N 2.

Циклы. Сочетания цикла и разветвления.

При решении многих задач вычислительный процесс может иметь циклический характер. Это означает, что часть операторов многократно выполняется при различных значениях переменных. В языке PASCAL имеется три вида операторов цикла: оператор с предварительным условием (While), оператор с последующим условием (Repeat), оператор цикла с параметром (For).

Операторы для записи циклов являются сложными, так как в их состав входят другие операторы.

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

Форма записи оператора цикла с предусловием:

 

While <логическое выражение> do

begin

<операторы циклической части>

end;

 

Например, найти наименьшее положительное число для данной ЭВМ.

Program MinEps;

var Eps, Eps_Min: real;

begin

Eps:=1;

While Eps>0 do {Заголовок оператора цикла}

begin

Eps_Min:=Eps; {Тело оператора цикла }

Eps:=Eps/2;

end;

writeln('Eps_Min=', Eps_Min);

end.

Форма записи оператора цикла с постусловием:

 

Repeat

< операторы циклической части>

Until < логическое выражение >

 

Например, найти наименьшее положительное число для данной ЭВМ.

Program MinEps;

var Eps_Min: real;

begin

Eps_Min:=1;

Repeat {Заголовок оператора цикла}

Eps_Min:=Eps_Min/2; {Тело оператора цикла }

Until Min_Eps/2=0;

writeln('Eps_Min=', Eps_Min);

end.

 

Оператор цикла с параметром используется в тех случаях, когда известно заранее число повторений. Существует два варианта оператора:

1) используется при изменении переменной цикла i по возрастанию

 

For i:=m1 to m2 do

begin

<операторы циклической части>

end;

 

2) используется при изменении переменной цикла i по убыванию

 

For i:=m1 Downto m2 do

begin

<операторы циклической части>

end;

 

Например, вычислить сумму первых 10 натуральных чисел

Program Sum10;

var i, Sum :integer;

begin

Sum:=0;

For i:=1 to 10 do

Sum:=Sum+i;

writeln('Сумма=', Sum);

end.

 

Замечание. Если циклическая часть оператора цикла состоит из одного оператора, операторные скобки Begin - End можно не использовать.

 

Целью данной работы является получение практических навыков использования операторов цикла.

 

ЗАДАНИЕ. Напишите программу решения задачи, с использованием операторов организующих циклические вычисления.

 

ВАРИАНТЫ ЗАДАНИЙ.

1. Дано натуральное число N. Вычислить

1/sin(1)+1/(sin(1)+sin(2))+...+1/(sin(1)+sin(2)+...+sin(N))

 

2. Дано натуральное число n. Вычислить

 

 

3. Дано натуральное число n. Вычислить an.

 

4. Дано натуральное число n. Вычислить

a (a+1) ... (a+n-1)

 

5. Дано натуральное число n, действительное x. Вычислить

sin(x) + sin2 (x) + ... + sinn (x)

 

6. Дано натуральное число N. Сколько цифр в числе n.

 

7. Дано натуральное число N. Вычислить сумму его цифр.

 

8. Пусть a0=1; ak=kak-1+1/k, k=1,2,…

Дано натуральное число n. Получить an.

 

Вычислить бесконечную сумму с заданной точностью e (e>0). Считать, что требуемая точность достигнута, если вычислена сумма нескольких первых слагаемых и очередное слагаемое оказалось по модулю меньше, чем e, - это и все последующие слагаемые можно не учитывать.

 

9. Вычислить:

 

10. Вычислить:

 

11. Вычислить:

 

12. Вычислить:

 

13. Вычислить

14. Дано натуральное число n. Получить все натуральные числа, меньшие n и взаимно простые с ним.

 

15. Дано натуральное число n. Получить все простые делители этого числа.

 

16. Найти натуральное число от 1 до 10000 с максимальной суммой делителей.

 

17. Найти первые 100 простых чисел.

 

18. Натуральное число называется совершенным, если оно равно сумме всех своих делителей, за исключением себя самого. Число 6 - совершенное, так как 6=1+2+3. Число 8 - не совершенное, так как 8¹1+2+4. Дано натуральное n. Получить все совершенные числа, меньшие n.

 

20. Напечатать в возрастающем порядке все трехзначные числа, в десятичной записи которых нет одинаковых цифр.

 

 


Работа N 3.

Обработка массивов.

 

Массивом называется упорядоченная последовательность величин, обозначаемая одним именем. Все элементы массива имеют один и тот же тип. В программе массив должен быть описан либо в разделе описаний переменных, либо в разделе описаний типов. Форма описания имеет вид:

Type T1 = array [1..100] of integer;

T2 = array [1..5] of char;

Var A :T1; {описан массив с именем A}

B :T2; {описан массив с именем B}

C : array [1..25] of real; {описан массив с именем C }

Возможно использование многомерных массивов, т.е. массивов. Двумерные массивы еще называют матрицами. Описание многомерных массивов может иметь вид:

Type T1 = array [1..6, 1..4] of integer;

Var A :T1; {описана матрица с именем A размера 6*4}

B : array [1..5, 1..4] of real {описана матрица B размера 5*4}

Рассмотрим некоторые простейшие алгоритмы обработки массивов:

ВВОД-ВЫВОД МАССИВОВ.

Операции ввода-вывода массивов обычно используют циклы. В приведенном ниже примере описан процесс ввода одномерного массива и вывод его в виде столбца.

 

Program Example1;

uses Crt;

const n=5;

var A : array [1..n] of integer;

i : integer;

begin

ClrScr;

{Ввод элементов массива с помощью Read}

writeln(' Введите элементы массива ');

For i:=1 to n do

begin

Write( 'A[',i,']='); Readln(a[i]);

end;

{Вывод элементов массива}

Writeln( ' Массив A');

For i:=1 to n do writeln(a[i]:5);

readln;

end.

 

 

ПОИСК МИНИМАЛЬНОГО В МАССИВЕ.

Для одномерного массива найти минимальный элемент и определить его номер. Ниже приводится фрагмент программы поиска

Max:=A[1]; IndexMax:=1;

For i:=2 to n do

If Max<A[i] then

begin

Max:=A[i]; IndexMax:=i;

end;

Результат работы содержится в переменных:

Max - наибольший элемент массива,

IndexMax - номер этого элемента в массиве.

 

Ниже приводятся задания, целью которых является овладение практическими навыками работы с массивами.

 

ЗАДАНИЯ.

1. Даны действительные числа A[1900], A[1901]...A[1950] - количество осадков в мм, выпавших в Симферополе в течении первых 50 лет. Надо вычислить среднее количество осадков и отклонение от среднего для каждого года.

 

2. Даны действительные числа A1,A2,A3,... A2n. Получить:

A1,An+1,A2,An+2,...,An, A2n.

 

3. Даны действительные числа A1,A2,A3,... A2n. Получить:

A1,A2n,A2,A2n-1,...,An, An+1.

 

4. Даны действительные числа A1,A2,A3,... A2n. Получить:

A1+A2n,A2+A2n-1,...,An+An+1.

 

5. Даны действительные числа A1, A2, A3,...,An . Если в результате замены отрицательных членов последовательности их квадратами члены будут организовывать неубывающую последовательность, то получить сумму членов исходной последовательности; в противном случае получить их произведение.

 

6. Даны действительные числа A1, A2, A3,..., An. Получить новую последовательность, выбросив из исходной все члены со значением max(A1, A2, A3,..., An).

 

7. Даны действительные числа A1, A2, A3,..., An. Все члены последовательности с четными номерами, предшествующие первому по порядку члену со значением Max(A1, A2, A3,..., An) умножить на Max(A1, A2, A3,..., An).

 

8. Даны целые числа A1, A2, A3,..., An, каждое из которых отлично от нуля. Поменять местами наибольший член последовательности и член с номером M.

 

9. Даны целые числа A1, A2, A3,..., An. Если в данной последовательности ни одно четное число не расположено после нечетного, то получить все отрицательные числа последовательности, иначе - все положительные. Порядок следования чисел в обоих случаях заменяется на обратный.

 

10. Даны целые числа A1, A2, A3,..., An. Наименьший член последовательности заменить целой частью среднего арифметического всех членов последовательности, остальные члены оставить без изменения. Если в последовательности несколько членов со значением Min(A1, A2, A3,..., An), то заменить последний по порядку.

 

11. Даны целые числа A1, A2, A3,..., An, каждое из которых является либо 0, либо 1, либо 2. Переставить числа так, чтобы сначала шли только 0, затем только 1, затем только 2.

 

12. Элементы массива Х преобразовать по следующему правилу (воспользоваться массивом У, как вспомогательным): все отрицательные элементы массива Х перенести в его начало, а все остальные - в конец, сохраняя исходное взаимное расположение как среди отрицательных, так и среди всех остальных элементов.

 

13. Элементы массива Х преобразовать по следующему правилу (воспользоваться массивом У, как вспомогательным): все элементы массива Х циклически сдвинуть вправо на k позиций.

 

14. Даны действительные числа . Найти сумму A1, A2, A3,..., An чисел этой последовательности, расположенных между максимальным и минимальным числами (в сумму включить и оба этих числа).

 

15. Даны две последовательности по 30 чисел в каждой. Найти наименьшее среди тех чисел первой последовательности, которые не входят во вторую последовательность (считая, что хотя бы одно такое число есть).

 

16.Даны целые числа A1, A2, A3,..., An (в этой последовательности могут быть повторяющиеся члены). Получить все числа последовательности, которые входят в нее по одному разу.

 

17. Построить пересечение последовательностей A1, A2, A3,..., An и B1, B2, B3,..., Bn. Т.е. получить в каком либо порядке числа, принадлежащие одновременно обеим последовательностям. (Если возникают трудности, попробуйте решить эту задачу, предполагая, что среди членов последовательности А нет повторяющихся и среди членов последовательности В нет повторяющихся)

 

18. Даны целые числа A1, A2, A3,..., An . Для каждого из этих чисел выяснить сколько раз оно входит в эту последовательность. Результат представить в виде ряда строк, первая из которых есть А1- k, где k - есть число вхождений А1 в

последовательность. Вторая строка будет иметь вид Аi- m, где Аi - есть первый по порядку член, отличный от А1 , m - число вхождений этого члена в последовательность и т.д.

 

19. Даны целые числа A1, A2, A3,..., An. Получить новую последовательность, заменяя Ai нулями, если |Ai|¹Max(A1, A2, A3,..., An) и заменяя Ai единицей в противном случае.

 

20. Даны целые числа A1, A2, A3,..., An. Оставить ее без изменения, если она упорядочена по неубыванию или по невозрастанию; в противном случае удалить из последовательности те члены, порядковые номера которых кратны четырем, сохранив прежним порядок оставленных членов.

 


Работа N 4.

Работа с матрицами

 

При работе с матрицами, необходимо их описать (тип элементов матрицы, количество строк и столбцов), осуществить ввод элементов матрицы. Если вам безразличны значения элементов матриц, можно осуществить ввод, используя датчик случайных чисел. Ниже приведен пример такого ввода:

Program Matrix1;

uses crt;

const n=5;

var i, j : integer;

A: array [1..n, 1..n] of integer;

Begin

ClrScr;

Randomize; {инициализация встроенного датчика случайных чисел }

{Ввод матрицы}

For i:=1 to n do

For j:=1 to n do

A[i,j]:=random(20); {A[i,j] получает случайное значение, не превосходящее 20}

{ Вывод матрицы на экран по строкам}

For i:=1 to n do

begin

For j:=1 to n do write(A[i,j]:5);

writeln;

end;

End.

 

Типичными операциями над матрицами являются нахождение суммы элементов строки, умножение матрицы на вектор и т.п.

 

Пример. Суммирование элементов заданной строки матрицы.

s:=0;

for j:=1 to n do s:=s+b[i,j]; {суммируется i-я строка}

 

Пример. Умножение матрицы на вектор.

For i:=1 to n do

begin

s:=0;

For j:=1 to n do s:=s+A[i,j]*B[j];

C[i]:=s;

end;

 

Целью данной работы является получение практических навыков работы с матрицами.

 

Задачи.

1. Дана действительная матрица [A i,j ] размера nxn. Получить действительную матрицу [Bi,j ], элемент которой b[i,j] равен наибольшему элементу данной матрицы, расположенному в области, определяемой индексами i,j так, как показано на рисунке 2,в.

 

2. Будем называть соседями элемента с индексами i,j некоторой матрицы такие элементы этой матрицы, соответствующие индексы которых отличаются от i и j не более чем на 1. Для данной целочисленной матрицы [Ai,j] размером nxm найти матрицу из 0 и 1 [Bi,j ], элемент которой b[i,j] равен 1, когда среди соседей a[i,j] есть не менее двух совпадающих.

 

3. Дана действительная матрица [Ai,j ] размера nxn. Получить действительную матрицу [Bi,j ], элемент которой b[i,j] равен сумме элементов данной матрицы, расположенных в области, определяемой индексами i,j так, как показано на рисунке 2,а.

 

4. Дана действительная матрица порядка 2n. Получить новую матрицу, переставляя ее блоки размера nxn в соответствии с рисунком 1,а.

 

5. В данной действительной матрице размера 6x9 поменять местами строку, содержащую элемент с наибольшим значением, со строкой, содержащей наименьший элемент. Предполагается, что эти элементы единственны.

 

6. В данной квадратной целочисленной матрице порядка 17 указать индексы всех элементов с наибольшим значением.

 

7. Дана действительная матрица [Ai,j] размера nxn. Получить действительную матрицу [Bi,j ], элемент которой b[i,j] равен сумме элементов данной матрицы, расположенных в области, определяемой индексами i,j так, как показано на рисунке 2,б.

 

8. Будем называть соседями элемента с индексами i,j некоторой матрицы такие элементы этой матрицы, соответствующие индексы которых отличаются от i и j не более чем на 1. Для данной целочисленной матрицы [Ai,j] размером nxm найти матрицу из 0 и 1 [Bi,j], элемент которой b[i,j] равен 1, когда все соседи a[i,j] и само a[i,j] равны 0.

 

9. Дана действительная матрица порядка 2n. Получить новую матрицу, переставляя ее блоки размера nxn в соответствии с рисунком 1,б.

 

10. Элемент матрицы назовем седловой точкой, если он является наибольшим в своем столбце и одновременно наименьшим в своей строке. Для заданной целой матрицы размером 10x15 напечатать индексы всех ее седловых точек.

 

11. Дана действительная матрица [Ai,j] размера nxn. Получить действительную матрицу [Bi,j], элемент которой b[i,j] равен сумме элементов данной матрицы, расположенных в области, определяемой индексами i,j так, как показано на рисунке 2,в.

 

12. Будем называть соседями элемента с индексами i,j некоторой матрицы такие элементы этой матрицы, соответствующие индексы которых отличаются от i и j не более чем на 1. Для данной целочисленной матрицы [Ai,j] размером nxm найти матрицу из 0 и 1 [Bi,j], элемент которой b[i,j] равен 1, когда все соседи a[i,j] меньше самого a[i,j].

 

13. Дана действительная матрица размера mxn, все элементы которой различны. В каждой строке выбирается элемент с наибольшим значением, затем среди этих чисел выбирается наименьшее . Указать индексы элемента с найденным значением.

 

14. Дана действительная матрица [Ai,j] размера nxn. Получить действительную матрицу [Bi,j], элемент которой b[i,j] равен наибольшему элементу данной матрицы, расположенному в области, определяемой индексами i,j так, как показано на рисунке 2,а.

 

15. Дана действительная матрица порядка 2n. Получить новую матрицу, переставляя ее блоки размера nxn в соответствии с рисунком 1,в.

 

16. В данной действительной матрице порядка n найти сумму элементов строки, в которой располагается элемент с наименьшим значением.

 

17. Дана действительная матрица [Ai,j] размера nxn. Получить действительную матрицу [Bi,j], элемент которой b[i,j] равен наибольшему элементу данной матрицы, расположенному в области, определяемой индексами i,j так, как показано на рисунке 2,б.

 

18. Дана целочисленная матрица размером 7x4. Переставляя ее строки и столбцы, добиться того, чтобы наибольший элемент (один из них ) оказался в верхнем левом углу.

 

19. Дана действительная матрица порядка 2n. Получить новую матрицу, переставляя ее блоки размера nxn в соответствии с рисунком 1,г.

 

20. Дана действительная матрица [Ai,j] размера nxn. Получить действительную матрицу [Bi,j], элемент которой b[i,j] равен сумме элементов данной матрицы, расположенных в области, определяемой индексами i,j так, как показано на рисунке 2,г.

 

+-------+ +-------+ +-------+ +-------+

| | | | | | | | | | | |

|---+---| |---+---| |---+---| |---+---|

| | | | | | | | | | | |

+-------+ +-------+ +-------+ +-------+

а) б) в) г)

Рис.1

 

+------------+ +-------------+ +---------------+

| | | | a[i,j]| | a[j,i]|

| | | +-------+ | | +---------+ |

| | | | | | | | | |

| +--------| | | | | +---------+ |

|a[i,j] | | | | |a[i,j] |

+------------+ +-------------+ +---------------+

a) б) в)

+------------+

| | |

| | |

| | |

+---+ a[i,j] |

| |

+------------+

г)


Работа N 5.