- •Лабораторная работа № 3. (часть1)
- •Цель работы:
- •Порядок выполнения работы
- •Выполнить практическую часть работы.
- •Контрольные вопросы
- •Краткие теоретические сведения
- •Оператор цикла с параметром
- •Цикл с предпроверкой условия
- •Цикл с постпроверкой условия
- •Вложенные циклы
- •Операторы Break и continue.
- •Индивидуальные задания
Операторы Break и continue.
Для удобства реализации циклических структур на Паскале в последних версиях языка введены операторы break и continue, применяемые внутри циклов. Они расширяют возможности использования циклов и улучшают структуру программы.
В процессе выполнения тела цикла до полного завершения цикла могут возникнуть дополнительные условия, требующие завершения цикла. В этом случае цикл может быть прекращен оператором break.
В ходе выполнения цикла может возникнуть условие, при котором необходимо пропустить все или некоторые действия, предусмотренные в цикле, не прекращая работу цикла совсем. Для этого используется оператор continue, который передает управление в ту точку программы, где проверяется условие продолжения или прекращения цикла.
Ходом выполнения цикла можно управлять с помощью двух операторов break и continue.
break – прерывает выполнение цикла, управление передается операторам, следующим за оператором цикла.
continue – прерывает выполнение очередного шага цикла и возвращает управление в начало цикла, начиная следующий шаг.
Например:
for n:=1 to 10 do
begin
if n mod 2 = 0 then continue;
if n = 7 then break;
writeln(n);
end;
Данная программа будет печатать только нечетные числа (из-за срабатывания continue). Цикл прекратит выполняться, когда n станет равно 7. В итоге будут напечатаны числа: 1, 3, 5.
Практическая часть работы
Пример №1_Вычисление значения суммы ряда (подсказка для решения задачи №2.1)
При решении стандартной задачи на нахождение суммы ряда прежде всего требуется выявить закономерность построения ряда, т.е. зависимость вида слагаемого от его порядкового номера.
Например, в случае суммы ряда вида cos(x)+cos(2x)+cos(3x)+…+cos(7x) общий вид слагаемого с номером k будет иметь вид cos(k*x), где k изменяется от 1 до 7.
Накопление суммы при этом должно проводиться по шагам, на каждом шаге цикла к имеющемуся уже значению суммы должно прибавляться очередное слагаемое (в самый первый момент предполагается, что значение суммы равно 0).
Фрагмент программы нахождения указанной выше суммы ряда с помощью оператора FOR может иметь, например следующий вид: |
С помощью оператора While:
|
С помощью оператора Repeat:
|
… s:=0; for k:=1 to 7 do s:=s+cos(k*x); writeln(‘сумма =’, s); end.
|
… s:=0; k:=1; while k<=7 do begin s:=s+cos(k*x); k:=k+1; end; writeln(‘сумма =’, s); end. |
… s:=0; k:=1; repeat s:=s+cos(k*x); k:=k+1; until k>7; writeln(‘сумма =’, s); end. |
Пример №2 (Подсказка для решения задачи №3)
Вывести
на экран таблицу значений функции
y(x)=x*2+
при
изменении аргумента от -10 до 10 с шагом
0.5
program f1;
uses crt;
var x,y,a,b,dx:real;
Begin
Clrscr;
Write(’Введите начальное значение аргумента:’);readln(a);
Write(’Введите конечное значение аргумента:’);readln(b);
Write(’Введите шаг табулирования:’);readln(dx);
Writeln(’-------------------------’:20);
Writeln(’x’:9’ | ’:4,’ y’:4); {шапка таблицы}
Writeln(’-------------------------’:20);
X:=a;
While (x<=b) do
Begin
If (5-x)<0 then Writeln(’ x:10:3,’ | функция не определена’:22)
Else
Begin
Y:=x*2+sqrt(5-x);
Writeln(x:10:3,’ | ’,y:7:3);
End;
X:=x+dx;
End;
Writeln(’-------------------------’:20);readln;
End.
Пример №3 Заставка к фильму «Матрица» (подсказка для решения задачи №4)
Демонстрируется заставка к известному фильму (фрагмент фильма “Матрица”) и говорится о том, что сегодня современный кинематограф не может существовать без применения компьютерных технологий. Например, как в данном фрагменте, для создания специальных эффектов. На основе полученных ранее знаний и новых мы попробуем создать аналогичную программу. Сообщается, что при решении данной задачи приходится использовать вложенные циклы.
Условие задачи: “Составить программу имитации заставки к фильму “Матрица”.
Рисунок 1-Заставка к фильму «Матрица»
Рисунок 2-Результат работы программы (символы на экране).
Программа “ Матрица”
Задача. Составить программу имитации заставки к фильму “Матрица”, используя программу прошлого урока, которая выводила на экран заглавные буквы латинского алфавита зеленого цвета со случайными координатами.
program matrix; {заголовок программы}
uses crt; {подключение библиотек}
var x,y,y1:integer; {описание переменных}
symvol:char;
BEGIN {начало программы}
clrscr; randomize;{очистка экрана, запуск генератора случайных чисел}
repeat {начало внешнего цикла}
y:=1; x:=random(80)+1; y1:=random(24)+1; {задаются координаты символа }
symvol:=char(random(26)+65); {переменной присваивается код символа}
textcolor(2) ;{установка зеленого цвета символа,}
repeat {начало внутреннего цикла}
GoToXY(x,y); write(symvol); delay(2000);{установка курсора в позицию х, у экрана, печать символа, задержка символа на экране}
y:=y+1; {изменение номера строки}
until y>=y1; {проверка условия внутреннего цикла}
until keypressed; {проверка условия внешнего цикла}
END. {конец программы}
Пример №4 (подсказка для решения задачи № 5)
Даны
натуральные числа n и k. Составить
программу вычисления выражения
.
Решение
Для
вычисления указанной суммы целесообразно
организовать цикл с параметром i, в
котором, во-первых, вычислялось бы
очередное значение y =
k
и, во-вторых, осуществлялось бы накопление
суммы прибавлением полученного слагаемого
к сумме всех предшествующих (s = s + y).
Program Example_13;
Var n, k, y, i, s, m: Integer;
Begin
Writeln ('Введите исходные данные n и k');
Readln(n,k);
s:=0;
For i:=1 To n Do
Begin y:=1;
For m:=1 To k Do y:=y*i; {нахождение степени k числа i}
s:=s+y;
End;
Writeln('Ответ: ',s);
End.
Таким образом, для решения задачи потребовалось организовать два цикла, один из которых пришлось поместить внутрь другого. Такие конструкции называют вложенными циклами.
Пример №5. Напечатать числа в виде следующей таблицы
3 3 3 3 3
3 3 3 3 3
3 3 3 3 3
3 3 3 3 3
Данная таблица состоит из четырех строчек, в каждой из которых число 3 напечатано 5 раз. Строчку из пяти чисел можно напечатать с помощью одного цикла for: for i:=1 to 5 do
write(3, ' ');
Чтобы повторить вывод строчки 4 раза, вставляем этот цикл внутрь другого: for k:=1 to 4 do
{4 раза делаем то, что написано между begin’ом и end’ом}
begin
for i:=1 to 5 do
write(3, ' '); {Выводим одну строку}
writeln; {Переводим курсор на следующую строку}
end;
Типичная ошибка, когда в качестве счетчиков вложенных циклов (i и k в приведенном примере) используется одна и та же переменная. То есть нельзя в каждом из циклов использовать одну переменную i. Помнить об этом особенно важно, поскольку данная ошибка не обнаруживается на этапе компиляции. Ваша программа запустится, но делать будет вовсе не то, что вы от нее ждете. В приведенном примере (если допустить ошибку, заменив переменную k на i) внешний цикл выполнится всего 1 раз вместо 4-х. Возможна также ситуация, когда такая ошибка приведет к зацикливанию: внешний цикл будет выполняться бесконечно долго – программа зависнет.
Рассмотрим еще один пример.
Пример №6. Напечатайте числа в виде следующей таблицы:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Снова используем внешний цикл для вывода строк, а внутренний для отдельных чисел в одной строке. Используем также отдельную переменную-счетчик n, в которой будет храниться выводимое число. n:=1;
for i:=1 to 4 do
begin
for k:=1 to 4 do
begin
write(n, ' ');
n:=n+1;
end;
writeln;
end;
Дополнительная переменная-счетчик (n) здесь введена для большей прозрачности алгоритма. Заметив, что всегда выполняется n = (i-1)*4+k, можно обойтись без нее.
Разумеется, ту же задачу можно решить без вложенных циклов (вообще говоря, обойтись без них можно всегда). Например, заметив, что числа, стоящие в конце каждой строки делятся на 4, делаем так: for n:=1 to 16 do
begin
write(n, ' ');
if n mod 4 = 0 then
writeln;
end;
Однако решения, основанные на вложенных циклах, как правило, интуитивно понятнее, их проще придумывать. Это связано с такой фундаментальной идеей программирования как разделение задачи на подзадачи. Выделяется отдельная часть решения задачи (вывод одной строки в приведенных примерах), затем с помощью внешнего цикла она выполняется много раз.
Типичные ошибки при написании вложенных циклов:
1. Наиболее частая ошибка – использование одной и той же переменной-счетчика для внешнего и внутреннего циклов. Выше она уже упоминалась.
2. При решении некоторых задач необходимо, чтобы одна переменная-счетчик на каждом шаге увеличивалась, а другая при этом уменьшалась. Следуя непостижимыми (для человека наделенного формально-логическим складом ума) путями интуитивного мышления многие студенты для решения этой задачи приходят к конструкции вида: for i:=1 to n do
for k:=n downto 1 do …
Если вы хоть что-то поняли про вложенные циклы, то вам должно быть очевидно, что к решению поставленной задачи эта конструкция не имеет никакого отношения.
Напомним, что в качестве пределов изменения переменной-счетчика цикла можно использовать произвольное выражение, дающее результат целого типа: for i:=<произвольное выражение> to <произвольное выражение> do …
В частности, если речь идет о вложенных циклах, то пределы изменения переменной во внутреннем цикле могут зависеть от значения переменной внешнего цикла.
