Смекни!
smekni.com

Створення навчальної програми по вивченню іноземної мови (стр. 5 из 10)

Це досягається перш за все стандартизацією “бінарного формату кодів”. Проміжний код не залежить від конкретної апаратної платформи, операційної системи і типу віконного інтерфейсу. Для того, щоб програми, написані на 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("[ &bsol;";,&bsol;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 — Елементи управління тестом