THE BELL

Есть те, кто прочитали эту новость раньше вас.
Подпишитесь, чтобы получать статьи свежими.
Email
Имя
Фамилия
Как вы хотите читать The Bell
Без спама

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

1. Цикл с параметром в Паскале - FOR

Цикл FOR задаёт определённое условие по которому программа будет работать до его выполнения, допустим нужно нам 5 (или n) раз зациклить программу, то это легко сделать с помощью данного цикла. У цикла FOR есть характерная черта - счетчик который обычно обозначается буквой i или j.

Внешний вид цикла с параметром в паскале:

for i:= 1 to n do // присваиваем i сначала одному, потом двум, трем, ..., n

После 1-го прохода переменной i присваиваем 1, после второго присваиваем 2 и так до тех пор, пока не дойдем до n. to - это до.. в порядке возрастания, также есть downto - до.. в порядке убывания.

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

2. Цикл с предусловием в Паскале - WHILE

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

Структура цикла с предусловием:

WHILE DO begin end;

Логическое выражение, истинность которого проверяется вначале выполнения циклического оператора;

Любые выполняемые операторы языка.

Порядок выполнения цикла:

Пока условие истинно выполняется тело цикла. Как только условие становится ложно выполнение цикла прекращается.

Блок - схема цикла с предусловием:


Примечание: в прямоугольных блоках показано любое действие, которое выполняется в цикле или после него (шаг цикла), в овалах - начало или конец всей программы или её части. Главную роль в данной блок - схеме играет её центральная часть.

Пример:

Задача: вычислить сумму ряда 1+1.5+2+2.5+3+3.5+ .. + 30

program example-while;

Var sum:real; n:real; BEGIN sum:=0; n:=1; while n

3. Цикл с постусловием - Repeat - until.

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

Обратите внимание на то, что данный оператор цикла предполагает наличие нескольких операторов в теле цикла, то есть можно выполнять несколько действий, поэтому служебные слова Begin и End не нужны.

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

Блок - схема цикла с постусловием:

Формат записи, структура цикла:
REPEAT UNTIL ;

Пример:

Program test2; Var b:Real; Begin b:=100; Repeat b:=b/2; Until b

Выводы:

1.Цикл с параметром используется переменная, называемая параметром цикла или счётчиком. Перед выполнением цикла параметру (счётчику) устанавливается начальное значение. После выполнения шага цикла значение параметра увеличивается на единицу. Цикл продолжается до тех пор пока параметр не достигнет своего конечного значения, которое указывается после to (downto).

2. Цикл с предусловием выполняется до тех пор, пока условие выполнения не станет ложным, и продолжается, если условие истинно.

3. Цикл с постусловием выполняется до тех пор, пока условие не станет истинно, если условие ложно, цикл продолжается.

Цель : дать понятие о циклах с параметром, блок-схемах, изображающих такие циклы. Учить на частных примерах составлять блок-схемы и программы с циклами; дать понятие о различиях между циклами с предусловием, постусловием и циклом с параметром; учить в одной программе использовать разные циклы, если программа содержит несколько циклов; вводить и выполнять программы, используя компиляторы BPW или Turbo Pascal.

1. Оператор цикла for ... to ... do ...

Иногда заранее известно, сколько раз должен выполняться цикл. Для задач такого типа в языке Паскаль имеются операторы циклов с параметрами .
Формат записи таких операторов следующий:
for <пар.цикла > := <нач.знач > to <кон.знач .> do <оператор >.
Здесь for , to , do - зарезервированные слова (для, до, выполнить);
<пар. цикла > - параметр цикла - переменная типа integer (точнее, любого порядкового типа);
<нач. знач .> - начальное значение - число или выражение того же типа;
<кон. знач .> - конечное значение - число или выражение того же типа;
<оператор > - произвольный оператор Паскаля.
Если операторов несколько, тогда, как и в операторе while ... do ..., используются операторные скобки: begin ... end .
Например, возможны такие записи оператора цикла:

for i:= a to b do s1;

for j:= a to b do begin s1; s2; ..., sn end ; или

