Как писать программы в паскале с циклом

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

16. Кратные циклы

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

16.1. Двойной цикл и типовые задачи на двойной цикл

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

Цикл, который содержит вложенный цикл, называется внешним, вложенный цикл называется внутренним. Управляющая переменная внутреннего цикла всегда меняется быстрее, чем переменная внешнего. Это означает, что для каждого значения переменной внешнего цикла перебираются все значения переменной внутреннего. В случае вложения нескольких циклов это правило также действует: быстрее всего меняется переменная самого внутреннего цикла.

ИНФОРМАТИКА 8 класс: Цикл с предусловием на языке Паскаль | Видеоурок

Поясним сказанное на примере. В конструкции, описанной ниже:

for i:=1 to 5 do begin

при i =1 переменная j последовательно принимает значения -5 , -4.5 , . , 5 , затем процесс повторится при i = 2 , 3 , 4 и 5 . Таким образом, за время выполнения каждого шага внешнего цикла for внутренний цикл while выполнится 21 раз.

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

1. Для функции двух переменных f ( x , y ) = sin 2 x + cos 4 y построить таблицу ее значений при значениях аргументов x и y , меняющихся от 0 до 2 с шагом, равным 0.25 .

Решение задачи возможно, как минимум, в трех вариантах. Они схематично изображены на рис. 16.1.

Варианты 1 и 2 отличаются лишь порядком следования внешнего и внутреннего циклов. Рассмотрим возможное решение для варианта 1.

Рис. 16.1. Таблицы значений функции 2 переменных

var x , y , f : real ;

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

Вариант 3 удобен «естественным» представлением таблицы значений функции двух переменных, однако, помешать его реализации может ограниченная ширина окна консоли (80 символов). Ниже приводится одна из возможных реализаций такой программы:

Цикл FOR в Pascal

var x , y , f : real ;

writeln; write (‘ ‘:6);

потребовался отдельный цикл >

Как видно из листинга, код несколько усложнился за счет дополнительного цикла формирования строки значений x , для того, чтобы строка таблицы помещалась на строке экрана, пришлось также уменьшить ширину поля вывода с 8 до 6 символов. Однако, выигрыш несомненен — теперь вся таблица поместилась на одном текстовом экране. Ограничение на ширину экрана консоли не имело бы значения, например, при выводе таблицы значений в текстовый файл.

2. Не обязательно границы внешнего и внутреннего циклов четко фиксированы. На практике распространены задачи, когда граница внутреннего цикла переменна и зависит от текущего значения управляющей переменной внешнего цикла. Рассмотрим такую задачу.

Напечатать на первой строке вывода один символ звездочки, на второй — два, на строке номер N — N символов. Значение N вводится с клавиатуры, 1< N

В общем виде условие можно сформулировать так: в строке номер i печатается i звездочек, при этом i меняется от 1 до N включительно. Разумеется, для перебора значений i мы используем цикл for . Однако для печати очередной строки звездочек нам потребуется вложенный цикл. Обозначив его счетчик как j , получим закон изменения j от 1 до i включительно:

if (IoResult<>0) or (n<2) or (n>24)

writeln (‘Ошибка! N должно быть ‘,

‘числом от 2 до 24’);

цикл имеет переменную границу>

for i:=1 to n do begin

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

Заданы N элементов массива A , упорядочить их по возрастанию значений.

Итак, нам требуется получить порядок элементов в массиве, при котором выполняется соотношение A 1 ≤ A 2 ≤. ≤ AN . Достичь этого можно, сделав перестановки значений элементов, алгоритм перестановки нам известен еще из гл. 4. Представим, что в цикле мы сравниваем первый элемент A 1 со всеми остальными Ai , i =2, 3, . , N , при необходимости (если A 1 > Ai ) переставляя A 1 и Ai . Таким образом, после выполнения этого цикла на первом месте в массиве гарантированно окажется его наименьший элемент. Для поиска следующего по величине элемента алгоритм можно повторить, сравнивая элемент A 2 с остальными и при необходимости выполняя перестановку. Таким образом, приходим к двойному циклу следующего вида:

Читайте также:
Использование оперативной памяти программами

элемента AN нет следующего>

