ТОП 10:

Операционные системы: история



ООП

Задачи

1. Вычислите значение функции в зависимости от заданного условия.

 

#include<stdio.h>

#include <conio>

#include <math.h>

void main ()

{

float a,b,y;

printf("a="); scanf("%f",&a);

printf("b="); scanf("%f",&b);

if (a>b) y=pow(sin(a/b),2)+pow(fabs(a),3); else if (a==b) y=-sqrt(fabs(a))+tan(b); else y=sqrt(pow(a,4)+pow(b,4));

printf("%5.3f",y);

getch();

}

 

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

 

#include <stdio.h>

#include <conio.h>

voidmain()

{

printf("Введитеномермесяца -");

int mes; scanf("%d",&mes);

switch(mes)

{

case 1,2,12:printf("зима"); break;

case 3,4,5:printf("весна"); break;

case 6,7,8:printf("лето"); break;

case 9,10,11:printf("осень"); break;

default:printf("некорректный ввод!!!");

}

getch();

}

 

3. Вычислить произведение ряда

 

#include<stdio.h>

#include <conio>

#include <math.h>

void main ()

{

float x,y=1; int n;

printf("x="); scanf("%f",&x);

for (n=2;n<=5;n++)// переменная I изменяется от 2 до 5 с шагом 1

y*=exp(-x)*log(x)*tan(x);

printf("%5.10f",y);

getch();

}

 

4. Вычислить таблицу значений функций для значений аргумента x, который изменяется от xn до xk с шагом dx

 

 

#include <stdio.h>

#include <conio.h>

#include <math.h>

void main()

{

float xn,xk,dx,x,y;

printf("xn="); scanf("%f",&xn);

printf("xk="); scanf("%f",&xk);

printf("dx="); scanf("%f",&dx);

x=xn; //присваиваем переменной x начальное значение

while (x<=xk)

{

y=pow(tan(x/2),2)*exp(-2*x)*log(fabs(x));

printf("x=%1.1f y=%f\n",x,y);

x+=dx; //значение x возрастает на величину шага

}

getch();

}

 

5. Обеспечить ввод с клавиатуры последовательности из целых чисел (диапазон от -20 до 10, конец серии – ввод нуля). После окончания ввода программа должна вывести количество положительных и четных чисел.

#include <stdio.h>

#include <conio.h>

#include <math.h>

void main()

{

int x,k;

do

{ printf("x="); scanf("%d",&x);

if (x<=10 && x>0 && x%2==0) k++;

}

while (x!=0);

printf("k=%d",k);

getch();

}

 

6. Сформировать одномерный массив, состоящий из N целочисленных элементов. После чего найти произведение всех элементов массива, удовлетворяющих условию c<a[I]<d

 

#include <stdio.h>

#include <conio.h>

void main()

{ const n=7;

int i,c,d,k=0,pr=1;

printf("c="); scanf("%d",&c);

printf("d="); scanf("%d",&d);

int a[n];

for(i=1;i<=n;i++)

{ printf("a[%d]=",i); scanf("%d",&a[i]);

if (a[i]>c && a[i]<d) {k++; pr*=a[i];}

}

if (k==0) printf("чисел, удовлетворяющих условию не было!");

else printf("pr=%d",pr);

getch();

}

 

 

7. Сформировать одномерный массив, состоящий из N целочисленных элементов. После чего: найти количество четных и количество нечетных элементов в массиве.

 

#include <stdio.h>

#include <conio.h>

void main()

{ const n=7;

int i,ch=0,nch=0;

int a[n];

for(i=1;i<=n;i++)

{ printf("a[%d]=",i); scanf("%d",&a[i]);

if (a[i]%2==0) ch++; else nch++;

}

printf("ch=%d nch=%d",ch,nch);

getch();

}

 

8. Сформировать двухмерный массив, состоящий из N x N элементов (заполнить случайными числами в диапазоне от 10 до 100). После чего: найти сумму элементов, лежащих выше главной диагонали.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

void main()