for k:= p to m do
begin
s1;
s2;
...
sn
end ;

Здесь s1, s2, s3, ... sn - операторы цикла.
При выполнении оператора for вначале вычисляется выражение <нач.знач .> и осуществляется присваивание его значения переменной цикла
<пар.цикла > := <нач. знач .>.
После этого циклически повторяются:
1) проверка условия <пар.цикла > <кон. знач .>; если условие не выполнено, оператор for завершает работу;
2) выполнение оператора <оператор > или операторов s1; s2; s3; ... sn;
3) переменная цикла <пар. цикла > увеличивается на единицу.

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


Графическое изображение циклов for будет таким (см. рис. 33):

Рис. 33

Здесь: i - переменная цикла; n - ее начальное значение; k - ее конечное значение. Тело цикла составляет оператор или несколько операторов: s1; s2; ... sn;, которые нарисованы в прямоугольнике.

Для иллюстрации работы оператора for рассмотрим пример уже ставший традиционным при изучении работы этого оператора.

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

Вспомним из математики, что факториал числа n равен произведению чисел от 1 до n.
Например:

Замечание . В математике принято: 0! = 1.


Блок-схема


Рис. 34

Программа

Program Problem1; { Вычисление факториала числа n! }
uses WinCrt;
var
n, f, i: longint;
begin

f:= 1;
if n <> 0 then for i:= 1 to n do f:= f*i;
end.

Переменная 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 - ложно , цикл не выполняется.

2. Оператор цикла for...downto...do...

Существует другая форма оператора цикла for:
for <пар.цик .> := <нач. зн .> downto <кон. зн .> do <оператор >.

Замена зарезервированного слова to на downto означает, что шаг параметра цикла равен (-1).

Изменение значения параметра идет от большего значения к меньшему, т. е.
<нач. знач .> <кон. знач .>.
Программу вычисления факториала числа можно составить, используя этот оператор цикла.
Программа

Program Problem1a;
uses WinCrt;
var
n, i, f: longint;
begin
write("Введите натуральное число "); readln(n);
f:= 1;
if n <> 0 then for i:= n downto 1 do f:= f*i;
writeln("Факториал числа ", n, " равен ", f)
end.

1. Измените программу так, чтобы она выдавала на экран не таблицу квадратов чисел от 1 до n, а квадрат только одного числа n, введенного пользователем.

2. Измените и дополните программу так, чтобы она выдавала значение квадрата числа и те нечетные числа, сумме которых он равен.

3 . Продолжая тему возведения натуральных чисел в степень, без операций умножения, рассмотрим еще два интересных примера. В первом из них нам придется совмещать, "вкладывать " друг в друга два цикла for , а во втором, циклы for и repeat.

Пример 3. Куб любого натурального числа n равен сумме n нечетных чисел, следующих по порядку за числами, сумма которых составляла куб предыдущего числа n - 1:

13 = 1
23 = 3 + 5
33 = 7 + 9 + 11
43 = 13 + 15 + 17 + 19
. . . . . . . . . . . . . . . . . . . . . .

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

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


Блок-схема

Рис. 36

Программа

Program Problem3; { Кубы натуральных чисел от 1 до n }
uses WinCrt;
var
i, j, n, s, k: longint;
begin
writeln("Введите натуральное число, до которого надо");
write("выводить кубы чисел "); readln(n);
writeln("Кубы чисел следующие:");
k:= 1;
for i:= 1 to n do
begin
s:= 0;
for j:= 1 to i do
begin
s:= s + k;
k:= k + 2
end ;
writeln("Куб числа ", i, " равен ", s)
end
end.

Разберем работу этой программы

