Реалізація алгоритму визначення n! засобами Object Pascal 2.0

 















Курсова робота

з дисципліни :Алгоритмізація та програмування

тема

Реалізація алгоритму визначення n! для великих значень n засобами Object Pascal 2.0


Вступ

pascal програмування алгоритм

Pascal - це алгоритмічна мова програмування універсального призначення.

Його основи розробив Ніклаус Вірт, професор технічного університету в Цюріху (Швейцарія), що назвав мову на честь Блєза Паскаля, знаменитого французького філософа і математика XVII сторіччя. Створення професором Віртом мови Pascal у 1971 році мало своєю метою полегшити процес навчання систематичному підходу до програмування для ЕОМ, точніше сказати, структурному програмуванню. Відтоді мова Pascal використовується для програмування майже всіх типів задач на майже всіх типах ЕОМ і довгий час вважалася однією з кращих мов програмування високого рівня, незалежно від того, для яких цілей він використовується: для навчання або для програмування як аматорами так і професіоналами.


Розділ 1. Історія виникнення і особливості мови Pascal


Першим компілятором мови Pascal є ETH Pascal, створений у 1970-му. Назва ETH походить від назви інституту Eidgenössische Technische Hochschule Zürich (Федеральна вища технічна школа Цюріха), де він був розроблений Ніклаусом Віртом. Наприкінці того ж року Вірт оприлюднив перший офіційний опис мови, синтаксису та семантики. Нова версія мови побачила світ у 1972 році. Тоді ж Вірт та його англійський колега Чарльз Ентоні Хоар випустили аксіоматичний опис мови Pascal.

