ТОП 10:

ВЫБОР МЕТОДА РЕАЛИЗАЦИИ ЗАДАЧИ



Тема: «База данных

“Учреждение образования”»

 

Выполнил:

студент 2 курса ФЗО

группы АС-563

Сачевичик А.С.

 

 

Проверила:

Гирель Т. Н.

 

Брест 2013


СОДЕРЖАНИЕ

 

Введение ………………………………………………………………………………………. 3

1. Выбор метода реализации задачи ………………………………………………………… 4

1.1 Обоснование метода реализации задачи ……………………………………………. 4

1.2 Выделение функциональных частей ………………………………………………… 5

1.3 Составление общего алгоритма …………………………………………………….... 6

1.4 Обоснование алгоритма отдельных функциональных частей ……………………... 6

2. Разработка тестовых приемов …………………………………………………………….. 9

3. Разработка программы …………………………………………………………………….. 11

4. Тестирование и анализ результатов ………………………………………………………. 12

Заключение ……………………………………………………………………………………. 17

Список литературы …………………………………………………………………………… 18

Приложение 1: Блок-схема алгоритма ……………………………………………………… 19

Приложение 2: Текст программы ……………………………………………………………. 21


ВВЕДЕНИЕ

 

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

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

Часто важен именно быстрый доступ к необходимой информации, т.к. информация может повлиять на какие-либо решения либо действия человека. Поэтому так важен скоростной доступ к полной и отсортированной информации.

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


ВЫБОР МЕТОДА РЕАЛИЗАЦИИ ЗАДАЧИ

 

ВЫДЕЛЕНИЕ ФУНКЦИОНАЛЬНЫХ ЧАСТЕЙ

На основании выбранного метода решения можно выделить следующие функциональные части:

- подпрограмма вывода на экран информационной заставки, в которой будет отображено название информационной системы, информация о разработчике, а также год создания;

- подпрограмма вывода меню на экран и обеспечения его работы под управлением клавиш клавиатуры;

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

- подпрограмма, которая обеспечит добавление новой записи в уже имеющуюся базу с добавлением этой записи в файл;

- подпрограмма, которая обеспечит редактирование выбранной пользователем при перемещении курсором по всем записям одной из них;

- подпрограмма, которая обеспечит удаление выбранной пользователем при перемещении курсором по всем записям одной из них;

- подпрограмма, обеспечивающая поиск нужной информации в базе по запросу пользователя;

- подпрограмма, обеспечивающая вывод помощи по работе с данной системой на экран;

 

СОСТАВЛЕНИЕ ОБЩЕГО АЛГОРИТМА

Процедурой assign связываем физический файл, в котором будет храниться база данных, (C:\Program Files\tp7\base.imm) с файловой переменной f, открываем типизированный файл, связанный с файловой переменной f, для чтения.

Если файл не был открыт успешно, то в центре рабочего окна выводится сообщение «Error while creating new file program will be terminated». Если открытие произошло успешно, выводится информационная заставка (используем процедуру вывода графической заставки, которая будет оставаться на экране до тех пор, пока не будет нажата какая-либо клавиша).

После завершения изображения заставки устанавливаем текстовый режим (80*25 строк, цветной). Процедурой menu на экран выводится меню и организовывается работа с ним. Выбрать пункт меню - клавиша ввода, вернуться в главное меню ESC. Посредством выбора пункта меню Выход (либо снова клавиша ESC, что нежелательно) осуществляется выход в среду TP.

 

ОБОСНОВАНИЕ АЛГОРИТМОВ ОТДЕЛЬНЫХ ФУНКЦИОНАЛЬНЫХ ЧАСТЕЙ

Рассмотрим алгоритмы реализации отдельных функциональных частей.

Просмотр записей.

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

Если нажата клавиша управления курсором вверх, то номера perv и last уменьшаем на 1. Если значение perv<0, то присваиваем переменным perv=0 last=2, избегая тем самым ситуации, когда компьютер пытается прочесть несуществующую запись. Далее выводим на экран записи из файла с perv по last с полями хранящиеся в файле.

Если нажата клавиша управления курсором вниз, то номера perv и last увеличиваются на 1. Если значение last больше чем количество записей в файле, то переменным присваиваем last количество записей в файле, perv—уменьшаем на 1, избегая тем самым ситуации, когда компьютер пытается прочесть несуществующую запись. Далее выводим на экран записи из файла с perv по last с полями хранящиеся в файле. Если клавиша ESC была нажата, то на экране появляется главное меню. По окончании процедуры выводимый файл закрывается.

 

Редактирование записей.

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

Формируем область, в которой будут вводиться новые данные. Если не был произведен выход из системы, запрашиваем подтверждение на изменение данных с помощью процедуры подтверждения. Если изменение было утверждено, редактируем исходную запись, с помощью ранее описанной процедуры. Если пользователь ошибся при вводе (случайно нажал не тот символ), то он сможет удалить ненужные символы при помощи клавиши Backspace. Связываем файловую переменную f с именем файла filename и открываем его для чтения и записи. Переводим указатель в конец файла и записываем туда измененные данные. Закрываем файл. Формируем область для вывода измененных данных и выводим их.

Удаление записи.

Подпрограмма удаления записей позволяет производить удаление каких-либо записей из списка таблицы. Удалить запись можно будет только в том случае, когда в файле содержатся записи, иначе программа выведет сообщение о том, что файл пуст. Проверяем, существуют ли записи в данной таблице, если да, то выдаем запрос на подтверждение «Вы точно хотите удалить?», используя соответствующую процедуру. При утвердительном ответе, связываем файл filename с файловой переменной f. Открываем этот файл для чтения и записи. Связываем другой файл index.sss с другой файловой переменной index. Открываем его для чтения и записи. В нем переводим указатель на первую компоненту. Считываем записи и закрываем данный файл. Связываем файл newfile.dat с файловой переменной f2. Открываем его для записи. Указатель ставим в начало файла и, пока не конец файла f, считываем запись в переменную, откуда потом заносим данные в файл f2, исключая запись выделенную запись. Закрываем файл f2 и файл f. Удаляем файл f. Переименовываем f2 в filename, связываем файл filename с файловой переменной f. Формируем прямоугольную область и открываем файл f. С помощью процедуры вывода таблицы формируем таблицу с записями из файла f. Закрываем файл. Выводим на экран полученные записи. Все изменения сохранятся в файле, и после чего программа автоматически выйдет в главное меню.

 