Переменные i и j нужны в качестве переменных первого - внешнего и второго - внутреннего циклов. Переменная k для нечетных чисел, а s для суммы чисел. Тип этих переменных установлен целый, но longint, так как могут быть достаточно большие целые числа, большие 32767.
Программа начинается с запроса для пользователя с помощью операторов writeln и write о вводе натурального числа, до которого надо выдавать таблицу кубов чисел. Затем с помощью оператора readln это значение вводится в память компьютера и присваивается переменной n.
Выводится надпись "Кубы чисел следующие ". Она дана перед началом циклов по понятным причинам. В циклах ее дать нельзя, - она будет повторяться несколько раз. По окончании циклов тоже, тогда она будет написана внизу, после вывода самих чисел. Переменной k присваивается первое нечетное значение 1.
Начинается внешний цикл по количеству чисел, от 1 до n. В цикле несколько операторов, поэтому "открываются " операторные скобки: - begin ...
Перед началом внутреннего цикла обнуляется переменная s - сумма. Причем такое обнуление будет происходить каждый раз, когда повторяется внешний цикл, перед началом выполнения внутреннего цикла.
Внутренний цикл выполняется от 1 до i. Почему? В цикле вычисляется сумма и увеличивается нечетное k на 2, т. е. "вырабатывается " следующее нечетное число.

Заметьте! Переменной k не присваивается перед началом каждого внутреннего цикла 1. Почему?
Следующим оператором writeln внутри внешнего цикла выдается информация на экран. Почему он размещен во внешнем цикле?

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

Например, для 53 она выдавала бы последовательность чисел: 21, 23, 25, 27, 29.

План составления программы

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

s:= 1;
for i:= 1 to k do s:= s*n;

Значение степени будут накапливаться в переменной s, для этого ей устанавливается первоначальное значение 1.
В цикле, значение переменной s последовательно, k раз умножается на основание степени n. После выполнения цикла переменная s получит значение степени числа n с показателем k.
2. Вся острота вопроса состоит в том, что неизвестно первое нечетное число, от которого надо начинать суммирование последовательных нечетных чисел.
Для этого надо пробовать складывать нечетные числа вначале от 1 и далее (известно их количество - n);
1 + 3 + 5 + 7 + 9 ...,
а затем проверять полученный результат, сравнивая со значением степени s. Если равенство выполняется, тогда закончить цикл и вывести на экран полученные нечетные числа, если равенство не выполняется, тогда надо начинать суммирование со следующего нечетного числа - 3: 3 + 5 + 7 + 9 ... и т.д.
Этот процесс легче организовать с помощью цикла repeat . Переменной j, которая будет задавать начальные нечетные числа надо установить перед началом цикла первоначальное значение 1.
Общий вид такого цикла:

j:= 1;
repeat
. . . . . .
j:= j + 2
until ...= s;

3. Осталось продумать, как подсчитывать суммы последовательных нечетных чисел. Мы уже сталкивались с этим вопросом и знаем, что для этого надо создать цикл от 1 до n, в котором в одну из переменных, скажем m, накапливать эту сумму, а вторая переменная должна "вырабатывать " следующее нечетное число.
Этот цикл можно записать так:

p:= j; m:= 0;
for i:= 1 to n do
begin
m:= m + p;
p:= p + 2
end ;

Обратите внимание! Переменная p, каждый цикл repeat , (внешний по отношению к данному), будет получать новое начальное значение нечетного числа, а переменная m - для суммы должна обнуляться перед каждым новым суммированием для другой последовательности нечетных чисел.
4. Наконец, когда последовательность нечетных чисел найдена, ее надо вывести на экран. Для этого надо устроить еще один цикл от 1 до n, в котором выдавать значения этих нечетных чисел. За первое нечетное число из последовательности надо взять значение j, но так как оно уже увеличилось на 2, то из j следует вычесть 2. Этот цикл будет:

j:= j - 2;
for i:= 1 to n do
begin
write(j, " ");
j:= j + 2
end

Блок-схема

Рис . 37
Программа

Program Problem4;
uses WinCrt;
var
n, i, k, j, m, s, p: longint;
begin
write("Введите натуральное число - основание степени "); readln(n);
write("Введите натуральное число - показатель степени "); readln(k);
s:= 1; j:= 1;
for i:= 1 to k do s:= s*n;
repeat
p:= j;
m:= 0;
for i:= 1 to n do
begin
m:= m + p;
p:= p + 2
end ;
j:= j + 2
until m=s;
write("Степень с основанием ", n);
writeln(" и показателем ", k, " т. е. ", s);
writeln("равна сумме следующих нечетных чисел");
j:= j - 2;
for i:=1 to n do
begin
write(j, " ");
j:= j + 2
end
end.

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