j = i +1, i +2. N i перебирать

все следующие элементы>

Ai и Aj , при необходимости переставляем

Реализуем этот алгоритм в виде следующей программы:

var a:array [1..nmax] of real;

writeln (‘Введите N от 2 до ‘,nmax,’:’);

if (IoResult<>0) or (n<2) or (n>nmax)

then writeln (‘Ошибка! Повторите ввод’);

writeln (‘ Исходный массив :’);

for i:=1 to n do begin

for i:=1 to n-1 do

for j:=i+1 to n do

if a[i]>a[j] then begin

writeln (‘Отсортированный массив:’);

for i:=1 to n do write (a[i]:4:0);

reset (input); readln;

Сортировка массива по убыванию отличается лишь знаком в операторе сравнения элементов Ai и Aj .

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

4. Найти, сколько раз каждый элемент встречается в массиве.

Первое, что приходит в голову при решении этой распространенной задачи — кроме массива данных ввести «массив частот», элементы которого будут хранить информацию о встречаемости тех или иных значений. Однако решить проблему можно и без столь расточительных трат оперативной памяти (ведь размерность массива частот будет равна размерности исходного массива). Каждый элемент массива ai , кроме последнего, мы будем сравнивать со следующими за ним элементами aj , считая сколько раз выполнилось равенство ai = aj . Для того чтобы исключить повторную обработку уже встречавшихся элементов, учтенные значения нам придется заменять нулями. Поскольку значение ноль само может встретиться в массиве, дополнительный цикл перед обработкой подсчитает количество нулевых элементов.

Константа size носит то же назначение, что nmax в предыдущей задаче, а константа Diap задает диапазон значений, которые могут принимать элементы массива. Элементы массива следует сделать целочисленными, ведь задача сравнения вещественных чисел в общем случае некорректна (см. п. 7.2).

var a:array [1..size] of integer;