Автор.

Выводится краткая информация об авторе. В нижнем левом углу (где ранее выводилась небольшая справочная информация).


РАЗРАБОТКА ТЕСТОВЫХ ПРИМЕРОВ

 

Если файл «C:\Program Files\tp7\base.imm», который содержит базу данных, открылся или создан,

(если он не существовал ранее) - появится графическая информационная заставка.

Если этот файл не открылся или не создан, если он не существовал ранее, то в центре рабочего окна выводится сообщение «Error while creating new file program will be terminated». При успешной работе появится горизонтальное меню и список с некоторыми полями записей.

В нижнем левом углу будут выводиться небольшие подсказки о принципе работы с пунктами меню и непосредственно с самими записями.

Перемещение по пунктам меню будет осуществляться с помощью клавиш управления курсором. Активный - первый пункт меню Новая. Если пытаться нажать клавишу управления курсором влево, то активным станет последний пункт меню Выход, если пытаться нажать клавишу управления курсором вправо, то активным станет первый пункт меню Новая.

Клавишей ENTER выберем первый пункт меню Новая – в результате на экране появится запрос с названиями полей добавляемой записи:

- шифр студента;

- фамилия;

- специальность;

- имя;

- отчество;

- год поступления.

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

Введем, к примеру, запись следующего содержания:

Шифр
Фамилия Петровский
Специальность АСОИ
Имя Евгений
Отчество Иванович
Год поступления

После введения значения последнего поля записи на экране появляется запрос на добавление: ”Продолжать вводить записи?”. Он содержит клавиши «ДА» и «НЕТ». Выбор одной из них осуществляется с помощью клавиш курсора <=,=>

Если нажать «ДА», то на экране появится запрос на добавление: ”Продолжать вводить записи?”. После нажатия клавиши ESC произойдет выход в главное меню.

Если выбрать «НЕТ», то произойдет выход в главное меню. В этом пункте меню мы можем редактировать записи, удалять, просматривать полную информацию о них, переносить в архив.

Сделаем активным пункт меню Поиск. После нажатия клавиши ENTER на экране появится запрос, как и при создании новой записи – со всеми полями, нам необходимо ввести ключевые поля поиска. Выведутся те значения записей, которые найдутся в результате поиска. Если количество записей больше одного, то с помощью клавиш управления курсором можно пролистать вверх/вниз выведенные записи. После нажатия клавиши ESC произойдет выход в главное меню. Если ничего не будет введено, программа выведет все записи. Если ввести такое значение, которое не существует в базе данных, на экране появится сообщение: «Ничего не найдено!».

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

Сделаем активным пункт меню Архив. После нажатия клавиши ENTER на экране появится список записей, которые содержатся в архиве (если архив не содержал никаких записей – ничего и не выведется). Так же если архив содержит более одной записи, можно просматривать их, пролистывая вверх/вниз с помощью клавиш курсора. После нажатия клавиши ESC произойдет выход в главное меню.

Сделаем активным пункт меню Автор. После нажатия клавиши ENTER в левом нижнем углу (где ранее выводилась справочная информация о, выведется следующая информация Сачевичик Алексей, АС-563 январь 2013 г.) и после нажатия клавиши ESC произойдет выход в главное меню.

Сделаем активным пункт меню Выход. После нажатия клавиши ENTER произойдет выход в среду TP.


РАЗРАБОТКА ПРОГРАММЫ

 

Для лучшей структурированности программа разбита на функции и процедуры.

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

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

Процедуры и функции модуля CRT:

Clrscr - очистка экрана (заполнение пробелами текущего цвета);

Gotoxy(x,y) – перемещает курсор в т. (x,y) относительно начала координат текущего открытого окна;

WhereX и WhereY – определяет положение курсора на экране: его горизонтальную и вертикальную координаты относительно начала координат текущего открытого окна;

TextColor(i) – устанавливает цвет текста равным i;

TextBackGround(i) – устанавливает цвет фона равным i;

Readkey – функция, считывает символ с клавиатуры и возвращает значение типа char;

Window(X1,Y1,X2,Y2) – открывает текстовое окно с координатами левого верхнего угла (X1,Y1) и нижнего правого (X2,Y2);

Keypressed – возвращает булевское значение True, если была нажата какая-либо клавиша, и false в противном случае.

Так же мной были использованы записи. Запись представляет собой структурированный тип данных, который содержит определенное число элементов (полей), причем различные поля записи могут иметь разный тип. Для описания переменных типа запись используется зарезервированное слово record.

В процессе работы программы используются файлы типа запись (где хранятся базы данных)

Так же в программе использовались типизированные файлы (линейная последовательность элементов одинакового типа), данные в которых хранятся во внутреннем представлении.

Основные процедуры и функции, используемые мной в программе:

Assign(файловая переменная, <путь к файлу>) – связывает файловую переменную с именем файла;

Reset (файловая переменная)– открывает файл для чтения и записи, связанный с файловой переменной;

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

FileSize(файловая переменная) – возвращает значение типа longint, которое содержит количество компонентов (записей) файла.

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


ЗАКЛЮЧЕНИЕ

 

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

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

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

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

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


СПИСОК ЛИТЕРАТУРЫ

 

