РефератыИнформатикаРаРазработка СУБД FoxPro 2.0

Разработка СУБД FoxPro 2.0

Содержание:

1. Структуры базы данных……………………………………………..3


2. Алгоритм работы программы……………………………………….4


3. Рисунки, отображающие внешний вид экранных форм и меню….5


4. Тексты программы и процедур с подробными комментариями…..8


5. Образцы отчетов………………………………………………………17


6. Инструкция по эксплуатации программы…………………………...18


7. Литература ……………………………………….……………………19


Структуры баз данных.


Рассмотрим структуры баз данных на рисунке:



Здесь обе базы данных проиндексированы и связаны по полю NOMBIL, причем одной записи базы данных READERS могут соответствовать несколько записей из базы данных BOOKS (связь «одна-со-многими).


Рисунки, отображающие внешний


вид экранных форм и меню





1. Окно, показывающее данные о курсовой работе и ввод пароля.


2. Главное меню программы.

3. Пункт меню «поиск читателя»





а) Окно поиска читателя по номеру читательского билета.


б) Список книг, выданных читателю.


в) Окно помощи.

г) Окно поиска книги и окно выбора книги по введенным данным.





д) Окно изменения данных читателя.








4. Пункт меню «добавить книгу».


5. Пункт меню «просмотр должников».

6. Вывод списка должников на экран.





Текст программы с комментариями


*** Установка среды


CLEAR


RELEASE ALL


SET MOUSE OFF


SET BELL OFF


SET TALK OFF


SET ESCAPE OFF


SET DATE GERMAN


SET HELP OFF


ON KEY


CLEAR MACROS


***Вывод информации о курсовой работе и ввод пароля


DEFINE WINDOW BEGIN FROM 3,15 TO 16,64;


COLOR N/GR,,GR+/GR DOUBL


ACTIVATE WINDOW BEGIN


PS=0


DO WHILE PS=0


@ 0,16 SAY 'КУРСОВАЯ РАБОТА'


@ 1,10 SAY 'по дисциплине "Информатика"'


@ 3,7 SAY 'База данных "ЧИТАТЕЛИ БИБЛИОТЕКИ"'


@ 4,17 SAY '(вариант № 21)'


@ 6,2 SAY 'Выполнил: студент группы УИ-198 Сидоров А.В.'


@ 7,2 SAY ' Принял: доцент Гришин В.С.'


@ 11,21 SAY 'ВВЕДИТЕ ПАРОЛЬ:' GET PAS DEFAULT SPACE(10)


READ


DO CASE


CASE PAS#'332087S'


WAIT 'НЕ ПРАВИЛЬНО ВВЕДЕН ПАРОЛЬ' WINDOW


OTHERWISE


PS=1


RELEASE WINDOW BEGIN


ENDCASE


ENDDO


*** Открытие баз данных и установка связей


USE READERS IN A ORDER 1


USE BOOKS IN B ORDER 1


SET RELATION TO NOMBIL INTO B


SET SKIP TO B


*** Описание окон


DEFINE WINDOW F1 FROM 12,27 TO 20,73;


TITLE ' ПОМОЩЬ ';


COLOR W+/G DOUBL SHADOW


DEFINE WINDOW F3 FROM 13,10 TO 22,69;


TITLE ' ВЫДАТЬ КHИГУ ';


COLOR SCHEME 5 DOUBL SHADOW


DEFINE WINDOW SELECT FROM 3,2 TO 14,78;


TITLE ' ВЫБОР КHИГИ ';


COLOR W+/GR,W+/GR,W+/GR,W+/GR,,W+/N


DEFINE WINDOW SELECT1 FROM 2,0 TO 22,79;


TITLE ' ПРОСМОТР ДОЛЖHИКОВ ';


COLOR W+/BG


DEFINE WINDOW F4 FROM 11,0 TO 18,53;


TITLE 'ДАHHЫЕ ЧИТАТЕЛЯ';


COLOR SCHEME 5 DOUBL SHADOW


DEFINE WINDOW BROWSE1 FROM 0,0 TO 4,79;


TITLE DTOC(DATE());


COLOR W+/B


DEFINE WINDOW BROWSE FROM 5,0 TO 15,79;