1 . Выполните эту программу на компьютерах.

2 . Составьте блок-схему и программу, которая выясняет, может ли произведение
а) трех; б) четырех последовательных натуральных чисел равняться некоторой степени некоторого натурального числа (квадрату, кубу, и т. д.)?

4. Разные задачи

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

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


Рис. 38
Сразу возникает мысль составить программу по следующей схеме:
организовать цикл по числу тысяч, t от 1 до 9, а затем внутренние циклы : по числу сотен, s от 0 до 9; по числу десятков, d от 0 до 9; по числу единиц, e от 0 до 9; проверка условия: если цифры различны, тогда составленное из них четырехзначное число выдавать на экран.
Блок-схема

Рис. 39
Программа

Program Problem5; { 1 - й способ }
uses WinCrt;
var
t, s, d, e: integer;
begin
for t:= 1 to 9 do
for s:= 0 to 9 do
for d:= 0 to 9 do
for e:= 0 to 9 do
if (t <> s) and (t <> d) and (t <> e) and (s <> d) and
(s <> e) and (d <> e)
then write(t*1000 + s*100 + d*10 + e, " ")
end .

Понятно, что эта программа выполнена нерационально. В ней все циклы выполняются полностью.
Программу можно усовершенствовать таким путем. Когда выполняется цикл сотен, тогда следующий цикл десятков надо начинать выполнять, если цифра сотен s не равна цифре тысяч t, в противном случае, иначе , цикл сотен надо продолжить, т. е. взять следующую цифру сотен.
Для цифры десятков, также установить условие, что следующий цикл единиц будет выполняться, если цифра десятков d не равна цифре сотен и тысяч, в противном случае, иначе , надо переходить к следующей цифре десятков.
И тогда, "внутри " цикла единиц достаточно записать условие, если цифры единиц e не равны цифре десятков d , сотен s и тысяч t, тогда четырехзначное число является искомым и оно выводится на экран.


Блок-схема

Рис . 40

Программа

Program Problem5a; { 2 - й способ }
uses WinCrt;
var
t, s, d, e: integer;
begin
writeln("Все четырехзначные числа из разных цифр");
for t:= 1 to 9 do
for s:= 0 to 9 do if s <> t then
for d:= 0 to 9 do if (d <> s) and (d <> t) then
for e:= 0 to 9 do
if (e <> d) and (e <> s) and (e <> t)
then write((((t*10 + s)*10 + d)*10) + e, " ")
end .

Задание 4

1. Дополните и измените эту программу так, чтобы она выдавала на экран не только различные четырехзначные числа, но и их количество.

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

Пример 6. Тройки натуральных чисел a, b, c, удовлетворяющих равенству: - называются Пифагоровыми числами.
Например, 3, 4 и 5 являются Пифагоровыми числами, поскольку

Составить программу для нахождения и печати всех Пифагоровых чисел, не превышающих 20.

Математика этого вопроса проста. Для чисел a, b и c возможные значения - это натуральные числа от 1 до 20.
Первоначальное значение a - единица, a = 1. Будем просматривать всевозможные значения b от 1 до 20, а также значения c от 1 до 20 и проверять выполнение равенства a a + b b = c c. Как только равенство будет выполняться, тогда выводить на экран значения a, b и c.
Далее надо брать значение a = 2 и проверять значения b уже от 2 до 20. Почему не от 1, а от 2? Да потому, что набор двух чисел из 1 и 2 уже был рассмотрен при значениях a = 1 и b = 2, чтобы не повторять значения a и b, т.е. избежать появления двух одинаковых пар чисел, значения b следует начинать просматривать или до значения a или от a до 20.
В связи с этим, возможны несколько способов организации циклов для переменных a и b.
1-й способ:

for a:= 1 to 20 do
for b:= a to 20 do

2-й способ:

for a:= 20 downto 1 do
for b:= 1 to a do

3-й способ:

for a:= 1 to 20 do
for b:= 1 to a do

Нетрудно видеть, что при каждом из этих способов не будут повторяться пары чисел. Проверьте это самостоятельно.
Для значений c мы обязаны проверять все натуральные числа от 1 до 20 для каждой пары чисел a и b. Поэтому цикл для c должен быть таким: for c:= 1 to 20 do

Блок-схема

Рис . 41

Программа

Program Problem6;
uses WinCrt;
var
a, b, c: integer;
begin
writeln("Тройки Пифагоровых чисел из промежутка ");
for a:= 1 to 20 do
for b:= 1 to a do
for c:= 1 to 20 do
if a*a + b*b = c*c then writeln(a, " ", b, " ", c)
end .

1. Составьте блок-схему и программу, которая находит все решения уравнения где n - заданное число, из промежутка .

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

Пример 7. Сколькими способами заданное натуральное число n можно представить в виде суммы двух кубов натуральных чисел:

Перестановка слагаемых нового способа не дает. Операцией возведения в степень 1/3 пользоваться нельзя.

Сразу возникает следующая простая идея составления программы.

Организовать два цикла, один - внешний цикл с переменной i от 1 до n, а второй - внутренний цикл по j, также от 1 до n.

Сущность работы программы будет заключаться в следующем:

первое значение i равно 1, оно умножается трижды само на себя (этим заменяется возведение в 3-ю степень);
затем "перебираются " все значения j от 1 до n, каждое из которых также умножается трижды на себя и складывается со значением i i i, т. е. i в кубе;
далее, эта сумма проверяется, равна ли она значению n, если равенство выполняется, тогда счетчик, заведомо определенный в программе увеличивается на 1, а значения i и j можно вывести на экран;
цикл по i продолжается, i принимает второе значение - 2 и снова начинает выполняться внутренний цикл по j от 1 до n и так далее.
Если мы составим программу по этому плану, то она будет иметь два существенных недостатка:
1) проделывается много бесполезной работы - оба цикла организованы от 1 до n и среди них много лишних (достаточно брать значения от 1 до корня кубического из n);
2) программа будет выдавать значения, которые получаются при перестановки слагаемых, например: 2 2 2 + 3 3 3 = 35 и 3 3 3 + 2 2 2 = 35, что является недопустимым по условию задачи. Как устранить эти недостатки?
Первый недостаток устраним, если предварительно выясним, сколько значений для каждого из чисел надо рассматривать, чтобы выполнялось неравенство
Для этого можно организовать цикл с предусловием, цикл "пока ", в который включить счетчик - k, который бы подсчитывал, сколько раз такой цикл будет выполняться.

Это можно сделать так:

k:= 0; i:= 1;
while i*i*i + 1 <= n do
begin
k:= k + 1;
i:= i + 1
end ;


Теперь можно значительно уменьшить число циклов для "испытуемых " чисел и организовать их от 1 до k, ибо при значениях i больше k, даже при самом маленьком значении j (j:= 2) неравенство i i i + 1 <=n не выполняется.
Чтобы устранить второй недостаток, т. е., чтобы не выдавать варианты с перестановкой слагаемых можно поступить так:

внешний цикл по i первого числа устроить от k до 1, а внутренний цикл для второго числа по j делать от 1 до i. Получится такая часть программы:

p:= 0;
for i:= k downto 1 do
for j:= 1 to i do
if i*i*i + j*j*j = n
then
begin
p:= p + 1;
end ;

Внимательно разберитесь с этой частью программы и подумайте, почему в этом случае мы избегаем повторения вариантов и исключаем случаи перестановки слагаемых?

Осталось красиво закончить программу. Ведь очень часто будут встречаться случаи, когда число вообще нельзя представить в виде суммы кубов двух чисел. Надо учесть и это обстоятельство.

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

Если p = 0, тогда выдать сообщение, что число нельзя представить в виде суммы кубов двух чисел, а иначе , выдать сообщение о количестве способов.
Эта часть программы может быть выполнена так:

if p = 0
then
begin

end
else


Блок-схема


Рис . 42

Программа

Program Problem7;
uses WinCrt;
var
i, j, n, k, p: longint;
begin
write("Введите натуральное число "); readln(n);
k:= 0; i:= 1;
while i*i*i + 1 <= n do
begin
k:= k + 1; i:= i + 1
end ;
p:= 0;
for i:= k downto 1 do
for j:= 1 to i do
if i*i*i + j*j*j=n
then
begin
p:= p + 1;
writeln(i, "*", i, "*", i, "+", j, "*", j, "*", j, "=", n)
end ;
if p = 0
then
begin
write("Число ", n, " нельзя представить в виде ");
writeln("суммы кубов двух чисел")
end
else writeln("Число способов равно ", p)
end .

Еще одно решение этой задачи

Program Problem7b;
uses WinCrt;
label 1, 2;
var
i, j, m, k, n: longint;
begin
write("Введите натуральное число "); readln(n);
m:= 0; i:= 1; j:= 1;
while j*j*j + 1 < n do j:= j + 1;
repeat
k:= i*i*i + j*j*j;
if k = n then m:= m + 1;
if k <= n then i:= i + 1;
if k >= n then j:= j - 1;
until i > j;
if m = 0 then goto 1;
write("Число ",n," можно представить в виде суммы");
writeln(" кубов двух чисел ",m," способами"); goto 2;
1: write("Это число не представимо в виде");
writeln(" суммы кубов двух чисел");
2: end .

Дано натуральное n. Можно ли n представить в виде суммы трех квадратов натуральных чисел? Если можно, то указать все тройки x, y, z таких натуральных чисел, что Перестановка слагаемых нового способа не дает. Составить блок-схему и программу.

5. Преобразование типов

Пример 8. Двузначное десятичное число в сумме с числом, записанным теми же цифрами, но в обратном порядке, дает полный квадрат. Найти все такие числа.

Пусть искомое двузначное число = a 10 + b, тогда число, записанное теми же цифрами, но в обратном порядке будет = b 10 + a, например, 12 и 21, 13 и 31 и т. п.
Сумма этих чисел должна давать полный квадрат, т.е. точный квадрат целых чисел. Как это проверить?
Проверку можно было бы выполнить так: извлечь квадратный корень из полученной суммы; затем округлить результат до целого числа, а потом умножить полученный результат на себя, если снова получится сумма этих чисел, то значит она является точным или полным квадратом.
Например, 12 + 21=33, извлекаем квадратный корень из 33, он равен 5.74...; округляем, будет 6; умножаем 6 само на себя и получаем 36.
Мы не получили исходного результата, значит сумма 33 не является точным квадратом.
Еще один пример, чтобы вам была понятна идея решения. Пусть двузначное число 29, тогда число, записанное теми же цифрами, но в обратном порядке - 92, в сумме они дают 121. Извлекаем квадратный корень из 121 и получаем 11. Умножив 11 само на себя, снова получим 121. Делаем вывод, что получен точный квадрат, а значит двузначное число 29 является искомым.
Чтобы составить программу по этому принципу, придется извлекать квадратный корень из суммы, что можно сделать с помощью стандартной функции sqrt(x). Результат функции sqrt(x) является вещественным числом, его надо округлить или отбросить дробную часть, а нам неизвестно, как это сделать.
Но, даже более существенным, является то, что если квадратный корень в множестве целых чисел извлекается нацело, как для 121 (он равен 11), то на множестве вещественных чисел мы не получим строго число 11, а результат будет очень близок к 11 и после умножения на себя всё равно не получится 121, т.е. возникает необходимость преобразовать вещественное значение в целое.
Итак перед нами две задачи: 1) выяснить как округлять числа и; 2) установить, как преобразовывать вещественный тип в целый.

Для этого в Паскале есть стандартные функции round(x) и trunc(x)

Стандартные функции round и trunc предназначены для замены значений вещественного типа значениями целого типа.
Функция round (x) округляет вещественное число x до целого - ее значение есть ближайшее целое число:
round (4.2) = 4, round (4.7) = 5, round (4.5)=5,
round (-4.2) = -4, round (-4.7) = -5, round (-4.5) = -5.
Функция trunc (x) отбрасывает (без округления) дробную часть вещественного числа x:
trunc (1.2) = 1, trunc (5.8) = 5, trunc (-1.2) = -1,
trunc (-5.8) = -5, trunc (-6.7) = -6, trunc (8,9) = 8

Функции округления связаны так:
trunc (x + 0.5) = round (x), если x 0,
trunc (x - 0.5) = round (x), если x < 0.
Итак, в программе можно воспользоваться одной из этих функций. Какой? Подумайте сами и попробуйте применить в программе вначале функцию trunc , а потом замените ее на round и сравните полученные результаты.

  • Показать, что четырехзначное число, у которого цифры тысяч и десятков одинаковы и цифры сотен и единиц тоже одинаковы, не может быть точным квадратом.
  • Произведение шести последовательных натуральных чисел может быть равно произведению трех последовательных натуральных чисел. Например, 1 2 3 4 5 6 = 8 9 10 = 720. Есть ли еще такие числа?
  • Доказать, что произведение четырех последовательных целых чисел в сумме с единицей дает полный квадрат.
  • Найдите 11 последовательных натуральных чисел, сумма квадратов которых есть квадрат целого числа.
  • Существуют ли такие целые числа, которые уменьшаются в 57 раз при зачеркивании их первой (слева) цифры?
  • Найти четырехзначное число, зная, что оно является квадратом натурального числа и что цифры его распадаются на две пары, состоящие из одинаковых цифр.
  • Найдите все семизначные числа, которые делятся на 15 и записываются только цифрами 0 и 1.
  • Шестизначное число начинается с цифры 1. Если эту цифру переставить в конец числа, то новое число будет в три раза больше первоначального. Найдите число.
  • Сколько точных квадратов можно составить из цифр 3, 4, 5, 6?
  • Даны 20 различных натуральных чисел, не больших 50. Найдите два из них, разность которых равна 4, 5 или 9.
  • Во сколько раз увеличится двузначное число, если справа к нему приписать такое же двузначное число?
  • Определить наибольшее значение отношения трехзначного числа к числу, равному сумме цифр этого числа.
  • Найти трёхзначное число, кратное 45, если разность между этим числом и числом, записанным теми же цифрами, но в обратном порядке равна 297.
  • Найти четырёхзначное число, кратное 11, при условии: b + c = a и есть полный квадрат.
  • Найти трёхзначное число, равное сумме цифры десятков, квадрата цифры сотен и куба цифры единиц.
  • Найти два числа, произведение которых есть трёхзначное число, являющееся кубом некоторого числа, а частное является квадратом этого числа.
  • Разность между числом и произведением его цифр равна сумме цифр этого числа. Найти это число.
  • Найти все значения числа m, для которых сумма 1! + 2! + , + m! является полным квадратом.
  • Найти положительное четырёхзначное число, кратное 7 и представляющее собою сумму куба и квадрата некоторого числа.
  • Некоторое число при делении на 7 дает в остатке 3; его квадрат при делении на 72 дает остаток 44; его куб при делении на 73 даёт остаток 111. Найти это число.
    1. При каком натуральном значении a число a2 + a + 1589 будет точным квадратом?
    2. Найти совершенное число вида 16p.
    3. Найти два числа, если сумма их квадратов равна 468, а сумма их общего наибольшего делителя и наименьшего кратного равна 42.

    Инструкция цикла 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



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

    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 подразумевается такой алгоритм: пока условие истинно, выполняются операторы тела цикла.

    Само условие может быть логической константой, переменной или логическим выражением.

    При написании циклов с предусловием следует помнить следующее.

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

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

    Если условие цикла ложно цикл не выполнится ни разу!

    выражение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).

    THE BELL

    Есть те, кто прочитали эту новость раньше вас.
    Подпишитесь, чтобы получать статьи свежими.
    Email
    Имя
    Фамилия
    Как вы хотите читать The Bell
    Без спама