У 1969 році Вірт доручає розробку компілятора одному зі своїх студентів (Е. Марм'є). На той момент Марм'є володів лише Фортраном (Fortran) і писав компілятор виключно на цій мові. Після написання компілятор Pascal був переписаний на самому собі. Як згадував потім Вірт, вибір Фортрана був серйозною помилкою, бо він не міг адекватно представляти складні структури даних компілятора Pascal, що лише заплутувало програму.

Наступна спроба створення компілятору почалася з чіткого формулювання на описі (1970 року) самого Паскалю. Синтаксичний аналіз нового однопрохідного компілятору реалізовувався за допомогою рекурсії. Тепер команду розробників склали: У. Амман, Е. Марм'є, Р. Шилд. Після того як компілятор був написаний на ще невідомій мові, Шилд поїхав додому, де він на протязі двох тижнів вручну транслював програму у допоміжну низькорівневу мову. Отже, в середині 1970 року компілятор ETH Pascal був готовий.Pascal був цікавий насамперед тим, що став він однією з перших реалізацій мов високого рівня написаних на самій собі, на два роки випередивши компілятор Сі. У 1973 році була створена абстрактна Pascal-машина (P-машина), яка виконувала спеціальний P-код. Щоб вирішити проблему сумісності компілятора, Вірт вирішив скористатися перевіреними часом методами інтерпретації. Найвідомішими з них рішеннями, які передували P-коду, можна назвати реалізацію мови Snobol-4 (Р. Грісуолдом, у 1967 році), де в якості коду абстрактної машини використовувалася мова SIL (System Implementation Language).

Початкова мета розробки мови диктувалася потребою інструмента «для навчання програмуванню як систематичній дисципліні». Pascal належить до Algol-подібних мов програмування, оскільки використовує семантику ла. Однак Pascal мав суттєве удосконалення - жорстку типізацію. Це означало, що присвоювання можна було виконувати лише для змінних, що належать до одного типу (одночасно вказувались правила, за якими типи вважались однаковими). Це удосконалення суттєво покращило стиль програмування, оскільки значну частину помилок вдавалось виявити ще на етапі компіляції - що збільшує надійність програм.

Однак мова розроблялась як дослідницький проект і первісний Pascal був мало придатний для написання великих проектів, оскільки програму не можна було скласти з кількох програмних частин - просто не було передбачено такої можливості. Але ця мова програмування швидко завоювала популярність у навчальних закладах при вивченні програмування. А коли з'явились діалекти мови де можливим було окреме компілювання програмних частин - Pascal став засобом написання великих програмних систем.


Розділ 2. Середовище розробки програм Borlan Delphi


Загальні відомості про Borland Delphi

Borland Delphi - це обєктно-орієнтоване середовище візуального програмування (RAD - Rapid Application Development) [1 - 3]. Delphi призначено для прискореної розробки високопродуктивних 32-бітних програм, які можуть працювати в середовищі Windows або Linux. При цьому Delphi дозволяє звести до мінімуму обєм програмного коду, який вводиться вручну. В склад Delphi входять засоби, необхідні для розробки, тестування та встановлення програм, включаючи велику за обсягом бібліотеку компонентів (VCL - Visual Components Library), засоби візуального проектування, шаблони програм і форм. Середовище проектування Delphi є відкритою системою і дозволяє використовувати як компоненти VCL, так і компоненти від сторонніх розробників, або власні компоненти. Також, сильною стороною Delphi є можливість використання функцій WinAPI.

В системі Delphi використовується спеціалізована версія мови програмування Паскаль, що постійно вдосконалюється; вона називається Delphi (в шостій і більш ранішніх варіантах системи Delphi вона називалась Object Pascal - "Обєктний Паскаль"). Ця версія включає набір розширень, орієнтованих тільки на застосування в рамках середовища Delphi і призначених для прискореного створювання програм.

Середовище Delphi 6 являє собою інтегровану оболонку розробника, в яку входить набір спеціалізованих програм, які відповідають за різні етапи створення готової програми. Основні вікна системи Delphi 6 наступні: інспектор обєктів, провідник, проектувальник форм, вікно редактора. Вихідний текст програми готується в середовищі Delphi 6 за допомогою вбудованого редактора вихідних текстів. Цей редактор спеціалізований. Він відрізняється гнучкими можливостями кольорового виділення різних елементів тексту програми (ключових слів, назв, операцій, чисел і рядків) і надає можливість швидкого вводу конструкцій, які часто зустрічаються.

Алфавіт мови

Імена у мові Borland Pascal формуються з латинських літер A-Z, a-z, цифр 0-9 та знака "підкреслення" ("_"). Також використовуються спеціальні символи : + - * / = < > [ ] , ( ) ; { } $ ^ # . Будь-яке ім'я повинно починатися з латинської літери, або символу "підкреслення" (від англ. "underscore"), виключення становлять лише імена міток. На відміну від Сі в Паскалі не враховується регістр літер.

Службові слова

Службове слово являє собою неподільне утворення, зміст якого фіксований мовою. Службові слова не можна використовувати у якості імен. Коментарі в коді програми оформлюються фігурними дужками {коментар} або ж сполученням звичайних дужок із зірочкою (*коментар*).

Зарезервовані слова:, asm, array, begin, case, const, constructor, destructor, div, do, downto, else, end, exports, file, for, function, goto, if, implementation, in, inherited, inline, interface, label, library, mod, nil, not, object, of, or, packed, procedure, program, record, repeat, set, shl, shr, string, then, to, type, unit, until, uses, var, while, with, xor, absolute, assembler, export, external, far, forward, index, interrupt, near, private, public, resident, virtual.

Програма в середовищі Borland Delphi складається:

заголовок;

розділ опису;

розділ операторів.

Заголовок містить службове слово PROGRAM, імя програми в дужках закінчується заголовок символом ;.

Розділ опису використовується для представлення всіх зустрічаючихся в програмі даних і їх характеристик.

Цей розділ в свою чергу містить:

мітки;

константи;

типи змінних;

представленні процедури і функції.

Після кожного опису ставиться символ ;.

Розділ операторів заключається в операторні лапки BEGIN...END після ставиться крапка. В цьому розділі записується послідовність операторів які виконуються.

Програма записується у вільній формі.

Стандартні типи даних

Дані цілого типу.

Всі дані можна розділити на два типи : прості і складні. Прості - це стандартні і змінні типи даних. Стандартними являються цілі, дійсні, символічні, логічні типи даних. Складні типи даних являють собою різні комбінації простих типів (масиви, множини, записи і файли).

Дані дійсного типу.

Константи дійсного типу можуть представлятись двома видами: з фіксованою або з плаваючою крапкою.

Дані логічного типу.

Логічні типи даних часто називають булевими. Логічні дані часто використовують при перевірці правильності деяких умов і порівнянні величин. Логічні дані і операції над ними мають важливе значення так як дозволяють внести в розрахунки елементи людської логіки.

Дані символічного типу.

Дані символічного типу дозволяють представляти в програмі тексту і проводити над ним деякі редакційні операції. Також вони дають можливість обробляти документи.

Арифметичні вирази

Арифметичні вирази складаються з арифметичних констант, змінних функцій і операцій над ними.

При складанні виразів слід виконати наступні правила:

. Записувати всі складові частини виразів в один рядок.

. Використовувати дужки тільки одного типу (круглі). В правильно записаному виразі число відкритих дужок дорівнює числу закритих дужок.

. Не можна записувати підряд два знака арифметичних операцій

. Необхідно памятати що обчислення зліва на право у відповідності з стандартом операції. Самою старшою являється операція обчислення значення функції.

Потім ідуть операції множення і ділення. Операції додавання і віднімання мають самий низький авторитет.

Логічні вирази

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

В логічних виразах прийнятий наступний пріоритет операцій:

) NOT

) * (множення), / (ділення), DIV, MOD, AND;

) + (плюс), - (мінус), OR;

) < (менше), <= (менше або дорівнює), = (рівно),