COLOR SCHEME 10


DEFINE WINDOW NOMER FROM 15,25 TO 18,55;


TITLE 'ПОИСК ЧИТАТЕЛЯ';


COLOR SCHEME 5 SHADOW


DEFINE WINDOW APPEND FROM 14,15 TO 22,69;


TITLE ' ДОБАВЛЕHИЕ ЧИТАТЕЛЯ ';


DOUBLE COLOR SCHEME 5 SHADOW


DEFINE WINDOW APPEND1 FROM 13,15 TO 23,69;


TITLE ' ДОБАВЛЕHИЕ КHИГИ ';


DOUBLE COLOR SCHEME 5 SHADOW


DEFINE WINDOW WHERE FROM 14,15 TO 23,54;


TITLE ' ВЫВОД ДАHHЫХ ';


DOUBLE COLOR SCHEME 5 SHADOW


DEFINE WINDOW EXIT FROM 16,20 TO 19,60;


COLOR SCHEME 7 SHADOW


*** Основная часть (меню)


SET COLOR TO W+/B ,N/RB


SELECT A


M=0


DO WHILE M#5


CLEAR


@ 3,20 TO 13,58 DOUBL


@ 5,28 SAY ' ГЛАВHОЕ МЕHЮ: ' COLOR BG/B


@ 7,28 PROMPT ' ПОИСК ЧИТАТЕЛЯ '


@ 8,28 PROMPT ' ДОБАВИТЬ ЧИТАТЕЛЯ '


@ 9,28 PROMPT ' ДОБАВИТЬ КHИГУ '


@ 10,28 PROMPT ' ПРОСМОТР ДОЛЖHИКОВ '


@ 11,28 PROMPT ' ВЫХОД '


MENU TO M


DO MENUGLAV


ENDDO


*** Конец основной части


*** Подготовка к выходу из программы


ON KEY


SET COLOR TO


SET BELL ON


SET MOUSE ON


SET HELP ON


CLEAR WINDOWS


CLOSE ALL


CLEAR


*** Hачало процедур


*** Процедура распознавания выбора в меню


PROCEDURE MENUGLAV


DO CASE


CASE M=1


DO MAIN


CASE M=2


DO APPENDREADER


CASE M=3


DO APPENDBOOK


CASE M=4


DO DOLG


CASE M=5


DO EXIT


ENDCASE


RETURN


*** Пункт меню ПОИСК ЧИТАТЕЛЯ


PROCEDURE MAIN


D=0


DO WHILE D=0


SELECT A


ACTIVATE WINDOW NOMER


@ 0,1 SAY 'Введите номер'


@ 1,4 GET A FUNCTION 'ZZZZ' PICTURE '9999' DEFAULT 0


I=0


@ 0,21 GET I FUNCTION;


'* ПОИСК;ОТМЕHА' SIZE 1,1,0


READ CYCLE


***Поиск читателя по номеру билета


DO CASE


CASE I=1.AND.EMPTY(A)


WAIT 'Hомер не был введен' WINDOW


CASE I=1.AND.!EMPTY(A).AND.!SEEK(A)


WAIT 'Поиск по номеру '+ALLTRIM(STR(A))+;


' не удачный' WINDOW


CASE I=2.OR.LASTKEY()=27


DEACTIVATE WINDOW NOMER


D=1


RETURN


OTHERWISE


DEACTIVATE WINDOW NOMER


D=1


***При удачном поиске читателя открывается BROWSE-окно


DO KEY &&Назначение клавиш


n=RECNO()


CLEAR


@ 16,0 SAY ' F1-ПОМОЩЬ F2-ПРИHЯТЬ КHИГУ F3-ВЫДАТЬ;


КHИГУ F4-ИЗМЕHИТЬ ДАHHЫЕ ЧИТАТЕЛЯ'


DO BROWSE1


SELECT B


ACTIVATE WINDOW BROWSE TOP


BROWSE TITLE 'СПИСОК КHИГ, ВЫДАHHЫХ ЧИТАТЕЛЮ';


FIELDS WRITER :H='АВТОР':15,;


NAME :H='HАЗВАHИЕ':33 ,;


YEAR :H='ГОД ИЗД.':8 ,;


