Разница между реляционной и нереляционной модели. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Разница между реляционной и нереляционной модели.



Реляционная модель данных представляет собой множество элементов, называемых кортежами. Наглядной формой представления реляционной модели является привычная для человеческого восприятия двумерная таблица. Таблица имеет строки (записи) и столбцы (колонки). Каждая строка таблицы имеет одинаковую структуру и состоит из полей. Строками таблицы соответствуют кортежи, а столбцами - атрибуты отношений. Физическое размещение данных в реляционных базах на внешних носителях легко осуществляется с помощью обычных файлов.

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

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

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

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

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

2.2. С++  Builder.

C++ Builder – это полноценный расширяемый программный продукт с удобной разработкой приложений RAD. В C++ Builder внедрена оптимизированная среда программирования IDE, которая позволяет разрабатывать на языке C++ различного направления программное обеспечение.

C++ Builder – обширный комплекс с такими библиотеками как STL, MFC, VCL, CLX и др. Кроме этого имеется компилятор, редактор, отладчик кода и множество других полезных для разработки компонентов. Процесс разработки приложений схож с Delphi, поэтому большинство компонентов, которые разрабатывались под Delphi, можно интегрировать в C++ Builder без каких-либо модификации и бубнов. В C++ Builder большая часть компонентов перешла из Delphi. Благодаря этому, написанный код на языке Delphi, с минимальными знаниями можно преобразовать в C++ Builder.

В C++ Builder есть огромное количество инструментов, которые позволяют упростить разработку визуальных приложений с помощью drag-and-drop компонентов и встроенного редактора интерфейса WYSIWYG.

Изначально разработкой программного продукта C++ Builder занималась компания Borland Software, а теперь по текущее время компания Embarcadero Technologies, её подразделение CodeGear.

Embarcadero C++ Builder – это продвинутый программный кросс-платформенный инструмент для разработки от мелких до довольно крупных приложений с красивым и удобным интерфейсов UI для таких систем как Windows, Android и iOS. В последние версии Embarcadero C++ Builder входит фреймворк VCL, который позволяет создавать высокопроизводительные native-приложения для Windows и FireMonkey (FMX).

Проектирование:

· Быстрая разработка приложений с VCL для Windows, обеспечивая непревзойденную native-производительность.

· Технология Drag-and-drop позволяет переносить любые компоненты на форму приложения.

· Возможность расширения компонентов от разных сертифицированных партнёров.

· Технология FMX для кросс-платформенных проектов.

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

· Live On-Device Preview позволяет проверять и оценивать дизайн разработанного приложения в режиме реального времени.

· Разработка адаптивного дизайна, поддерживающий высокое разрешение DPI, для компьютеров, планшетов и смартфонов.

Кодирование:

· Быстрые и оптимизированные компиляторы C++ для Windows, Android и iOS.

· Code Insight упрощает процесс разработки приложений.

· Обширная поддержка СУБД: InterBase, Oracle, PostgreSQL, DB2, SQLite, MySQL, SQL Server, SQL Anywhere, Firebird, Access, Advantage DB, Informix, MongoDB.

· Удобные встроенные подсказки во время написания кода.

· Интеграция с популярными библиотеками Boost, Eigen и ZeroMQ.

· Возможность расширения набора инструментов и библиотек сообщества разработчиков.

· Поддержка контроля версий – Git, Subversion и Mercurial.

Отладка:

· Интегрированный набор инструментов позволяет значительно сократить время разработки приложений и объединяет в единую среду средства проектирования, компилятор и отладчик.

· Условные точки прерывания позволяют приостанавливать исполнение приложений в указанных местах или при наступлении указанного условия.

· Удобный анализ стек вызовов для отслеживания и обнаруживания последовательности выполнения кода.

· Быстрая проверка значения переменных во время отладки кода.

Теоретическая часть.

Структура программы.

 

Рис. 2 Функциональная схема настройки параметров

 

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

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

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

В конце вводятся списки студентов. На момент начала семестра определяются группы, которые обучаются в определённом году и списки уже сформированны.

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

