Міністерство освіти і науки, молоді та спорту України
Полтавський національний технічний університет
Ім. Юрія Кондратюка
Факультет інформаційних та телекомунікаційних технологій і систем
Курсова робота
з дисципліни «Теория алгоритмів»
ЗМІСТ
Постановка задачі 3
Вступ 4
Теорія 5
Нормальний алгоритм Маркова 5
Десяткова система числення. 9
Шістнадцяткова система числення. 10
Приклади 12
Практична реалізація 13
Лістинг програми 14
Результати роботи програми 23
Висновки 25
Література 26
ПОСТАНОВКА ЗАДАЧІ
Варіант 19
(Рак 202-ТН)
Скласти нормальний алгоритм Маркова для перетворення числа в десятковій системі числення в систему з основою 16
(наприклад
Вхідні дані:
255
Вихідні дані:
FF).
Вимоги до програми:
Можливість перегляду коду нормального алгоритму Маркова.
Покрокова візуалізація роботи програми.
Інтерфейс під Windows! Не консольний.
ВСТУП
Вважається, що за допомогою нормальних алгоритмів Маркова (алгорифмів) можливо задати будь-який алгоритм. У межах даноії курсової роботи складемо нормальний алгоритм Маркова для перетворення числа з десяткової системи числення в систему з основою 16.
Десятковою системою числення у повсякденному житті користується більша (якщо не вся) частина населення планети. Шістнадцяткову використовують в основному в обчислювальній техніці і програмуванні. Перед програмістами часто стоїть задача перетворення чисел з однієї системи числення в іншу.
Для перевірки роботи нормального алгоритму Маркова напишемо емулятор на мові програмування високого рівня Java.
Java — объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems (в последующем, приобретённой компанией Oracle). Приложения Java обычно компилируются в специальный байт-код, поэтому они могут работать на любой виртуальной Java-машине (JVM) независимо от компьютерной архитектуры. Дата официального выпуска — 23 мая 1995 года.
Для розробки своєї програми я використав середовище програмування Eclipse.
Eclipse (вимовляється «і-клі́пс», від англійського «затемнення») — вільне модульне інтегроване середовище розробки програмного забезпечення. Розробляється і підтримується Eclipse Foundation. Написаний в основному на Java, і може бути використаний для розробкизастосунків на Java і, за допомогою різніх плагінів, на інших мовах програмування, включаючи Ada, C, C++, COBOL, Perl, PHP, Python, R, Ruby(включно з каркасом Ruby on Rails), Scala, Clojure та Scheme. Середовища розробки часто називають Eclipse ADT (Ada Development Toolkit) для Ada, Eclipse CDT для C/C++, Eclipse JDT для Java, Eclipse PDT для PHP.
ТЕОРІЯ
Нормальний алгоритм Маркова
Для формалізації поняття алгоритму російський математик А.А. Марков запропонував використовувати асоціативні обчислення.
Розглянемо деякі поняття асоціативного обчислення. Нехай є алфавіт (кінцевий набір різних символів). Складові його символи будемо називати літерами. Будь кінцева послідовність літер алфавіту (лінійний їх ряд) називається словом в цьому алфавіті.Розглянемо два слова N і М в деякому алфавіті А. Якщо N є частиною М, то говорять, що N входить в М.Задамо в деякому алфавіті кінцеву систему підстановки N - М, S - Т ,..., де N, M, S, Т, ... - Слова в цьому алфавіті. Будь-яку підстановку NM можна застосувати до деякого слова К наступним способом: якщо в К є одне або кілька входжень слова N, то будь-яке з них може бути замінено словом М, і, навпаки, якщо є входження М, то його можна замінити словом N.Наприклад, в алфавіті А = {а, b, с} є слова N = ab, М = bcb, К = abcbcbab, Замінивши в слові К слово N на М, одержимо bcbcbcbab або abcbcbbcb, і, навпаки, замінивши М на N, отримаємо aabcbab або аbсаbаb.Підстановка ab - bcb неприпустима до слова bacb, так як не ab, ні bcb не входить в це слово. До отриманих за допомогою допустимих підстановок слів можна знову застосувати допустимі підстановки і т.д. Сукупність усіх слів у даному алфавіті разом з системою допустимих підстановки називають асоціативним обчисленням. Щоб задати асоціативне числення, досить задати алфавіт і систему підстановки.Слова P1 і Р2 в деякому асоціативному обчисленні називаються суміжними, якщо одна з них може бути перетворено в інше однократним застосуванням допустимої підстановки.
Послідовність слів Р, P1, Р2,..., М називається дедуктивної ланцюжком, що веде від слова Р до слова М, якщо кожне з двох поруч розташованих слів цього ланцюжка - суміжне.Слова Р і М називають еквівалентними, якщо існує ланцюжок від Р до М і назад.Приклад:Алфавіт Підстановки{а, b, с, d, е} ас - Сa,ad - da; eca - aebc - cb; eda - bebd - db; edb - be Слова abcde і acbde - суміжні (підстановка bc - cb). Слова abcde - cadbe еквівалентні. Може бути розглянутий спеціальний вид асоціативного числення, в якому підстановки є орієнтованими: N → М (стрілка означає, що підстановку дозволяється проводити лише зліва направо). Для кожного асоціативного обчислення існує завдання: для будь-яких двох слів визначити, чи є вони еквівалентними чи ні. Будь-який процес виведення формул, математичні викладки і перетворення також є дедуктивними ланцюжками в деякому асоціативному численні. Побудова асоціативних числень є універсальним методом детермінованою переробки інформації і дозволяє формалізувати поняття алгоритму.
Введемо поняття алгоритму на основі асоціативного обчислення: алгоритмом в алфавіті А називається зрозуміле точне розпорядження, що визначає процес над словами з А і допускає будь-яке слово в якості початкового. Алгоритм в алфавіті А задається у вигляді системи допустимих підстановки, доповненої точним приписом про те, в якому порядку потрібно застосовувати допустимі підстановки і коли настає зупинка.Приклад:Алфавіт: Система підстановки В:А = {а, b, с} cb - ccССА - аbab - bса Припис про застосування підстановки: у довільному слові Р треба зробити можливі підстановки, замінивши ліву частину підстановки на праву; повторити процес з знову отриманим словом.Так, застосовуючи систему підстановки В з розглянутого прикладу до слів babaac і bсaсаbс отримуємо:babaac → bbcaaac → зупинкаbcacabc → bcacbcac → bcacccac → bсасаbс → нескінченні процес (зупинки немає), так як ми отримали вихідне слово. Запропонований А.А. Марковим спосіб уточнення поняття алгоритму заснований на понятті нормального алгоритму, який визначається наступним чином. Нехай заданий алфавіт А і система підстановки В. Для довільного слова Р підстановки з В підбираються в тому ж порядку, в якому вони слідують у В.. Якщо відповідної підстановки немає, то процес зупиняється. В іншому випадку береться перша з відповідних підстановки і проводиться заміна її правою частиною першого входження її лівій частині в Р. Потім всі дії повторюються для отриманого слова P1. Якщо застосовується остання підстановка з системи В, процес зупиняється.
Такий набір приписів разом з алфавітом А і набором підстановки У визначають нормальний алгоритм. Процес зупиняється тільки у двох випадках: 1) коли відповідна підстановка не знайдена, 2) коли застосована остання підстановка з їх набору. Різні нормальні алгоритми відрізняються один від одного алфавітами і системами підстановки.Наведемо приклад нормального алгоритму, що описує додавання-натуральних чисел (представлених наборами одиниць).Приклад:Алфавіт: Система підстановки В:А = (+, 1) 1 + → + 1+ 1 → 11 → 1Слово Р: 11 +11 +111Послідовна переробка слова Р за допомогою нормального алгоритму Маркова проходить через наступні етапи:Р = 11 + 11 + 111 Р5 = + 1 + 111 111Р1 = 1 + 111 + 111 Р6 = + + 1111111Р2 = + 1111 + 111 = Р7 + 1111111Р3 = + 111 + 1111 Р8 = 1111111Р4 = + 11 + 11 111 Р9 = 1111111Нормальний алгоритм Маркова можна розглядати як універсальну форму завдання будь-якого алгоритму. Універсальність нормальних алгоритмів декларується принципом нормалізації: для будь-якого алгоритму в довільному кінцевому алфавіті А можна побудувати еквівалентний йому нормальний алгоритм над алфавітом А,Роз'яснимо останнє твердження. У деяких випадках не вдається побудувати нормальний алгоритм, еквівалентний даному в алфавіті А, якщо використовувати в підстановках алгоритму тільки букви цього алфавіту. Однак, можна побудувати необхідний нормальний алгоритм, виробляючи розширення алфавіту А (додаючи до нього деяке число нових букв). У цьому випадку говорять, що побудований алгоритм є алгоритмом над алфавітом А, хоча він буде застосовуватися лише до слів у вихідному алфавіті A.
Якщо алгоритм N заданий у деякому розширенні алфавіту А, то говорять, що N є нормальний алгоритм над алфавітом А.Домовимося називати той чи інший алгоритм нормалізуемих, якщо можна побудувати еквівалентний йому нормальний алгоритм, і ненормалізуемим в іншому випадку. Принцип нормалізації тепер може бути висловлений у видозміненій формі: всі алгоритми нормалізуемих.Даний принцип не може бути строго доведений, оскільки поняття довільного алгоритму не є строго визначеним і грунтується на тому, що всі Відомі в даний час алгоритми є нормалізуемих, а способи композиції алгоритмів, що дозволяють будувати нові алгоритми з вже відомих, не виводять за межі класу нормалізуемих алгоритмів. Нижче перераховані способи композиції нормальних алгоритмів.I. Суперпозиція алгоритмів. При суперпозиції двох алгоритмів А і В вихідна слово першого алгоритму розглядається як вхідний слово другий алгоритм В. Результат суперпозиції С може бути представлений у вигляді С (р) = В (А (р)),II. Об'єднання алгоритмів. Об'єднанням алгоритмів А і В в одному і тому ж алфавіті називається алгоритм С в тому ж алфавіті, що перетворює будь-яке слово р, міститься в перетині областей визначення алгоритмів А і В, у записані поруч слова А (р) і В (р).III. Розгалуження алгоритмів. Розгалуження алгоритмів є композицією D трьох алгоритмів А, В і С, причому область визначення алгоритму D є перетином областей визначення всіх трьох алгоритмів А, В і С, а для будь-якого слова р з цього перетину D (p) = А (р), якщо С (р) = е, D (p) = B (p), якщо С (р) = е, де е - порожній рядок.IV. Ітерація алгоритмів. Ітерація (повторення) являє собою таку композицію З двох алгоритмів А і В, що для будь-якого вхідного слова р відповідне слово С (р) утворюється в результаті послідовного багаторазового застосування алгоритму А до тих пір, поки не вийде слово, преобразуемое алгоритмом В.Нормальні алгоритми Маркова є не тільки засобом теоретичних побудов, але й основою спеціалізованої мови програмування, що застосовується як мова символьних перетворень при розробці систем штучного інтелекту. Це один з небагатьох мов, розроблених в Росії і що здобули популярність у всьому світі.Існує строгий доказ того, що за можливостями перетворення нормальні алгоритми Маркова еквівалентні машинам Тюринга.
Десяткова система числення
Десяткова система числення — це позиційна система числення із основою 10. Кожне число в якій записується за допомогою 10-ти символів, цифр - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Запис числа формується за загальним принципом: на n-й позиції (справа наліво від 0) стоїть цифра, що відповідає кількості n-х степенів десятки у цьому числі.
Наприклад: 123456 = 1·105 + 2·104 + 3·103 + 4·102 + 5·101 + 6·100
Дробова частина числа формується за таким самим принципом, тільки позиція цифри в дробовій частині відраховується від коми зліва направо починаючи з 1 і береться зі знаком "-".
Наприклад: 123,456 = 1·102 + 2·101 + 3·100 + 4·10-1 + 5·10-2 + 6·10-3
Шістнадцяткова система числення.
Шістнадцяткова систе́ма чи́слення — це позиційна система числення, кожне число в якій записується за допомогою 16-ти символів. Цю систему часто називають також Hex (початкові літери англ. hexadecimal — шіснадцятковий). Спочатку планувалось вживати латинське sexa замість hexa, проте це слово сприймалось неоднозначно. Для запису чисел в цій системі окрім 10 арабських цифр (від 0 до 9) використовують 6 літер латинської абетки: A, B, C, D, E, F.
Запис числа формується за загальним принципом: на n-й позиції (справа наліво від 0) стоїть цифра, що відповідає кількості n-х степенів шістнадцяти у цьому числі. Наприклад, число записане в десятковій системі як 1000, в hex записується як 3E8, де:
3x162 + 14x161 + 8x160 = 768 + 224 + 8 = 1000.
Шістнадцяткова система числення широко вживана в інформатиці, оскільки значення кожного байту можна записати у вигляді двох цифр шістнадцятеричної системи. Таким чином значення послідовних байтів можна представити у вигляді списку двозначних чисел. В той же час запис 4 бітів можна представити однією шістнадцятковою цифрою.
Для переводу десяткового числа в число з основою 16 я користувався такими правилами:
#=>#0=
L0>L
9$>8
8$>7
7$>6
6$>5
5$>4
4$>3
3$>2
2$>1
1$>0
L0$>L
0$>$9
&0=>1=
&1=>2=
&2=>3=
&3=>4=
&4=>5=
&5=>6=
&6=>7=
&7=>8=
&8=>9=
&9=>A=
&A=>B=
&B=>C=
&C=>D=
&D=>E=
&E=>F=
&F=>+0=
0+>1
1+>2
2+>3
3+>4
4+>5
5+>6
6+>7
7+>8
8+>9
9+>A
A+>B
B+>C
C+>D
D+>E
E+>F
F+>+0
#+>#1
*+>*1
0#>$9*&
9#>8*&
8#>7*&
7#>6*&
6#>5*&
5#>4*&
4#>3*&
3#>2*&
2#>1*&
1#>0*&
&1>1&
&2>2&
&3>3&
&4>4&
&5>5&
&6>6&
&7>7&
&8>8&
&9>9&
&A>A&
&B>B&
&C>C&
&D>D&
&E>E&
&0>0&
&F>F&
*>#
L#>
L>
=>
Необхідною умовою для запуску програми є наявність встановленої JRE версії 1.6 і вище.
Приклади
1010=A16
1610=1016
100010=3E816
25510=FF16
ПРАКТИЧНА РЕАЛІЗАЦІЯ
Для виконання завдання була розроблена програма, що отримує від користувача число в десятковій системі, а також набір правил Нормального алгоритму Маркова. Основна логіка програми зосереджена у класі Algoritm, що міститься у файлі Algoritm.java.
Рядок ХХХ, введений користувачем перетворюється на рядок вигляду LXXX#=. Символ «L» позначає початок виразу, «=» кінець виразу, «#» відділяє десяткову від шістнадцяткової частини виразу.
Правила можуть бути уведені за допомогою вікна додавання правил, а також завантажені з файлу та збережені у файл. Набір правил для перетворення числа з десяткової в шістнадцяткову систему збережений у файлі sixth.
Алгоритм оснований на циклі віднімань одиниці від лівої частини виразу, де міститься число у десятковій системі, з одночасним додаванням одиниці до правої частини, де міститься результат у шістнадцядковій системі.
Лістинг програми
TMainClass.java
import java.awt.FlowLayout;
import java.awt.event.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class Root implements ActionListener {
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Root();
}
});
}
JFrame jfrm;
JDialog jdRules;
JDialog jdAddRule;
JFileChooser jfc;
static ArrayList<Rule> rulesList = new ArrayList<Rule>();
static Alogritm nam = new Alogritm(null);
int[] rows;
BufferedReader br;
File file;
FileReader readFile;
FileWriter writeFile;
JMenuBar jmb;
JMenu jmFile;
JMenuItem jmiNew;
JMenuItem jmiOpen;
JMenuItem jmiSave;
JMenuItem jmiExit;
JMenu jmHelp;
JMenuItem jmiAbout;
JPanel jPanOne;
JLabel jlabOpOne;
JLabel jlabOpTwo;
JTextField jtextOpOne;
JTextField jtextOpTwo;
JTable jtabResult;
JScrollPane jScroll;
JButton jbRules;
JButton jbStart;
JTable jtabRules;
ListSelectionModel lsmRow;
JScrollPane jscrRules;
JButton jbAdd;
JButton jbDel;
JButton jbOk;
JTextField jtextRuleOne;
JTextField jtextRuleTwo;
JCheckBox jcboxFinal;
JButton jbAddRuleCancel;
JButton jbAddRuleOk;
Root() {
// Створення головного фрейму вікна, задання основних властивостей
jfrm = new JFrame("Course work");
jfrm.setLayout(new FlowLayout());
jfrm.setSize(525, 575);
jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// FileChooser
jfc = new JFileChooser();
// Створення меню програми
jmb = new JMenuBar();
jmFile = new JMenu("Файл");
jmiNew = new JMenuItem("Новий");
jmiOpen = new JMenuItem("Відкрити...");
jmiSave = new JMenuItem("Зберегти...");
jmiExit = new JMenuItem("Вийти");
jmFile.add(jmiNew);
jmFile.add(jmiOpen);
jmFile.add(jmiSave);
jmFile.addSeparator();
jmFile.add(jmiExit);
jmHelp = new JMenu("Допомога");
jmiAbout = new JMenuItem("Про програму...");
jmFile.addSeparator();
jmHelp.add(jmiAbout);
jmb.add(jmFile);
jmb.add(jmHelp);
jmiNew.addActionListener(this);
jmiOpen.addActionListener(this);
jmiSave.addActionListener(this);
jmiExit.addActionListener(this);
jmiAbout.addActionListener(this);
// Створення міток і полів для введення операндів:
jPanOne = new JPanel();
jlabOpOne = new JLabel("Операнд:");
jtextOpOne = new JTextField(20);
jlabOpOne.setDisplayedMnemonic('п');
jlabOpOne.setLabelFor(jtextOpOne);
jPanOne.add(jlabOpOne);
jPanOne.add(jtextOpOne);
// Створення таблиці для відображення ходу алгоритму
jtabResult = new JTable(new ResultTableModel());
jtabResult.getColumnModel().getColumn(0).setMaxWidth(50);
jScroll = new JScrollPane(jtabResult);
// Створення кнопок для запуску алгоритму та перегляду/зміни правил
jbRules = new JButton("Правила...");
jbStart = new JButton("Старт");
jbRules.addActionListener(this);
jbStart.addActionListener(this);
// Створення діалогового вікна правил
jdRules = new JDialog(jfrm, "Правила");
jdRules.setSize(525, 575);
jdRules.setLayout(new FlowLayout());
jtabRules = new JTable(new RulesTableModel());
jscrRules = new JScrollPane(jtabRules);
jtabRules.getColumnModel().getColumn(0).setMaxWidth(30);
jtabRules.getColumnModel().getColumn(2).setMaxWidth(30);
jtabRules.getColumnModel().getColumn(4).setMaxWidth(30);
lsmRow = jtabRules.getSelectionModel();
lsmRow.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
}
});
jbAdd = new JButton("Додати...");
jbDel = new JButton("Видалити");
jbOk = new JButton("OK");
jbAdd.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jdAddRule.setVisible(true);
}
});
jbDel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
rows = jtabRules.getSelectedRows();
for (int i = 0; i < rows.length; i++) {
rulesList.remove(rows[i]);
}
jtabRules.setModel(new RulesTableModel());
jtabRules.getColumnModel().getColumn(0).setMaxWidth(30);
jtabRules.getColumnModel().getColumn(2).setMaxWidth(30);
jtabRules.getColumnModel().getColumn(4).setMaxWidth(30);
}
});
jbOk.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jdRules.setVisible(false);
}
});
jdRules.add(jscrRules);
jdRules.add(jbAdd);
jdRules.add(jbDel);
jdRules.add(jbOk);
// Створення діалогового вікна додавання правил
jdAddRule = new JDialog(jdRules, "Додати правило");
jdAddRule.setSize(400, 140);
jdAddRule.setLayout(new FlowLayout());
jtextRuleOne = new JTextField("Початковий рядок", 12);
jtextRuleTwo = new JTextField("Кінцевий рядок", 12);
jcboxFinal = new JCheckBox("Фінальна команда", false);
jbAddRuleCancel = new JButton("Скасувати");
jbAddRuleOk = new JButton("Додати");
jbAddRuleCancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jdAddRule.setVisible(false);
}
});
jbAddRuleOk.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
addRule();
}
});
jdAddRule.add(jtextRuleOne);
jdAddRule.add(jtextRuleTwo);
jdAddRule.add(jcboxFinal);
jdAddRule.add(jbAddRuleCancel);
jdAddRule.add(jbAddRuleOk);
// Виведення вікна на екран
jfrm.setJMenuBar(jmb);
jfrm.add(jPanOne);
jfrm.add(jScroll);
jfrm.add(jbRules);
jfrm.add(jbStart);
jfrm.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("Новий")) {
newFile();
}
if (e.getActionCommand().equals("Відкрити...")) {
try {
openFile();
} catch (IOException e1) {
}
}
if (e.getActionCommand().equals("Зберегти...")) {
try {
saveFile();
} catch (IOException e1) {
}
}
if (e.getActionCommand().equals("Вийти")) {
System.exit(0);
}
if (e.getActionCommand().equals("Про програму...")) {
JOptionPane.showMessageDialog(jfrm, "Автор Рак Богдан. Полтава 2011");
}
if (e.getActionCommand().equals("Правила...")) {
jdRules.setVisible(true);
}
if (e.getActionCommand().equals("Старт")) {
startNAM();
}
}
public void addRule() {
rulesList.add(new Rule(jtextRuleOne.getText(), jtextRuleTwo.getText(),
jcboxFinal.isSelected()));
jtabRules.setModel(new RulesTableModel());
jtabRules.getColumnModel().getColumn(0).setMaxWidth(30);
jtabRules.getColumnModel().getColumn(2).setMaxWidth(30);
jtabRules.getColumnModel().getColumn(4).setMaxWidth(30);
}
void newFile() {
rulesList = new ArrayList<Rule>();
nam = new Alogritm(null);
jtabRules.setModel(new RulesTableModel());
jtabResult.setModel(new ResultTableModel());
jtabRules.getColumnModel().getColumn(0).setMaxWidth(30);
jtabRules.getColumnModel().getColumn(2).setMaxWidth(30);
jtabRules.getColumnModel().getColumn(4).setMaxWidth(30);
jtabResult.getColumnModel().getColumn(0).setMaxWidth(50);
}
void openFile() throws IOException {
int openRes, num;
String str, first, second;
boolean isFinal;
openRes = jfc.showOpenDialog(jfrm);
if (openRes == JFileChooser.APPROVE_OPTION) {
file = jfc.getSelectedFile();
if (file.exists()) {
readFile = new FileReader(file);
br = new BufferedReader(readFile);
str = br.readLine();
num = Integer.parseInt(str);
for (int i = 0; i < num; i++) {
str = br.readLine();
first = str.substring(0, str.indexOf('>'));
second = str.substring(str.indexOf('>') + 1,
str.length() - 1);
if (Integer.parseInt(str.substring(str.length() - 1)) == 1) {
isFinal = true;
} else {
isFinal = false;
}
rulesList.add(new Rule(first, second, isFinal));
}
jtabRules.setModel(new RulesTableModel());
jtabRules.getColumnModel().getColumn(0).setMaxWidth(30);
jtabRules.getColumnModel().getColumn(2).setMaxWidth(30);
jtabRules.getColumnModel().getColumn(4).setMaxWidth(30);
jtabResult.getColumnModel().getColumn(0).setMaxWidth(50);
readFile.close();
}
}
}
void saveFile() throws IOException {
int openRes;
Integer num;
String str, first, second;
char isFinal;
openRes = jfc.showSaveDialog(jfrm);
if (openRes == JFileChooser.APPROVE_OPTION) {
file = jfc.getSelectedFile();
writeFile = new FileWriter(file);
num = rulesList.size();
writeFile.write(num.toString() + '\n');
for (int i = 0; i < num; i++) {
first = rulesList.get(i).first;
second = rulesList.get(i).second;
if (rulesList.get(i).isFinal)
isFinal = '1';
else
isFinal = '0';
str = first + '>' + second + isFinal + '\n';
writeFile.write(str);
}
writeFile.close();
}
}
public void startNAM() {
String str ='L' + jtextOpOne.getText() + "#=";
nam = new Alogritm(str);
jtabResult.setModel(new ResultTableModel(jtextOpOne.getText()));
jtabResult.getColumnModel().getColumn(0).setMaxWidth(50);
}
}
Rule.java
public class Rule {
public String first;
public String second;
public boolean isFinal;
Rule(String s1, String s2, boolean fin) {
first = s1;
second = s2;
isFinal = fin;
}
public String toString() {
return first + "->" + second + " is final: " + isFinal;
}
}
RulesTableModel.java
import javax.swing.table.AbstractTableModel;
public class RulesTableModel extends AbstractTableModel {
String sTo = "->";
String colNames[] = { "№", "Початковий рядок", "->", "Кінцевий рядок", "*" };
public String getColumnName(int c) {
return colNames[c];
}
public int getRowCount() {
return Root.rulesList.size();
}
public int getColumnCount() {
return 5;
}
public Object getValueAt(int rowIndex, int columnIndex) {
if (columnIndex == 0)
return rowIndex + 1;
if (columnIndex == 1) {
return Root.rulesList.get(rowIndex).first;
}
if (columnIndex == 2)
return sTo;
if (columnIndex == 3) {
return Root.rulesList.get(rowIndex).second;
}
if (columnIndex == 4) {
if (Root.rulesList.get(rowIndex).isFinal)
return '*';
return ' ';