<> (не рівно), >= (більше або рівно), > (більше).

В логічному виразі допускається використання круглих дужок. При наявності дужок спочатку виконується дії в дужках, а потім поза дужками.

Оператори

. Оператор присвоєння - основний оператор будь-якої мови програмування. Загальна форма запису оператора.:=Aімя змінної

:= - знак присвоєння

А - вираз.

Даний оператор вичислює значення виразу А і присвоює отримане значення змінній V.

. Умовний оператор - використовується в тих випадках коли обчислення може піти по різних шляхах в залежності від виконання або не виконання певних умов.(якщо), THEN (тоді),(інакше)

(якщо) - логічний вираз

(тоді) - арифметичний вираз

(інакше)- арифметичний вираз

.Оператор вибору. Оператор вибору використовується в тих випадках, коли в залежності від значення якогось вираження необхідно виконати один з декількох послідовних операторів.вираз OF

константа 1: оператор1;

константа 2: оператор2;

константа n: оператор n;

Оператор переходу

Використовується для обходу участку програми.мітка;

мітка - ціле число без знаку в діапазоні від 1 - 9999

Після цього оператора виконання оператора переходить на рядок з міткою.

Оператор циклу з попередноью умовою

Існує три оператори циклу:

. Оператор з попередньою умовою;

. Оператор з послідовною умовою;

. Оператор циклу з параметром.логічний вираз DO

оператори циклічні частини програми

Сюди також входять оператори :

вводу-виводу;

оператори обробки масивів;

оператори переходу до підпрограм;

оператори роботи з файлами;

Елементи мови та способи структуризації програми

Елементами мови є набори компонентів, які дозволяють створювати додатки за найрізноманітнішими тематиками. Компоненти володіють наборами властивостей, що характеризують їх особливості. Крім властивостей, компоненти містять методи - програмний код, який обробляє значення властивостей та події - повідомлення, які компонент приймає від програми.

Всі програми в Delphi 6 будуються по наступному принципу: в їхній головній частині з розширенням. DPR зберігається тільки виклик декількох команд, які відкривають головне вікно, а також виконують завершальні дії. Решта всього програмного коду міститься в файлах, що зберігають опис додаткових модулів, які підключаються. Кожен модуль має строго задану структуру, яка зазвичай автоматично генерується системою Delphi 6 при його створенні. Модуль складається з чотирьох частин: інтерфейсної частини, частини реалізації (обовязкова), частини ініціалізації і частини завершення (необовязкова) [1]. Спочатку вказують заголовок модуля - ключове слово Unit, за ним довільну назву модуля (вона повинна співпадати з іменем файлу, в якому модуль зберігається) і кладуть крапку з комою: Unit Testunit; Інтерфейсна частина описує інформацію, яка доступна з інших частин програми, з інших модулів і головної частини. Частина реалізації описує інформацію, яка недоступна з інших модулів. Подібне розділення модуля на частини дозволяє створювати і розповсюджувати модулі у відкомпільованому вигляді (розширення. DCU), додаючи до них тільки опис інтерфейсної частини. При цьому внести зміни в такий модуль неможливо, вихідний код, який реалізує описані в інтерфейсній частині можливості, недоступний. Такий підхід дозволяє повторно використовувати раніше написані для інших програм і вже відкоректовані модулі та розмежовує доступ до модуля декількох програмістів, а також дозволяє розбивати програму на набір логічно незалежних модулів. Інтерфейсна частина завжди йде першою і починається з ключового слова interface, а частина реалізації з - implementation.

