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

Работа N 1. Разветвления

Независимость программы от данных часто требует в зависимости от конкретного набора данных ( или промежуточных результатов) выбирать один из двух или более различных вариантов, вычислительного процесса, т.е. осуществлять разветвление вычислительного процесса. В языке 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=20*k.

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

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. Дано число х. Напечатать в порядке возрастания числа ch(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. Определить принадлежит ли точка с координатами (x, y) заштрихованной части плоскости рис.1, ж.

 

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

14.Пусть D-заштрихованная часть плоскости (рис 2. а) и пусть U определяется по x, y следующим 0, если (x, y)ÎD, u= x, в противном случае. Даны действительные числа х,у. Определить U.

 

15.Пусть D-заштрихованная часть плоскости (рис 2. б) и пусть U определяется по x, y следующим образом-3, если (x, y) ÎD, u= y*y, в противном случае. Даны действительные числа х,у. Определить U.

 

16.Пусть D-заштрихованная часть плоскости (рис 2. б) и пусть U определяется по x, y следующим образом
x-y, если (x, y) ÎD, u= y*x+7, в противном случае. Даны действительные числа х,у. Определить U.

 

17.Пусть D-заштрихованная часть плоскости (рис 2. б) и пусть U определяется по x, y следующим образом x*x-1, если (x, y) ÎD, u= │x-1│, в противном случае. Даны действительные числа х,у. Определить U.

 

18.Пусть D-заштрихованная часть плоскости (рис 2. б) и пусть U определяется по x, y следующим образом x*x-1│, если (x, y) ÎD, u= x+y, в противном случае. Даны действительные числа х,у. Определить U.

 

19.Пусть D-заштрихованная часть плоскости (рис 2. б) и пусть U определяется по x, y следующим образомx+y, если (x, y) ÎD, u= x-y, в противном случае. Даны действительные числа х,у. Определить 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 - Козерог

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

Работа N2. Циклы.

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

При решении многих задач вычислительный процесс может иметь циклический характер. Это означает , что часть операторов многократно выполняется при различных значениях переменных. В языке 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. Вычислить

 

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

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

 

4. Дано натуральное число n. Вычислить a (a+1) ... (a+n-1)

 

5. Дано натуральное число N и действительное число x. Вычислить Sin(x)+Sin2(x)+…+Sinn(x).

 

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

 

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

 

8. Пусть A 0=1, Ak=k*Ak-1+1/k, k=1,2, ...Для заданного k получить A­k.

 

9. Дано натуральное число n и действительное число a. Получить a*(a+1)*(a+2)*…*(a+n-1)/

 

10. Вычислить

10. Вычислить

11. Вычислить

12. Вычислить

13. Вычислить

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

 

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

 

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

 

17. Даны целые числа P, Q. Получить все делители числа Q взаимно простые с Р.

 

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

 

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

 

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

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

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

Type

T1 = Array [1..N] 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..N, 1..4] of Integer;

Var

A :T1; {описана матрица с именем A размера N*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;

{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. Даны действительные числа A[1],A[2],A[3],...,A[2*n]. Переставить числа в следующем порядкe A[1],A[n+1],A[2],A[n+2],A[n],A[2*n].

3. Даны действительные числа A[1],A[2],A[3],...,A[2*n]. Переставить числа в следующем порядкe A[1], A[2n], A[2], A[2n-1]...,A[n], A[n+1].

 

4. Даны действительные числа A[1],A[2],A[3],...,A[2*n]. Получить A[1]+A[2n],A[2]+A[2n-1],...,A[n] + A[n+1].

 

5. Даны действительные числа A[1],A[2],A[3],...,A[n].Если в результате замены отрицательных членов последовательности их квадратами члены будут организовывать неубывающую последовательность, то получить сумму членов исходной последовательности; в противном случае получить их произведение.

6. Даны действительные числа A[1],A[2],A[3],...,A[n].Получить новую последовательность, выбросив из исходной все члены созначением max(A[1],A[2],A[3],...,A[n]).

 

7. Даны действительные A[1],A[2],A[3],...,A[n].Все члены последовательности с четными номерами, предшествующие первому по порядку члену со значением Max(A[1],A[2],A[3],...,A[n]) умножить на Max(A[1],A[2],A[3],...,A[n].).

 

8. Даны целые числа A[1],A[2],A[3],...,A[n], каждое из которых отлично от нуля. Поменять местами наибольший член последовательности и член с номером M.

 

9. Даны целые числа A[1],A[2],A[3],...,A[n].Если в данной последовательности ни одно четное число не расположено после нечетного, то получить все отрицательные числа последовательности, иначе - все положительные. Порядок следования чисел в обоих случаях заменяется на обратный.

 

10. Даны целые числа A[1],A[2],A[3],...,A[n]. Наименьший член последовательности заменить целой частью среднего арифметического всех членов последовательности, остальные члены оставить без изменения. Если в последовательности несколькo членов со значением Min(A[1],A[2],A[3],...,A[n]), то заменить последний по порядку.

 

11. Даны целые числа A[1],A[2],A[3],...,A[n], каждое из которых является либо 0, либо 1, либо 2. Переставить числа так, чтобы сначала шли только 0, затем только 1, затем только 2.

 

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

 

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

 

14. Даны действительные числа A[1],A[2],A[3],...,A[n]. Найти сумму чисел этой последовательности, расположенных между максимальным и минимальным числами (в сумму включить и оба этих числа).

 

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

 

16. Даны целые числа A[1],A[2],A[3],...,A[n] (в этой последовательности могут быть повторяющиеся члены). Получить все числа последовательности, которые входят в нее по одному разу.

 

17. Построить пересечение последовательностей A[1],A[2],A[3],...,A[n] В[1],В[2],В[3],...В[n]. Т.е. получить в каком либо порядке числа, принадлежащие одновременно обеим последовательностям.

(Если возникают трудности, попробуйте решить эту задачу, предполагая, что среди членов последовательности А нет повторяющихся и среди членов последовательности В нет повторяющихся)

 

18. Даны целые числа A[1],A[2],A[3],...,A[n]. Для каждого из этих чисел выяснить сколько раз оно входит в эту последовательность. Результат представить в виде ряда строк, первая из которых есть А[1] - k, где k - есть число вхождений А[1] в последовательность. Вторая строка будет иметь вид А[i] - m, где А[i]- есть первый по порядку член, отличный от А[1], m – число вхождений этого члена в последовательность и т.д.

 

19. Даны целые числа A[1],A[2],A[3],...,A[n]. Получить новую последовательность, заменяя A[i] нулями, если │A[i]│<>Max(A[1],A[2],A[3],...,A[n]) и заменяя A[i] единицей в противном случае.

 

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