МІНІСТЕРСТВО ОСВІТИ I НАУКИ УКРАЇНИ
Національний університет "Львівська політехніка"
Кафедра САПР
/
“ Обробка виключних ситуацій”
ЗВІТ
до лабораторної роботи № 11,12
з курсу: “Об’єктно – орієнтоване програмування”
ЛЬВІВ - 2013 р.
1. МЕТА РОБОТИ
Одержати навики побудови алгоритмів лінійних обчислювальних процесів, навчитися складати алгоритми та програмувати процеси з розгалуженням, циклами, ітераційними циклами за допомогою мови Java. Одержати навички роботи із масивами.
2.ОСНОВНІ ТЕОРЕТИЧНІ ВІДОМОСТІ
ОПЕРАТОРИ МОВИ JAVA
Модель обробки "поставщик-споживач"
Дуже часто зображення перед виведенням на екран підлягає обробці: змінюються кольори окремих пікселів або цілих частин зображення, виділяються і перетворюються якісь фрагменти зображення. В бібліотеці AWT застосовуються дві моделі обробки зображення. Одна модель реалізує давно відому в програмуванні спільну модель "поставщик-споживач" (Producer-Consumer). Згідно цієї моделі один обєкт, "поставщик", генерує сам або перетворює отриману із іншого місця продукцію, в даному випадку, набір пікселів, і передає іншим обєктам. Ці обєкти, "споживачі", приймають продукцію і теж перетворюють її при необхідності. Тільки після цього створюється обєкт класу Іmage і зображення виводиться на екран. У одного поставщика може бути декілька споживачів, котрі повинні бути зареєстровані поставщиком. Поставщик і споживач активно взаємодіють, звертаючись до методів один одного.
В AWT ця модель описана в двох інтерфейсах: ImageProducer і ImageConsumer пакета java. awt. image. Інтерфейс ImageProducer описує пять методів:
addConsumer(ImageConsumer ic) - реєструє споживача ic; removeConsumer (ImageConsumer ic) - скасовує реєстрацію;
isConsumer( ImageConsumer ic) — логічний метод, перевіряє, чи зареєстрований споживач ic;
startProduction (ImageConsumer ic) — реєструє споживача ic і починає поставку зображення всім зареєстрованим споживачам;
requestTopDownLeftRightResend (ImageConsumer ic) — використовується споживаем для того, щоб затребувати зображення ще раз в порядку "зверху-вниз, зліва-направо" для методів обробки, застосовуючи саме такий порядок.
З кожним екземпляром класу Іmage звязаний обєкт, реалізуючий інтерфейс ImageProducer. Його можна отримати методом getSource() класу Image. Найпростіша реалізація интерфейса ImageProducer - клас MemoryІmageSource — створює пікселі в оперативній памяті по масиву байтів або цілих чисел. Спочатку створюється масив pix, що містить колір кожної точки. Потім одним із шести конструкторів створюється обєкт класу MemoryІmageSource. Він може бути оброблений споживачем або прямо перетворений у тип Image методом createlmage ().
4.ЛАБОРАТОРНЕ ЗАВДАННЯ
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class TestFrame extends JFrame {
private JTextField textField;
public TestFrame() {
super("Test frame");
createGUI();
}
public void createGUI() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
JButton button1 = new JButton("Button 1");
button1.setActionCommand("Button 1 was pressed!");
panel.add(button1);
JButton button2 = new JButton("Button 2");
button2.setActionCommand("Button 2 was pressed!");
panel.add(button2);
JButton button3 = new JButton("Button 3");
button3.setActionCommand("Button 3 was pressed!");
panel.add(button3);
textField = new JTextField();
textField.setColumns(23);
panel.add(textField);
ActionListener actionListener = new TestActionListener();
button1.addActionListener(actionListener);
button2.addActionListener(actionListener);
button3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textField.setText(e.getActionCommand());
}
});
getContentPane().add(panel);
setPreferredSize(new Dimension(320, 100));
}
public class TestActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
textField.setText(e.getActionCommand());
}
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame.setDefaultLookAndFeelDecorated(true);
TestFrame frame = new TestFrame();
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
/
import java.awt.*;
import java.applet.Applet;
/*Реалізація простого калькулятора*/
public class Calculator extends Applet
{
TextField txtDisp;
public final int OP_NONE = 0;
public final int OP_ADD = 1;
public final int OP_SUB = 2;
public final int OP_MUL = 3;
public final int OP_DIV = 4;
public final int OP_NEG = 5;
public final int OP_SQRT = 6;
public final int OP_EQ = 7;
public final int OP_C = 8;
public final int OP_AC = 9;
public final int OP_PCT = 14;
public final int DECSEP = -1;
long U;
double V;
String msDecimal;
int mnOp = OP_NONE;
boolean mbNewNumber = true;
boolean mbDecimal = false;
double mdReg = 0.0;
boolean mbConstant = false;
double mdConstant = 0.0;
int mnConstantOp = OP_NONE;
boolean mbPercent = false;
double mdFirst = 0.0;
/* В методе init() відбувається початкова ініціалізація аплета
( описуються кнопки калькулятора, встановлюється колір)*/
public void init()
{
CalcButton btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9;
CalcButton btnDecSep, btnNeg, btnSqrt, btnPlus, btnMinus;
CalcButton btnTimes, btnDiv, btnEqual, btnClear, btnAllClear;
CalcButton btnPercent;
setLayout(null);
// Встановлення шрифта
setFont(new Font("Helvetica", Font.BOLD|Font.ITALIC, 12));
// Встановлення кольору аплета,
int nBGColor;
try
{nBGColor = Integer.parseInt(getParameter("bgcolor").substring(1), 16); }
catch(RuntimeException e)
{nBGColor = 0x990077;}
setBackground(new Color(nBGColor));
// Формування кнопок калькулятора
btn0 = new CalcButton("0", OP_NONE, 0);
add(btn0);
btn0.reshape(8, 176, 96, 24);
btn1 = new CalcButton("1", OP_NONE, 1);
add(btn1);
btn1.reshape(8, 144, 40, 24);
btn2 = new CalcButton("2", OP_NONE, 2);
add(btn2);
btn2.reshape(64, 144, 40, 24);
btn3 = new CalcButton("3", OP_NONE, 3);
add(btn3);
btn3.reshape(120, 144, 40, 24);
btn4 = new CalcButton("4", OP_NONE, 4);
add(btn4);
btn4.reshape(8, 112, 40, 24);
btn5 = new CalcButton("5", OP_NONE, 5);
add(btn5);
btn5.reshape(64, 112, 40, 24);
btn6 = new CalcButton("6", OP_NONE, 6);
add(btn6);
btn6.reshape(120, 112, 40, 24);
btn7 = new CalcButton("7", OP_NONE, 7);
add(btn7);
btn7.reshape(8, 80, 40, 24);
btn8 = new CalcButton("8", OP_NONE, 8);
add(btn8);
btn8.reshape(64, 80, 40, 24);
btn9 = new CalcButton("9", OP_NONE, 9);
add(btn9);
btn9.reshape(120, 80, 40, 24);
btnDecSep = new CalcButton(".", OP_NONE, DECSEP);
add(btnDecSep);
btnDecSep.reshape(120, 176, 40, 24);
btnNeg = new CalcButton("+/-", OP_NEG, 0);
add(btnNeg);
btnNeg.reshape(8, 48, 40, 24);
btnSqrt = new CalcButton("Sqrt", OP_SQRT, 0);
add(btnSqrt);
btnSqrt.reshape(64, 48, 40, 24);
btnPlus = new CalcButton("+", OP_ADD, 0);
add(btnPlus);
btnPlus.reshape(176, 144, 40, 56);
btnMinus = new CalcButton("-", OP_SUB, 0);
add(btnMinus);
btnMinus.reshape(176, 80, 40, 56);
btnTimes = new CalcButton("x", OP_MUL, 0);
add(btnTimes);
btnTimes.reshape(232, 80, 40, 24);
btnDiv = new CalcButton("/", OP_DIV, 0);
add(btnDiv);
btnDiv.reshape(232, 112, 40, 24);
btnEqual = new CalcButton("=", OP_EQ, 0);
add(btnEqual);
btnEqual.reshape(232, 144, 40, 56);
btnClear = new CalcButton("C", OP_C, 0);
add(btnClear);
btnClear.reshape(232, 48, 40, 24);
btnAllClear = new CalcButton("AC", OP_AC, 0);
add(btnAllClear);
btnAllClear.reshape(176, 48, 40, 24);
btnPercent = new CalcButton("%", OP_PCT, 0);
add(btnPercent);
btnPercent.reshape(120, 48, 40, 24);
txtDisp = new TextField("0", 80);
txtDisp.setEditable(false);
add(txtDisp);
txtDisp.reshape(4, 8, 268, 31);
// Вивід на табло калькулятора десятквої крапки
String sOneTenth = (new Double(0.1)).toString();
msDecimal = sOneTenth.substring(sOneTenth.length()-2).substring(0, 1);
}
//Формування з цифр числа
public void append(int nValue)
{
String sDigit;
if(nValue == DECSEP)
if(!mbDecimal) {
if(mbNewNumber)
{
txtDisp.setText("0");
mbNewNumber = false;
}
mbDecimal = true;
sDigit = msDecimal;
}
else
return;
else
sDigit = (new Integer(nValue)).toString();
if(mbNewNumber)
{
txtDisp.setText(sDigit);
if(nValue != 0)
mbNewNumber = false;
}
else
txtDisp.setText(txtDisp.getText() + sDigit);
repaint();
}
// В методі doOp() визначається яка дія буде виконуватись
// над введеними числами. І виконуються обчисення.
public void doOp(int nNewOp)
{
double dDisp;
dDisp = (new Double(txtDisp.getText())).doubleValue();
if(mbPercent)
if(nNewOp != OP_ADD && nNewOp != OP_SUB)
mbPercent = false;
if(!mbPercent)
switch(nNewOp)
{
case OP_ADD:
case OP_SUB:
case OP_MUL:
case OP_DIV:
if(mbNewNumber)
{
if(nNewOp == mnOp && !mbConstant)
{
mbConstant = true;
mdConstant = dDisp;
mnConstantOp = nNewOp;
}
else
mbConstant = false;
}
else
mbConstant = false;
case OP_EQ:
case OP_PCT:
if(!mbNewNumber || isEqOp(nNewOp))
{
if(mbConstant)
{
mdReg = mdConstant;
mnOp = mnConstantOp;
}
mbPercent = nNewOp == OP_PCT;
if(mbPercent)
mdFirst = mdReg;
switch(mnOp)
{
case OP_ADD:
mdReg = mdReg + dDisp;
break;
case OP_SUB:
mdReg = mdReg - dDisp;
break;
case OP_MUL:
mdReg = mdReg * dDisp;
break;
case OP_DIV:
mdReg = mdReg / dDisp;
break;
case OP_EQ:
case OP_PCT:
case OP_NONE:
mdReg = dDisp;
break;
}
if(mbPercent)
mdReg /= 100;
U = ((new Double(mdReg)).longValue());
V = mdReg%1;
if ( V == 0)
txtDisp.setText((new Long(U)).toString());
else
txtDisp.setText((new Double(mdReg)).toString());
}
mnOp = nNewOp; // Визначення нажатої не числової
mbNewNumber = true; // кнопки закінчено. Відновлюються
mbDecimal = false; // параметри для вводу чисел
break;
}
switch(nNewOp)
{
case OP_ADD:
if(mbPercent)
{
mdReg = mdFirst + mdReg;
txtDisp.setText((new Double(mdReg)).toString());
mbPercent = false;
}
break;
case OP_SUB:
if(mbPercent)
{
mdReg = mdFirst - mdReg;
txtDisp.setText((new Double(mdReg)).toString());
mbPercent = false;
}
break;
case OP_NEG:
dDisp = -dDisp;
U = ((new Double(dDisp)).longValue());
V = dDisp%1;
if ( V == 0)
txtDisp.setText((new Long(U)).toString());
else
txtDisp.setText((new Double(dDisp)).toString());
if(isEqOp(mnOp))
{
mdReg = dDisp;
}
break;
case OP_SQRT:
dDisp = Math.sqrt(dDisp);
U = ((new Double(dDisp)).longValue());
V = dDisp%1;
if ( V == 0)
txtDisp.setText((new Long(U)).toString());
else
txtDisp.setText((new Double(dDisp)).toString());
if(isEqOp(mnOp))
{
mdReg = dDisp;
}
mbNewNumber = true;
mbDecimal = false;
break;
case OP_C:
dDisp = 0.0;
txtDisp.setText("0");
if(isEqOp(mnOp))
{
mdReg = dDisp;
}
mbNewNumber = true;
mbDecimal = false;
break;
case OP_AC:
txtDisp.setText("0");
mnOp = OP_NONE;
mbNewNumber = true;
mbDecimal = false;
mdReg = 0.0;
mbConstant = false;
break;
}
}
// isEqOP – це допоміжна функція для алгебраїчних обчислень
protected boolean isEqOp(int nOp)
{
return nOp == OP_EQ || nOp == OP_PCT;
}
public static void main(String args[]) // Организация окна
{
CalcFrame frm = new CalcFrame("Calculator");
Calculator pnl = new Calculator();
pnl.init();
frm.add("Center", pnl);
frm.pack();
frm.resize(276, 240);
frm.show();
}
}
// Конструктор класу CalcButton
class CalcButton extends Button
{
int mnOp;
int mnValue;
CalcButton(String sText, int nOp, int nValue)
{
super(sText);
mnOp = nOp;
mnValue = nValue;
}
public boolean action(Event evt, Object arg)
{
Calculator par = (Calculator)getParent();
if(mnOp == par.OP_NONE) // Если ввденный символ цифра
par.append(mnValue);
else
par.doOp(mnOp); // если не цифра
return true;
}
}
class CalcFrame extends Frame
{
CalcFrame(String s)
{
super(s);
}
public boolean handleEvent(Event evt)
{
if(evt.id == Event.WINDOW_DESTROY)
{
System.exit(0);
return true;
}
else
return super.handleEvent(evt);
}
}
Результат виконання програми
/
Висновок
На даній лабораторній роботі я одержала навики побудови алгоритмів лінійних обчислювальних процесів, навчилась складати алгоритми та програмувати процеси з розгалуженням, циклами, ітераційними циклами за допомогою мови Java.