Частини ініціалізації і завершення необовязкові. Вказані в них дії виконуються, відповідно, на самому початку та в самому кінці роботи програми і тільки один раз. Частина ініціалізації починається з ключового слова initialization, частина завершення - з ключового слова finalization. В кінці модуля завжди ставиться слово end і крапка.

Базовими елементами мови являються: коментарі, змінні, константи, оператори, типи даних тощо.

Засоби обміну даними та вбудовані елементи

Системи керування базами даних InterBase та Firebird

InterBase 6. x є вбудваним в Delphi. Разом з Delphi постачаються дві частини сервера InterBase 6. x: серверна та клієнтська. Не зважаючи на те, що сервер InterBase постачається разом з Delphi, встановлюється він окремо: після встановлення Delphi видається запит на встановлення сервера InterBase. Встановлення виконується в автоматичному режимі, основні файли сервера копіюються в підкаталог INTERBASE, який знаходиться в каталозі BORLAND.

Серверна частина InterBase є локальною версією сервера InterBase та використовується для налагодження програм, призначених для роботи з віддаленими базами даних (БД), дозволяючи на одному компютері перевірити їх у мережевому варіанті. Після налагодження на локальному компютері програму можна перенести на мережевий компютер без змін, для чого потрібно:

скопіювати БД на сервер;

встановити для програми нові параметри зєднання з віддаленою БД.

Клієнтська частина потрібна для забезпечення доступу програм до віддаленої БД.

При розробці БД та програм з використанням локальної версії сервера InterBase треба враховувати, що вона має ряд обмежень і може не підтримувати, наприклад, механізм подій сервера або функції, що визначаються користувачем.

В основі роботи з віддаленою БД лежить можливість мови SQL, яка забезпечує відповідні операції. Призначення та можливості мови SQL для віддалених БД в основному співпадають з призначенням та можливостями цієї мови для локальних БД.

При описі формату операторів мови SQL використовуються наступні правила:

символи < та > позначають окремі елементи формату операторів, наприклад, імена таблиць і стовпчиків, та при записі операторів SQL не вказуються;

в квадратних дужках розміщуються необовязкові елементи конструкції мови;

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

Інформація всієї БД сервера InterBase зберігається в одному файлі, який має розширення GDB. Розмір цього файлу може складати одиниці і навіть десятки гігабайт. Аналогічні розміри БД має система керування базами даних (СКБД) Microsoft SQL Server, в той час як для більш потужних СКБД Oracle та SyBase розмір БД досягає десятків і сотень гігабайт.

На відміну від локальної БД, структуру якої складають таблиці (окремі або звязані), віддалена БД має більш складну структуру, яка включає в свій склад наступні елементи:

таблиці;

індекси;

обмеження;

домени;

перегляди;

генератори;

тригери;

функції користувача;

процедури, що зберігаються;

виключення;фільтри;

привілеї.

Елементи структури віддаленої БД також називають метаданими. Слово "мета" має зміст "над", метадані - дані які описують структуру БД.

Для InterBase максимальне число таблиць в БД рівне 65536, а максимальне число стовпчиків в таблиці - 1000. Відмітимо, що таблиці InterBase мають менше число допустимих типів стовпчиків (полів), ніж таблиці локальних БД Paradox. Типи стовпчиків бази InterBase дані в таблиці 3.1

В таблицях InterBase відсутні наступні типи, логічний та автоінкремент. Логічний тип замінюється типом CHAR (1), а замість автоінкрементого типу для забезпечення унікальних значень використовуються генератори та тригери.


Таблиця 3.1. Типи даних InterBase