- Вальвачев А.Н., Крисевич В.С. Программирование на языке ПАСКАЛЬ для персональных ЭВМ ЕС: Справочное пособие. – Мн.: Выш. шк., 1989.

- Базенков Т.Н., Дереченик С.С. СТ БПИ – 02 – 98. Графическая конструкторская документация электронной аппаратуры в курсовых и дипломных проектах (работах): Общие требования к разработке и правила оформления. – Брест, 1998.

- ГОСТ 19.002 – 80 ЕСПД Схемы алгоритмов и программ. Правила выполнения. – М. : Издательство стандартов, 1990.

- ГОСТ 19.003 – 80 ЕСПД Схемы алгоритмов и программ. Обозначения условные и графические. – М. : Издательство стандартов, 1990.

- ГОСТ 19.701 – 90 ЕСПД Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения. – М. : Издательство стандартов, 1990.

- СТБПИ – 02 – 98 Стандарты института. Графическая конструкторская и программная документация электронной аппаратуры в курсовых и дипломных проектах (работах). Общие требования к разработке и правила оформления. – Брест : БПИ, 1998.

- Епанешников А.М., Епанешников В.А.. «Программирование в среде TURBO PASCAL 7.0». Москва, «Диалог-мифи», 1996. Вальвачев А.Н., Крисевич В.С.. «Программирование на языка ПАСКАЛЬ». Минск, «Вышэйшая школа», 1989


ПРИЛОЖЕНИЕ 1. БЛОК-СХЕМА АЛГОРИТМА

 


ПРИЛОЖЕНИЕ 2. ТЕКСТ ПРОГРАММЫ

 

Program kurs;

uses crt;

Type

Record_Base=record {тип данных mag представляющий из себя запись с 6-ю переменными}

Record_Number:String[9]; {Шифр Студента}

Record_Famile:string[40]; {Фамилия}

Record_Special:string[20]; {Специальность}

Record_Name:string[20]; {Имя}

Record_Fathername:String[15]; {Отчество}

Record_Year:String[20]; {Год поступления}

end;

FileType=file of Record_Base;

Const

MENU1_Q=6;

MENU1_S:array[0..MENU1_Q-1] of string[25] = ('Новая','Поиск','Сортировка','Архив','Автор','Выход');

MENU2_S:array[1..6] of string[30] =

('Шифр : ','Фамилия : ','Специал. : ','Имя : ','Отчество : ','Год пост.: ');

FILENAME:string = 'Base.imm';ARCHIVNAME:string = 'Archiv.rar';

STR1='╔═ ДЕТАЛИ ════════════════════╗';

STR2='╔═ КРАТКИЕ ДАННЫЕ ══════════════════════════════╗';

STR3='╔═ ИНФОРМАЦИЯ ════════════════╗';

Var

c:char;

z:word;

cod1,cod2,cod3,cod4,c1,c2,c3,c4,i,last1,last2,lastfile:integer;

s:string;

f,f1:FileType;

Man:Record_Base;

ramka,n,flag,archiv:boolean;

 

Procedure enter(x,y:integer;max:integer;mode:string;var flag:boolean;var str:string);

var s:string; c:char;

Begin

s:=mode; while keypressed do c:=readkey;

repeat gotoxy(x,y); for i:=1 to max do write(' '); gotoxy(x,y); write(s);

repeat c:=readkey;if ord(c)=0 then begin c:=readkey; c:=#0; end; until (ord(c)<>0);

case ord(c) of 8 : delete(s,length(s),1); end;

if (length(s)<max) and (ord(c)<>8) and (ord(c)<>13) then s:=s+c;

until (ord(c)=13) or (ord(c)=27); flag:=c=#27;

str:=s;

End;

 

Procedure Panel(var x:integer;var n:word);

var leng,i,j:word; c:char;

Begin

Window(1,1,80,1); leng:=80 div MENU1_Q;

Repeat window(2,18,Length(STR1)-1,23); textattr:=$0f;

clrscr; gotoxy(2,2); write('Нажмите "Tab", чтобы увидеть');

gotoxy(5,3); write('полную информацию');

gotoxy(6,4); write('или "Enter", чтобы '); textattr:=$0f;

case x of

0:begin gotoxy(1,5);write('добавить новую запись в базу');end;

1:begin gotoxy(5,5);write('найти запись в базе');end;

2:begin gotoxy(3,5);write('сортировать записи в базе');end;

3:begin gotoxy(1,5);if archiv then write(' просмотреть содержимое базы')

else write('просмотреть содержимое архива');end;

4:begin gotoxy(2,5);write('увидеть информацию об авторе');end;

5:begin gotoxy(6,5);write('выйти из программы');end;

end;

window(1,1,80,1); textattr:=$07;

clrscr; textattr:=$1b;

for i:=0 to MENU1_Q-1 do begin

if x=i then textattr:=$3f; for j:=1 to (leng-length(MENU1_S[i])) div 2 do

write(' '); write(MENU1_S[i]);

for j:=1 to (leng-length(MENU1_S[i])) div 2 do

write(' '); textattr:=$1b; end;

c:=readkey;if ord(c)=0 then c:=readkey; case ord(c) of

77 : x:=(x+1)*ord(x<>MENU1_Q-1);

75 : x:=(x-1)*ord(x<>0)+(MENU1_Q-1)*ord(x=0);

9 : n:=111

else n:=x;

end;

Until (ord(c)=27) or (ord(c)=13) or (ord(c)=9);

TextAttr:=$07; Window(1,1,80,50); if ord(c)=27 then halt;

End;

 

Function windows(x,y:integer;height,widgth,mode:integer;message:string):boolean;

const

STR:array [1..1] of string[20] = (' ВНИМАНИЕ! ');

Button1=' ДА '; Button2=' НЕТ '; Button3=' OK ';

var

p:pointer; i,j,k:integer; c:char; t:boolean; oldmaxx,oldmaxy,oldminx,oldminy:integer;

