Тип переменных для параметра for. Циклы с параметрами. Примеры заданий с решением

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

Синтаксис:

For (инициализация ; условие ; модификация ) { Инструкции тела цикла; }

Если в теле цикла одна инструкция, то { } можно опустить. Переменная-параметр цикла (счетчик) может быть любого числового типа. Это делает цикл for C++ таким же универсальным, как и цикл типа while . В разделе модификации чаще всего используется операция постфиксного или префиксного инкремента (или декремента), но может использоваться любое выражение с присваиванием, изменяющее значение параметра цикла. Цикл работает следующим образом:

  • В начале происходит описание и инициализация переменной-счетчика
  • Далее проверка условия: если выражение имеет значение true , произойдет итерация
  • После выполнения инструкций тела цикла производится модификация величины счетчика

Примечание : в C++ является правилом делать описание переменной-счетчика в заголовке цикла. Но это не обязательно, тем более, если планируется инициализировать несколько переменных в разделе инициализации так, как это реализовано в программе 9.2. Однако, использование описания переменной-счетчика в заголовке цикла приводит к описанию локальной переменной, уничтожаемой автоматически при завершении работы цикла. Поэтому, без крайней необходимости, описание переменной-счетчика вне цикла for производить не следует.
В процессе работы цикла for не рекомендуется изменять операнды в выражениях заголовка цикла – это приведет к разного рода ошибкам! Но сами значения переменных (или констант), в том числе изменяемые значения (счетчик), использовать можно. Рассмотрим классический пример.

Программа 9.1 Дано натуральное число N. Вывести все делители этого числа.

#include << "N = "; cin >> N; for (int i = 2; i < N / 2; i++) { if (N % i == 0) cout << i << " "; } return 0; } N = 16000 2 4 5 8 10 16 20 25 32 40 50 64 80 100 125 128 160 200 250 320 400 500 640 800 1000 1600 2000 3200 4000

Использование инструкции continue в цикле for

При использовании инструкции continue в цикле for необходимо учитывать особенности работы этого цикла:

  • Инструкции, следующие после continue , будут пропущены
  • Затем происходит модификация счетчика
  • Переход к выполнению следующей итерации (иначе, проверки условия)