write (‘Введите размерность 1 массива ‘,

for i:=2 to n do begin

for i:=1 to n do if a[i]=0 then Inc(k);

if k>0 then writeln (‘0: ‘,k);

for i:=1 to n-1 do if a[i]<>0 then begin

for j:=i+1 to n do if a[i]=a[j] then

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

5. Координаты десяти точек на плоскости заданы двумя массивами xi , yi , i =1, 2, . 10. Найти две точки, расстояние между которыми минимально.

Действительно, нам придется искать расстояние от первой точки до всех остальных, от второй — только до точек с номерами 2, 3, . 10, так как расстояние до первой уже известно и т. д. Попробуйте написать программу самостоятельно, применив двойной цикл из предыдущего примера.

6. В завершение темы рассмотрим задачу, где число вложений циклов больше двух.

Номера автобусных билетов состоят из 6 цифр. «Счастливыми» называют билеты, в номерах которых сумма трех первых цифр равна сумме трех последних. Определить общее количество «счастливых» билетов.

Каждая из шести цифр может меняться от 0 до 9 включительно. Создав кратные циклы по шести переменным, воспользуемся известным нам алгоритмом организации счетчика:

if i+j+k = l+m+n then inc(kol);

(‘Количество счастливых билетов=’,kol);

16.2. Оператор безусловного перехода

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

Здесь Метка — специальным образом указанное место в программе. Действие goto очень просто: независимо от каких-либо условий он осуществляет передачу управления на оператор, следующий за меткой. Каждая метка имеет вид

где m — имя, построенное по обычным правилам или целочисленная константа от 0 до 9999 включительно. Метку недостаточно поставить перед нужным оператором — ее нужно еще и объявить в разделе описаний оператором

Можно объявить и несколько меток сразу, разделив их имена запятыми. Принято располагать оператор описания меток до оператора var . Таким образом, метки и оператор goto позволяют решить задачу быстрого непосредственного перехода к нужному месту в программе:

write (‘Введите значение I ( i >2)’);

if i mod j = 0 then write (j,’ ‘);

Эта несложная программа позволяет пользователю ввести число i , большее двух, после чего печатает все числа от 2 до i-1 , на которые i делится без остатка (проверка остатка от деления i на j выполнена операцией mod ). В случае ввода пользователем недопустимого значения i (меньшего трех) происходит переход на метку 10: , расположенную перед закрывающим оператором end. — таким образом, программа сразу же завершается. Метка 20: позволяет организовать цикл без использования операторов while , repeat или for . Действительно, перед меткой 20: переменная j получает начальное значение 2 , затем, если i делится на j без остатка, значение j выводится на экран, затем увеличивается на единицу и, если значение i не достигнуто, совершается переход на метку 20: , проверяющую уже новое значение j . Однако, и той, и другой цели можно было достигнуть без использования goto , применяя только операторы цикла и break; .

С правомерностью использования простого оператора goto связаны сложные и многолетние споры. Несомненно, что программу всегда можно написать, не прибегая к goto (иногда структурное программирование называют даже «программированием без goto «), не вызывает сомнения также, что использование меток и goto нарушает и усложняет восприятие структуры программы человеком. Однако автору представляется чрезмерным требование изгнать goto совсем — в ряде ситуаций он просто удобнее, чем другие средства. Представим, что нам нужно досрочно выйти из двойного (или вообще кратного) цикла. Оператор break; , расположенный во внутреннем цикле, прервет его выполнение, но выполнение внешнего цикла продолжится со следующего шага. Без goto выйти «из всех циклов сразу» можно разве что с применением специальных переменных-флагов:

Читайте также:
Как работает программа fing

var Flag : boolean ;

while true do begin

while true do begin

if Условие then begin

из обоих циклов сразу>

что требуется завершение>

if Flag=true then break;

отслеживать состояние флага>

Если цикл тройной — при таком подходе понадобится уже два флага, и так далее. Альтернативный путь — установить максимальные значения управляющих переменных внешних циклов — также не соответствует канонам структурного программирования. С goto все выглядит проще и естественней:

while true do begin

while true do begin

if Условие then goto go1;

Второй аспект возможного использования goto связан с написанием сложных подпрограмм (см. гл. 18), способных завершаться в различные моменты своего выполнения. Зачастую удобнее, чтоб подпрограмма имела всего одну «точку выхода» — свой последний оператор, а досрочный выход осуществляется установкой возвращаемого значения и переходом на последний оператор с помощью goto .

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

Источник: nickolay.info

Оператор цикла с параметром — цикл For

Наш сегодняшний урок будет посвящен очередному циклу. На этот раз будем разбирать цикл For .

структура цикла For в Pascal

Цикл For применяется тогда, когда нам заранее известно (или может быть вычисленно в программе до выполнения цикла) количество повторений, т.е. сколько раз цикл должен выполниться. Структура цикла For следующая:

где,
For, to/downto, do — зарезервированные слова (для, до, выполнить);
Имя переменной — это и есть тот самый параметр цикла, данная переменная должна относится к ординальному типу;
Выражения — первое выражение присваивается параметру цикла, как начальное значение, а второе выражение — это конечное значение параметра, которое должно быть достигнуто. Эти выражения также должны относится к ординальному типу;
Оператор — любой оператор языка Паскаль.

Как же работает вся эта штуковина? Да вот как. Перво-наперво вычисляется выражение, содержащее начальное значение. Затем это значение присваивается переменной параметра цикла. После этого циклически повторяется последовательность действий:

  1. Проверяется условие переменная параметра цикла ≤ конечное значение (в случае использования служебного слова To ), либо переменная параметра цикла ≥ конечное значение (в случае использования служебного слова Downto ). Если условие не выполнено, цикл For прекращает свою работу;
  2. Выполнение операторов в теле цикла;
  3. Наращивание переменной параметра цикла на единицу (в случае использования служебного слова To ), либо уменьшение переменной параметра цикла на единицу (в случае использования служебного слова Downto ).

Ладно, не расстраивайтесь, сейчас на примере станет понятнее. Давайте рассмотрим такую задачку: допустим, мы вводим с клавиатуры некоторое целое число и нам надо будет подсчитать сумму всех целых чисел от 1 до этого числа. Сейчас сразу напишу весь код программы, чтобы он был у вас перед глазами и объясню принцип решения.

program one; var i,N,Summa:integer; begin Summa:=0; write(‘N = ‘); readln(N); for i:=1 to N do Summa:=Summa+i; write(‘Сумма чисел = ‘,Summa); end.

  1. 0+1=1
  2. 1+2=3
  3. 3+3=6

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

Источник: program4you.ru

Циклы в Паскале

Информационные войны

3. Задача: Вывести на экран 5 раз «Hello». Решение: умеем составлять линейный алгоритм

program
program primer
primer 1;
1;
begin
begin
writeln(‘
writeln(‘ Hello’);
Hello’);
writeln(‘
writeln(‘ Hello
Hello ‘);
‘);
writeln(‘
writeln(‘ Hello
Hello ‘);
‘);
writeln(‘
writeln(‘ Hello
Hello ‘);
‘);
writeln(‘
writeln(‘ Hello
Hello ‘);
‘);
end.
end.
Неэффективная программа

4. Для записи повторяющейся последовательности операторов используют циклы

Program primer 1;
var i: integer;
begin
for i:=1 to 5 do
begin
writeln(‘Hello’);
end;
end.
Здесь переменная i запоминает сколько раз выполнилась повторяющаяся команда (тело цикла)

5.

Цикл – это повторяющаяся последовательность
операторов.
Циклы бывают арифметические и итерационные
Арифметический цикл – это такой цикл, число
повторений которого известно заранее. В Pascal такой
цикл обычно реализуется с помощью оператора for.
Итерационный цикл – это такой цикл, число
повторений которого заранее неизвестно и выход из
цикла производится в случае выполнения или
невыполнения какого-то условия. В Pascal такие циклы
обычно реализуются с помощью операторов while и
repeat

6. Цикл for

Принцип работы: Сначала счетчику цикла присваивается начальное значение. Если это
значение не больше конечного значения, то выполняется тело цикла. Затем значение
счетчика увеличивается на 1 и опять сравнивается с конечным значением. Если оно попрежнему не больше конечного значения, то оператор выполняется еще раз и так далее.
Замечание: если тело цикла состоит из одного оператора, то begin и end можно опустить

Читайте также:
Укажите ложное высказывание команды в программе отделяются друг от друга точкой с запятой имя

7.

Принцип работы: как и в первом случае, пока начальное
значение не меньше конечного значения, то выполняется
тело цикла. Затем значение счетчика уменьшается на 1

8. Задачи:

Решение
1) Написать программу, которая выводит на экран
все натуральные числа от 1 до n
2) Написать программу, которая подсчитывает сумму
натуральных чисел от 1 до n
3) Написать программу, которая считает xn
для вещественного x и натурального n
4) Написать программу, которая выводит на экран:
20 40 80 160 320
5) Написать программу, которая подсчитывает
произведение натуральных чисел от 1 до n