ТипОписSMALLINTЦіле число. Діапазон - 32 768. .32 767. INTEGERЦіле число. Діапазон - 2 147 483 648. .2 147 483 647. FLOATЧисло з плаваючою крапкою. Діапазон по модулю 3,4´10-38. .3,4´1038. Точність 7 цифр мантиси. DOUBLE PRECISIONЧисло з плаваючою крапкою. Діапазон по модулю 1,7 ´ 10-308. .1,7´10308. Точність 15 цифр мантиси. CHARACTER (N) Рядок довжиною N символів (не більше 32767) VARCHAR (N) або CHARACTER (N) VARYINGРядок символів довжиною N символів (не більше 32767) DATEДата. Діапазон 01.01.0100. .11.12.5941BLOBДвійкові дані будь-якого типу. Розмір не обмежений.

Для запуску сервера використовується програма InterBase Server Manager, яка викликається однойменною командою головного меню Windows або через панель інструментів.

Стан серверу виводиться в надписі Status: запущеному стану сервера відповідає надпис Running, зупиненому - Stopped.

Сервер InterBase може запускатись автоматично або в ручному режимі, чим керує перемикач групи Start Mode (Режим запуску). Якщо вибраний перемикач Automatic, то сервер буде автоматично викликатися при кожному запуску (перезавантаженні) Windows. Якщо ж вибраний ручний запуск (Manual), то сервер викликається кнопкою Start. Після запуску сервера кнопка Start змінює свою назву на Stop, і її повторне натиснення призводе до зупинки сервера.

В Windows NT сервер можна запустити як службу (service). Ввімкнений стан перемикача "Run the InterBase server as a service on Windows NT" вказує, що сервер InterBase запускається як служба Windows NT.

Надпис Root Directory показує головний каталог, в якому встановлений сервер InterBase і який можна змінити, натиснувши кнопку Change і вибравши потрібний каталог. Однак на практиці змінювати головний каталог не потрібно.

Якщо сервер InterBase завантажений не як служба Windows, то в правому куті панелі задач зявляється спеціальна позначка. Закінчити роботу сервера також можна, натиснувши маніпулятором "миша" на позначці контекстного меню та задавши команду Shutdown.

Інші команди контекстного меню служать для налаштування сервера:Properties… - налаштування властивостей InterBase;- налаштування властивостей.

Зазвичай цим параметрам вже задані потрібні параметри, змінювати які немає необхідності.

При запуску сервера в якості служби Windows NT керувати його параметрами, а також зупинити сервер можна в вікні Services.

Компоненти Delphi для роботи з СКБД FireBird

При створенні форми ми на неї поміщаємо компоненти для звязку з таблицями. Це такі компоненти, як Datasource, IBQuery, IBTransaction, IBDatabase та DBGrid

Для здійснення звязку з БД використовуються компоненти:- виконує звязок БД з програмою;- відповідає за здійснення трансакцій;- виконує звязок між DataSet і компонентами візуалізації та управління;- компонент візуалізації, виводить інформацію, яка міститься в БД у вигляді таблиці;- виконує доступ до таблиць БД;- компонент управління, дозволяє переміщуватися по полях БД, а також додавати та знищувати поля.

Для цих компонентів потрібно встановити наступні параметри::- шлях до файлу БД;- в дане поле потрібно вписати імя компонента, який відповідає за трансакцію;- якщо поле має значення true, то при здійсненні звязку з БД видається запит пароля, якщо false - запит пароля не виконується, а пароль береться із поля Params;- містить логін та пароль для доступу до БД.:- в дане поле потрібно вписати імя компонента, який відповідає за звязок з БД.:- в даному полі потрібно вибрати імя компонента, який відповідає за звязок із DataSet.:- в дане поле потрібно вписати імя компонента, який відповідає за звязок з БД;


Розділ 3. Реалізація алгоритму визначення n! для великих значень n


Програма для визначення n! Має такий вигляд:

program factorial;

{$APPTYPE CONSOLE}k = 30000;: array [1..k] of integer;,t,j,i,n: Integer;('Vvedit chuslo');(n);(n>-1);:=0;[1]:=1;i := 2 to k do m[i]:=0;i:=2 to n do Beginj:=1 to k do begin[j]:=m[j]*i+t;:=0;m[j]>9 then begin:=m[j] div 10;[j]:=m[j] mod 10;;;;:=0;:=k;(i>= 1) and (m[i]=0) do Begin:=c+1;:=i-1;;(n,'!','=');i:=k-c downto 1 do Write (m[i]);;;