{ const n=7;

int i,j,sum=0;

int a[n][n];

randomize();

for(i=0;i<n;i++)

{

for(j=0;j<n;j++)

{

a[i][j]=10+random(91);

printf("%5d",a[i][j]);

}

printf("\n"); //переход на другую строку

}

for(i=0;i<n;i++)

for(j=0;j<n;j++)

if (j>i) sum+=a[i][j];

printf("sum=%d",sum);

getch();

}

 

9. Сформировать двухмерный массив, состоящий из N x N элементов (заполнить случайными числами в диапазоне от 10 до 100). После чего: найти номер столбца, в котором расположен минимальный элемент матрицы.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

void main()

{ const n=7;

int i,j,k=0,min;

int a[n][n];

randomize();

for(i=0;i<n;i++)

{

for(j=0;j<n;j++)

{

a[i][j]=10+random(91);

printf("%5d",a[i][j]);

}

printf("\n"); //переход на другую строку

}

min=a[1][1];

for(i=0;i<n;i++)

for(j=0;j<n;j++)

if (min>a[i][j])

{min=a[i][j]; k=j;}

printf("min=%d k=%d\n",min,k);

getch();

}

 

 

Дисциплина «Системное программирование»

Теоретические вопросы

Конкуренция процессов

Конкуренция процесса связана с :

¾ многозадачность (выполнение нескольких процессов на одном устройстве);

¾ разделение физических ресурсов;

¾ разделение логических ресурсов;

¾ скорость выполнения;

¾ требования реального времени к …….в-в.

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

Семафор может рассматриваться как целочисленная переменная, для которой определены следующие операции:

р(sem) или wait (sem)

if(sem !=0)

уменьшить sem на единицу

else

ждать, пока sem не станет ненулевым, затем вычесть единицу

v(sem) или signal(sem)

увеличить sem на единицу

if(очередь ожидающих процессов не пуста)

продолжить выполнение первого процесса в очереди ожидания

Обратите внимание, что обозначения р и v происходят от голландских терминов для понятий ожидания (wait) и сигнализации (signal), причем последнее понятие не следует путать с обычными сигналами UNIX.

Файлы с несколькими именами

Один и тот же набор данных может быть связан с несколькими именами UNIX без необходимости создания копий файла.

Каждое такое имя называется жесткой ссылкой (hard link). Число связанных с файлом ссылок называется счетчиком ссылок (link count).

Новая жесткая ссылка создается при помощи системного вызова link, а существующая жесткая ссылка может быть удалена при помощи системного вызова unlink. Системный вызов st_nlink.Число ссылок, указывающих на этот файл (другими словами, число различных имен файла, так как жесткие ссылки неотличимы от «настоящего» имени). Это значение обновляется при каждом системном вызове link и unlink.

Системный вызов link.

Оriginal_path – указатель на массив символов, содержащий полное имя файла в системе UNIX. Он должен задавать существующую ссылку на файл. New_path – задает новое имя файла или ссылку на файл, но файл, заданный параметром new_path, еще не должен существовать. Системный вызов link возвращает значение 0 в случае успешного завершения и -1 – в случае ошибки. В последнем случае новая ссылка на файл не будет создана.

Системный вызов unlink. Фактически системный вызов unlink просто удаляет указанную ссылку и уменьшает счетчик ссылок (link count) файла на единицу. Данные в файле будут безвозвратно потеряны только после того, как счетчик ссылок на него станет равным нулю, и он не будет открыт ни в одной программе.

Системный вызов symlink.Symlink используется для создания символьной ссылки.

После завершения вызова symlink создается файл symname, указывающий на файл realname. Если возникает ошибка, например, если файл с именем symname уже существует, то вызов symlink возвращает значение -1. В случае успеха вызов возвращает нулевое значение. Если затем файл символьной ссылки открывается при помощи open, то системный вызов open корректно прослеживает путь к файлу realname.

Системный вызов readlink. Используется, если необходимо считать данные из самого файла symname.