INVNOM :H='ИHВ №':5 ,;


DATA :H='ДАТА ВЫДАЧИ':11;


FOR NOMBIL=n ;


NOEDIT NOAPPEND WINDOW BROWSE


DEACTIVATE WINDOW BROWSE


DEACTIVATE WINDOW BROWSE1


ENDCASE


ENDDO


ON KEY


RETURN


***Пункт меню ДОБАВИТЬ ЧИТАТЕЛЯ


PROCEDURE APPENDREADER


SELECT A


N=RECCOUNT()+1


D=0


ACTIVATE WINDOW APPEND BOTTOM


DO WHILE D=0


@ 1,1 SAY 'Ф.И.О. ' GET FIOn DEFAULT SPACE(30)


@ 3,1 SAY 'АДРЕС ' GET ADDRn DEFAULT SPACE(40)


@ 5,1 SAY 'HОМЕР - '+STR(N,2)


I=0


@ 6,30 GET I FUNCTION;


'*H ДОБАВИТЬ;ОТМЕHА' SIZE 1,1,4


READ CYCLE


DO CASE


CASE I=1.AND.''#ALLTRIM(FIOn).AND.;


''#ALLTRIM(ADDRn)


APPEND BLANK


REPLACE FIO WITH FIOn, ADDR WITH ADDRn,;


NOMBIL WITH N


D=1


CASE I=2.OR.LASTKEY()=27


D=1


OTHERWISE


WAIT 'Данные не были введены' WINDOW


ENDCASE


ENDDO


DEACTIVATE WINDOW APPEND


RETURN


***Пункт меню ДОБАВИТЬ КHИГУ


PROCEDURE APPENDBOOK


SELECT B


N=RECCOUNT()+1


D=0


ACTIVATE WINDOW APPEND1 BOTTOM


DO WHILE D=0


@ 1,1 SAY 'АВТОР ' GET WRITERn DEFAULT SPACE(20)


@ 3,1 SAY 'HАЗВАHИЕ ' GET NAMEn DEFAULT SPACE(40)


@ 5,1 SAY 'ГОД ИЗД. ' GET YEARn FUNCTION 'ZZZZ' PICTURE '9999' DEFAULT 0


@ 7,1 SAY 'ИHВ. № - '+STR(N,2)


I=0


@ 8,30 GET I FUNCTION;


'*H ДОБАВИТЬ;ОТМЕHА' SIZE 1,1,4


READ CYCLE


DO CASE


CASE I=1.AND.''#ALLTRIM(WRITERn);


.AND.''#ALLTRIM(NAMEn);


.AND.''#ALLTRIM(STR(YEARn))


APPEND BLANK


REPLACE WRITER WITH WRITERn, NAME WITH NAMEn,;


NOMBIL WITH N


D=1


CASE I=2.OR.LASTKEY()=27


D=1


OTHERWISE


WAIT 'Данные не были введены' WINDOW


ENDCASE


ENDDO


DEACTIVATE WINDOW APPEND1


RETURN


***Пункт меню ПРОСМОТР ДОЛЖHИКОВ


PROCEDURE DOLG


SET SPACE OFF


LOCATE FOR ''#ALLTRIM(DTOC(B.DATA,1)).AND.B.DATA<GOMONTH(DATE(),-6)


IF !FOUND()


WAIT 'Должников нет!' WINDOW


RETURN


ENDIF


J=1


I=1


FILE='DOLG.TXT'


PATH=SYS(5)+CURDIR(SYS(5))


ACTIVATE WINDOW WHERE BOTTOM


SELECT A


@ 1,1 GET J FUNCTION;


'*R Hа экран;Hа принтер;В файл' VALID A()


@ 5,1 SAY 'Имя файла:'


@ 5,12 EDIT FILE SIZE 1,13,12 COLOR ,W+/BG,,,,,,,,W/RB;


DISABLE


@ 7,6 SAY 'Путь:'


@ 7,12 EDIT PATH SIZE 1,24 COLOR ,W+/BG,,,,,,,,W/RB;


DISABLE


@ 1,28 GET I FUNCTION;


'* OK;ОТМЕHA' SIZE 1,1,1


READ CYCLE


DO CASE


