Программирование. Циклы с параметром. Массивы. Операторы цикла с параметром (for) Цикл с параметром описание
В большинстве программ встречается необходимость многократного выполнения некоторого оператора (или блока операторов). Для организации подобного рода конструкций могут использоваться операторы цикла. В языке программирования Паскаль используются следующие виды операторов цикла: for, while, repeat (в PascalABC.NET используется также оператор цикла foreach ).
Блок операторов, который необходимо выполнить многократно называется телом цикла.
Оператор for в Паскаль
Если число повторений тела цикла заранее известно, то используется оператор цикла for , который также часто называют оператором цикла с параметром.
Оператор for состоит из двух частей: тела цикла и заголовка, который предназначен для описания начального и конечного значений параметра цикла, а также варианта его изменения.
В зависимости от направления изменения параметра цикла (возрастание - to или убывание - downto ) в языке Паскаль оператор цикла for может быть записан в одной из двух форм:
- for параметр := нач_знач to кон_знач do
- оператор;
- for параметр := нач_знач downto кон_знач do
- оператор;
Переменная-параметр цикла может принимать любой порядковый тип . При этом начальное и конечное значения должны иметь тип совместимый с типом переменной-параметром.
Рассмотрим работу цикла for .
Перед началом выполнения оператора цикла вычисляются начальное значение, присваиваемое переменной-параметру, и конечное значение. Затем, циклически выполняются следующие операции:
- Сравнивается текущее значение параметра с конечным значением.
- Если условие параметр кон_знач истинно, то выполняется тело цикла, в противном случае оператор for завершает работу и управление передается оператору, следующему за циклом.
Внимание: в языке Паскаль параметр цикла, вне зависимости от возрастания или убывания, всякий раз изменяется на единицу.
Задача. Вывести на экран список квадратов целых чисел от 10 до 1.
Решение. В поставленной задаче параметр цикла убывает.
{Фрагмент кода программы}
- for i:= 10 downto 1 do
- writeln(i:2, " ", i * i);
Внимание: если в теле цикла необходимо использовать более одного оператора, то применяется составной оператор (операторные скобки begin и end ).
Пример 2. Известны оценки абитуриента на четырех экзаменах. Определить сумму набранных им баллов.
Задача. Известны оценки абитуриента на четырех экзаменах. Определить сумму набранных им баллов.
Решение. Будем использовать в программе оператор цикла с параметрами, так как известно количество повторений выполняемых действий (абитуриент получил ровно четыре отметки)
{Фрагмент кода программы}
- s:= 0;
- for i:= 1 to 4 do
- begin
- readln(mark);
- s:= s + mark;
- writeln(s);
выражение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 реализует алгоритмическую структуру цикл с параметром (или цикл со счетчиком). Цикл for применяется в том случае, когда в программе, прежде выполнения инструкций цикла, становится известным (или заранее определено) количество шагов этого цикла. В блок-схеме инструкция for изображается следующим образом:
Синтаксис:
For (инициализация ; условие ; модификация ) { Инструкции тела цикла; }
Если в теле цикла одна инструкция, то { } можно опустить. Переменная-параметр цикла (счетчик) может быть любого числового типа. Это делает цикл for C++ таким же универсальным, как и цикл типа while . В разделе модификации чаще всего используется операция постфиксного или префиксного инкремента (или декремента), но может использоваться любое выражение с присваиванием, изменяющее значение параметра цикла. Цикл работает следующим образом:
- В начале происходит описание и инициализация переменной-счетчика
- Далее проверка условия: если выражение имеет значение true , произойдет итерация
- После выполнения инструкций тела цикла производится модификация величины счетчика
Примечание
: в C++ является правилом делать описание переменной-счетчика в заголовке цикла. Но это не обязательно, тем более, если планируется инициализировать несколько переменных в разделе инициализации так, как это реализовано в программе 9.2. Однако, использование описания переменной-счетчика в заголовке цикла приводит к описанию локальной переменной, уничтожаемой автоматически при завершении работы цикла. Поэтому, без крайней необходимости, описание переменной-счетчика вне цикла for производить не следует.
В процессе работы цикла for не рекомендуется изменять операнды в выражениях заголовка цикла – это приведет к разного рода ошибкам! Но сами значения переменных (или констант), в том числе изменяемые значения (счетчик), использовать можно. Рассмотрим классический пример.
Программа 9.1 Дано натуральное число N. Вывести все делители этого числа.
#include
Использование инструкции 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
Примечание : обратите внимание, что поток вывода в строке 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
Чтобы элементы массива можно было изменять – переменная s должна быть ссылочной переменной (как в примере выше). Если переменная не является ссылкой, то данные будут копироваться. Для автоматического выведения типа в этом цикле используется спецификатор auto . range-based for имеет ограничение на работу с динамическими массивами: он не поддерживает изменение размера массива, так как содержит фиксированный указатель конца массива. При работе с массивами, имеющими фиксированный размер, диапазонный for является прекрасной и безопасной альтернативой обычному for .
Вложенные циклы for
Так же, как и другие инструкции циклов, for поддерживает структуру вложенных циклов. Применение вложенных циклов for для организации ввода и вывода двумерных массивов выглядит гораздо компактнее, чем при использовании цикла while .
Однако, при решении задач обхода таких массивов, необходимо избегать применение условной инструкции if . Зачастую, задачу можно реализовать более рационально, путем манипуляции индексами (переменными цикла i и j). То есть, поставить в зависимость изменение одного индекса, от значения величины другого. Рассмотрим два примера.
Программа 9.4
Дана квадратная матрица размера n, элементы которой равны 0. Заполнить элементы, лежащие ниже и на самой главной диагонали единицами.
#include
Программа 9.5
Составить программу заполнения массива числами треугольника Паскаля и вывода этого массива. Треугольник паскаля имеет вид:
В этом треугольнике на вершине и по бокам стоят единицы (в программе 9.5 треугольник “положен на бок” – стороны треугольника: первый столбец и главная диагональ). Каждое число равно сумме двух чисел, расположенных над ним. Строки треугольника симметричны относительно вертикальной оси и содержат биноминальные коэффициенты.
#include
Вопросы
- Может ли быть заменена в программе инструкция цикла for на инструкцию цикла while? Всегда ли это можно сделать?
- Когда удобнее применять для организации циклов инструкцию for? while?
- Возможны ли в заголовке инструкции 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;) ?
- Переменная i – параметр внешнего цикла, а j – вложенного. Доступна ли будет переменная j во внешнем цикле? i во вложенном цикле?
Учебник
Домашняя работа
- Зад. 29. Напишите программу, в которой вводятся натуральные числа a и b , а на дисплей выводятся все простые числа в диапазоне от a до b (идея алгоритма Программа 8.5)
- Зад. 30. Совершенным называется число, равное сумме всех своих делителей, меньших его самого (например, число 6 = 1 + 2 + 3). Напишите программу, которая вводит натуральное число N и определяет, является ли число N совершенным.
- Напишите программу, которая выводит на экран квадратную числовую таблицу размера n x n , имеющую следующий вид при n = 10: 1 * * * * * * * * * * 2 * * * * * * * * * * 3 * * * * * * * * * * 4 * * * * * * * * * * 5 * * * * * * * * * * 6 * * * * * * * * * * 7 * * * * * * * * * * 8 * * * * * * * * * * 9 * * * * * * * * * * 10
Литература
- Лафоре Р. Объектно-ориентированное программирование в C++ (4-е изд.). Питер: 2004
- Прата, Стивен. Язык программирования C++. Лекции и упражнения, 6-е изд.: Пер. с англ. - М.: ООО «И.Д. Вильяме», 2012
- Липпман Б. Стенли, Жози Лажойе, Барбара Э. Му. Язык программирования С++. Базовый курс. Изд. 5-е. М: ООО “И. Д. Вильямс”, 2014
- Эллайн А. C++. От ламера до программера. СПб.: Питер, 2015
- Шилдт Г. С++: Базовый курс, 3-изд. М.: Вильямс, 2010
Оператор цикла с параметром используется именно в таких случаях, когда необходимо организовать цикл с заданным числом повторений
for <параметр_цикла>:=<начальное_знач> to <конечное_знач> do <оператор>;
for <параметр_цикла>:=<конечное_знач> downto <начальное_зна.> do <оператор>;
Оператор, представляющий собой тело цикла, может быть простым или составным.
Параметр цикла, а также диапазон его изменения могут быть только целочисленного или перечислимого типа.
Параметр описывается совместно с другими переменными.
Шаг цикла for всегда постоянный и равен "1" или "-1".
Вывести на экран первые десять положительных целых чисел
var i: integer; //вводится счетчик
fori:=1to10do//пока значение счетчика от 1 до 10 выполнять следующее
writeln(i); //вывод значения счетчика
vari,sum:integer;
sum:=0; //обнуление значения переменной
fori:=10to99do//перебор двузначных положительных чисел
if i mod 3=0 then //кратность 3
sum:=sum+i; //сумма предыдущего значения переменной и числа, соответствующего условию
Вывести на экран произведение десяти первых четных положительных чисел
vari,pr:integer;
pr:=1; //при нахождении произведения начальное значение переменной не 0, а 1
for i:=1 to 10 do
if i mod 2=0 then //определение четности
Даны два целых числа A и B (A < B). Вывести в порядке возрастания все целые числа, расположенные между A и B (в том числе A и B), a также количество N этих чисел .
var i,pr: integer;
k:=0; //обнуляем значение переменной, означающей количество
fori:=AtoBdo//перебор чисел из заданного диапазона
writeln(i); //вывод в чисел порядке возрастания
k:=k+1; //подсчет количества чисел
writeln(k); //вывод количества происходит вне цикла т.к. выводится один раз
Ввести N различных чисел. Найти среднее арифметическое всех чисел.
Var n,i,a:integer;
For i:=1 to N do
Writeln("среднее арифметическое= ",s/n:4:2);
Оператор цикла с предусловием while ... Do (пока…)
Оператор while ... do предназначен для реализации циклов с предусловием.
Условие выполнения тела цикла while проверяется до начала каждого шага. Поэтому если условие сразу не выполняется, то тело цикла игнорируется, и управление передается оператору, стоящему сразу за телом цикла.
Обращение к оператору while ... do переводится как «пока... делать» и выглядит так:
while <условие> do <оператор>
В цикле while подразумевается такой алгоритм: пока условие истинно, выполняются операторы тела цикла.
Само условие может быть логической константой, переменной или логическим выражением.
При написании циклов с предусловием следует помнить следующее.
чтобы цикл имел шанс когда-нибудь закончиться, содержимое его тела должно обязательно влиять на условие цикла.
условие должно состоять из корректных выражений и значений, определенных еще до первого выполнения тела цикла.
Если условие цикла ложно цикл не выполнится ни разу!