Зміст
Вступ
1 Характеристика предметної області та постановка задачі
1.1 Аналіз предметної області
1.2 Аналіз інформаційного забезпечення предметної області
1.3 Постановка задачі
2 Проектування структури інформаційної системи
2.1 Аналіз та автоматизація обробки інформаційних потоків
2.2 Розробка структури інформаційної системи
2.3 Вибір засобів розробки інформаційної системи
2.3.1 Веб-сервер Apache
2.3.2 СКБД MySQL
2.3.3 Мова розмітки гіпертексту HTML
2.3.4 Таблиці каскадних стилів CSS
2.3.5 Мова програмування JavaScript
2.3.6 Мова програмування PHP
3 Реалізація програмного продукту
3.1 Структура і функціональне призначення модулів системи, їх взаємозв’язок
3.2 Розробка програмних модулів
3.3 Інструкція користувача
4 Організаційно-економічний розділ
4.1 Розрахунок кошторису витрат на розробку тестової системи визначення професійної придатності програмістів
4.2 Розрахунок експлуатаційних витрат тестової системи визначення професійної придатності програмістів
4.3 Розрахунок умовного обсягу робіт
4.4 Розрахунок річного економічного ефекту від впровадження нової системи
5 Охорона праці та техніка безпеки
5.1 Застосування професійного відбору в охороні праці
5.2 Обов’язки служби охорони праці
5.3 Розрахунок площі природного освітлення для приміщення з ЕОМ
Висновки
Перелік посилань
Додаток А
Додаток Б
Додаток В
Вступ
В епоху новітніх технологій інформація відіграє дуже важливу роль. Розвиток науково-технічного прогресу привів до того, що діяльність багатьох організацій та установ тепер тісно зв’язана із зберіганням великої кількості інформації. Для обробки і зберігання інформації дані структури почали використовувати інформаційні системи, обов’язковою складовою яких є бази даних. Вони дозволяють у зручній формі здійснювати зберігання, видалення та обробку інформації.
З розвитком мережевих технологій, зокрема мережі Internet, постала потреба швидко, конфіденційно та без великих зусиль обмінюватись збереженою інформацією в базах даних. Так як Internet став невід’ємною частиною життя більшості людей: люди почали заробляти через мережу, замовляти і купувати товари, шукати потрібну інформацію, спілкуватись з іншими, проходити тестування або просто розважатися; з’явилась потреба в створенні програмних продуктів, які б працювали з базами даних і водночас були віддаленими. Такі програмні продукти, або як їх називають веб-ресурси, стали досить актуальними, так як вони не прив’язані до робочого місця користувача, до конкретної операційної системи, а всі дані зберігаються на віддаленому сервері. Кожен користувач у будь-який момент може отримати доступ до своїх даних.
Останнім часом в мережі Internet стали популярними різні тести: тести IQ, які дозволяють людям дізнатись коефіцієнт інтелекту, психологічні тести, які покликані допомогти людині виміряти свої індивідуально-психологічні особливості. Але окрім цього тести такого роду мають ще інше застосування: вони є засобом рекламних компаній, а також слугують як комерційні проекти, які покликані приносити дохід. Разом з цим існує мало тестових систем, які допомагають визначити професійну придатність людей, наприклад програмістів. Такі тести проводять деякі компанії при оцінюванні персоналу, при прийомі працівників на роботу з метою визначення професійної придатності. Так, наприклад, відома компанія Micrisoft при прийомі на роботу проводить тестування, яке базується на вирішенні задач та головоломок для виявлення більш творчих кандидатів серед здібних.
Відповідно до цього, метою написання дипломного проекту є створення тестової системи визначення професійної придатності програмістів. Дана тема є актуальною на сьогодні і повинна знайти своє практичне застосування.
Для створення тестової системи було обрано мови програмування PHP та JavaScript, а для роботи з базою даних веб-ресурс використовуватиме систему керування базами даних MySQL.
Отже, тестова система буде виконана у вигляді веб-ресурса і розміщуватиметься в мережі Інтернет. Користувач зможе отримати доступ до ресурсу, відкривши сторінку тестової системи через свій браузер та зможе пройти тестування, отримати результат (дізнатись свою професійну придатність), відправити свій результат другу, а також переглянути рейтинг інших учасників. Авторизований адміністратор зможе керувати веб-ресурсом, вносити зміни до тесту, керувати користувачами за допомогою системи управління.
1 Характеристика предметної області та постановка задачі
1.1 Аналіз предметної області
Предметною областю програмного продукту є створення тестової системи для визначення професійної придатності програмістів.
Для визначення професійної придатності програмістів необхідно провести тестування за потрібною тематикою у вигляді запитань. На основі отриманого результату зробити висновок про професійну придатність.
Тести на професійну придатність проводять на основі тестів IQ. Тест складається із запитань різної складності. За результатами тестування підраховується сумарний бал:
від 70 до 99 – низький рівень;
від 100 до 120 – середній рівень;
від 121 до 150 – вище середнього;
більше 150 – високий рівень.
Відповідно до рівнів формується висновок про професійну придатність. Сумарний бал не повинен перевищувати 170 балів, тобто максимально можливий результат тестування – 170 балів.
Досліджено, що чим більше варіантів тесту проходить користувач, тим кращі результати він показує [1].
1.2 Аналіз інформаційного забезпечення предметної області
На сьогоднішній день існують різні реалізації тестів на професійну придатність: від локальних версій, написаних як додаток до операційної системи, до так званих веб-версій. Вони суттєво відрізняються, так як при їх розробці використовуються різні технології. Основними з яких є: Flash, Windows-додатки, веб-додатки.
Flash – продукт компанії «Macromedia», що дозволяє розробляти інтерактивні мультимедійні програми. Сфера використання Flash є різною, це можуть бути ігри, веб-сайти, презентації, банери і просто мультфільми. При створенні продукту можна використовувати медіа, звукові та графічні файли. В основі Flash лежить векторний морфінг – технологія комп'ютерної графіки, що створює плавний перехід з одного ключового кадру в інший. Це дозволяє робити досить складні мультиплікаційні сцени, задаючи лише кілька ключових кадрів для кожного персонажа.
Іншою перевагою технології Flash є повна програмованість. Flash використовує мову програмування ActionScript, яка по синтаксису є схожою із JavaScript. Остання версія мови (ActionScript 3.0) є повноцінною об'єктно-орієнтованою мовою.
Серед цих переваг існують також і ряд особливостей, які можна віднести до мінусів Flash технології. Наприклад, для того щоб переглянути проект, створений на Flash, користувачу необхідно додатково встановити Flash-плеєр. Також проект, написаний на Flash, є статичним, тобто вміст програмного продукту користувач вже не змінить, без втручання в код [2].
До Windows-додатків можна віднести додатки написані на таких мовах програмування як: C++, Visual Basic, Delphi, C# та інші. З допомогою такої технології можна не тільки розробити проект, а й створити панель управління для нього, де адміністратор зміг би змінювати вміст проекту. Але не дивлячись на переваги і засоби, які надають ці мови програмування, все ж таки користувачу необхідно буде встановити додаткове програмне забезпечення. Наприклад, для роботи з додатком написаним на С# необхідно встановити платформу .NET Framework.
Веб-додатки – додатки, створені для роботи в серверному середовищі і написані на таких мовах програмування як: PHP, ASP, Perl, Ruby, Java та інші. Ці мови програмування надають можливість створювати повноцінні додатки, до цих додатків створювати системи управління контентом. Веб-додатки працюють тільки в серверному середовищі, тобто для роботи з ними необхідно встановити сервер, так як скрипти виконуються на сервері. Але разом з тим, такі додатки можна викладати в Internet, де вже налаштований сервер, тому для роботи користувачу необхідно мати веб-браузер і вихід в Internet. Також перевагою веб-додатків є те, що користувач має доступ до проекту через Internet в будь-який момент.
Серед тестових систем, які знаходяться в мережі Internet, існує мало таких, які надають можливість пройти тест і дізнатись професійну придатність. Дуже важко знайти тестову систему із потрібною тематикою і разом з тим, більшість із них є платними й для отримання результату користувачу необхідно відправити платне смс повідомлення.
1.3 Постановка задачі
Вхідною інформацією для тестування та збереження результатів є: “форма реєстрації користувача” та “форма авторизації”.
Перелік (у скороченому варіанті) та опис вхідної інформації тестової системи наведено в таблиці 1.1.
Таблиця 1.1 – Перелік вхідних повідомлень
Вхідне повідомлення | Ідентифікатор | Форма подання | Термін і час |
Форма реєстрації користувача | REGISTRATION | Документ | По мірі необхідності |
Форма авторизації | LOGIN | Документ | По мірі необхідності |
Перелік та опис структурних одиниць вхідної інформації тестової системи наведено в таблиці 1.2.
Таблиця 1.2 – Перелік та опис структурних одиниць вхідної інформації
Структурна одиниця | Точність значення | Джерело інформації | Ідентифікатор джерела інформації |
Прізвище користувача | 20 | Форма реєстрації користувача | REGISTRATION |
Ім’я користувача | 10 | Форма реєстрації користувача | REGISTRATION |
E-mail користувача | 50 | Форма реєстрації користувача | REGISTRATION |
Логін користувача | 20 | Форма реєстрації користувача, Форма авторизації | REGISTRATION, LOGIN |
Пароль доступу | – | Форма реєстрації користувача, Форма авторизації | REGISTRATION, LOGIN |
Дата входу | – | Форма авторизації | LOGIN |
Права користувача | – | Форма авторизації | LOGIN |
Як нормативно-довідкова інформація для створення тестової системи визначення професійної придатності програмістів використовуються наступні довідники:
запитань, який формується адміністратором тестової системи;
відповідей, який формується адміністратором тестової системи;
рівнів придатності, який формується адміністратором системи.
Обов’язковим елементом комплексної автоматизації є розробка і використання єдиної номенклатури кодів, простіше кажучи класифікація об’єктів. Класифікація – це науковий метод дослідження природи об’єктів та явищ з використанням певних правил їх систематизації.
Для кодування реквізиту “Запитання” слід скористатися порядковою системою кодування: ХХХ – номер запитання.
Фрагмент класифікатора
Значення | Код |
Інкапсуляція – це… | 12 |
Інтерфейс – це… | 205 |
Для кодування реквізиту “Відповідь” слід скористатися порядковою системою кодування: ХХХ – номер відповіді.
Фрагмент класифікатора
Значення | Код |
Будь-які речі, через які ми взаємодіємо з об’єктом | 157 |
Розділення на інтерфейс і реалізацію | 300 |
Коди, які використовуються при обробці інформації в тестовій системі, представлені в таблиці 1.3.
Таблиця 1.3 – Таблиця класифікації і кодування
Назва коду | Тип класифікатора | Система кодування | Структура коду | Значення кожного розряду |
Номер запитання | Локальний | Порядкова | ХХХ | |
Номер відповіді | Локальний | Порядкова | ХХХ | |
Номер рівня придатності | Локальний | Порядкова | ХХХ |
Перелік (у скороченому вигляді) та опис нормативно-довідкової інформації тестової системи наведено в таблиці 1.4.
Таблиця 1.4 – Перелік нормативно-довідкової інформації
Довідники | Ідентифікатор | Форма подання | Термін і час |
Довідник запитань | QUESTION | Документ | По мірі необхідності |
Довідник відповідей | ANSWER | Документ | По мірі необхідності |
Довідник рівнів придатності | LEVEL | Документ | По мірі необхідності |
Перелік та опис структурних одиниць нормативно-довідкової інформації тестової системи наведено в таблиці 1.5.
Таблиця 1.5 – Перелік та опис структурних одиниць нормативно-довідкової інформації тестової системи
Структурна одиниця | Точність значення | Джерело інформації | Ідентифікатор джерела інформації |
Запитання | – | Довідник запитань | QUESTION |
Картинка до запитання | 50 | Довідник запитань | QUESTION |
Варіант відповіді | 255 | Довідник відповідей | ANSWER |
Вага відповіді | 1 | Довідник відповідей | ANSWER |
Рівень придатності | – | Довідник рівнів придатності | LEVEL |
Мінімальний бал рівня | 1 | Довідник рівнів придатності | LEVEL |
Максимальний бал рівня | 3 | Довідник рівнів придатності | LEVEL |
В результаті створення тестової системи формується вихідна інформація у вигляді комп’ютерних (електронних) файлів.
Вихідною інформацією тестової системи є “результат тестування”.
Перелік (у скороченому вигляді) та опис вихідної інформації тестової системи наведено в таблиці 1.6.
Таблиця 1.6 – Перелік вихідних повідомлень
Вихідне повідомлення | Ідентифікатор | Форма подання | Термін і час |
Результат тестування | RESULT | Документ | Після проходження тесту |
Перелік та опис структурних одиниць вихідної інформації тестової системи наведено в таблиці 1.7.
Таблиця 1.7 – Перелік та опис структурних одиниць вихідної інформації
Структурна одиниця | Точність значення | Джерело інформації | Ідентифікатор джерела інформації |
Бал – результат тестування | 3 | Результат тестування | RESULT |
Час проходження тесту | – | Результат тестування | RESULT |
Дата тестування | – | Результат тестування | RESULT |
Прізвище користувача | 20 | Результат тестування | RESULT |
Ім’я користувача | 10 | Результат тестування | RESULT |
Для визначення професійної придатності програмістів розраховуються наступні показники:
– кількість набраних балів за -те запитання:
(1.1)
де – номер поточного запитання, ;
– кількість запитань;
– рівень складності запитання: ;
– максимально можливий сумарний бал за запитань.
– коефіцієнт професійної придатності:
(1.2)
Розроблювальний програмний продукт надасть змогу швидко, і без великих зусиль зберігати інформацію про запитання і відповіді для тестування, вести облік зареєстрованих користувачів, переглядати рейтинг учасників, а також визначати професійну придатність програмістів.
Реєстрація користувачів включатиме в себе заповнення та збереження наступних даних:
прізвище, ім’я користувача;
пароль, email, логін для авторизації;
телефон користувача.
Після проходження тестування користувач отримає результат, що містить наступну інформацію:
прізвище, ім’я користувача;
бал – результат тестування;
дату проходження тесту;
час проходження тесту.
Програмний продукт буде реалізовувати певний комплекс задач, які можна поділити на дві групи:
задачі, які будуть доступні звичайним користувачам;
задачі, які будуть доступні адміністраторам.
До задач першої групи можна віднести:
проходження тестування;
реєстрація;
збереження результату;
перегляд рейтингу;
відправка результату другу.
До другої групи віднесемо такі задачі:
керування зареєстрованими користувачами;
створення/редагування/видалення запитань;
створення/редагування/видалення відповідей;
налаштування тестової системи: кількість питань, яку необхідно показати за сеанс;
налаштування рейтингу користувачів;
керування адміністраторами.
2 Проектування структури інформаційної системи
2.1 Аналіз та автоматизація обробки інформаційних потоків
Інформаційний потік для тестової системи – це сукупність циркулюючих в тестовій системі повідомлень, що необхідні для проходження тестування та визначення результату. Інформаційний потік може існувати у виді паперових і електронних документів. Іншими словами – це потік повідомлень в мовній, документній (паперовій, електронній) і іншій формі, що генерується вихідним матеріальним потоком в тестовій системі.
В результаті проектування тестової системи та аналізу інформаційних потоків було сформовано діаграму потоків даних (рисунок 2.1) та структурно-функціональну діаграму (рисунок 2.2).
Рисунок 2.1 – Діаграма потоків даних
Рисунок 2.2 – Структурно-функціональна діаграма
Інформаційні потоки в сукупності складають інформаційну систему. Така система забезпечує проходження і обробку інформації в тестовій системі визначення професійної придатності програмістів.
При проектуванні бази даних обов’язково необхідно її привести до трьох нормальних форм. Це здійснюється за допомогою нормалізації відношень. Нормалізація – це процес декомпозиції початкового відношення на декілька простіших відношень меншої розмірності.
В результаті дослідження предметної області “Тестова система визначення професійної придатності програмістів” було отримано наступний набір полів:
прізвище користувача;
ім’я користувача;
еmail користувача;
пароль доступу;
права користувача;
логін користувача;
дата входу;
запитання;
картинка до запитання;
варіант відповіді;
вага відповіді;
бал – результат тестування;
рівень придатності;
мінімальний бал рівня;
максимальний бал рівня;
дата тестування;
час проходження тесту.
Перша нормальна форма передбачає, щоб кожне поле таблиці було неподільним і не містило даних, що повторюються. Щоб привести відношення до першої нормальної форми, необхідно розбити предметну область на декілька простих відношень.
Предметна область була розбита на таблиці (прості відношення):
користувачі;
рейтинг;
запитання;
відповіді;
рівні придатності;
авторизація.
Друга нормальна форма передбачає, що відношення знаходяться у першій нормальній формі і кожний рядок відношення однозначно визначається первинним ключем.
При приведені до другої нормальної форми було додано ключі до таблиць. До таблиці “Користувачі” будо додано ключове поле – код користувача. До таблиці “Рейтинг” будо додано ключове поле – код запису. До таблиці “Запитання” будо додано ключове поле – код запитання. До таблиці “Відповіді” будо додано ключове поле – код відповіді. До таблиці “Рівні придатності” будо додано ключове поле – код рівня, а до таблиці “Авторизація” будо додано ключове поле – код запису.
Третя нормальна форма передбачає, що відношення знаходяться у першій та другій нормальній формі, а також щоб значення будь-якого поля, що не входить до первинного ключа не залежало від інших полів, тобто не повинно бути транзитивної залежності.
Відношення були приведені до третьої нормальної форми.
Далі виявимо зв’язки інформаційно-логічної моделі.
Модель “сутність-зв’язок” має кілька базових понять, що утворюють вихідні цеглинки, із яких будуються більш складні об’єкти за заздалегідь визначеними правилами.
Зв’язки поділяються на три типи за множинністю: “один-до-одного” (1:1), “один-до-багатьох” (1:Б), “багато-до-багатьох” (Б:Б). Зв’язок “один-до-одного” (1:1) означає, що екземпляр однієї сутності зв’язаний тільки з одним екземпляром іншої сутності. Зв’язок 1:Б означає, що один екземпляр сутності, розташований ліворуч по зв’язку, може бути зв’язаний з декількома екземплярами сутності, розташованими праворуч по зв’язку. А зв’язок Б:Б означає, що один екземпляр першої сутності може бути зв’язаний з декількома екземплярами другої сутності, і навпаки, один екземпляр другої сутності може бути зв’язаний з декількома екземплярами першої сутності.
Для встановлення відношень між інформаційними об’єктами задамо запити до цих об’єктів:
до якого запитання належать відповіді?
які результати тестування в користувача?
Зв’язок №1
Кожне запитання має певний список відповідей, тому організовуємо зв’язок “один-до-багатьох” (рисунок 2.3).
Рисунок 2.3 – Зв’язок “Запитання – Відповіді”
Зв’язок №2
Кожен користувач може пройти тест на професійну придатність безліч разів. На основі цього складається рейтинг учасників, тому організовуємо зв’язок “один-до-багатьох” (рисунок 2.4).
Рисунок 2.4 – Зв’язок “Користувачі – Рейтинг”
На основі структурних зв’язків будуємо інфологічну модель, яка наведена на рисунку 2.5.
Рисунок 2.5 – Інфологічна модель
Тепер опишемо властивості кожної таблиці.
Властивості таблиці “Користувачі” наведені в таблиці 2.1.
Таблиця 2.1 – Властивості таблиці “Користувачі”
Назва реквізиту | Ідентифікатор | Тип | Маска / Довжина | Ключове поле |
Код користувача | adept_id | Цілі значення | 11 | Primary |
Прізвище | adept_surname | Строкова величина | 100 | |
Ім’я | adept_name | Строкова величина | 100 | |
adept_mail | Строкова величина | 50 | ||
Пароль | adept_password | Строкова величина |
Властивості таблиці “Запитання” наведені в таблиці 2.2.
Таблиця 2.2 – Властивості таблиці “Запитання”
Назва реквізиту | Ідентифікатор | Тип | Маска / Довжина | Ключове поле |
Код запитання | quest_id | Цілі значення | 11 | Primary |
Текст запитання | quest_question | Строкова величина | ||
Картинка | quest_image | Строкова величина | 100 |
Властивості таблиці “Відповіді” наведені в таблиці 2.3.
Таблиця 2.3 – Властивості таблиці “Відповіді”
Назва реквізиту | Ідентифікатор | Тип | Маска / Довжина | Ключове поле |
Код відповіді | ans_id | Цілі значення | 11 | Primary |
Варіант відповіді | ans_answer | Строкова величина | 255 | |
Вага відповіді | ans_point | Цілі значення | 11 | |
Код запитання | ans_question_id | Цілі значення | 11 | Secondary |
Властивості таблиці “Рейтинг” наведені в таблиці 2.4.
Таблиця 2.4 – Властивості таблиці “Рейтинг”
Назва реквізиту | Ідентифікатор | Тип | Маска / Довжина | Ключове поле |
Код запису | rat_id | Цілі значення | 11 | Primary |
Бал | rat_mark | Цілі значення | 11 | |
Дата тестування | rat_date | Цілі значення | 12 | |
Час проходження тесту | rat_time | Цілі значення | 12 | |
Код користувача | rat_adept_id | Цілі значення | 11 | Secondary |
Для авторизації та управління адміністраторами створена таблиця “Авторизація”, її властивості наведені в таблиці 2.5.
Таблиця 2.5 – Властивості таблиці “Авторизація”
Назва реквізиту | Ідентифікатор | Тип | Маска / Довжина | Ключове поле |
Код запису | user_id | Цілі значення | 11 | Primary |
Ім’я | user_name | Строкова величина | 100 | |
Логін | user_login | Строкова величина | 60 | |
Пароль | user_password | Строкова величина | 50 | |
Ip адреса | user_ip | Строкова величина | 25 | |
Дата входу | user_denter | Цілі значення | 12 | |
Права | user_rule | Цілі значення | 3 |
Властивості таблиці “Рівні придатності” наведені в таблиці 2.6.
Таблиця 2.6 – Властивості таблиці “ Рівні придатності”
Назва реквізиту | Ідентифікатор | Тип | Маска / Довжина | Ключове поле |
Код рівня | level_id | Цілі значення | 11 | Primary |
Рівень | level_name | Строкова величина | 100 | |
Мінімальний бал рівня | level_min | Цілі значення | 3 | |
Максимальний бал рівня | level_max | Цілі значення | 3 |
Схема даталогічної моделі наведена на рисунку 2.6.
Рисунок 2.6 – Даталогічна модель
2.2 Розробка структури інформаційної системи
Розроблюваний програмний продукт призначений для тестування та визначення професійної придатності програмістів. За допомогою програмного продукту ведеться облік учасників, які проходять тест; додаються/видаляються питання та відповіді. В такому процесі проводиться постійний обмін даними між модулями. На рисунку 2.7 представлена схема інформаційних потоків між клієнтською частиною (веб-браузером), веб-сервером та сервером бази даних.
Рисунок 2.7 – Схема інформаційних потоків
Клієнтська частина (браузер) відправляє заповнену форму з даними на веб-сервер. На веб-сервері дані обробляються за допомогою php-скриптів. PHP-скрипти на основі отриманих даних формують SQL-запити і відправляють їх до сервера бази даних. Сервер бази даних отримує текст SQL-запитів, обробляє їх, а результат виконання цих запитів відправляє назад до веб-серверу. На основі отриманого результату веб-сервер формує HTML-сторінку, яку надсилає користувачу у веб-браузер.
За допомогою такої взаємодії клієнт не бачить код php-скриптів, а тільки результат, який вони повертають. На відміну від php-скриптів, javascript виконується на стороні клієнта, а не сервера. Тому клієнт має можливість бачити код цих скриптів.
За допомогою PHP-скриптів відбувається підключення до бази даних MySQL. Всі функції, що забезпечують взаємодію між PHP й MySQL, винесені в окрему бібліотеку.
Послідовність кроків для підключення до бази даних і керування табличними даними, наступна:
встановлення зв'язку з БД;
формування запиту;
надсилання запиту до БД;
обробка результату, отриманого від БД.
Для підключення до бази даних потрібні наступні параметри:
тип бази даних;
ім'я хост-вузла;
ім'я користувача;
пароль користувача;
назва бази даних.
Отримавши необхідну інформацію від бази даних завершується з’єднання з MySQL, після цього на основі отриманої інформації формується HTML-документ [3].
HTML документ складається із трьох частин:
декларація типу документа (англ. Document type declaration, Doctype), на самому початку документа, в якій визначається тип документа (DTD), наприклад, HTML 4.01 Strict;
шапка HTML документа (HEAD), в якій записано загальні технічні відомості або додаткова інформація про документ, яка не відображається безпосередньо в браузері;
тіло HTML документа (BODY), в якому міститься основна інформація документа [4].
Далі опишемо структуру програмного продукту.
Структура розроблюваного програмного продукту спроектована таким чином, що всі модулі будуть динамічно підключаються до головної сторінки програми.
Тестова система буде мати наступні модулі:
модуль для керування адміністраторами;
модуль для керування зареєстрованими користувачами;
модуль для роботи з тестом;
модуль відправки повідомлень.
Модуль для керування адміністраторами буде потрібен для додавання/видалення/редагування адміністраторів веб-додатку.
В модулі для керування зареєстрованими користувачами буде відображатись інформація про користувачів, які проходили тестування, їх результат, також буде можливість керувати цими користувачами: редагувати/видаляти їх дані.
Модуль для роботи з тестом – це головний модуль програми. В цьому модулі адміністратор зможе додавати/видаляти/редагувати запитання і відповіді до них, налаштовувати тест.
В тестовій системі користувачу буде надана можливість відправити свій результат другу. На сьогодні такий сервіс є популярним в мережі Інтернет. За відправку повідомлень буде відповідати програмний модуль для відправки повідомлень.
Модулі тестової системи будуть організовані папками, в яких будуть міститись відповідні класи та файли.
Програмний модуль для керування адміністраторами буде містити наступні класи та файли:
клас для роботи керування адміністраторами;
файл, де відбувається перевірка на введення ПІП;
файл для перевірки введеного логіна (чи доступний користувачу введений логін);
файл, для перевірки введення паролю та перевірки співпадання повторного паролю.
Модуль для керування зареєстрованими користувачами буде містити наступні класи та файли:
клас для роботи керування зареєстрованими користувачами;
клас для авторизації зареєстрованих користувачів;
файл, де відбувається перевірка на введення ПІП;
файл для перевірки введеного логіна;
файл, для перевірки введення паролю та перевірки співпадання повторного паролю.
Модуль для роботи з тестом буде містити наступні класи та файли:
клас для роботи з тестом;
файл конфігурації тесту.
Програмний модуль для відправки повідомлень буде містити наступні класи та файли:
клас для відправки повідомлень;
файл для перевірки введених даних;
капча – клас для розпізнавання комп’ютерів і людей;
файл конфігурації капчі для сайту;
файл конфігурації капчі для системи управління;
файл для налаштування шрифту капчі.
Також для тестової системи будуть розроблені інші класи, які не належатимуть перечисленим модулям, а будуть інтегровані у тестову систему. Ними являються:
клас для доступу в систему управління;
клас для роботи з базою даних;
клас для навігації по сторінкам.
Схема взаємозв’язку програмних модулів тестової системи наведена на рисунку 2.8.
Рисунок 2.8 – Схема взаємозв’язку програмних модулів тестової системи
Схема взаємозв’язку програмних модулів системи управління тестом наведена на рисунку 2.9.
Рисунок 2.9 – Схема взаємозв’язку програмних модулів системи управління тестом
Дерево програмних модулів, які відображають структурну схему пакету, що містить програмні модулі різних класів, наведено на рисунку 2.10.
Рисунок 2.10 – Дерево програмних модулів
2.3 Вибір засобів розробки інформаційної системи
2.3.1 Веб-сервер Apache
Для розробки тестової системи використаний сервер Apache, на якому будуть розміщені усі модулі та класи системи.
Apache HTTP-сервер – відкритий веб-сервер Internet для UNIX-подібних, Microsoft Windows, Novell NetWare та інших операційних систем. На сьогодні він є найрозповсюдженішим веб-сервером мережі Internet.
Веб-сервер – це сервер, який приймає HTTP-запити від клієнтів, зазвичай веб-браузерів, який видає їм HTTP-відповіді, разом з HTML-сторінкою, зображенням, файлом, медіа-потоком або іншими даними [5].
Веб-сервером називають як програмне забезпечення, що виконує його функції, так і комп'ютер, на якому це програмне забезпечення працює.
Клієнти дістають доступ до веб-сервера за URL адресою потрібної їм веб-сторінки або іншого ресурсу.
Web-сервер Apache є некомерційним, вільно розповсюджуваним продуктом. Продукт підтримує безліч можливостей, багато з яких реалізовані як скомпільовані модулі, що розширюють основні функціональні можливості. Існують інтерфейси для підтримки мов програмування Perl, Python і PHP.
В основному Apache використовується для передачі даних через HTTP статичних та динамічних веб-сторінок у всесвітній павутині.
Сервер Apache може працювати в якості кешувального проксі-сервера. Проксі-сервер – це програма або окремий комп'ютер, який спеціалізується на обробці запитів до мережі та збереженні результатів запитів в своїй локальній кеш-пам'яті, що дозволяє істотно підвищити продуктивність роботи користувачів локальної мережі при роботі з документами, розташованими в Internet. Можна задавати такі параметри і налаштування проксі-сервера:
типи файлів, які необхідно кешувати або не включати в кеш;
максимальний обсяг дискового простору, відведений під кеш;
періодичний перегляд та індексування бази даних кеша з метою вивільнення дискового простору шляхом видалення застарілих об'єктів [6].
Для розробки програмного продукту буде використана збірка віртуального веб-серевера XAMPP. Тут є Apache і MySQL.
2.3.2 СКБД MySQL
База даних тестової системи буде створена з допомогою системи керування базами даних MySQL. Це одна із основних СКБД для створення баз даних веб-ресурсів.
MySQL – система керування базами даних (СКБД), що забезпечує користувачам можливість створення, збереження, оновлення, пошук інформації та контролю доступу в базах даних [7].
MySQL є гарним рішенням для малих і середніх додатків. Звичайно MySQL використовується як сервер, до якого звертаються локальні або віддалені клієнти, проте в дистрибутив входить бібліотека внутрішнього сервера, що дозволяє включати MySQL в автономні програми.
Гнучкість СКБД MySQL забезпечується підтримкою великої кількості типів таблиць: користувачі можуть вибрати як таблиці типу MyISAM, що підтримують повнотекстовий пошук, так і таблиці InnoDB, що підтримують транзакції на рівні окремих записів. Більш того, СУБД MySQL поставляється із спеціальним типом таблиць EXAMPLE, що демонструє принципи створення нових типів таблиць. Завдяки відкритій архітектурі і GPL-ліцензуванню, в СКБД MySQL постійно з'являються нові типи таблиць.
MySQL має API для мов C, C++, Java, LISP, Perl, PHP, Python, Ruby, Smalltalk бібліотеки для мов платформи .NET, а також забезпечує підтримку для ODBC за допомогою ODBC-драйвера MyODBC.
Можливості сервера MySQL:
простота у встановленні та використанні;
підтримується необмежена кількість користувачів, що одночасно працюють із БД;
кількість рядків у таблицях може досягати 50 млн.;
висока швидкість виконання команд;
наявність простої і ефективної системи безпеки.
Недоліки сервера MySQL:
не реалізована підтримка транзакцій. Натомість пропонується використовувати LOCK/UNLOCK TABLE;
відсутня підтримка зовнішніх (foreign) ключів;
відсутня підтримка тригерів і збережених процедур;
відсутня підтримка представлень (VIEW).
Зазначені недоліки не є критичними при розробці малих і середніх ІС (інформаційних систем) для робочих груп [8].
Незважаючи на малі недоліки, для розробки програмного продукту було обрано MySQL в ролі СКБД. База даних буде створюватись за допомогою менеджера баз даних – PhpMyAdmin. Даний менеджер входить до складу збірки віртуального веб-серевера XAMPP.
2.3.3 Мова розмітки гіпертексту HTML
Будь який веб-ресурс, чи то звичайний сайт, чи портал не обходиться без дизайну. Дизайн сторінок втілюється за допомогою мови розмітки гіпертексту HTML.
HTML (Hypertext Markup Language – мова розмітки гіпертексту) – це стандартна мова розмітки документів у мережі Internet. Всі веб-сторінки створюються за допомогою мови HTML або XHTML [9].
Мова розмітки – штучна мова, яка використовує набір спеціальних тегів, які формують веб-сторінку.
Мови розмітки використовувалися століттями, а в останні роки почали використовуватися в системах комп'ютерної верстки та системах обробки текстової інформації [10].
Наведемо деякі поняття.
Гіпертекст (англ. Hypertext) – документ (текст), що містить гіперпосилання на інші документи, які можуть бути відображені безпосередньо з вихідного (первинного) документу, шляхом активізації гіперпосилання. Веб-оглядач переміщує користувача Internetу з одного документу на інший як тільки той вказує на гіперпосилання [11].
Гіперпосилання – активний (виділеним кольором) текст, зображення чи кнопка на веб-сторінці, натиснення на яку (активізація гіперпосилання) викликає перехід на іншу сторінку чи іншу частину поточної сторінки [12].
XHTML (розширювана мова розмітки гіпертексту) – мова розмітки, що задовольняє синтаксичним правилам XML [13].
Мова HTML інтерпретується браузером і відображається у вигляді документа, зручного для людини.
HTML є додатком SGML (стандартної узагальненої мови розмітки) і відповідає міжнародному стандарту ISO 8879.
HTML-документ є текстовим файлом розмічений за допомогою спеціальних, текстових команд, тегів. Текстовий формат представлення веб-документів був вибраний виходячи з основних вимог до веб-документу:
простота;
можливість інтерпретації в будь-якій операційній системі;
мінімальний розмір файлу;
зручність редагування та інтерпретації [14].
Для розробки програмного продукту буде використана змішана верстка веб-сторінок, а саме: таблична (документ розміщується в таблицях) та “дівова” верстка (верстка з допомогою слоїв). Для створення веб-сторінок програмного продукту буде використаний блокнот Notepad++. Переваги даного блокноту в тому, що він є безкоштовним та має підсвітку синтаксису різних мов.
2.3.4 Таблиці каскадних стилів CSS
Зазвичай веб-сторінки дуже громіздкі, так як в них окрім спеціальних тегів, описується дизайн за допомогою стилів, тому для виділення стилів від тегів та для читабельності коду використовують таблиці каскадних стилів.
Cascading Style Sheets (каскадні таблиці стилів) – технологія опису зовнішнього вигляду документа, написаного мовою розмітки. CSS використовується переважно для оформлення HTML- і XHTML-документів, але іноді і для інших XML-структурованих документів.
CSS використовується розробниками веб-сторінок для опису кольорів, шрифтів, розташування та інших аспектів представлення документа. Основною метою розробки CSS було розділення вмісту (написаного на HTML або іншій мові розмітки) і представлення документа (написаного на CSS). Таке розділення повинно збільшити зрозумілість документа, надати велику гнучкість, зменшити складність і повторюваність в структурному вмісті. Крім того, CSS дозволяє представляти один і той же документ в різних стилях.
До появи CSS, оформлення веб-сторінок здійснювалося безпосередньо усередині вмісту документа. Проте з появою CSS стало можливим розділення змісту і стилю документа. За рахунок цього нововведення стало можливим легко застосовувати єдиний стиль оформлення для схожих документів [15].
Переваги CSS розмітки:
декілька дизайнів сторінки для різних пристроїв перегляду;
зменшення часу завантаження сторінок сайту за рахунок перенесення правил представлення даних в окремий CSS-файл;
простота подальшої зміни дизайну;
додаткові можливості оформлення.
Для оформлення веб-сторінок програмного продукту будуть використані “зовнішні” таблиці каскадних стилів, тобто стилі розміщенні в файлах стилів (файл.css) і підключені до веб-сторінок. Для створення таблиці каскадних стилів програмного продукту буде використаний блокнот Notepad++. Даний блокнот має підсвітку синтаксису CSS та підказки, що спрощують написання таблиць каскадних стилів.
2.3.5 Мова програмування JavaScript
JavaScript – скриптова мова, що найчастіше використовується при створенні сценаріїв поведінки браузера, що вбудовуються у веб-сторінки.
JavaScript має низку властивостей об'єктно-орієнтованої мови, але завдяки концепції прототипів підтримка об'єктів в ньому відрізняється від традиційних мов об’єктно-орієнтованого програмування. Крім того, JavaScript має ряд властивостей, притаманних функціональним мовам:
функції як об'єкти першого рівня;
об'єкти як списки;
каррінг (currying);
анонімні функції;
замикання (closures) – що додають мові додаткову гнучкість.
JavaScript має CІ-подібний синтаксис, але в порівнянні з мовою СІ має наступні корінні відмінності:
функції як об'єкти першого класу;
об'єкти, з можливістю інтроспекції і динамічної зміни типу через механізм прототипів;
обробка винятків;
автоматичне приведення типів та “прибирання сміття”;
анонімні функції [16].
Мова JavaScript частіше використовується при розробці невеликих веб-додатків, коли потрібно виконати певні функції без перезавантаження веб-сторінки. Тому для розробки функцій програмного продукту буде використана мова JavaScript.
2.3.6 Мова програмування PHP
Будь який веб-ресурс не обходиться без програмної частини, на яку покладені усі функції ресурсу. Функції системи створюються за допомогою мови програмування. Для розробки тестової системи було обрано одну із основних мов програмування для веб-ресурсів.
PHP (“препроцесор гіпертексту”) – скриптова мова програмування, створена для генерації HTML-сторінок на веб-сервері та роботи з базами даних. В даний час підтримується переважною більшістю провайдерів хостингу. Входить в LAMP – “стандартний” набір для створення веб-сайтів (Linux, Apache, MySQL, PHP (Python або Perl)) [17].
Препроцесор – програма, яка виконує попередню обробку даних, для того, щоб вони могли використовуватись іншою програмою, наприклад, такою як компілятор.
В області програмування для мережі Internet, PHP – одна з популярних скриптових мов завдяки своїй простоті, швидкості виконання та багатій функціональності. PHP відрізняється наявністю ядра і модулів, що підключаються, так званих “розширень”: для роботи з базами даних, сокетами, динамічною графікою, криптографічними бібліотеками, документами формату PDF і т.п. Існують сотні розширень, проте в стандартне постачання входить лише декілька десятків тих, що добре зарекомендували себе. Інтерпретатор PHP підключається до веб-серверу або через модуль, створений спеціально для цього сервера, наприклад, для Apache або IIS, або як CGI-додаток.
Синтаксис PHP подібний синтаксису мови СI. Деякі елементи, такі як асоціативні масиви і цикл foreach, запозичені з Perl.
Для створення програмного продукту буде використана мова програмування PHP версії PHP 5, оскільки вона має суттєві зміни і переваги:
оновлення ядра Zend (Zend Engine 2), що істотно збільшило ефективність інтерпретатора;
введена підтримка мови розмітки XML;
повністю перероблені функції ООП, які стали багато в чому схожі з моделлю, використовуваною в Java;
введена деструкція, відкриті, закриті та захищені члени і методи, остаточні члени і методи, інтерфейси і клонування об'єктів [18].
Для створення php-скриптів буде використаний блокнот Notepad++. Даний блокнот має підсвітку синтаксису PHP та підказки, що спрощують написання програмного коду.
3 Реалізація програмного продукту
3.1 Структура і функціональне призначення модулів системи, їх взаємозв’язок
Розроблюваний програмний продукт складається з багатьох модулів, які містять класи, функції для оброблення даних та скриптів, які працюють з цими модулями. Усі класи знаходяться в різних файлах і їх назва починається з префікса «cl_». Всі класи наслідуються від головного класу, драйвера бази даних MySQL mysqldriver.php, який в свою чергу реалізує абстрактний клас abstract.dbdriver.php. Для кожного модуля існує окремий файл index.php, який працює з відповідним модулем.
Веб-додаток складається з таких модулів та класів:
а) модуль для керування адміністраторами – admin:
cl_administrators.php – клас для керування адміністраторами;
checkFIO.php – файл для перевірки введення ПІП;
checkLogin.php – файл для перевірки введеного логіна (чи доступний такий логін користувачу);
checkPassword.php – файл для перевірки введення паролю та перевірки співпадання повторного паролю;
б) модуль для керування зареєстрованими користувачами – users:
cl_users.php – клас для керування користувачами;
cl_autorize.php – клас для авторизації користувачів;
checkFIO.php – файл для перевірки введення ПІП;
checkLogin.php – файл для перевірки введеного логіна (чи доступний такий логін користувачу);
checkPassword.php – файл, для перевірки введення паролю та перевірки співпадання повторного паролю;
в) модуль для роботи з тестом – test:
cl_test.php – клас для роботи з тестом;
test_config.php – файл конфігурації тесту;
г) cl_authorization.php – клас для доступу в систему управління;
д) cl_db.php – клас, який відповідає за підключення і відключення від бази даних і підключає драйвер бази даних;
е) cl_navigation.php – клас для навігації по сторінкам;
є) модуль відправки повідомлень – mailer:
class.phpmailer.php – клас для відправки повідомлень;
FriendMail.php – клас для перевірки введених даних, який використовує клас class.phpmailer.php;
kcaptcha.php – клас для розпізнавання комп’ютерів і людей;
kcaptcha_config.php – файл конфігурації капчі для сайту;
kcaptcha_config_login.php – файл конфігурації капчі для системи управління;
font_preparer.php – файл для налаштування шрифту капчі.
Веб-додаток складається з наступних файлів:
index.php – головна сторінка веб-додатку;
test.php – сторінка тестування;
timershow.php – файл, який показує час проходження тесту;
finish.php – сторінка результату тестування;
check.php – файл для авторизації;
main.php – головна сторінка системи управління;
logout.php – файл, який видаляє дані з сесії, викликається при виході з системи управління;
config.php – файл налаштування, де зберігаються параметри доступу до бази даних;
jquery.js – бібліотека JavaScript, яка призначена для взаємодії JavaScript та HTML;
jquery.alerts.js – плагін для jquery, який задає стиль стандартним діалоговим вікнам;
style.css – таблиця стилів для сайту;
main.css – таблиця стилів для системи управління.
Наведемо схему головного меню системи управління (рисунок 3.1).
Рисунок 3.1 – Схема головного меню системи управління
3.2 Розробка програмних модулів
Опишемо функції програмних класів, які містяться в модулях тестової системи.
Файл cl_administrators.php містить наступні функції:
SelectData($table_names, $cond_names, $limit_from, $limit_count) – відповідає за вибірку інформації про адміністраторів, має параметри: назва таблиці, умова вибору даних, позиція з якої вибирати та кількість записів;
DeleteData($table_names, $list) – призначена для видалення даних про адміністраторів, має параметри: назва таблиці, масив номерів записів;
InsertData($table_names, $list_values) – відповідає за додавання записів, має параметри: назва таблиці, значення полів відповідно;
Updatedata($table_names, $list_values, $cond_names) – призначена для редагування записів про адміністраторів, має параметри: назва таблиці, значення полів, умова редагування;
Showdata($limit_from, $limit_count, $query_string) – відповідає за відображення інформації про адміністраторів, має параметри: позиція з якої показувати записи, кількість записів, рядок запиту.
Файл cl_users.php містить наступні функції:
SelectData($table_names, $cond_names, $limit_from, $limit_count) – відповідає за вибірку інформації про зареєстрованих користувачів, має параметри: назва таблиці, умова вибору даних, позиція з якої вибирати дані та кількість записів;
DeleteData($table_names, $list) – призначена для видалення даних про користувачів, має параметри: назва таблиці, масив номерів записів;
InsertData($table_names, $list_values) – відповідає за додавання записів, має параметри: назва таблиці, значення полів відповідно;
Updatedata($table_names, $list_values, $cond_names) – призначена для редагування записів про користувачів, має параметри: назва таблиці, значення полів, умова редагування;
Showdata($limit_from, $limit_count, $query_string) – відповідає за відображення інформації про зареєстрованих користувачів, має параметри: позиція з якої показувати записи, кількість записів, рядок запиту.
Файл cl_autorize.php містить наступні функції:
authorize() – не має параметрів, призначена для авторизації зареєстрованих користувачів.
Файл cl_test.php містить наступні функції:
FileRead($file) – призначена для читання з файлу, має параметр – шлях до файлу;
SelectAllId() – не має параметрів, призначена для вибірки номерів записів всіх питань;
SelectAllIdL() – не має параметрів, призначена для вибірки номерів записів легких запитань;
SelectAllIdM() – не має параметрів, призначена для вибірки номерів записів середніх по складності запитань;
SelectAllIdC()– не має параметрів, призначена для вибірки номерів записів тяжких по важкості запитань;
ForRead() – не має параметрів, повертає кількість питань, яку потрібно показати за сеанс;
SelectPoint($perem1, $perem2) – відповідає за вибірку кількості балів за відповідь, має параметри: номер питання, номер варіанта відповіді;
Calculation($perem1, $perem2) – призначена для підрахунку кількості балів за відповідь, має параметри: вага варіанта відповіді, кількість відображених запитань відповідно;
ShowSuperRatingMain() – призначена для відображення рейтингу лідерів на головній сторінці;
ShowRatingMain() – призначена для відображення рейтингу інших учасників на головній сторінці;
ShowSuperRating() – призначена для відображення рейтингу лідерів на інших сторінках тестової системи;
ShowRating() – призначена для відображення рейтингу учасників;
SaveRating($id, $mark, $date, $time) – відповідає за збереження рейтингу учасників, має параметри: код учасника, бал, дата, час;
CountRating() – не має параметрів, призначена для підрахунку записів в рейтингу;
ShowTest($perem) – відповідає за відображення запитань і відповідей, має параметр – код запитання.
Програмний код файлу cl_test.php наведено в додатку А.
Файл cl_authorization.php містить функцію authorization_check. Її синтаксис наступний: authorization_check($users,$password). Ця функція призначена для авторизації адміністраторів в систему управління, має параметри: логін і пароль.
Файл kcaptcha.php містить наступні функції:
KCAPTCHA() – призначена для генерування кодового слова від автоматичного відправлення повідомлень;
getKeyString() – призначена для відображення згенерованого кодового слова.
3.3 Інструкція користувача
Для початку розпишемо інструкцію встановлення та налаштування тестової системи.
По-перше, весь каталог, де розміщується веб-додаток, копіюємо в потрібний каталог на веб-сервері, наприклад папка “testing”. Далі створюємо базу даних, через sql-запити, або ж через менеджер БД phpmyadmin. Після створення бази даних необхідно експортувати таблиці із zip архіву “DB/testing.sql” для того, щоб не набирати їх вручну. Далі потрібно налаштувати параметри доступу до БД. Для цього необхідно відкрити файл “config/config.php” і задати наступні параметри: тип БД (mysql), ім’я хоста (localhost), ім’я користувача (root), пароль (якщо є), назву БД, префікс БД (якщо потрібно).
Далі перейдемо до інструкції експлуатації програмного продукту.
Для користувачів та адміністраторів розроблені різні сторінки доступу. Користувачу при завантажені веб-додатку доступна головна сторінка тестування, з якої він починає роботу.
Програмний код головної сторінки наведено в додатку Б.
Користувач може пройти тестування і дізнатись професійну придатність програміста. Тестування починається після натиснення кнопки “розпочати тестування”, зображеної на рисунку 3.2.
Рисунок 3.2 – Початок тестування
Після натиснення кнопки, користувач розпочинає тестування. Відповідаючи на запитання, користувач повинен вибрати один із запропонованих варіантів відповіді, клацаючи по цьому варіанті. Час для проходження тесту необмежений, а таймер призначений просто для відображення пройденого часу.
Програмний код сторінки тестування наведено в додатку В.
Рисунок 3.3 – Результат тестування
Після того, як користувач дав відповіді на всі запитання (їх кількість задається в системі управління), він бачить результат. Приклад результату зображений на рисунку 3.3.
Рисунок 3.4 – Форма реєстрації
Далі, якщо користувач хоче зберегти свій результат, йому потрібно зареєструватись (рисунок 3.4). Якщо користувач вже зареєстрований, то йому необхідно авторизуватись (рисунок 3.5).
Рисунок 3.5 – Форма авторизації
Якщо виникне ситуація, коли користувач забуде свій пароль, то він може скористуватись формою для нагадування пароля, що зображена на рисунку 3.6.
Новий пароль надійде користувачу на вказаний при реєстрації email.
Рисунок 3.6 – Форма нагадування паролю
Також користувач може відправити результат свого тестування другу, заповнивши необхідні дані (рисунок 3.7).
Рисунок 3.7 – Форма для відправки даних другу
Далі розпишемо інструкцію для адміністратора.
Для початку роботи адміністратор має авторизуватись. Для цього необхідно ввести логін та пароль в форму, подану на рисунку 3.8. Форма авторизації знаходиться на сторінці системи управління. Доступ до системи управління наступний, логин – developer, пароль – developer.
Рисунок 3.8 – Форма для авторизації адміністраторів
Для керування зареєстрованими користувачами необхідно скористуватись пунктом меню “Пользователи сайта”, розташованим в верхній панелі (рисунок 3.9).
Рисунок 3.9 – Керування користувачами
В даному пункті меню можна переглядати інформацію про користувачів, а також керувати ними (рисунок 3.10).
Рисунок 3.10 – Панель керування користувачами
Для керування тестовою системою необхідно обрати пункт меню “Тесты”. В цьому пункті можна додавати/видаляти/редагувати запитання і відповіді, переглядати інформацію про запитання, а також керувати ними (рисунок 3.11).
Рисунок 3.11 – Панель керування запитаннями
Для додавання/редагування запитань можна скористатись формою зображеною на рисунку 3.12.
Рисунок 3.12 – Редагування запитання
При додаванні запитання потрібно ввести текст запитання, по необхідності можна задати картинку до тесту, а також додати варіанти відповіді та рівень складності запитання. Але потрібно пам’ятати, що правильний варіант відповіді для запитання має бути один.
Для налаштування тестування необхідно скористатись пунктом меню “настройки”, розташованим в верхньому меню. В даному пункті меню задаються наступні параметри: кількість запитань, які показувати за сеанс, кількість лідерів та інших учасників в рейтингу. Дана форма зображена на рисунку 3.13.
Рисунок 3.13 – Налаштування запитань
3.4 Вимоги до технічних засобів
Вимоги до технічних засобів можна поділити на такі категорії:
а) вимоги до програмного забезпечення сервера:
повинен бути встановлений та налаштований сервер Apache;
повинен бути встановлений PHP 4.1.0 або вище;
підтримка сесій;
MySQL 3.23.32 або вище;
б) вимоги до апаратного забезпечення сервера:
під’єднання до локальної мережі чи мережі Internet;
обсяг оперативної пам'яті від 256 MB;
процесор не нижче Pentium III;
вільне місце на жорсткому диску для зберігання проекту (приблизно 7 MB);
вільне місце на жорсткому диску для зберігання бази даних;
в) вимоги до програмного забезпечення клієнта:
наявність веб-браузера;
г) вимоги до апаратного забезпечення клієнта:
під’єднання до локальної мережі чи мережі Internet;
обсяг оперативної пам'яті від 128 MB.
4 Організаційно-економічний розділ
4.1 Розрахунок кошторису витрат на розробку тестової системи визначення професійної придатності програмістів
Основними витратами на розробку тестової системи визначення професійної придатності програмістів є:
основна заробітна плата розробників;
додаткова заробітна плата всіх розробників, які приймали участь в розробці нового технічного рішення;
амортизація обладнання, комп'ютерів та приміщень, які використовувались для розробки нового технічного рішення;
оренда обладнання, устаткування, приміщень, якщо вони були використані в ході здійснення розробки нового технічного рішення;
витрати на силову електроенергію, якщо ця стаття має суттєве значення для розробки нового технічного рішення;
інші витрати.
Основна заробітна плата розробників обчислюється за формулою, грн:
,(4.1)
де М – місячний посадовий оклад конкретного розробника, грн;
Тр – число робочих днів в місяці, приблизно Тр=21–23 дні;
t – кількість днів роботи розробника.
Приймаємо, що кількість робочих днів Тр=22.
Кількість днів роботи над проектом подані у таблиці 4.1.
Таблиця 4.1 – Кількість днів роботи над проектом
Вид роботи | Виконавці | Тривалість роботи програміста, днів | Тривалість роботи керівника, днів |
Отримання, і уточнення завдання | Програміст, керівник | 1 | 1 |
Підбір літератури і пошук інформації | Програміст, керівник | 5 | 5 |
Узгодження з керівником питань щодо реалізації | Програміст, керівник | 5 | 5 |
Розробка програмного продукту | Програміст | 30 | – |
Тестування і налагодження програми | Програміст, керівник | 10 | 10 |
Написання звіту та документації | Програміст | 14 | – |
Розробка презентації програмного продукту | Програміст | 1 | – |
Далі розрахуємо заробітну плату кожному із учасників проекту, згідно із кількістю їх робочих днів.
Керівник проекту:
(грн)
Програміст:
(грн)
Розрахунки по нарахуванню заробітної плати учасникам проекту наведені у таблиці 4.2.
Таблиця 4.2 – Нарахування заробітної плати учасникам проекту
Найменування посади | Місячний посадовий оклад, грн. | Оплата за робочий день, грн. | Число днів роботи | Витрати на заробітну плату, грн. |
Керівник | 3200 | 145,45 | 21 | 3054,55 |
Програміст | 2700 | 122,72 | 66 | 8100 |
Всього | 11154,55 |
Далі обчислимо додаткову заробітну плата всіх розробників, які приймали участь в розробці нового технічного рішення.
Приймаємо додаткову заробітну плату у розмірі 15% від основної заробітної плати всіх розробників, грн:
(4.2)
Отже,
(грн)
Нарахування на заробітну плату розробників, які приймали участь в розробці нового технічного рішення.
Так, як робота виконувалась в нормальних умовах, то додаткову заробітну плату приймаємо у розмірі 37,5% від основної заробітної плати всіх розробників, грн:
(4.3)
Отже,
(грн)
Для розробки програмного продукту протягом одного кварталу використовувались необхідні технічні та додаткові засоби.
В спрощеному вигляді амортизаційні відрахування по кожному виду обладнання розраховані за формулою, грн:
,(4.4)
де Ц – балансова вартість обладнання, приміщень, грн;
На – квартальна норма амортизаційних відрахувань для даного виду обладнання, приміщень, %;
Розрахуємо величину амортизаційних відрахувань:
для комп’ютера:
(грн)
для принтера:
(грн)
для офісних меблів:
(грн)
Зроблені розрахунки подані в таблиці 4.3.
Таблиця 4.3 – Розрахунок амортизаційних відрахувань
Найменування обладнання, приміщень | Балансова вартість, грн. | Квартальна норма амортизації, % | Термін використання, квартал | Величина амортизаційних відрахувань, грн. |
Комп’ютер Asus F5SL | 4400 | 15 | 1 | 660 |
Принтер Xerox PE1141616e | 400 | 15 | 1 | 60 |
Офісні меблі | 2500 | 10 | 1 | 250 |
Всього | 970 |
Для забезпечення нормальних умов праці було орендоване приміщення. Витрати на оренду приміщення розраховані за формулою, грн:
,(4.5)
де Ц – балансова вартість даного виду приміщень, грн;
Но – квартальна ставка орендної плати для даного виду приміщень, %.
Отже,
(грн)
Зроблені розрахунки подані в таблиці 4.4.
Таблиця 4.4 – Розрахунок орендної плати
Найменування обладнання, приміщень | Балансова вартість, грн. | Квартальна ставка орендної плати, % | Термін використання, міс. | Сума орендної плати, грн. |
Приміщення | 130000 | 2 | 3 | 2600 |
Всього | 2600 |
Інші витрати охоплюють:
загальновиробничі витрати (витрати на управління, оплата службових відряджень, витрати на утримання, ремонт та експлуатацію основних засобів, витрати на опалення, освітлення, водопостачання);
адміністративні витрати (проведення зборів, оплата консультацій та аудиторcьких послуг, витрати на зв’язок);
та інші операційні витрати (штрафи, матеріальна допомога).
Виходячи з перелічених вище витрат було вирішено прийняти інші витрати у розмірі 200% від суми витрат на заробітну плату, грн:
(4.6)
Отже,
(грн)
Сума всіх статей витрат та загальна сума дають загальні витрати на розробку нового технічного рішення, грн:
(4.7)
Отже,
(грн)
Враховуючи рентабельність у розмірі 25%, вартість розробки тестової системи визначення професійної придатності програмістів становитиме:
(грн)
Ціну продажу було вирішено прийняти 58000 грн.
4.2 Розрахунок експлуатаційних витрат тестової системи визначення професійної придатності програмістів
Заробітна плата персоналу, розраховується за формулою, грн/рік:
,(4.8)
де 12 – число місяців;
М – місячний посадовий оклад інженерно-технічного працівника, грн;
– частка часу, який витрачає працівник на обслуговування тестової системи визначення професійної придатності програмістів, приймаємо 0,6.
Отже,
(грн/рік)
Додаткова заробітна плата. Приймаємо додаткову заробітну плату у розмірі 15% від основної заробітної плати всіх розробників, грн:
(4.9)
Отже,
(грн)
Нарахування на заробітну плату працівників.
Так, як робота виконувалась в нормальних умовах, то додаткову заробітну плату приймаємо у розмірі 37,5% від основної заробітної плати всіх розробників, грн:
(4.10)
Отже,
(грн)
Амортизаційні відрахування для програмного продукту.
В спрощеному вигляді амортизаційні відрахування для нематеріального активу розраховуються за формулою, грн/рік:
,(4.11)
де Ц – балансова вартість нематеріального активу, за яку можна умовно прийняти вартість робіт зі створення тестової системи, грн;
На – річна норма амортизації нематеріального активу, яку можна прийняти На=25%.
Отже,
(грн/рік)
Інші витрати можна прийняти як 10% від загальної суми усіх попередніх витрат, грн:
(4.12)
Отже,
(грн)
Сума витрат за всіма статтями дає величину експлуатаційних витрат при використанні нового програмного продукту, грн/рік:
(4.13)
Отже,
(грн/рік)
Суми всіх статей витрат та загальна сума представленні у вигляді таблиці 4.6.
Таблиця 4.6 – Загальні експлуатаційні витрати нового програмного продукту
Назва витрат | Сума, грн. |
Основна заробітна плата працівників | 14400 |
Додаткова заробітна плата | 2160 |
Нарахування на заробітну плату | 7560 |
Амортизація обладнання | 11599,04 |
Інші витрати | 25275,90 |
Всього | 60994,94 |
Приймемо загальні експлуатаційні витрати при використанні тестової системи для визначення професійної придатності програмістів в розмірі 61000 грн.
Розрахуємо експлуатаційні витрати при використанні вже існуючих програмних продуктів.
Частку часу, який витрачає працівник на роботу з програмним забезпеченням, приймаємо 0,9. Заробітна плата працівників:
(грн)
Додаткова заробітна плата:
(грн)
Нарахування на заробітну плату працівників.
Так, як робота виконувалась в нормальних умовах, то додаткову заробітну плату приймаємо у розмірі 37,5% від основної заробітної плати всіх розробників, грн:
(4.14)
Отже,
(грн)
Балансова вартість нематеріального активу, за яку можна умовно прийняти вартість існуючих програмних продуктів становить 10000 грн, річна норма амортизації нематеріального активу – 25%.
Амортизаційні відрахування для існуючих програмних продуктів:
(грн/рік)
Інші витрати:
(грн)
Сума витрат за всіма статтями дає величину експлуатаційних витрат при використанні існуючих програмних продуктів, грн:
(4.15)
Отже,
(грн/рік)
Суми всіх статей витрат та загальна сума представленні у вигляді таблиці 4.7.
Таблиця 4.7 – Загальні експлуатаційні витрати існуючих програмних продуктів
Назва витрат | Сума, грн. |
Основна заробітна плата працівників | 21600 |
Додаткова заробітна плата | 2592 |
Нарахування на заробітну плату | 22572 |
Амортизація обладнання | 2500 |
Інші витрати | 47014 |
Всього | 96278 |
Приймемо загальні експлуатаційні витрати при використанні існуючих програмних продуктів в розмірі 97000 грн.
4.3 Розрахунок умовного обсягу робіт
Умовні обсяги робіт Р розраховуються за формулами, умов.од.:
та ,(4.16)
де Q1 – умовний обсяг робіт при застосуванні існуючого програмного продукту (або без його використання), умов.од.;
Q2 – умовний обсяг робіт при застосуванні нової тестової системи, умов.од.;
F – ефективний фонд часу роботи за рік (для однозмінної роботи F=1700...1800 годин, для двозмінної роботи Р=3500...3600 годин);
– частка часу, який витрачає користувач на виконання конкретних робіт з застосуванням даного програмного продукту в загальному часі своєї роботи, приймаємо 0,6;
t1 та t2 – середній час тестування користувача, хвилин, t1 приймаємо 10, t2 – 5.
Отже,
(умов.од./рік)
(умов.од./рік)
Тобто, впровадження нового програмного продукту підвищує продуктивність при виконанні певної роботи в 12960/6480=2 рази.
4.4 Розрахунок річного економічного ефекту від впровадження нової системи
Річний економічний ефект від впровадження нового програмного продукту розраховується за формулою, грн/рік:
,(4.17)
де Е1 – експлуатаційні витрати при використанні існуючого програмного продукту (або без його використання взагалі), грн/рік;
Е2 – експлуатаційні витрати при використанні нового програмного продукту, грн/рік;
Q1 – умовний обсяг роботи, що виконується за рік при використанні існуючого програмного продукту або без його використання взагалі, умов.од.;
Q2 – умовний обсяг роботи, який виконується за рік при застосуванні нового програмного продукту, умов.од.
(грн/рік)
Розрахунок терміну окупності витрат, які були використані на розробку нового програмного продукту за формулою, років:
(4.18)
Тому,
(років)
Отже, беручи до уваги всі показники та розрахунки можна стверджувати, що розроблена тестова система визначення професійної придатності програмістів буде мати кращі експлуатаційні та реалізаційні показники, ніж існуючі аналоги.
Розробка та впровадження тестової системи визначення професійної придатності програмістів є актуальною та доцільною, так як є більш ефективною в порівнянні з існуючим паперовим документообігом.
5 Охорона праці та техніка безпеки
5.1 Застосування професійного відбору в охороні праці
В сучасних умовах безпека праці, надійність та продуктивність технічних систем залежать від професійного добору працівників на підприємствах різних форм власності. Здійснення такого добору передбачено ст. 18 Закону “Про охорону праці” і спрямовано на реалізацію одного з найважливіших принципів державної політики в галузі охорони праці – приоритету життя та здоров’я людей щодо результатів виробничої діяльності.
На виконання даного закону наказом Міністерства охорони здоров’я й Держнаглядохоронпраці від 23 вересня 1994 р. № 263/121 затверджено Перелік робіт, для яких є необхідним професійний добір. У ньому зазначені види робіт та психофізіологічні показники для професійного добору. Таким чином, нині існує певна законодавча і правова база для проведення професійного добору працівників на підприємствах.
Професійний добір – одна з найважливіших складових комплексу профілактичних заходів щодо забезпечення безпеки праці, який включає також контроль за проектуванням нових технологій та виробничого устаткування, застосування раціональних режимів праці й відпочинку і засобів індивідуального захисту, ефективне медичне обслуговування, зниження можливих економічних втрат у зв’язку з травматизмом та профзахворюваністю. Значення цих заходів тепер зростає у зв’язку з впровадженням соціального страхування від нещасних випадків і профзахворювань. Тому для широкого введення профдобору на підприємствах необхідні наукове обґрунтування та детальна розробка механізму реалізації його у вигляді заходів.
Основу психофізіологічного професійного добору становить забезпечення адекватності вимог, які висувають фактори умов праці, психофізіологічним можливостям людини. Тому він повинен супроводжуватися попередніми (під час приймання на роботу) й періодичними (в процесі трудової діяльності) медичними оглядами.
Визначаючи професійну придатність, слід враховувати наявність таких відповідних потенційних, професійно значущих властивостей:
індивідуальних особливостей людини для можливості виконання конкретного виду трудової діяльності, тобто відповідності її фізичних та психологічних якостей характеру майбутньої праці;
відповідності рівня підготовки і професійного досвіду вирішуваним виробничим завданням;
стійкості установки на виконання даного виду робіт (заінтересованості, почуття обов’язку тощо).
Виходячи з характеру вимог (особливостей трудового процесу, факторів небезпеки, нервових та фізичних навантажень, шкідливих факторів виробничого середовища), які постають перед людиною в умовах виробництва, професійний добір може ставити за мету піднесення успішності професійної діяльності та освоєння професії, а також профілактику нещасних випадків і професійних захворювань, забезпечення безпеки праці.
Створення системи професійного добору для широкого впровадження на промислових підприємствах (рисунок 5.1) має передбачати вирішення найважливіших завдань у межах як усієї країни, так і окремого підприємства.
Основними напрямами профдобору є:
підвищення успішності професійної діяльності;
профілактика травматизму;
профілактика профзахворювань.
Система професійного добору працівників у межах п
Рисунок 5.1 – Система професійного добору працівників
Організація кабінетів профдобору на підприємствах дасть можливість ефективніше використовувати вже відомі і нові підходи до профілактики профзахворювань і може бути одним з елементів реформування системи медико-санітарного обслуговування працівників на промислових підприємствах. Так, рівень специфічної адаптації до впливу тих чи інших шкідливих факторів, який визначається під час періодичного професійного огляду із застосуванням даних засобів, можна використати як об’єктивний критерій допустимих строків роботи у шкідливих умовах. Це дасть можливість з метою запобігання профзахворюванню і забезпечення безпеки праці обґрунтовано переводити робітників на робочі місця, не пов’язані з впливом шкідливих чинників. Крім того, використання інформації про функціональну надійність організму за індивідуального аналізу травматизму дасть можливість установити справжню причину підвищеного травматизму працівників. Ця причина може бути зумовлена погіршенням стану професійно важливих функцій організму у зв’язку з тривалим впливом небезпечних і шкідливих факторів виробництва.
Відомості про рівень специфічної адаптації організму можуть бути використані також як об’єктивний критерій тривалості трудового контракту роботи в шкідливих умовах (при впровадженні контрактної системи приймання на роботу), що стане дійовим фактором поліпшення умов праці на робочих місцях та використання засобів індивідуального захисту.
Крім того, показники стану індивідуальної чутливості та рівня специфічної адаптації можуть бути використані під час розслідування профзахворювань на підприємстві, особливо в разі їх раннього розвитку або під час роботи в умовах допустимих рівнів шкідливих факторів. Це дасть можливість мати об’єктивні дані про підвищену індивідуальну схильність до розвитку профзахворювань, а не тільки передбачати її наявність [19].
5.2 Обов’язки служби охорони праці
Згідно з Законом України „Про охорону праці” служба охорони праці створюється власником або уповноваженим ним органом на підприємствах, в установках, організаціях незалежно від форм власності та видів їх діяльності для організації виконання правових, організаційно-технічних, санітарно-гігієнічних, соціально-економічних і лікувально-профілактичних заходів спрямованих на запобігання нещасним випадкам, професійним захворюванням і аваріям в процесі праці.
Служба охорони праці вирішує завдання:
забезпечення безпеки виробничих процесів, устаткування, будівель і споруд;
забезпечення працівників засобами індивідуального та колективного захисту;
професійної підготовки і підвищення кваліфікації працівників з питань охорони праці, пропаганди безпечних методів праці;
вибору оптимальних режимів праці і відпочинку працівників;
професійного добору виконавців для визначених видів робіт.
Служба охорони праці входить до структури підприємства, установи, організації, як одна з основних виробничо-технічних служб.
Ліквідація служби охорони праці допускається тільки в разі ліквідації самого підприємства.
Служба охорони праці в залежності від чисельності працюючих може функціонувати як самостійний структурний підрозділ або у вигляді групи спеціалістів чи одного спеціаліста, у тому числі за сумісництвом.
Служба охорони праці комплектуються спеціалістами, які мають вищу освіту та стаж роботи за профілем виробництва не менше 3 років. Спеціалісти з середньою спеціальною освітою приймаються в службу охорони праці у виняткових випадках. Обмеження не стосується: осіб, які мають спеціальну освіту з охорони праці та осіб, які прийняті на посаду до затвердження Типового положення.
Перевірка знань з питань охорони праці працівників служби охорони праці проводиться в установленому порядку до початку виконання ними своїх функціональних обов’язків та періодично, один раз на три роки.
На підставі цього Типового положення з урахуванням специфіки виробництва опрацьовуються та затверджуються власниками Положення про службу охорони праці підприємств, установ та організацій.
Положення про службу охорони праці міністерства, державного комітету концерну, корпорації та іншого об’єднання підприємств, створених за галузевим принципом, узгоджується з Державним комітетом по нагляду за охороною праці.
Працівники служби охорони праці у своїй діяльності керуються законодавством про працю, міжгалузевими і галузевими нормативними актами з охорони праці і Положенням про службу охорони праці.
Працівники служби охорони праці мають право видавати керівникам установ, підприємств, організацій та їх структурних підрозділів обов’язкові для виконання приписи щодо усунення наявних недоліків.
Припис спеціаліста з охорони праці, у тому числі про зупинення робіт, може скасувати в письмовій формі лише посадова особа, якій підпорядкована служба охорони праці.
Працівники служби охорони праці не можуть бути притягнуті до виконання функцій, не передбачених Законом „Про охорону праці” та Типовим положенням.
Служба охорони праці створюється на підприємствах, у виробничих і науково-виробничих об’єднаннях, корпоративних, колективних та інших організаціях виробничої сфери з числом працюючих 50 і більше чоловік.
В інших випадках функції цієї служби можуть виконувати в порядку сумісництва особи, які пройшли перевірку знань з охорони праці.
В установах, організаціях невиробничої сфери та в навчальних закладах власниками також створюються служби охорони праці.
Служба охорони праці підпорядковується керівникові підприємства.
За своїм посадовим становищем та умови оплати праці керівник служби охорони праці прирівнюється до керівників основних виробничо-технічних служб підприємства.
Такий принцип зберігається при визначенні посадового становища та окладів і інших працівників служби охорони праці.
Служба охорони праці виконує такі основні функції:
опрацьовує ефективну цілісну систему управління охороною праці, сприяє удосконаленню діяльності у цьому напрямку кожного структурного підрозділу і кожної посадової особи;
складає разом зі структурними підрозділами підприємства комплексні заходи щодо досягнення встановлених нормативів безпеки, гігієни праці та виробничого середовища (підвищення існуючого рівня охорони праці, якщо встановлені норми досягнуті), а також розділ „Охорона праці” у колективному договорі, проводить для працівників увідний інструктаж з питань охорони праці, організовує:
забезпечення працівників правилами, нормами, положеннями, інструкціями та іншими нормативними актами з охорони праці;
паспортизацію цехів, дільниць, робочих місць щодо відповідності їх вимогам охорони праці;
облік, аналіз нещасних випадків, професійних захворювань і аварій, а також шкоди від цих подій;
розробку перспективних та поточних планів роботи підприємства щодо створення безпечних та нешкідливих умов праці;
роботу методичного кабінету охорони праці, пропаганду безпечних та нешкідливих умов праці шляхом проведення консультацій, оглядів, конкурсів, бесід, лекцій, розповсюдження засобів наочної агітації, оформлення інформаційних стендів тощо;
допомогу комісії з питань охорони праці підприємства спрацюванні необхідних матеріалів та реалізації її рекомендацій;
підвищення кваліфікації і перевірку знань посадових осіб з питань охорони праці.
Служба охорони праці бере участь у:
розслідуванні нещасних випадків та аварій;
формуванні фонду охорони праці підприємства;
роботі комісії з питань охорони праці підприємства;
роботі комісії по введенню в дію закінчених будівництвом, реконструкцією або технічним переозброєнням об’єктів виробничого та соціального призначення;
розробці положень, інструкцій, інших нормативних актів про охорону праці, що діють в межах підприємства;
роботі постійно діючої комісії з питань атестації робочих місць за умовами праці.
Служба охорони праці:
сприяє впровадженню у виробництво досягнень науки і техніки у тому числі ергономіки і прогресивних технологій, сучасних засобів колективного та індивідуального захисту працюючих, захисту населення і навколишнього середовища;
розглядає заяви та скарги працюючих з питань охорони праці;
надає методичну допомогу керівникам структурних підрозділів підприємства у розробці заходів з питань охорони праці;
готує проекти наказів та розпоряджень з питань охорони праці, загальних для всього підприємства;
розглядає факти наявності виробничих ситуацій, небезпечних для життя чи здоров’я працівників або людей, які їх оточують, і навколишнього природного середовища, у випадку відмови з цих причин працівників від виконання дорученої їм роботи.
Служба охорони праці контролює:
дотримання чинного законодавства, міжгалузевих, галузевих та інших нормативних актів, виконання працівниками посадових інструкцій з питань охорони праці;
виконання приписів органів державного нагляду, пропозицій та подань уповноважених трудових колективів і профспілок з питань охорони праці, використання за призначенням коштів фонду охорони праці;
відповідність нормативним актам про охорону праці машин, механізмів, устаткування, транспортних засобів, технологічних процесів, засобів проти аварійного, колективного та індивідуального захисту працюючих; наявність технологічної документації на робочих місцях;
своєчасне проведення навчання та інструктажів працюючих, атестації та переатестації з питань безпеки праці посадових осіб та осіб, які виконують роботи підвищеної небезпеки, а також дотримання вимог безпеки при виконанні цих робіт;
забезпечення працюючих засобами індивідуального захисту, лікувально-профілактичним харчуванням, молоком або рівноцінними харчовими продуктами, миючими засобами, санітарно-побутовими приміщеннями; організацію питного режиму, надання працівникам передбачених законодавством пільг і компенсацій, пов’язаних з важкими та шкідливими умовами праці;
використання праці неповнолітніх, жінок та інвалідів згідно з діючим законодавством;
проходження попереднього (при прийнятті на роботу) і періодичних (протягом трудової діяльності) медичних оглядів працівників, зайнятих на важких роботах та роботах із шкідливими чи небезпечними умовами праці або таких, де є необхідність у професійному доборі;
виконання заходів, наказів, розпоряджень з питань охорони праці, а також заходів щодо усунення причин нещасних випадків і аварій, які визначені у актах розслідування;
здійснює зв’язок з медичними закладами, з науковими та іншими організаціями з питань охорони праці.
Спеціалісти служби охорони праці мають право:
представляти підприємство в державних та громадських установах при розгляді питань охорони праці;
безперешкодно в будь-який час відвідувати виробничі об’єкти, структурні підрозділи підприємства, зупиняти роботу виробництв, дільниць, машин, механізмів, устаткування та інших засобів виробництва у разі порушень, які створюють загрозу життю або здоров’ю працівників;
одержувати від посадових осіб необхідні відомості, документи і пояснення (письмово чи усно) з питань охорони праці;
перевіряти стан безпеки, гігієни праці та виробничого середовища на об’єктах підприємства, видавати керівникам перевіреного об’єкту, цеху, виробництва обов’язків для виконання припис;
вимагати від посадових осіб відсторонення від роботи працівників, які не пройшли медичного огляду, навчання, інструктажу, перевірки знань з охорони праці, не мають допуску до відповідних робіт або порушають нормативні акти про охорону праці;
надсилати керівникові підприємства подання про притягнення до відповідальності працівників, які порушують вимоги щодо охорони праці;
порушувати клопотання про заохочення працівників, котрі беруть активну участь у підвищенні та поліпшенні умов праці.
Працівники служби охорони праці підприємств, об’єднань, міністерств, інших центральних та місцевих органів державної виконавчої влади несуть персональну відповідальність за:
невідповідність прийнятих ними рішень вимогам діючого законодавства з охорони праці;
невиконання своїх функціональних обов’язків, передбачених Положенням про службу охорони праці та посадовими інструкціями;
недостовірність та несвоєчасність підготовки статистичних звітів з охорони праці;
низьку якість проведеного ними розслідування нещасних випадків на виробництві.
Структура служби охорони праці. На підприємствах, в установах, організаціях служби охорони праці повинні комплектуватися, як правило, спеціалістами такого профілю:
інженерами відповідної спеціальності;
фахівцями з питань гігієни праці;
юристами, котрі спеціалізуються на питаннях законодавства про охорону праці.
На підприємствах виробничої сфери при кількості працюючих до 50 чоловік (невиробничої сфери – до 100 чоловік) функції цієї служби можуть виконувати особи з відповідною професійною підготовкою за сумісництвом.
Якщо на підприємстві немає спеціалістів відповідної кваліфікації, то використовуються послуги асоціації спеціалістів з охорони праці.
Підприємство, яке не має можливості утримувати в службі охорони праці спеціалістів з гігієни праці та не має своєї лабораторії, використовує послуги місцевих санітарно-епідеміологічних станцій на договірних засадах.
При відсутності на підприємстві юридичної служби використовуються спеціалісти юридичної служби іншого підприємства чи послуги юридичних консультацій (за договором).
Чисельність служби охорони праці. На підприємствах (у виробничих або науково-виробничих об’єднаннях) при чисельності працюючих від 51 до 500 чоловік включно (невиробнича сфера – від 101 до 500) таку службу повинен представляти один спеціаліст з охорони праці з інженерно-технічною освітою.
На підприємствах, де використовуються вибухові матеріали або сильнодіючі отруйні речовини, в такій службі повинно бути два спеціаліста.
При наявності на підприємстві інституту заступників керівника підприємства керівник служби охорони праці, незалежно від чисельності працюючих, повинен призначатися на посаду заступника керівника підприємства (заступника генерального директора, директора тощо – в залежності від структури підприємства).
Розрахунок чисельності працівників служби охорони праці в залежності від небезпечності і шкідливості виробництва на підприємствах з числом працюючих більше 500 чоловік здійснюється за формулою:
(5.1)
де – чисельний склад служби охорони праці на підприємстві;
– середньоспискова чисельність працюючих на підприємстві;
– ефективний річний фонд робочого часу спеціаліста з охорони праці, що дорівнює 1200 годин, який враховує втрати робочого часу на можливі хвороби, відпустку тощо;
– коефіцієнт, що враховує шкідливість виробництва.
(5.2)
де – чисельність працюючих з шкідливими речовинами незалежно від рівня їх концентрації;
– чисельність працюючих на роботах підвищеної небезпеки, що підлягають щорічній атестації з охорони праці.
максимально може дорівнювати трьом в разі, коли всі робітники працюють з шкідливими речовинами і всі вони підлягають щорічній атестації з питань охорони праці, тобто
[20].
5.3 Розрахунок площі природного освітлення для приміщення з ЕОМ
Розрахунок природного освітлення приміщення полягає у визначенні площі світлових прорізів, необхідної для освітлення приміщення.
Відомі: вид бокового освітлення – одностороннє; орієнтація вікон – 90о; довжина =6 м та глибина (ширина) приміщення =12 м; висота від рівня умовної робочої поверхні до верха вікна =3.5 м; відстань до протилежного будинку =12 м; висота протилежного будинку =3 м; вид світлопропускаючого матеріалу – скло листове подвійне; вид віконної рами промислової будівлі – дерев’яна спарена.
Потрібно: визначити площу віконних прорізів, необхідну для освітлення приміщення з ЕОМ відповідно до вимог діючих нормативних документів.
Розрахунок.
Визначимо значення нормованого коефіцієнта природної освітленості (КПО) для виконуваної зорової роботи за формулою:
(5.3)
де – табличне значення нормованого КПО;
– коефіцієнт світлового клімату.
, , .
Виберемо табличне значення коефіцієнта запасу Кз при вертикальному розташуванні світлопропускного матеріалу згідно варіанту: .
Визначимо значення світлової характеристики вікон .
Спочатку визначимо відношення довжини приміщення до його глибини (ширини):
(м)
Далі визначимо відношення глибини приміщення до його висоти від рівня умовної робочої поверхні до верху вікна :
(м)
Далі згідно варіанту та розрахованих даних виберемо табличне значення світлової характеристики вікон при бічному освітленні: .
Визначимо значення коефіцієнта , що враховує затінення вікон будинками, що стоять навпроти.
Спочатку визначимо відношення відстані між будинками до висоти протилежного будинку:
(м)
Далі згідно варіанту та розрахованих даних виберемо табличне значення , що враховує затінення вікон будинками, що стоять навпроти: .
Розрахуємо площу приміщення за формулою:
(5.4)
де – довжина зовнішньої стіни приміщення.
(м)
Розрахуємо загальний коефіцієнт світло пропускання за формулою:
(5.5)
де – коефіцієнт світлопропускання матеріалу, ;
– коефіцієнт, який враховує втрати світла в рамах світлового прорізу, який визначається за таблицею, ;
– коефіцієнт, який враховує втрати світла в несучих конструкціях (при боковому освітленні );
– коефіцієнт, який враховує втрати світла в сонцезахисних пристроях і визначається за таблицею, ;
– коефіцієнт, який враховує втрати світла в захисній сітці, яка встановлюється під ліхтарями (при боковому освітленні ).
Визначимо значення коефіцієнта , який враховує підвищення КПО при боковому освітленні завдяки світлу, яке відбивається від поверхонь приміщення та підстилаючого шару, прилеглого до будинку і який приймається за таблицею.
Для визначення обчислимо:
відношення довжини приміщення до його глибини
(м);
відношення глибини приміщення до висоти від рівня умовної робочої поверхні до верху вікна
(м);
відношення відстані від вікна до розрахункової точки до глибини приміщення , при односторонньому боковому освітленні
(м), отже, ;
середньозважений коефіцієнт відбиття світла від стелі, стін та підлоги:
(5.6)
де , , – площі стелі, стін, підлоги відповідно (враховують лише площу тих стін які відбивають світло);
, , – коефіцієнти відбиття світла від стелі, стін, підлоги відповідно, коефіцієнти відбиття обираються самостійно, отже, , , .
(м)
(м)
(м)
Отже, (м)
Далі згідно варіанту та розрахованих даних виберемо табличне значення коефіцієнта : .
Обчислимо необхідну (розрахункову) площу світлових прорізів для даного приміщення за формулою:
(5.7)
(м)
Отже, площа природного освітлення для приміщення з ЕОМ із розмірами 6х12х3.5 становить (м).
Висновки
В процесі виконання дипломного проекту була розроблена тестова система визначення професійної придатності програмістів. Розроблена тестова система має спрощену систему управління, написана на мові програмування PHP з використанням JavaScript, а в якості СКБД була використана MySQL.
Тестова система дозволяє користувачу перевірити свої знання і отримати результат по професійній придатності програміста. Кількість балів за запитання залежить від кількості запитань і від ваги запитання. Всі запитання поділені на три рівня складності: легкі, середні і складні запитання. Результат залежить від рівня складності запитання, тому в програмному продукті був реалізований алгоритм, який обирає з бази різні по складності запитання: спочатку користувач відповідає на легкі запитання, потім на середні по складності, а в кінці вибираються складні запитання.
Розроблений програмний продукт має також систему управління, яка дозволяє адміністратору керувати тестовою системою: керувати зареєстрованими користувачами, додавати/видаляти/редагувати запитання і відповіді, завантажувати картинки в проект. Система управління є захищеною, так як існує окрема форма авторизації адміністраторів, паролі шифруються, а при виході з системи інформація з сесії видаляється.
До переваг даного програмного продукту можна віднести те, що серед своїх аналогів цей тест є безкоштовним і кожний бажаючий може його пройти і дізнатись професійну придатність програміста. Також в тестовій системі реалізована можливість відправки результату проходження тестування другу на email.
Перелік посилань
1.Тест [Електронний ресурс] // Вікіпедія – вільна енциклопедія. – URL: http://ru.wikipedia.org/wiki/Тест (дата звернення: 10.03.2010).
2.Flash [Електронний ресурс] // Вікіпедія – вільна енциклопедія. – URL: http://uk.wikipedia.org/wiki/Flash/ (дата звернення: 12.03.2010).
3.Статьи PHP [Электронный ресурс] // Портал “Форум PHP программистов”. – URL: http://php.ru/ (дата обращения: 15.03.2010).
4.Статьи HTML [Электронный ресурс] // Портал “Учебники по HTML”. – URL: http://www.htmlbook.ru/ (дата обращения: 15.03.2010).
5.Веб-сервер [Електронний ресурс] // Вікіпедія – вільна енциклопедія. – URL: http://uk.wikipedia.org/wiki/Веб-сервер/ (дата звернення: 25.03.2010).
6.Статьи Apache [Электронный ресурс] // Портал “Apache.RU”. – URL: http://www.apache.ru/ (дата обращения: 27.03.2010).
7.Система керування базами даних [Електронний ресурс] // Вікіпедія – вільна енциклопедія. – URL: http://uk.wikipedia.org/wiki/Система_керування_базами_даних/ (дата звернення: 05.04.2010).
8.Статьи MySQL [Электронный ресурс] // Портал “MySQL.RU”. – URL: http://www.mysql.ru/ (дата обращения: 07.04.2010).
9.HTML [Електронний ресурс] // Вікіпедія – вільна енциклопедія. – URL: http://uk.wikipedia.org/wiki/HTML/ (дата звернення: 10.04.2010).
10.Мова розмітки даних [Електронний ресурс] // Вікіпедія – вільна енциклопедія. – URL: http://uk.wikipedia.org/wiki/Мова_розмітки_даних/ (дата звернення: 10.04.2010).
11.Гіпертекст [Електронний ресурс] // Вікіпедія – вільна енциклопедія. – URL: http://uk.wikipedia.org/wiki/Гіпертекст/ (дата звернення: 10.04.2010).
12.Гіперпосилання [Електронний ресурс] // Вікіпедія – вільна енциклопедія. – URL: http://uk.wikipedia.org/wiki/Гіперпосилання/ (дата звернення: 10.04.2010).
13.XHTML [Електронний ресурс] // Вікіпедія – вільна енциклопедія. – URL: http://uk.wikipedia.org/wiki/XHTML/ (дата звернення: 10.04.2010).
14.Статьи HTML [Электронный ресурс] // Сайт “HTML справочник”. – URL: http://html.manual.ru/ (дата обращения: 10.04.2010).
15.Статьи CSS [Электронный ресурс] // Сайт “Статьи о CSS”. URL: http://www.webostudio.com/ua/stats/CSS/ (дата обращения: 15.04.2010).
16.Статьи JavaScript [Электронный ресурс] / Сайт “Учебники с примерами скриптов”. – URL: http://javascript.ru/ (дата обращения: 20.04.2010).
17.PHP [Електронний ресурс] // Вікіпедія – вільна енциклопедія. – URL: http://uk.wikipedia.org/wiki/PHP/ (дата звернення: 05.05.2010).
18.Статьи PHP [Электронный ресурс] // Портал “PHP.COM.UA”. – URL: http://www.php.com.ua/ (дата обращения: 05.05.2010).
19.Основи охорони праці [Електронний ресурс] // Сайт “Основи охорони праці”. – URL: http://ubooks.com.ua/books/000192/inx17.php (дата звернення: 02.06.2010).
20.Служба охорони праці на підприємстві [Електронний ресурс] // Сайт рефератів. – URL: http://referatu.net.ua/referats/448/27891/?page=1 (дата звернення: 02.06.2010).
Додаток А
Програмний код модуля Тест (файл cl_test.php)
<?
class cl_test extends cl_db
{
//Деструктор класа, который закрывает соединение с БД
function __destruct()
{
$this->getdriver()->Disconnect();
}
// функция для читания файла
private function FileRead($file)
{
if (file_exists($file))
{
$content = file_get_contents($file);
return $kol = explode(";", $content);
}
/* else
{
echo "<div class='sms_error'>Файл <b>$file</b> не найден</div>";
} */
}
// метод для выборки айдишек всех вопросов
public function SelectAllId()
{
$this->getdriver()->Select('t_question', '', '', '', '', '', '', '');
while ($row = $this->getdriver()->FetchResult())
{
$allid[] = $row["quest_id"];
}
return $allid;
}
// метод для выборки айдишек всех легких вопросов
public function SelectAllIdL()
{
$this->getdriver()->Select('t_question, t_answer', '', 't_question.quest_id=t_answer.ans_question_id and ans_point=1', '', '', '', '', '');
while ($row = $this->getdriver()->FetchResult())
{
$allid[] = $row["quest_id"];
}
return $allid;
}
// метод для выборки айдишек всех средних вопросов
public function SelectAllIdM()
{
$this->getdriver()->Select('t_question, t_answer', '', 't_question.quest_id=t_answer.ans_question_id and ans_point=2', '', '', '', '', '');
while ($row = $this->getdriver()->FetchResult())
{
$allid[] = $row["quest_id"];
}
return $allid;
}
// метод для выборки айдишек всех сложных вопросов
public function SelectAllIdC()
{
$this->getdriver()->Select('t_question, t_answer', '', 't_question.quest_id=t_answer.ans_question_id and ans_point=3', '', '', '', '', '');
while ($row = $this->getdriver()->FetchResult())
{
$allid[] = $row["quest_id"];
}
return $allid;
}
// метод возвращяет количество показуемых вопросов
public function ForRead()
{
return $kol = $this->FileRead('modules/test/test_config.php');
}
public function CountAll()
{
$this->getdriver()->Select('t_question', '', '', '', '', '', '', '');
return $this->getdriver()->Count();
}
//метод для выборки количества баллов за ответ
public function SelectPoint($perem1, $perem2)
{
$id1 = $this->getdriver()->PutContent($perem1);
$id2 = $this->getdriver()->PutContent($perem2);
$this->getdriver()->Select('t_answer', '', 'ans_question_id='.$id1.' and ans_id='.$id2, '', '', '', '', '');
$row = $this->getdriver()->FetchResult();
$point = $this->getdriver()->Strip($row['ans_point']);
return $point;
}
// метод для подсчета баллов
public function Calculation($perem1, $perem2)
{
$id = $this->getdriver()->PutContent($perem1);
$all = $this->getdriver()->PutContent($perem2);
$ball = (170 / (int)$all) + 1;
$ball = round($ball);
if ($id == 1) $ball = round($ball * 0.5);
else if ($id == 2) $ball = round($ball * 0.75);
else if ($id == 3) $ball = round($ball * 1);
else if ($id == 4) $ball = 0;
return $ball;
}
// метод для отображения рейтинга лидеров на главной странице
public function ShowSuperRatingMain($s)
{
$kol = $this->ForRead('modules/test/test_config.php');
//$limit_count_super = $this->getdriver()->PutContent($kol[2]);
$limit_count_super = 5;
$limit_from_super = 0;
$this->getdriver()->Select('t_rating, t_adept', '', 't_rating.rat_adept_id=t_adept.adept_id', '', 'rat_mark DESC, rat_date', 'DESC', $limit_from_super, $limit_count_super);
//$this->getdriver()->ExecQuery('SELECT * FROM (SELECT * FROM t_rating, t_adept WHERE t_rating.rat_adept_id=t_adept.adept_id ORDER BY rat_date LIMIT '.$limit_from_super.','.$limit_count_super.') AS T ORDER BY rat_mark DESC;');
//echo '<div style="color: #444;"><h3>Лучшие учасники</h3></div><div class="rating"><table border="0" width="600">';
//echo '<br /><div style="color: #444;"><h2>ТОР лучших</h2></div><div class="rating"><table border="0" width="100%">';
echo '<div style="color: #444; margin: 20px 0 0 0;"><img src="'.$s.'files/img/liders.jpg" alt="Лидеры" /></div><div class="rating_main"><table border="0" width="100%">';
$i = 1;
while ($row1 = $this->getdriver()->FetchResult())
{
$surname = $this->getdriver()->PutContent($row1['adept_surname']);
$name = $this->getdriver()->PutContent($row1['adept_name']);
$mark = $this->getdriver()->PutContent($row1['rat_mark']);
$time = $this->getdriver()->PutContent($row1['rat_time']);
$time = date("H:i:s", $time);
//$date = $this->getdriver()->PutContent($row1['rat_date']);
if ($i%2 != 0) echo '<tr class="t_r1"><td>'.$surname.' '.$name.'</td><td> </td><td width="50">IQ-'.$mark.'</td><td width="50">'.$time.'</td></tr>';
else if ($i%2 == 0) echo '<tr class="t_r2"><td>'.$surname.' '.$name.'</td><td> </td><td width="50">IQ-'.$mark.'</td><td width="50">'.$time.'</td></tr>';
$i++;
}
echo '</table></div>';
}
// метод для отображения рейтинга участников на главной странице
public function ShowRatingMain($limit_from, $s)
{
$kol = $this->ForRead('modules/test/test_config.php');
//$limit_count = $this->getdriver()->PutContent($kol[1]);
$limit_count = 17;
//$limit_count_super = $this->getdriver()->PutContent($kol[2]);
//$limit_from_super = 0;
if (!isset($limit_from)) $limit_from = 0;
/* $this->getdriver()->Select('t_rating, t_adept', '', 't_rating.rat_adept_id=t_adept.adept_id', '', 'rat_mark DESC, rat_date', 'DESC', $limit_from_super, $limit_count_super);
//$this->getdriver()->ExecQuery('SELECT * FROM (SELECT * FROM t_rating, t_adept WHERE t_rating.rat_adept_id=t_adept.adept_id ORDER BY rat_date LIMIT '.$limit_from_super.','.$limit_count_super.') AS T ORDER BY rat_mark DESC;');
echo '<div style="color: #444;"><h3>Лучшие учасники</h3></div><div class="rating"><table border="0" width="600">';
$i = 1;
while ($row1 = $this->getdriver()->FetchResult())
{
$surname = $this->getdriver()->PutContent($row1['adept_surname']);
$name = $this->getdriver()->PutContent($row1['adept_name']);
$mark = $this->getdriver()->PutContent($row1['rat_mark']);
$date = $this->getdriver()->PutContent($row1['rat_date']);
if ($i%2 != 0) echo '<tr class="t_r1" height="30"><td>'.$surname.' '.$name.'</td><td width="100">IQ - '.$mark.'</td><td width="200">'.date("d.m.Y H:i:s", $date).'</td></tr>';
else if ($i%2 == 0) echo '<tr class="t_r2"><td>'.$surname.' '.$name.'</td><td width="100">IQ - '.$mark.'</td><td width="200">'.date("d.m.Y H:i:s", $date).'</td></tr>';
$i++;
}
echo '</table></div>'; */
$this->getdriver()->Select('t_rating, t_adept', '', 't_rating.rat_adept_id=t_adept.adept_id', '', 'rat_date', 'DESC', $limit_from, $limit_count);
//$this->getdriver()->Select('t_rating, t_adept', '', 't_rating.rat_adept_id=t_adept.adept_id', '', '', '', '', '');
//echo '<div style="color: #444;"><h3>Рейтинг учасников</h3></div><div class="rating"><table border="0" width="600">';
//echo '<br /><div style="color: #444;"><h2>Участники</h2></div><div class="rating"><table border="0" width="100%">';
echo '<div style="color: #444; margin: 30px 0 0 0;"><img src="'.$s.'files/img/users.jpg" alt="учасники" /></div><div class="rating_main"><table border="0" width="100%">';
$i = 1;
while ($row = $this->getdriver()->FetchResult())
{
$surname = $this->getdriver()->PutContent($row['adept_surname']);
$name = $this->getdriver()->PutContent($row['adept_name']);
$mark = $this->getdriver()->PutContent($row['rat_mark']);
$time = $this->getdriver()->PutContent($row['rat_time']);
$time = date("H:i:s", $time);
//$date = $this->getdriver()->PutContent($row['rat_date']);
if ($i%2 != 0) echo '<tr class="t_r1"><td>'.$surname.' '.$name.'</td><td> </td><td width="50">IQ-'.$mark.'</td><td width="50">'.$time.'</td></tr>';
else if ($i%2 == 0) echo '<tr class="t_r2"><td>'.$surname.' '.$name.'</td><td> </td><td width="50">IQ-'.$mark.'</td><td width="50">'.$time.'</td></tr>';
$i++;
}
echo '</table></div>';
echo '<div style="color: #444; margin: 15px 0 0 0; _margin: 23px 0 0 0;"><img src="'.$s.'files/img/line.jpg" alt="" /></div>';
echo '
<a href="1.html">все участники »</a> ';
}
// метод для отображения рейтинга лидеров
public function ShowSuperRating($s)
{
$kol = $this->ForRead('modules/test/test_config.php');
$limit_count_super = $this->getdriver()->PutContent($kol[2]);
$limit_from_super = 0;
$this->getdriver()->Select('t_rating, t_adept', '', 't_rating.rat_adept_id=t_adept.adept_id', '', 'rat_mark DESC, rat_date', 'DESC', $limit_from_super, $limit_count_super);
echo '<br /><div style="color: #444;"><img src="'.$s.'files/img/liders.jpg" alt="Лидеры" /></div><div class="rating"><table border="0" width="100%">';
$i = 1;
while ($row1 = $this->getdriver()->FetchResult())
{
$surname = $this->getdriver()->PutContent($row1['adept_surname']);
$name = $this->getdriver()->PutContent($row1['adept_name']);
$mark = $this->getdriver()->PutContent($row1['rat_mark']);
$time = $this->getdriver()->PutContent($row1['rat_time']);
$time = date("H:i:s", $time);
if ($i%2 != 0) echo '<tr class="t_r1"><td>'.$surname.' '.$name.'</td><td> </td><td width="50">IQ-'.$mark.'</td><td width="50">'.$time.'</td></tr>';
else if ($i%2 == 0) echo '<tr class="t_r2"><td>'.$surname.' '.$name.'</td><td> </td><td width="50">IQ-'.$mark.'</td><td width="50">'.$time.'</td></tr>';
$i++;
}
echo '</table></div><br /><br />';
}
// метод для отображения рейтинга участников
public function ShowRating($limit_from, $s)
{
$kol = $this->ForRead('modules/test/test_config.php');
$limit_count = $this->getdriver()->PutContent($kol[1]);
if (!isset($limit_from)) $limit_from = 0;
$this->getdriver()->Select('t_rating, t_adept', '', 't_rating.rat_adept_id=t_adept.adept_id', '', 'rat_date', 'DESC', $limit_from, $limit_count);
echo '<br /><div style="color: #444;"><img src="'.$s.'files/img/users.jpg" alt="учасники" /></div><div class="rating"><table border="0" width="100%">';
$i = 1;
while ($row = $this->getdriver()->FetchResult())
{
$surname = $this->getdriver()->PutContent($row['adept_surname']);
$name = $this->getdriver()->PutContent($row['adept_name']);
$mark = $this->getdriver()->PutContent($row['rat_mark']);
$time = $this->getdriver()->PutContent($row['rat_time']);
$time = date("H:i:s", $time);
//$date = $this->getdriver()->PutContent($row['rat_date']);
if ($i%2 != 0) echo '<tr class="t_r1"><td>'.$surname.' '.$name.'</td><td> </td><td width="50">IQ-'.$mark.'</td><td width="50">'.$time.'</td></tr>';
else if ($i%2 == 0) echo '<tr class="t_r2"><td>'.$surname.' '.$name.'</td><td> </td><td width="50">IQ-'.$mark.'</td><td width="50">'.$time.'</td></tr>';
$i++;
}
echo '</table></div>';
echo '<div style="color: #444; margin: 15px 0 0 0; _margin: 22px 0 0 0;"><img src="'.$s.'files/img/line.jpg" alt="" /></div>';
echo '
<a href="index.php">« на главную</a>';
}
// метод для записи рейтинга
public function SaveRating($id, $mark, $date, $time)
{
$id = $this->getdriver()->PutContent($id);
$mark = $this->getdriver()->PutContent($mark);
$date = $this->getdriver()->PutContent($date);
$time = $this->getdriver()->PutContent($time);
$value = $id.", ".$mark.", ".$date.", ".$time;
$this->getdriver()->Insert('t_rating', 'rat_adept_id, rat_mark, rat_date, rat_time', $value);
$kol = $this->getdriver()->Result();
if ($kol != 0) return 1;
else return 0;
}
// метод для подщета записей в таблице рейтинг
public function CountRating()
{
$this->getdriver()->Select('t_rating', '', '', '', '', '', '', '');
$count = $this->getdriver()->Count();
return $count;
}
// метод для отображения вопросов и ответов
public function ShowTest1($perem)
{
$id = $this->getdriver()->PutContent($perem);
$this->getdriver()->Select('t_question', '', 'quest_id='.$id, '', '', '', '', '');
$row = $this->getdriver()->FetchResult();
$quest_id = $row['quest_id'];
$question = $row['quest_question'];
$image = $row['quest_image'];
if (!empty($image)) $img = '<br /><span class="png"><img src="images/'.$image.'" alt="" /></span><br /><br />';
else $img = '';
$i = 0;
$this->getdriver()->Select('t_answer', '', 'ans_question_id='.$id, '', '', '', '', '');
$f = '<table border="0">';
while($row1 = $this->getdriver()->FetchResult())
{
$answer_id = $row1['ans_id'];
$answer = $this->getdriver()->Strip($row1['ans_answer']);
//$f .= '<input type="radio" name="ans_id" value="'.$answer_id.'" onClick="setButton('next');" /> '.$answer.'<br />';
//$f .= '<tr><td valign="middle"><div class="answer_link"><a href="test.php?q='.$quest_id.'&a='.$answer_id.'" onMouseOver="Answer_Underline(''.$i.'');" onMouseOut="Answer_None(''.$i.'');"><div class="strelka">»</div></a></div></td><td><div class="answer_link"><a href="test.php?q='.$quest_id.'&a='.$answer_id.'" onMouseOver="Answer_Underline(''.$i.'');" onMouseOut="Answer_None(''.$i.'');"><span id="'.$i.'">'.$answer.'</span></a></div></td></tr>';
$f .= '<tr><td valign="middle"><div class="answer_link"><a href="test.php?q='.$quest_id.'&a='.$answer_id.'" onMouseOver="Answer_Underline(''.$i.'');" onMouseOut="Answer_None(''.$i.'');"><div class="strelka">»</div></a></div></td><td><div class="answer_link"><a href="test.php?q='.$quest_id.'&a='.$answer_id.'" onMouseOver="Answer_Underline(''.$i.'');" onMouseOut="Answer_None(''.$i.'');"><span id="'.$i.'">'.$answer.'</span></a></div></td></tr>';
$i++;
}
$f .= '</table>';
/* echo '<br /><br /><form method="POST" action="test.php">
<table border="0" width="953">
<input name="quest_id" value="'.$quest_id.'" type="hidden" />
<tr><td width="80"></td><td colspan="2" align="center"><div>'.$img.'</div></td><td width="80"></td></tr>
<tr><td width="80"></td><td colspan="2" align="left"><div style="padding-left: 5px;">'.$question.'</div></td><td width="80"></td></tr>
<tr><td width="80"></td><td colspan="2" align="left"><div>'.$f.'</div></td><td width="80"></td></tr>
</td></tr>
<tr><td width="80"></td><td align="center"><span class="kn"><br /><button type="submit" id="next" name="next" disabled="disabled" value="ответить"><img src="files/img/next.jpg" alt="ответить" /></button></span></td>
<td align="center"><span class="kn"><br /><button type="submit" name="later" value="пропустить"><img src="files/img/later.jpg" alt="пропустить" /></button></span></td><td width="80"></td></tr>
</table>
</form>'; */
echo '<br /><br /><form method="POST" action="test.php">
<table border="0" width="953">
<input name="quest_id" value="'.$quest_id.'" type="hidden" />
<tr><td width="80"></td><td colspan="2" align="center"><div>'.$img.'</div></td><td width="80"></td></tr>
<tr><td width="80"></td><td colspan="2" align="left"><div style="padding-left: 5px;">'.$question.'</div></td><td width="80"></td></tr>
<tr><td width="80"></td><td colspan="2" align="left"><div>'.$f.'</div></td><td width="80"></td></tr>
</td></tr>
</table>
</form>';
}
// метод для отображения вопросов и ответов когда их пропустили
public function ShowTest2($perem)
{
$id = $this->getdriver()->PutContent($perem);
$this->getdriver()->Select('t_question', '', 'quest_id='.$id, '', '', '', '', '');
$row = $this->getdriver()->FetchResult();
$quest_id = $row['quest_id'];
$question = $row['quest_question'];
$image = $row['quest_image'];
if (!empty($image)) $img = '<br /><span class="png"><img src="images/'.$image.'" alt="" /></span><br /><br />';
else $img = '';
$this->getdriver()->Select('t_answer', '', 'ans_question_id='.$id, '', '', '', '', '');
$f = '';
while($row1 = $this->getdriver()->FetchResult())
{
$answer_id = $row1['ans_id'];
$answer = $this->getdriver()->Strip($row1['ans_answer']);
$f .= '<input type="radio" name="ans_id" value="'.$answer_id.'" onClick="setButton('next_later');" /> '.$answer.'<br />';
}
/* echo '<form method="POST" action="test.php">
<table border="0" width="100%">
<tr><td>
<input name="quest_id" value="'.$quest_id.'" type="hidden" />
<div>'.$question.'</div>
<div>'.$img.'</div>
<div>'.$f.'</div>
</td></tr>
<tr><td align="center"><br /><span class="kn"><button type="submit" id="next_later" name="next_later" disabled="disabled"><img src="files/img/next.jpg" alt="ответить" /></button>
<button type="submit" name="later" disabled=true><img src="files/img/later.jpg" alt="пропустить" /></button></span></td></tr>
</table>
</form>'; */
echo '<br /><br /><form method="POST" action="test.php">
<table border="0" width="953">
<input name="quest_id" value="'.$quest_id.'" type="hidden" />
<tr><td width="80"></td><td colspan="2" align="center"><div>'.$img.'</div></td><td width="80"></td></tr>
<tr><td width="80"></td><td colspan="2" align="left"><div style="padding-left: 5px;">'.$question.'</div></td><td width="80"></td></tr>
<tr><td width="80"></td><td colspan="2" align="left"><div>'.$f.'</div></td><td width="80"></td></tr>
</td></tr>
<tr><td width="80"></td><td align="center"><span class="kn"><br /><button type="submit" id="next_later" name="next_later" disabled="disabled"><img src="files/img/next.jpg" alt="ответить" /></button></span></td>
<td align="center"><span class="kn"><br /><button type="submit" name="later" disabled=true><img src="files/img/later.jpg" alt="пропустить" /></button></span></td><td width="80"></td></tr>
</table>
</form>';
}
}
?>
Додаток Б
Програмний код головної сторінки (файл index.php)
<?
session_start();
include_once('core/core_main.php');
$pi = $popmenu->PathIncludes($sublink);
if (isset($show)) $s = '../';
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<?
$seomenu = $menu->ShowSeo($link); $seocontent = $content->ShowSeo($link, $sublink);
if (!empty($seocontent[0]))
{
echo '<title>'.$seocontent[0].'</title>';
echo '<meta name="description" content="'.$seocontent[1].'" />';
echo '<meta name="keywords" content="'.$seocontent[2].'" />';
}
else if (!empty($seomenu[0])){
echo '<title>'.$seomenu[0].'</title>';
echo '<meta name="description" content="'.$seomenu[1].'" />';
echo '<meta name="keywords" content="'.$seomenu[2].'" />';
}
else
{
echo '<title>IQ - тест</title>';
echo '<meta name="description" content="тест" />';
echo '<meta name="keywords" content="тест" />';
}
?>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<link rel="stylesheet" type="text/css" href="<?echo $pi.$s;?>css/style.css" />
<!-- <link rel="stylesheet" type="text/css" href="<?//echo $pi;?>css/carousel.css" /> -->
<link rel="stylesheet" type="text/css" href="<?echo $pi.$s;?>includes/css/paginator3000.css" />
<link rel="stylesheet" type="text/css" href="<?echo $pi.$s;?>includes/css/jquery.alerts.css" />
<script type="text/javascript" src="<?echo $pi.$s;?>js/jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('.png').pngFix( );
});
</script>
<script language="javascript">AC_FL_RunContent = 0;</script>
<script language="javascript" src="AC_RunActiveContent.js"></script>
<!--<script type="text/javascript">
function Login() {
var str = '';
$.post("modules/users/ajaxlogin.php", str, function(data) {
$("#login").html(data);
});
document.getElementById("button").disabled = true;
document.getElementById("button").style.display = 'none';
}
function checkF(f) {
if (f.fam.value =='') {jAlert("забыли написать фамилию!", "сообщение", function (){f.fam.focus()}); return false; }
if (f.mail.value =='') {jAlert("напишите Ваш мейл!", "сообщение", function (){f.mail.focus()}); return false; }
if (f.pass.value =='') {jAlert("пароль тоже надо написать!", "сообщение", function (){f.pass.focus()}); return false; }
if (f.pass2.value =='') {jAlert("а повторить пароль забыли?", "сообщение", function (){f.pass2.focus()}); return false; }
if (f.pass.value != f.pass2.value) {jAlert("пароли не совпали!nпопробуйте еще разочек!", "сообщение", function (){f.pass2.focus()}); return false; }
if (/^w+([.-]?w+)*@w+([.-]?w+)*(.w{2,4})+$/.test(f.mail.value)){
return true;
}
jAlert('мейл не принимается!nисправляем...', "сообщение", function (){f.mail.select()});
return false;
//return true;
}
function checkR(f) {
if (f.name.value =='') {jAlert("Для восстановления пароля нужно написать имя!", "сообщение", function (){f.name.focus()}); return false; }
if (f.mail.value =='') {jAlert("Для восстановления пароля нужно написать мейл!", "сообщение", function (){f.mail.focus()}); return false; }
if (/^w+([.-]?w+)*@w+([.-]?w+)*(.w{2,4})+$/.test(f.mail.value)){
return true;
}
jAlert('мейл не принимается!nисправляем...', "сообщение", function (){f.mail.select()});
return false;
//return true;
}
function checkL(f) {
if (f.pass.value =='') {jAlert("Если Вы хотите авторизироваться, нужно написать пароль!", "сообщение", function (){f.pass.focus()}); return false; }
if (f.mail.value =='') {jAlert("Если Вы хотите авторизироваться, нужно написать мейл!", "сообщение", function (){f.mail.focus()}); return false; }
if (!(/^w+([.-]?w+)*@w+([.-]?w+)*(.w{2,4})+$/.test(f.mail.value))) {
jAlert('мейл не принимается!nисправляем...', "сообщение", function (){f.mail.select()});
return false;
}
var str = $("#f_login").serialize();
$.post("modules/users/ajaxchecklogin.php", str, function(data){
$(".error").html(data);
if (document.getElementById("log").value == 1)
{
window.location = 'modules/users/check_aut.php';
}
});
return false;
}
</script> -->
</head>
<body>
<div id="all-site">
<div id="container">
<div id="flash-holder">
<div id="header">
<noscript><center><h2><div style="color: red;">Javascript выключен! Для прохождения теста включите javascript в настройках Вашего браузера.</div></h2></center></noscript>
<?
if ((empty($link)) or ($link == 1))
{
echo '<a href="'.$pi.$s.'index.php" title="на главную"><img src="'.$pi.$s.'files/img/aroma-header.jpg" alt="на главную" /></a>';
}
?>
</div>
<div class="text-content">
<?
if ((empty($link)))
{
echo '<center><table border="0" width="953"><tr><td valign="top">';
echo '<img src="files/img/maket1.jpg" alt="" />';
if (($link != 20) and ($link != 21))
{
echo '<form action="'.$pi.$s.'test.php" method="post" class="super_knopka">
<div class="kn"><button type="submit" id="button" name="enter"><img src="'.$pi.$s.'files/img/start.jpg" alt="начать тест" /></button></div>
</form>';
}
echo '<br /><br />';
echo '<table style="height: 273px; _height: 270px;" border="0" width="100%"><tr><td align="left" valign="top" width="330"><img src="files/img/maket3.jpg" alt="" /></td>
<td valign="bottom">';
?>
<div style="margin: 23px 0 0 0;">
<script language="javascript">
if (AC_FL_RunContent == 0) {
alert("This page requires AC_RunActiveContent.js.");
} else {
AC_FL_RunContent('codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0', 'width', '160', 'height', '240', 'src', 'video', 'allowFullScreen', 'false',
'allowScriptAccess','sameDomain', 'movie', 'images/SSvideo/video',
'salign', ''); //end AC code
}
</script>
<noscript>
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="160" height="240" id="video" align="middle">
<param name="allowScriptAccess" value="sameDomain" />
<param name="allowFullScreen" value="false" />
<param name="movie" value="images/SSvideo/video.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#000000" /><embed src="images/SSvideo/video.swf" quality="high" bgcolor="#000000" width="160" height="240" name="video" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
</noscript>
<td valign="bottom">
<script language="javascript">
if (AC_FL_RunContent == 0) {
alert("This page requires AC_RunActiveContent.js.");
} else {
AC_FL_RunContent('codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0', 'width', '160', 'height', '240', 'src', 'video', 'allowFullScreen', 'false',
'allowScriptAccess','sameDomain', 'movie', 'images/SSvideo/video',
'salign', ''); //end AC code
}
</script>
<noscript>
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="122" height="182" id="video2" align="middle">
<param name="allowScriptAccess" value="sameDomain" />
<param name="allowFullScreen" value="false" />
<param name="movie" value="images/KSvideo/video.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#000000" /><embed src="images/KSvideo/video.swf" quality="high" bgcolor="#000000" width="122" height="182" name="video2" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
</noscript>
<?
/* echo '<object width="144" height="214" data="../images/aromarich_loop.swf" type="application/x-shockwave-flash">
<param name="quality" value="high" />
<param name="src" value="../images/aromarich_loop.swf" />
<param name="align" value="middle" />
<param name="valign" value="bottom" />
</object>'; */
?>
</td>
</tr></table>
<?
//$content->ShowContent($link, $sublink);
echo '</td><td width="265" valign="top" align="right"><div style="width:265px;">';
$test_q->ShowSuperRatingMain($s);
$test_q->ShowRatingMain($show, $s);
$kol_show = $test_q->ForRead();
$kol_records = $test_q->CountRating();
//$navi->Navigation($show, $kol_records, $kol_show[1], '?link='.$link.'&sublink='.$sublink);
echo '</div></td></tr></table></center>';
}
else if ($link == 1)
{
echo '<center><div style="width:265px; text-align: center;">';
$test_q->ShowSuperRating($s);
$test_q->ShowRating($show, $s);
$kol_show = $test_q->ForRead();
$kol_records = $test_q->CountRating();
$navi->Navigation($show, $kol_records, $kol_show[1], '?link='.$link.'&sublink='.$sublink);
echo '</div></center>';
}
?>
</div>
</div>
<!-- <div id="footer"> </div> -->
</div>
<div class="empty"> </div>
</div>
<div id="footer"> </div>
<script type="text/javascript" src="<?echo $pi.$s;?>includes/scripts/jquery/jquery.pngFix.js"></script>
<script type="text/javascript" src="<?echo $pi.$s;?>includes/scripts/jquery/jquery.alerts.js"></script>
<script type="text/javascript" src="<?echo $pi;?>js/swfobject.js"></script>
<script type="text/javascript" src="<?echo $pi;?>js/ajax.js"></script>
<script type="text/javascript" src="<?echo $pi.$s;?>includes/scripts/js/paginator3000.js"></script>
</body>
</html>
Додаток В
Програмний код сторінки тестування (файл test.php)
<?
session_start();
include_once('core/core_main.php');
$pi = $popmenu->PathIncludes($sublink);
if (isset($show)) $s = '../';
//include_once("core/cl_db.php");
//include_once("modules/users/cl_autorize.php");
//$auth = new cl_authorize();
//$auth->authorize();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
$seomenu = $menu->ShowSeo($link); $seocontent = $content->ShowSeo($link, $sublink);
if (!empty($seocontent[0]))
{
echo '<title>'.$seocontent[0].'</title>';
echo '<meta name="description" content="'.$seocontent[1].'" />';
echo '<meta name="keywords" content="'.$seocontent[2].'" />';
}
else if (!empty($seomenu[0])){
echo '<title>'.$seomenu[0].'</title>';
echo '<meta name="description" content="'.$seomenu[1].'" />';
echo '<meta name="keywords" content="'.$seomenu[2].'" />';
}
else
{
echo '<title>IQ - тест</title>';
echo '<meta name="description" content="тест" />';
echo '<meta name="keywords" content="тест" />';
}
?>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<link rel="stylesheet" type="text/css" href="css/style.css" />
<link rel="stylesheet" type="text/css" href="css/carousel.css" />
<script src="AC_RunActiveContent.js" language="javascript"></script>
<script src="js/jquery.js" language="javascript"></script>
<script src="js/swfobject.js" type="text/javascript"></script>
<script src="js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
function setButton(but)
{
document.getElementById(but).disabled = false; // сделать активной
//document.getElementById(but).disabled = 'true'; // сделать не активной
}
function Answer_Underline(id)
{
document.getElementById(id).style.textDecoration = "underline";
}
function Answer_None(id)
{
document.getElementById(id).style.textDecoration = "none";
}
</script>
<script type="text/javascript">
function updateTime() {
$('#showtimer').show(function(){
$(this).load('timershow.php');
});
setTimeout("updateTime()",1000);
}
</script>
</head>
<body onload="updateTime()">
<div id="all-site">
<div id="container">
<div id="flash-holder1">
<div id="header">
<noscript><center><h2><div style="color: red;">Javascript выключен! Для прохождения теста включите javascript в настройках Вашего браузера.</div></h2></center></noscript>
<div style="position: absolute; top: 10px; left: 10px;">
<script language="javascript">
if (AC_FL_RunContent == 0) {
alert("This page requires AC_RunActiveContent.js.");
} else {
AC_FL_RunContent('codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0', 'width', '160', 'height', '240', 'src', 'video', 'allowFullScreen', 'false',
'allowScriptAccess','sameDomain', 'movie', 'images/SSvideo/video',
'salign', ''); //end AC code
}
</script>
<noscript>
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="104" height="155" id="video2" align="middle">
<param name="allowScriptAccess" value="sameDomain" />
<param name="allowFullScreen" value="false" />
<param name="movie" value="images/KSvideo/video.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#000000" /><embed src="images/KSvideo/video.swf" quality="high" bgcolor="#000000" width="104" height="155" name="video2" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
</noscript>
</div>
</div>
<div class="text-content1">
<?
//unset($_SESSION['last_mas_id']);
$kol_quest2 = $test_q->ForRead(); // количество выводимых вопросов
$kol_all2 = $test_q->CountAll(); // количество всех вопросов
if ($kol_quest2[0] > $kol_all2)
{ echo '<h2>Тест в данный момент не доступен. Попробуйте позже.</h2><br /><a href="index.php">перейти на главную</a>'; }
else
{
if (($_SESSION['last_mas_id']))
{
if ((count($_SESSION['last_mas_id']) + $kol_quest2[0]) >= $kol_all2) {unset($_SESSION['last_mas_id']); $_SESSION['last_mas_id'] = array();}
}
else $_SESSION['last_mas_id'] = array();
if (isset($_POST["enter"]) or ($_SESSION['enter'] == 'power on') or (isset($_GET['test'])))
{
unset($_SESSION['mas_id']);
unset($_SESSION['mas_later_id']);
unset($_SESSION['kol_quest']);
unset($_SESSION['kol_quest_later']);
unset($_SESSION['number_quest']);
unset($_SESSION['number_quest_later']);
unset($_SESSION['mark']);
unset($_SESSION['enter']);
unset($_SESSION['startime']);
unset($_SESSION['finishtime']);
unset($_SESSION['testime']);
unset($_SESSION['test_be_over']);
$mas_id = array();// масив уникальных айдишек
$mas_later_id = array();// масив айдишек, которые пропустил
//$allid = $test_q->SelectAllId(); // масив всех айдишек
$allid_l = $test_q->SelectAllIdL(); // масив всех айдишек легких вопросов - light
$allid_m = $test_q->SelectAllIdM(); // масив всех айдишек cредних вопросов - middle
$allid_c = $test_q->SelectAllIdC(); // масив всех айдишек сложных вопросов - complex
$kol_quest = $test_q->ForRead(); // количество выводимых вопросов
$kol_all = $test_q->CountAll(); // количество всех вопросов
$kol_l = round($kol_quest[0] / 3);
$kol_m = $kol_l;
$kol_c = $kol_quest[0] - $kol_l - $kol_m;
//-------------- !!!! у вопросов нет уровня сложности, только у ответов
//while(count($mas_id) < $kol_quest[0])
//{
// выбераем простые вопросы
$l = 0;
while($l < $kol_l)
{
$number = rand(0,count($allid_l)-1);
if (!in_array($allid_l[$number], $mas_id) and !in_array($allid_l[$number], $_SESSION['last_mas_id'])) { $mas_id[] = $allid_l[$number]; $l++;}
//if (!in_array($allid[$number], $mas_id)) $mas_id[] = $allid[$number];
}
// выбераем средние вопросы
$m = 0;
while($m < $kol_m)
{
$number1 = rand(0,count($allid_m)-1);
if (!in_array($allid_m[$number1], $mas_id) and !in_array($allid_m[$number1], $_SESSION['last_mas_id'])) { $mas_id[] = $allid_m[$number1]; $m++;}
//if (!in_array($allid[$number], $mas_id)) $mas_id[] = $allid[$number];
}
// выбераем сложные вопросы
$c = 0;
while($c < $kol_c)
{
$number2 = rand(0,count($allid_c)-1);
if (!in_array($allid_c[$number2], $mas_id) and !in_array($allid_c[$number2], $_SESSION['last_mas_id'])) { $mas_id[] = $allid_c[$number2]; $c++;}
//if (!in_array($allid[$number], $mas_id)) $mas_id[] = $allid[$number];
}
//}
$_SESSION['mas_id'] = $mas_id;// масив уникальных айдишек в сесию
$_SESSION['kol_quest'] = $kol_quest[0];// количество выводимых вопросов в сесию
$_SESSION['kol_quest_later'] = 0;// количество пропущеных вопросов в сесию
$_SESSION['number_quest'] = 0; // покажчик на первый вопрос
$_SESSION['number_quest_later'] = 0; //покажчик на первий пропущеный вопрос
$_SESSION['mark'] = 0; // сума баллов в сесию
//$_SESSION['startime'] = date("H:i:s"); // начало тестирования в сессию
$_SESSION['startime'] = time(); // начало тестирования в сессию
//$_SESSION['startime'] = time(); // начало тестирования в сессию
}
// проверка или тест был пройден, чтобы не возможно было вернуться назад
if (($_SESSION['test_be_over'] == 'true'))
{
header("Location: finish.php");
exit;
}
if ((isset($_POST["next"])) or (isset($a)))
{
$_SESSION['number_quest'] = $_SESSION['number_quest'] + 1;// для показа следуйщего вопроса в масиве
//$point = $test_q->SelectPoint($test_q->getdriver()->PutContent($_POST['quest_id']), $test_q->getdriver()->PutContent($_POST['ans_id']));
$point = $test_q->SelectPoint($test_q->getdriver()->PutContent($q), $test_q->getdriver()->PutContent($a));
$cal_point = $test_q->Calculation($point, $_SESSION['kol_quest']);
$_SESSION['mark'] = $_SESSION['mark'] + ($cal_point);
$_SESSION['last_mas_id'][] = $test_q->getdriver()->PutContent($q);// масив пройденых айдишек за все попытки
}
else if (isset($_POST["later"]))
{
$later_id = $test_q->getdriver()->PutContent($_POST['quest_id']);
$_SESSION['mas_later_id'][] = $later_id;// масив пропущеных айдишек
$_SESSION['number_quest'] = $_SESSION['number_quest'] + 1;// для показа следуйщего вопроса в масиве
$_SESSION['kol_quest_later'] = $_SESSION['kol_quest_later'] + 1;// для показа следуйщего вопроса в масиве
}
else if (isset($_POST["next_later"]))
{
$_SESSION['number_quest_later'] = $_SESSION['number_quest_later'] + 1;// для показа следуйщего вопроса в масиве
$point = $test_q->SelectPoint($test_q->getdriver()->PutContent($_POST['quest_id']), $test_q->getdriver()->PutContent($_POST['ans_id']));
$cal_point = $test_q->Calculation($point, $_SESSION['kol_quest']);
$_SESSION['mark'] = $_SESSION['mark'] + ($cal_point);
$_SESSION['last_mas_id'][] = $test_q->getdriver()->PutContent($_POST['quest_id']);// масив пройденых айдишек за все попытки
}
if ($_SESSION['number_quest'] < $_SESSION['kol_quest'])
{
$test_q->ShowTest1($_SESSION['mas_id'][$_SESSION['number_quest']]);
}
else if ($_SESSION['number_quest_later'] < $_SESSION['kol_quest_later'])
{
$test_q->ShowTest2($_SESSION['mas_later_id'][$_SESSION['number_quest_later']]);
}
else
{
if ($_SESSION['mark'] < 50) $_SESSION['mark'] = 50;
else if ($_SESSION['mark'] > 170) $_SESSION['mark'] = 170;
unset($_SESSION['finish_mark']);
$_SESSION['finish_mark'] = $_SESSION['mark'];
$_SESSION['finishtime'] = time(); // конец тестирования в сессию
$_SESSION['time'] = $_SESSION['finishtime'] - $_SESSION['startime'] - 2*3600; // время тестирования в сессию
$_SESSION['testime'] = $_SESSION['time'];
unset($_SESSION['mark']);
unset($_SESSION['startime']);
unset($_SESSION['finishtime']);
unset($_SESSION['time']);
// маркер окончания теста
$_SESSION['test_be_over'] = 'true';
header("Location: finish.php");
exit;
}
}
?>
</div>
<center><div><div id="showtimer" style="z-index: 255; width: 130px; height: 50px; background: #000000; margin: 5px 0; padding-top: 10px; color: #ffffff; font-size: 24px; text-align: center; font-weight:600;"></div></div></center>
</div>
</div>
<div class="empty"> </div>
</div>
<div id="footer"> </div>
</body>
</html>