3 Блок-схема алгоритма
3.1 Основное тело программы.

3.2 Процедура Vvod.

3.3 Процедура poisk.

3.4 Процедура edit.


4 Описание алгоритма программы
Для создания базы данных на турбо паскале было использовано 3 модуля: dos, crt и graph. Модуль dos использовался исключительно для прикрепления к программе курсора. Модуль Graph используется для создания графического меню и отображения указателя. Модуль crt используется в ряде операций, связанных с заставкой.
4.1 Основное тело программы.
BEGIN
textcolor(15); //{Выбор белого цвета текста}
Writeln(' Курсовая работа ');
Writeln(' По информатике ');
Writeln(' Студента группы АТ-07-1 ');
Writeln(' Электротехнического факультета ПГТУ ');
textcolor(4); //{Выбор красного цвета текста}
Writeln(' Малькова Вячеслава Сергеевича ');
textcolor(15); //{Выбор белого цвета текста}
Writeln; //{Пропуск строки}
Writeln(' Тема курсовой работы: ');
textcolor(4); //{Выбор красного цвета текста}
Writeln(' База данных ');
textcolor(15); //{Выбор белого цвета текста}
Writeln;Writeln;Writeln;Writeln;
writeln(' Программа: ROCK BASE vol. 1.0 ');
Writeln;Writeln;Writeln;Writeln;Writeln;Writeln;Writeln;Writeln;Writeln;
textcolor(14); //{Выбор желтого цвета текста}
Write(' Для начала работы нажмите любую клавишу ');
textcolor(15); //{Выбор белого цвета текста}
readkey; //{Ожидает нажатие клавиши}
gd:=0;
(f,'data.pas'); //{Обращение к файлуdata.pas, лежащему в каталоге с паскалем}
setmouserange(0,0,320,480);
gd:=0;
repeat
initgraph(gd,gm,''); //{запуск графического режимаgraph}
cleardevice; //{очистка экрана}
rectangle(0,0,150,50);//{Построение прямоугольника}
floodfill(1,1,15); //{Заливка прямоугольника белым цветом}
setcolor(0); //(Выбор чёрного цвета для рисования)
outtextXY(5,20,'ROCKBASEvol. 1.0'); //{Вывод текста в указанном месте}
setcolor(15); //(Выбор белого цвета для рисования)
y:=40;
for i:=1 to 7 do
begin
rectangle(220,y,420,y+40); //{Построение прямоугольника}
outtextxy(220+(200-length(t[i])*8)div2,y+20,t[i]); //{Вывод текста в указанном месте}
y:=y+60
end;
showcursor; //{Процедура, которая показывает курсор}
movemouse(xm,ym); //{Процедура, которая определяет координаты указателя}
closecursor; //{Процедура, которая убирает курсор}
if(ym>40)and(ym<80)thenvvod; //{При щелчке в заданную область экрана выполняется процедураvvod}
if(ym>100)and(ym<140)thenvew; //{При щелчке в заданную область экрана выполняется процедураvew}
if(ym>160)and(ym<200)thenpoisk; //{При щелчке в заданную область экрана выполняется процедураpoisk}
if(ym>220)and(ym<260)thendel; //{При щелчке в заданную область экрана выполняется процедураdel}
if(ym>280)and(ym<320)thenedit; //{При щелчке в заданную область экрана выполняется процедураedit}
if(ym>340)and(ym<380)thencort; //{При щелчке в заданную область экрана выполняется процедураcort}
until(ym>400)and(ym<440); //{При щелчке в заданную область экрана выполняется выход из программы}
closegraph; //{При щелчке в заданную область экрана выполняется процедураpoisk}
END.
В основном теле программы выполняется вывод на экран начальной заставки с помощью стандартной функции write, предназначенной для вывода текста. Для изменения цвета текста используется стандартная функция textcolor. Для возможности прочтения текста заставки используется функция readkey, которая ожидает нажатие клавиши, прежде чем продолжить выполнение программы. Далее используется цикл Repeat, предназначенный для создания эффекта движения курсора. В цикле рисуется графическое меню, состоящее из заголовка и кнопок. Кнопки и заголовок изображаются спомощью функции rectangle и outtext, первая из которых рисует прямоуголник в заданном месте экрана, а вторая выводит текст в заданном месте. Также при изображении заголовка использовалась функция floodfill, которая заливает указанным цветом область, ограниченную линиями заданного цвета. Далее используются процедуры showcursor, movemouse и closecursor. Первая и последняя предназначены для отображения курсора, а вторая определяет координаты курсора. Для работы кнопок меню используется условный оператор if, т. е. при щелчке в определённую область экраны должна выполнятся некая процедура.
4.2 Процедура Vvod.
procedure vvod;
var i,j,n:integer;ch:char;
Begin
closegraph; //{Закрытие графического режима}
writeln('********************************');
writeln('*Добывление новой группы в базу*');
writeln('********************************');
writeln; //{Пропуск строки}
reset(f); //{Открытие файла для чтения}
i:=0;
while not eof(f) do
begin
inc(i); //{увеличивает значение переменной на 1}
new(a[i]); //{выделение необходимого количество памяти для хранения данных}
read(f,a[i]^); //{запись из файла в динамический массив}
end;
repeat
inc(i);
new(a[i]);
write('Название: ');
readln(a[i]^.group); //{Ввод названия добавляемой группы}
write('Стиль: ');
readln(a[i]^.style); //{Ввод стиля добавляемой группы}
write('Страна: ');
readln(a[i]^.country); //{Ввод страны добавляемой группы}
write('Количесво альбомов: ');
readln(a[i]^.albums); //{Ввод числа альбомов добавляемой группы}
write('Лейбл: ');
readln(a[i]^.Rlabel); //{Ввод стиля лейбла группы}
write('Рейтинг: ');
readln(a[i]^.Rating); //{Ввод рейтинга добавляемой группы}
writeln;
write('Ввести еще? (y/n): ');
readln(ch); {Воод: продолжить добавление, да или нет}
until ch='n';
n:=i;
for j:=1 to n do //
for i:=1 to n-j do //{Сортировка по названию}
if a[i]^.group > a[i+1]^.group then swap(a[i]^,a[i+1]^);//
rewrite(f); //{Открыть файл для записи}
fori:=1tondowrite(f,a[i]^); //{Запись готовой базы из динамического массива в файл}
close(f); //{Закрыть файл}
Процедура Vvod предназначена для добавления записей в базу. В начале закрываем графический режим спромощью процедуры closegraph, т.к. Далее программа работает уже не в графическом режиме. После следует вывод заголовка cпомощью оператора write. Далее следует цикл While, предназначенный для заполнения динамического массива записями из файла. Увеличивая значение i на 1 при помощи функции inc, считываем из файла записи и копируем их в динамический массив при помощи оператора read. Для выделения определённого количества информации из оперативной памяти используется функция new. Далее в цикле repeat вводится новая информация по каждому полю записи и сохраняется в динамическом массиве. После завершения ввода и записи в динамический массив одной записи выводится запрос на ввод ещё одной, и цикл будет работать до тех пор, пока пользователь не даст отрицательный ответ, за что отвечает оператор until. После выполняется сортировка «методом пузырька», которая предназначена для того, чтобы записи были всегда упорядочены в алфавитном порядке. Далее при помощи процедуры rewrite открываем файл для записи и копируем в него все данные из динамического массива спомощью оператора read.
4.3 Процедура view.
procedure view;
var i,n:integer;ch:char;
Begin
closegraph; //{Закрытие графического режима}
writeln('***************');
writeln('*Просмотр базы*');
writeln('***************');
writeln; //{Пропуск строки}
reset(f); //{Открытие файла для чтения}
i:=0;
while not eof(f) do
begin
inc(i); //{увеличивает значение переменной на 1}
new(a[i]); //{выделение необходимого количество памяти для хранения данных}
read(f,a[i]^); //{запись из файла в динамический массив}
end;
n:=i;
i:=0;
repeat
inc(i);
writeln('Название: ',a[i]^.group); //
writeln('Стиль: ',a[i]^.style); //
writeln('Страна: ',a[i]^.country); //
writeln('Количество альбомов: ',a[i]^.albums);//{Вывод i-той записи на экран}
writeln('Лейбл: ',a[i]^.Rlabel); //
writeln('Рейтинг: ',a[i]^.Rating); //
writeln;//{Пропуск строки}
if i<>n then begin
write('показать следующую? (y/n): ');
readln(ch);end
else ch:='n';
writeln;
until (ch='n');
Write('Нажмите любую клавишу для выхода в главное меню');
readln;
End;
Данная процедура предназначена для просмотра базы данных. В начале закрываем графический режим спромощью процедуры closegraph, т.к. Далее программа работает уже не в графическом режиме. После следует вывод заголовка cпомощью оператора write. Далее следует цикл While, предназначенный для заполнения динамического массива записями из файла. Увеличивая значение i на 1 при помощи функции inc, считываем из файла записи и копируем их в динамический массив при помощи оператора read. Для выделения определённого количества информации из оперативной памяти используется функция new. Далее выполняется вывод первой записи из динамического массива в цикле repeat, причём после вывода каждой записи выводится запрос на вывод следующей либо не вывод, в случаи не вывода цикл repeat прекращает свою работу и по нажатию любой клавиши программ возвращается в главное меню.
4.4 Процедура poisk.
procedure poisk;
var s:string; i,n:integer; ch:char;
Begin
closegraph; //{Закрытие графического режима}
writeln('**************************');
writeln('*Поиск группы по названию*');
writeln('**************************');
writeln('Примечание: по вводе названия искомой группы, вводте каждое отдельное слово с заглавной группы');
writeln; //{Пропуск строки}
reset(f); //{Открытие файла для чтения}
i:=0;
while not eof(f) do
begin
inc(i); //{увеличивает значение переменной на 1}
new(a[i]); //{выделение необходимого количество памяти для хранения данных}
read(f,a[i]^); //{запись из файла в динамический массив}
end;
n:=i;
repeat
writeln;
write('Введите название группы: ');
readln(s); //{Ввод названия искомой группы}
writeln;
i:=0;
repeat
inc(i); //{увеличивает значение переменной на 1}
untilravno(s,a[i]^.group)or(i=n); //{сравнение каждого названия с введенным}
if not ravno(s,a[i]^.group) then writeln('Такой группы в базе нет');
if ravno(s,a[i]^.group) then
begin
writeln('Название: ',a[i]^.group); //
writeln('Стиль: ',a[i]^.style); //
writeln('Страна: ',a[i]^.country); //
writeln('Количество альбомов: ',a[i]^.albums); //{вывод записи с заданным именем}
writeln('Лейбл: ',a[i]^.Rlabel); //
writeln('Рейтинг: ',a[i]^.rating); //
end;
writeln;
write('Искать еще? (y/n): '); //{продолжать поиск: да или нет}
readln(ch)
until(ch='n')
End;
Процедура poisk предназначена для нахождения нужной записи в базе. В начале закрываем графический режим спромощью процедуры closegraph, т.к. Далее программа работает уже не в графическом режиме. После следует вывод заголовка cпомощью оператора write. Далее следует цикл While, предназначенный для заполнения динамического массива записями из файла. Увеличивая значение i на 1 при помощи функции inc, считываем из файла записи и копируем их в динамический массив при помощи оператора read. Для выделения определённого количества информации из оперативной памяти используется функция new. Далее в цикле repeat вводится название искомой группы и спомощью функции ravno, описанной отдельно, введенное название сравнивается с каждым полем названия группы из динамического массива и если совпадает, то на экран выводится найденная по названию запись. После выводится запрос на дальнейший поиск, если пользователь отклоняет его, то цикл repeat и сама процедура заканчивают свою работу.
4.5 Процедура del.
procedure del;
var s:string; i,j,n:integer; ch:char;
Begin
closegraph; //{Закрытие графического режима}
writeln('************************');
writeln('*Удалить группу из базы*');
writeln('************************');
writeln('Примечание: по вводе названия удаляемой группы, вводте каждое отдельное слово с заглавной группы');
writeln; //{Пропуск строки}
reset(f); //{Открытие файла для чтения}
i:=0;
while not eof(f) do
begin
inc(i); //{увеличивает значение переменной на 1}
new(a[i]); //{выделение необходимого количество памяти для хранения данных}
read(f,a[i]^); //{запись из файла в динамический массив}
end;
n:=i;
repeat
write('Введите название удаляемой группы: ');
readln(s); //{Ввод названия удаляемой группы}
writeln;//{Пропуск строки}
i:=0;
repeat
inc(i); //{увеличивает значение переменной на 1}
until ravno(s,a[i]^.group) or (i=n);
if not ravno(s,a[i]^.group) then writeln('Такой группы нет');
if ravno(s,a[i]^.group) then
begin
writeln('Название: ',a[i]^.group); //
writeln('Стиль: ',a[i]^.style); //
writeln('Страна: ',a[i]^.country); //
writeln('Количество альбомов: ',a[i]^.albums); // {Вывод записи на экран}
writeln('Лейбл: ',a[i]^.Rlabel); //
writeln('Рейтинг: ',a[i]^.rating); //
writeln;//{Пропуск строки}
write('Удалить? (y/n): '); //{вывод: удалить запись? Да или нет}
readln(ch);
if ch='y' then
begin
for j:=i to n-1 do
a[j]^:=a[j+1]^;
if j=n then
Dispose(a[j]); //{возвращает определенное количество памяти в кучу}
end;
end;
writeln; //{Пропуск строки}
write('Удалить еще? (y/n): ');
readln(ch)
until ch='n';
rewrite(f); //{Открыть файл для записи}
for i:=1 to n-1 do write(f,a[i]^);
close(f) //{Закрыть файл}
End;
Процедура del предназначена для удаления не нужной записи из базы. В начале закрываем графический режим спромощью процедуры closegraph, т.к. Далее программа работает уже не в графическом режиме. После следует вывод заголовка cпомощью оператора write. Далее следует цикл While, предназначенный для заполнения динамического массива записями из файла. Увеличивая значение i на 1 при помощи функции inc, считываем из файла записи и копируем их в динамический массив при помощи оператора read. Для выделения определённого количества информации из оперативной памяти используется функция new. Далее в цикле repeat вводится название удаляемой группы и спомощью функции ravno, описанной отдельно, введенное название сравнивается с каждым полем названия группы из динамического массива и если оно совпадает, то на экран выводится найденная по названию запись, после чего выводится запрос на удаление. В случаи положительного ответа на запрос данная запись удаляется путём сдвига элементов динамического массива начиная с удаляемого и заканчивая предпоследним. Далее выводится запрос на удаление ещё одной записи, в случаи отказа файл заполняется элементами динамического массива спомощью функции rewrite.
4.6 Процедура edit.
procedure edit;
var s:string; i,j,n,kod:integer; ch:char;
p:array[1..8] of string[30]; //{Промежуточный массив}
Begin
closegraph; //{Закрытие графического режима}
writeln('***********************');
writeln('*Редактирование данных*');
writeln('***********************');
writeln('Примечание: по вводе названия редактируемой группы, вводте каждое отдельное слово с заглавной группы');
writeln; //{Пропуск строки}
reset(f); //{Открытие файла для чтения}
i:=0;
while not eof(f) do
begin
inc(i); //{увеличивает значение переменной на 1}
new(a[i]); //{выделение необходимого количество памяти для хранения данных}
read(f,a[i]^); //{запись из файла в динамический массив}
end;
n:=i;
repeat
writeln; //{Пропуск строки}
write('Введите название группы: ');
readln(s); //{Ввод названия редактируемой группы}
writeln; //{Пропуск строки}
i:=0;
repeat
inc(i);
until ravno(s,a[i]^.group) or (i=n);
if not ravno(s,a[i]^.group) then writeln('Такой группы в базе нет');
if ravno(s,a[i]^.group) then
begin
writeln('Название: ',a[i]^.group);
write('Введие новую информацию или нажмите <ENTER>: ');
readln(p[1]);
writeln('Стиль: ',a[i]^.style);
write('Введие новую информацию или нажмите <ENTER>: ');
readln(p[2]);
writeln('Страна: ',a[i]^.country);
write('Введие новую информацию или нажмите <ENTER>: ');
readln(p[3]);
writeln('Количество альбомов: ',a[i]^.albums);
write('Введие новую информацию или нажмите <ENTER>: ');
readln(p[4]);
writeln('Лейбл: ',a[i]^.Rlabel);
write('Введие новую информацию или нажмите <ENTER>: ');
readln(p[5]);
writeln('Рейтинг: ',a[i]^.Rating);
write('Введие новую информацию или нажмите <ENTER>: ');
readln(p[6]);
writeln; //{Пропуск строки}
write('Сохранить изминения? (y/n): ');
readln(ch);
if ch='y' then
begin
if p[1]<>'' then a[i]^.group:=p[1]; //{Изменение названия}
if (p[2]<>'') then a[i]^.style:=p[2]; //{Изменение стиля}
if p[3]<>'' then a[i]^.country:=p[3]; //{Изменение страны}
if (p[4]<>'') and ((p[4,1] in ['1'..'9']) or ((p[4,1]='1') and (p[4,2] in ['0'..'5']))) then val(p[4],a[i]^.albums,kod); //{Изменение количество альбомов}
if p[5]<>'' then a[i]^.Rlabel:=p[5]; //{Изменение лейбла}
if (p[6]<>'') and (p[6,1] in ['1'..'5']) then val(p[6,1],a[i]^.rating,kod); //{Изменение рейтинга}
end;
end;
writeln;//{Пропуск строки}
write('Редактировать еще? (y/n): ');
readln(ch)
until ch='n';
for j:=1 to n do //
fori:=1ton-jdo//{Сортировка методом пузырька}
if a[i]^.group>a[i+1]^.group then swap(a[i]^,a[i+1]^);//
rewrite(f); //{открыть файл для записи}
for i:=1 to n do write(f,a[i]^);
close(f) //{Закрыть файл}
End;
Процедура edit предназначена для редактирования заданной записи из базы. В начале закрываем графический режим спромощью процедуры closegraph, т.к. Далее программа работает уже не в графическом режиме. После следует вывод заголовка cпомощью оператора write. Далее следует цикл While, предназначенный для заполнения динамического массива записями из файла. Увеличивая значение i на 1 при помощи функции inc, считываем из файла записи и копируем их в динамический массив при помощи оператора read. Для выделения определённого количества информации из оперативной памяти используется функция new. Далее в цикле repeat вводится название группы, запись которой нужно отредактировать и спомощью функции ravno, описанной отдельно, введенное название сравнивается с каждым полем названия группы из динамического массива и если оно совпадает, то поочерёдно выводятся каждое поле записи с возможностью ввода новых данных, которые первоначально записываются в промежуточный массив p. После ввода новых данных выводится запрос на сохнанение, в случе положительного ответа старые данные, находящиеся в в динамическом массиве заменяются на новые из массива p. После чего выводится запрос на редактирование ещё одной записи. Если ответ «нет», то после цикла производится сортировка динамического массива «методом пузырька» по названию группы и далее запись в файл.
4.7 Процедура cort.
procedure cort;
var i,j,n:integer; q:group; s:byte; ok:boolean;
Begin
closegraph; //{Закрытие графического режима}
writeln('******************************');
writeln('*Сортировка по заданному полю*');
writeln('******************************');
writeln; //{Пропуск строки}
write('Введтите ключ сортировки (Стиль-1, Страна-2, Лейбл-3, Рейтинг-4): ');
readln(s);
reset(f);
i:=0;
while not eof(f) do
begin
inc(i); //{увеличивает значение переменной на 1}
new(a[i]); //{выделение необходимого количество памяти для хранения данных}
read(f,a[i]^); //{запись из файла в динамический массив}
end;
n:=i;
for i:=n-1 downto 1 do //{сортировка методом пузырька}
for j:=1 to i do //
begin
case s of
1:ok:=a[j]^.style>a[j+1]^.style;
2:ok:=a[j]^.country>a[j+1]^.country;
3:ok:=a[j]^.Rlabel>a[j+1]^.Rlabel;
4:ok:=a[j]^.Rating>a[j+1]^.Rating;
end;
if ok then begin
q:=a[j]^;
new(a[j]);a[j]^:=a[j+1]^;
new(a[j+1]);a[j+1]^:=q;
end;end;
rewrite(f); //{открыть файл для записи}
for i:=1 to n do write(f,a[i]^);
close(f); //{Закрыть файл}
End;
Процедура edit предназначена для редактирования заданной записи из базы. В начале закрываем графический режим спромощью процедуры closegraph, т.к. Далее программа работает уже не в графическом режиме. После следует вывод заголовка cпомощью оператора write. Далее следует цикл While, предназначенный для заполнения динамического массива записями из файла. Увеличивая значение i на 1 при помощи функции inc, считываем из файла записи и копируем их в динамический массив при помощи оператора read. Для выделения определённого количества информации из оперативной памяти используется функция new. Далее вводится ключ сортировки, т.е. поле по которому будет проходить сортировка. После проведения сортировки записи, упорядоченные уже не по названию, а по заданному полю в том же порядке записи сохраняются в файл, после чего их в таком порядке можно посмотреть спомощью процедуры view, описанной выше.