cur1,cur2:byte;

Begin

oldmaxx:=lo(windmax)+1; oldmaxy:=hi(windmax)+1;

oldminx:=lo(windmin)+1; oldminy:=hi(windmin)+1;

randomize; window(1,1,80,25); getmem(p,(height+1)*(widgth+2)*2);

{Save window} for i:=0 to height do for j:=0 to (widgth+2)*2-1 do

move(ptr(segb800,80*2*(y+i-1)+x*2-2+j)^,ptr(seg(p^),ofs(p^)+i*((widgth+2)*2)+j)^,1);

{Print window} textattr:=$1b; window(x,y,x+widgth-1,y+height-1);

clrscr; window(1,1,80,25); gotoxy(x+(widgth-length(message)) div 2,y+1);write(message);

gotoxy(x,y);write(#201); for i:=1 to round((widgth-length(STR[mode])-2)/2) do

Write(#205); write(STR[mode]); for i:=1 to (widgth-length(STR[mode])-2) div 2 do

Write(#205); write(#187);

for i:=1 to height-2 do

begin

gotoxy(x,y+i);write(#186); gotoxy(x+widgth-1,y+i);write(#186);

end;

gotoxy(x,y+height-1); write(#200);

for i:=1 to widgth-2 do Write(#205); write(#188);

{Making dark area}

j:=$08; for i:=1 to height-1 do

for k:=0 to 1 do move(j,ptr(segb800,80*2*(y-1+i)+(x+k)*2+widgth*2-1)^,1);

for i:=1 to widgth do move(j,ptr(segb800,80*2*(y+height-1)+(x+1)*2+i*2-1)^,1);

t:=true; case mode of

1:

begin

Repeat

if t=true then textattr:=$3f else textattr:=$07;

gotoxy(x+3,y+3);write(Button1); if t=false then textattr:=$3f else textattr:=$07;

gotoxy(x+widgth-3-length(Button2),y+3);write(Button2);

c:=readkey; case ord(c) of 75 : t:=true; 77 : t:=false; end;

Until (ord(c)=13) or (ord(c)=27) or (ord(c)=32);

if ord(c)=27 then t:=false; end;

2:

repeat textattr:=$3b;

gotoxy(Widgth div 2+x-length(Button3) div 2,height div 2+1+y);write(Button3);

c:=readkey; until (ord(c)=27) or (ord(c)=13) or (ord(c)=32);

end; {Print old window}

for i:=0 to height do for j:=0 to (widgth+2)*2-1 do

move(ptr(seg(p^),ofs(p^)+i*((widgth+2)*2)+j)^,ptr(segb800,80*2*(y+i-1)+x*2+j-2)^,1);

dispose(p); window(oldminx,oldminy,oldmaxx,oldmaxy);

windows:=t;

End;

 

Procedure windows_enter(x,y:integer;height,widgth:integer;mode:integer;var man:Record_Base;var flag,l:boolean);

const

STRin=' Пожалуйста, введите информацию ';

var

p:pointer; i,j,k:integer; c:char; oldmaxx,oldmaxy,oldminx,oldminy:integer;

cur1,cur2:byte; str:string;

Begin

oldmaxx:=lo(windmax)+1; oldmaxy:=hi(windmax)+1;

oldminx:=lo(windmin)+1; oldminy:=hi(windmin)+1;

asm

mov ah,03h

int 10h

mov cur1,ch

mov cur2,cl

end;

window(1,1,80,25); getmem(p,(height+1)*(widgth+2)*2);

{Save window} for i:=0 to height do for j:=0 to (widgth+2)*2-1 do

move(ptr(segb800,80*2*(y+i-1)+x*2-2+j)^,ptr(seg(p^),ofs(p^)+i*((widgth+2)*2)+j)^,1);

{Print window}

textattr:=$1b; window(x,y,x+widgth-1,y+height-1);

clrscr; window(1,1,80,25); gotoxy(x,y);write(#201);

for i:=1 to round((widgth-length(STRin)-2)/2) do Write(#205);

write(STRin); for i:=1 to (widgth-length(STRin)-2) div 2 do

Write(#205); write(#187);

for i:=1 to height-2 do begin gotoxy(x,y+i);write(#186);

gotoxy(x+widgth-1,y+i);write(#186); end;

gotoxy(x,y+height-1); write(#200); for i:=1 to widgth-2 do Write(#205);

write(#188); {Making dark area} j:=$08;

for i:=1 to height-1 do for k:=0 to 1 do

move(j,ptr(segb800,80*2*(y-1+i)+(x+k)*2+widgth*2-1)^,1);

for i:=1 to widgth do move(j,ptr(segb800,80*2*(y+height-1)+(x+1)*2+i*2-1)^,1);

for i:=1 to 12 do

begin

gotoxy(x+3,y+i); write(MENU2_S[i]); end;

if (mode=1) or (mode=2) then with man do begin

Record_Number:='';Record_Famile:='';

Record_Special:='';Record_Name:='';Record_Fathername:='';Record_Year:='';

end; textattr:=$1f; with man do begin

Gotoxy(Length(MENU2_S[1])+x+3,1+y);Write(Record_Number);

Gotoxy(Length(MENU2_S[2])+x+3,2+y);Write(Record_Famile);

Gotoxy(Length(MENU2_S[3])+x+3,3+y);Write(Record_Special);

Gotoxy(Length(MENU2_S[4])+x+3,4+y);Write(Record_Name);

Gotoxy(Length(MENU2_S[5])+x+3,5+y);Write(Record_Fathername);

Gotoxy(Length(MENU2_S[6])+x+3,6+y);Write(Record_Year);

end;

With Man do

begin if (mode=1) or (mode=3) then

Repeat Enter(x+3+Length(MENU2_S[1]),y+1,15,Record_Number,flag,Str);

if (length(Str)=0) and (not flag) then windows(23,9,5,36,2,'Это поле обязательно для ввода!'); textattr:=$1f;

until (length(Str)<>0) or flag else

Enter(x+3+Length(MENU2_S[1]),y+1,15,'',flag,Str);

Record_Number:=str; if (mode=1) or (mode=3) then

Repeat if not flag then

Enter(x+3+Length(MENU2_S[2]),y+2,20,'',flag,Str);

if (length(Str)=0) and (not flag) then windows(23,9,5,36,2,'Это поле обязательно для ввода!'); textattr:=$1f;

until (length(Str)<>0) or flag else if not flag then

Enter(x+3+Length(MENU2_S[2]),y+2,20,'',flag,Str);

Record_Famile:=str; if not flag then

Enter(x+3+Length(MENU2_S[3]),y+3,20,Record_Special,flag,str);Record_Special:=str;

if not flag then

Enter(x+3+Length(MENU2_S[4]),y+4,20,Record_Name,flag,str);Record_Name:=str;

if not flag then

Enter(x+3+Length(MENU2_S[5]),y+5,15,Record_Fathername,flag,str);Record_Fathername:=str;

if not flag then

Enter(x+3+Length(MENU2_S[6]),y+6,18,Record_Year,flag,str);Record_Year:=str;

end;

textattr:=$0b; if mode=1 then

l:=windows(23,9,5,30,1,'Продолжать вводить записи?');

{Print old windows} for i:=0 to height do for j:=0 to (widgth+2)*2-1 do

move(ptr(seg(p^),ofs(p^)+i*((widgth+2)*2)+j)^,ptr(segb800,80*2*(y+i-1)+x*2+j-2)^,1);

dispose(p); window(oldminx,oldminy,oldmaxx,oldmaxy);

End;

 

Procedure windows_sort(x,y:integer;height,widgth:integer;var flag:boolean;var n:integer);

const STRin=' Выберите поле сортировки ';

var p:pointer; i,j,k:integer; c:char; oldmaxx,oldmaxy,oldminx,oldminy:integer;

cur1,cur2:byte; str:string;

Begin

oldmaxx:=lo(windmax)+1; oldmaxy:=hi(windmax)+1; oldminx:=lo(windmin)+1;

oldminy:=hi(windmin)+1; window(1,1,80,25); getmem(p,(height+1)*(widgth+2)*2);

{Save window} for i:=0 to height do for j:=0 to (widgth+2)*2-1 do

move(ptr(segb800,80*2*(y+i-1)+x*2-2+j)^,ptr(seg(p^),ofs(p^)+i*((widgth+2)*2)+j)^,1);

{Print window} textattr:=$1b; window(x,y,x+widgth-1,y+height-1); clrscr;

window(1,1,80,25); gotoxy(x,y);write(#201); for i:=1 to round((widgth-length(STRin)-2)/2) do

Write(#205); write(STRin); for i:=1 to (widgth-length(STRin)-2) div 2 do

Write(#205); write(#187); for i:=1 to height-2 do begin

gotoxy(x,y+i);write(#186); gotoxy(x+widgth-1,y+i);write(#186); end;

gotoxy(x,y+height-1); write(#200); for i:=1 to widgth-2 do Write(#205);

write(#188); {Making dark area} j:=$08; for i:=1 to height-1 do for k:=0 to 1 do

move(j,ptr(segb800,80*2*(y-1+i)+(x+k)*2+widgth*2-1)^,1); for i:=1 to widgth do

move(j,ptr(segb800,80*2*(y+height-1)+(x+1)*2+i*2-1)^,1); for i:=1 to 12 do

begin gotoxy(x+3,y+i); write(MENU2_S[i]); end;

flag:=false; n:=1; textattr:=$1f; repeat gotoxy(x+23,y+n); write(#17,#205,#205,#205); c:=readkey;if ord(c)=0 then c:=readkey; gotoxy(x+23,y+n); write(' ');

case ord(c) of 72 : n:=12*ord(n=1)+(n-1)*ord(n<>1);

80 : n:=1*ord(n=12)+(n+1)*ord(n<>12); end;

until (ord(c)=27) or (ord(c)=13); if ord(c)=27 then flag:=true;

textattr:=$1b; {Print old windows} for i:=0 to height do

for j:=0 to (widgth+2)*2-1 do

move(ptr(seg(p^),ofs(p^)+i*((widgth+2)*2)+j)^,ptr(segb800,80*2*(y+i-1)+x*2+j-2)^,1);

dispose(p); window(oldminx,oldminy,oldmaxx,oldmaxy);

End;

 

Procedure ramka1(Nach:integer);

var i:integer;

Begin

window(1,2,Length(STR1),16); textattr:=$0b; clrscr; window(1,2,Length(STR1),17);

textattr:=$0b; gotoxy(1,Nach); if (Nach>0) and (Nach<=22) then Write(STR1);

for i:=Nach+1 to Nach+14 do if (i>0) and (i<=22) then begin

gotoxy(1,i);write(#186); gotoxy(31,i);write(#186); end;

if (Nach+14>0) and (Nach+14<=22) then begin gotoxy(1,Nach+14); Write(#200);

for i:=1 to 29 do write(#205); write(#188); end; window(2,2,Length(STR1)-1,16);

textattr:=$0b; for i:=1 to 12 do if (i+Nach>0) and (i+Nach<22) then

begin gotoxy(1,i+Nach); write(MENU2_S[i]); end; window(1,1,80,25);

End;

 

Procedure ramka2;

Begin

window(1,1,80,25); textattr:=$0b; gotoxy(32,3); Write(STR2);

gotoxy(32,4);Write(#186,'Шифр',#25); gotoxy(44,4);Write('Фамилия');

gotoxy(64,4);Write('Специальность'); gotoxy(80,4);write(#186);

gotoxy(32,5);write(#204); for i:=1 to 47 do write(#205); write(#185);

for i:=6 to 24 do begin gotoxy(32,i);write(#186); gotoxy(80,i);write(#186);

end; gotoxy(32,25);write(#200); for i:=1 to 47 do write(#205); write(#188);

End;

 

Procedure ramka3;

var i:integer;

Begin

window(1,17,Length(STR1),25); textattr:=$0b; writeln(STR3); for i:=2 to 7 do

begin gotoxy(1,i);write(#186); gotoxy(length(STR3),i);write(#186);

end; write(#200); for i:=1 to length(STR3)-2 do write(#205);

write(#188); window(1,1,80,25);End;

 

Procedure Delete(l:integer);

var man:Record_Base;

Begin

seek(f,l+1); while not eof(f) do begin read(f,man); seek(f,filepos(f)-2); write(f,man); seek(f,filepos(f)+1); end; seek(f,filesize(f)-1); truncate(f);

End;

 

Procedure Init(FILENAME:string);

Begin

assign(f,FILENAME); {$I-} reset(f); if IOResult<>0 then

begin rewrite(f); if IOResult<>0 then begin

clrscr; writeln('Error while creating new file program will be terminated');

textcolor(red+blink); Writeln('PRESS ENTER!');

textattr:=$07; Readln; Halt(1); end; end; close(f); {$I+}

End;

 

Procedure Show_ramka;

Begin ramka:=true;

for i:=-17 to 1 do

begin window(1,2,Length(STR1),16); clrscr; ramka1(i); delay(round(sqr(i+30)));

end;

End;

Procedure Hide_Ramka;

Begin ramka:=false;

for i:=1 downto -17 do begin window(1,2,Length(STR1),16); clrscr;

ramka1(i); delay(round(sqr(i+30))); end;

End;

 

Procedure New_String;

var Man:Record_Base; i:integer; c:char; str:string; l:boolean;

Begin

reset(f); window(2,18,Length(STR1)-1,22); textattr:=$0f; clrscr; gotoxy(11,3);Write('Пожалуйста,'); gotoxy(7,4);Write('введите информацию'); window(3,3,Length(STR1)-1,15); Repeat windows_enter(15,4,14,50,1,man,flag,l);

if not flag then begin seek(f,filesize(f)); write(f,Man);

if last2+filesize(f)-lastfile-1<=19 then

begin if filesize(f)=1 then textattr:=$1f else textattr:=$0b;

window(33,5,79,23);

gotoxy(1,last2+filesize(f)-lastfile-1);clreol;write(man.Record_Number);

gotoxy(12,last2+filesize(f)-lastfile-1);write(man.Record_Famile);

gotoxy(32,last2+filesize(f)-lastfile-1);write(man.Record_Special); end;

end; Until not l; close(f);

End;

 

Procedure Fill_Ramka2(n:integer);

var i,k:integer; Man:Record_Base;

Begin

reset(f); textattr:=$0b; window(33,5,79,23); clrscr; i:=1;

While (i<20) and (not eof(f)) do begin read(f,man); if i=n then begin

textattr:=$1f; gotoxy(1,n); clreol; end;

gotoxy(1,i);write(man.Record_Number);

gotoxy(12,i);write(man.Record_Famile);

gotoxy(32,i);write(man.Record_Special);

if i=n then textattr:=$0b; inc(i); end; window(1,1,80,25); close(f);

End;

 

Procedure ramka2_move(var x,l:integer);

var c:char; k:integer; man:Record_Base; flag,h:boolean;

f1:file of Record_Base;

Begin

window(2,18,Length(STR1)-1,23); textattr:=$0f;

clrscr; gotoxy(1,2); write(#24,' или ',#25,' - двигать курсор');

gotoxy(1,3); write('"del" - удалить запись');

gotoxy(1,4); write('"Enter"-редактировать запись');

gotoxy(1,5); if archiv then write('"Ins" - перенести в базу') else

write('"Ins" - перенести в архив'); if not ramka then Show_Ramka;

reset(f); seek(f,l); if filesize(f)>0 then

begin read(f,man); seek(f,l);

end; repeat textattr:=$0f; if filesize(f)>0 then

begin window(3,3,Length(STR1)-1,16);

With Man do begin

Gotoxy(Length(MENU2_S[1]),1);clreol;Write(Record_Number);

Gotoxy(Length(MENU2_S[2]),2);clreol;Write(Record_Famile);

Gotoxy(Length(MENU2_S[3]),3);clreol;Write(Record_Special);

Gotoxy(Length(MENU2_S[4]),4);clreol;Write(Record_Name);

Gotoxy(Length(MENU2_S[5]),5);clreol;Write(Record_Fathername);

Gotoxy(Length(MENU2_S[6]),6);clreol;Write(Record_Year);

end; end else ramka1(1);

window(33,5,79,23); c:=readkey;if ord(c)=0 then c:=readkey;

if ((ord(c)=72) and (filepos(f)>0)) or ((ord(c)=80) and (filepos(f)+1<filesize(f))) and (filesize(f)>0) then begin read(f,man);

seek(f,filepos(f)-1); textattr:=$0b;

gotoxy(1,x); clreol; gotoxy(1,x);write(man.Record_Number);

gotoxy(12,x);write(man.Record_Famile); gotoxy(32,x);write(man.Record_Special);

end; case ord(c) of

72 :if (filepos(f)>0) and (filesize(f)<>0) then

begin if x=1 then begin gotoxy(1,x); insline; end else dec(x);

seek(f,filepos(f)-1); read(f,man); seek(f,filepos(f)-1); end;

80 :if (filepos(f)+1<filesize(f)) and (filesize(f)<>0) then begin if x=19 then

begin gotoxy(1,1); delline; end else inc(x); seek(f,filepos(f)+1); read(f,man);

seek(f,filepos(f)-1); end; 83 : if filesize(f)<>0 then if windows(23,9,5,30,1,'Вы точно хотите удалить?') then

begin textattr:=$0b;

k:=filepos(f); delete(k); gotoxy(1,x); delline; if (k+19-x)<=filesize(f)-1 then

begin seek(f,k+19-x); read(f,man); seek(f,k); gotoxy(1,19);write(man.Record_Number);

gotoxy(12,19);write(man.Record_Famile); gotoxy(32,19);write(man.Record_Special);

end; if (k>filesize(f)-1) and (filesize(f)<>0) then

begin seek(f,k-1); dec(x); end else seek(f,k); if filesize(f)<>0 then

begin read(f,man); seek(f,filepos(f)-1); end;

k:=filepos(f); end;

82 : if filesize(f)<>0 then begin

if archiv then h:=windows(23,9,5,30,1,'Перенести в базу?')

else h:=windows(23,9,5,30,1,'Перенести в архив?');

if h then begin {$I-} assign(f1,ARCHIVNAME); reset(f1); if IOResult<>0 then rewrite(f1);

if IOResult<>0 then halt(1); seek(f1,filesize(f1));

write(f1,man); close(f1); {$I+} k:=filepos(f);

delete(k); gotoxy(1,x); delline; if (k+19-x)<=filesize(f)-1 then

begin seek(f,k+19-x); read(f,man); seek(f,k); gotoxy(1,19);write(man.Record_Number);

gotoxy(12,19);write(man.Record_Famile); gotoxy(32,19);write(man.Record_Special);

end; if (k>filesize(f)-1) and (filesize(f)<>0) then

begin seek(f,k-1); dec(x); end else seek(f,k); if filesize(f)<>0 then begin read(f,man); seek(f,filepos(f)-1); end; k:=filepos(f); end; end; 13 : begin windows_enter(15,4,14,50,3,man,flag,h); if not flag then

begin write(f,man); seek(f,filepos(f)-1); end else begin

read(f,man); seek(f,filepos(f)-1); end; end; end; if filesize(f)<>0 then

begin gotoxy(1,x); textattr:=$1f; clreol; gotoxy(1,x);write(man.Record_Number);

gotoxy(12,x);write(man.Record_Famile); gotoxy(32,x);write(man.Record_Special);

end; l:=filepos(f); until (ord(c)=9) or (ord(c)=27); seek(f,0); close(f); Hide_ramka;

window(2,18,Length(STR1)-1,23); textattr:=$1b; clrscr; window(1,1,80,25);

End;

 

Procedure About;

Begin

window(2,18,Length(STR1)-1,23); clrscr;

gotoxy(2,3); Write(' Сачевичик Алексей, АС-563 Январь 2012 ');

readkey; clrscr; window(1,1,80,25);

End;

 

Procedure Find;

var Number:array[1..1000] of word; man1,man2:Record_Base; i,max,x,k,s,p:word;d,flag,l :boolean;

Begin

window(2,18,Length(STR1)-1,23); textattr:=$0f; clrscr;

gotoxy(11,3);Write('Пожалуйста,'); gotoxy(7,4);Write('введите информацию');

textattr:=$0f; windows_enter(15,4,14,50,2,man1,flag,l);

reset(f); i:=0;if not flag thenbegin window(33,5,79,23);

clrscr; while not eof(f) do begin read(f,Man2);

d:=(Man1.Record_Number=copy(Man2.Record_Number,1,length(Man1.Record_Number))) or (Man1.Record_Number='');

d:=d and ((Man1.Record_Famile=copy(Man2.Record_Famile,1,length(Man1.Record_Famile))) or (Man1.Record_Famile=''));

d:=d and ((Man1.Record_Special=copy(Man2.Record_Special,1,length(man1.Record_Special))) or (Man1.Record_Special=''));

d:=d and ((Man1.Record_Name=copy(Man2.Record_Name,1,length(man1.Record_Name))) or (Man1.Record_Name=''));

d:=d and ((Man1.Record_Fathername=copy(Man2.Record_Fathername,1,length(man1.Record_Fathername)))

or (Man1.Record_Fathername=''));

d:=d and ((Man1.Record_Year=copy(Man2.Record_Year,1,length(man1.Record_Year))) or (Man1.Record_Year='')); if d then begin

if i=0 then textattr:=$1f else textattr:=$0b; if i<=18 then

begin gotoxy(1,i+1);clreol; gotoxy(1,i+1);write(man2.Record_Number);

gotoxy(12,i+1);write(man2.Record_Famile); gotoxy(32,i+1);write(man2.Record_Special);

end; inc(i); Number[i]:=filepos(f)-1; end; end;if i>0 then begin if not ramka then show_ramka; max:=i; i:=1; x:=1; if max<>0 then begin seek(f,Number[1]);

read(f,man1); seek(f,Number[1]); end; window(2,18,Length(STR1)-1,23); textattr:=$0f;

clrscr; gotoxy(1,2); write(#24,' или ',#25,' - двигать курсор');

gotoxy(1,3); write('"del" - удалить запись'); gotoxy(1,4);

write('"Enter"-редактировать запись'); gotoxy(1,5); if archiv then

write('"Ins" - перенести в базу') else write('"Ins" - перенести в архив');

repeat textattr:=$0f; if max<>0 then begin window(3,3,Length(STR1)-1,16);

With Man do begin

Gotoxy(Length(MENU2_S[1]),1);clreol;Write(Man1.Record_Number);

Gotoxy(Length(MENU2_S[2]),2);clreol;Write(Man1.Record_Famile);

Gotoxy(Length(MENU2_S[3]),3);clreol;Write(Man1.Record_Special);

Gotoxy(Length(MENU2_S[4]),4);clreol;Write(Man1.Record_Name);

Gotoxy(Length(MENU2_S[5]),5);clreol;Write(Man1.Record_Fathername);

Gotoxy(Length(MENU2_S[6]),6);clreol;Write(Man1.Record_Year);

end; window(33,5,79,23); end else begin window(2,3,Length(STR1)-1,16);

clrscr;ramka1(1);window(33,5,79,23); end; c:=readkey;if ord(c)=0 then c:=readkey; if ((ord(c)=72) and (i>1)) or ((ord(c)=80) and (i<max)) and (max>0) then

begin textattr:=$0b; gotoxy(1,x); clreol; seek(f,Number[i]); read(f,man1);

gotoxy(1,x);write(man1.Record_Number); gotoxy(12,x);write(man1.Record_Famile);

gotoxy(32,x);write(man1.Record_Special); end; case ord(c) of 72:if (i>1) and (max<>0) then

begin if x=1 then begin gotoxy(1,x); insline; end else dec(x);

dec(i); end; 80 :if (i<max) and (max<>0) then begin

if x=19 then begin gotoxy(1,1); delline; end else inc(x); inc(i); end;

82 :

if filesize(f)<>0 then begin if archiv then l:=windows(23,9,5,30,1,'Перенести в базу?')

else l:=windows(23,9,5,30,1,'Перенести в архив?'); if l then

begin {$I-} assign(f1,ARCHIVNAME); reset(f1); if IOResult<>0 then rewrite(f1);

if IOResult<>0 then halt(1); seek(f1,filesize(f1)); write(f1,man1);

close(f1); {$I+} textattr:=$0b; delete(Number[i]); for k:=1 to max do

if k>=i then if k+1<=max then Number[k]:=Number[k+1]-1; dec(max);

gotoxy(1,x); delline; if (19-x+i)<=max then begin

seek(f,Number[19-x+i]); read(f,man1); gotoxy(1,19);write(man1.Record_Number);

gotoxy(12,19);write(man1.Record_Famile); gotoxy(32,19);write(man1.Record_Special);

end; if (i>max) and (max<>0) then begin

dec(x); dec(i); end; end; end;

83 : if max<>0 then if windows(23,9,5,30,1,'Вы точно хотите удалить?') then

begin textattr:=$0b; delete(Number[i]); for k:=1 to max do

if k>=i then if k+1<=max then Number[k]:=Number[k+1]-1;

dec(max); gotoxy(1,x); delline; if (19-x+i)<=max then begin

seek(f,Number[19-x+i]); read(f,man1); gotoxy(1,19);write(man1.Record_Number);

gotoxy(12,19);write(man1.Record_Famile); gotoxy(32,19);write(man1.Record_Special);

end; if (i>max) and (max<>0) then begin dec(x); dec(i); end; end;

13 :

begin windows_enter(15,4,14,50,3,man1,flag,l); if not flag then

begin seek(f,Number[i]); write(f,man1); seek(f,Number[i]); end

else begin seek(f,Number[i]); read(f,man1); seek(f,Number[i]); end; end; end;

window(33,5,79,23); if max<>0 then begin gotoxy(1,x); textattr:=$1f;

clreol; seek(f,Number[i]); read(f,Man1); gotoxy(1,x);write(man1.Record_Number);

gotoxy(12,x);write(man1.Record_Famile); gotoxy(32,x);write(man1.Record_Special);

end; until (ord(c)=9) or (ord(c)=27); Hide_ramka;

end else windows(23,9,5,30,2,'Ничего не найдено!');end; close(f);

last2:=1;lastfile:=0; fill_ramka2(last2);End;

 

Procedure sort;

var

man,min,temp:Record_Base; m,i,j,l:integer; d:boolean;

Begin

reset(f); windows_sort(15,4,14,50,flag,l); if not flag then

for i:=0 to filesize(f)-1 do begin seek(f,i); read(f,min); m:=i;

seek(f,i); for j:=i to filesize(f)-1 do begin

d:=true; read(f,man); d:=(Man.Record_Number<min.Record_Number) or (l<>1);val(Man.Record_Famile,c1,cod1);val(min.Record_Famile,c2,cod2);

d:=d and ((c1<c2) or (l<>2));val(Man.Record_Special,c3,cod3);val(min.Record_Special,c4,cod4);

d:=d and ((c3<c4) or (l<>3));

d:=d and ((Man.Record_Name<min.Record_Name) or (l<>4));

d:=d and ((Man.Record_Fathername<min.Record_Fathername) or (l<>5));

d:=d and ((Man.Record_Year<min.Record_Year) or (l<>6));

if d then begin min:=man; m:=j; end; end; seek(f,i); read(f,man); temp:=man;

seek(f,i); write(f,min); seek(f,m); write(f,man); end; close(f); last2:=1;lastfile:=0;

Fill_ramka2(Last2);End;

 

Procedure Zastavka;

var i:integer;

Begin

clrscr; window(7,4,77,19); textcolor(15); textbackground(1);

writeln('╔═══════════════════════════════════════════════════════════════════╗');

writeln(chr(186),' ___ ___ ___ ____ ___ ___ ',chr(186));

writeln(chr(186),' | | | | | | | | | | | | | | | | \ / ',chr(186));

writeln(chr(186),' |__ |___| ___| |___| | | |___| |___| |___| |__ | \/ ',chr(186));

writeln(chr(186),' | | | | | | | _|___|_ | | | | | | | || / \ ',chr(186));

writeln(chr(186),' |__| | | ___| | | | || | | | | | |__|| / \ ',chr(186));

writeln(chr(186),' ',chr(186));

writeln(chr(186),' __ ____ ',chr(186));

writeln(chr(186),' | | | | | ',chr(186));

writeln(chr(186),' |__| |___| __| ',chr(186));

writeln(chr(186),' | | | | ',chr(186));

writeln(chr(186),' |___| ___| ____| ',chr(186));







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

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