Материалы сайта
Это интересно
Организация баз данных "Паспортный стол"
МІНІСТЕРСТВО ОСВІТИ УРАЇНИ КРИВОРІЗСЬКИЙ ТЕХНІЧНИЙ УНІВЕРСІТЕТ КАФЕДРА МОДЕЛЮВАННЯ ПРОГРАМНОГО ЗАБЕСПЕЧЕННЯ КУРСОВІЙ ПРОЕКТ НА ТЕМУ «ОБЛІК ПЕДАГОГІЧНОГО СКЛАДУ В ПОЗАШКІЛЬНІХ ЗАКЛАДАХ» ВИКОНАВ: СТУДЕНТ ГРУПИ ПЗОТ-97-1 БАШТА П.Л. ПЕРЕВІРИВ:СТАРШИЙ ПРЕПОДАВАТЛЬ СМОЛЯНСКИЙ П.С. 2000 Г. Содержание 1.Техническое задание 1.1.Краткое описание объекта 1.2.Требования к программе 1.3.Описание входной информации и входных документов 2.Технический проект 2.1.Описание структуры базы данных и их используемые индексы, назначение и типы всех полей базы. 2.2.Назначение глобальных переменных 2.3.Функциональная блок-схема 2.4.Текст исходников программы на CLIPPER-5.1 2.5.Описание текстовых примеров 3.Документация 3.1.Инструкция пользователю 3.2.Инструкция системному программисту Использованная литература 1.Техническое задание 1.1.Краткое описание объекта Целью работы является создание программы облегчающей работу отделу кадров учебного заведения по контролю за преподавательским составом .Объект представляет собой продукт который можно будет использоваться во внешкольных учебных учреждениях ,которые имеют небольшой штат преподавательского состава ( до 50 человек ) и которые обеспечены слабыми компьютерами (286,386,486 ) с весьма ограниченным количеством памяти как оперативной ( от 512 килобайт до 2х мегабайт) так и внешней (емкость винчестера в районе 20 – 120 мегабайт) . Объект представляет собой запускающиеся файл с именем «start.exe»,базы данных «baza.dbf» и трех индексных файлов с расширением «*.ntx» используемых для сортировки базы данных. 1.2.Требования к программе Программа должна обеспечивать запись вновь нанятых преподавателей и исключение из списков уволенных .Однако , должна быть предусмотрена возможность восстановления удаленных данных .Для облегчения поиска необходимых данных следует предусмотреть сортировку имеющихся данных по именам преподавателей и по порядку найма .Так же для облегчения поиска предусмотреть несколько режимов работы с базой – для поиска по личным данным преподавателя и по профессиональным данным (стаж . образование , должность и так далее). 1.3.Описание входной информации и входных документов Входной информацией в программе является файл «baza.dbf» . В нем содержится вся нужная информация о педагогическом составе начиная от фамилии и заканчивая графой «Примечание» в которой хранится вспомогательные данные на попадающие ни в одну из предоставленных граф. Файлы «*.ntx» являются вспомогательными и необходимы только при работе программы .В случае их отсутствия они будут созданы автоматически. 2.Технический проект 2.1.Описание структуры базы данных и их используемые индексы ,назначение и типы всех полей базы. Структура базы данных представлена одним файлом и поэтому является поэтому является поэтому является весьма простой .Индексные файлы связаны с dbf –файлом следующим образом: файл najm.ntx связан с полем najm; файл name.ntx связан с полем name ; файл num.ntx связан с полем number. Назначение и типы всех полей базы предоставлены в таблице 1. Таблица 1 |Имя поля |тип и длина |Назначение | | | | | |Number | | | |name |character 30 |Ф.И.О | |no |numeric 12 |Индификационный номер | |posada |character 40 |Занимаемая должность | |addr |character 40 |Адрес проживания | |pasport |character 40 |Паспортные данные | |osvita |character 20 |Образование | |diplom |character 40 |Дипломные данные | |fah |character 30 |Специальность | |data_ nar |date 8|Дата рождения | |stag |date 8|Стаж в месяцах и годах | |ped_stag |date 8|Педагогический стаж | |najm |date 8|Время найма | |zvilnenja |date 8|Время увольнения | |dodatkovo |character 100 |Примечания | 2.2.Назначение глобальных переменных В программе присутствуют следующие глобальные переменные: «reg» - отвечает за то, какой режим панелей включен: 1- стандартный набор; 2- набор для проверки стажа; 3- набор для проверки личных данных; «priznak» - логическая переменная отвечающая за то следует ли входить в brows-объект или не нужно и является входным параметром для подпрограммы obnovka; «k_obnovka» - логическая переменная отвечающая за то следует ли выйти из brows-объекта или не нужно и является выходным параметром для подпрограммы obnovka. 2.3.Функциональная блок-схема 2.4.Текст исходников программы на CLIPPER-5.1 Файл «start.prg» #include "inkey.ch" #include "browse.ch" proc start memvar reg,k_obnovka,priznak use baza.dbf new // открываем базу данных reg:=1 // выбираем //стандартный набор панелей set delete off //делаем невидимыми //удаленные записи menu() //вызываем подпрограмму return proc obnovka(priznak,k_obnovka) memvar reg local k,verh,niz,levo,pravo,nkey local ob local i GO TOP // устанавливаем указатель // на начало базы verh=2 levo=1 pravo=maxcol()-1 niz= maxrow()-2 // устанавливаем границы окна @ verh-1,levo-1 clear to niz+1,pravo+1 // очищаем окно @ verh-1,levo-1,niz+1,pravo+1 box "ЙН»єјНИє" // рисуем рамку вокруг окна ob=tbrowsedb(verh,levo,niz,pravo) ob:colsep="і" ob:headsep="СН" ob:footsep="ПН" ob:colorspec="b/bg,n/w" //создаем brows-объект do case case reg=1 regone(ob) case reg=2 regtwo(ob) case reg=3 regthree(ob) endcase // заполняем обьект согласно //режиму панели WHILE(!OB:stabilize());end // стабилизируем объект while priznak nkey=0 while !ob:stable.and.nkey=0 ob:stabilize() nkey=inkey() enddo if ob:stable nkey=inkey(0) endif // опрос клавиатуры DO CASE CASE NKEY=K_DOWN OB:DOWN() CASE NKEY=K_UP OB:UP() CASE NKEY=K_RIGHT ob:right() CASE NKEY=K_LEFT ob:left() //управление курсорными клавишами case nkey=K_F8 delete k_obnovka=.t. priznak=.f. //если F8 то удалить запись выйти //из обьекта case nkey=K_F9 recall k_obnovka=.t. priznak=.f. //если F9 то восстановить запись выйти //из обьекта case nkey=K_ESC clear typeahead priznak=.f. k_obnovka=.f. //если ESC то выйти case nkey=K_ENTER redakt(recno()) k_obnovka=.t. priznak=.f. //если ENTER отредактировать //запись и выйти из объекта endcase enddo GO TOP return k_obnovka Файл «menu.prg» #INCLUDE "INKEY.CH" #INCLUDE "BOX.CH" PROC menu() Local K,i,n1,n2,n3,a,NKEY,new:="W/N,+W/B" LOCAL cScreen,TMP,cColor LOCAL TEXT_MENU MEMVAR REG,k_obnovka,priznak INDEX ON BAZA->NAME TO NAME INDEX ON BAZA->NAJM TO NAJM INDEX ON BAZA->NUMBER TO NUM //создаем индексные файлы SET INDEX TO NAME,NAJM,NUM //устанавливаем порядок индексов A:=1 //переменная А указывает на каком пункте //меню сейчас находится указатель cScreen := SAVESCREEN()//сохраняем экран setmode(43,80)//устанавливаем режим //43*80 cColor := SETCOLOR("b/bG") CLEAR SCREEN setcolor("n/bw,n/g") //устанавливаем цвета иочищаем экран @ 0,0 SAY " ” ©« ђҐ¤ ЄвЁа®ў ЁҐ Џ Ґ«Ё ђҐ¦Ё¬ ‘®авЁа®ўЄ ‡ ЇЁбм " //изображаем главное меню i=maxrow() @ i,0 SAY " ENTER - ўлЎ®а ESC - ®в¬Ґ F8 - г¤ «Ёвм § ЇЁбм F9 -ў®бв ®ўЁвм § ЇЁбм" //изображаем горячие клавиши // setcolor("b/bg") TMP:=SAVESCREEN()//сохраняем екран setmode(25,80)//изменяем режим экрана на //25*80 WHILE .T. //открываем бесконечный цикл опроса меню setcolor("n/g") DO CASE CASE A=1 @0,1 say " ” ©« " SETCOLOR("N/N") @ 2, 1 CLEAR TO 7,24 setcolor("n/w,n/g") TEXT_MENU:={} aadd(TEXT_MENU,"гЇ«®вЁвм Ў §г") aadd(TEXT_MENU,"б®еа Ёвм Ў §г") aadd(TEXT_MENU,"§ Ї®«Ёвм Ў §г § ®ў®") aadd(TEXT_MENU,"ўл室") @1,0,6,22 BOX B_DOUBLE_SINGLE K:=ACHOICE(2,1,6,21,TEXT_MENU) DO CASE CASE K=1 pack set order to 3 //уплотняем базу go top for i:=1 to lastrec() baza->number=i skip(1) next CASE K=2 case k=3 go top for i:=1 to lastrec() delete skip(1) next pack append blank //обнуляем базу CASE K=4 CLS QUIT // завершаем работу программы ENDCASE CASE A=2 @0,10 say " ђҐ¤ ЄвЁа®ў ЁҐ " SETCOLOR("N/N") @ 2, 10 CLEAR TO 5,33 setcolor("n/w,n/g") @1,9,4,31 BOX B_DOUBLE_SINGLE text_menu:={} aadd(text_menu,"C г¤ «Ґл¬Ё § ЇЁбп¬Ё") aadd(text_menu,"ЃҐ§ г¤ «Ґле § ЇЁбҐ©") K:=ACHOICE(2,10,3,30,TEXT_MENU) DO CASE CASE K=1 set delete off k_obnovka=.t. do while k_obnovka k_obnovka=obnovka(.t.,k_obnovka) enddo //входим в обьект с удаленными записями CASE K=2 set delete on k_obnovka=.t. do while k_obnovka k_obnovka= obnovka(.t.,.t.) enddo //входим в объект без удаленных записей ENDCASE CASE A=3 @0,28 say " Џ Ґ«Ё " SETCOLOR("N/N") @ 2, 28 CLEAR TO 6,61 setcolor("n/w,n/g") @1,27,5,60 BOX B_DOUBLE_SINGLE TEXT_MENU:={} aadd(TEXT_MENU,"бв ¤ авл© Ў®а Ја д") aadd(TEXT_MENU," Ў®а Їа®ўҐаЄг бв ¦ ") aadd(TEXT_MENU," Ў®а Їа®ўҐаЄг «Ёзле ¤ ле") K:=ACHOICE(2,28,4,59,TEXT_MENU) do case case k=1 reg:=1 k_obnovka=.t. do while k_obnovka k_obnovka= obnovka(.t.,.t.) enddo //устанавливаем режим панелей 1 case k=2 reg:=2 k_obnovka=.t. do while k_obnovka k_obnovka= obnovka(.t.,.t.) enddo //устанавливаем режим панелей 2 case k=3 reg:=3 k_obnovka=.t. do while k_obnovka k_obnovka= obnovka(.t.,.t.) enddo //устанавливаем режим панелей 3 endcase CASE A=4 @0,37 say " ђҐ¦Ё¬ " SETCOLOR("N/N") @ 2, 37 CLEAR TO 5,62 setcolor("n/w,n/g") @1,36,4,61 BOX B_DOUBLE_SINGLE text_menu={} aadd(text_menu,"80*25") aadd(text_menu,"80*50") K:=ACHOICE(2,37,3,60,TEXT_MENU) do case case k=1 setmode(25,80) cls //устанавливаем режим экрана 25*80 case k=2 setmode(43,80) cls //устанавливаем режим экрана 43*80 endcase CASE A=5 @0,45 say " ‘®авЁа®ўЄ " SETCOLOR("N/N") @ 2, 45 CLEAR TO 6,70 setcolor("n/w,n/g") @1,44,5,69 BOX B_DOUBLE_SINGLE text_menu:={} aadd(text_menu,"Ї® Ё¬ҐЁ") aadd(text_menu,"Ї® Ї®ап¤Єг ¤®Ў ў«ҐЁп") aadd(text_menu,"Ї® Ї®ап¤Єг ©¬ ") K:=ACHOICE(2,45,4,68,TEXT_MENU) DO CASE CASE K=1 SET ORDER TO 1 k_obnovka=.t. do while k_obnovka k_obnovka= obnovka(.t.,.t.) enddo //сортируем базу по имени CASE K=2 SET ORDER TO 3 k_obnovka=.t. do while k_obnovka k_obnovka= obnovka(.t.,.t.) enddo //сортируем базу по времени найма CASE K=3 SET ORDER TO 2 k_obnovka=.t. do while k_obnovka k_obnovka= obnovka(.t.,.t.) enddo //сортируем базу по порядку добавления ENDCASE GO TOP CASE A=6 @0,60 say " ‡ ЇЁбм " SETCOLOR("N/N") @ 2, 60 CLEAR TO 4,48 setcolor("n/w,n/g") @1,59,3,79 BOX B_DOUBLE_SINGLE text_menu:={} aadd(text_menu,"¤®Ў ўЁвм") K:=ACHOICE(2,60,2,78,TEXT_MENU) DO CASE CASE K=1 APPEND BLANK GO LASTREC() baza->number=lastrec() REDAKT(RECNO()) k_obnovka=.t. do while k_obnovka k_obnovka=obnovka(.t.,k_obnovka) enddo // добавляем новую запись ENDCASE ENDCASE //конец обработки содержимого //выбранного пункта меню NKEY:=LASTKEY() DO CASE CASE NKEY=K_LEFT IF A>1 A-- ELSE A:=6 ENDIF //двигаем указатель меню влево CASE NKEY=K_RIGHT IF A<6 A++ ELSE A:=1 ENDIF //двигаем указатель меню вправо ENDCASE RESTSCREEN(,,,,TMP) //восстанавливаем экран ENDDO SETCOLOR(cColor) // @ MAXROW(), 0 setmode(25,80) RESTSCREEN(,,,,cScreen) //восстанавливаем экран и прекращаем //работу Return Файл «regi.prg» proc regone(ob) local s s=tbcolumnnew("ьЏ.Џ",{||baza->number}) ob:addcolumn(s) s=tbcolumnnew("”ЂЊ€‹€џ €. Ћ.",{||baza->name}) ob:addcolumn(s) s=tbcolumnnew("€Ќ„€”.ЌЋЊ…ђ",{||baza->no}) ob:addcolumn(s) s=tbcolumnnew("„Ћ‹†ЌЋ‘’њ",{||baza->posada}) ob:addcolumn(s) s=tbcolumnnew("Ђ„ђ…‘",{||baza->addr}) ob:addcolumn(s) s=tbcolumnnew("ЏЂ‘ЏЋђ’",{||baza->pasport}) ob:addcolumn(s) s=tbcolumnnew("ЋЃђЂ‡Ћ‚ЂЌ€…",{||baza->osvita}) ob:addcolumn(s) s=tbcolumnnew("„€Џ‹ЋЊЌ›… „ЂЌ›…",{||baza->diplom}) ob:addcolumn(s) s=tbcolumnnew("‘Џ…–€Ђ‹њЌЋ‘’њ",{||baza->fah}) ob:addcolumn(s) s=tbcolumnnew("„Ђ’Ђ ђЋ†„…Ќ€џ",{||baza->data_nar}) ob:addcolumn(s) s=tbcolumnnew("‘’Ђ†",{||baza->stag}) ob:addcolumn(s) s=tbcolumnnew("Џ…„.‘’Ђ†",{||baza->ped_stag}) ob:addcolumn(s) s=tbcolumnnew("ЌЂ‰Ќџ’",{||baza->najm}) ob:addcolumn(s) s=tbcolumnnew("“‚Ћ‹…Ќ",{||baza->zvilnenja}) ob:addcolumn(s) s=tbcolumnnew("Џђ€Њ…—ЂЌ€…",{||baza->dodatkovo}) ob:addcolumn(s) //заполняем brows-обьект return ob proc regtwo(ob) local s s=tbcolumnnew("ьЏ.Џ",{||baza->number}) ob:addcolumn(s) s=tbcolumnnew("”ЂЊ€‹€џ €. Ћ.",{||baza->name}) ob:addcolumn(s) s=tbcolumnnew("„Ћ‹†ЌЋ‘’њ",{||baza->posada}) ob:addcolumn(s) s=tbcolumnnew("‘’Ђ†",{||baza->stag}) ob:addcolumn(s) s=tbcolumnnew("Џ…„.‘’Ђ†",{||baza->ped_stag}) ob:addcolumn(s) s=tbcolumnnew("ЌЂ‰Ќџ’",{||baza->najm}) ob:addcolumn(s) s=tbcolumnnew("“‚Ћ‹…Ќ",{||baza->zvilnenja}) ob:addcolumn(s) s=tbcolumnnew("ЋЃђЂ‡Ћ‚ЂЌ€…",{||baza->osvita}) ob:addcolumn(s) s=tbcolumnnew("„€Џ‹ЋЊЌ›… „ЂЌ›…",{||baza->diplom}) ob:addcolumn(s) s=tbcolumnnew("‘Џ…–€Ђ‹њЌЋ‘’њ",{||baza->fah}) ob:addcolumn(s) s=tbcolumnnew("Ђ„ђ…‘",{||baza->addr}) ob:addcolumn(s) s=tbcolumnnew("ЏЂ‘ЏЋђ’",{||baza->pasport}) ob:addcolumn(s) s=tbcolumnnew("€Ќ„€”.ЌЋЊ…ђ",{||baza->no}) ob:addcolumn(s) s=tbcolumnnew("„Ђ’Ђ ђЋ†„…Ќ€џ",{||baza->data_nar}) ob:addcolumn(s) s=tbcolumnnew("Џђ€Њ…—ЂЌ€…",{||baza->dodatkovo}) ob:addcolumn(s) //заполняем brows-обьект proc regthree(ob) local s s=tbcolumnnew("ьЏ.Џ",{||baza->number}) ob:addcolumn(s) s=tbcolumnnew("”ЂЊ€‹€џ €. Ћ.",{||baza->name}) ob:addcolumn(s) s=tbcolumnnew("Ђ„ђ…‘",{||baza->addr}) ob:addcolumn(s) s=tbcolumnnew("ЏЂ‘ЏЋђ’",{||baza->pasport}) ob:addcolumn(s) s=tbcolumnnew("€Ќ„€”.ЌЋЊ…ђ",{||baza->no}) ob:addcolumn(s) s=tbcolumnnew("„Ђ’Ђ ђЋ†„…Ќ€џ",{||baza->data_nar}) ob:addcolumn(s) s=tbcolumnnew("„Ћ‹†ЌЋ‘’њ",{||baza->posada}) ob:addcolumn(s) s=tbcolumnnew("‘’Ђ†",{||baza->stag}) ob:addcolumn(s) s=tbcolumnnew("Џ…„.‘’Ђ†",{||baza->ped_stag}) ob:addcolumn(s) s=tbcolumnnew("ЌЂ‰Ќџ’",{||baza->najm}) ob:addcolumn(s) s=tbcolumnnew("“‚Ћ‹…Ќ",{||baza->zvilnenja}) ob:addcolumn(s) s=tbcolumnnew("ЋЃђЂ‡Ћ‚ЂЌ€…",{||baza->osvita}) ob:addcolumn(s) s=tbcolumnnew("„€Џ‹ЋЊЌ›… „ЂЌ›…",{||baza->diplom}) ob:addcolumn(s) s=tbcolumnnew("‘Џ…–€Ђ‹њЌЋ‘’њ",{||baza->fah}) ob:addcolumn(s) s=tbcolumnnew("Џђ€Њ…—ЂЌ€…",{||baza->dodatkovo}) ob:addcolumn(s) //заполняем brows-обьект return ob proc redakt(polenom) local ekran local a,buf,k ekran:=savescreen() a:={} aadd(a,baza->name) aadd(a,baza->no) aadd(a,baza->posada) aadd(a,baza->addr) aadd(a,baza->osvita) aadd(a,baza->diplom) aadd(a,baza->fah) aadd(a,baza->data_nar) aadd(a,baza->stag) aadd(a,baza->ped_stag) aadd(a,baza->najm) aadd(a,baza->zvilnenja) aadd(a,baza->dodatkovo) //заполняем массив а содержимым записи @5,5 clear to 20,75 @5,5,20,75 box"ЙН»єјНИє" @6,20 say "€¬п:" get a[1] @7,6 say "€¤ЁдЁЄ жЁ®л© ®¬Ґа: " get a[2] @8,6 say "‡ Ё¬ Ґ¬ п ¤®«¦®бвм: " get a[3] @9,6 say "Ђ¤аҐб: " get a[4] @10,6 say "ЋЎа §®ў ЁҐ: " get a[5] @11,6 say "„ЁЇ«®¬лҐ ¤ лҐ: " get a[6] @12,6 say "CЇҐжЁ «м®бвм: " get a[7] @13,6 say "„ в ஦¤ҐЁп: " get a[8] @14,6 say "‘в ¦:" get a[9] @14,20 say "ЏҐ¤ Ј®ЈЁзҐбЄЁ© бв ¦: " get a[10] @15,6 say "Ќ пв:" get a[11] @16,6 say "“ў®«Ґ:" get a[12] @17,6 say "ЏаЁ¬Ґз Ёп:" get a[13] read //изображаем выбранную запись на экране //и производим редактирование if updated() @10,30 clear to 10,55 @9,29,11,56 box"ЙН»єјНИє" @10,31 say "‡ ЇЁб вм Ё§¬ҐҐЁп?(enter/esc)" k=inkey(0) do case case k=13 baza->name=a[1] baza->no=a[2] baza->posada=a[3] baza->addr=a[4] baza->osvita=a[5] baza->diplom=a[6] baza->fah=a[7] baza->data_nar=a[8] baza->stag=a[9] baza->ped_stag=a[10] baza->najm=a[11] baza->zvilnenja=a[12] baza->dodatkovo=a[13] //если ENTER то запомнить изменения endcase endif restscreen(,,,,ekran) //восстанавливаем экран return 2.5.Описание текстовых примеров 3.Документация 3.1.Инструкция пользователю Программный продукт «Учет педагогического состава во внешкольном учреждении» был разработан Баштой Павлом Леонидовичем весной-летом 2000 года для клуба юного техника «Смена» в рамках курсового проекта по предмету «Основы баз данных и информации». Стартовым файлом программы является файл «start.exe». После запуска программы вы сразу попадаете в главное меню. Оно содержит следующие пункты: -файл ; -редактирование ; -панель; -режим; -сортировка; -запись. Пункт «файл» позволяет производить операции с диском: -уплотнить базу – уплотняет базу путем физического удаления из нее удаленных логически записей; -сохранить базу – функция не была реализована в рамках курсового проекта, предусматривалось что она позволит сохранять базу данных под другим именем; -заполнить базу заново – функция удаляет все записи базы и создает пустую запись; -выход – прекращение работы программы. Пункт «Редактирование» позволяет выбрать доступ к записям: -с удаленными записями – позволяет редактировать физически существующие записи независимо от их логического состояния; -без удаленных записей – позволяет редактировать только логически существующие записи без отображения логически удаленных записей. Пункт «Панели» позволяет выбрать необходимый порядок полей записей: -стандартный набор – поля записей расположены так как они были расположены в книге чета педагогического состава; -набор для проверки стажа – поля отвечающие за информацию о стаже и профессиональную принадлежность располагаются ближе к полю имени педагога для удобного поиска по данным стажа; -набор для проверки личных данных – возле поля имени педагога расположены поля отвечающие за личные данные человека. Поле «Режим» позволяет выбрать режим просмотра: -43*80 – 43 строки и 80 столбцов; -25*80 – 25 строк и 80 столбцов. Поле «Сортировка» позволяет отсортировать записи в следующих порядках: -по имени – в алфавитном порядке о графе «Ф.И.О»; -по порядку добавления – по графе «№П.П.»; -по порядку найма – по графе «Нанят». Поле «Запись» позволяет создать новую запись. При редактировании базы действуют следующие горячие клавиши: -F8 – удалить запись на которую наведен курсор; -F9 – восстановить удаленную запись на которую наведен курсор; -ESC – отказаться от выбора, изменения или редактирования; -ENTER – выбрать пункт меню или выбор записи для редактирования. Перемещние по базе данных и меню производится курсорными клавишами. Внимание!!! Программа работает только с одной базой данных которая расположена в файле «baza.dbf».В случае удаления или порчи этого файла программа престает быть работоспособной. Будте осторожны и предусмотрительны – не постесняйтесь сделать его резервную копию в другом каталоге. 3.2.Инструкция системному программисту Программный продукт «Учет педагогического состава во внешкольных учреждениях» написан на языке программирования «Clipper 5.1».Исходник представляет собой пять файлов с расширением «.prg».При компиляции необходимо файл start.prg распологать в начале компилируемого файла. В порядке усовершенствования программы можно посоветовать добавить функцию создания копии базы создав для этого удобный интерфейс выбора директории в которой необходимо сохранить копию, Использованая литература