Смекни!
smekni.com

Разработать программу на алгоритмическом языке программирования С , реализующую учебную систему (стр. 1 из 2)

Разработать программу на алгоритмическом языке программирования С++ , реализующую учебную систему управления базой данных (СУБД).

Отчёт к работе по курсу "Системное программирование"

Разработал: Чепасов И.А.

Пензенский Государственный Технический Университет, Кафедра: "Информационно-вычислительные системы"

1998

1 Формулировка задачи

Разработать программу на алгоритмическом языке программирования С++ , реализующую учебную систему управления базой данных (СУБД).

2 Техническое задание

2.1 Основание для разработки

Основанием для разработки служит задание по дисциплине "Системное программирование", выданное на кафедре ИВС ПГТУ.

2.2 Требования к программе

2.2.1 Требования к функциональным характеистикам

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

Информация о студентах должна содержать следующие данные:

ФИО

Год рождения:

Адрес

Учебная группа.

Входными данными программы являеются: исходная база данных , которая хранится на диске под именем base_o.dat и данные , вводимые или изменяемые пользователем в процессе работы программы.

Выходными данными в программе является база данных , которая записывается на диск под именем base_o.dat по завершении работы программы.

2.2.2 Требования к составу и параметрам технических средств

Программа должна работать на стандартном комплексе технических средств из состава персональных компьютеров IBM PC с процессором i386 или выше.

2.2.3 Требования к программной и информационной совместимости

Программа должна работать с операционной системой MS-DOS 6.0 или выше.

Программа должна быть написана на языке программирования С++l v.3.1.

2.3 Порядок контроля и приёмки

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

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

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

Интерфейсная часть программы основана на абстрактном классе wind, содержащем общие для всех окон данные, такие как расположение, размер и цвет окон, и виртуальные методы, такие как перерисовка, активизация. На основе этого класса создаются все остальные классы, перекрывающие виртуальные методы конкретно для данного типа визуальных объектов. Создается цепочка окон, адресуемая через её первый элемент. При запуске метода redr первого элемента он должен обеспечить перерисовку вех последующих путем вызова того же метода всех остальных объектов, поскольку в цепочку могут быть соединены любые классы на основе wind. При нажатии TAB активным становится следующий в цепочке элемент.

Конкретно кажждый класс содержит следующие поля и методы:

Класс wind - абстрактный класс, при использовании выдает рамку

Поля:

x,y,dx,dy - расположение и размеры окна

pap,ink,apap - цвета окна

ts - возможность активизации

next - указатель на следующее окно.

Методы:

add - добавление нового окна в список.

Класс ed_win - класс строк редактирования, при ts=0 используется как строка вывода без возможности редактирования.

Собственные поля:

capt - содержимое

pcapt - старое содержимое

maxlen - максимальная длина строки.

Виртуальные методы:

redr, active.

Класс bt_win - класс кнопок

Собственные поля:

fun - указатель на вызываемую при активизации функцию

capt - содержимое кнопки.

Виртуальные методы:

redr, active.

Класс sc_win - класс скроллеров, зависит от конкретного применения

Собственные поля:

m_fio, m_addr, m_yy, m_grp - маски полей класса One_Record

pnt - первый элемент списка.

Виртуальные методы:

redr, active.

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

Поля класса:

fio, yy, addr, grp - данные о студенте

next - следующий элемент

last - предыдущий элемент.

Методы класса:

save - запись в файл текущего и всех последующих элементов

FindUp - поиск вверх по списку

FindDown - поиск вниз по списку.

Эти методы возвращают указатель на найденый элемент списка:

add - добавление элемента в список.

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

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

4 Анализ результатов тестирования

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

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

Заключение

В процессе работы была определена структура данных программы , разработан алгоритм решения задачи , была разработана структура программы.

Реализация программы была проведена на алгоритмическом языке С++l v.3.10.

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

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <graphics.h>

#include <string.h>

#include <dos.h>

#include <sys&bsol;stat.h>

#include <io.h>

#include <fcntl.h>

// ОПИСАНИЯ КЛАССОВ -------------------------------------------

// Класс, определяющий один элемент базы данных