Системный вызов readlink вначале открывает файл sympath, затем читает его содержимое в переменную buffer, и, наконец, закрывает файл sympath. Возвращаемое вызовом readlink значение равно числу символов в буфере или -1 – в случае ошибки.

Реализация каталогов.

Каталоги имеют владельца, группу, размер и связанные с ними права доступа. Каталоги не могут быть созданы при помощи системных вызовов creat или open. Системный вызов open также не будет работать с каталогом, если установлен любой из флагов O_WRONLY или O_RDWR.

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

Cистемный вызов opendir – служит для открытия каталога.

Передаваемый вызову opendir параметр является именем открываемого каталога. При успешном открытии каталога dirname вызов opendir возвращает указатель на переменную типа DIR. Определение типа DIR, представляющего дескриптор открытого каталога, находится в заголовочном файле <dirent.h>. Это определение аналогично определению типа FILE, используемого в стандартной библиотеке ввода/вывода. Указатель позиции ввода/вывода в полученном от функции opendir дескрипторе установлен на первую запись каталога. Если вызов завершился неудачно, то функция возвращает NULL.

Cистемный вызов closedir – служит для закрытия каталога (после окончания работы программы).

Вызовы readdir и rewinddir.

Функции readdir должен передаваться допустимый указатель на дескриптор открытого каталога, обычно возвращаемый предшествующим вызовом opendir. При первом вызове readdir в структуру dirent будет считана первая запись в каталоге. В результате успешного вызова указатель каталога переместится на следующую запись. Когда в результате последующих вызовов readdir достигнет конца каталога, то вызов вернет нулевой указатель. Если в какой-то момент потребуется начать чтение каталога с начала, то можно использовать системный вызов rewinddir.

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

Cистемный вызов mkdir – создание каталогов и подкаталогов. mkdir возвращает нулевое значение в случае успеха, и -1 - в случае неудачи

Обработка сигналов в UNIX

Очереди сообщения.

Сообщение – это последовательность символов или байтов. Сообщения передаются между процессами при помощи очередей сообщений, которые можно создавать или получать к ним доступ при помощи вызова msgget. После создания очереди процесс может помещать в нее сообщения при помощи вызова msgsnd, если он имеет соответствующие права доступа.

Этот вызов лучше всего представить как аналог вызова open или creat. Параметр key – простое число, идентифицирующее очередь сообщений в системе. В случае успешного вызова, после создания новой очереди или доступа к уже существующей, вызов msgget вернет ненулевое целое значение, которое называется идентификатором очереди сообщений

Разделяемая память.

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

Создайте аналог команды df

#include <sys/types.h>

#include <sys/statvfs.h>

#include <stdlib.h>

#include <stdio.h>

main(int argc, char **argv)

{ struct statvfs buf;

if(argc != 2)

{ fprintf(stderr, "Применение: fsys имя_фaйлa\n");

exit(1); }

if(statvfs(argv[1], &buf) != 0)

{ fprintf(stderr, "Ошибка вызова statvfs\n");

exit(2); }

printf("%s:

полное число блоков по %d байт \t%d

всего занятых блоков \t\t\t%d

свободных блоков \t\t\t%d\nсвободных индексных дескрипторов \t%d

идентификатор файловой системы \t\t%d\n",

argv[1], buf.f_frsize, buf.f_blocks,

buf.f_blocks-buf.f_bfree, buf.f_bfree,buf.f_ffree,buf.f_fsid);

exit(0);}

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

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

 

Отображен цикл с трехкратным вложением циклов.

Первый из которых управляется счетчиком I, второй J, третий К. Переменные I,J,Kпробегаю значения от 1 до n. Цикл, управляемый счетчиком К, является внутренним к циклу, управляемому счетчиком J, который в своею очередь есть внутренний по отношению к циклу управляемому счетчиком i. Работают циклы так: При каждом значении счетчика I выполняется весь цикл по J, при этом для каждого J выполняется весь цикл по К.

Операторы циклов в языке Паскаль. Примеры использования.

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

- цикл со счетчиком (цикл «для» - for… to / downto);