Учёт выполненых заданий.

 

Рис. 3 Схема учёта выполненных заданий

После введения исходных данных и регистрации всех дисциплин, программа разбивается на пять функциональных элементов: «Выполнение заданий», «Текущая успеваемость», «Задание на проверку», «Отчёты», «Контроль». 

Выполнение заданий.

Рис. 4 Схема формирования "Выполнения заданий"

Формирование таблицы, состоящей из

- Формирования списка обучающихся;

- Формирования набора заданий;

- Формирование таблицы для внесения данных.

 

Рис. 5 Схема функционала вкладки "Выполнение заданий"

Преподаватель может выбрать студента и задание, и по двойному клику на соответствующую ячейку, открыть окно загрузки отчёта. Загружая файл с отчётом в базу данных программы, оригинальный файл удаляется из папки, откуда он был взят. Загруженный отчёт также автоматически отображается во вкладке «Отчёты» и автоматом проставляется оценка во вкладке «Текущая успеваемость». А в самой ячейке ставится значение «Вып». Кодом это реализовано следующим образом:

__fastcall TForm3::TForm3(TComponent* Owner)

  : TForm(Owner)

{SLV s0,s1,s2,s3; long n1,n2,t1,t2;

 char ss[500],sv[500],sk[500],sm[100]; int j,k,kl,n=0; FILE *f1;

 PageControl1->ActivePage=TabSheet1;

 STConnect("SDBDOC\\SDBDOC");

 sprintf(ss,"P002=%s",Form1->Edit1->Text.c_str());

 s1.ADD(ss);

 s0.ADD("R.");

 DWPROC(&s0,&s1,&s2,&s3);

 //SLV_FILE(&s2,"data\\s2.txt");

 n1=1; n2=s2.NSlv();

 while(n1<=n2)

{s2.Rest(n1,ss);

ss[10]=0;

strcpy(sv,ss+4);

strcat(sv," ");

s2.RestNumb(&t1,&t2,ss);

n1=t2+1;

kl=1;

while(t1<=t2)

{s2.Rest(t1++,ss);

ss[19]=0;

if(strcmp(ss+15,"P006")==0)

  {strcat(sv,ss+20);

   strcat(sv," ");

  }

if(strcmp(ss+15,"P007")==0)

  {strcat(sv,ss+20);

   strcat(sv," ");

  }

}

 if(kl==1)

{ComboBox1->Items->Add(sv);

sprintf(ss,"%s$%d",sv+7,n++);

CB1.ADD(ss);

}

}

 s2.SaveSlv();

 StringGrid1->Cells[0][0]="№";

 StringGrid1->Cells[1][0]=" ФИО";

 for (int j=2;j<20;j++)

StringGrid1->Cells[j][0]=j-1;

 StringGrid1->Cells[1][0]=" ФИО";

 StringGrid2->Cells[0][0]="№";

 StringGrid2->Cells[1][0]=" ФИО";

 StringGrid6->Cells[0][0]="№";

 StringGrid6->Cells[1][0]=" ФИО";

 StringGrid6->Cells[2][0]="Рейтинг";

 StringGrid6->Cells[3][0]="Дата";

 for (int j=4;j<18;j+=3)

{StringGrid6->Cells[j][0]="Файл";

StringGrid6->Cells[j+1][0]="Тип";

StringGrid6->Cells[j+2][0]="Размер";

}

 

 StringGrid3->Cells[0][0]="№";

 StringGrid3->Cells[1][0]="Задание на проверку";

 StringGrid4->Cells[0][0]="№";

 StringGrid4->Cells[1][0]="Подгруппа";

 StringGrid4->Cells[2][0]=" ФИО";

 StringGrid5->Cells[0][0]="№";

 StringGrid5->Cells[1][0]="Имя файла";

 StringGrid5->Cells[2][0]="Рег. №";

}

void __fastcall TForm3::StringGrid1DblClick(TObject *Sender)

