Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2012_METODICh_POSOBIE_PASCAL.doc
Скачиваний:
18
Добавлен:
15.09.2019
Размер:
2.97 Mб
Скачать

Лабораторная работа № 7. Программирование алгоритмов циклической структуры с неизвестным числом повторений.

При выполнении работы необходимо знать:

  • Знать и уметь строить алгоритмы циклической структуры.

  • Знать операторы цикла (смотри лаб. работу № 5).

  • Уметь составить схему программы (алгоритм) циклической структуры для данной задачи и записать программу по готовому алгоритму.

Теоретический минимум:

При программировании алгоритмов циклической структуры с неизвестным числом повторений можно пользоваться оператором цикла while p do s; (с предусловием) или оператором цикла repeat s until p; (с постусловием).

Напомним синтаксис этих операторов на примере вычисления суммы ряда:

Цикл WHILE Цикл REPEAT

i:=2; S:=0; i:=2; S:=0;

while i<100 do repeat

begin S:=S+1/i;

S:=S+1/i; i:=i+1;

i:=i+1; until i>=100;

end;

Задача 7.

Вычислить приближенное значение числа с заданной точностью, если известно, что сумма ряда: приближается к значению при достаточно большом количестве членов ряда.

Математическая формулировка задачи:

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

Каждый член ряда вычисляется по формуле и помножается на -1, если n четное, и на +1, если n нечетное. Вычисления заканчиваются тогда, когда значение очередного члена ряда становится меньше, чем заданная точность вычислений.

Алгоритм решения задачи 7: Текст программы:

Program Ex_7;

Uses Crt;

Var

P: real; { сумма }

t: real; { точность вычислений }

el: real; { элемент ряда }

n: integer; { знаменатели дробей }

Begin

ClrScr;

P:=0;

n:=1;

el:=1;

write(‘ Задайте точность вычислений ’);

readln(t);

While el>=t do

begin

el:=1/(2*n-1);

if (n mod 2)=0

then P:=P-el;

else P:=P+el;

n:=n+1;

End;

P:=P*4;

Writeln(‘Значение ПИ равно ’ ,P);

Readln;

End.

Лабораторная работа № 8. Обработка одномерных числовых массивов.

При выполнении работы необходимо знать:

  • Знать и уметь строить алгоритмы циклической структуры для обработки одномерных массивов, знать операторы цикла (смотри лаб. работу № 5).

  • Знать принципы и приемы обработки одномерных числовых массивов с использованием операторов цикла.

  • Уметь составить схему программы (алгоритм) циклической структуры для обработки одномерного числового массива и записать программу по готовому алгоритму.

Теоретический минимум:

Переменные-массивы являются переменными сложного (структурированного) типа и представляют собой организованную группу элементов одного типа (линейную или прямоугольную таблицу).

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

Линейные таблицы представляют собой одномерные массивы, а прямоугольные таблицы - двумерные массивы.

-5

6

12

67

-90

34

-45

0

-4

83

-24

0

1

2

3

4

5

6

7

8

9

10

Порядковые номера элементов массива ( индексы )

A [10] - одномерный массив.

Так как массив имеет одно общее имя, его элементы различаются только номерами (индексами).

При объявлении массива в программе после имени массива в квадратных скобках указывается его размерность, то есть количество элементов. Элементы такого массива идут по порядку с 0 по 10 (всего 11 элементов). Нулевой элемент можно не использовать.

Z [5, 6] - двумерный массив, содержит 5 строк и 6 столбцов (или 6 строк и 7 столбцов вместе с нулевыми). Чтобы обратиться к текущему (очередному) элементу массива, надо указать номер строки и столбца: Z[i, j].

j номера столбцов

i номера строк

0

1

2

3

4

5

6

0

34

51

-9

0

25

74

90

1

-7

-11

-43

67

98

10

56

2

-45

8

23

14

0

21

33

3

9

12

-15

62

83

48

17

4

-37

68

71

4

0

19

28

5

-59

-13

1

85

-7

-1

2