- цикл с предусловием (цикл «пока» - while);

- цикл с постусловием (цикл «до тех пор, пока» - repeat…until).

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

Цикл со счетчиком.

В тех случаях, когда число повторений заранее определено, удобно использовать оператор For..To..Do. Данный оператор имеет встроенный счетчик и может использовать шаг либо «+1» либо «-1». В случаях если мы вычисляем от меньшего к большему, то используется вид For..To..Do. Если от большего к меньшему изменяется счетчик, то используется вариант For…Downto..Do. Общий вид оператора: For (переменная):=нач. значение…to (downto) конечное значение do.

Program summa;

Const n=100;

Var i:integer; sum:Real;

Begin

Sum:=0;

For I:=1 to n do

sum:=sum+1/I;

Writeln (‘Summa’,n,’elementov=’,sum:10:5);

End.

Цикл с предусловием

Общий вид оператора:

while условие do (Эта часть называется заголовком цикла)

оператор; (Эта часть называется телом цикла)

Телом цикла может быть и группа операторов, заключенная в операторные скобки begin… end (то есть составной оператор).

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

В теле цикла должны быть операторы, которые в какой-то момент изменят значение условия, сделав его ложным. Если этого не случается, цикл будет бесконечным. Цикл работает пока условие выполняется. Это цикл с предусловием, в котором есть возможность не выполнять тело ни разу.

Н-р. Задача о вычислении суммы.

Program summa;

Const n=100;

Var i:integer; sum:Real;

Begin

Sum:=0;

I:=1;

While I<=n do

Begin

sum:=sum+1/I;

I:=I+1

End;

Writeln (‘Summa’,n,’elementov=’,sum:10:5);

End.

Цикл с постусловием.

Общий вид оператора : repeat группа операторов untilусловие;

Здесь вначале выполняются группа операторов, а потом производится проверка, следует ли вновь повторить эту группу. Если условие ложно, выполнение цикла повторяется, иначе – заканчивается.

Решение предыдущей задачи о суммировании .

Program summa;

Const n=100;

Var i:integer; sum:Real;

Begin

Sum:=0;

I:=1;

repeat

sum:=sum+1/I;

I:=I+1;

Until I>n;

Writeln (‘Summa’,n,’elementov=’,sum:10:5);

End.

Слова Repeat и until являются зарезервированными, как впрочем, и слово while . В отличие от цикла while операторы внутри цикла repeat выполняются хотя бы один раз, в то время как в цикле while они могут не выполняться ни разу. Данный оператор используется в тех случаях , когда число повторений заранее не определено, а определяется условием в процессе выполнения работы.

5.Условный оператор и оператор выбора вариантов в языке Паскаль. Структурная схема. Примеры использования.

Условный оператор имеет общие формы записи:

IF b THEN a;

или IF b THEN a1 ELSE a2;

Где b – логическое выражение; a, a1,a2 – операторы.

Первая форма записи позволяет организовать вычисление оператора а, если логическое выражение имеет значение TRUE, в противном случае выполняется не оператор а, а оператор, стоящий за условием. В качестве операторов а, а1, а2 используется любой простой или составной оператор.

Примеры записи:

IF T>6.5 Then GOTO 10;

IF X<0 then P:=X*X;

IF D>0 THEN BEGIN x1:=R+I; x2:=R-I; END;

Вторая форма записи оператора позволяет выбирать одно из двух возможных направлений вычислений. Если логическое выражение принимает значение TRUE, то выполняется оператор а1, иначе выполняется оператор а2.

Примеры записи.

If y>0 then D:=SQRT (Y) else D:=y;

If D>0 then begin x1:=R+I; x2:=R-I end else begin F:=R; E:=I end;

IF…Then может содержать в себе некоторое число других условных операторов If…Then , а также операторные скобки. Для оператора IF справедливо: условия –могут быть сложные математические выражения; после then или после else опять может стоять if ..then; составной оператор может содержать внутри себя другой составной оператор: условные операторы могут быть вложены.

Структура языка Паскаль

В текстах программ допускаются комментарии и пробелы. Комментарий – это текст, поясняющий программу и не влияющий на процесс ее выполнения. Комментарии ограничиваются символами { и} или (* и *). Программа на языке Паскаль состоит из заголовка программы и блока (тела программы). Заголовок программы или подпрограммы – это один из операторов: PROGRAM – для программы; PROCEDURE – для процедуры; FUNCTION – для функции. Процедуры и функции могут иметь ряд уровней вложенности, т.е. могут быть вложены в другие процедуры и функции. Форма оператора заголовка программы: Program имя_программы; Пример структуры программы:

Program PR; - заголовок программы

Объявление типов, констант, меток и переменных;

Блок программы и подпрограммы на языке Паскаль состоит из двух частей: 1) декларативной – описания (объявления) данных программы и текстов подпрограмм (разделы описаний); 2) выполнимой – описания действий, которые надо выполнить над данными (раздел операторов). Блок включает все, кроме заголовка программы или подпрограммы. В общем случае может состоять из шести разделов различных типов. Все они, кроме раздела операторов, необязательны. Каждый раздел описаний начинается ключевым словом: Label – для определения меток программы; Const – для определения констант Type – для определения типов данных, Var – для определения переменных, Procedure и Function – для определения процедур и функций, Begin – определяет начало раздела операторов программы. Оператор Program должен быть первым в программе, раздел операторов программы – последним. А между ними может быть сколько угодно разделов описаний в любом порядке. Типы и константы могут использоваться в последующих описаниях типов и переменных и программ. Последовательность разделов описания объектов (Label, Const, Type,Var и др.) программы может быть произвольной. В случае необходимости типы разделов могут повторяться. Умолчаний в Паскале нет. Все, что используется в программе: константы, переменные, метки, - должно быть обязательно явно. Каждый объект программы должен быть описан и только один раз для данной области действия. Объекты программы имеют областью их действия блок, в котором они объявлены, и все вложенные в него блоки, процедуры и функции, в которых они не переобъявлены. Поэтому одни и те же идентификаторы можно использовать в различных подпрограммах (процедурах и функциях) программы в разных смыслах.

 

ОБРАЗЦЫ РЕШЕНИЙ ЗАДАЧ

1. Написать программу для вычисления функции:

на промежутке [-20,20] с шагом 0,5

Ответ

Program prim1;

var x,y:real;

begin x:=-20;

while x<=20 do {цикл смены X из интервала [-20,20] }

begin

if x<-10 then y:=2-x else {проверка условия}

if x<-5 then y:=x-x*x else

if x<2 then y:=x*x*x else

y:=sqrt (x);

writeln ('y=',y:6:2,'при x=',x:6:2);

x:=x+0.5;

end;

end.

 

Ответ

program prim2;

uses crt;

const n=13;

var a:array[1..n,1..n] of integer; {объявляем двухмерный массив}

s,min:integer;

i,k,j:byte;

begin

clrscr;

writeln ('Элементы матрицы ->');

randomize; {инициализация процедуры генерации случайных чисел}

for i:=1 to n do

begin

for j:=1 to n do

begin

a[i,j]:=random (100) {заполняем массив случайными числами в диапазоне от 0 до 100};

write (a[i,j],'':5);

end;

writeln;

end;

min:=a[1,1];

for i:=1 to n do

for j:=1 to n do

if min>a[i,j] then

begin

min:=a[i,j];

k:=j;

end;

for i:=1 to n do

s:=s+a[i,k];

writeln ('Сумма элементов столбца ',k,' в котором расположен Min=',min,' равна->',s);

readkey

end.

3. Задан двумерный массив A (NxN). Найти, сколько отрицательных эллементов массива А=a[i,j] удовлетворяют условию: -110<=a[i,j]<=-1. Из этих элементов сформировать новый массив В.

Ответ

program prim3;

uses crt;

const n=5;m=10;

var a:array[1..n,1..n] of integer; {объявляем двухмерный массив}