Покажем это на примере: int main() { for (int i = 1; i < 20; i++) { if (i % 2 == 0) continue; cout << i << " "; } 1 3 5 7 9 11 13 15 17 19

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

Int main() { for (int i = 1; i < 20; i += 2) cout << i << " ";

Несколько выражений в разделе инициализации и модификации

Как мы уже отметили ранее в заголовке инструкции for должно быть три раздела. Выражения, находящееся в этих разделах, можно опускать, но нельзя опускать ";" . В конце концов, можно оставить только; . Заголовок в виде:

For (;;) { ... }

является заголовком “бесконечного” цикла. (Выход из цикла должен программироваться внутри тела цикла).
C++ поддерживает несколько выражений в разделах инициализации и модификации в заголовке инструкции for . При этом условие продолжения цикла должно быть одно!
Например. Постановка задачи: Вычислить факториал числа, не превосходящий 20.
Программа 9.2

#include using namespace std; int main() { unsigned long long n; int i, k; cout << "k = "; cin >> k; // 0 <= k <= 20 for(n = 1, i = 1; i <= k; n *= i, ++i); cout << k << "! = " << n << endl; return 0; } k = 20 20! = 2432902008176640000

Примечание : обратите внимание, что поток вывода в строке 12 не относится к телу цикла! (В конце заголовка – ;). Таким образом, данный цикл в теле имеет пустую инструкцию, а все выражения вычисляются в заголовке. Программа 9.2 правильно вычисляет факториал числа от 0 до 20 .

Цикл for основанный на диапазоне (range-based for)

Для перебора элементов массива или контейнера приходится выполнять однотипные действия, при этом использовать громоздкий код. Для упрощения работы с контейнерами в C++ существует специальная форма цикла for – range-based for (цикл for основанный на диапазоне или диапазонный for).
Синтаксис :

For (объявление : имя_последовательности ) loop_statement

Использование range-based for на примере C-массива:
Программа 9.3

#include using namespace std; int main() { int x { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (auto &s: x) { cout << s << " "; } return 0; }

Чтобы элементы массива можно было изменять – переменная s должна быть ссылочной переменной (как в примере выше). Если переменная не является ссылкой, то данные будут копироваться. Для автоматического выведения типа в этом цикле используется спецификатор auto . range-based for имеет ограничение на работу с динамическими массивами: он не поддерживает изменение размера массива, так как содержит фиксированный указатель конца массива. При работе с массивами, имеющими фиксированный размер, диапазонный for является прекрасной и безопасной альтернативой обычному for .

Вложенные циклы for

Так же, как и другие инструкции циклов, for поддерживает структуру вложенных циклов. Применение вложенных циклов for для организации ввода и вывода двумерных массивов выглядит гораздо компактнее, чем при использовании цикла while .
Однако, при решении задач обхода таких массивов, необходимо избегать применение условной инструкции if . Зачастую, задачу можно реализовать более рационально, путем манипуляции индексами (переменными цикла i и j). То есть, поставить в зависимость изменение одного индекса, от значения величины другого. Рассмотрим два примера.
Программа 9.4 Дана квадратная матрица размера n, элементы которой равны 0. Заполнить элементы, лежащие ниже и на самой главной диагонали единицами.

#include using namespace std; int main() { int n; cout << "n = "; cin >> n; int mas[n][n]; // Заполняем нулями for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) mas[i][j] = 0; // Реализация for(int i = 0; i < n; i++) for(int j = 0; j <= i; j++) mas[i][j] = 1; // Вывод for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { cout.width(2); cout << mas[i][j]; } cout << "\n"; } return 0; } n = 10 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1

Программа 9.5 Составить программу заполнения массива числами треугольника Паскаля и вывода этого массива. Треугольник паскаля имеет вид:


В этом треугольнике на вершине и по бокам стоят единицы (в программе 9.5 треугольник “положен на бок” – стороны треугольника: первый столбец и главная диагональ). Каждое число равно сумме двух чисел, расположенных над ним. Строки треугольника симметричны относительно вертикальной оси и содержат биноминальные коэффициенты.

#include using namespace std; int main() { int n; cout << "n = "; cin >> n; int pas[n][n]; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) pas[i][j] = 0; pas = 1; for (int i = 1; i < n; i++) { pas[i] = 1; for (int j = 1; j <= i; j++) { pas[i][j] = pas + pas[j]; } } for (int i = 0; i < n; i++) { for (int j = 0; j <= i; j++) { cout.width(4); cout << pas[i][j]; } cout << "\n"; } return 0; } n = 12 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 1 10 45 120 210 252 210 120 45 10 1 1 11 55 165 330 462 462 330 165 55 11 1

Вопросы
  1. Может ли быть заменена в программе инструкция цикла for на инструкцию цикла while? Всегда ли это можно сделать?
  2. Когда удобнее применять для организации циклов инструкцию for? while?
  3. Возможны ли в заголовке инструкции for следующие выражения: a) for (;a > b && !(a % 2);) b) for (a > b;;) c) for (;;i = 0) d) for (;i = 0;) e) for (;;i++, --b) f) for (--i;;) g) for (b = 0; b != a;) ?
  4. Переменная i – параметр внешнего цикла, а j – вложенного. Доступна ли будет переменная j во внешнем цикле? i во вложенном цикле?
Учебник
Домашняя работа
  1. Зад. 29. Напишите программу, в которой вводятся натуральные числа a и b , а на дисплей выводятся все простые числа в диапазоне от a до b (идея алгоритма Программа 8.5)
  2. Зад. 30. Совершенным называется число, равное сумме всех своих делителей, меньших его самого (например, число 6 = 1 + 2 + 3). Напишите программу, которая вводит натуральное число N и определяет, является ли число N совершенным.
  3. Напишите программу, которая выводит на экран квадратную числовую таблицу размера n x n , имеющую следующий вид при n = 10: 1 * * * * * * * * * * 2 * * * * * * * * * * 3 * * * * * * * * * * 4 * * * * * * * * * * 5 * * * * * * * * * * 6 * * * * * * * * * * 7 * * * * * * * * * * 8 * * * * * * * * * * 9 * * * * * * * * * * 10