class One_Record {

public:

char fio[60]

// ФИО

char yy[5]

// Год рождения

char addr[60]

// Адрес

char grp[10]

// Группа

One_Record * next

// Следующий

One_Record * last

// Предыдущий

One_Record(int,One_Record *)

// Конструктор - читает элемент из файла

// Конструктор - создает новый элемент

One_Record(char * m_fio,char * m_yy,char * m_addr,char * m_grp)

// Деструктор

~One_Record(){}

// Запись в файл

void save(int)

// Поисквперед

One_Record * FindUp(char * m_fio,char * m_yy,char * m_addr,char * m_grp)

// Поискназад

One_Record * FindDown(char * m_fio,char * m_yy,char * m_addr,char * m_grp)

// Добавление

void add(One_Record * )

}

// Классокон

class wind {

public:

int x,y,dx,dy

// Координаты и размеры окна

int pap,ink,apap

// Цветаокна

char ts

// Активизируется или нет при нажатии TAB

wind * next

// Следующее

wind(int,int,int,int)

// Конструктор

~wind(){}

// Деструктор

void add(void * p)

// Добавить в список

void setact(char)

// Изменить значение флага TS

virtual void redr()

// Перерисовка

virtual void * active()

// Активизироать - возвращает указатель на

// следующее активное

}

// Потомок класса WIND - строка редактирования

class ed_win:public wind {

public:

char capt[100]

// Содержимое

char pcapt[100]

// Предыдущее содержимое

int maxlen

// Максимальная длинна

public:

// Конструктор

ed_win(int,int,int,int,char *,int)

// Перерисовка

virtual void redr()

// Активизация

virtual void * active()

}

// Потомок WIND - кнопка

class bt_win:public wind {

void (*fun)()

// Вызываемая при нажатии функция

char capt[50]

// Название

public:

// Конструктор

bt_win(int,int,int,int,char *,void (*)())

// Перерисовка

virtual void redr()

// Активизация

virtual void * active()

}

// Скроллер

class sc_win:public wind {

public:

// Маскавыбора

char * m_fio

char * m_addr

char * m_yy

char * m_grp

// Начальный элемент

One_Record * pnt

// Конструктор

sc_win(int,int,int,int,One_Record *,char*,char*,char*,char*)

// Перерисовка

virtual void redr()

// Активизация

virtual void * active()

}

// ПРОТОТИПЫФУНКЦИЙКНОПОК -----------------------------------

void fun_add()

void fun_del()

void up()

void down()

void find()

void edit()

void fun_exit()

void about()

// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ --------------------------------------

// Указатель на активное окно

wind * act

// Флаг, устанавливаемый для выхода

int f_exit=0

// Список окон оснвного меню

wind * stwin

// Список окон меню ввода данных

wind * edwin

// Первый и текущий элементы базы данных

One_Record * ndb=NULL

One_Record * ctb=NULL

// Данные о окнах меню

// Основное меню

bt_win add_w(10,10,60,30," New ",fun_add)

bt_win del_w(80,10,60,30," Del ",fun_del)

bt_win edt_w(150,10,60,30," Edit ",edit)

bt_win fin_w(220,10,60,30," Find ",find)

bt_win ext_w(290,10,60,30," Exit ",fun_exit)

bt_win abt_w(360,10,60,30," About ",about)

bt_win up_w(430,10,30,14," Up ",up)

bt_win down_w(430,26,30,14," Dn ",down)

// Ввод/редактирование данных о студенте/ввод маски поиска

ed_win ifio(100,100,400,30," FIO ",55)

ed_win iyy(100,140,400,30,"Year",4)

ed_win iaddr(100,180,400,30," Addres ",55)

ed_win igrp(100,220,400,30," Group ",9)

// ГЛОБАЛЬНЫЕ ФУНКЦИИ -----------------------------------------

// Функция сравнения строки A с маской B

int stc(char * a,char * b) {

int n

if (strlen(a)<strlen(b)) return 0

for (n=0

n<strlen(b)

n++) if (a[n]!=b[n]) return 0

return 1

}

// ОПИСАНИЯ МЕТОДОВ КЛАССОВ -----------------------------------

// Объект ЗАПИСЬ ------------------------------------------

// Конструктор

One_Record::One_Record(char * m_fio,char * m_yy,char * m_addr,char * m_grp) {

strcpy(fio,m_fio)

strcpy(yy,m_yy)

strcpy(addr,m_addr)

strcpy(grp,m_grp)

next=NULL

last=NULL

}

// Коснтруктор для случая чтения из файла