На рисунку 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.
Установка програми на операційній системі GNU\Linux (на прикладі 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();
gridBagConstraints1.gridx = 0;
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);