b:array[1..m] of integer; {объявляем одномерный массив} r,i,j:integer;

begin

clrscr;

writeln ('Элементы матрицы ->');

randomize; {инициализация процедуры генерации случайных чисел}

for i:=1 to n do

begin

for j:=1 to n do

begin

a[i,j]:=random (200+200)-200; {заполняем массив случайными

числами в диапазоне от -200 до 200}

write (a[i,j]:5,' ');

end;

writeln;

end;

r:=0;

for i:=1 to n do

begin

for j:=1 to n do

begin

if a[I,j]<0 then

if (a[I,j]>=-110)and (a[I,j]<=-1)then {проверяем условие}

begin

r:=r+1; b[i]:=a[i,j]; write (b[i]:3,',');

end;

end;

end;

writeln;

writeln ('условию удовлетворяют ',r,' элемента массива' );

readln

end.

 

4. Известно, что в текст Т входит восклицательный знак. Подсчитать в последовательности символов, предшествующих восклицательному знаку количество пробелов.

Ответ

Program prim4;

var t: string;

I: byte; {счетчик цикла}

c: byte; {количество пробелов}

Begin

write ('введите текст:');

readln (t);

I:=1; c:=0;

while t[i]<>'!' do

Begin

if t[i]=' ' then

inc (c); inc (i); {увеличение на 1}

end;

writeln ('количество пробелов равно',с)

end.

 

Ответ

Program prim5;

var

t: string ; {текст}

s: string ; {слово}

c: string ; {вспомогательный текст}

I: byte;

d: byte; {число раз слово в тексте}

Begin

d:=0;

write ('введите текст:');

readln (t);

t:=' '+t+' ';

write ('введите заданное слово');

readln (s);

s:=' '+s+' ';

for I:=1 to length (t)-length (s)+1 do

begin

c:=copy (t,I,length (s));

if c=s then inc (d);

end;

writeln (d)

end.

6.Сколько раз в тексте встречается заданное слово . Слова разделены пробелами или знаками препинания и т.п.

Ответ

Program prim6;

var t: string; {текст}

s: string; {слово}

c: string; {вспомогательный текст}

I: byte; {для цикла}

d: byte; {число раз}

Begin

d:=0; write ('введите текст:');

readln (t);

t:=' '+t+' ';

write ('введите слово');

readln (s);

for i:=1 to length (t)-length (s)+1 do

begin

c:=copy (t,I,length (s));

if c=s then

if t[I-1]<chr (65) then {проверка, знаки препинания, пробел или другой символ}

if t[I+ length (s)]<chr (65) then inc (d);

end;

writeln (d)

end.

 

Дисциплина «Основы баз данных и знаний»

 

Сетевая модель данных.

В 1971-75гг был создан образец сетевой модели представляющей СУБД обслуживающей нескольких производителей. Сети могут быть представлены математисеской структурой – направляющим графом. граф состоит из узлов и ребер.

Сетевая м-ль данных представляет собой сетевую структуру типов записей связанных отношением мощности 1:1 или 1:n. Иерархическая мо-ль – частный случай сетевой.

С сетевой использ те же 3 уровня данных (внутренний, концептуальный, внешний).

Базовыми понятиями являются:

Элемент данных – минимальная информационная единица доступная пользователю.

Агрегат данных – Соответствует следующему уровню обобщения в модели. Существуют 2 типа агрегатов: агрегат типа вектор и агрегат типа повторяющаяся группа. агрегат данных имеет имя. Агрегат типа вектор соответствует линейному набору элементов данных. Агрегат типа повторяющаяся группа имеет вид: зарплата, месяц, сумма.

Запись – совокупность агрегатов или элементов данных отображающих реальный мир.

Набор данных – это 2-х уровневый граф связанный отношением 1:n.

Существует два типа набора данных: 1) Владелец набора (родительский тип); 2) Член набора (дочерний тип).

Для любых 2-х типов записи может быть создано любое кол-во наборов которые их связывает. Это дает возможность моделировать отношение n:n (это преимущество сетевых м-лей).

Реляционная модель данных.

В 1970 амер. ученый Кодд впервые сформулировал основные понятия реляционной модели. В данной модели он использ 7 основных и 1 дополнительную операцию. Кодд определил 5 основных правил при работе с БД. Все современные СУБД ориентированны на реляционную модель.

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

Кодд ввел 2 основных понятия реляционная алгебра и реляционные исчисления. Первое правило Кодда говорит о том, что данные в реляц. м-ли представляются в виде табл.

Отношение – плоская табл. состоящая из столбцов и строк. Другого способа предсавл данных, кроме табл не существует.

Столбец – атрибут. Столбцы могут располагаться в любом порядке. Кол-во атрибутов в табл назыв степенью ариляции. Ни какие 2 атрибута не имеют одинаковых названий.

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

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

Кардинальность – это кол-во картежей, которое содержит отношения. Степенью отношения назыв кол-во атрибутов, которое содержит отношения.

Домен – набор допустимых значений для 1-го или нескольких атрибутов. Каждый атрибут определяется на некотором домене. 1 домен может быть у нескольких атрибутов или у каждого свой.

Отношение содержит 2 части: заголовок и содержательная часть. Заголовок состоит из конечного множества атрибутов. Содержательная часть состоит из конкретных значений и множества картежей.

Пустое значение – это значение приписываемое атрибуту в картеже если атрибут не применим или его значение не известно. Это не пробел и не ноль.

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

Ключ реляции – минимальный набор атрибутов.

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

Составной ключ – ключ состоящий из нескольких атрибутов.

Первичный ключ – ПК выбранный в качестве уникального определения строк табл.

Альтернативные ключи – ПК невыбранные в качестве первичного.

Внешний ключ – набор атрибутов одной табл. являющейся ключом другой табл.

Наличие атрибута в разных табл. отражает связь м/д ними.

Связи между табл. Рассмотрим БД состоящую из 4-х табл.: автор, книга, изд-во, редактор. Существует связь 1:n по данному примеру каждая книга имеет одно изд-во, но в каждом изд-ве может быть выпущено множество книг. Для реализации данной связи надо атрибут № изд-ва добавить в табл. книги.

Реляционная модель требует отношение 1:многим было реализовано парой первичный ключ – внешний ключ.

Отношение n:n . Некоторые книги написаны несколькими авторами и некоторые авторы написали по несколько книг. Данный вид связи требует создания новой табл. – табл. связи м/д ними. В табл. автор, книга используется внешний ключ код книги, кот. явл. первичным в табл. книги, и использ. внешний ключ код автора, кот. явл. первичный в табл. автора. Первичным ключом в табл.автор - книга явл. составной ключ состоящий из кода автора и кода книги.

Связь 1:1 . Если существует данная связь, то связывать объединенную табл. составлять не надо.

Физические модели БД.

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

Начали использоваться страничные системы хранения информации. Физическая организация БД определяет эффективность работы БД и влияет на быстродействие.

Ф-ции распределенных СУБД.

Они выполняют тот же набор возможностей, что и централизованные – ероме этого:

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

2) Сохранять сведения о распределении данных в сети.

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

4) Поддерживать целостность реплицируемых данных.

5) Иметь расширенные ф-ции восстановления, учитывать возможность отказа отдельных сайтов и линий связи.

Правил Дейта для СУРБД.

0) Основной принцип. Для конечного пользователя распределенная Бд должна выглядеть как не распределенная система.

1) Локальная автономность. Сайты СУРБД должны быть автономны, т.е. локальные данные принадлежат локальным владельцам, сопровождаются локально, контролируются все процессы на сайте только этим сайтом.

2) Отсутствие опоры на централизованный сайт. В системе не должно быть ни одного сайта без которого система не смогла бы работать.

3) Непрерывность функционирования.

4) Независимость от расположения.

5) Независимость от фрагментации.

6) Независимость от репликации.

7) Обработка распределенных запросов. Система должна обрабатывать данные расположенные более чем на одном сайте.

8) Обработка распределенных трансакций.

9) Независимость от типа оборудования.

10) Независимость от ОС.

11) Независимость от сетевой архитектуры.

12) Независимость от типа СУБД. СУБД должна иметь возмжность работать с различными моделями локальных СУБД.

Четыре последних правила при проектировании удовлетворяются частично.

Объектно-ориентированные СУБД. Требования к ООСУБД.

Развитие ООП привело к созданию объектно-ориентированных СУБД. ООП это эффективный подход к созданию сложных программ объединяющих в себе понятия инкапсуляция, полиморфизм и наследование. ООСУБД объединяют в себе возможности языка ООП с ф-циями управления данными традиционных СУБД.

ООСУБД должны удовлетворять:

(По Майеру): 1)Обеспечивать функционирование БД. 2)Поддерживать идентичность объектов. 3)Удовлетворять инкапсуляции. 4)Поддерживать объекты со сложным состоянием.

(По Хашафяну)ж 1) «Объектно-ориентированный подход»= «абстрактные типы данных» + «наследование» + «идентичность объектов». 2) «ООСУБД» = «Объекьно-ориентироанный подход» + «возможности БД.»

Объектно-реляционные СУБД.

Для расширения возможностей реляц БД необходимо пополнить их следующ. ф-циям.

Использование объектно-ориентированных компонентов.

1)Расширение пользовательских типов.

2)Инкапсуляция – объединение деклоративных и исполняемых частей.

3)Наследование (позволяет определить новый объект как потомок или предок уже описанного).

4)Полиморфизм – возможность иметь несколько методов с одним и тем же именем для разных объектов одной иерархии, т.е. это средство для развития объектов в потомках.

5)Динамическое связывание методов.

6)Использование составных объектов.

7)Поддержка идентичности объектов.

В каждом конкретном случае при построении ОРСУБД использ свойственные данному приложению ф-ции – кроме стандартных. Не взирая на разнообразие все они построены на базе реляционных таблиц и языка запросов, включают понятия объекта. Понятно, что разработка ОРСУБД построена на расширении стандартов языка запросов SQL3.

Концепция ОРСУБД как комбинация концепций ООСУЬД и РСУБД необыкновенно притягательна за счет применения всех тех богатейших знаний и опыта кот. были накоплены за время разработки реляц.БД.

Структура языка SQL.

Назначение SQL:

1) Создавать БД и таблицы с полным описанием их структур.

2) Выполнять основные операции манипулируя данными такие как вставка, модификация, удаление данных из табл.

3) Выполнять простые и сложные запросы осуществляя преобразование данных в нужную информ.

Языку предъявляются следующие требования, он должен быть прост и доступен, универсален (обеспечивать переход к другим СУБД). Язык состоит из 2-х основных компонентов:

1)DDL для определения структуры данных;

2)DML для обеспечения доступа к данным и их модификации.

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

Типы данных языка SQL.

Тип данных столбца определяет возможные операции со столбцом.

1) Символьные данные – буквы, цифры, спец. символы и имеют 2 основных типа: char(n) – строка фиксированной длины, всегда хранит указанное кол-во символов, отсутствующие заменяются пробелом справа; varchar – строка переменной длинны хранит столько символов, сколько введено. Данные заключаются в одинарные кавычки, в некоторых диалектах двойные.

2) Только числовые данные – состоят из чисел, не обязательно десятичной точки, не обязательно знаками. Данные определяются значностью и длиной дробной части. Значность – общее кол-во цифр без точки (12,345 – значность 5, длина дробной части 3).

DICIMAL[(P,C)]

NUMERIC[(P,C)] – по умолчанию длина дробной части =0;

INTEGER (INT) – целое число, используется для хранения больших целых чисел занимающих 4байта.

SMALLINT – использ для хранения целых чисел занимающих 2байта. Максимальное число в этом типе 32767.

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

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







Последнее изменение этой страницы: 2016-08-14; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.235.74.184 (0.078 с.)