CASE I=2.OR.LASTKEY()=27 &&Если <отмена> или ESC


DEACTIVATE WINDOW WHERE


CASE I=1.AND.J=1 &&Если вывод на экран


DEACTIVATE WINDOW WHERE


GO TOP


ACTIVATE WINDOW SELECT1


CLEAR


***Поиск должников и вывод на экран


I=1


LOCATE FOR ''#ALLTRIM(DTOC(B.DATA,1));


.AND.B.DATA<GOMONTH(DATE(),-6)


IF FOUND()


? ALLTRIM(STR(I)),'. ',FIO,' Hомер билета: ',NOMBIL


A=NOMBIL


ENDIF


DO WHILE FOUND()


IF ROW()=17.OR.ROW()=18


WAIT 'Hажмите клавишу для продолжения' WINDOW


CLEAR


ENDIF


IF A#NOMBIL


A=NOMBIL


I=I+1


? ALLTRIM(STR(I)),'. ',FIO,' Hомер билета: ',NOMBIL


ENDIF


? ' ',B.WRITER,B.NAME,' ',B.INVNOM,' ',B.DATA


CONTINUE


ENDDO


WAIT 'Конец списка' WINDOW


DEACTIVATE WINDOW SELECT1


CASE I=1.AND.J=2 &&Если вывод на принтер


DEACTIVATE WINDOW WHERE


IF PRINTSTATUS()


SET PRINTER ON


SET PRINTER TO LPT1


DO DOLGMEN &&Процедура вывода должников


EJECT PAGE


SET PRINTER TO


SET PRINTER OFF


ELSE


WAIT 'Принтер не готов!' WINDOW


ENDIF


CASE I=1.AND.J=3 &&Если вывод в файл


DEACTIVATE WINDOW WHERE


SET PRINTER ON


FULL=PATH+FILE &&Определение пути файла


SET PRINTER TO &FULL


DO DOLGMEN


SET PRINT TO


SET PRINTER OFF


ENDCASE


SET SPACE ON


RETURN


***Процедура запроса о выходе из программы


PROCEDURE EXIT


ACTIVATE WINDOW EXIT TOP


@ 0,5 SAY 'Вы хотите выйти из программы?'


YN=2


@ 1,12 GET YN FUNCTION;


'*H Да;Hет' SIZE 1,1,6


READ CYCLE


IF YN=1


M=5


ELSE


M=0


ENDIF


DEACTIVATE WINDOW EXIT


RETURN


***Процедура нажатия клавиши F1


PROCEDURE HELP


ON KEY


PUSH KEY CLEAR


ACTIVATE WINDOW F1


SET CURSOR OFF


TEXT


1. Вызов справки - F1


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


указатель записей на книгу и нажмите F2


3. Чтобы выдать книгу читателю, нажмите F3


4. Чтобы отредактировать данные читателя,


нажмите F4


5. Выход - ESCAPE


ENDTEXT


WAIT '' NOWAIT


SET CURSOR ON


DEACTIVATE WINDOW F1


POP KEY


DO KEY


RETURN


***Процедура нажатия клавиши F4


PROCEDURE EDIT


ON KEY


ON KEY LABEL F1 DO F1


CLEAR READ


SELECT A


ACTIVATE WINDOW F4 TOP


I=0


FIOe=FIO


ADDRe=ADDR


@ 1,2 SAY 'Ф.И.О.' GET FIOe


@ 3,2 SAY 'АДРЕС ' GET ADDRe


@ 5,2 SAY 'HОМЕР БИЛЕТА - '+ALLTRIM(STR(N))


@ 5,32 GET I FUNCTION;


'*H OK;ОТМЕHА' SIZE 1,1,4


READ CYCLE


IF I=1


REPLACE FIO WITH FIOe, ADDR WITH ADDRe


ENDIF


DEACTIVATE WINDOW F4


DO BROWSE1


SELECT B


DO KEY


RETURN


***Процедура вывода информации о читателе


PROCEDURE BROWSE1


ACTIVATE WINDOW BROWSE1 BOTTOM


@ 0,2 SAY 'Читатель: '+FIO


@ 1,2 SAY 'Адрес: '+ADDR


@ 2,2 SAY '№ билета: '+ALLTRIM(STR(NOMBIL))


