ВСТУП
Технологізація навчального та виховного процесів у сучасній вітчизняній і зарубіжній педагогіці пов'язана з наростаючою глобалізацією, включеністю суспільства в загальносвітові процеси, потребою в професійно компетентних фахівцях, які володіють іноземною мовою і здатних здійснювати міжкультурну комунікацію.
Особливий інтерес викликає глобальна інформатизація освіти, яка ініціює формування інформаційного середовища, роблячи доступною інформацію будь-якого виду. Забезпечується така можливість засобами інформаційних технологій, завдяки яким з'являється можливість купувати, зберігати інформацію, творчо застосовувати її в житті, навчанні і професійній діяльності. Для вирішення завдань залучення учнів до вільного доступу та роботи з будь-якою інформацією посилюється роль освіти через освоєння і застосування інформаційних технологій в освітньому процесі.
Оснащення шкіл та вузів новими апаратними та програмними засобами, нарощування можливостей комп'ютера, дозволило застосовувати інформаційні технології в навчанні іноземним мовам. Зокрема, особливого наукового інтересу заслуговує питання про вдосконалення автоматизованого контролю знань учнів засобами комп'ютерного тестування.
Під терміном «комп'ютерне тестування» доцільно розуміти засіб автоматизованого контролю знань учнів, що представляє собою стандартизовану процедуру застосування педагогічних тестів на комп'ютері під управлінням спеціальної програми, з метою подальшої діагностики викладачем рівня володіння змістом і структурою навчального матеріалу.
Комп'ютерне тестування у навчанні іноземної мови має ряд переваг перед традиційним бланковим тестуванням.
В зв'язку з цим необхідно підкреслити, що завдяки комп'ютерному тестуванню:
- підвищується інформаційна безпека, неможливим стає розсекречення тесту за рахунок високої швидкості передачі інформації та спеціального захисту електронних файлів;
- спрощується процедура підрахунку результуючих балів у тих випадках, коли тест містить тільки завдання з вибором відповідей;
- негайно видається тестовий бал, і приймаються невідкладні заходи щодо корекції засвоєння нового матеріалу на основі аналізу протоколів за результатами виконання коригувальних і діагностичних тестів;
-збільшуються можливості педагогічного контролю за рахунок розширення спектру вимірюваних лексичних та граматичних навичок в інноваційних типах тестових завдань, що використовують різноманітні можливості комп'ютера при включенні аудіо та відео файлів;
-підвищуються інформаційні можливості процесу контролю, з'являється можливість збору додаткових даних про динаміку проходження тесту окремими учнями;
-підвищується об'єктивність контролю, так як програма оцінює відповіді кожного учня за чіткими критеріями.
Необхідно відзначити, що використання комп'ютерного тестування як інноваційної технології навчання іноземним мовам ставить перед викладачем школи завдання розробки та наукового обґрунтування теоретичної моделі тестування, що представляє собою дидактичну систему, яка забезпечить результативність мовної підготовки учнів.
Успішність застосування комп'ютерного тестування мовної підготовки студентів буде забезпечена тільки у тому випадку, якщо виконується комплекс педагогічних умов: розробка та впровадження в освітній процес школи теоретичної моделі тестування, активізація навчально-пізнавальної діяльності учнів на уроці іноземної мови, формування мотивації у учнів.
Таким чином, рішення поставлених завдань забезпечить ефективну реалізацію технології комп'ютерного тестування з іноземної мови в контексті інформаційних технологій навчання у школі.
На даний час існує багато навчальних програм, подекуди навіть здається, що коли нам потрібно вирішити будь-яку задачу за допомогою комп'ютера, то ми без проблем можемо посередництвом мережі Інтернет знайти саме те програмне забезпечення, яке буде задовольняти всім нашим вимогам. І саме так воно і буває, коли вимоги користувача досить розповсюджені, та відповідають вимогам багатьох інших користувачів. Та коли мова йде про вузько направлене, спеціалізоване програмне забезпечення, то ситуація змінюється кардинально. Таке програмне забезпечення досить важко знайти, воно часом досить дорого коштує, особливо коли розробляється на замовлення, та й знайти програміста, котрий напише програму, враховуючи усі ваші побажання не так то і легко. Особливо коли мова йде не про прибуткове підприємство, котре за допомогою цієї програми буде удосконалювати свої виробничі характеристики, тобто безпосередньо від цієї програми буде залежати прибуток цього підприємства, а про навчальний заклад, де подекуди не вистачає коштів і на розповсюджене програмне забезпечення, не кажучи вже про спеціалізоване.
Мета роботи полягає в проектуванні і написанні такої програми тестування знань іноземних мов, яку було б зручно доповнювати людям, далеким від програмування. Також оцінюючи тенденції щодо переходу організацій на вільні аналоги програмного забезпечення, зокрема на операційну систему GNU / Linux, наш програмної продукт повинен працювати на будь-якій платформі без змін у коді.
В перспективі треба сформувати навколо проекту співтовариство розробників, які будуть доповнювати програму, шукати і виправляти помилки. Це буде можливо завдяки відкритим вихідним кодам і ліцензії GNU GPL. Ще важливу роль в цьому може зіграти правильний вибір мови програмування, середовища для розробки, хостингу для проекту і систему контролю версій коду.
1 Аналіз завдання дипломного проекту
1.1 Постановка завданн
я
Завдання: розробити простий, зручний у використанні, кросплатформовий інструмент для проведення електронного тестування учнів молодших та середніх класів по іноземній мові.
Програма тестування повинна відповідати таким вимогам:
- зручність створення уроків, данні знаходяться в CSV файлах і редагуються звичайними табличними процесорами, наприклад OpenOffice Calc;
- реєстрація в системі, введення прізвища та імені;
- вибір уроку із списку існуючих;
- тестування повинне бути обмежене по часу;
- введення відповіді повинно проходити з клавіатури;
- програма повинна мати візуальні та голосові підказки;
- результати тестування оцінюються у балах по кількості правильно написаних літер в слові та визначається оцінка від 2 до 5 балів;
- підсумок по всім тестам видається на екран та записується в файл на жорстокому диску.
Крім того, розроблений програмний продукт повинен задовольняти наступним вимогам:
- кросплатформеність;
- зручність у користуванні та розробці нових уроків;
- зручність у модернізації;
- розширюваність;
- адаптивність.
1.2 Вибір мови програмування
Так як одна із вимог це кросплатформеність, програма повинна без модернізацій працювати на різних платформах, наприклад Windows і Linux, а тому була вибрана об'єктно-орієнтована, кросплатформова мова програмування Sun Java версии 1.6. Синтаксис мови багато в чому походить від C та C++. У офіційній реалізації, Java програми компілюються у байткод, який при виконанні інтерпретується віртуальною машиною для конкретної платформи.
Sun Microsystems надає компілятор Java та віртуальну машину Java, які задовольняють специфікації Java Community Process, під ліцезією GNU General Public License.
Мова значно запозичила синтаксис із C і C++. Зокрема, взято за основу об'єктну модель С++, проте її модифіковано. Усунуто можливість появи деяких конфліктних ситуацій, що могли виникнути через помилки програміста та полегшено сам процес розробки об'єктно-орієнтованих програм. Ряд дій, які в С/C++ повинні здійснювати програмісти, доручено віртуальній машині. Передусім, Java розроблялась як платформо-незалежна мова, тому вона має менше низькорівневих можливостей для роботи з апаратним забезпеченням. При необхідності java дозволяє викликати підпрограми, написані на інших мовах програмування.
Під «незалежністю від архітектури» мається на увазі те, що програма, написана на мові Java, працюватиме на будь-якій підтримуваній апаратній чи системній платформі без змін у початковому коді та перекомпіляції.
Цього можна досягти, компілюючи початковий Java код у байт-код, який являє собою спрощені машинні команди. Потім програму можна виконати на будь-якій платформі, що має встановлену віртуальну машину Java, яка інтерпретує байткод у код, пристосований до специфіки конкретної операційної системи і процесора. Зараз віртуальні машини Java існують для більшості процесорів і операційних систем.
Стандартні бібліотеки забезпечують загальний спосіб доступу до таких платформозалежних особливостей, як обробка графіки, багатопотоковість та роботу з мережами. У деяких версіях задля збільшення продуктивності JVM, байт-код можна компілювати у машинний код до або під час виконання програми.
Також ця мова має у собі багато реалізованих класів і методів роботи з текстом, що спрощує написання подібних програм, і дає великі перспективи в подальшій модернізації програми.
1.3 Вибір середовища розробки та системи контролю версій
Середовищем розробки був вибраний вільний, кросплатформений програмний продукт Eclipse під керуванням операційної системи GNU/Linux.
Eclipse — вільне модульне інтегроване середовище розробки програмного забезпечення. Розробляється і підтримується Eclipse Foundation.
Eclipse являє собою фреймворк для розробки модульних кросс-платформових програм із низкою особливостей:
- можливість розробки програмного забезпечення на багатьох мовах програмування (рідною є Java);
- крос-платформова;
- модульна, призначена для подальшого розширення незалежним розробниками;
- з відкритим вихідним кодом;
- розробляється і підтримується фондом Eclipse, куди входять такі постачальники програмного забезпечення, як IBM, Oracle, Borland.
Спочатку проект розроблявся в IBM як корпоративний стандарт IDE, настановлений на розробки на багатьох мовах під платформи IBM. Потім проект було перейменовано на Eclipse і надано для подальшого розвитку спільноти розробників.
Eclipse, насамперед, повноцінна Java IDE, націлена на групову розробку, має засоби роботи з системами контролю версій (підтримка CVS входить у поставку Eclipse, активно розвиваються кілька варіантів SVN модулів, існує підтримка VSS та інших). З огляду на безкоштовність, у багатьох організаціях Eclipse — корпоративний стандарт для розробки програмного забезпечення на Java.
Щодо системи контролю версій був, обраний хостинг проектів з відкритим сирцевим кодом - Google Code. Це швидка, надійна і відкрита служба хостингу сирцевого коду. Хостинг проектів на Google Code дає наступні можливості:
- миттєве створення проектів на будь-яку тему;
- хостинг коду Subversion — вільна система управління версіями з об'ємом сховища в 1 гігабайт і підтримка хостингу завантажень з об'ємом сховища в 2 гігабайти;
- інтегрований перегляд вихідного коду та інструменти перевірки коду, що роблять нескладним перегляд коду, перевірку внесених до нього доповнень і підтримку високого рівня бази коду.
2 Створення навчальної програми по вивченню іноземної мови
2.1 Апаратні та програмні вимоги
Для запуску програми потрібна операційна система MSWindows або GNU / Linux та встановлене виконавче середовище Java (JRE) версії 1.6.0 і вище.
Системні вимоги до Windows:
Windows 98 (1-й і 2-й випуски);
Windows ME;
Windows NT (з пакетом оновлення 6a);
Windows 2000 (з пакетом оновлення 3);
Windows XP Home;
Windows XP Professional (з пакетом оновлень 1);
Windows 2003 Server Edition.
Крім того, у системі повинен бути встановлений процесор Pentium з тактовою частотою від 166 МГц і вище, повинно бути як мінімум 125 МБ вільного дискового простору і не менше 32 МБ оперативної пам'яті.
Системні вимоги для Linux:
Будь-який дистрибутив Linux з ядром версії 2.4 і вище та встановленим X-Window (X11), наприклад openSUSE 11.0.
Крім того, комп'ютер повинен бути оснащений процесором Pentium з тактовою частотою не менш 166 МГц і оперативною пам'яттю ємністю не менше 32 МБ. Мінімальний обсяг вільного дискового простору - 75 МБ.
В якості робочого місця для учня рекомендовано використовувати INTEL Classmate PC (рис. 1).
Рисунок 1 - Персональний комп’ютер учня Classmate PC
Персональний комп’ютер учня Classmate PC має висновок державної санітарно-епідеміологічної експертизи про відповідність вимогам діючого законодавства України.
Рішенням Комісії із засобів навчання Науково-методичної ради з питань освіти МОН України визнано Персональний комп’ютер учня Classmate PC таким, що відповідає педагогічним вимогам (протокол №3 від 10 лютого 2010 року).
Classmate PC містить наступні компоненти:
- видозмінений міні-корпус розміром 245 x 196 x 44 мм;
- ЦПУ: мобільний Intel ® Celeron M (915GMS + ICH6-M);
- тактова частота ЦПУ: 900 МГц (кеш II рівня відсутній, FSB частотою 400 МГц);
- 800 x 480 LCD-екран з діагоналлю 7 ", LED-підсвічування;
- 256 Мб ОЗП типу DDR2;
- 2 Гб флеш-пам'яті NAND, підключеної через USB;
- мережева карта 10/100 Мбіт ethernet;
- бездротовий зв'язок Wi-Fi Realtek WLAN 802.11b/gc антеною, підключена по USB;
- графічний чіп Intel GMS915 integrated graphics (використовується 8 Мб основної пам'яті;
- вбудований мікрофон;
- вбудовані стереодинаміки;
- виходи і входи для стереозвуку;
- вбудована клавіатура з додатковими функціональними кнопками;
- круглий тачпад з окремими правою і лівою кнопками;
- модифіковані нотатки з бездротовою ручкою для письма;
- TPM1.2 (Trusted Platform Module компанії Infineon Technologies AG) для захисту від розкрадання даних;
- джерела живлення: акумулятор Li-Ion (приблизно на 4 години роботи) і зовнішній блок живлення.
Програмне забезпечення
Пристрій здатний працювати як з GNU / Linux, так і з Windows XP Pro. Intel веде роботу з різними спільнотами GNU / Linux для забезпечення сумісності з їх версіями. Зокрема, була перероблена версія Mandriva.
На даний момент Classmate PC підтримують наступні дистрибутиви:
- Debian GNU / Linux;
- openSUSE;
- Ubuntu;
- DSL;
- Mandriva;
Недоліки Classmate PC:
- маленький розмір екрану;
- малий об'єм носія даних (флеш пам'яті).
Але є можливість підключити зовнішній жорсткий диск або флеш диск по USB, тим самим розширити об'єм доступної пам'яті для зберігання даних користувача.
Наведемо деякі, вже типові несправності ноутбуків.
1. Лампа підсвічування. Якщо екран почав показувати занадто темно, перестало бути видно картинку, то справа саме в лампі підсвічування. У цьому випадку треба міняти інвертор або саму лампу.
2.Мерехтіння картинки. Якщо картинка на дисплеї стала горіти не постійно, а з мерехтінням, то це означає, що відходить шлейф матриці, або несправний контролер, керуючий цієї матрицею.
3.Кольорові смуги. Якщо на екрані дисплея ви помітили тонкі кольорові смужки, або горизонтальні, або вертикальні, то треба замінити усю матрицю. Це ознака того, що відшарується шар скла.
4. Клацання всередині ноутбука. Періодичне клацання всередині ноутбука говорить про те, що треба скоріше міняти жорсткий диск.
5. Зменшился час автономної роботи. Якщо ноутбук став працювати від акумулятора всього 5-20 хвилин, то це ознака того, що акумулятор виходить з ладу. Його потрібно змінювати. Однак, для початку можна зробити пару раз «зарядку-розрядку» акумулятора. Іноді це допомагає усунути цю несправність.
2.2 Опис мови програмування Java
На сьогоднішній день створення програмного забезпечення є надзвичайно важким заняттям. Труднощі пов'язані з різноманітністю архітектури машин, операційних систем, графічних оболонок і т.д.. Крім того, ваші додатки повинні працювати в розподілених системах.
Стрімке зростання технологій, пов'язаних з Інтернетом, WWW і “електронною комерцією”, додатково ускладнюють це завдання. Модний нині об'єктно-орієнтований підхід сам по собі не вирішує цих проблем, більш того, часто привносить нові.
Пропонований фірмою Sun Microsystems підхід, а саме система програмування на основі мови Java(ТМ) володіє наступними характеристиками:
- мова програмування об'єктно-орієнтована, в той же час досить проста для освоєння;
- цикл розробки програм скорочений за рахунок того, що система побудована на основі інтерпретатора;
- додаток виходить автоматично переносимим між безліччю платформ і операційних систем;
- за рахунок вбудованої системи збірки сміття програміст звільняється від необхідності явного управління пам'яттю;
- в інтерактивній графічній програмі вдається досягти високої продуктивності (швидкого відгуку на введення користувача) за рахунок вбудованої в систему багатопотоковості;
- програма легко супроводжується і модифікується, оскільки модулі можуть бути завантажені з мережі;
- в програму вбудована система безпеки, що не допускає незаконного доступу і проникнення вірусів.
Метою проекту Java було створення невеликої, надійної, переносимої і розподіленої системи реального часу. На початку планувалося використання мови програмування С++, але поступово пов'язані з цим труднощі привели до необхідності створення нової мови.
Система повинна була увібрати в себе кращі риси з безлічі сучасних систем програмування: Eiffel, Smalltalk, Objective C, Cedar/Mesa і т.д..
Стрімке зростання мережевих технологій привело до необхідності нового погляду на процес створення і розподілу програм. Сучасні програми повинні бути безпечні, високопродуктивні, працювати в розподіленому середовищі на безлічі машин різної архітектури.
Вимоги до переносимості примусили відмовитися від традиційного способу створення і доставки бінарних файлів, що містять машинні коди і, отже, прив'язаних до певної платформи. Сьогодні, щоб вижити в цих джунглях архітектури процесорів, операційних систем і графічних оболонок, програма повинна бути нейтральною до архітектури і динамічно настроюватись.
Створена система розробки Java задовольняє всім цим вимогам:
- проста, тому може бути використана широким колом розробників;
- об'єктно орієнтована, що відповідає сучасному погляду на програмування;
- підтримує багатопотоковість, що дозволяє виконувати декілька завдань одночасно;
- інтерпретіруєма, що забезпечує переносимість і покращує динамічні властивості.
Розглянемо кожну з цих властивостей окремо.
Система Java створена на основі простої мови програмування, техніка використання якої близька до загальноприйнятої і вивчення якої не вимагає значних зусиль.
Java як мова програмування є об'єктно-орієнтованою з моменту створення. Крім того, програміст із самого початку забезпечується набором стандартних бібліотек, що забезпечують функціональність від стандартного введення/виведення і мережевих протоколів до графічних призначених для користувача інтерфейсів. Ці бібліотеки легко можуть бути розширені.
Не дивлячись на те, що мова С++ була знехтувана, синтаксис мови Java максимально наближений до синтаксису С++. Це робить мову знайомою широкому колу програмістів. В той же час з мови було видалено багато властивостей, які роблять С++ зайве складною для користування, не будучи абсолютно необхідними. В результаті мова Java вийшла простішою і більш органічною, ніж С++.
Java істотно полегшує створення надійного програмного забезпечення. Окрім вичерпної перевірки на етапі компіляції, система передбачається аналіз на етапі виконання. Сама мова спроектована так, щоб виробляти у програміста звичку писати правильно.
Модель роботи з пам'яттю, в якій виключено використання покажчиків, робить неможливим цілий клас помилок, характерних для С і С++.
Через те, що Java призначена для роботи в розподіленому середовищі, безпека стає надзвичайно важливою проблемою. Вимоги безпеки визначають багато рис як мови, так і реалізації всієї системи.
Компілятор Java проводить байт-коди, тобто модулі додатку мають не-залежний формат, який може бути проінтерпретований на безлічі різноманітних платформ. Це вже не початкові тексти, але ще не платформно-залежні машинні коди.
Наступний крок — “заморожування” стандарту на формат основних вбудованих типів даних. Програма, створена на одній платформі, працює на всіх інших.
Цей стандарт фіксований в документі, Java Virtual Machine. Стандарт може бути реалізований на будь-якій апаратно-програмній платформі, що підтримує багатопотоковість.
Схема роботи системи і набір байт-кодів віртуальної машини Java такі, що дозволяють досягти високої продуктивності на етапі виконання програми:
- аналіз кодів на дотримання правил безпеки проводиться один раз до запуску кодів на виконання, у момент виконання таких перевірок вже не потрібно, і коди виконуються максимально ефективно;
- робота з базовими типами максимально ефективна, для операцій з ними зарезервовані спеціальні байт-коди;
- методи в класах не обов'язково зв'язуються динамічно;
- автоматичний збирач сміття працює окремим фоновим потоком, не уповільнюючи основну роботу програми, але в той же час забезпечуючи своєчасне повернення вільної пам'яті в систему;
- стандарт передбачає можливість написання критичних по продуктивності ділянок програми в машинних кодах.
Природа мови, що інтерпретується, дозволяє зробити фазу лінкування простою, інкрементальною і, отже, швидкою. Це різко скорочує цикл розробки і тестування програмних фрагментів.
Багатопотоковість дозволяє виконувати в рамках однієї програми декілька завдань одночасно. Це стає особливо актуально в сучасних розподілених програмах, коли процеси мережевого обміну можуть йти одночасно і асинхронно. При цьому програма продовжує реагувати на введення інформації користувачем без неприємних затримок.
Багатопотоковість підтримується на рівні мови — частина примітивів синхронізації вбудована в систему реального часу, а бібліотека містить базовий клас Thread. До того ж системні бібліотеки написані thread-safe, тобто всі вони можуть бути використані в багатопотокових додатках.
Система забезпечує динамічну збірку програми. Класи підвантажуються в міру необхідності, причому завантажені вони можуть бути з будь-якої точки мережі, що дозволяє зробити внесення змін до програм прозорим для користувача. Користувач може бути впевнений, що завжди працює з свіжою версією програми.
Досвід показує, що відсутність стандартних базових бібліотек для мови С++ надзвичайно ускладнює роботу з нею. Внаслідок того, що будь-яка нетривіальна програма вимагає наявність деякого набору базових класів, розробникам доводиться користуватися різними несумісними між собою бібліотеками або писати свій власний варіант такого набору.
Все це ускладнює як розробку, так і подальшу підтримку програми, утрудняє стиковку програм, написаних різними людьми.
Повна система Java включає готовий набір бібліотек, який можна розбити на наступні пакети:
java.lang — базовий набір типів, відображених в самій мові; цей пакет обов'язково входить до складу будь-якої програми; містить описи класів Object і Class, а також підтримку багатопотоковості, виняткових ситуацій, оболонку для базових типів, а також деякі фундаментальні класи;
java.io — потоки і файли довільного доступу; аналог бібліотеки стандартного введення-виведення системи UNIX; підтримка мережевого доступу (sockets, telnet, URL) міститься в пакеті java.net;
java.util — класи-контейнери (Dictionary, HashTable, Stack) і деякі інші утиліти; кодування і декодування. Класи Date і Time;
java.awt — Abstract Windowing Toolkit, незалежний віконний інтерфейс, що дозволяє запускати інтерактивні віконні Java-програми на будь-якій платформі; містить базові компоненти інтерфейсу, такі як події, кольори, шрифти, а також основні віконні елементи — кнопки, scrollbars і т.п..
Результат — новий підхід до розподілених обчислень.
Кожна з перерахованих характеристик окремо може бути знайдена в уже існуючих програмних пакетах. Новим є з'єднання їх в струнку несуперечливу систему, яка повинна стати загальним стандартом.
На сьогоднішній день найбільш популярними мовами програмування є С і С++. З них двох лише С++ претендує на об'єктну орієнтацію. Характеристики цієї мови складалися в ході довгої історії її розвитку, причому досить хаотично, кожна нова властивість не відміняла всіх попередніх. Стандарт мови до цих пір не зафіксований, оскільки нові властивості продовжують з'являтися до цього дня.
В результаті С++ стала нескінченно складною і надмірною — одну і ту ж операцію можливо реалізувати на мові безліччю способів.
Java є новою точкою відліку в програмному забезпеченні. Розробники мови узяли за основу С++, потім методично видалили з нього риси, які:
- роблять неможливим контроль безпеки додатків;
- не є абсолютно необхідними, частіше заважають програмістові, чим полегшують його завдання;
- є джерелом складних і пізно розпізнаваних помилок.
В той же час в мові Java повністю збережений “дух” програмування на С++, досвідченим С++ - програмістам буде потрібно один-два тижні на освоєння самої мови, а величезний об'єм програмного забезпечення, вже створеного з використанням С++, може бути адаптований під нову мову відносно легко.
У мові Java, так само як і в С++, існує набір вбудованих типів даних, які (так само як і в С++) не є об'єктами. Набір їх також схожий з набором базових типів С++ за деякими виключеннями.
Numeric - характерною відмінністю від С++ є те, що бінарне представлення чисел відтепер фіксоване:
- цілі числа: 8-бит byte, 16-бит short, 32-бит int, 64-бит long; всі числа із знаком, ключ unsigned з мови видалені;
- числа з плаваючою крапкою; 32-біт float, 64-біт double; подання повинне відповідати стандарту IEEE 754.
Character - відрізняються від С++ як синтаксисом, так і уявленням. Тип character є 16-розрядне число без знаку (діапазон 0-65,535). Кодування відповідає стандарту Unicode. Внаслідок того, що це кодування в ідеалі повинне охоплювати всі мови, що існують в світі, це уявлення повинне полегшити локалізацію програм.
Boolean - тип даних не виділений в С++, проте неявно присутній практично у всіх програмах. У Java тип називається boolean, може приймати значення true і false і не може (на відміну від С++) бути перетворений в інший тип.
Доданий новий оператор >>> логічного зсуву управо (так як немає беззнакових цілих чисел). Вбудована операція злиття рядків (оператор +).
На відмінність від С++ масиви в Java є повноцінними об'єктами з певним runtime уявленням. Декларація:
- Point myPoints[]; резервує посилання на масив, а не місце під реальний об'єкт; сам масив може бути потім створений виконанням;
- myPoints = new Point[10]; а його елементи заповнені операцією типу: myPoints[2]= new Point(); розмір масиву може бути отриманий під час виконання програми: howMany = myPoints.length;
Значення індексу перевіряється при кожному зверненні, при помилці викликається виняткова ситуація.
Покажчики повністю виключені з мови разом з цілою категорією важко вловимих помилок “сповільненої дії”. До того ж наявність покажчиків суперечить вимогам безпеки і ускладнює реалізацію складальника сміття.
Рядки Strings в Java є повноцінними об'єктами. Вони діляться на текстові константи (Strings) і рядки, що модифікуються (StringBuffer). Компілятор дозволяє явно визначати текстові літерали в програмі подібно до того, як це робиться в С++.
String hello = “Hello world!”; Посилання hello ініціюється об'єктом класу String на основі представлення “Hello world!” у кодуванні Unicode.
Оператор “+” може бути застосований до рядків, наприклад: System.out.println(”There are” + num + “characters in the file.”);
В Java відсутній вираз goto. Аналіз С/С++ текстів показав, що переважне число випадків використання цього оператора пов'язане з необхідністю виходу з вкладеного циклу. Для відлагодження таких ситуацій в Java перед початком блоку може ставитися мітка, а інструкції break і continue також можуть супроводжуватися міткою, на яку повинен бути здійснений перехід. Наприклад: test: for(int i = 0; i < 10; i++) for(int j = 0; j < 10; j++) if( i > 3) break test;
Необхідність явно управляти пам'яттю в С/С++ програмах завжди була проблемою для програмістів. Мало того, що самі програми рясніли викликами функції free або операторами delete, безпосередньо до логіки програми вони відношення не мають.
Помилки, не пов'язані зі звільненням пам'яті або навпаки, з видаленням вже одного разу видалених об'єктів, відносяться до категорії помилок найбільш важких для виявлення і виправлення.
Java повністю знімає цю турботу з програміста. Автоматичний збиральник сміття зобов'язаний бути вбудований в run-time системи. Пам'ять об'єктів, на які більше немає посилань, врешті-решт повертається в систему.
Досвід показує, що не дивлячись на відносну складність збиральників сміття, продуктивність системи в цілому може опинитися не менше, а часто і більше, ніж при явному звільненні пам'яті програмою.
Одна з переваг того, що Java-програми багатопотокові, полягає в тому, що збірка сміття може проводитися у фоновому потоці. Цей потік має менший пріоритет виконання, чим інші, тому система завжди готова відповісти на дії користувача, відсутні “періоди бездіяльності”, в які проводиться тільки збірка сміття.
З іншого боку, паузи в операціях користувача збиральник сміття може використовувати для своєї роботи, забезпечуючи наявність вільної пам'яті в моменти, коли це необхідно.
Java підтримує багатопотоковість не тільки на рівні бібліотек, але і на рівні самої мови, що значно полегшує побудову додатків, що надійно працюють в багатопотоковому режимі.
Конструкція typedef була успадкована С++ з С. Із Java вона викинута зовсім.
Необхідність в макропроцесорі також багато в чому відпала при написанні програм на С++. Майже все, для чого використовувалися макророзширення, можна було зробити елегантнішим і надійнішим чином, використовуючи конструкції самої мови.
Система неявно заохочувала створення кожним програмістом своєї власної підмножини мови, невідомої решті світу. У міру розростання кодів збільшується той смисловий контекст, в якому компілятор інтерпретує кожен рядок програми. Вже в проектах середнього розміру істотно зростає навантаження на компілятор, не говорячи вже про навантаження на пам'ять програміста.
Єдина важлива функція препроцесора, що залишилася — дозволити включення в програму файлів-заголовків з описами класів. Ця операція може бути виконана просто і ефективно, якщо дозволити компілятору читати підготовлені бінарні файли з описом класів. Останній напрямок був вибраний при створенні мови Java.
Всі ці міркування дозволили повністю виключити необхідність використання текстового препроцесора в мові Java.
Структури struct і union не мають сенсу в Java, їх роль повністю виконують класи. Використання конструкцій типу union для типізованих об'єктів також більше не потрібне — мова дозволяє визначити тип об'єкту при виконанні програми.
В цьому сенсі Java чисто об'єктно-орієнтована система. Функції і процедури, не прив'язані до контексту якого-небудь об'єкту, більше не присутні в системі. За ситуації, коли функція логічно не прив'язана до певного екземпляра класу, вона може бути створена як метод самого класу (тобто мати тип static).
Послідовна реалізація концепції множинного наслідування в С++ привела до істотних труднощів як в створенні компіляторів, так і у використанні його (множинного наслідування) в програмах. Як альтернатива Java використовує поняття інтерфейсу, що визначає набір методів, які повинні бути визначені в класі, що реалізовує цей інтерфейс.
Інтерфейс може також містити визначення деяких констант.
Те, чого інтерфейс містити не може, — це реалізації методів або змінні поля даних. Класи, які оголошені, що реалізують той або інший інтерфейс, зобов'язані реалізувати всі методи, оголошені в інтерфейсі.
Досвід використання перевантажених операторів в С++ показує, що вони мають сенс в досить обмеженому наборі ситуацій. З іншого боку, зловживання цією властивістю може зробити програму абсолютно незрозумілою. Єдине “вбудоване” в мову Java виключення — можливість використання оператора “+” для склеювання рядків.
В мові Java заборонено автоматичне перетворення типів, широко використовуване (і рекомендоване) в С++. Щоб перетворити елемент одного типу в іншій, необхідно вказати це явно, наприклад: int myInt; double myFloat = 3.14159; myInt = myFloat; // допустимо в С++, неприпустимо в Java myInt = (int)myFloat; // допустимо в Java. Виняток становить перетворення між вбудованими чисельними типами без втрати інформації.
Більшість досліджень показали, що застосування покажчиків в С/С++ є одним з основних джерел помилок. Внаслідок того, що в мові більше не стало структур, а масиви і рядки перетворилися на повноцінні об'єкти, потреба в покажчиках відпала.
Вміст рядків і масивів доступно тільки по індексах, причому контроль доступу під час виконання не дозволяє виходити за межі масиву або рядка.
Отже, ми показали дві з основних властивостей мови програмування Java:
- знайомий — Java зберігає стиль програмування C і С++;
- простий — кількість конструкцій мови в Java істотно скорочена в порівнянні із С і С++;
Система Java створювалася об'єктною орієнтованою із самого початку. Об'єктно-орієнтована парадигма найбільш зручна при створенні програмного забезпечення типу клієнт-сервер, а також для організації розподілених обчислень.
Одна з рис, властивих об'єктам, полягає в тому, що об'єкти зазвичай переживають процедуру, що їх створює. Вони потім можуть переміщатися по мережі, зберігатися в базах даних і т.д.
Ідейними спадкоємцями Java є такі мови, як C++, Eiffel, Smalltalk і Objective C. За винятком примітивних типів даних, практично все в мові є об'єктом.
Основні вимоги до об'єктно-орієнтованої системи:
- інкапсуляція — захована реалізація за абстрактним інтерфейсом;
- поліморфізм — одне і те ж повідомлення, послане різним об'єктам, приводить до виконання різних операцій;
- спадкоємство — нові класи можуть успадковувати дані і функціональність вже існуючих класів;
- динамічне скріплення — нові класи можуть з'являтися в системі звідки завгодно, у тому числі і з мережі. Необхідно мати можливість динамічно включати їх в систему.
Клас є мовна конструкція, що визначає поля даних об'єктів даного класу (instance variables) і їх поведінку (methods). Практично клас в Java сам по собі не є об'єктом. Це лише шаблон, який визначає, з яких частин складатиметься об'єкт, створений за допомогою цього класу, і як він поводитиметься.
Простий приклад опису класу:
class Point extends Object { public double x; public double у; }
Створити об'єкт описаного вище класу можна декларацією: Point myPoint; // оголошення змінної типа Point myPoint = new Point(); myPoint.x = 10.0; myPoint.y = 25.7;.
При оголошенні класу можливо вказати методи спеціального вигляду, названі конструкторами і призначені для ініціалізації створеного об'єкту. Ім'я цих методів повинне співпадати з ім'ям класу, вони можуть мати певну кількість аргументів, наприклад: class Point extends Object { Point() { x = 0.0; у = 0.0; } Point(double x, double у) { this.x = x; this.y = у; } public double x; public double у; }, а використані вони можуть бути таким чином: Point а; Point b; а = new Point(); b = new Point(1.0, 2.0); - ім'я this у визначенні конструктора з аргументами використовується для позначення самого об'єкту, в методі якого ми знаходимося, в тих випадках, коли посилання на цей об'єкт не є явним.
Якщо один об'єкт в програмі примушує інший виконувати якусь операцію, то прийнято говорити, що він посилає повідомлення іншому об'єкту. Наприклад, ми можемо перевизначити наш клас таким чином: Pclass Point extends Object { private double x; private double у; public void setX(double x) { this.x = x; } public void setН(double у) { this.y = у; }… }. Ми тепер зробили поля x і у недоступними ззовні класу, але для зміни їх стану передбачили спеціальні методи setX і setY.
Спеціальне ім'я finalize зарезервоване для методу, який буде викликаний збирачем сміття перед тим, як об'єкт буде знищений. Внаслідок того, що Java звільняє нас від необхідності самим стежити за звільненням пам'яті, займаної об'єктами, необхідність в таких методах зазвичай виникає лише тоді, коли треба звільнити якісь зовнішні ресурси, наприклад, закрити відкритий файл: protected void finalize() { try { file.close(); } catch (Exception e) { } }.
Спадкоємство класів дозволяє створювати нові типи об'єктів, що ефективно використовують функціональність вже існуючих типів. Новий тип зазвичай називається похідним класом, а той, чиї властивості успадковуються, — базовим класом.
Наприклад, ми можемо описати новий клас, відповідний координатам точки в тривимірному просторі, на основі вже описаного класу для точки на площині: class ThreePoint extends Point { protected double z; ThreePoint() { super(); z = 0.0; } ThreePoint(double x, double у, double z) { super(x, у); this.z = z; }}. Тут ми додали нову координату z, а поля x і у (і методи доступу до них) успадкували від класу Point.
Контроль доступу до даних і методів об'єкту в Java дещо відрізняється від С++. Крім трьох рівнів доступу, наявних в С++ (public, private, protected) є четвертий, такий, що знаходиться десь між рівнями public і protected. Він не має імені і використовується за умовчанням, коли явно не вказаний інший рівень. Поля цього типу доступні всередині тільки одного програмного пакету.
Пакет представляє групу класів, об'єднаних в одну логічну групу. Наприклад, класи, що описують точку і прямокутник в графічному пакеті, можуть мати прямий доступ до полів даних один одного, заборонений зазвичай для решти середовища.
Також слід зазначити, що контроль доступу в C++ допомагає програмістові лише при побудові програми. Відмінності між полями, поміченими public і private, відсутні у виконуваному модулі, створеному з використанням цієї мови. У Java контроль доступу реальний, оскільки він здійснюється не тільки при компіляції, але і безпосередньо перед запуском кодів на виконання віртуальною машиною.
Як і С++ мова Java дозволяє використовувати змінні і методи, що належать класу цілком. Для визначення їх використовується ключове слово static. Природно, що методи самого класу не можуть оперувати даними і методами об'єкту класу, оскільки вони не відносяться ні до якогось певного об'єкту.
Наприклад, версія реалізації класу Rectangle може бути задана таким чином: class Rectangle extends Object { static final int version = 2 ; static final int revision = 0 ; } Ключове слово final означає, що значення поля остаточне і зміні не підлягає (це константа).
Абстрактні методи — це методи, для яких в даному класі не визначена їх реалізація. Ми указуємо лише на необхідність наявності методів з даним протоколом. Конкретна реалізація повинна бути здійснена класами-спадкоємцями. В той же час інша, “неабстрактна” частина класу може містити конкретну інформацію, яка може бути використана похідними класами. Наприклад: abstract class Graphical extends Object { protected Point lowerLeft; protected Point upperRight; … public void setPosition(Point ll, Point ur) { lowerLeft = ll; upperRight = ur; } abstract void drawMyself(); } class Rectangle extends Graphical { void drawMyself() { …. } } Тут ми описали клас Graphical.
У ньому оголошена властивість всіх графічних елементів мати якесь положення на площині. Кожен елемент зобов'язаний також мати метод для малювання самого себе, проте ніякого методу малювання за замовчуванням бути не може. Клас Rectangle, що є конкретною реалізацією для типа Graphical, реалізує також цей метод для об'єкту прямокутної форми.
Клас, що містить хоч би один абстрактний метод, повинен бути оголошений як абстрактний. Із зрозумілих причин створення екземплярів такого класу неможливе.
Таким чином ми висвітили наступні сторони Java як об'єктно-орієнтованої мови програмування:
- класи визначають шаблон, по якому створюються конкретні об'єкти;
- поля даних об'єкту визначають стан об'єкту;
- об'єкти обмінюються повідомленнями між собою; отримання повідомлення приводить до виклику одного з методів;
- методи визначають поведінку об'єкту даного класу; методи для різних класів можуть мати одне і те-ж ім'я, але різний зміст;
- не залежна від архітектури, переносима і інтелектуальна;
Це досягається перш за все стандартизацією “бінарного формату кодів”. Проміжний код не залежить від конкретної апаратної платформи, операційної системи і типу віконного інтерфейсу. Для того, щоб програми, написані на Java, могли працювати на даній апаратно-програмній платформі, достатньо, щоб для неї була створена лише відповідна віртуальна машина.
Компілятор Java проводить не “машинні коди” подібно до того, як це робить, наприклад, компілятор мови С. Замість цього генеруються так звані байт-коди: високорівневі, машинонезалежні коди для абстрактної машини, яка повинна бути реалізована у вигляді інтерпретатора Java і run-time системи.
Сама по собі ідея байт-кодів не нова, вони широко використовуються в різних системах починаючи з середини сімдесятих років. Особливості Java байт-машини наступні:
- набір її кодів легко не тільки інтерпретувати, але і ефективно скомпілювати “на льоту” безпосередньо в машинні коди для будь-якої сучасної апаратної платформи;
- коди містять додаткову інформацію, яка дозволяє перевірити їх на безпеку виконання.
Окрім незалежності кодів від конкретної архітектури, Java жорстко специфікує формат базових типів даних. Без цього одна і та ж програма, скомпільована для різних апаратних платформ, поводилася б по-різному. Наприклад, стандарт С/С++ не передбачає конкретного уявлення для цілого типу int. Передбачається, що цьому типу відповідає основний формат машинного слова для даної архітектури. В результаті програма, написана для 32-розрядного процесора, найчастіше переноситься на 16-розрядну архітектуру з дуже великими зусиллями.
Таким чином, рішення зафіксувати формати базових типів даних в Java цілком природне. Кожна Java-машина зобов'язана реалізувати їх таким чином: byte 8-bit two's complement short 16-bit two's complement int 32-bit two's complement long 64-bit two's complement float 32-bit IEEE 754 floating point double 64-bit IEEE 754 floating point char 16-bit Unicode character. Вибір саме такого набору базових типів і їх формату обумовлений тим, що практично будь-який сучасний центральний процесор підтримує ці формати.
Більш того, перенесення самого середовища може бути здійснене досить просто. Компілятор Java сам написаний на цій мові. Віртуальна машина написана на ANSI C відповідно до стандарту POSIX. Специфікація мови не містить посилань типу “залежно від конкретної реалізації”.
Система Java призначена для створення програмного забезпечення, яке повинне бути інтелектуальним, дуже надійним і безпечним по безлічі параметрів. Особлива увага приділяється як ранній діагностиці можливих проблем, так і пізніше, під час виконання кодів.
Компіляція з мови Java передбачає жорстку перевірку початкових текстів, безліч помилок може бути виявлено вже на цьому етапі.
Однією з переваг мови С++ як строго типізованої мови є можливість раннього виявлення деяких категорій помилок. Проте багато в чому ця мова успадковує властивості С, дозволяючи порушувати вимоги строгого оголошення функцій і методів. Мова Java вимагає явного оголошення прототипів і не підтримує характерних для С неявних перетворень.
Значне число перевірок, зроблених компілятором, повторюється віртуальною машиною безпосередньо перед виконанням програми. Лінкер отримує всю інформацію про прототипи методів і на основі її проводить таку ж перевірку, як і компілятор, дозволяючи уникнути розбіжностей у версіях між окремими модулями.
Найбільш істотна відмінність мови Java від С або С++ полягає в тому, що архітектура Java не дозволяє випадково або навмисно пошкодити пам'ять програми. Замість арифметики покажчиків Java використовує повноцінні об'єкти для масивів і рядків, що дозволяє контролювати індекси доступу до них під час виконання. Крім того, неможливі перетворення між цілими числами і покажчиками.
Природно, що все це не може повністю гарантувати програміста від будь-яких помилок, проте, Java усуває цілий клас їх, істотно полегшуючи завдання розробника.
2.3 Опис розробленої програми для вивчення
Іноземної мови
Структура шляхів
Структура директорій програми:
.
|-- lessons
| |-- first
| |-- second
| `-- test
|-- results.txt
|-- run.bat
|-- run.sh
`-- small.jar
Тут lessons — директорія, в якій знаходяться директорії з уроками. results.txt файл з результатами тестів, run.bat — пакетний файл для запуску програми в операційній системі MSWindows; run.sh — пакетний файл для запуску програми в операційній системі GNU/ Linux; small.jar — це Java архів з програмою, являє собою звичайний ZIP-архів, у якому міститься частина програми на мові Java.
Структура директорії тестом:
.
|-- images
|-- sounds
`-- words.csv
Тут каталог image містить фонові малюнки для слів тесту в форматі jpg з ім'ям співпадаючим зі словом в тесті.
Каталог sounds містить фонограми вимови для слів тесту в форматі wav з ім'ям співпадаючим зі словом в тесті.
Файл words.csv містить данні через ";" для тесту: такі, як тестове слово, слово з символом "_" замість пропущених букв, переклад та час в секундах, відведених на дане слово (якщо час 0 або відсутній, то таймер не вмикається).
Приклад: test;t_st;Тест;60
Структура каталогу с тестом first:
first
|-- images
| |-- apple.jpg
| |-- bear.jpg
| |-- bird.jpg
| |-- cat.jpg
| |-- clock.jpg
| |-- cloud.jpg
| |-- dog.jpg
| |-- doll.jpg
| |-- door.jpg
| `-- tree.jpg
|-- sounds
| |-- apple.wav
| |-- bear.wav
| |-- bird.wav
| |-- cat.wav
| |-- clock.wav
| |-- cloud.wav
| |-- dog.wav
| |-- doll.wav
| |-- door.wav
| `-- tree.wav
`-- words.csv
Вміст файлу words.csv директорії first:
apple;ap__e;Яблуко;60
cat;c_t;Кішка
dog;d_g;Собака;50
doll;d_ll;Лялька;0
tree;tre_;Дерево;40
door;d__r;Двері;30
clock;clo__;Годиник;30
bird;b_rd;Птах;20
cloud;cl__d;Хмара;20
bear;b__r;Ведмідь;10
Алгоритм програми
Запуск програми на платформі Windows здійснюється запуском пакетного файлу "run.bat". Зміст файлу run.bat:
@echo off
start javaw.exe -jar small.jar
Запуск програми на платформі GNU/Linux здійснюється запуском пакетного файлу "run.sh". Зміст файлу run.sh:
#!/bin/sh
java -jar small.jar $@
Також в обох платформах можна запустить програму, натиснувши на small.jar із провідника файлів. Але це подіє тільки у випадку якщо jar файли асоційовані в системі з віртуальною машиною Java.
Після передачі jar файлу віртуальній машині Java на виконання, в класі Main викликається метод main(), із якого викликається метод doLogin() і створюється об'єкт login класу Login, відповідальний за створення вікна входу в програму, запит імені користувача, пошук існуючих тестів в директорії програми методом Scan() класу Login та вибір тесту користувачем (рис. 2).
Рисунок 2 - Вікно входу в програму
Метод Scan() виконує пошук в директорії lessons і шукає там піддиректорії, які містять в собі файл words.csv:
public void Scan(String d){
File dir = new File(d);
String[] files = dir.list();
for(int i=0;i<files.length;i++){
if(new File(d+"/"+files[i].toString()+"/"+Main.ftxt).exists()) {
addL(files[i].toString());
}
}
}
Тут Main.ftxt - константа, описана в класи Main:
final static String ftxt = "words.csv";
Після вводу ім'я користувача в відповідну форму в вікні, вибір тесту (рис. 3) та натиснені кнопки входу, усі данні передаються в клас Main методом setEnv(), а вікно об'єкта login знищується.
Рисунок 3 — Вибір із існуючих уроків
Метод setEnv() класу Main викликає метод doTest(), який створює об'єкт test класу Test:
public static void setEnv(String n,String l){
name = n;
less = l;
login = null;
doTest();
}
Тут поле name - ім'я користувача, less - шлях до директорії вибраного тесту.
Клас Test відповідає за створення основного вікна програми, всіх елементів управління та взаємодії з користувачем, вивід інформації на екран: текст та картинки. Також клас Test відповідає за зчитування клавіш, натиснутих користувачем.
static void doTest(){
test = new Test();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
test.getJFrame().setVisible(true);
}
});
words = new Words(workdir,lessdir+less+"/",name,ftxt);
}
Також в методи doTest() створюються об'єкт words класу Words, який містить методи обробки тестів. Також клас Words містить методи роботи з файлами, наприклад метод парсингу файла words.csv:
void readFiles(){
File f= new File(workdir+ldir+ftxt);
String[] sbuff;
n=0;
try {
BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(f), Main.iocharset));
try {
String line = null;
while (( line = input.readLine()) != null){
sbuff = line.split("[ ";,t]+");
// Слово з пропущеними літерами
try {
word_test[n] = sbuff[1].toUpperCase();
} catch(ArrayIndexOutOfBoundsException e){
word_test[n]=sbuff[0].toUpperCase();
}
// Переклад слова
try {
word_rus[n] = sbuff[2];
} catch(ArrayIndexOutOfBoundsException e){
word_rus[n]="";
}
// Картинка
try{
image[n] = ldir+imgdir+sbuff[0]+".jpg";
} catch(ArrayIndexOutOfBoundsException e){
image[n]=defimg;
}
// Звук (вимова)
try{
wav[n] = ldir+snddir+sbuff[0]+".wav";
} catch(ArrayIndexOutOfBoundsException e){
wav[n]=defwav;
}
// Час на тест
try{
time[n] = Integer.parseInt(sbuff[3]);
} catch(ArrayIndexOutOfBoundsException e){
time[n]= 0;
}
// Слово
try {
word_orig[n] = sbuff[0].toUpperCase();
} finally {
n++;
}
}
}
finally {
input.close();
}
}
catch (IOException ex){
ex.printStackTrace();
}
}
Після чого програма чекає натиснення кнопки "Розпочати тест" (рис. 4).
Рисунок 4 - Вікно привітання
Коли тест розпочато і для даного слова є обмеження по часу, вмикається таймер реалізований об'єктом timer класу Timer. По закінченні часу об'єкт timer викликає метод Main.test.Click(), цей же метод викликається, коли користувач натискає кнопку "Дати відповідь" або клавішу Enter на клавіатурі.
Метод Main.test.Click() викликає приватний метод doClick() об'єкта test. Він перевіряє чи є ще тести в списку і, якщо нема, викликаєтеся метод doSumary(), який видає результат тесту на екран та записує їх в файл results.txt.
За вивід голосових підказок (звуку в форматі wav) відповідає клас Wave.
Рисунок 5 —
Елементи управління тестом
На рисунку 5 зображенні елементи управління та взаємодії тесту:
1 — екран візуального зображення слова; якщо файл з картинкою відсутній, то буде показаний логотип програми;
2 — поле відповіді; в сірих квадратиках літери, які відомі; в білих, які треба вписати; ввід літери здійснюється з клавіатури; вибір та навігація здійснюється курсором миші та стрілками на клавіатурі, також працює клавіша “Backspace” та можна обрати букву, натиснувши на цифру на клавіатурі, відповідну тій, яка написана над квадратиком маленьким шрифтом;
3 — кнопка відповіді та переходу до наступного тесту; аналогічну функцію виконує клавіша “Enter” на клавіатурі;
4 — таймер зворотнього відліку у секундах; по закінченню відліку виконується функція, аналогічна натисненню кнопки 3;
5 — переклад слова;
6 — кнопка голосової (звукової) підказки; якщо звукового файлу не знайдено, кнопка не зображується;
7 — порядковій номер тесту.
Розглянемо порядок роботи з текстом.
Дамо відповідь на перший тест (рис. 6). Натискаємо на клавіатурі клавіші “p” та “l” англійської розкладки, на українську розкладку клавіатури програма не реагує.
Рисунок 6 — відповідь на перший тест
Натискаємо “Enter” або кнопку “Дати відповідь” і тестування переходить до другого тесту.
На другий тест навмисно відповімо невірно (рис. 7). Замість літери “A” запишемо “O”. Це нам потрібно для перевірки роботи алгоритму оцінювання.
Рисунок 7 — Навмисно не вірна відповідь на тест 2
Далі відповідаємо вірно на тести від 3 до 10, всього в уроці “first” 10 тестових слів (тестів).
На третій тест правильна відповідь слово “DOG”, зображена на рисунку 8.
Рисунок 8 — Відповідь на третій тест
У вікні тесту номер 4 відсутній таймер (рис. 8), також відсутній таймер в тесті 2. Це означає що тест буде очікувати відповіді доти, доки не буде натиснена кнопка “Дати відповідь” або клавіша “Enter” на клавіатурі. Це сталось завдяки тому, що в рядках файлу words.csv відсутнє або дорівнює 0 значення в 4-й колонці: cat;c_t;Кішка — другий тест, та doll;d_ll;Лялька;0 — четвертий тест.
Відповідь на тест номер 4 - “DOLL”.
Рисунок 9 — відповідь на четвертий тест
Дамо відповіді на тести, що залишилися:
- відповідь на тест 5 “TREE”;
- відповідь на тест 6 “DOOR”;
- відповідь на тест 7 “CLOCK”;
- відповідь на тест 8 “BIRD”;
- відповідь на тест 9 “CLOUD”;
- відповідь на тест 10 “BEAR”.
По закінченню тестування на екран видається результат тестування, як показано на рисунку 10.
Рисунок 10 — Результати тестування
У результати тестування входять такі пункти:
- прізвище та ім'я тестованого учня;
- назва уроку;
- загальне число балів, яке дорівнює кількості невідомих літер у всіх тестах, та кількість правильно названих літер у всіх тестах;
- процент успішності відповіді, який вираховується по формулі “100 ділити на кількість невідомих літер та помножити на кількість правильно названих літер” в методі,getProcent класу Words та округлюється до цілого за допомогою класу BigDecimal:
int getProcent() {
double pr;
pr = (100.00 / all) * all_clear;
BigDecimal x = new BigDecimal(pr);
return x.setScale(0, BigDecimal.ROUND_HALF_DOWN
).intValue();
};
- оцінка в балах от 2 до 5, яка вираховується в залежності від проценту успішності в методі getBale() класу Words:
int getBale() {
float procent;
procent = getProcent();
if(procent<50){
return 2;
} else
if (procent<=75) {
return 3;
} else
if (procent<=95){
return 4;
} else
if (procent>95) {
return 5;
} else {
return -1;
}
}
При проценті менше 50% - оцінка 2, від 50% до 75% оцінка 3, від 75% до 95% оцінка 4, 95% і більше оцінка 5;
- виводиться таблиця, в якій перший стовпець це номер тесту, другий — вірне слово, третій — введене користувачем слово.
Також всі результати дописуються (без стирання попередніх результатів тестування інших учнів) в файл results.txt для наступного перегляду їх вчителем, в такому форматі:
Результати тестування Махно Марія (урок lessons/first/):
Загальне число балів 14 из 15.
Оцінка: 4 (93% успіху)
Тест №1 слово APPLE написано як APPLE
Тест №2 слово CAT написано як COT
Тест №3 слово DOG написано як DOG
Тест №4 слово DOLL написано як DOLL
Тест №5 слово TREE написано як TREE
Тест №6 слово DOOR написано як DOOR
Тест №7 слово CLOCK написано як CLOCK
Тест №8 слово BIRD написано як BIRD
Тест №9 слово CLOUD написано як CLOUD
Тест №10 слово BEAR написано як BEAR
Для завершення програми достатньо натиснути кнопку “Вихід”, або скористатись функціоналом операційної системи і закрити вікно.
3.4 З а х о д и п о о б с л у г о в у в а н н ю п р о г р а м и
Всі сирцеві коди та саму програму я розмістила в мережі Інтернет за адресою: http://code.google.com/p/smallenglish/, а тому, розробленна мною програма доступна всім зацікавленим.
Також можна скористатися системою контролю версій SVN (Subversion) і отримати зріз актуальної гілки розробки. Зробити це можна командою svn checkout http://smallenglish.googlecode.com/svn/trunk/ smallenglish-read-only або скориставшись одним із менеджерів роботи с SVN, наприклад qsvn.
Установка програми на операційній системі GNULinux (на прикладі openSUSE 11.0):
- установка java: sudo zypper install java-1_6_0-sun
- отримання архіву прогрими: wget http://smallenglish.googlecode.com/ files/SmallEnglish.tar.gz
- розкриття архіву: tar xvfz SmallEnglish.tar.gz
- запуск програми: cd SmallEnglish && sh run.sh
Структура вихідних кодів:
src
`-- mahno
`-- masha
`-- smallenglish
|-- Login.java
|-- Main.java
|-- Test.java
|-- Timer.java
|-- Wave.java
`-- Words.java
3.5 Л і с т і н г к о д у п р о г р а м и L o g i n. j a v a:
package mahno.masha.smallenglish;
import java.awt.BorderLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Dimension;
import java.awt.Point;
import java.io.File;
import javax.swing.JComboBox;
class Login {
private JFrame jFrame = null;
private JPanel jContentPane = null;
private JLabel jLabel = null;
private JButton jButton = null;
private JPanel jPanel = null;
private JTextField name = null;
private JPanel jPanel1 = null;
String l;
private JLabel jLabel2 = null;
private JComboBox Lesss = null;
/**
* This method initializes jFrame
*
* @return javax.swing.JFrame
*/
JFrame getJFrame() {
if (jFrame == null) {
jFrame = new JFrame();
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(300, 200);
jFrame.setLocation(new Point(0, 0));
jFrame.setResizable(false);
jFrame.setContentPane(getJContentPane());
jFrame.setTitle("Вхід");
}
return jFrame;
}
/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
jLabel = new JLabel();
jLabel.setText("Ввести прізвище та ім'я:");
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getJPanel1(), BorderLayout.SOUTH);
jContentPane.add(getJPanel(), BorderLayout.CENTER);
}
return jContentPane;
}
/**
* This method initializes jButton
*
* @return javax.swing.JButton
*/
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setText("Вхід");
jButton.setEnabled(false);
jButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
doLogin();
}
});
}
return jButton;
}
void doLogin(){
if(jButton.isEnabled()){
Main.setEnv(name.getText(),l);
jFrame.setVisible(false);
jFrame.dispose();
}
}
/**
* This method initializes jPanel
*
* @return javax.swing.JPanel
*/
private JPanel getJPanel() {
if (jPanel == null) {
GridBagConstraints gridBagConstraints12 = new GridBagConstraints();
gridBagConstraints12.fill = GridBagConstraints.VERTICAL;
gridBagConstraints12.gridy = 3;
gridBagConstraints12.weightx = 1.0;
gridBagConstraints12.gridx = 0;
GridBagConstraints gridBagConstraints11 = new GridBagConstraints();
gridBagConstraints11.gridx = 0;
gridBagConstraints11.gridy = 2;
jLabel2 = new JLabel();
jLabel2.setText("Урок");
GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
gridBagConstraints
gridBagConstraints1.gridy = 0;
GridBagConstraints gridBagConstraints = new GridBagConstraints();
gridBagConstraints.fill = GridBagConstraints.VERTICAL;
gridBagConstraints.gridy = 1;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.gridx = 0;
jPanel = new JPanel();
jPanel.setLayout(new GridBagLayout());
jPanel.add(getName(), gridBagConstraints);
jPanel.add(jLabel, gridBagConstraints1);
jPanel.add(jLabel2, gridBagConstraints11);
jPanel.add(getLesss(), gridBagConstraints12);
}
return jPanel;
}
/**
* This method initializes name
*
* @return javax.swing.JTextField
*/
private JTextField getName() {
if (name == null) {
name = new JTextField();
name.setPreferredSize(new Dimension(250, 19));
name.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent e) {
if(name.getText().length()>3 & l!=null){
jButton.setEnabled(true);
if(e.getKeyChar()=='n'){
doLogin();
}
} else {
jButton.setEnabled(false);
}
}
});
}
return name;
}
/**
* This method initializes jPanel1
*
* @return javax.swing.JPanel
*/
private JPanel getJPanel1() {
if (jPanel1 == null) {
jPanel1 = new JPanel();
jPanel1.setLayout(new GridBagLayout());
jPanel1.add(getJButton(), new GridBagConstraints());
}
return jPanel1;
}
/**
* This method initializes Lesss
*
* @return javax.swing.JComboBox
*/
private JComboBox getLesss() {
if (Lesss == null) {
Lesss = new JComboBox();
Lesss.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent e) {
l=e.getItem().toString();
}
});
}
return Lesss;
}
public void Scan(String d){
File dir = new File(d);
String[] files = dir.list();
for(int i=0;i<files.length;i++){
if(new File(d+"/"+files[i].toString()+"/"+Main.ftxt).exists()) {
addL(files[i].toString());
}
}
}
void addL(String s){
Lesss.addItem(new String(s));
}
}
Лістинг Main.java:
package mahno.masha.smallenglish;
import javax.swing.SwingUtilities;
public class Main {
final static int max_length = 16;
static Test test = null;
static Login login = null;
static String name;
static String less;
static String workdir;
static Words words;
final static String ftxt = "words.csv";
final static String lessdir = "lessons/";
final static String iocharset = "UTF-8";
final static String helppage = "system/help.html";
public static void main(String[] args) {
workdir = System.getProperty("user.dir")+"/";
doLogin();
}
public static void setEnv(String n,String l){
name = n;
less = l;
login = null;
doTest();
}
static void doTest(){
test = new Test();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
test.getJFrame().setVisible(true);
}
});
words = new Words(workdir,lessdir+less+"/",name,ftxt);
}
static void doLogin(){
login = new Login();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
login.getJFrame().setVisible(true);
login.Scan(workdir+lessdir);
}
});
}
public static void nextTest(){
words.nextTest();
test.rePaint();
}
public static void showHelp() {
java.awt.Desktop desktop = java.awt.Desktop.getDesktop();
try {
java.net.URI uri = new java.net.URI( "file://"+workdir+helppage );
desktop.browse( uri );
}
catch ( Exception er ) {
// System.err.println( er.getMessage() );
}
}
}
Лістинг Test.java:
package mahno.masha.smallenglish;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.BorderLayout;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import java.awt.Point;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JFrame;
import javax.swing.JDialog;
import javax.swing.Timer;
import java.awt.GridBagLayout;
import java.awt.Dimension;
import javax.swing.JButton;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.Color;
import java.awt.ComponentOrientation;
class Test {
final String question = "_"; // @jve:decl-index=0:
private JFrame jFrame = null; // @jve:decl-index=0:visual-constraint="10,10"
private JPanel jContentPane = null;
private JMenuBar jJMenuBar = null;
private JMenu fileMenu = null;
private JMenu helpMenu = null;
private JMenuItem exitMenuItem = null;
private JMenuItem aboutMenuItem = null;
private JDialog aboutDialog = null;
private JPanel aboutContentPane = null;
private JLabel aboutVersionLabel = null;
private JPanel top = null;
private JPanel bottom = null;
private JPanel left = null;
private JPanel right = null;
private JPanel screen = null;
private JButton button = null;
private JPanel pole = null;
private int lSize = 50;
private JPanel jPanel = null;
private Polekeys polekey[] = new Polekeys[Main.max_length]; // @jve:decl-index=0:
private Timer timer;
final Color bg = new Color(0x5B9DED);
final Color bn = new Color(0xE6F0FB);
boolean iskey = false;
boolean isend = false;
boolean cursor = true;
private JMenuItem instructionMenuItem = null;
public void rePaint() {
pole.repaint();
screen.repaint();
}
public void setFocus(){
pole.requestFocus();
}
/**
* This method initializes jFrame
*
* @return javax.swing.JFrame
*/
JFrame getJFrame() {
if (jFrame == null) {
jFrame = new JFrame();
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setPreferredSize(new Dimension(820, 760));
jFrame.setResizable(false);
jFrame.setJMenuBar(getJJMenuBar());
jFrame.setSize(820, 760);
jFrame.setContentPane(getJContentPane());
jFrame.setTitle("SmallEnglish");
}
return jFrame;
}
/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.setPreferredSize(new Dimension(20, 110));
jContentPane.add(getTop(), BorderLayout.NORTH);
jContentPane.add(getBottom(), BorderLayout.SOUTH);
jContentPane.add(getLeft(), BorderLayout.WEST);
jContentPane.add(getRight(), BorderLayout.EAST);
jContentPane.add(getScreen(), BorderLayout.CENTER);
jContentPane.setFocusable(false);
}
return jContentPane;
}
/**
* This method initializes jJMenuBar
*
* @return javax.swing.JMenuBar
*/
private JMenuBar getJJMenuBar() {
if (jJMenuBar == null) {
jJMenuBar = new JMenuBar();
jJMenuBar.add(getFileMenu());
jJMenuBar.add(getHelpMenu());
}
return jJMenuBar;
}
/**
* This method initializes jMenu
*
* @return javax.swing.JMenu
*/
private JMenu getFileMenu() {
if (fileMenu == null) {
fileMenu = new JMenu();
fileMenu.setText("Файл");
fileMenu.add(getExitMenuItem());
}
return fileMenu;
}
/**
* This method initializes jMenu
*
* @return javax.swing.JMenu
*/
private JMenu getHelpMenu() {
if (helpMenu == null) {
helpMenu = new JMenu();
helpMenu.setText("Допомога");
helpMenu.add(getInstructionMenuItem());
helpMenu.add(getAboutMenuItem());
}
return helpMenu;
}
/**
* This method initializes jMenuItem
*
* @return javax.swing.JMenuItem
*/
private JMenuItem getExitMenuItem() {
if (exitMenuItem == null) {
exitMenuItem = new JMenuItem();
exitMenuItem.setText("Вихід");
exitMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}
return exitMenuItem;
}
/**
* This method initializes jMenuItem
*
* @return javax.swing.JMenuItem
*/
private JMenuItem getAboutMenuItem() {
if (aboutMenuItem == null) {
aboutMenuItem = new JMenuItem();
aboutMenuItem.setText("Про програму");
aboutMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JDialog aboutDialog = getAboutDialog();
aboutDialog.pack();
Point loc = getJFrame().getLocation();
loc.translate(20, 20);
aboutDialog.setLocation(loc);
aboutDialog.setVisible(true);
}
});
}
return aboutMenuItem;
}
/**
* This method initializes aboutDialog
*
* @return javax.swing.JDialog
*/
private JDialog getAboutDialog() {
if (aboutDialog == null) {
aboutDialog = new JDialog(getJFrame(), true);
aboutDialog.setTitle("Про програму");
aboutDialog.setContentPane(getAboutContentPane());
}
return aboutDialog;
}
/**
* This method initializes aboutContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getAboutContentPane() {
if (aboutContentPane == null) {
aboutContentPane = new JPanel();
aboutContentPane.setLayout(new BorderLayout());
aboutContentPane.add(getAboutVersionLabel(), BorderLayout.CENTER);
}
return aboutContentPane;
}
/**
* This method initializes aboutVersionLabel
*
* @return javax.swing.JLabel
*/
private JLabel getAboutVersionLabel() {
if (aboutVersionLabel == null) {
aboutVersionLabel = new JLabel();
aboutVersionLabel.setText("smallEnglish v.0.6n by Mashan mailto:masha.tar.gz@gmail.com");
aboutVersionLabel.setHorizontalAlignment(SwingConstants.CENTER);
}
return aboutVersionLabel;
}
/**
* This method initializes top
*
* @return javax.swing.JPanel
*/
private JPanel getTop() {
if (top == null) {
top = new JPanel();
top.setLayout(new GridBagLayout());
top.setPreferredSize(new Dimension(0, 10));
top.setBackground(bg);
top.setFocusable(false);
}
return top;
}
/**
* This method initializes bottom
*
* @return javax.swing.JPanel
*/
private JPanel getBottom() {
if (bottom == null) {
GridBagConstraints gridBagConstraints11 = new GridBagConstraints();
gridBagConstraints11.gridx = 0;
gridBagConstraints11.gridy = 1;
GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
gridBagConstraints1.fill = GridBagConstraints.VERTICAL;
gridBagConstraints1.gridy = 0;
gridBagConstraints1.weightx = 1.0;
gridBagConstraints1.gridx = 0;
bottom = new JPanel();
bottom.setLayout(new BorderLayout());
bottom.setPreferredSize(new Dimension(820, 110));
bottom.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
bottom.setBackground(bg);
bottom.add(getPole(), BorderLayout.CENTER);
bottom.add(getJPanel(), BorderLayout.SOUTH);
bottom.setFocusable(false);
}
return bottom;
}
/**
* This method initializes left
*
* @return javax.swing.JPanel
*/
private JPanel getLeft() {
if (left == null) {
left = new JPanel();
left.setLayout(new GridBagLayout());
left.setPreferredSize(new Dimension(10, 0));
left.setBackground(bg);
left.setFocusable(false);
}
return left;
}
/**
* This method initializes right
*
* @return javax.swing.JPanel
*/
private JPanel getRight() {
if (right == null) {
right = new JPanel();
right.setLayout(new GridBagLayout());
right.setPreferredSize(new Dimension(10, 0));
right.setBackground(bg);
right.setFocusable(false);
}
return right;
}
/**
* This method initializes screen
*
* @return javax.swing.JPanel
*/
private JPanel getScreen() {
if (screen == null) {
screen = new JPanel(){
private static final long serialVersionUID = 1L;
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D gr = (Graphics2D) g;
gr.setColor(Color.GRAY);
gr.fillRect(0, 0, 800, 600);
Main.words.getImage(gr);
if(Main.words.isStarted()){
Main.words.sndIcon(gr);
gr.setColor(Color.gray);
gr.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 16));
gr.drawString("Тест №"+Main.words.getCur()+" з "+Main.words.getN(), 11,21 );
gr.setColor(Color.blue);
gr.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 16));
gr.drawString("Тест №"+Main.words.getCur()+" з "+Main.words.getN(), 10,20 );
}
/* if(iskey){
gr.setColor(Color.white);
//gr.fillOval(5, 210, 780, 150);
gr.fillRoundRect(20, 260, 750, 50, 10, 10);
gr.setColor(Color.BLACK);
gr.drawRoundRect(20, 260, 750, 50, 10, 10);
*/
Main.words.drawRus(gr);
if(isend){
// ffg nf
gr.setColor(Color.white);
gr.fillRect(0, 0, 800, 600);
Main.words.getSummaryG(gr);
}
};
};
screen.setLayout(new GridBagLayout());
screen.setBackground(bg);
screen.setPreferredSize(new Dimension(800, 600));
screen.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent e) {
if(e.getX()>660 && e.getX()<760 && e.getY()>460 && e.getY()<560 && Main.words.isWav()){
Main.words.Say();
}
}
});
screen.setFocusable(false);
//img = new BufferedImage(800,600,BufferedImage.TYPE_INT_RGB);
}
return screen;
}
/**
* This method initializes button
*
* @return javax.swing.JButton
*/
private JButton getButton() {
if (button == null) {
button = new JButton();
button.setText("Розпочати тест");
button.setPreferredSize(new Dimension(200, 30));
button.setBackground(bn);
button.setForeground(Color.black);
button.setFont(new Font("Dialog", Font.BOLD, 18));
button.setHorizontalAlignment(SwingConstants.CENTER);
button.setFocusable(false);
button.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
doClick();
}
});
}
return button;
}
public void Click(){
doClick();
}
private void doClick(){
if(!isend){
if(!Main.words.isStarted()){
button.setText("Дати підповідь");
} else {
doSumary();
}
Main.nextTest();
initPole();
if(!Main.words.isStarted()){
button.setText("Вийти");
isend = true;
Main.words.doEnding();
}
} else {
System.exit(0);
}
}
/**
* This method initializes pole
*
* @return javax.swing.JPanel
*/
private JPanel getPole() {
if (pole == null) {
pole = new JPanel(){
/**
*
*/
private static final long serialVersionUID = 1L;
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D gr = (Graphics2D) g;
gr.setColor(bg);
gr.fillRect(0, 0, 820, lSize*2);
if(Main.words.isStarted()){
doPaint(gr);
}
}
private void doPaint(Graphics2D gr) {
int x = 0;
int y = 0;
for(int i=0;i<Polekeys.length();i++){
x = (i * (lSize+5))+20;
y = 16;
gr.setFont(new Font(Font.SANS_SERIF, Font.BOLD, lSize));
polekey[i].x1=x;
polekey[i].x2=x+lSize;
if(!polekey[i].is){
gr.setColor(Color.LIGHT_GRAY);
gr.fillRect(x,y,lSize,lSize);
gr.setColor(Color.blue);
gr.drawRect(x,y,lSize,lSize);
gr.setColor(Color.black);
gr.drawString(polekey[i].getChr(), x+5, y+lSize-4);
} else
{
gr.setColor(Color.DARK_GRAY);
gr.setFont(new Font(Font.SERIF, Font.PLAIN, 12));
gr.drawString(Integer.toString(polekey[i].index+1), x+((int)(lSize/2))-2, 12);
gr.setColor(Color.white);
gr.fillRect(x,y,lSize,lSize);
gr.setColor(Color.blue);
gr.drawRect(x,y,lSize,lSize);
gr.setColor(Color.black);
gr.setFont(new Font(Font.SANS_SERIF, Font.BOLD, lSize));
if(Polekeys.cur==i && iskey){
if(cursor){gr.drawString("|", x+3, y+lSize-9);} else {
gr.drawString(polekey[i].ch, x+5, y+lSize-4);}
} else {
gr.drawString(polekey[i].ch, x+5, y+lSize-4);
}
}
}
};
};
pole.setLayout(new GridBagLayout());
pole.setPreferredSize(new Dimension(lSize, 800));
pole.setFocusable(true);
pole.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent e) {
for(int i=0;i<Polekeys.length();i++){
if(polekey[i].x1<e.getX() && polekey[i].x2>e.getX() && polekey[i].is){
setKey(true);
doLclick(i);
}
pole.requestFocus();
}
}
});
pole.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent e) {
String s = String.valueOf(e.getKeyChar()).toUpperCase();
if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
setKey(false);
return;
}
if(e.getKeyChar()=='n'){
setKey(false);
doClick();
return;
}
if(Main.words.isStarted()){
if(iskey && s.matches("[A-Z]")){
polekey[Polekeys.cur].ch = s;
//Polekeys.cur= -1;
//button.setEnabled(true);
if(Polekeys.curind<Polekeys.mindex) {
Polekeys.curind++;
} else {
setKey(false);
Polekeys.curind=0;
}
for(int j=0;j<Polekeys.length();j++){
if(polekey[j].index==Polekeys.curind){
doLclick(j);
return;
}
}
rePaint();
return;
}
if(s.matches("[1-9]")){
int i=Integer.parseInt(s);
for(int j=0;j<Polekeys.length();j++){
if(polekey[j].index==(i-1)){
setKey(true);
doLclick(j);
return;
}
}
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT | e.getKeyCode()==KeyEvent.VK_TAB){
setKey(true);
if(Polekeys.curind<Polekeys.mindex) {
Polekeys.curind++;
} else {
Polekeys.curind=0;
}
//System.out.println(Polekeys.curind+" "+Polekeys.mindex);
for(int j=0;j<Polekeys.length();j++){
if(polekey[j].index==Polekeys.curind){
doLclick(j);
return;
}
}
}
if(e.getKeyCode()==KeyEvent.VK_LEFT | e.getKeyCode()==KeyEvent.VK_BACK_SPACE){
setKey(true);
if(Polekeys.curind>0) {
Polekeys.curind--;
} else {
Polekeys.curind=Polekeys.mindex;
}
//System.out.println(Polekeys.curind+" "+Polekeys.mindex);
for(int j=0;j<Polekeys.length();j++){
if(polekey[j].index==Polekeys.curind){
doLclick(j);
return;
}
}
}
}
}
});
}
timer =new Timer(500, new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
if(cursor) {
cursor=false;
} else {
cursor=true;
}
pole.repaint();
}
});
timer.stop();
return pole;
}
private void doLclick(int i){
Polekeys.cur=polekey[i].n;
// System.out.println(polekey[i].n);
//iskey=true;
//button.setEnabled(false);
rePaint();
}
private void initPole(){
if(Main.words.isStarted()){
int in = 0;
Polekeys.mindex=-1;
boolean fi = true;
Polekeys.c = Main.words.getCurword();
for(int i=0;i<Polekeys.length();i++){
polekey[i]=new Polekeys();
polekey[i].n=i;
if(!Polekeys.getIndexchr(i).matches(question)){
polekey[i].is=false;
} else {
polekey[i].is=true;
polekey[i].index=in;
if(fi) {
Polekeys.curind=in;
fi=false;
setKey(true);
Polekeys.cur=i;
}
Polekeys.mindex++;
in++;
}
}
}
}
/**
* This method initializes jPanel
*
* @return javax.swing.JPanel
*/
private JPanel getJPanel() {
if (jPanel == null) {
GridBagConstraints gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
jPanel = new JPanel();
jPanel.setLayout(new GridBagLayout());
jPanel.setPreferredSize(new Dimension(820, 40));
jPanel.setBackground(bg);
jPanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGH);
jPanel.add(getButton(), gridBagConstraints);
}
return jPanel;
}
/**
* This method initializes instructionMenuItem
*
* @return javax.swing.JMenuItem
*/
private JMenuItem getInstructionMenuItem() {
if (instructionMenuItem == null) {
instructionMenuItem = new JMenuItem();
instructionMenuItem.setText("Інструкція");
instructionMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
Main.showHelp();
}
});
}
return instructionMenuItem;
}
/**
* Launches this application
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Test application = new Test();
application.getJFrame().setVisible(true);
}
});
}
void setKey(boolean b){
iskey=b;
if(b){
timer.start();
} else {
timer.stop();
}
pole.repaint();
}
void doSumary(){
int g = 0;
int b = 0;
String word = "";
for(int i=0;i<Polekeys.length();i++){
if(polekey[i].is){
word=word+polekey[i].ch;
if(polekey[i].ch.matches(Main.words.getOrigchr(i))){
g++;
}
b++;
} else {
word=word+Polekeys.getIndexchr(i);
}
}
Main.words.setShots(g, b);
Main.words.setDone(word);
}
}
class Polekeys {
static public int cur = -1;
static public String c;
static public int mindex = 0;
static public int curind;
public int x1;
public int x2;
public int n;
public boolean is = false;
public String ch = "?";
public int index = -1;
public String getChr(){
return getIndexchr(n);
}
static public String getIndexchr(int i){
return c.substring(i,i+1);
}
static int length(){
int l;
l=c.length();
if(l>Main.max_length) {
l=Main.max_length;
}
return l;
}
}
Лістинг Timer.java:
package mahno.masha.smallenglish;
class Timer extends Thread {
final static int sec=1000;
int ntimes = 0;
int curtime = 0;
int cur_test = -1;
Timer(int c,int n){
ntimes = n;
curtime = n;
cur_test = c;
setTime();
}
public void run() {
while(curtime>0 && Main.words.getCurent()==cur_test){
try {
Thread.sleep(sec);
Step();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(Main.words.getCurent()==cur_test) Done();
}
void setTime(){
Main.words.setTime(curtime);
}
void Step() {
curtime--;
setTime();
Main.test.rePaint();
}
void Done(){
Main.test.Click();
}
}
Лістинг Wave.java:
package mahno.masha.smallenglish;
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
public class Wave extends Thread {
private String filename;
private Position curPosition;
private final int EXTERNAL_BUFFER_SIZE = 524288; // 128Kb
enum Position {
LEFT, RIGHT, NORMAL
};
public Wave(String wavfile) {
filename = wavfile;
curPosition = Position.NORMAL;
}
public Wave(String wavfile, Position p) {
filename = wavfile;
curPosition = p;
}
public void run() {
File soundFile = new File(filename);
if (!soundFile.exists()) {
System.err.println("Wave file not found: " + filename);
return;
}
AudioInputStream audioInputStream = null;
try {
audioInputStream = AudioSystem.getAudioInputStream(soundFile);
} catch (UnsupportedAudioFileException e1) {
e1.printStackTrace();
return;
} catch (IOException e1) {
e1.printStackTrace();
return;
}
AudioFormat format = audioInputStream.getFormat();
SourceDataLine auline = null;
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
try {
auline = (SourceDataLine) AudioSystem.getLine(info);
auline.open(format);
} catch (LineUnavailableException e) {
e.printStackTrace();
return;
} catch (Exception e) {
e.printStackTrace();
return;
}
if (auline.isControlSupported(FloatControl.Type.PAN)) {
FloatControl pan = (FloatControl) auline
.getControl(FloatControl.Type.PAN);
if (curPosition == Position.RIGHT)
pan.setValue(1.0f);
else if (curPosition == Position.LEFT)
pan.setValue(-1.0f);
}
auline.start();
int nBytesRead = 0;
byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
try {
while (nBytesRead != -1) {
nBytesRead = audioInputStream.read(abData, 0, abData.length);
if (nBytesRead >= 0)
auline.write(abData, 0, nBytesRead);
}
} catch (IOException e) {
e.printStackTrace();
return;
} finally {
auline.drain();
auline.close();
}
}
}
Лістинг Words.java:
package mahno.masha.smallenglish;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.Date;
import javax.imageio.ImageIO;
class Words {
final static int max = 100;
final static String imgdir = "images/";
final static String snddir = "sounds/";
Timer timer;
static int n = 0;
static int orig;
static int cur_test = -1;
static String workdir;
static String ldir;
int all_clear = 0;
int all = 0;
String name;
String ftxt;
String[] word_rus = new String[max];
String[] word_orig = new String[max];
String[] word_test = new String[max];
String[] word_done = new String[max];
String[] image = new String[max];
String[] wav = new String[max];
int[] time = new int[max];
int[] clear_shots = new int[max];
int[] bad_shots = new int[max];
final static String defimg = "system/logo.jpg";
final static String defwav = "system/none.wav";
final static String lisimg = "system/listen.jpg";
boolean bwav=false;
int cur_time;
Image img;
Image listen;
Words(String f,String l,String n,String t){
workdir = f;
ldir = l;
ftxt=t;
name=n;
loadLImg();
readFiles();
loadImg(defimg);
}
public int getTime() {
return cur_time;
}
public void setTime(int t) {
cur_time=t;
}
public void setDone(String s){
word_done[cur_test]=s;
}
public void getImage(Graphics2D gr){
gr.drawImage(img, 0, 0, 800,600, null);
}
public void sndIcon(Graphics2D gr){
if(isWav()){
gr.setColor(Color.gray);
gr.fillRoundRect(664, 464, 100, 100, 5, 5);
gr.setColor(Color.white);
gr.fillRoundRect(660, 460, 100, 100, 5, 5);
gr.setColor(Color.black);
gr.drawRoundRect(660, 460, 100, 100, 5, 5);
gr.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 10));
gr.drawString("listen...",690,545 );
gr.drawImage(listen, 665, 465, 90,90, null);
}
}
public void drawRus(Graphics2D gr){
if(isStarted()){
gr.setColor(Color.gray);
gr.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 80));
gr.drawString(word_rus[cur_test], 28,543 );
gr.setColor(Color.black);
gr.drawString(word_rus[cur_test], 24,539 );
gr.drawString(word_rus[cur_test], 26,541 );
gr.setColor(Color.white);
gr.drawString(word_rus[cur_test], 25,540 );
if(time[cur_test]>0){
gr.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 20));
gr.setColor(Color.black);
gr.drawString(String.valueOf(cur_time)+" секунд", 651,31);
gr.setColor(Color.white);
gr.drawString(String.valueOf(cur_time)+" секунд", 649,29);
gr.setColor(Color.red);
gr.drawString(String.valueOf(cur_time)+" секунд", 650,30);
}
}
}
int getProcent() {
double pr;
pr = (100.00 / all) * all_clear;
BigDecimal x = new BigDecimal(pr);
return x.setScale(0, BigDecimal.ROUND_HALF_DOWN).intValue();
}
int getBale() {
float procent;
procent = getProcent();
if(procent<50){
return 2;
} else
if (procent<=75) {
return 3;
} else
if (procent<=95){
return 4;
} else
if (procent>95) {
return 5;
} else {
return -1;
}
}
public void getSummaryG(Graphics2D gr){
String s[]={"Результати тестування "+name+" (урок "+ldir+"):n","Загальне число балів "+all_clear+" из "+all+".n ","Оцінка: "+getBale()+" ("+getProcent()+"% успіху)n"};
gr.setColor(Color.black);
gr.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 22));
gr.drawString(s[0], 20,25);
gr.setFont(new Font(Font.SANS_SERIF, 0, 25));
gr.drawString(s[1], 20,50);
gr.setColor(Color.red);
gr.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 25));
gr.drawString(s[2], 20,80);
int sizef=20;
gr.setColor(Color.black);
gr.setFont(new Font(Font.SERIF, Font.BOLD, sizef));
String th[]={"№","Вірне слово","Введене слово"};
gr.drawString(th[0],20,120);
gr.drawString(th[1],20+(sizef*2),120);
gr.drawString(th[2],20+(sizef*16),120);
gr.setColor(Color.gray);
gr.drawRect(18, (120-sizef)+1, (sizef*2)-2, sizef);
gr.drawRect(16+(sizef*2), (120-sizef)+1, (sizef*16)-(sizef*2), sizef);
gr.drawRect(16+(sizef*16), (120-sizef)+1, (sizef*16)+18, sizef);
for(int i=0;i<n;i++){
gr.setColor(Color.black);
gr.setFont(new Font(Font.SERIF, 0, sizef-2));
String td[]={Integer.toString(i+1),word_orig[i],word_done[i]};
gr.drawString(td[0],20,120+((i+1)*sizef)-1);
gr.drawString(td[1],20+(sizef*2),120+((i+1)*sizef)-1);
gr.drawString(td[2],20+(sizef*16),120+((i+1)*sizef)-1);
gr.setColor(Color.gray);
gr.drawRect(18, (i*sizef)+120+1, (sizef*2)-2, sizef);
gr.drawRect(16+(sizef*2), (i*sizef)+120+1, (sizef*16)-(sizef*2), sizef);
gr.drawRect(16+(sizef*16), (i*sizef)+120+1, (sizef*16)+18, sizef);
}
}
public void doEnding(){
writeFile(getSummary());
}
String getSummary(){
Date d = new Date();
String c = d.toString()+"n";
String s[]={"Результати тестування "+name+" (урок "+ldir+"):n","Загальне число балів "+all_clear+" из "+all+".n ","Оцінка: "+getBale()+" ("+getProcent()+"% успіху)n"};
c=s[0]+"n"+s[1]+"n"+s[2];
for(int i=0;i<n;i++){
c=c+"Тест №"+(i+1)+" слово "+word_orig[i]+" написано як "+word_done[i]+"n";
}
c = c+"--------------------------------------n";
return c;
}
public void setShots(int g, int b){
clear_shots[cur_test] = g;
bad_shots[cur_test] = b;
all_clear = all_clear + g;
all = all + b;
}
public int getCur(){
return cur_test+1;
}
public int getCurent(){
return cur_test;
}
public int getN(){
return n;
}
public boolean isStarted(){
if(cur_test>-1){
return true;
}
else {
return false;
}
}
public void nextTest(){
if(cur_test<0){
cur_test=0;
Next();
} else {
if(cur_test<n-1){
cur_test++;
Next();
} else {
cur_test=-1;
}
}
}
void Next() {
loadImgCur();
bwav=checkWav();
newTimer();
Main.test.setFocus();
}
void newTimer() {
if(time[cur_test]>0){
Timer timer = new Timer(cur_test,time[cur_test]);
timer.start();
}
}
void loadImg(String f){
try {
img = ImageIO.read(new File(workdir+f));
//img.getGraphics().
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
System.out.println("Can't load image "+workdir+f);
}
}
void loadLImg(){
try {
listen = ImageIO.read(new File(workdir+lisimg));
//img.getGraphics().
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
System.out.println("Can't load image "+workdir+lisimg);
}
}
void loadImgCur(){
loadImg(image[cur_test]);
}
public String getOrigchr(int i){
return word_orig[cur_test].substring(i,i+1);
}
public String getCurword(){
return word_test[cur_test];
}
void readFiles(){
File f= new File(workdir+ldir+ftxt);
String[] sbuff;
n=0;
try {
BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(f), Main.iocharset));
try {
String line = null;
while (( line = input.readLine()) != null){
sbuff = line.split("[ ";,t]+");
// Слово з пропущеними літерами
try {
word_test[n] = sbuff[1].toUpperCase();
} catch(ArrayIndexOutOfBoundsException e){
word_test[n]=sbuff[0].toUpperCase();
}
// Переклад слова
try {
word_rus[n] = sbuff[2];
} catch(ArrayIndexOutOfBoundsException e){
word_rus[n]="";
}
// Картинка
try{
image[n] = ldir+imgdir+sbuff[0]+".jpg";
} catch(ArrayIndexOutOfBoundsException e){
image[n]=defimg;
}
// Звук (вимова)
try{
wav[n] = ldir+snddir+sbuff[0]+".wav";
} catch(ArrayIndexOutOfBoundsException e){
wav[n]=defwav;
}
// Час на тест
try{
time[n] = Integer.parseInt(sbuff[3]);
} catch(ArrayIndexOutOfBoundsException e){
time[n]= 0;
}
// Слово
try {
word_orig[n] = sbuff[0].toUpperCase();
} finally {
n++;
}
}
}
finally {
input.close();
}
}
catch (IOException ex){
ex.printStackTrace();
}
}
void writeFile(String s){
File f = new File(workdir+"results.txt");
PrintWriter writer = null;
try {
writer = new PrintWriter(new BufferedWriter(new FileWriter(f,true)));
writer.println(s);
} catch(IOException e){
}
finally {
if (writer!= null) writer.close();
}
}
String fixint(int n){
String s;
if(n<10){
s="0"+n;
} else {
s=""+n;
}
return s;
}
public void Say() {
if(isWav()){
playWav(workdir+wav[cur_test]);
}
}
boolean isWav() {
if(!isStarted()) return false;
return bwav;
}
boolean checkWav() {
if(new File(workdir+wav[cur_test]).exists()) {
return true;
} else
{
return false;
}
}
void playWav(String f) {
//if(!new File(f).exists()) f=workdir+defwav;
new Wave(f).start();
}
}
4 ОХОРОНА ПРАЦІ
4.1 Вимоги до виробничих приміщень для
експлуатації ПК
Охорона праці - це система організаційних, технічних, санітарно-гігієнічних та інших обов'язкових для виконання підприємствами (організаціями) і їх посадовими особами підприємств, які направлені на забезпечення прав робітників і службовців на здоров'я і безпеку умов праці. Право на здоров'я і безпечні умови праці є одним з основних трудових прав робочих і службовців, які затверджені в законодавчому порядку. Воно реалізується за допомогою різноманітних заходів, які передбачають покращення стану робочих місць, раціоналізацію технологічних процесів і герметизацію виробничих процесів, вентиляцію і освітлення робочих місць, вдосконалення засобів безпеки на підприємстві і забезпечення об'єктів засобами колективного захисту (огороджуючими, блокуючими і сигнальними засобами), забезпечення робочих засобами індивідуального захисту (спецодяг, протигаз і ін.) і особистої гігієни, контроль за виконанням технологічних режимів, забезпечення санітарно-гігієнічних умов праці, постачання на робочі місця гарячою їжею, медикаментами і засобами першої допомоги, медичне обслуговування робітників, періодичні медогляди, диспансеризацію, створення профілакторіїв, баз відпочинку, забезпечення лікувально-профілактичним харчуванням і ін.
Нагляд і контроль за охороною праці і виконанням трудового законодавства ведуть спеціальні державні органи контролю, технічна і правова інспекція праці профспілок і комісії профспілкових комітетів.
Об'ємно-планувальні рішення будівель та приміщень для роботи з ПК мають відповідати вимогам ДСанПіН 3.3.2.007–98.
Розміщення робочих місць з ПК у підвальних приміщеннях, на цокольних поверхах заборонено.
Площа на одне робоче місце оператора ЕОМ становить не менше ніж 6,0 м3, а об'єм – не менше ніж 20,0 м3.
Приміщення для роботи з ПК повинні мати природне та штучне освітлення відповідно до СНиП П-4–79/
Природне освітлення має здійснюватись через світлові прорізи, орієнтовані переважно на північ чи північний схід, і забезпечувати коефіцієнт природної освітленості (КПО) не нижче, ніж 1,5%.
Виробничі приміщення повинні обладнуватись шафами для зберігання документів, магнітних дисків, полицями, стелажами, тумбами тощо, з урахуванням вимог до площі приміщень.
У приміщеннях з ПК слід щоденно робити вологе прибирання.
Приміщення із ПК мають бути оснащені аптечками першої медичної допомоги.
При приміщеннях із ПК мають бути обладнані побутові приміщення для відпочинку під час роботи, кімната психологічного розвантаження. В кімнаті психологічного розвантаження слід передбачити встановлення пристроїв для приготування й роздачі тонізуючих напоїв, а також місця для занять фізичною культурою (СНиП 2.09.04. – 87).
У виробничих приміщеннях на робочих місця із ПК мають забезпечуватись оптимальні значення параметрів мікроклімату: температури, відносної вологості й рухливості повітря (ГОСТ 12.1.005–88, СН 4088–86).
Рівні позитивних і негативних іонів у повітрі приміщень з ПК мають відповідати санітарно-гігієнічним нормам №2152–80.
Штучне освітлення в приміщеннях із робочими місцями, обладнаними ПК має здійснюватись системою загального рівномірного освітлення. У виробничих та адміністративно-громадських приміщеннях, у разі переважної роботи з документами, допускається застосування системи комбінованого освітлення (крім системи загального освітлення, додатково встановлюються світильники місцевого освітлення).
Значення освітленості на поверхні робочого столу в зоні розміщення документів має становити 300–500 лк, Якщо це неможливо забезпечити системою загального освітлення, допускається використовувати місцеве освітлення. При цьому світильники місцевого освітлення слід встановлювати таким чином, щоб не створювати бліків на поверхні екрана, а освітленість екрана має не перевищувати 300 лк.
Як джерела світла для штучного освітлення мають застосовуватись переважно люмінесцентні лампи типу ЛБ. У разі влаштування відбитого освітлення у виробничих та адміністративно-громадських приміщеннях допускається застосування металогалогенних ламп потужністю 250 Вт. Допускається застосування ламп розжарювання у світильниках місцевого освітлення.
Рівні звукового тиску в октавних смугах частот, рівні звуку та еквівалентні рівні звуку на робочих місцях, обладнаних ПК, мають відповідати вимогам СН 3223–85, ГОСТ 12.1.003–83, ГР 2411–81.
Значення напруженості електростатичного поля на робочих місцях із ПК (як у зоні екрана дисплея, так і на поверхнях обладнання, клавіатури, друкувального пристрою) мають не перевищувати гранично допустимих за ГОСТ 12.1.045–84, СН 1757–77.Значення напруженості електромагнітних полів на робочих місцях із ПК мають відповідати нормативним значенням (ГДР №3206–85, ГДР N4131–86, СНК 5802–91, ГОСТ 12.1.006–84).
Інтенсивність потоків інфрачервоного випромінювання має не перевищувати допустимих значень, відповідно до ДСН 3.3.6.042–99.
Інтенсивність потоків ультрафіолетового випромінювання не повинна перевищувати допустимих значень, відповідно до СН 4557–88.
Потужність експозиційної дози рентгенівського випромінювання на відстані 0,05 м від екрана та корпуса відео термінала при будь-яких положеннях регулювальних пристроїв не повинна перевищувати ОД бер/год (100 мкР/год).
Обладнання й організація робочого місця із БДТ мають забезпечувати відповідність конструкції всіх елементів робочого місця та їх взаємного розташування ергономічним вимогам з урахуванням характеру й особливостей трудової діяльності (ГОСТ 12,2.032–78, ГОСТ22.269–76, ГОСТ 21.889–76).
Конструкція робочого місця користувача ПК має забезпечити підтримання оптимальної робочої пози.
Робочі місця із ПК слід так розташовувати відносно світлових прорізів, щоб природне світло падало збоку, переважно зліва.
При розміщенні робочих столів із ПК слід дотримуватись таких відстаней: між бічними поверхнями БДТ – 1,2 м; від тильної поверхні одного ПК до екрана іншого – 2,5 м.
Екран ПК має розташовуватися на оптимальній відстані тещ очей користувача, що становить 600…700 мм, але не ближче ніж за 600 мм з урахуванням розміру літерно-цифрових знаків і символів.
Розташування екрана ПК має забезпечувати зручність зорового спостереження у вертикальній площині під кутом +30* до нормальної лінії погляду працюючого.
Клавіатуру слід розташовувати на поверхні столу на відстані 100…300 мм від краю, звернутого до працюючого. У конструкції клавіатури має передбачатися опорний пристрій (виготовлений із матеріалу з високим коефіцієнтом тертя, що перешкоджає мимовільному її зсуву), який дає змогу змінювати кут нахилу поверхні клавіатури в межах 5… 15°.
Для забезпечення захисту і досягнення нормованих рівнів комп'ютерних випромінювань необхідно застосовувати при екранні фільтри, локальні світлофільтри (засоби індивідуального захисту очей) та інші засоби захисту, що пройшли випробування в акредитованих лабораторіях і мають щорічний гігієнічний сертифікат.
При оснащенні робочого місця із ВДТ лазерним принтером параметри лазерного випромінювання повинні відповідати вимогам ДСанПіН 3.3.2.007–98.
При організації праці, пов'язаної з використанням ПК, для збереження здоров'я працюючих, запобігання професійним захворюванням І підтримки працездатності передбачаються внутрішньо змінні регламентовані перерви для відпочинку.
Внутрішньо-змінні режими праці й відпочинку містять додаткові нетривалі перерви в періоди, що передують появі об'єктивних і суб'єктивних ознак стомлення й зниження працездатності.
При виконанні робіт, що належать до різних видів трудової діяльності, за основну роботу з ПК слід вважати таку, що займає не менше 50% робочого часу. Впродовж робочої зміни мають передбачатися:
- перерви для відпочинку і вживання їжі (обідні перерви);
- перерви для відпочинку й особистих потреб (згідно із трудовими нормами);
- додаткові перерви, що вводяться для окремих професій з урахуванням особливостей трудової діяльності.
Електробезпека — це система організаційних та технічних заходів і засобів, що забезпечують захист людей від шкідливого та небезпечного впливу електричного струму, електричної дуги, електромагнітного поля і статичної електрики.
Основними причинами електротравматизму на виробництві є: випадкове доторкання до неізольованих струмопровідних частин електроустаткування; використання несправних ручних електроінструментів; застосування нестандартних або несправних переносних світильників напругою 220 чи 127 В; робота без надійних захисних засобів та запобіжних пристосувань; доторкання до незаземлених корпусів електроустаткування, що опинилися під напругою внаслідок пошкодження ізоляції; недотримання правил улаштування, технічної експлуатації та правил техніки безпеки при експлуатації електроустановок та ін.
Електротехнологічні працівники – працівники, посада або професія яких пов'язана з експлуатацією електротехнічної частини виробничого обладнання, обов'язки котрих не стосуються обслуговування його електроприводу.
Керівник підприємства зобов'язаний забезпечити утримання, експлуатацію і обслуговування електроустановок відповідно до вимог чинних нормативних документів.
Для цього він повинен:
- призначити відповідального за справний стан і безпечну експлуатацію електрогосподарства з числа інженерно-технічних працівників, які мають електротехнічну підготовку і пройшли перевірку знань у встановленому порядку (далі - особа, відповідальна за електрогосподарство), та особу, яка буде її заміщувати у разі відсутності. Особу, відповідальну за електрогосподарство, та особу, яка буде її заміщати, призначають з числа спеціалістів, кваліфікація яких відповідає вимогам Правил та які пройшли навчання з питань технічної експлуатації електроустановок, правил пожежної безпеки та охорони праці;
- забезпечити достатню кількість електротехнічних працівників;
- затвердити Положення про енергетичну службу підприємства, а також посадові інструкції і інструкції з охорони праці;
Працівники, що обслуговують електроустановки, зобов'язані знати ці Правила відповідно до займаної посади чи роботи, яку вони виконують, і мати відповідну групу з електробезпеки згідно з такими вимогами:
- для одержання групи I, незалежно від посади і фаху, необхідно пройти інструктаж з електробезпеки під час роботи в даній електроустановці з оформленням в журналі реєстрації інструктажів з питань охорони праці.
Інструктаж з електробезпеки на І групу має провадити особа відповідальна за електрогосподарство, або, за її письмовим розпорядженням, - особа зі складу електротехнічних працівників з групою III.
Мінімальний стаж роботи в електроустановках і видання посвідчень працівникам з групою I не вимагаються;
- особам молодшим за 18 років не дозволяється присвоювати групу вище II;
Електротехнологічні працівники виробничих цехів і дільниць, які здійснюють експлуатацію електротехнологічних установок, повинні мати групу з електробезпеки II і вище.
Посвідчення про перевірку знань працівника є документом, який засвідчує право на самостійну роботу в електроустановках на зазначеній посаді за фахом.
Посвідчення про перевірку знань видається працівникові комісією з перевірки знань підприємства, організації після перевірки знань і є дійсним тільки після внесення відповідних записів.
Під час виконання службових обов'язків працівник повинен мати з собою посвідчення про перевірку знань. За відсутності посвідчення, або за наявності посвідчення з простроченими термінами перевірки знань, працівник до роботи не допускається.
Пожежна безпека – стан об’єкта, при якому з регламентованою імовірністю виключається можливість виникнення та розвиток пожежі і впливу на людей її небезпечних факторів, а також забезпечується захист матеріальних цінностей.
Протипожежний захист у галузі — комплекс інженерно-технічних заходів, спрямованих на створення пожежної безпеки об'єктів і споруд.
Відповідно до вимог і норм пожежної безпеки, всі виробничі, адміністративні, складські та інші приміщення і споруди виробництв і організацій обладнуються засобами автоматичної системи пожежної сигналізації, первинними засобами пожежогасіння, вогнегасниками, ящиками з піском, установками пожежогасіння, автоматикою для виявлення і запобігання пожежам.
При виникненні пожежі або загоранні на будь-якій ділянці підприємства негайно оголошується пожежна тривога та сповіщається пожежна охорона. Найчастіше для цього використовується телефон. Про пожежу доповідають чітко, називаючи адресу підприємства та прізвище того, хто робить
повідомлення.
Одночасно з повідомленням про пожежу працівники вживають заходів щодо її ліквідації та евакуації людей з приміщення, а також заходів щодо посилення охорони об'єкта. Для гасіння пожежі використовують первинні засоби пожежогасіння, що є на підприємстві.
Під час проходження виробничої практики на території підприємства, в цехах і на дільницях учні повинні керуватися правилами пожежної безпеки, чинними для цих виробничих підрозділів. Відповідальність за виконання правил пожежної безпеки і збереження життя та здоров'я учнів і студентів покладено на осіб, які керують практикою.
Правила пожежної безпеки передбачають:
- спеціальні заходи для окремих процесів виробництва, невиконання яких може призвести до пожежі;
- визначення місця для паління та місць, де використання відкритого вогню заборонено;
- встановлення порядку і норм зберігання пожежо- і вибухонебезпечних речовин та матеріалів;
- визначення обов'язків працівників і порядку дій у разі виникнення пожежі.
У приміщеннях цехів та дільниць усі проходи, евакуаційні виходи, коридори, тамбури, підходи до обладнання, засобів пожежогасіння, засобів зв'язку повинні бути вільними.
Технологічне обладнання за нормальних умов праці має бути пожежобезпечним. Забороняється працювати на несправному обладнанні. Не можна допускати контакту речовин і матеріалів, взаємодія яких призводить до горіння, вибуху або утворення горючих чи токсичних газів. Приміщення цеху може обігріватися лише приладами центрального або повітряного опалення.
На підприємствах, в установах, згідно з Положенням «Про добровільні пожежні дружини (команди)», для проведення заходів щодо запобігання пожежам та організації їх гасіння створюється пожежна служба.
Працюючі з ПК підлягають обов'язковим медичним оглядам: попереднім – при влаштуванні на роботу і періодичним – протягом трудової діяльності, відповідно до наказу МЗ України N45 від 31.03.94 р.
Періодичні методичні огляди мають проводитися раз на два роки комісією в складі терапевта, невропатолога та офтальмолога.
До складу комісії, що проводить попередні та періодичні медичні огляди, при необхідності (за наявністю медичних показань), можуть залучатись до оглядів лікарі інших спеціальностей.
Основними критеріями оцінки придатності до роботи з ПК мають бути показники стану органів зору: гострота зору, показники рефракції, акомодації, стану бінокулярного апарату ока тощо. При цьому необхідно враховувати також стан організму в цілому.
Жінки, що працюють з ВДТ, обов'язково оглядаються акушером-гінекологом один раз на два роки.
Жінки з часу встановлення вагітності та в період годування дитини грудьми до виконання всіх робіт, пов'язаних з використанням ПК, не допускаються.
Виконання вимог, наведених в Правилах, в комплексі з практичним здійсненням первинних та спеціальних заходів повинно стати нормою діяльності всіх фахівців, безпосередньо пов'язаних з навчальними та виробничими колективами.
ВИСНОВОК
Актуальність моєї програми полягає в тому, що вона буде ліцензована GNU General Public License. Це означає що кожний користувач зможе скачати вхідні коди, модифікувати їх по своєму бажанню і під свої потреби. Всі зміни в коді програми, які будуть зроблені третіми особами повинні бути викладенні в публічний доступ. Це також може сприяти подальшому удосконаленню програми.
У ході виконання задач, поставлених в дипломній роботі була написана програма на мові програмування Java для тестування учнів шкіл по іноземній мові.
Плюси даного рішення:
- відкритість;
- кросплатформеність;
- зручність у користуванні та розробці нових уроків;
- зручність у модернізації;
- розширюваність;
- адаптивність.
Мінуси даного рішення:
- для запуску програми потрібне встановлене виконавче середовище Java.
Список джерел інформації
1. Эккель Брюс. Философия Java. Библиотека программиста. 4-е изд. 2010 год, 640 стр.
2.Тимоти Р. Фишер. Java. Карманный справочник. 2008 г. 224 стр.
3.Эд Барнет. Eclipse IDE. Карманный справочник. 2006 г. , 160 стр.
4.Скотт Мюллер. Модернизация и ремонт ПК. – М.: Бином, 1998. – 944с.
5.Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн.Алгоритмы: построение и анализ 2-е издание. 2009 г. 1296 стр.
6.Азаренкова Г.М., Журавель Т.М., Михайленко Р.М. Фінанси підприємств: Навч. Посіб. Для самост. Вивчення дисципліни. – 2-ге вид., випр. і доп. – К.: Знання- Прес, 2006. – 287с.
7.Економіка підприємства: Підручник За заг. ред. С.Ф. Покропивного. – Вид. 2-ге, перероб. та доп. – К.: КНЕУ, 2001. – 528с.
8.Петрович Й. М., Кіт А.Ф., Кулішов В.В. та ін., Економіка підприємства: Підручник-За загальною редакцією Й.М. Петровича. – Львів: "Магнолія плюс", - 2004. – 680 с.
9.Шваб Л.І. Економіка підприємства: Навчальний посібник для студентів вищих навчальних закладів. 2-е вид. – К.: Каравела, 2005. – 508 с.
10.Жидецкий В.Ц., Джигирей В.С., Мельников А.В. Основы охраны труда. Учебник. – Изд. 2-е, дополненное. – Львов: Афиша, 2000. – 351 с.
11.Жидецький В. Ц. Охорона праці користувачів комп'ютерів - Львів: Афіша, 2000. - 174 c.
ПЕРЕЛІК ПРИЙНЯТИХ СКОРОЧЕНЬ, ОДИНИЦЬ, СИМВОЛІВ ТА ТЕРМІНІВ
ПК — персональний комп'ютер
ОЗП — оперативно запам'ятовуючий пристрій
Мб — мегабайт
GNU GPL — GNU General Public License, универсальная общественная лицензия