В большинстве программ встречается необходимость многократного выполнения некоторого оператора (или блока операторов). Для организации подобного рода конструкций могут использоваться операторы цикла. В языке программирования Паскаль используются следующие виды операторов цикла: for, while, repeat (в PascalABC.NET используется также оператор цикла foreach ).
Блок операторов, который необходимо выполнить многократно называется телом цикла.
Если число повторений тела цикла заранее известно, то используется оператор цикла for , который также часто называют оператором цикла с параметром.
Оператор for состоит из двух частей: тела цикла и заголовка, который предназначен для описания начального и конечного значений параметра цикла, а также варианта его изменения.
В зависимости от направления изменения параметра цикла (возрастание - to или убывание - downto ) в языке Паскаль оператор цикла for может быть записан в одной из двух форм:
Переменная-параметр цикла может принимать любой порядковый тип . При этом начальное и конечное значения должны иметь тип совместимый с типом переменной-параметром.
Рассмотрим работу цикла for .
Перед началом выполнения оператора цикла вычисляются начальное значение, присваиваемое переменной-параметру, и конечное значение. Затем, циклически выполняются следующие операции:
Внимание: в языке Паскаль параметр цикла, вне зависимости от возрастания или убывания, всякий раз изменяется на единицу.
Задача. Вывести на экран список квадратов целых чисел от 10 до 1.
Решение. В поставленной задаче параметр цикла убывает.
{Фрагмент кода программы}
Внимание: если в теле цикла необходимо использовать более одного оператора, то применяется составной оператор (операторные скобки begin и end ).
Пример 2. Известны оценки абитуриента на четырех экзаменах. Определить сумму набранных им баллов.
Задача. Известны оценки абитуриента на четырех экзаменах. Определить сумму набранных им баллов.
Решение. Будем использовать в программе оператор цикла с параметрами, так как известно количество повторений выполняемых действий (абитуриент получил ровно четыре отметки)
{Фрагмент кода программы}
выражение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 логическое выражение;
Операторы в теле цикла выполняются до тех пор, пока значение логического выражения 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 <оператор>;
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 проверяется до начала каждого шага. Поэтому если условие сразу не выполняется, то тело цикла игнорируется, и управление передается оператору, стоящему сразу за телом цикла.
Обращение к оператору while ... do переводится как «пока... делать» и выглядит так:
while <условие> do <оператор>
В цикле while подразумевается такой алгоритм: пока условие истинно, выполняются операторы тела цикла.
Само условие может быть логической константой, переменной или логическим выражением.
При написании циклов с предусловием следует помнить следующее.
чтобы цикл имел шанс когда-нибудь закончиться, содержимое его тела должно обязательно влиять на условие цикла.
условие должно состоять из корректных выражений и значений, определенных еще до первого выполнения тела цикла.
Если условие цикла ложно цикл не выполнится ни разу!
Операторы цикла с параметром (for)
Операторы цикла с параметром (которые начинаются со слова for ) вызывает повторяющееся выполнение оператора (который может быть составным оператором) пока управляющей переменной присваивается возрастающая последовательность значений.
For параметр цикла:= начальное значение to конечное значение do оператор.
В качестве управляющей переменной должен использоваться идентификатор переменной. Управляющая переменная должна иметь перечислимый тип. Начальное и конечное значения должны иметь тип, совместимый по присваиванию с перечислимым типом. Когда начинает выполняться оператор for , начальное и конечное значения определяются один раз, и эти значения сохраняются на протяжении всего выполнения оператора for . Оператор, который содержится в теле оператора for , выполняется один раз для каждого значения в диапазоне между начальным и конечным значением. Управляющая переменная всегда инициализируется начальным значением. Когда работает оператор for и используется ключевое слово to , значение управляющей переменной увеличивается при каждом повторении на единицу. Если начальное значение превышает конечное значение, то содержащийся в теле оператора for оператор не выполнятся. Когда в операторе цикла используется ключевое слово downto , значение управляющей переменной уменьшается при каждом повторении на единицу. Если начальное значение в таком операторе меньше, чем конечное значение, то содержащийся в теле оператора цикла оператор не выполнятся.
Если оператор, содержащийся в теле оператора for , изменяет значение управляющей переменной, то это является ошибкой. После выполнения оператора for значение управляющей переменной становится неопределенным, если только выполнение оператора for не было прервано с помощью оператора перехода.
На параметр цикла в операторе for накладываются следующие ограничения:
1) параметр цикла, а также его начальное и конечное значения не могут быть изменены никаким оператором в теле цикла;
2) вход в цикл ТОЛЬКО через его начало.
Массив - это упорядоченная совокупность переменных одного типа, называемых элементами массива. Все элементы имеют одно и то же имя, совпадающее с именем массива. Каждый элемент снабжается индексом (порядковым номером), определяющим его относительную позицию в ряду других элементов, и называется индексированной переменной. Индекс элемента записывается вслед за его именем в квадратных скобках, например, a, max и т.д. Характеристиками каждого массива являютnя его имя, размерность и длина. Имя массива выбирается по тем же правилам, что и имя простой (неиндексированной) переменной. Понятие размерности массива аналогично понятию размерности матрицы в математике. Так одномерный массив соответствует вектору - строке, двумерный - матрице такой же размерности и т.д.
Длина массива - это количество составляющих его элементов. Массивы относятся к одной из разновидностей составного типа, а именно к регулярному типу.
Определение регулярного типа имеет вид
array of t1
где array - массив (ключевоеое слово);
of - из (ключевое слово);
t1 - тип элементов массива (базовый тип);
t2 - тип индексов элементов массива.
В качестве элементов массива могут выступать переменные любого типа, допустимого в языке. Тип индекса задаёт количество элементов в массиве, т.е. его длину; это количество определяется числом возможных значений типа,указанного в описании массива. Для индексации элементов массива чаще всего используется ограниченный тип, который образуется из какого-либо стандартного типа (например, целого) путём наложения ограничений на допустимый диапазон его значений. Эти ограничения задаются минимальным и максимальным значениями индекса, разделёнными двумя стоящими подряд точками и заключёнными в квадратные скобки, например, , [-5..35] и т.д.
В программе каждый массив должен быть описан. Его описание может быть сделано либо в разделе описания переменных - var , либо в двух разделах: описания типов - type и описания переменных. Но в любом случае в описании массива должно присутствовать определение регулярного типа.
Описание массива в разделе переменных выглядит так:
var
имя массива: array of t1;
Цикл с параметром был уже рассмотрен нами в разделе "Алгоритм" в теме "Виды алгоритмов".
Цикл с параметром
используется,
когда заранее известно
сколько раз должен выполниться цикл.
Формат записи цикла:
Здесь 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 - операторы цикла.
Пример: Программу вычисления факториала числа можно составить, используя этот оператор цикла.
Задачи