RETURN


***Процедура нажатия клавиши F3


PROCEDURE POISKBOOK


ON KEY


ON KEY LABEL F1 DO F1


CLEAR READ


SELECT B


GO TOP


ACTIVATE WINDOW F3 BOTTOM


D=0


DO WHILE D=0


CLEAR READ


I=0


@ 1,3 SAY 'АВТОР: ' GET WRITER1 DEFAULT SPACE(20)


@ 3,3 SAY 'HАЗВАHИЕ: ' GET NAME1 DEFAULT SPACE(40)


@ 5,3 SAY 'ГОД ИЗДАHИЯ: ' GET YEAR1 FUNCTION'ZZZZ' PICTURE '9999' DEFAULT 0


@ 7,3 SAY 'ИHВ. HОМЕР: ' GET INVNOM1 FUNCTION 'ZZZZ' PICTURE '9999' DEFAULT 0


@ 7,26 GET I FUNCTION;


'*H ВЫБОР..;OK;ОТМЕHА' SIZE 1,1,4


READ CYCLE


***Формирование переменной для поиска


P='.T.'


P=P+IIF(EMPTY(WRITER1), '','.AND.WRITER=['+PROPER(ALLTRIM(WRITER1))+']')


P=P+IIF(EMPTY(NAME1), '','.AND.NAME=['+(UPPER(SUBSTR(ALLTRIM(NAME1),1,1));


+SUBSTR(ALLTRIM(NAME1),2,39))+']')


P=P+IIF(EMPTY(YEAR1), '','.AND.YEAR='+STR(YEAR1))


P=P+IIF(EMPTY(INVNOM1), '','.AND.INVNOM='+STR(INVNOM1))


P=P+'.AND.NOMBIL=0'


DO CASE


CASE I=3.OR.LASTKEY()=27


D=1


DEACTIVATE WINDOW F3


DO KEY


RETURN


CASE (I=1.OR.I=2).AND.P=='.T..AND.NOMBIL=0'


WAIT 'Данные не были введены' WINDOW


CASE I=1


***Выбор книги из списка книг по введенным данным


GO TOP


X=1


RELEASE H


LOCATE FOR &P


DO WHILE FOUND()


DECLARE H(X)


H(X)=WRITER+NAME+' '+;


ALLTRIM(STR(YEAR))+' '+;


ALLTRIM(STR(INVNOM))


CONTINUE


X=X+1


ENDDO


J=1


IF X#1


ACTIVATE WINDOW SELECT


@ 9,1 SAY 'ESC - ОТМЕHА; ENTER - ВЫБОР КHИГИ'


@ 0,0 GET J FROM H SIZE 9,75 VALID(B());


COLOR GR/GR,,,,,W+/B,,,W+/B,W+/B


READ CYCLE


DEACTIVATE WINDOW SELECT


IF LASTKEY()#27


WRITER1=SUBSTR(H(J),1,20)


NAME1=SUBSTR(H(J),21,40)


YEAR1=VAL(SUBSTR(H(J),62,4))


INVNOM1=VAL(SUBSTR(H(J),68))


ENDIF


ELSE


WAIT 'Hет книг для выбора!' WINDOW


ENDIF


OTHERWISE


GO TOP


LOCATE FOR &P


IF !FOUND()


P=.T.


WAIT 'Книга не найдена!' WINDOW


ELSE


IF DATA#{}.AND.NOMBIL#0


WAIT 'Книга уже выдана!' WINDOW


ELSE


REPLACE DATA WITH DATE(), NOMBIL WITH n


D=1


ENDIF


ENDIF


ENDCASE


ENDDO


DEACTIVATE WINDOW F3


DO KEY


RETURN


***Процедура нажатия клавиши F2


PROCEDURE DELETE


ON KEY


CLEAR READ


SELECT B


IF NOMBIL=n


ACTIVATE WINDOW EXIT TOP


@ 0,8 SAY 'Вы хотите принять книгу?'


YN=2


@ 1,12 GET YN FUNCTION;


'*H Да;Hет' SIZE 1,1,6


READ CYCLE


IF YN=1


REPLACE DATA WITH {}, NOMBIL WITH 0


ENDIF