9.

Решение задач ОГЭ
Дан фрагмент программы. Чему будет равна
переменная s в результате работы данной
программы?
Решение:
В этой задаче есть цикл for. Тело цикла будет
выполняться 4 раза (при n=2,3,4,5).
s=2
n=2 s=2+2*2=6
n=3 s=6+3*2=12
n=4 s=12+4*2=20
n=5 s=20+5*2=30
Программа выводит значение переменной s, значит
на экране будет число 30
Ответ: 30

10. Решение задач ОГЭ

Задачи
Даны фрагменты программы. Что будет напечатано на экране в
результате работы данных
программ?

11. Задачи Даны фрагменты программы. Что будет напечатано на экране в результате работы данных программ?

Цикл While
(цикл с предусловием)

12. Цикл While (цикл с предусловием)

Задача: написать программу, которая выводит на
экран все натуральные числа от 1 до n
Решение: умеем составлять алгоритм с циклом for
Программа с циклом for
Program m1;
var i,n:integer;
begin
writeln(‘Введите n’);
readln(n);
for i:=1 to n do
write(i,’ ‘);
end.
Программа с циклом while
Program m2;
var i,n:integer;
begin
writeln(‘Введите n’); readln(n);
i:=1;
while i begin
write(i,’ ‘); i:=i+1;
end;
end.

13. Задача: написать программу, которая выводит на экран все натуральные числа от 1 до n Решение: умеем составлять алгоритм с циклом for

Задача: написать программу, которая
выводит на экран все натуральные числа от 1
до n истинно условие
Пока
i тело цикла:
1) вывод числа i
2) увеличиваем на единицу
значение i