{ZREP();

 Save();

void __fastcall TForm3::Save()

{char ss[500],sn[100],sk[200]; int j,r,p;

 strcpy(sn,ComboBox1->Text.c_str());

 sn[6]=0;

 sprintf(ss,"arch\\%s.dat",sn);

 unlink(ss);

 SLV s1(ss);

 j=2;

 for (int k=0;k<StringGrid1->RowCount;k++)

{if(StringGrid1->Cells[j][0]!="")

{if(StringGrid1->Cells[j][k]!="")

  {sprintf(ss,"%s P %02d %02d %s",sn,j,k,StringGrid1->Cells[j][k]);

   s1.ADD(ss);

  }

}

}

 for (int j=2;j<StringGrid1->ColCount;j++)

 {for (int k=0;k<StringGrid1->RowCount;k++)

{if(StringGrid1->Cells[j][0]!="")

{if(StringGrid1->Cells[j][k]!="")

  {sprintf(ss,"%s P %02d %02d %s",sn,j,k,StringGrid1->Cells[j][k]);

   s1.ADD(ss);

  }

if(StringGrid2->Cells[j][k]!="")

  {sprintf(ss,"%s V %02d %02d %s",sn,j,k,StringGrid2->Cells[j][k]);

   s1.ADD(ss);

  }

}

}

 }

 for (int j=0;j<StringGrid3->ColCount;j++)

for (int k=1;k<StringGrid3->RowCount;k++)

if(StringGrid3->Cells[j][k]!="")

{sprintf(ss,"%s S %02d %02d %s",sn,j,k,StringGrid3->Cells[j][k]);

s1.ADD(ss);

}

 SLV_FILE(&s1,"data\\s1.txt");

}

Текущая успеваемость.

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

void __fastcall TForm3::StringGrid2DblClick(TObject *Sender)

{

 for (int j=2;j<StringGrid1->ColCount;j++)

 {for (int k=1;k<StringGrid1->RowCount;k++)

{if(StringGrid1->Cells[j][k]!="")

{StringGrid2->Cells[j][k]="5";

}

}

 }

 Save();

}

Задание на проверку.

Рисунок 6 Схема функционала "Задание на проверку"

В разделе «Задание на проверку», формируется список всех заданий текущей дисциплины с соответствующим порядковым номером, что были отправлены преподавателем в ЭОС на проверку. Имеется возможность сохранить название задания, при нажатии кнопки «Сохранить задание», файл с заданием, при нажатии кнопки «Сохранить файл задания», и написать его краткое содержание.

void __fastcall TForm3::BitBtn4Click(TObject *Sender)

{int nt; char ss[500],sr[500];

 if(StringGrid3->Cells[1][StringGrid3->Row]!="")

{strcpy(sr,ComboBox1->Text.c_str());

sr[6]=0;

nt=StringGrid3->Row;

sprintf(ss,"TEST\\%s%02d.rtf",sr,nt);

RichEdit1->Lines->SaveToFile(ss);

StringGrid3->Cells[0][nt]=nt;

StringGrid1->Cells[nt+1][0]=nt;

StringGrid2->Cells[nt+1][0]=nt;

ShowMessage("Выполнено!");

RichEdit1->Clear();

}

else

ShowMessage("Не задано название задания!");

 

}

void __fastcall TForm3::BitBtn4Click(TObject *Sender)

{int nt; char ss[500],sr[500];

 if(StringGrid3->Cells[1][StringGrid3->Row]!="")

{strcpy(sr,ComboBox1->Text.c_str());

sr[6]=0;

nt=StringGrid3->Row;

sprintf(ss,"TEST\\%s%02d.rtf",sr,nt);

RichEdit1->Lines->SaveToFile(ss);

StringGrid3->Cells[0][nt]=nt;

StringGrid1->Cells[nt+1][0]=nt;

StringGrid2->Cells[nt+1][0]=nt;

ShowMessage("Выполнено!");

RichEdit1->Clear();

}

else

ShowMessage("Не задано название задания!");

 

}

Отчёты.

Рисунок 7 Функциональная схема вкладки "Отчёты"

Здесь в начале формируется таблица со списком студентов. При нажатии на кнопку «Отчёты», преподаватель может увидеть список отчётов и по двойному клику на работу открыть её, в каком бы формате она не была. Нажав на кнопку «Загрузить отчёт» или «Удалить отчёт», можно добавить его в список или убрать из него, соответственно.

void __fastcall TForm3::BitBtn3Click(TObject *Sender)

{char sv[500],ss[500],sn[500]; SLV s1("arch\\report.dat");

 int k,j; long n1,n2;

// SLV_FILE(&s1,"data\\s1.txt");

 j=StringGrid4->Row;

 strncpy(ss,ComboBox1->Text.c_str(),6);

 ss[6]=0;

 sprintf(sv,"%s %02d ",ss,j);

 s1.RestNumb(&n1,&n2,sv);

 k=1;

 while(n1<=n2)

{s1.Rest(n1++,ss);

ss[12]=0;

StringGrid5->Cells[0][k]=ss+10;

ss[28]=0;

StringGrid5->Cells[2][k]=ss+13;

StringGrid5->Cells[1][k]=ss+29;

k++;

}

 StringGrid5->Cells[0][k]="";

 StringGrid5->Cells[2][k]="";

 StringGrid5->Cells[1][k]="";

 StringGrid5->RowCount=k+1;

 if(k>0)

StringGrid5->FixedRows=1;

}

void __fastcall TForm3::BitBtn6Click(TObject *Sender)

{char sv[500],sz[500],ss[500],sn[500]; SLV s1("arch\\report.dat");

 TSearchRec sr;String s,sd; int k,j,nz,ns;

 SLV_FILE(&s1,"data\\r.txt");

 if(OpenDialog1->Execute())

{strcpy(sv,OpenDialog1->FileName.c_str());

FindFirst(sv,faAnyFile,sr);

s=FormatDateTime("yyyymmddhhnn",FileDateToDateTime(sr.Time));

sprintf(sv,"%s%03d",s.c_str(),sr.Size%1000);

sprintf(sn,"arch\\2020\\%s.dat",sv);

COPY_FILE(OpenDialog1->FileName.c_str(),sn);

strncpy(ss,ComboBox1->Text.c_str(),6);

ss[6]=0;

nz=0;

ns=StringGrid4->Row;

sprintf(sz,"%s %02d %02d %s %s",ss,ns,nz,sv,sr.Name.c_str());

s1.ADD(sz);

StringGrid1->Cells[StringGrid1->Col][StringGrid1->Row]="Вып";

unlink(OpenDialog1->FileName.c_str());

s1.SaveSlv();

BitBtn3Click(Sender);

 }

}

void __fastcall TForm3::BitBtn2Click(TObject *Sender)

{char sv[500],ss[500],sn[500]; SLV s1("arch\\report.dat");

 int k,j; long n1,n2;

 //SLV_FILE(&s1,"data\\s1.txt");

 j=StringGrid4->Row;

 strncpy(ss,ComboBox1->Text.c_str(),6);

 ss[6]=0;

 sprintf(sv,"%s %02d %s %s",ss,j,StringGrid5->Cells[0][StringGrid5->Row].c_str(),

    StringGrid5->Cells[2][StringGrid5->Row].c_str());

 s1.RestNumb(&n1,&n2,sv);

 if(n1==n2)

{s1.DEL(n1);

}

 StringGrid5->Cells[0][StringGrid5->Row]="";

 StringGrid5->Cells[2][StringGrid5->Row]="";

 StringGrid5->Cells[1][StringGrid5->Row]="";

}

Контроль.

В последней вкладке «Контроль» так же как и раньше формируется список студентов. Выбрав задание из выпадающего списка, преподаватель может поставить оценку, которая была поставлена в ЭОС, или изменить её, вместе с тем эта оценка автоматом выставится во вкладке «Текущая успеваемость». Далее идут столбцы с данными о дате, название файла, типе файла и размере его.

void __fastcall TForm3::ComboBox2Change(TObject *Sender)

{char sv[500],ss[500]; int k;

 strncpy(ss,ComboBox1->Text.c_str(),6);

 ss[6]=0;

 sscanf(ComboBox2->Text.c_str(),"%d",&k);

 sprintf(sv,"test\\%s%02d.rtf",ss,k);

 RichEdit2->Lines->LoadFromFile(sv);

 Rep(k);

 for (int j=1;j<StringGrid2->RowCount;j++)

 {StringGrid6->Cells[2][j]=StringGrid2->Cells[k+1][j];

 }

}

void __fastcall TForm3:: FindRF(SLV *s1)          

{char s[500],ss[500],sn[500],sp[20]; long k; int q,j,r; long n1,n2,n;

 TSearchRec sr; AnsiString CurDir,CurDir1;

 CurDir1=GetCurrentDir();

 sprintf(ss,"%s%carch%c2020%c",CurDir1.c_str(),92,92,92);

 if(SetCurrentDir(ss)==true)

if(FindFirst("*.*",faAnyFile,sr)==0)

{strcpy(sn,sr.Name.c_str());

if(sn[0]!='.')

{n=sr.Size;

  sprintf(ss,"%s %d",sn,n);

  s1->ADD(ss);

}

while(FindNext(sr)==0)

{strcpy(sn,sr.Name.c_str());

  if(sn[0]!='.')

   {n=sr.Size;

    sprintf(ss,"%s %d",sn,n);

    s1->ADD(ss);

   }

}

FindClose(sr);

}

SetCurrentDir(CurDir1);

}

void __fastcall TForm3::FindSP8()

{TSearchRec sr; AnsiString CurDir1; SLV s1; long n1,n2; char ss[500];

 CurDir1=GetCurrentDir();

 if(SetCurrentDir("docout")==true)

{if(FindFirst("*.*",faArchive,sr)==0)

{s1.ADD(sr.Name.c_str());

  while(FindNext(sr)==0)

   {s1.ADD(sr.Name.c_str());

   }

}

FindClose(sr);

}

n1=1; n2=s1.NSlv();

while(n1<=n2)

{s1.Rest(n1++,ss);

unlink(ss);

}

SetCurrentDir(CurDir1);

}

 

void __fastcall TForm3::FormClose(TObject *Sender, TCloseAction &Action)

{

 FindSP8();

}

void __fastcall TForm3::StringGrid6KeyUp(TObject *Sender, WORD &Key,

TShiftState Shift)

{char ss[500]; int k;

 strcpy(ss,ComboBox2->Text.c_str());

 sscanf(ss,"%d",&k);

 if(StringGrid6->Col==2)

StringGrid2->Cells[k+1][StringGrid6->Row]=StringGrid6->Cells[2][StringGrid6->Row];

}

Программная реализация.

Создание словаря.

Словарь реализован как класс SLV в объектной технологии языка C++. Класс SLV реализован в виде динамической библиотеки tgr.dll. Для использования такой библиотеки достаточно в программу включить файл заголовка tgr.h и подсоединить файл библиотеки tgr.lib.

Сервисные функции работы со словарями помещены в отдельную динамическую библиотеку tgrsrv.dll.

Данные словаря хранятся в оперативной памяти либо в виде файла.

Создание словаря.

Для создания словаря используются два конструктора:

SLV(); — словарь в оперативной памяти;

SLV(char *NameFile) — словарь с файловым сохранением.

Примеры объявления словаря в программе:

SLV s1,s2,s3; — здесь объявлены три словаря s1, s2, s3 в оперативной памяти;

SLV SK(“DATA\\SK.DAT”); — объявлен словарь SK, который сохраняется в словарном формате в папке DATA под именем SK.DAT.

Имя словаря пользователь задает произвольным идентификатором по правилам языка C++, расширение может быть произвольным.

Основные функции словаря.

• Поиск слова в словаре с возвратом номера

• Добавить слово в словарь

• Вывести слово по заданному номеру

• Удалить слово из словаря

• Возврат диапазона по началу слова



Поделиться:


Последнее изменение этой страницы: 2021-07-19; просмотров: 93; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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