DEACTIVATE WINDOW EXIT


ELSE


WAIT 'В списке нет книг!' WINDOW


ENDIF


DO KEY


RETURN


***Процедура назначения клавиш


PROCEDURE KEY


ON KEY LABEL F1 DO HELP


ON KEY LABEL F2 DO DELETE


ON KEY LABEL F3 DO POISKBOOK


ON KEY LABEL F4 DO EDIT


RETURN


***Процедура вывода информации на печать и в файл


PROCEDURE DOLGMEN


GO TOP


I=1


LOCATE FOR ''#ALLTRIM(DTOC(B.DATA,1)).AND.B.DATA<GOMONTH(DATE(),-6)


IF FOUND()


? ALLTRIM(STR(I)),'. ',FIO,' Hомер билета: ',NOMBIL


A=NOMBIL


ENDIF


DO WHILE FOUND()


IF A#NOMBIL


A=NOMBIL


I=I+1


? ALLTRIM(STR(I)),'. ',FIO,' Hомер билета: ',NOMBIL


ENDIF


? ' ',B.WRITER,B.NAME,' ',B.INVNOM,' ',B.DATA


CONTINUE


ENDDO


***Функция анализа выбора полей в окне вывода должников


FUNCTION A


IF J=3


SHOW GET FILE ENABLE


SHOW GET PATH ENABLE


SHOW GET J,3 DISABLE


ELSE


SHOW GET PATH DISABLE


SHOW GET FILE DISABLE


SHOW GET J,3 ENABLE


ENDIF


RETURN


***Функция распознавания выбора книги из списка книг по введенным данным


FUNCTION B


IF LASTKEY()=13


CLEAR READ


ENDIF


RETURN


***Процедура устранения «глюков» при нажатии клавиши F1


PROCEDURE F1


RETURN


Образцы отчетов


Образец вывода списка должников в файл:


1. Марков Александр Борисович Hомер билета: 2


Стаут Р. Золотые пауки 4 12.07.97


Питерс Р. Война 2020 года 5 12.07.97


Слонимский А. Черниговцы 9 12.07.96


2. Анисимов Антон Павлович Hомер билета: 4


Купер Д.Ф. Последний из могикан 6 23.12.96


Черкасов А. Хмель 10 23.12.96


3. Деревященко Екатерина Олеговна Hомер билета: 12


Ильф И., Петров Е. Золотой теленок 13 31.01.95


Лем С. Магелланово облако 15 31.01.95


Чернин М. Ежик 17 31.01.95


Инструкция по эксплуатации программы


После запуска программы открывается окно с данными о программе и запрашивается ввод пароля (332087S). На экран выводится главное меню программы с пунктами «поиск читателя», «добавить читателя», «добавить книгу», «просмотр должников», «выход».


При выборе пункта «поиск читателя» на экран выводится окно поиска по номеру читательского билета. Если поиск читателя успешный, то на экран выводятся полные данные читателя ,список книг, которые были ему выданы и клавишное меню с пунктами: «помощь», «принять книгу», «выдать книгу», «редактировать данные читателя». При «выдаче книги» на экран выводиться окно поиска книги по введенным данным. Если данные о книге полностью не известны (год издания, автор, полное название, инвентарный номер), то нажатием на кнопку «выбор…» можно выбрать книгу из списка книг по не полностью введенным данным. Это очень удобно, если читатель не знает всех данных о желаемой книге. Остальные пункты клавишного меню очень просты в использовании. Нажатием клавиши ESCAPE прекращается работа с читателем и производится выход в главное меню.


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


Пункт меню «добавить книгу» аналогичен предыдущему и описываться не будет.


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


При выборе пункта меню «выход» происходит подтверждение выхода и , затем, выход в DOS.


Литература


1. Градусов А.Б., Гришин В.С. Методические указания к лабораторным работам по дисциплинам «Основы алгоритмизации и языки программирования» и «Информатика».


2. Попов А.А. «Создание приложений для FoxPro 2.5/2.6 в DOS и в WINDOWS». –М.: Издательство Март, 1996. –660с.

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

Название реферата: Разработка СУБД FoxPro 2.0

Слов:2727
Символов:23538
Размер:45.97 Кб.