Таким образом, массив имеет следующие свойства:

  • Массив имеет имя, которое задает программист

  • Массив имеет сквозную нумерацию элементов

  • Массив имеет размерность, то есть определенное количество элементов

  • Массив имеет тип, определяющий тип всех входящих в него элементов

  • Массив имеет значения элементов, которые могут быть заданы в процессе выполнения программы и могут изменяться в пределах диапазона объявленного типа в ходе выполнения программы

Объявление массива. Перед началом работы с массивом необходимо объявить его и зарезервировать место в памяти под соответствующие количество элементов.

Объявление одномерного массива в программе:

Type Mas = array [1..10] of integer; { объявляем тип массив из 10 целых элементов }

Var A, B : Mas; { переменные A, B типа массив }

Массивы можно объявить и так:

Var A, B : array [1..10] of integer; { переменные A, B типа массив из 10 целых элементов }

Первый способ объявления предпочтительнее, так как при этом программа получается более наглядной. Кроме того, при использовании подпрограмм массивы следует объявлять с явным указанием типа, чтобы массивы в главной программе и массивы в подпрограммах принадлежали к одному и тому же типу. В противном случае при передаче данных в подпрограммы и обратно возникнет ошибка.

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

Приведем пример организации ввода одномерного массива целых чисел А [10]. Нулевой элемент использовать не будем.

Ввод элементов одномерного массива с клавиатуры:

For i:=1 to 10 do begin

Writeln(‘Введите значение A[’, i, ‘]: ’);

Readln(A[i]);

End;

При запуске на выполнение необходимо поочередно ввести 10 элементов массива (долго, не всегда удобно).

Ввод элементов одномерного массива случайным образом:

Randomize;

For i:=1 to 10 do begin

A[i]:=random(200)-100;

End;