14. Задача: написать программу, которая выводит на экран все натуральные числа от 1 до n

Общий вид цикла while
Цикл while организует выполнение тела цикла неизвестное заранее
число раз. Выход осуществляется, если условие окажется
ложным.
Принцип работы: перед каждым выполнением цикла анализируется
условие: если оно истинно, выполняется тело цикла и управление
передается на повторную проверку условия. Если условие ложно
– цикл завершается и управление передается на оператор,
следующий за циклом while.

15. Общий вид цикла while

Замечания:
Замечания
1)
2)
Если условие во время цикла не будет изменяться, то возможна
ситуация зацикливания, т.е. цикл не закончится никогда. Поэтому
внутри цикла должны находится операторы, приводящие к
изменению условия, чтобы цикл мог корректно завершиться
Если тело цикла состоит из одного оператора, то begin и end
можно опустить

16. Замечания:

Задачи:
Решение
1) Напечатать целые числа -10, -5, 0, 5…20
2) Найти произведение чисел из диапазона от A до B (A <=B) с шагом h
Вход: 1 15 5
Вход: 10 100 30
Выход: 66
Выход: 2800000
3) Для заданного натурального n и действительного x подсчитать сумму
Вход: 3
Вход: 2
Выход:
S Выход:
12 2142 32 .
n2 5
4) Напечатать таблицу перевода расстояний в дюймах в сантиметры для значений 10, 11, 12,…20 дюймов
(1 дюйм=2,54 см)
Выход:
10 дюймов=25,4 см
11 дюймов=27,94 см

20 дюймов=50,8 см

17. Задачи:

Решение
5) Напечатать все целые значения от A до B с шагом h.
Вход: 1 10 2
Вход: 5 20 5
Выход: 1 3 5 7 9
Выход: 5 10 15 20
6) Найти сумму чисел из диапазона от A до B с шагом 3.
Вход: 1 15
Вход: 0 10
Выход: 35
Выход: 18
7) Для заданного натурального n и действительного x подсчитать сумму
Вход: 3
Вход: 5
1 1
1
SВыход:
1 1.83
. Выход: 2.28
8) Напечатать
соответствия
между весом в фунтах и весом в килограммах для значений 5,10,15…
2 таблицу
3
n
50 фунтов (1 фунт=0,453 кг)
Выход:
5 фунтов=2,265 кг
10 фунтов=4,53 кг

50 фунтов=22,65 кг

18. Задачи:

Цикл repeat
(цикл с постусловием)

19.

Общий вид цикла
Принцип работы: выполняется тело цикла. Если
истинно, то выполнение цикла завершится.
Если ложно, то снова выполняется тело цикла

20.

Замечания:
1)
2)
т. к. условие завершения цикла проверяется в
конце цикла, то операторы тела цикла
выполнятся хотя бы один раз
В цикле repeat, так же как и в операторе while
возможна ситуация зацикливания в случае, если
всегда будет оставаться ложным

21. Цикл repeat (цикл с постусловием)

Задача: написать программу, которая выводит на
экран все натуральные числа от 1 до n
Программа с циклом while
Program m2;
var i,n:integer;
begin
writeln(‘Введите n’); readln(n);
i:=1;
while i begin
write(i,’ ‘); i:=i+1;
end;
end.
Программа с циклом repeat
Program m3;
var i,n:integer;
begin
writeln(‘Введите n’); readln(n);
i:=1;
repeat
write(i,’ ‘);
i:=i+1;
until i>n
end.

22. Общий вид цикла

Задачи:
1) Напечатать все целые значения от A до B с шагом h.
Вход: 1 10 2
Вход: 5 20 5
Выход: 1 3 5 7 9
Выход: 5 10 15 20
2) Для заданного натурального n и действительного x подсчитать
2
2
2
2
S
1
2
3
.
n
сумму
Вход: 3
Вход: 2
Выход: 14
Выход: 5
3) Для заданного натурального n и действительного x подсчитать
1 1
1
S
1
.
сумму
2 3
n
Вход: 3
Вход: 5
Выход: 1.83
Выход: 2.28
Решение

Источник: ppt-online.org

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru