Download - OOP Seminarska

Transcript
Page 1: OOP Seminarska

“ . “УНИВЕРЗИТЕТ СВКЛИМЕНТОХРИДСКИ - ТехничкиФакултет Битола

Отсек за Информатика и Компјутерска Техника

ОБЈЕКТНООРИЕНТИРАНОПРОГРАМИРАЊЕ Семинарска работа

: 1. , 2. , 3.Задачи Возила Трка Калкулатор

Студент . . 98/ Никола Апостолоски инд бр модул А

Професор Асистент. - . - Проф д р Илија Јолевски М р РамонаМаркоска

2010Прилеп

Дефинирање на проблемот

Page 2: OOP Seminarska

Задача: Возила

Програма во која ќе се проценува дали сопствената тежината на патничко или товарно возило со нивната додадена тежина (товар или патници) ќе можат да преминат преку мост кој може да издржи само определена оптовареност.

Клучот: Внесувањето на тежините се внесува од страна на корисникит на програмата, за вредности на товарно возило се внесува Т, за патничко возило P, а со знакот * се пристапува кон внесување на оптовареноста која мостот може да ја има, и печатење на резултатот кои од возилата претходно внесени може да го премине мостот на конзола .

Задачата да се тестира со внесување на вредности од кои едни ќе бидат во дозволените граници кои мостот ќе може да ги сноси, а други вредности поголеми од дозволените, со цел да имаме увид како програмата работи и нејзина селекција.

Анализа

Целта на оваа задача е да се направи програма која ќе врши селекција на дозволената носивост на мостот и кои возила можат да преминат преку истиот.

На самиот почеток треба да се направи мени преку кое корисникот ќе одбери дали сака да изврши внес на тежина на товарно или патничко возило. За таа цел потребно е да се изработат две класи, TVozilo и PVozilo, секоја од нив за внесување на тежините соодветно. Изработка на класа за мени преку кое корисникот избира внес и печатење на резултат на конзола.

Листинг на задачата

package vozila;

public abstract class Vozilo {

private double sopTezina;

public Vozilo (double st) { sopTezina = st; }

public abstract char vrsta ();

public double tezina () { return sopTezina; }

public String toString () { return vrsta() + "(" + sopTezina + ","; }}

package vozila;

Page 3: OOP Seminarska

import Citaj.Citaj;

public class VozilaT { public static void main (String[] vpar) { Vozilo[] vozila = new Vozilo [100]; int n = 0; raboti: while (true) { System.out.print ("\nTip na vozilo (T,P,*)? "); switch (Citaj.Char ()) { case 't': case 'T': System.out.print ("Sopstvena tezina? "); double sTez = Citaj.Double (); System.out.print ("Tezina na tovarot? "); double ter = Citaj.Int ();; vozila[n++] = new TVozilo (sTez, ter); break; case 'p': case 'P': System.out.print ("Sopstvena tezina? "); sTez = Citaj.Double (); System.out.print ("Sr. tezina na patnicite? "); double srTez = Citaj.Double (); System.out.print ("Broj na patnici? "); int brPatnici = Citaj.Int (); vozila[n++] = new PVozilo (sTez, srTez, brPatnici); break; case '*': break raboti; default: System.out.println ("*** Nepoznat tip na vozilo!"); } } System.out.print ("\nNosivost na mostot? "); double nosivost = Citaj.Double (); System.out.print ("\nMozat da preminat preku mostot:\n"); for (int i=0; i<n; i++) if (vozila[i].tezina() <= nosivost) System.out.println (vozila[i] + " - " + vozila[i].tezina()); }}

package vozila;

public class TVozilo extends Vozilo {

private double teret;

public TVozilo (double st, double t) { super (st); teret = t; }

public char vrsta () { return 'T'; }

public double tezina () { return super.tezina () + teret; }

Page 4: OOP Seminarska

public String toString () { return super.toString() + teret + ")"; }}

package vozila;

public class PVozilo extends Vozilo {

double srTez; int brPatnici;

public PVozilo (double st, double srt, int bp) { super (st); srTez = srt; brPatnici = bp; }

public char vrsta () { return 'P'; }

public double tezina () { return super.tezina () + srTez * brPatnici; }

public String toString () { return super.toString() + srTez + "," + brPatnici + ")"; }}

package Citaj;

import java.io.*;

public class Citaj {

private InputStream ut; private char c; private boolean eos;

public Citaj (InputStream uut) { ut = uut; } public Citaj (String ime) throws FileNotFoundException { ut = new FileInputStream (ime); }

public boolean endS () { return eos; }

public char getChS () { try { int i = ut.read (); return c = (eos = i == -1) ? ' ' : (char)i; } catch (Exception g) { eos = true; return c = ' '; } }

public char CharS () { while (Character.isWhitespace (c = getChS ())); return !eos ? c : ' '; }

public String StringS () {

Page 5: OOP Seminarska

String s = ""; while ( Character.isWhitespace (c = getChS ()) && !eos); if (eos) return ""; s += c; while (!Character.isWhitespace (c = getChS ()) && !eos) s += c; eos = false; return s; }

public String LineS () { String s=""; while ((c = getChS ()) != '\n' && !eos) if (c != '\r') s += c; if (s.length () != 0) eos = false; return s; }

public void getNLS () { while (c!='\n' && !eos) c = getChS (); c = '\0'; }

public byte ByteS () { String s = StringS (); return !eos ? Byte.parseByte (s) : 0; }

public short ShortS () { String s = StringS (); return !eos ? Short.parseShort (s) : 0; }

public int IntS () { String s = StringS (); return !eos ? Integer.parseInt (s) : 0; }

public long LongS () { String s = StringS (); return !eos ? Long.parseLong (s) : 0; }

public float FloatS () { String s = StringS (); return !eos ? Float.parseFloat (s) : 0; }

public double DoubleS () { String s = StringS (); return !eos ? Double.parseDouble (s) : 0; }

public boolean BooleanS() { String s = StringS (); return !eos ? Boolean.parseBoolean(s) : false; }

private static Citaj gl = new Citaj (System.in); public static boolean end () { return gl.endS (); } public static char getCh () { return gl.getChS (); } public static char Char () { return gl.CharS (); } public static String String () { return gl.StringS (); } public static String Line () { return gl.LineS (); } public static void getNL () { gl.getNLS (); } public static byte Byte () { return gl.ByteS (); } public static short Short () { return gl.ShortS (); } public static int Int () { return gl.IntS (); } public static long Long () { return gl.LongS (); } public static float Float () { return gl.FloatS (); } public static double Double () { return gl.DoubleS (); }

Page 6: OOP Seminarska

public static boolean Boolean() { return gl.BooleanS(); }}

Опис на кодот

Бидејќи ни треба програма во која ќе се врши пресметување на тежина на возила, правиме две класи, TVozilo и PVozilo, секоја од нив за внесување на тежините соодветно. Мени преку кое корисникот ќе одбери дали сака да изврши внес на тежина на товарно или патничко возило кое го печати изборот на конзола. Преку изборот на копчињана T и P преку тастатурата корисникот го врши изборот. Користиме класа Citaj во која ги сместуваме сите функции кои ги користиме, и класата VozilaT во која е сместено менито и кодот за печатење на резултатот.

Тестирање и резултати

Сл.1

Сл.2

Page 7: OOP Seminarska

Задача: Трка

Програма во која ќе се одвива трка меѓу пет возила, за кои се исчитуваат вредности за измината должина и брзина со која се движат возилата. Должината на патеката ја избира самиот корисник, преку копче старт ги активира возилата и се избира победник според тоа кој прв стигнува на целта.

Клучот: Да се изработи код кој ќе користи интерфејс преку кој корисникот управува со самата програма, избира должина на движење на возилата, нивна максимална брзина и го активира нивното придвижување преку копчето старт.

Задачата да се тестира два пати, со промена на должината на движење на возилата.

Анализа

Page 8: OOP Seminarska

Целта на оваа задача е да се направи програма ќе се одвива трка меѓу пет возила.

Потребно е да се изработат пет класи, GraVozilo, GraStaza, Vozilo, Trka и Staza, во GraVozilo се декларираат променливи за ознаката на возилото и брзината на движење на секое возило, додека во класата GraStaza декларираме променливи за должината на стазата, копче старт и победник. Класите Vozilo, Trka и Staza ги користиме за пресметување на карактеристиките на секое возило при трката, при што на екран ќе се добие победникот.

Листинг на задачата

package trka;

public class Staza extends Thread {

protected class Elem { Vozilo vozilo; Elem sled; Elem (Vozilo v) { vozilo = v; if (prv == null) prv = this; else posl.sled = this; posl = this; } }

protected Elem prv = null, posl = null;

protected double dolzina; protected boolean gotova;

public Staza (double dolzina) { this.dolzina = dolzina; }

public Staza () { this (100000); }

public Staza dodaj (Vozilo v) { new Elem (v); return this; }

private boolean raboti = false;

public void run () { try { while (! interrupted ()) { if (! raboti) synchronized (this) { wait (); } sleep (20); proveri (); } } catch (InterruptedException g) {} }

Page 9: OOP Seminarska

public void pocni () { start (); }

public synchronized void startuvaj () { for (Elem tek=prv; tek!=null; tek=tek.sled) tek.vozilo.startuvaj (); gotova = false; raboti = true; notify (); }

protected void proveri () { for (Elem tek=prv; tek!=null; tek=tek.sled) if (tek.vozilo.s() >= dolzina) { zastani (); gotova = true; break; } }

public Vozilo naCel () { double maxs = 0; Vozilo vodi = null; for (Elem tek=prv; tek!=null; tek=tek.sled) { double s = tek.vozilo.s(); if (s > maxs) { maxs = s; vodi = tek.vozilo; } } return vodi; }

private synchronized void zastani () { raboti = false; for (Elem tek=prv; tek!=null; tek=tek.sled) tek.vozilo.zastani (); }

public void zavrsi () { interrupt (); for (Elem tek=prv; tek!=null; tek=tek.sled) tek.vozilo.zavrsi(); }

}

package trka;import java.awt.*;import java.awt.event.*;

public class Trka extends Frame {

private static final int BR_VOZILA = 5; private Staza staza;

private void popolniProzor () { Panel plo = new Panel (); add (plo, "South"); (staza = new GraStaza (plo)).pocni ();

Page 10: OOP Seminarska

add (plo = new Panel (new GridLayout (0,1)), "Center"); for (int i=0; i<BR_VOZILA; i++) { Panel p = new Panel (); plo.add (p); Vozilo v = new GraVozilo (p); v.pocni (); staza.dodaj (v); } }

public Trka () { super ("Trka"); setSize (300, 200); popolniProzor (); setVisible (true); addWindowListener (new WindowAdapter () { public void windowClosing (WindowEvent d) { staza.zavrsi (); dispose (); } }); } public static void main (String[] varg) { new Trka (); }}

package trka;

public class Vozilo extends Thread {

private static int ukId = 0; private int id = ++ ukId; protected double vmax; private long t; private double v; private double suma_vdt; private boolean raboti = false;

public Vozilo (double vmax) { postavi (vmax); }

public Vozilo () { this (100); }

public void postavi (double vmax) { this.vmax = vmax; }

public void run () { try { while (! interrupted ()) { if (! raboti) { v = 0; synchronized (this) { wait (); }} long u = System.currentTimeMillis (); suma_vdt += v * (u - t);

Page 11: OOP Seminarska

t = u; v *= (0.95 + 0.2 * Math.random()); if (v > vmax) v = vmax; if (v < 0.05*vmax) v = 0.05 * vmax; sleep (100 + (int)(Math.random()*100)); } } catch (InterruptedException g) {} }

public void pocni () { start (); }

public synchronized void startuvaj () { suma_vdt = 0; t = System.currentTimeMillis (); raboti = true; notify (); }

public void zastani () { raboti = false; }

public void zavrsi () { interrupt (); }

public int id () { return id; }

public double v () { return v; }

public double s () { return suma_vdt + (System.currentTimeMillis() - t) * v; }

public String toString () { return id + " (s=" + (int)s() + ", v=" + (int)v() + ")"; }

}

package trka;import java.awt.*;import java.awt.event.*;

public class GraStaza extends Staza implements ActionListener {

private Panel plo; private TextField tksDolzina = new TextField (Double.toString (dolzina), 8); private Button dgmPocni = new Button ("pocni"); private Label oznPobednik = new Label ();

public GraStaza (double dolzina, Panel plo) { super (dolzina); popolniPloca (plo); }

Page 12: OOP Seminarska

public GraStaza (Panel plo) { super (); popolniPloca (plo); }

private void popolniPloca (Panel plo) { this.plo = plo; plo.add (new Label ("dolzina:", Label.RIGHT)); plo.add (tksDolzina); plo.add (dgmPocni); plo.add (oznPobednik); dgmPocni.addActionListener (this); }

public void actionPerformed (ActionEvent d) { dgmPocni.setEnabled (false); oznPobednik.setText (""); plo.validate (); try { dolzina = Double.parseDouble (tksDolzina.getText ()); } catch (NumberFormatException g) {} startuvaj (); }

protected void proveri () { super.proveri (); oznPobednik.setText ((gotova ? "Pobednik: " : "Vodi: ") + naCel().id()); plo.validate (); if (gotova) dgmPocni.setEnabled (true); for (Elem tek=prv; tek!=null; tek=tek.sled) tek.vozilo.toString (); }}

package trka;import java.awt.*;

public class GraVozilo extends Vozilo {

private Panel plo; private TextField tksVmax = new TextField (Double.toString(vmax), 3); private Label oznVozilo = new Label (toString());

public GraVozilo (double vmax, Panel plo) { super (vmax); popolniPloca (plo); }

Page 13: OOP Seminarska

public GraVozilo (Panel plo) { super (); popolniPloca (plo); }

private void popolniPloca (Panel plo) { this.plo = plo; plo.add (new Label ("vmax:", Label.RIGHT)); plo.add (tksVmax); plo.add (oznVozilo); }

public void startuvaj () { try { postavi (Double.parseDouble(tksVmax.getText())); } catch (NumberFormatException g) {} super.startuvaj (); }

public String toString () { String s = super.toString (); if (oznVozilo != null) { oznVozilo.setText (s); plo.validate (); } return s; }

}

Опис на кодот

Бидејќи ни треба програма во која ќе се врши пресметување на тежина на возила, правиме пет класи, GraVozilo, GraStaza, Vozilo, Trka и Staza, декларираме променливи за ознаката на возилото и брзината на движење на секое возило, и функции за пресметување на победникот на трката. Програмата користи интерфејс каде што корисникот може да ја избере должината на стазата, максималната брзина со која возилата можат да се движат и печатење на резултатот со реден број на победникот на возилото.

Тестирање и резултати

Сл.1

Page 14: OOP Seminarska

Сл.2

Задача: Калкулатор

Page 15: OOP Seminarska

Програма во која ќе се повикува калкулатор, кој користи интерфејс и ги извршува основните математички операции како собирање, одземање, делење, множење, степенување и тн. врз одреден број.

Клучот: Да се направи помошна програма со интерфејс преку која ќе можи да се повика калкулаторот и да се користи истиот. Помошната програма исто така да го испишува и решението кое се добило по користење на калкулаторот.

Задачата да се тестира со два различни броеви на кои ќе се извршат определени математички операции.

Анализа

Програмата ќе користи две класи, Kalkulator и KalkulatorT. Класата Kalkulator ќе го содржи кодот за интерфејсот на самиот калкулатор, димензии , боја, копчиња и др., како и операциите на броеви што се користат. Во класата KalkulatorT ќе се користи код за лансирање на калкулаторот, негово затворање и читање на вредноста од калкулаторот во интерфејсот на класата KalkulatorT.

Листинг на задачата

import java.awt.*;import java.awt.event.*;

public class Kalkulator extends Frame {private long x, y; private Label[] reg = new Label [2]; private static final int X = 0, Y = 1; private boolean novBroj = true; private int osnova = 10; private Button[] cifri = new Button [16]; private boolean zastani = false; private Panel ploRegistri () { Panel ploca = new Panel (new GridLayout (2, 1)); Color[] podloga = {Color.ORANGE, Color.GRAY}; Color[] bukvi = {Color.BLUE, Color.WHITE}; for (int i=0; i<2; i++) { reg[i] = new Label ("0", Label.RIGHT); reg[i].setFont (new Font (null, Font.BOLD, 20)); reg[i].setForeground (bukvi[i]); reg[i].setBackground (podloga[i]); ploca.add (reg[i]); }

Page 16: OOP Seminarska

return ploca; }

private void prikazi () { reg[X].setText (Long.toString (x, osnova)); reg[Y].setText (Long.toString (y, osnova)); }

private Panel ploCifre () { Panel ploca = new Panel (new GridLayout (4, 4)); CifraAkcija nabljuduvac = new CifraAkcija (); for (int i=0; i<16; i++) { ploca.add (cifri[i] = new Button (Integer.toString (i,16))); cifri[i].addActionListener (nabljuduvac); cifri[i].setEnabled (i < osnova); } return ploca; }

private class CifraAkcija implements ActionListener { public void actionPerformed (ActionEvent d) { String cif = ((Button)d.getSource ()).getLabel (); String staro = reg[Y].getText(); reg[Y].setText ((novBroj || staro.equals("0") ? "" : staro) + cif); novBroj = false; try { y = Long.parseLong (reg[Y].getText(), osnova); } catch (NumberFormatException g) { reg[Y].setText ("G R E S K A"); novBroj = true; } } }

private Panel ploOsnova () { String[] ozn = {"2", "8", "10", "16"}; Panel ploca = new Panel (new GridLayout (ozn.length, 1)); ploca.setBackground (Color.YELLOW); CheckboxGroup grupa = new CheckboxGroup (); OsnovaPromena nabljuduvac = new OsnovaPromena (); for (String s: ozn) { Checkbox radio = new Checkbox (s, grupa, Integer.parseInt(s)==osnova); ploca.add (radio); radio.addItemListener (nabljuduvac); }

Page 17: OOP Seminarska

return ploca; }

private class OsnovaPromena implements ItemListener { public void itemStateChanged (ItemEvent d) { String ozn = ((Checkbox)(d.getSource())).getLabel(); osnova = Integer.parseInt (ozn); for (int i=0; i<16; i++) cifri[i].setEnabled (i < osnova); prikazi (); } }

private Panel ploOperatori () { String[] ozn = {"=", "0", "+=", "|=", "-=", "^=", "*=", "&=", "/=", "<<=", "%=", ">>="}; Panel ploca = new Panel(); ploca.setLayout (new GridLayout ((ozn.length+1)/2, 2)); OperatorAkcija nabljuduvac = new OperatorAkcija (); for (String s: ozn) { Button dugme = new Button (s); dugme.setForeground (Color.BLUE); dugme.setBackground (Color.YELLOW); dugme.addActionListener (nabljuduvac); ploca.add (dugme); } return ploca; }

private class OperatorAkcija implements ActionListener { public void actionPerformed (ActionEvent d) { try { switch (((Button)d.getSource()).getLabel().charAt(0)) { case '=': x = y; break; case '0': y = 0; break; case '+': x += y; break; case '|': x |= y; break; case '-': x -= y; break; case '&': x &= y; break; case '*': x *= y; break; case '^': x ^= y; break; case '/': x /= y; break; case '<': x <<= y; break; case '%': x %= y; break; case '>': x >>= y; break; } prikazi (); } catch (ArithmeticException g) { reg[Y].setText ("G R E S K A"); } novBroj = true; }

Page 18: OOP Seminarska

}

public Kalkulator (int x, int y) { super ("Kalkulator"); setBounds (x, y, 305, 242); setResizable (false); add (ploRegistri(), BorderLayout.NORTH); add (ploCifre(), BorderLayout.CENTER); add (ploOsnova(), BorderLayout.WEST); add (ploOperatori(), BorderLayout.EAST); addWindowListener (new WindowAdapter () { public void windowClosing (WindowEvent d) { if (zastani) dispose (); else setVisible (false); } }); }

public Kalkulator () { this (250, 50); }

public long rezultat () { return x; }

public static void main (String[] varg) { Kalkulator kalk = new Kalkulator (); kalk.setVisible (true); kalk.zastani = true; }}

import java.awt.*;import java.awt.event.*;

public class KalkulatorT extends Frame {Kalkulator kalk = new Kalkulator (420, 50); Label rez = new Label ("", Label.CENTER);

private void popolniProzor () { add (rez, "North");

Panel ploca = new Panel (); add (ploca, "South"); Button dugme = new Button ("Otvori"); ploca.add (dugme); dugme.addActionListener (new ActionListener () { public void actionPerformed (ActionEvent d) {

Page 19: OOP Seminarska

kalk.setVisible (true); } });

ploca.add (dugme = new Button ("Procitaj")); dugme.addActionListener (new ActionListener () { public void actionPerformed (ActionEvent d) { rez.setText (Long.toString (kalk.rezultat ())); } });

ploca.add (dugme = new Button ("Zatvori")); dugme.addActionListener (new ActionListener () { public void actionPerformed (ActionEvent d) { kalk.setVisible (false); } }); }

private KalkulatorT () { super ("KalkulatorNA"); setBounds (100, 50, 300, 200); popolniProzor (); addWindowListener (new WindowAdapter () { public void windowClosing (WindowEvent d) { kalk.dispose (); dispose (); } }); }

public static void main (String[] varg) { new KalkulatorT ().setVisible (true); }}

Опис на кодот

Програмата се состои од две класи, Kalkulator и KalkulatorT. Секоја од нив користи интерфејс преку кој корисникот управува со командите од програмата. Во класата KalkulatorT е содржан помошниот интерфејс, кој претставува активатор на калкулаторот, составен е од три копчиња, за отворање, читање и затворање на калкулаторот.

Page 20: OOP Seminarska

Класата Kalkulator се состои од функции кои ја определуваат големината, бојата и копчињата на калкулаторот. Во неа исто така се содржани и сите операции на бројот кој корисникот го внесува во калкулаторот.

Тестирање и резултати

Сл.1

Page 21: OOP Seminarska

Сл.2

Сл.3


Top Related