Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 12

УНИВЕРЗИТЕТ “СВ.

КЛИМЕНТ ОХРИДСКИ“

Технички Факултет- Битола

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

ОБЈЕКТНО ОРИЕНТИРАНО ПРОГРАМИРАЊЕ

Семинарска работа

Задачи:
1. Линии
2. Отпорници
3. Полица
4. Предмети
5. Возила

Студент

Слободан Симоноски 44/п

Професор Асистент

Доцент Др. Илија Јолевски Мр. Рамона


Маркоска

Прилеп 2010
1. ЛИНИИ
Оваа задача е програма за пресметување на должина на линија при
што таа може да биде отсечка, испрекршена линија или полигон и воедно
споредува и ни кажува која линија е најдолга. За сите овие видови имаме
посебна класа, а покрај нив имаме и класа за одредување на точки во
просторот, која е неопходна за да се извршат другите класи. Сите класи
се повикуваат во главна програма одвоена во посебен пакет.

Класа Linija:
package linii;

public abstract class Linija {

private static int ukId = 0; // Posledno koristen identifikator.


private int id = ++ukId; // Identifikator na linija.

public int id() { return id; } // Vrakanje na identifikatorot.

public abstract double duz (); // Dolzina na linija.

public String toString () // Tekstualen oblik.


{ return Integer.toString (id); }
}

Оваа класа е апсатрактна и всушност ги дава прототипите на методите


кои ќе се користат во другите класи. Покрај тоа има и променлива бројач
id кој покажува која линија е последно користена. Во методот public String
toString () всушност го враќа редниот број на последно користената
линија.

Класа Tocka:
package linii;

public class Tocka {

private double x, y; // Koordinati.

public Tocka (double xx, double yy) { x = xx; y = yy; } // Inicijalizac.


public Tocka (double xx) { x = xx; }
public Tocka () {}

public double x () { return x; } // Koordinati.


public double y () { return y; }

public String toString () // Tekstualen oblik.


{ return "(" + x + "," + y + ")"; }

public static String toString (Tocka[] niza) { // Tekstualen oblik


StringBuffer s = new StringBuffer (); // na nizata od tocki.
for (int i=0; i<niza.length; i++) {
if (i > 0) s.append (',');
s.append (niza[i]);
}
return s.toString ();
}
}

Во оваа класа имаме две приватни променливи од типот double. Оваа


класа ги прима на влез координатите на точките кои се потребни за да се
нацрта линија. Имаме три конструктори кои се извршуваат во зависност од
потребите, потоа гетери за х и у координатите и два методи toString кои
всушност ги враќаат координатите на точките како еден стринг кој
понатаму се печати од главната програма. Со оваа класа се дефинира нов
тип на податок Точка.

Класа Otsecka:
package linii;

public class Otsecka extends Linija {


private Tocka A, B; // Krajni tocki.

public Otsecka (Tocka P, Tocka Q) { A = P; B = Q; } // Inicijalizacija.


public Otsecka () { A = new Tocka (-1,-1); B = new Tocka (1,1); }

public double dolz () { // Dolzina dolz.


return Math.sqrt (Math.pow(A.x()-B.x(),2) + Math.pow(A.y()-B.y(),2));
}

public String toString () // Tekstualen oblik.


{ return super.toString() + "[dolzina: A" + A + ", B" + B + "]"; }
}

Оваа класа ја надополнува класата Линија. Во оваа класа имаме две


приватни променливи од типот Точка. Оваа класа има два конструктори од
кои еден прима на влез две променливи од тип точка, а другиот не прима
ништо, но ги задава стандардните почетни точки. Потоа се пресметува
должината на правата со методата public double dolz (). Потоа со
методата to string() се задава текстуалниот облик на координатите на
точките кои се печатат во главната програма, заедно со редниот број на
линијата кој се птевзема од методата string() од класата Linija која е
препишана со истата метода од оваа класа, но со зборот super, се
превзема и променливата од препишаната класа.

Класа Isprekrsena:
package linii;

public class Isprekrsena extends Linija {

protected Tocka[] tem; // Niza na teminja.

public Isprekrsena (Tocka[] niz) // Inicijalizacija na niza od tocki


{ tem = niz; }

public double dolz () { // Dolzina na isprekrsena linija.


double d = 0;
for (int i=0; i<tem.length-1; i++)
d += new Otsecka(tem[i], tem[i+1]).dolz();
return d;
}

public String toString () { // Tekstualen oblik.


return super.toString() + "[ispekrsena: " +
Tocka.toString (tem) + "]";
}
}

Оваа класа работи слично како и класата за пресметување на отсечка,


со таа разлика што овде, наместо две точки се прима низа од точки во
зависност од тоа колку темиња се избрани преку променливата tem и со
for циклус се повикува методот од класата Otsecka.dolzina, при што за
секој пар точки се пресметува должината (i и i+1) која се додава во
променливата d и на крајот се враќа d како вкупна должина на
испрекршената линија.

Класа Poligon:
package linii;

public class Poligon extends Isprekrsena {

public Poligon (Tocka[] niz) // Inicijalizacija na niza od


tocki.
{ super (niz); }

public double duz () // Dolzina na poligon.


{ return super.dolz () + new Otsecka(tem[0], tem[tem.length-1]).dolz
(); }

public String toString () // Tekstualen oblik.


{ return id() + "[poligon: " + Tocka.toString (tem) + "]"; }
}

Оваа класа е надградба т.е. ја наследува класата Испрекршена. Инаку


таа ја враќа должната на линија на полигон, со тоа што должините на
секоја одделна отсечка се пресме-туваат во методот на класата
Испрекршена dolz, со користење на super, а потоа се додава последната
должина помала за еден.

Главна класа LiniiT:


package liniiT;
import linii.*;
import uslugi.Citaj;
public class LiniiT {

private static Linija citaj() { // Citanje na edna linija.


System.out.print ("Vid na linija (O, I, P)? ");
char vid = Citaj.Char ();
switch (vid) {
case 'o': case 'O': {
System.out.print("A? ");
double xA = Citaj.Double (), yA = Citaj.Double ();
System.out.print("B? ");
double xB = Citaj.Double (), yB = Citaj.Double ();
return new Otsecka (new Tocka (xA, yA), new Tocka (xB, yB));
}
case 'i': case 'I':
case 'p': case 'P': {
System.out.print("Broj na teminja? ");
Tocka[] niz = new Tocka [Citaj.Int()];
for (int i=0; i<niz.length; i++) {
System.out.print(i+1 + ". teme? ");
double x = Citaj.Double (), y = Citaj.Double ();
niz[i] = new Tocka (x, y);
}
return (vid=='i' || vid=='I') ? new Isprekrsena (niz)
: new Poligon (niz);
}
default: return null;
}
}

public static void main (String[] args) { // Glavna funkcija.


System.out.println("Za kolku linii ke presmetuvate? ");
int a=Citaj.Int();
Linija[] niz = new Linija [a];
for (int i=0; i<niz.length; ) {
Linija lin = citaj ();
if (lin != null) niz[i++] = lin;
else System.out.println("*** Nepoznat vid na linija!");
}
System.out.println ("\nProcitano:");
double max = niz[0].dolz (); int imax = 0;
for (int i=0; i<niz.length; i++) {
double d = niz[i].dolz ();
System.out.println (niz[i] + " d=" + d);
if (d > max) { max = d; imax = i; }
}
System.out.println ("\nNajdolga: " + niz[imax]);
}
}

Во главната класа LiniiT која се наоѓа во одделен пакет од другите


класи, но ги импортира, имаме две методи и тоа private static Linija
citaj()која му дава на корисникот да одбере тип на линија и во зависност
од тоа ги повикува соодветните функции за пресметка на должина на
линијата. Тоа е направено со еден switch циклус. Citaj.char, Citaj.double и
сличните методи се повикани од надворешна класа Citaj која се наоѓа во
пакетот uslugi и е заедничка за сите програми кои ги опишувам.

Главниот метод е малку изменет за да може корисникот да одбери за


колку линии сака да внеси. Откако се внесува број на линии, се повикува
методот citaj(), доколку внесената вредност е различна од очекуваната,
програмата ни дава порака дека внесот е погрешен. Доколку е се во ред
програмата ни ги печати внесените линии и на крај печати која е најдолга
од нив.

Извршување:
2. ОТПОРНИЦИ
Оваа задача е за пресметување на отпор кај паралелни, сериски и
сложени кола со отпорници и се состои од пет класи и главна класа која е
сместена во одделен пакет, а која ги импортира, повикува и извршува
останатоте класи во зависност од потребата.

Класа AbstraktenOtpornik:
package otpornici;

public abstract class ApstraktenOtpornik {

public abstract double otpornost (); // Otpornost otpornika.

public abstract String toString (); // Tekstualni oblik.

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

Класа ProstOtpornik:
package otpornici;

public class ProstOtpornik extends ApstraktenOtpornik {

private double R; // Vrednost na otpori.

public ProstOtpornik (double r) { R = r; } // Inicijalizacija.

public double otpornost () { return R; } // Otpornost na otpornikot.

public String toString () // Tekstualen oblik.


{ return Double.toString (R); }
}
Оваа класа ја екстендира класата ApstraktenOtpornik. Таа само ја
иницијализира преку конструкторот приватната променлива R, враќа
вредност за неа, а исто така враќа текстуален облик на вредноста на R.

Класа SlozenOtpornik:
package otpornici;

public abstract class SlozenOtpornik extends ApstraktenOtpornik {

protected static class Elem { // Element lista na otpornici:


ApstraktenOtpornik R; // - sodrzani otpornici,
Elem sled; // - sleden element vo listata,
Elem (ApstraktenOtpornik r) // - inicijalizacija.
{ R = r; }
}

protected Elem prv, posl; // Pocetok i kraj na listata otpornici.

public SlozenOtpornik dodaj (ApstraktenOtpornik r) { // Dodavanje


Elem novi = new Elem (r); // otpornik.
if (prv == null) prv = novi;
else posl.sled = novi;
posl = novi;
return this;
}
// Simboli za tekstualen oblik:
protected abstract char otv (); // - otvorena zagrada,
protected abstract char oper (); // - operator,
protected abstract char zatv (); // - zatvorena zagrada.

public final String toString () { // Tekstualen oblik.


StringBuffer s = new StringBuffer ();
s.append (otv ());
for (Elem tek=prv; tek!=null; tek=tek.sled) {
s.append (tek.R);
if (tek.sled != null) s.append (oper());
}
return s.append (zatv()).toString ();
}
}

И оваа класа ја екстендира класата ApstraktenOtpornik и служи за


додавање на отпорници по редослед. За секој отпорник прво проверув
дали е прв ако е се внесува на прво место, ако не е се внесува на наредно
место. Оваа класа има и метод за печатење т.е. за претворање на сите
податоци во еден стринг, при што за почеток внесува знак [ , исто така
помеѓу секој следен елемент го додава операторот во случајов |, а за крај
знак ].

Класа ParalelnaVrskaNaOtpornici:
package otpornici;

public class ParalelnaVrskaNaOtpornici extends SlozenOtpornik {

public double otpornost () { // Otpornost na otpornik.


double s = 0;
for (Elem tek=prv; tek!=null; tek=tek.sled)
s += 1 / tek.R.otpornost ();
return 1 / s;
}

protected final char otv () { return '['; } // Simboli za tekstualen


protected final char oper () { return '|'; } // oblik.
protected final char zatv () { return ']'; }
}

Оваа класа служи за пресметка на отпор на паралелно врзани


отпорници. Таа ја екстендира класата SlozenOtpornik, всушност сите
методи кои ги има оваа класа се имплементација на претходничките класи
ApstrktenOtpornik и SlozenOtpornik. Во оваа класа се дефинирани и
симболите кои треба да се вратат за почеток, оператор и крај.

Класа SeriskaVrskaNaOtpornici:
package otpornici;

public class SeriskaVrskaNaOtpornici extends SlozenOtpornik {

public double otpornost () { // Otpornost na otpronik.


double r = 0;
for (Elem tek=prv; tek!=null; tek=tek.sled)
r += tek.R.otpornost ();
return r;
}

protected final char otv () { return '('; } // Simboli za tekstualen


protected final char oper () { return '+'; } // oblik.
protected final char zatv () { return ')'; }
}

И оваа класа ја има истата улога како и претходната, со таа разлика


што враќа збир на сите отпори што всушност е и вкупен отпор при сериска
врска. Исто така оваа класа враќа оператор што се користи при сериска
врска на отпори, во случајов „+“.

Главна класа OtporniciT:


package otpornikT;
import otpornici.*;
import uslugi.Citaj;
public class OtporniciT {

private static ApstraktenOtpornik citaj () { // Citanje na otpornici.


String vrs = Citaj.String ();
if (vrs.equalsIgnoreCase ("prost"))
return new ProstOtpornik (Citaj.Double ());
else if (vrs.equalsIgnoreCase ("seriska"))
return citaj (new SeriskaVrskaNaOtpornici ());
else if (vrs.equalsIgnoreCase ("paralelna"))
return citaj (new ParalelnaVrskaNaOtpornici ());
else
return null;
}

private static SlozenOtpornik citaj (SlozenOtpornik R) { // Citanje


while (true) { // slozen
ApstraktenOtpornik r = citaj (); // otpornik.
if (r == null) return R;
R.dodaj (r);
}
}

public static void main (String[] args) { // Glavna funkcija.


ApstraktenOtpornik R;
while ((R = citaj()) != null)
System.out.println (R + " = " + R.otpornost());
}
}

Главнат класа е во посебен пакет. Таа ги импортира останатите класи


и по потреба ги извршува. Составена е од три методи ApstraktenOtpornik
citaj (),SlozenOtpornik citaj (SlozenOtpornik R) и главна метода
main (String[] args). Во првата класа му е дадена можност на
корисникот да одбери што сака да пресмета, при што се повикуваат
соодветните методи од другите импортирани класи. Во втората метода се
читаат отпорите на сложен отпорник, а секоја вредност се додава на
останатите, се додека се внесуваат нови вредности. Додека во главниот
метод се враќа пресметката со резултатот кој го бараме.

Извршување:

3. ПРЕДМЕТИ1

Оваа програма прима на влез вредности за два вида геометриски


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

Класа Predmet:
package predmeti1;
import uslugi.Citaj;

public abstract class Predmet {

private double sigma; // Specificna tezina.

protected Predmet (double ss) { sigma = ss; } // Inicijalizacija.

protected Predmet () { sigma = 1; }

public abstract char vr (); // Vid.

public abstract double V (); // Zafatnina.

public final double Q () { return V () * sigma; } // Tezina.

public void citaj () { sigma = Citaj.Double (); } // Citanje.

1
Класите од овој пример се искористени и во наредниот пример Полици
public String toString () // Tekstualen oblik.
{ return vr() + "[" + sigma + "|"; }
}

Оваа класа е абстрактна, но исто така ја пресметува и тежината на


предметот, ако се знае специфичната тежина и волуменот на истиот.
Дефинираните методи се користат во другите класи.

Класа Sfera:
package predmeti1;
import uslugi.Citaj;

public class Sfera extends Predmet {

public static final char VR = 'S'; // Vid.

private double r; // Poluprecnik.

public Sfera (double ss, double rr) // Inicijalizacija.


{ super (ss); r = rr; }

public Sfera () { this (1, 1); }

public char vr () { return VR; } // Vid.

public double V() { return 4./3 * r*r*r * Math.PI; } // Zafatnina.

public void citaj () // Citanje.


{ super.citaj (); r = Citaj.Double (); }

public String toString () // Tekstualni oblik.


{ return super.toString() + r + "]"; }
}

Оваа класа како што кажува и нејзиното име го имплементира објектот


сфера. Таа ја екстендира класата Predmet. Во оваа класа имаме
променлива карактер за означување на видот фигура и променлива double
r за радиус на фигурата доколку таа е сфера. На почeток имаме
конструктор за иницијализација на променливaтa r. Повеќето методи
имплементација на прототипите од наследената класа, или ги прегазуваат
методите од наследената класа. Методот public double V() го враќа
пресметаниот волумен на предметот. Citaj го чита радиусот, додека
toString() го печати радиусот во вид на текст.

Класа Kvadar:
package predmeti1;
import uslugi.Citaj;

public class Kvadar extends Predmet {

public static final char VR = 'K'; // Vid.

private double a, b, c; // Rabovi.

public Kvadar (double ss, double aa, double bb, double cc) // Inic.
{ super (ss); a = aa; b = bb; c = cc; }

public Kvadar () { this (1, 1, 1, 1); }


public char vr () { return VR; } // Vid.

public double V () { return a * b * c; } // Zafatnina.

public void citaj () { // Citanje.


super.citaj ();
a = Citaj.Double (); b = Citaj.Double (); c = Citaj.Double ();
}

public String toString () { // Tekstualen oblik.


return super.toString() + a + "," + b + "," + c + "]";
}
}

Оваа класа ја работи потполно истата работа како и класата Sfera, со


тоа што наместо радиус прима на влез димензии на квадарот кој се
пресметува, а потоа со методот public double V() го пресметува
волуменот на квадарот.

Главна класа Predmeti1T:


package predmeti1T;
import predmeti1.*;
import uslugi.Citaj;

public class Predmeti1T {


public static void main (String[] vpar) {
Predmet[] p = new Predmet [100];
double q = 0; int n = 0;
raboti: while (true) {
switch (Citaj.Char ()) {
case 's': case 'S': p[n] = new Sfera (); break;
case 'k': case 'K': p[n] = new Kvadar (); break;
case '.': break raboti;
}
if (p[n] != null) {
p[n].citaj ();
System.out.println (p[n] + " (Q=" + p[n].Q() + ")");
q += p[n++].Q ();
}
}
if (n != 0) q /= n;
System.out.print ("\nQsr= " + q + "\n\n");
for (int i=0; i<n; i++)
if (p[i].Q() > q)
System.out.println (p[i] + " (Q=" + p[i].Q() + ")");
}
}

Ова е главната класа за оваа програма. Прво во неа е декларирана


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

Извршување:
4. ПОЛИЦИ

Ова е програма во која е претставена замислена полица на која може


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

You might also like