При запуске программы на выполнение элементы массива получат случайные значения при помощи генератора случайных чисел Random в интервале [-100; 100[.

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

Вывод значений элементов одномерного массива на экран:

ClrScr; { очищение экрана }

For i:=1 to 10 do begin

Write(A[i]:5);

{ вывод элементов массива в строчку, на каждый элемент отводится 5 позиций}

End;

ClrScr; { очищение экрана }

For i:=1 to 10 do begin

Writeln(A[i]); { вывод элементов массива в столбик }

End;

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

Задача 8.1.

Задать одномерный числовой массив А [10] из целых чисел. Определить сумму и количество отрицательных элементов массива.

Математическая формулировка задачи:

Чтобы определить сумму и количество отрицательных элементов массива, нужно сначала заполнить массив некоторыми числами, а затем просмотреть массив сначала, от первого элемента до последнего (в цикле). Каждый элемент нужно проверить – если он окажется отрицательным (соответствующим нашему критерию), то его нужно добавлять в сумму, а если не отрицательным – то не нужно добавлять в сумму.

Количество элементов, соответствующих какому-либо критерию, в данном случае отрицательных по значению, подсчитывается при помощи специальной переменной. До подсчета она равна нулю, и увеличивается на 1 каждый раз, когда найден нужный (отрицательный) элемент.

Текст программы к задаче 8.1:

Program Ex_8_1;

Uses Crt;

Type Mas = array [1..10] of integer; { объявляем тип массив из 10 целых чисел }

Var A : Mas; { переменная A типа массив }

S: real; { сумма отрицательных элементов массива }

i: integer; { индексы массива }

k: integer; { количество отрицательных элементов массива }

Begin

ClrScr; { очищение экрана }

Textcolor(1); { установим цвет текста синий }

Randomize;

For i:=1 to 10 do begin

A[i]:=random(200)-100;

Writeln(A[i]); { вывод элементов массива в столбик }

End;

S:=0; k:=0;

For i:=1 to 10 do begin

If A[i]<0 then begin

S:=S+A[i];

k:=k+1;

End;

End;

Writeln; { перевод строки }

Textcolor(2); { установим цвет текста зеленый}

Writeln( ‘Сумма отрицательных элементов массива ’,S);

Writeln(‘Количество отрицательных элементов массива ’,k);

Readln;

End.

Задача 8.2.

Задать одномерный числовой массив А [15] из целых чисел. Сформировать одномерный массив В из положительных элементов массива А.

Математическая формулировка задачи:

Прежде всего нужно заполнить исходный массив А какими-либо числами. Часть из них могут быть положительными, а часть отрицательными или равными нулю.

Чтобы получить одномерный массив В из элементов исходного массива А нужно просматривать массив А в цикле и проверять каждый элемент исходного массива, является ли его значение положительным. Если найден положительный элемент, то его значение нужно записать в первую ячейку нового массива В (присвоить элементу массива В значение элемента массива А). Затем просмотр продолжается. Отыскав второе положительное значение, записываем его во вторую ячейку массива В и так далее.

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

-59

0

17

-8

-36

6

19

97

-29

34

-4

0

-74

3

-48

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

Порядковые номера элементов массива ( индексы )

A [15] – исходный одномерный массив.

17

6

19

97

34

3

1

2

3

4

5

6

В [6] – одномерный массив, сформированный из положительных элементов массива А.

Текст программы к задаче 8.2:

Program Ex_8_2;

Uses Crt;

Type Mas = array [1..15] of integer; { объявляем тип массив из 10 целых чисел }

Var A, В : Mas; { переменные A, В типа массив }

i: integer; { индексы массива A}

k: integer; { индексы массива В }

Begin

ClrScr; { очищение экрана }

Randomize;

For i:=1 to 15 do begin

A[i]:=random(200)-100;

Write(A[i]:5); { вывод элементов массива в одну строку }

End;

Writeln; { перевод строки }

k:=0;

For i:=1 to 15 do begin

If A[i]>0 then begin

k:=k+1; { увеличение индекса массива В }

B[k]:=A[i]; { записываем положительный элемент массива А в массив В }

Write(B[k]:5); { выводим элементы массива В на экран }

End;

End;

Writeln; { перевод строки }

Textcolor(4); { установим цвет текста красный }

Writeln(‘Количество элементов массива B ’,k);

Readln;

End.

Схема программы к задаче 8.1 Схема программы к задаче 8.2

Задача 8.3.

Задать одномерный числовой массив А [15] из целых чисел. Определить произведение четных по значениям элементов массива, стоящих после минимального элемента.

Математическая формулировка задачи:

Чтобы определить такое произведение, требуется сначала найти минимальное значение в массиве и запомнить в какой-либо переменной порядковый номер минимума. После этого надо подсчитать произведение четных по значениям элементов, начиная просмотр массива не с первого элемента, как обычно, а с этого номера.

Поиск минимума в массиве происходит по стандартному алгоритму. Сначала за минимум принимается значение первого по порядку элемента массива. Номер минимума соответственно принимается за 1. Массив просматривается поэлементно в цикле от первого элемента до последнего. Если найдется элемент, значение которого меньше, чем принятый минимум, то минимум равен ему. Одновременно меняется и номер минимума. После выхода из цикла в переменной минимум окажется наименьшее значение массива.

Текст программы к задаче 8.3:

Program Ex_8_3;

Uses Crt;

Type Mas = array [1..15] of integer; { объявляем тип массив из 10 целых элементов }

Var A : Mas; { переменные A, В типа массив }

i: integer; { индексы массива A}

Min: integer; { минимум в массиве }

k: integer; { номер минимума }

P: real; { произведение четных по значениям элементов}

Begin

ClrScr;

Randomize;

For i:=1 to 15 do begin

A[i]:=random(200)-100;

Write(A[i]:5); { вывод элементов массива в одну строку }

End;

Writeln; { перевод строки }

Min:=A[1];

k:=1;

For i:=1 to 15 do begin

If A[i]<Min then begin

k:=i; { увеличение индекса массива В }

Min:=A[i]; { записываем положительный элемент массива А в массив В }

End;

End;

Writeln; { перевод строки }

Writeln(‘ Номер минимума ’, k);

Writeln(‘ Значение минимума ’, Min);

P:=1; { начальное значение произведения }

For i:=k to 15 do begin

If A[i] mod 2=0 then P:=P*A[i];

End;

Writeln(‘ P= ’, P);

Readln;

End.

Схема программы к задаче 8.3