readln;

end.

Опис програми:

program factorial; - задається назва програми;

const k = 30000; - оголошена константа k;

Var - оголошення змінних;

m: array [1..k] of integer; - змінна m оголошена як масив від 1 до k тобто до 30 000;

c,t,j,i,n: Integer; - змінні c,t,j,i,n оголошені як змінні типу Integer;

Begin - старт програми (головний Begin програми);

Repeat - запускаємо цикл з після умови;

WriteLn('Vvedit chuslo'); - на консолі зявляється рядок Vvedit chuslo;

ReadLn(n); - ввід числа яке потрібно визначити(ввід n);

Until(n>-1); - завершується цикл з після умови при умові що введено число 0 або більше, інакше програма попросить ввести число повторно;

t:=0; - t присвоюємо 0;

m[1]:=1; - першому елементу масиву присвоюємо 1;

for i := 2 to k do m[i]:=0; - від 2 елемента масиву по 30 000 присвоюємо 0;

for i:=2 to n do Begin - від i:=2 по наше n виконуєм таке:

for j:=1 to k do begin - від j:=1 до 30 000 виконуєм:

m[j]:=m[j]*i+t; - m[j] присвоюємо j елемент масиву*i+t;

t:=0; - t присвоюємо 0;

if m[j]>9 then begin - якщо m[j]>9 тоді

t:=m[j] div 10; - t присвоюємо кількість десятків які поміщаються в m[j];

m[j]:=m[j] mod 10; - m[j] присвоюємо остачу від ділення на 10;

end; - завершуємо цикл;

end; - завершуємо цикл;

end; - завершуємо цикл;

c:=0; - c присвоюємо 0;

i:=k; - i присвоюємо 30 000;

while (i>= 1) and (m[i]=0) do Begin - запускаємо цикл з передумовою, поки 30 000>=1 і m[i]=0 виконуємо:

c:=c+1; - c присвоюємо с+1;

i:=i-1; - i присвоюємо i-1;; - завершуємо цикл;

Write (n,'!','='); - вивід наше n,'!','=';

for i:=k-c downto 1 do Write (m[i]); - i присвоюємо 30 000-с до 1 і виводимо на екран m[i];;

readln;

readln;

end. - завершення програми;


Висновок


Алгоритмічна мова програмування Pascal є мовою високого рівня, з її допомогою можна вирішувати завдання як легкого, так і складного типу. Pascal є зручний у використанні і для досвідчених програмістів, і для програмістів-початківців. На ньому легко реалізовувати будь-які алгоритми, швидко знаходити та виправляти помилки, він створений повністю для того, щоб досягнути очікуваного результату. Алгоритмічна мова Pascal складається з простих ключових слів та не складного інтерфейсу програми, що забезпечує стабільну роботу для програмістів з невисокими знаннями англійської мови.

На мою думку Pascal простий та легкий у використанні, та слугує предметом хорошого прикладу як для початкового вивчення програмування, так і для постійного використання мови для реалізації певних цілей.


Використана література


1.Borland Delphi 6. Руководство разработчика.: Пер. с англ. - М.: Вильямс, 2009. - 1120 с.

2.http://ru.wikipedia.org/wiki/pascal

.Баас Р., Фервай М., Гюнтер Х. Delphi 5: для пользователя. Пер. с нем. - К.: BHVб, 2000 - 496 с.

.Бобровский С. Delphi 6 и Kylix: Библиотека программиста. - СПб.: Питер, 2012. - 560 с.

.Бобровский С. Delphi 7. Учебный курс. - СПб.: Питер, 2004. - 735 с.

.В.Ф. Шаньгин, Л.М. Поддубная Програмированиє на язике ПАСКАЛЬ, Москва Высшая школа 1991р.

.Гофман В.Э., Хомоненко А.Д. Delphi 6. - СПб.: БХВ-Петербург, 2001. -1135 с.

.Дарахвелидазе П.Г., Марков Е.П. Программирование в Delphi 7. - СПб.: БХВ-Петербург, 2009. - 784 с.


Курсова робота з дисципліни :Алгоритмізація та програмування тема Реалізація алгоритму визначен

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