Литература
  1. Лафоре Р. Объектно-ориентированное программирование в C++ (4-е изд.). Питер: 2004
  2. Прата, Стивен. Язык программирования C++. Лекции и упражнения, 6-е изд.: Пер. с англ. - М.: ООО «И.Д. Вильяме», 2012
  3. Липпман Б. Стенли, Жози Лажойе, Барбара Э. Му. Язык программирования С++. Базовый курс. Изд. 5-е. М: ООО “И. Д. Вильямс”, 2014
  4. Эллайн А. C++. От ламера до программера. СПб.: Питер, 2015
  5. Шилдт Г. С++: Базовый курс, 3-изд. М.: Вильямс, 2010



Особенное место в Turbo Pascal занимают циклы. Их начинают изучать сразу же после отработки навыков ввода-вывода информации на экран. Ведь большинство задач сводится к тому, что циклы с параметром и другие конструкции помогают облегчить написание и функционирование определенного блока программы.

Разновидности циклов

Всего различают три разновидности:

  • с параметром,
  • с предусловием,
  • с постусловием.

Циклы с параметром, иначе их называют For … to … do или For … downto …. do, многократно повторяют определенную последовательность действий. В принципе, и другие разновидности используются с этой же целью, только в for-цикле заранее известно количество шагов.

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

Основные определения по теме

Циклы с параметрами - многократно повторяющиеся итерации. Счетчик - основной показатель, с помощью которого выполняется заданная конструкция. Границы промежутка показывают, в каких пределах будут выполняться те или иные итерации. Кстати, совершенно не обязательно, чтобы начальное значение было равно 1. Пользователь самостоятельно задает обе границы промежутка. Тело цикла - набор команд, для которых уже определено количество повторений.

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

For … to … do: алгоритм работы, синтаксис

Как уже было сказано, циклы с параметром используются в задачах, в которых указан «промежуток», в котором предстоит работать. Так, это может быть массив чисел, дней недели, строк стихотворения и т. д.

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

for исх.переменная := граница 1 to граница 2 do

тело цикла ;

Здесь: исх. переменная объявляется пользователем в начале программы или блока; граница 1 и граница 2 - начальное и конечное значение промежутка; в теле цикла прописывается ряд действий, которые должны выполняться программой. Необходимо помнить, что если тело цикла содержит всего 1 команду, тогда операторные скобки begin…end можно опустить. В таком варианте конструкции счетчик, а именно <исх.переменная>, будет увеличиваться с шагом, равным 1.

for исх.переменная := граница 1 downto граница 2 do

тело цикла ;

Здесь же исх. переменная будет уменьшаться с шагом, равным 1.

Схема работы цикла с параметром For … to … do будет выглядеть следующим образом:

  • Задается значение верхней границы промежутка, т. е. граница 2 .
  • Исх.переменной присваивается значение параметра граница 1 .
  • Проходит проверка условия: исх.переменная ≤ граница 2 .
  • При получении результата True (Истина ) выполняется тело цикла.
  • Счетчик увеличивается на шаг, равный 1.
  • Выполнение пунктов 3-5 происходит ровно до того момента, пока условие истинно: исх.переменная > граница 2 . Как только это произошло, происходит выход из цикла и управление передается команде, следующей за данной конструкцией.

В For … downto … do алгоритм работы схож с вышеуказанным, за исключением некоторых пунктов:

  • В 3-м пункте проверяется условие: исх.переменная ≥ граница 2 .
  • В 5-й строчке алгоритма счетчик уменьшается на 1.
  • В 6-м пункте команды 3-5 будут выполняться до тех пор, пока не будет удовлетворено условие: исх.переменная < граница 2.

Все остальное аналогично в обоих алгоритмах работы.

Блок-схема цикла с параметром

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

Основные требования к циклу с параметром

Циклы с параметрами требуют определенного рода условий.

  • Счетчик и границы промежутка (т. е. исх.переменная, граница 1 и граница 2) должны принадлежать одному типу данных. Если имеется лишь совместимость между начальным и конечным значениями отрезка и исходной переменной, то программа может повести себя неправильно, поскольку границы будут преобразованы по типу данных исходного параметра.
  • Тип данных, которому должны принадлежать значения параметров, должен быть целочисленным. Крайне не рекомендуется использовать вещественный тип.
  • Изменять значение параметра исх.переменная в теле цикла принудительно нежелательно. Иначе пользователь с трудом сможет отследить возможные появившиеся ошибки.
  • В отличие от других видов циклов, в For … to … do илиFor … downto … do шаг не может менятьсяна параметр, отличный от 1.

Turbo Pascal: как выйти из цикла

Нередко встречаются задачи, в которых происходит зацикливание, т. е. проверяемое условие всегда истинно. Процедура Break помогает выйти из циклов с предусловием, постусловием, параметром. Т. е. их работа прекращается досрочно.

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

Процедура Exit необходима для того, чтобы завершить работу того или иного блока в программном коде. Ее вызывают внутри процедуры (функции) и в тот же момент, исполнение этого «куска» немедленно прекращается. Если же Exit находится в основном блоке программы, тогда она завершает свою работу.

Процедура Halt сводит принцип функционирования к следующему: полностью оканчивается работа программы.

Примеры заданий с решением

Пользователю будет полезно после изучения темы «Циклы с параметром в паскале» примеры сначала изучить, а затем тренироваться писать код самостоятельно. Простые задачи помогают будущему программисту узнавать теорию в практике, а затем успешно ее применять. По теме «Циклы с параметром» примеры задач с решением можно найти легкие и сложные. Здесь представлены 3 задачи, в которых разбираются алгоритмы работы и даются пояснения и комментарии к каждому решению.

Задача 1

Дан двумерный массив натуральных чисел в диапазоне , выбранных случайно. Найти количество всех двузначных чисел, сумма цифр которых кратна 2.

Алгоритм действий:

  1. Создать двумерный массив.
  2. Проверить каждое число на соответствие условиям:

a) если 9 < Х < 100, то разделить его нацело на 10 посредством div;

b) выделить вторую цифру числа посредством деления через mod;

c) сложить выделенные цифры;

d) поделить посредством mod заданную сумму на 2;

e) если результат будет равен 0, то счетчик увеличивается на 1.

Задача 2

Дан одномерный массив целочисленных элементов. Найти количество положительных чисел.

Алгоритм действий:

  1. Создать массив целочисленных элементов, созданных посредством randomize.
  2. В цикл с параметром вложить IF, который будет проверять заданный элемент на соответствие условию: Х>0.
  3. Если условие выполняется, то счетчик увеличивается на 1.
  4. После цикла следует вывести на экран получившееся значение счетчика.

Данные, указанные в скобках {}, являются комментариями. В строке 11 можно вывести массив на экран двумя способами: оставить пробел между числами либо отвести под каждый элемент определенное количество ячеек (в данном случае их 5).

В строке 12 переменную counter можно увеличить также двумя способами: либо к предыдущему значению прибавить 1, либо воспользоваться стандартной функцией Inc.

Задача 3

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

Пояснения:

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

Алгоритм действий:

  1. Создать квадратную матрицу.
  2. Присвоить переменной, ответственной за подсчет положительных элементов, значение «0».
  3. Составить цикл по созданию квадратной матрицы.
  4. Организовать цикл по проверке условия: если число на главной диагонали >0, тогда счетчик увеличивается на 1.
  5. После окончания действия цикла на экран вывести значение переменной, хранящей количество положительных элементов.

Противостояние двух языков программирования: С и Turbo Pascal

Как правило, уважающий себя программист знает несколько языков. К примеру, это могут быть С++, Turbo Pascal, Delphi, Java и т. д. Противостояние двух из них было ярко выражено еще в 80-е гг. (С и турбо паскаль). В конце ХХ века такая же борьба наблюдалась между Си++ и Java.

В виртуальном пространстве среди трех десятков языков программирования можно выделить три самые яркие пары, противостояние которых поражало величайшие умы киберпространства: алгол-60 и фортран, Pascal и C, Java и С++. Конечно, эти ощущения субъективные, но в тот или иной период один из пары был лидером. Это объяснялось требованиями промышленности и необходимости в том или ином программном продукте. В 70-х гг. «управлял миром» фортран, в 80-х - Turbo Pascal, в 90-х - С++. Конечно, ни один из них не «умер». Скорее, они преобразовались в усовершенствованные программные продукты.

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

