МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
ЛЬВІВСЬКИЙ ДЕРЖАВНИЙ ІНСТИТУТ НОВІТНІХ ТЕХНОЛОГІЙ
ТА УПРАВЛІННЯ ІМЕНІ ВЯЧЕСЛАВА ЧОРНОВОЛА
Факультет інформаційних технологій
ДИПЛОМНА РОБОТА
на тему:
«Створення калькулятора (множення)»
Львів – 2008р
Тема: «Створення калькулятора»
Мета: скласти алгоритм програми калькулятор.
Завдання: розробити клас, який реалізує функцію множення. Зобразити у вигляді UML діаграм структуру розробленого програмного продукту.
Хід роботи:
1. Визначення інтерфейсу калькулятора.
Вікно калькулятора, має наступні кнопки:
· Кнопка множення.
· Набір кнопок з цифрами від 0 до 9.
· Кнопка очистити.
· Кнопка виконання операції.
Потім користувач відкриває програму калькулятор, в якій в полі вводу-виводу вже стоїть 0 по замовчуванню.
2. Визначення дій після того, як відбувся запуск програми калькулятор.
Виділяємо певну область пам'яті, щоб мати можливість зберігати вхідні дані і результат.
· Якщо натиснути кнопку С то очиститься вікно редагування(вводу виводу).
· Якщо натиснути кнопки із цифрами від 0 до 9 натиснувши комбінацію цифр, вона занесеться в вікно редагування (вводу), після чого ми натискаємо кнопку виконання операції.
Після обчислення даних, результат знову повертається в вікно (вводу-виводу), в системну мітку яка прихована за вікном редагування.
В нашому випадку це кнопка * (множення).
· Вивести результат на екран, в результаті натискання кнопки *.
Це ми розглянули основні операції при обчисленні десяткового логарифму.
· Тепер ми розглянемо систему вводу чисел. Це здійснюється таким чином, кожній кнопці присвоюється значення цифри, яке копіюється в поле вводу-виводу. Це рівноцінно вводу значень з клавіатури.
Діаграма діяльності програми «калькулятор»
Діаграми діяльності забезпечують динамічне подання системи. Вони особливо важливі при моделюванні функціональності системи і виділяють потік керування між об’єктами. “Динамізм” таких моделей полягає в тому, що в них відображається зміна стану в процесі роботи системи.
Засоби мови UML, для створення динамічних моделей багато чисельні та різнобічні. Ці засоби орієнтовані не тільки на власні програмні системи, але і на відображення вимог замовника до поведінки таких систем. Для моделювання поведінки системи використовують:1.) автомати, 2.) взаємодія.
- Автомати (State machine)описують поведінку в терміналах послідовність станів через які проходить об’єкт на протязі свого життя. Таким чином, автомат задає поведінку системи як цілої, єдиної системи; моделює життєвий цикл єдиного об’єкту. В силу автоматичний підхід зручно застосовувати для формалізації динаміки окремого складного для розуміння блоку системи.
- Взаємодія (Interaction) описує поведінку в терміналах обміну повідомленнями між об’єктами. Також взаємодії визначають поведінку системи у вигляді комунікації між її частинами (об’єктами), подаючи систему як сукупність об’єктів які працюють разом. І тому взаємодія є основним апаратом для фіксації повної динаміки системи.
Виходячи із вище вказаного можна сказати що діаграмна діяльність - це спеціальна різновидність діаграми схем станів, яка вказує потік від дії до дії в середовищі системи.
Діаграма схем станів
Діаграма схем станів – одна з п’яти діаграм UML, що моделюють динаміку систем. Діаграма схем станів відображає скінчений автомат, виділяючи потік керування, який переходить від стану до стану. Скінчений автомат – поведінка, що розглядаються як відповідь на події та включає реакцію на ці події.
Даним знаком позначається вибір: дії та операції
Функціональна схема програми «Калькулятор»
Для отримання результату при виконанні будь якої тригонометричної чи арифметичної операції не можна обійтись без поля вводу даних в певні поля і натиснути кнопку завершення операції тобто дорівнює, після чого результат виведеться в поле виводу даних. Це видно із функціональної схеми показаної нижче.
Умовно периферійні складові нашої програми можна поділити на:
1. ввід даних;
2. вивід даних;
3. обчислення даних;
4. супроводжуючий графічний інтерфейс.
Діаграми в UML
Діаграма – графічне подання множини елементів, що найчастіше зображається зв’язним графом з вершин (предметів) і дуг (відношень). Діаграми малюються візуалізації системи з різних точок зору, потім перетворюються в систему. Як правило діаграма дає неповне відображення елементів, які створюють систему. Хоча один і той же елемент може появитись у всіх діаграмах, на практиці він з’являється тільки в деяких. Теоретично діаграма може містити довільну комбінацію предметів, які відповідають п’яти поданням (зображенням) архітектури ПС. Тому UML містить девять видів діаграм:
1. діаграми класів;
2. діаграми об’єктів;
3. діаграми UseCase (діаграми прецедентів);
4. діаграми послідовності;
5. діаграми співробітництва;
6. діаграми схем станів;
7. діаграми діяльності;
8. компонентні діаграми
9. діаграми розміщення (розгортання);
Статична діаграма класів
Діаграма класів показує набір класів, інтерфейсів, кооперацій та їх відношень. При моделюванні об’єктно - орієнтованих систем діаграми класів використовуються найбільш часто. Діаграми класів забезпечують статичне проектне подання системи.
Діаграми класів, що включають активні класи, забезпечують статичне подання процесів.
Протокол відображає графічне зображення (віконне) реалізації калькулятора (множення чисел).
Включає в себе наступні елементи та компоненти:
1. основна форма (Form1);
2. блок чисельної клавіатури кнопок (Button);
3. блок операційних кнопок (операцій ) визначення десяткового логарифму (Button);
4. поле для вводу даних (Edit1);
5. поле для відображення результату (на мітці) (Label1);
Протокол реалізації даної програми в (віконному) режимі JavaBuilder 2005
Лістінг програмного продукту «КАЛЬКУЛЯТОР» що перемножує числа
package rozr_bincalc_multiplication;
import java.awt.*;
import javax.swing.*;
import com.borland.jbcl.layout.XYLayout;
import com.borland.jbcl.layout.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Rozr_BinCalc_Multiplication extends JFrame {
String x1 = "", x2, x3, str;
double d1, d2, res, b1 = 1.0, b2 = 2.0;
public Rozr_BinCalc_Multiplication() {
super();
setLocation(300, 100);
setSize(310, 360);
setVisible(true);
try {
jbInit();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static double roundDouble(double val, int places) {
long factor = (long)Math.pow(10,places);
val = val * factor;
long tmp = Math.round(val);
return (double)tmp / factor;
}
public static void main(String[] args) {
new Rozr_BinCalc_Multiplication();
}
private void jbInit() throws Exception {
BOp = new Binary_Operations();
this.getContentPane().setBackground(new Color(180, 166, 159));
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setForeground(SystemColor.control);
this.setIconImage(null);
this.setResizable(false);
this.setTitle("Binary calculator - multiplication");
this.getContentPane().setLayout(xYLayout1);
xYLayout1.setWidth(442);
xYLayout1.setHeight(400);
jTextField1.setEditable(false);
jTextField1.setHorizontalAlignment(SwingConstants.RIGHT);
jButton1.addActionListener(new Rozr_BinCalc_Multiplication_jButton1_actionAdapter(this));
jButton2.addActionListener(new Rozr_BinCalc_Multiplication_jButton2_actionAdapter(this));
jButton3.addActionListener(new Rozr_BinCalc_Multiplication_jButton3_actionAdapter(this));
jButton8.setText("8");
jButton8.addActionListener(new Rozr_BinCalc_Multiplication_jButton8_actionAdapter(this));
jButton9.setText("9");
jButton9.addActionListener(new Rozr_BinCalc_Multiplication_jButton9_actionAdapter(this));
jButton10.setText(",");
jButton10.addActionListener(new Rozr_BinCalc_Multiplication_jButton10_actionAdapter(this));
jButton11.setText("0");
jButton11.addActionListener(new Rozr_BinCalc_Multiplication_jButton11_actionAdapter(this));
jButton12.setText("-");
jButton12.addActionListener(new Rozr_BinCalc_Multiplication_jButton12_actionAdapter(this));
jButton4.addActionListener(new Rozr_BinCalc_Multiplication_jButton4_actionAdapter(this));
jButton5.addActionListener(new Rozr_BinCalc_Multiplication_jButton5_actionAdapter(this));
jButton6.addActionListener(new Rozr_BinCalc_Multiplication_jButton6_actionAdapter(this));
jButton7.addActionListener(new Rozr_BinCalc_Multiplication_jButton7_actionAdapter(this));
jButton13.setText("*");
jButton13.addActionListener(new Rozr_BinCalc_Multiplication_jButton13_actionAdapter(this));
jButton14.setText("=");
jButton14.addActionListener(new Rozr_BinCalc_Multiplication_jButton14_actionAdapter(this));
jButton15.setText("C");
jButton15.addActionListener(new Rozr_BinCalc_Multiplication_jButton15_actionAdapter(this));
this.getContentPane().add(jButton2, new XYConstraints(100, 80, 42, 42));
this.getContentPane().add(jButton1, new XYConstraints(40, 80, 42, 42));
this.getContentPane().add(jButton3, new XYConstraints(160, 80, 42, 42));
this.getContentPane().add(jButton7, new XYConstraints(40, 200, 42, 42));
this.getContentPane().add(jButton6, new XYConstraints(160, 140, 42, 42));
this.getContentPane().add(jButton5, new XYConstraints(100, 140, 42, 42));
this.getContentPane().add(jButton4, new XYConstraints(40, 140, 42, 42));
this.getContentPane().add(jButton8, new XYConstraints(100, 200, 42, 42));
this.getContentPane().add(jButton10, new XYConstraints(40, 260, 42, 42));
this.getContentPane().add(jButton9, new XYConstraints(160, 200, 42, 42));
this.getContentPane().add(jButton11, new XYConstraints(100, 260, 42, 42));
this.getContentPane().add(jButton12, new XYConstraints(160, 260, 42, 42));
this.getContentPane().add(jButton14, new XYConstraints(220, 260, 42, 42));
this.getContentPane().add(jTextField1, new XYConstraints(40, 23, 220, -1));
this.getContentPane().add(jButton15, new XYConstraints(220, 140, 42, 42));
this.getContentPane().add(jButton13, new XYConstraints(220, 200, 42, 42));
jTextField1.setText("0");
jButton1.setText("1");
jButton2.setText("2");
jButton3.setText("3");
jButton4.setText("4");
jButton5.setText("5");
jButton6.setText("6");
jButton7.setText("7");
}
Binary_Operations BOp;
XYLayout xYLayout1 = new XYLayout();
JButton jButton1 = new JButton();
JTextField jTextField1 = new JTextField();
JButton jButton2 = new JButton();
JButton jButton3 = new JButton();
JButton jButton4 = new JButton();
JButton jButton5 = new JButton();
JButton jButton6 = new JButton();
JButton jButton7 = new JButton();
JButton jButton8 = new JButton();
JButton jButton9 = new JButton();
JButton jButton10 = new JButton();
JButton jButton11 = new JButton();
JButton jButton12 = new JButton();
JButton jButton13 = new JButton();
JButton jButton14 = new JButton();
JButton jButton15 = new JButton();
public void jButton1_actionPerformed(ActionEvent e) {
x1 = x1 + "1";
jTextField1.setText(x1);
}
public void jButton2_actionPerformed(ActionEvent e) {
x1 = x1 + "2";
jTextField1.setText(x1);
}
public void jButton3_actionPerformed(ActionEvent e) {
x1 = x1 + "3";
jTextField1.setText(x1);
}
public void jButton4_actionPerformed(ActionEvent e) {
x1 = x1 + "4";
jTextField1.setText(x1);
}
public void jButton5_actionPerformed(ActionEvent e) {
x1 = x1 + "5";
jTextField1.setText(x1);
}
public void jButton6_actionPerformed(ActionEvent e) {
x1 = x1 + "6";
jTextField1.setText(x1);
}
public void jButton7_actionPerformed(ActionEvent e) {
x1 = x1 + "7";
jTextField1.setText(x1);
}
public void jButton8_actionPerformed(ActionEvent e) {
x1 = x1 + "8";
jTextField1.setText(x1);
}
public void jButton9_actionPerformed(ActionEvent e) {
x1 = x1 + "9";
jTextField1.setText(x1);
}
public void jButton10_actionPerformed(ActionEvent e) {
x1 = x1 + ".";
jTextField1.setText(x1);
}
public void jButton11_actionPerformed(ActionEvent e) {
x1 = x1 + "0";
jTextField1.setText(x1);
}
public void jButton12_actionPerformed(ActionEvent e) {
if (Double.parseDouble(x1)>0)
{
x1 = "-" + x1;
jTextField1.setText(x1);
}
else
{
x1 = ""+(Double.parseDouble(x1)*(-1))+"";
jTextField1.setText(x1);
}
}
public void jButton13_actionPerformed(ActionEvent e) {
x2 = x1;
x1 = "";
}
public void jButton14_actionPerformed(ActionEvent e) {
x3 = x1;
d1 = roundDouble(Double.parseDouble(x2), 10);
d2 = roundDouble(Double.parseDouble(x3), 10);
String str1 = BOp.Double_to_Binary(b1);
String str2 = BOp.Double_to_Binary(b2);
String ress = BOp.Bin_Multiplication(str1,str2);
res = BOp.Binary_to_Double(ress);
res = roundDouble(d1*d2, 10);
str = ""+res+"";
jTextField1.setText(str);
x1 = jTextField1.getText();
}
public void jButton15_actionPerformed(ActionEvent e) {
jTextField1.setText("0");
x1 = "";
x2 = "";
x3 = "";
str = "";
d1 = 0;
d2 = 0;
}
class Rozr_BinCalc_Multiplication_jButton1_actionAdapter implements ActionListener {
private Rozr_BinCalc_Multiplication adaptee;
Rozr_BinCalc_Multiplication_jButton1_actionAdapter(Rozr_BinCalc_Multiplication adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton1_actionPerformed(e);
}
}
class Rozr_BinCalc_Multiplication_jButton2_actionAdapter implements ActionListener {
private Rozr_BinCalc_Multiplication adaptee;
Rozr_BinCalc_Multiplication_jButton2_actionAdapter(Rozr_BinCalc_Multiplication adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton2_actionPerformed(e);
}
}
class Rozr_BinCalc_Multiplication_jButton3_actionAdapter implements ActionListener {
private Rozr_BinCalc_Multiplication adaptee;
Rozr_BinCalc_Multiplication_jButton3_actionAdapter(Rozr_BinCalc_Multiplication adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton3_actionPerformed(e);
}
}
class Rozr_BinCalc_Multiplication_jButton4_actionAdapter implements ActionListener {
private Rozr_BinCalc_Multiplication adaptee;
Rozr_BinCalc_Multiplication_jButton4_actionAdapter(Rozr_BinCalc_Multiplication adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton4_actionPerformed(e);
}
}
class Rozr_BinCalc_Multiplication_jButton5_actionAdapter implements ActionListener {
private Rozr_BinCalc_Multiplication adaptee;
Rozr_BinCalc_Multiplication_jButton5_actionAdapter(Rozr_BinCalc_Multiplication adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton5_actionPerformed(e);
}
}
class Rozr_BinCalc_Multiplication_jButton6_actionAdapter implements ActionListener {
private Rozr_BinCalc_Multiplication adaptee;
Rozr_BinCalc_Multiplication_jButton6_actionAdapter(Rozr_BinCalc_Multiplication adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton6_actionPerformed(e);
}
}
class Rozr_BinCalc_Multiplication_jButton7_actionAdapter implements ActionListener {
private Rozr_BinCalc_Multiplication adaptee;
Rozr_BinCalc_Multiplication_jButton7_actionAdapter(Rozr_BinCalc_Multiplication adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton7_actionPerformed(e);
}
}
class Rozr_BinCalc_Multiplication_jButton8_actionAdapter implements ActionListener {
private Rozr_BinCalc_Multiplication adaptee;
Rozr_BinCalc_Multiplication_jButton8_actionAdapter(Rozr_BinCalc_Multiplication adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton8_actionPerformed(e);
}
}
class Rozr_BinCalc_Multiplication_jButton9_actionAdapter implements ActionListener {
private Rozr_BinCalc_Multiplication adaptee;
Rozr_BinCalc_Multiplication_jButton9_actionAdapter(Rozr_BinCalc_Multiplication adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton9_actionPerformed(e);
}
}
class Rozr_BinCalc_Multiplication_jButton10_actionAdapter implements ActionListener {
private Rozr_BinCalc_Multiplication adaptee;
Rozr_BinCalc_Multiplication_jButton10_actionAdapter(Rozr_BinCalc_Multiplication adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton10_actionPerformed(e);
}
}
class Rozr_BinCalc_Multiplication_jButton11_actionAdapter implements ActionListener {
private Rozr_BinCalc_Multiplication adaptee;
Rozr_BinCalc_Multiplication_jButton11_actionAdapter(Rozr_BinCalc_Multiplication adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton11_actionPerformed(e);
}
}
class Rozr_BinCalc_Multiplication_jButton12_actionAdapter implements ActionListener {
private Rozr_BinCalc_Multiplication adaptee;
Rozr_BinCalc_Multiplication_jButton12_actionAdapter(Rozr_BinCalc_Multiplication adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton12_actionPerformed(e);
}
}
class Rozr_BinCalc_Multiplication_jButton13_actionAdapter implements ActionListener {
private Rozr_BinCalc_Multiplication adaptee;
Rozr_BinCalc_Multiplication_jButton13_actionAdapter(Rozr_BinCalc_Multiplication adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton13_actionPerformed(e);
}
}
class Rozr_BinCalc_Multiplication_jButton14_actionAdapter implements ActionListener {
private Rozr_BinCalc_Multiplication adaptee;
Rozr_BinCalc_Multiplication_jButton14_actionAdapter(Rozr_BinCalc_Multiplication adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton14_actionPerformed(e);
}
}
class Rozr_BinCalc_Multiplication_jButton15_actionAdapter implements ActionListener {
private Rozr_BinCalc_Multiplication adaptee;
Rozr_BinCalc_Multiplication_jButton15_actionAdapter(Rozr_BinCalc_Multiplication adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton15_actionPerformed(e);
}
}
class Binary_Operations
{
private double d2;
public String Double_to_Binary(double d_val){
String res = "", bin_fr = "";
double fract, res_fr;
long whole_part;
if (d_val >= 0)
{
d2 = Math.floor(d_val);
whole_part = Math.round(d2);
}
else
{
d2 = Math.floor(d_val)+1;
whole_part = Math.round(d2);
}
fract = Math.abs(roundDouble(d_val - whole_part, 10));
res_fr = fract;
if (res_fr == 0d) return ""+(Long.toBinaryString(whole_part))+".0";
while (roundDouble(res_fr,10) != 1d)
{
res_fr = res_fr * 2;
if (res_fr > 1)
{
bin_fr = bin_fr + "1";
res_fr--;
}
else
if (roundDouble(res_fr,10) != 1d)
bin_fr = bin_fr + "0";
}
bin_fr = bin_fr + "1";
res = ""+(Long.toBinaryString(whole_part))+"."+bin_fr;
return res;
}
public double Binary_to_Double(String res_s){
double d_res = 0, d_val, fract;
long whole_part;
String temp = "";
int fr_count = 0;
int [][] table;
d_val = Double.parseDouble(res_s);
if (d_val == 0d)
return d_val;
if (d_val > 0)
{
d2 = Math.floor(d_val);
whole_part = Math.round(d2);
table = new int[2][res_s.length()-1];
}
else
{
d2 = Math.floor(d_val)+1;
whole_part = Math.round(d2);
table = new int[2][res_s.length()-2];
}
fract = Math.abs(roundDouble(d_val - whole_part, 10));
temp = ""+fract+"";
fr_count = temp.length()-2;
int len = res_s.length() - 1;
if (d_val < 0) len = res_s.length() - 2;
for (int i = 0; i < len; i++)
table[1][i] = i - fr_count;
d_val = Math.abs(d_val);
res_s = ""+d_val+"";
int pos = res_s.length()-1;
for (int i = 0; i < len; i++, pos--)
{
if (res_s.charAt(pos) =='.')
pos--;
table[0][i] = Integer.parseInt(""+res_s.charAt(pos)+"");
}
for (int i = 0; i < len; i++)
d_res = d_res + table[0][i]*Math.pow(2.0,table[1][i]);
return d_res;
}
public String Bin_Multiplication(String str1, String str2)
{
String res_str = "", res_s = "";
String res1=str1, res2=str2;
int pos1=0, pos2=0;
int b=0;
for (int i=0; i<str1.length(); i++)
{
if (str1.charAt(i) =='.')
{
pos1 = i;
break;
}
}
for (int i=0; i<str2.length(); i++)
{
if (str2.charAt(i) =='.')
{
pos2 = i;
break;
}
}
if (pos1>pos2)
{
for (int i = 0; i < pos1 - pos2; i++)
res1 ='0' + res1;
}
else
if (pos2>pos1)
{
for (int i = 0; i < pos2 - pos1; i++)
res2 ='0' + res2;
}
if (res1.length()>res2.length())
{
for (int i = 0; i < res1.length() - res2.length(); i++)
res2 = res2 + '0';
}
else
if (res2.length()>res1.length())
{
for (int i = 0; i < res2.length() - res1.length(); i++)
res1 = res1 + '0';
}
for (int i=0; i<res1.length(); i++)
{
if (res1.charAt(i) =='.')
{
pos1 = i;
break;
}
}
str1 = "";
pos1 = Math.abs(res1.length()-pos1);
str2 = "";
for (int i=0; i<res1.length(); i++)
{
if (res1.charAt(i) !='.') str1 = str1+res1.charAt(i);
if (res2.charAt(i) !='.') str2 = str2+res2.charAt(i);
}
res_s = " ";
pos2 = 0;
for (int i=0; i<res1.length(); i++)
{
if (res2.charAt(i) =='1')
{
for (int j=0; j<res1.length(); j++)
{
res_s.replace(res_s.charAt(j+pos2),res1.charAt(j));
}
pos2++;
}
}
str1 = "0";
str1 = str1 +'.';
for (int i=pos1; i<res_s.length(); i++)
{
str1 = str1 + res_s.charAt(i);
}
return str1;
}
public double roundDouble(double val, int places) {
long factor = (long)Math.pow(10,places);
val = val * factor;
long tmp = Math.round(val);
return (double)tmp / factor;
}
}
}
Висновок
В моїй розрахунковій роботі було представлено приклад калькулятора, що перемножує числа. Було представлено побудову діаграм UML, розглянуто деякі типи діаграм та їх значення, структуру, на зворот ньому процесі до проектування було продемонстровано переваги попереднього проектування розроблюваного даного програмного продукту.
СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ
1. Программирование на Java 2 (2-е издание) ФОЛИО 2003
2. 11-12 лекції.
|