Интересно, что разработчики Turbo Pascal (Старый Свет) пользовались результатами наработок американских ученых, в то время как в Новом Свете активно применяли итоги исследований европейских специалистов. В Европе разработчики ратуют в большей степени за чистоту и компактность языков программирования, а американские умы склоняются больше к использованию новомодных веяний в написании кода.

Цикл с параметром имеет следующий формат:

for (инициализация; выражение; модификации) оператор;

Инициализация используется для объявления и присвоения начальных значений величинам, используемым в цикле. В этой части можно записать несколько опе­раторов, разделенных запятой (операцией «последовательное выполнение»), на­пример, так:

for (int i = 0, j = 2; ...

for (k = 1, m = 0; ...

Областью действия переменных, объявленных в части инициализации цикла, яв­ляется цикл 1 . Инициализация выполняется один раз в начале исполнения цикла.

Выражение определяет условие выполнения цикла: если его результат, приве­денный к типу bool , равен true, цикл выполняется. Цикл с параметром реализо­ван как цикл с предусловием.

Модификации выполняются после каждой итерации цикла и служат обычно для изменения параметров цикла. В части модификаций можно записать несколько операторов через запятую. Простой или составной оператор представляет собой тело цикла. Любая из частей оператора for может быть опущена (но точки с запя­той надо оставить на своих местах!).

Пример (оператор, вычисляющий сумму чисел от 1 до 100):

for (Int i = 1, s = 0; 1<=100; i++) s += i;

Пример (программа печатает таблицу значений функции у=х 2 +1 во введенном диапазоне):

#Include

float Xn, Xk, Dx, X;

printf (“Введите диапазон и шаг изменения аргумента: ");

scanf (“%f%f%f”, &Xn, &Xk, &Dx);

printf (“| X | Y |\n");

for (X = Xn; X<=Xk; X+=Dx)

printf (" | %5.2f | %5.2f |\n”, X*X + 1);

Пример (программа находит все делители целого положительного числа):

#Include Int main(){

Int num, half, div;

cout << “\n Введите число: "; cin >> num;

for (half = num / 2, div = 2; div <= half; div++)

if (!(num %div))cout << div <<"\n";

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

Любой цикл while может быть приведен к эквивалентному ему циклу for и на­оборот по следующей схеме:

for (b1: b2; bЗ) оператор b1;

while (b2){ оператор; bЗ;}

Часто встречающиеся ошибки при программировании циклов - использование в теле цикла неинициализированных переменных и неверная запись условия вы­хода из цикла.

q проверить, всем ли переменным, встречающимся в правой части операторов присваивания в теле цикла, присвоены до этого начальные значения (а также возможно ли выполнение других операторов);


q проверить, изменяется ли в цикле хотя бы одна переменная, входящая в усло­вие выхода из цикла;

q предусмотреть аварийный выход из цикла по достижению некоторого коли­чества итераций;

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

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

Оператор do while обычно используют, когда цикл требуется обязательно выпол­нить хотя бы раз (например, если в цикле производится ввод данных).

Оператором whiIe удобнее пользоваться в случаях, когда число итераций заранее не известно, очевидных параметров цикла нет или модификацию параметров удобнее записывать не в конце тела цикла.

Оператор for предпочтительнее в большинстве остальных случаев (однознач­но - для организации циклов со счетчиками).

выражение1 и выражение2 - начальное и конечное значение параметра цикла.

Действие оператора цикла типа to (прямой счет):

2. проверяется условие: значение переменной больше значения выражения2?

3. если да, то цикл прекращается; если нет, то выполняется оператор, значение переменной увеличивается на единицу и далее действие повторяется, начиная с пункта2.

Действие оператора цикла типа downto (обратный счет):

1. переменной присваивается значение выражения1;

2. проверяется условие: значение переменной меньше значения выражения2?

3. если да, то цикл прекращается; если нет, то выполняется оператор, значение переменной уменьшается на единицу и далее действие повторяется, начиная с пункта 2.

Правила:

1. Параметром цикла может быть только целая переменная.

2. Параметр цикла не может явным образом меняться в теле цикла.

Например:

for i:=1 to 10 do

i:=i+1; {неверно}

3. Шаг цикла может быть равен только +1 (цикл с to) или –1 (цикл с downto).

4. В соответствии с общим видом тело цикла должно состоять из одного оператора, если операторов несколько, используем составной оператор и операторные скобки begin..end;.

5. Цикл может не выполниться ни одного раза.

Задание : Написать блок-схему и программу для расчета среднего значения n введенных с клавиатуры чисел.

var i,n: integer; x,s: real;

write(‘Введите кол-во чисел’);

for i:=1 to n do

write(‘Введите число номер’,i);

writeln(‘Среднее значение =’,s/n);

Оператор цикла с предусловием (while)

Оператор цикл while – это оператор цикла с заранее неизвестным числом повторений.

Общий вид:

while логическое выражение do оператор;

логическое выражение - это условие продолжения цикла.

оператор

Действие оператора:

1. вычисляется логическое выражение;

2. если оно истинно, то выполняется оператор, после чего все действия повторяются, начиная с пункта 1;

3. eсли логическое выражение - ложно, то цикл прекращается.

Правила:

1. Тело цикла должно состоять только из одного оператора, если их несколько используем составной оператор.

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

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

Например:

while a<100 do

Задание. Написать блок-схему и программу, которая вычисляет и выводит на печать таблицу значений функции .

var x,xn,xk,y,h: real;

writeln("Введите начальное, конечное значение х и шаг изменения х");

writeln("| x | y |");

while x<=xk do

writeln("|",x:7:2,"|",y:7:2,"|");

Оператор цикла с постусловием (цикл repeat..until).

Оператор цикла repeat..until - это оператор цикла с заранее неизвестным количеством повторений.

Общий вид:

операторы;

until логическое выражение;


Действие оператора цикла repeat..until:

Операторы в теле цикла выполняются до тех пор, пока значение логического выражения FALSE; как только логическое выражение принимает значение TRUE, выполнение оператора цикла прекращается.

Правила:

1. Тело цикла всегда выполняется хотя бы один раз, так как условие стоит в конце цикла.

2. В этом операторе цикла нет надобности в составном операторе, все операторы в теле цикла ограничиваются ключевыми словами repeat..until.

Задание. Написать блок-схему и программу для вычисления .

program rep_unt;

var n,k,s: integer;

write("Введите k");

write("Суммаравна ",s);

Массивы данных

Массив – это совокупность упорядоченных данных, имеющих одинаковое имя и тип, и отличающихся друг от друга номером (индексом). Массивы бывают одномерные и многомерные. Примеры массивов:

2 5 –15 10 20 – массив целого типа из 6 элементов;

2.3 9 2.45 4.78 5.32 – массив вещественного типа из 5 элементов;

Иванов Иван Иванович – массив символов из 20 элементов;

Общий вид описания одномерных массивов:

var имя массива: array[начальное значение индекса.. конечное значение индекса] of тип;

где начальное значение индекса и конечное значение индекса - целые значения, задающие диапазон изменения индекса массива.

Например:

var vector: array of real;

Общий вид описания многомерных массивов:

var имя массива: array[начальное значение индекса.. конечное значение индекса, ... , ...] of<тип>;

Например:

varmatrix: array ofinteger; - описание матрицы размером 3´5.

Доступ к элементам массива.

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

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

Например:

a[i], b, v1, a

БАЗЫ ДАННЫХ

Понятие базы данных

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

Такого рода информационная система требует создания в памяти ЭВМ динамически обновляемой модели рассматриваемой предметной области с использованием единого хранилища – базы данных (БД). Предметная область – часть реального мира, подлежащая изучению с целью организации управления и, в конечном счете, автоматизации. В состав каждой предметной области входит совокупность каких-либо объектов . Группы этих объектов , объединенных по какому-либо группировочному признаку , принято называть сущностями . Например, если речь идет об учете продукции на складе, то можно выделить сущности "товар ", "покупатель ", "накладная ". Объектами будут их конкретные представители, например, сахар , ОАО "Гефест" , накладная №252 .

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

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

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

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

Структура таблицы "Покупатель".

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

Такие базы данных называются реляционными (от relation – связь, отношение). Реляционная база данных представляет собой множество взаимосвязанных таблиц , каждая из которых содержит информацию об объектах определенного типа.

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

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

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

Отношение один-к-одному имеет место, когда одной записи в родительской табли­це соответствует не более одной записи в дочерней таблице.

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

Связанные отношениями таблицы взаимодействуют по принципу главная (master) – подчиненная (detail). В нашем примере таблица "Покупатель" – главная , а таблица "Отпущено товаров" – подчиненная . Главную таблицу также часто называют родительской , а подчиненную дочерней . Одна и та же таблица может быть главной по отношению к одной таблице базы данных и дочерней по отношению к другой.

Системы управления базами данных (СУДБ). Классификация

Для работы с данными используются системы управления базами данных (СУБД) . СУБД – это программные средства, предназначенные для определения данных (описания структуры баз данных – таблиц, связей), обработки и управления данными. ПримерыСУБД – FoxPro, Oracle, SQL-Server, Delphi, dBase, Clipper, MS Access идр.

Различают три основных вида СУБД: промышленные универсального назначения , промышлен­ные специального назначения и разрабатываемые для конкретного заказчика (заказные) .

Специа­лизированныеСУБД создаются для управления базами данных конкретного назначе­ния – бухгалтерские, складские, банковские и т.д.

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

В отличие от промышленныхСУБДзаказные в максимальной степени учиты­вают специфику работы заказчика (того или иного предприятия), их интерфейс обыч­но интуитивно понятен пользователям и не требует от них специальных знаний. С другой стороны, специализированные и универсальныепромышленныеСУБД относительно деше­вы, достаточно надежны (отлажены) и готовы к немедленной работе, в то время как заказныеСУБД требуют существенных затрат, а их подготовка к работе и отладка занимают значительный период времени (от нескольких месяцев до нескольких лет).

В зависимости от расположения СУБД различают локальные и распределенные (клиент-серверные ) СУБД. Все части локальной СУБД размещаются на компьютере пользо­вателя базы данных. Если к одной БД по компьютерной сети обращаются несколько пользователей одновре­менно, каждый пользовательский компьютер должен иметь свою копию локальной СУБД. В отличие от этого значительная часть программно-аппаратных средств рас­пределенной СУБД централизована и находится на одном достаточно мощном ком­пьютере (сервере), в то время как компьютеры пользователей несут относительно небольшую часть СУБД, которая называется клиентом. Локальные СУБД могут рабо­тать в сети, но могут и не использовать ее, в то время как распределенные СУБД обязательно работают в компьютерной сети .

Заметим, что местона­хождение собственно базы данных никак не влияет на специфику СУБД: в локальных СУБД сама база данных может располагаться как на компьютере пользователя, так и на уда­ленном сетевом компьютере (файл-сервере).

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

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

Основные функции, выполняемые СУБД:

Управление данными во внешней памяти (на дисках);

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

- журнализация изменений и восстановлениебазы данных после сбоев;

Поддержание языков баз данных (язык определения данных – язык SDL, язык манипулирования данными – язык DML, или единый интегрированный язык, содержащий все необходимые средства для работы с БД – язык структурированных запросов SQL).

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

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

Здесь for, to, do - зарезервированные слова (для, до, выполнить);

<пар. цикла> - параметр цикла – переменная целочисленного типа (типа integer);
<нач. знач.> - начальное значение - число или переменная целочисленного типа (типа integer);
<кон. знач.> - конечное значение - число или
переменная целочисленного типа (типа integer);
<оператор> - произвольный оператор Паскаля.

Пример: For i:=1 to n do <оператор>
здесь i - параметр цикла
1 - начальное значение
n - конечное значение
Если в теле цикла используется несколько операторов, тогда, используются операторные скобки: begin ... end.
При выполнении оператора for вначале вычисляется выражение <нач.знач.> и осуществляется присваивание его значения переменной цикла <пар.цикла> := <нач. знач.>. Далее сравниваются <пар.цикла> и <кон.знач.>. До тех пор, пока они не станут равными будет выполняться оператор (операторы). Значение переменной цикла <нач.знач> автоматически увеличивается на единицу в ходе выполнения цикла. Надо сразу заметить, что задать шаг цикла, отличный от 1 в этом операторе нельзя.
Пример:
Возможны такие записи оператора цикла:

1) for i:= 1 to n do s1;

2) for i:= 3 to 10 do s1;

3) for i:= a to b do s1;

4) for i:= a to b do
begin

s1;
s2;
...
sn

end;

Здесь s1, s2, s3, ... sn - операторы цикла.

Пример:
Составить программу вывода на экран чисел от 1 до 10.

Пример:
Составить программу вычисления факториала числа n, т. е. n!. (0! = 1)

Объяснение программы:
Переменная n - для вводимого пользователем числа, факториал которого надо найти; f - переменная, в которой будет "накапливаться" значение факториала числа n; i - переменная цикла.
Устанавливается первоначальное значение переменной f:= 1.
Далее начинается цикл. Переменной i присваивается начальное значение 1; оно сравнивается с конечным - n (1 <= n), если условие истинно, тогда выполняется оператор (в этой программе он один): f:= f*i, 1*1=1; значение переменной цикла увеличивается на 1, т. е. станет равным: i:= i + 1, 1 + 1 = 2 и цикл повторяется.
Когда значение i станет равным n, тогда цикл выполнится последний раз, потому что следующее значение i будет n + 1, что больше конечного значения n, условие i <= n - ложно, цикл не выполняется.

Существует другая форма оператора цикла For:
Формат записи цикла:

Замена зарезервированного слова to на downto означает, что шаг параметра цикла равен (-1).
Изменение значения параметра идет от большего значения к меньшему, т. е. <нач. знач.> <кон. знач.>.

Пример:
Возможны такие записи оператора цикла:

1) for i:= n downto 1 do s1;

2) for i:= 10 downto 3 do s1;

3) for i:= b downto a do s1; (при условии, что b>a)

4) for i:= b downto a do
begin

S1;
s2;
...
sn

end; (при условии, что b>a)

Здесь s1, s2, s3, ... sn - операторы цикла.

Пример: Программу вычисления факториала числа можно составить, используя этот оператор цикла.


Задачи

  1. Даны 10 чисел, вывести те из них, которые являются полными квадратами.
  2. Даны 10 чисел, найти их произведение. Составить блок-схему и программу.
  3. Даны 10 чисел, найти сумму четных. Составить блок-схему и программу.
  4. Даны 10 чисел, найти количество отрицательных. Составить блок-схему и программу.
  5. Даны n действительных чисел. Найти максимум и минимум. Составить блок-схему и программу.
  6. Даны n действительных чисел. Найти среднее арифметическое всех элементов. Составить блок-схему и программу.
  7. Даны n действительных чисел. Найти среднее арифметическое отрицательных и положительных элементов. Составить блок-схему и программу.
  8. Даны n натуральных чисел. Найти сумму и произведение элементов, кратных 3 и 5. Составить блок-схему и программу.
  9. Даны n натуральных чисел. Вывести те числа, значения которых являются степенями двойки (1, 2, 4, 8, 16, ...). Составить блок-схему и программу.
  10. Даны n натуральных чисел. Вывести те числа, значения которых находятся в отрезке . Составить блок-схему и программу.
  11. Даны n натуральных чисел. Вывести на экран те числа, значения которых являются квадратами какого-либо числа. Составить блок-схему и программу.
  12. Дано натуральное число n. Найти n 2. Составить блок-схему и программу.
  13. Даны натуральные числа a, n. Найти a n. Составить блок-схему и программу.
  14. Дано натуральное число n. Определить его разрядность, цифру старшего разряда числа увеличить на 2
  15. Дано натуральное число n. Поменять местами первую и последнюю цифры числа
  16. Дано натуральное число n. Цифры числа, кратные 2 заменить на 0.
  17. Дано натуральное число n. Цифры числа, кратные 3 заменить на 1.
  18. Дано натуральное число n. Вычислить произведение (2n-1)*(3n-1)*(4n-1)*...*(10n-1). Составить блок-схему и программу.
  19. Вычислить сумму 2+4+6+...+100. Составить блок-схему и программу.
  20. Дано натуральное число n, действительное x. Вычислить произведение x+x/2+x/3+...+x/n. Составить блок-схему и программу.
  21. Дано натуральное число n. Вычислить P=(1-1/2)(1-1/3)...(1-1/n), где n>2. Составить блок-схему и программу.
  22. Дано натуральное число n. Вычислить P=(1+x)/n+(2+x)/(n-1)+...+(n+x)/1. Составить блок-схему и программу.
  23. Даны n натуральных чисел. Вычислить сумму ряда 1+x/1!+x 2 /2!+x 3 /3!+ ... +x n /n!. Составить блок-схему и программу.


Просмотров