[Projekti-kod]

Započeo Zepi, 14.05.2009, 14:33

prethodna tema - sledeća tema

Zepi

14.05.2009, 14:33 Poslednja Izmena: 29.01.2014, 09:58 od Zepi
Na ovom linku postavljeni su projekati zapakovani u rar arhive.

Među zadacima su i oni sa I kolikvijuma i I popravnog kolokvijuma 2009 godine.

[url="//csl.ftn.kg.ac.rs/Nastava/OOP/Projekti/"]csl.ftn.kg.ac.rs/Nastava/OOP/Projekti/[/url]

Marko Аcović

Imas par sitnih gresaka u projektu DateTime.

1.
Stavio si u clock_main.cpp:
#include <iostream.h>
a trebalo bi:
#include <iostream>

2.
Stavio si u clock_main.cpp u funkciji print:
cout<<t.getHour()<<':'<<t.getMin()<<':'<<t.getSec()<<'\n';
a trebalo bi:
std::cout<<t.getHour()<<':'<<t.getMin()<<':'<<t.getSec()<<'\n';
ili moze kako si napisao ali ispod include direktiva da stavis:
using namespace std;

3.
U Date.cpp u funkciji Date::getNumOfDays () treba da definises promenljivu int days pre petlje for.

Proveravao sam u Visual Studiu 2008. Ostale primere nisam pregledao.

Pozz

marjan

Nisam gledao primere  :blush:, ali bih da dodam da kod starijih VS prolazi ekstenzija .h, a biće da se kod nas koristi VS 6, pa je zato taj deo OK:
Unix is user-friendly—it's just choosy about who its friends are.

Zepi

18.05.2009, 12:05 #3 Poslednja Izmena: 18.05.2009, 12:15 od Zepi
Upravo to.

Tj. na vežbama se isključivo koristi VS6 a kod njega je standardna anotacija ekstenzija
     #include <iostream.h>
dok se kod novijih izdanja Visual Studia koristi
     #include <iostream> uz obavezan dodatak
      using namespace std;

Takodje days je klasican iterator i petlji tako da ne mora da se definiše pre petlje.

Drago mi je da je tema brzo postala aktivna.

Ako imate neke interesantne primere predlažem da ih okačite ovde radi dalje diskusije.
Normalno da sve bude objektno orjentisano sa nasledjivanjem i eventualno polimorfizmom
da bi koristilo i studentima kao literatura za pripremanje ispita.



holodoc

iostream.h i iostream su dve potpuno različite biblioteke pri čemu je iostream potpuna realizovana kroz C++ standard dok iostream.h predstavlja interpretaciju standarda od strane samog proizvođača kompajlera. Dakle stare verzije MS Studia su koristile iostream.h jer su se oslanjale na konkretnu Microsoftu interpretaciju tadašnjih labavih standarda dok danas novija okruženja MS-a koriste takođe zaglavlja bez ekstenzije.

Lično sam mišljnenja da standarde treba poštovati po svaku cenu jer se prednost takvog pristupa može videti tek na komplikovanijim i složenijim projektima.

Da ne bih prepisivao ono što već može da se nađe na netu evo članka o razlozima zbog kojih treba uopšte prestati sa korišćenjem iostream.h biblioteke kao i svim ostalim koji se sada smatraju zastarelim iz opravdanih razloga a završavaju se sa ekstenzijom .h u prepocesorskim direktivama.

http://members.gamedev.net/sicrane/articles/iostream.html
<?php
abstract class Ignorance extends Stupidity implements Unavoidable 
    private function 
__construct(){
        
parent::__destruct();
    }; 

// EOF -> life.php

marjan

Pa, u petlji na osnovu izbora pozivaš podrazumevane konstruktore odgovarajućih klasa (iFelne, iUlja, iGume). Pošto su sve tri klase nasleđene od istih klasa (kArtikal,kRacun), njihovi objekti mogu da se smeste u zajednički niz "tipa" kArtikal. Pošto su odgovarajuće funkcije za ispis i ostalo virtuelne, kad isprozivaš funkcije (za upis i ostalo, pri kraju main-a), za svaki objekat će se pozvati konkretna funkcija koja odgovara iFelni, iUlju, iGumi.
Unix is user-friendly—it's just choosy about who its friends are.

maddog

OK, hvala ti.

Problem je bio sto, kada sam ja pravio klase za moj projektni zadatak, nisam stavio da su mi funkcije za upis i ispis virtualne. I onda sam bez obzira na izbor dobijao uvek samo funkcije iz klase kArtikal...

Marko Аcović

18.05.2009, 23:20 #7 Poslednja Izmena: 18.05.2009, 23:29 od marko_gm
CitatTakodje days je klasican iterator i petlji tako da ne mora da se definiše pre petlje.

Potrebno je da se definise iznad, jer ga koristis posle van petlje.

PS. Slozio bih se sa kolegom Brezancem. Treba nastojati da se standard maksimalno ispostuje, jer to moze da ima dalekosezne posledice na vecim projektima.

Zepi

Za maddog-a

Citat: maddog  18.05.2009, 19:12
Kad smo vec kod VS6 vs. VS novije generacije, imam jedno pitanje. Video sam da "iostream.h" i "iostream" nisu isti fajlovi, ali bez obzira koji ukljucim komande cin i cout mi nerade. Instalirao sam VS 2005 Express Edition. Moze li neka pomoc, jer jedino sto znam je VS6.

Ovo pitanje sam postavio, jer sam video o cemu je rasprava, a ono zbog cega sam prvobitno dosao na forum je sledece:


Što se tiče konkretnog problema već sam gore pomenuo da ako se koristi VS 2005 Express Edition ili neka novija verzija
treba uraditi sledeće:

     
Citat#include <iostream>
      using namespace std;

i nakon toga neće biti problema.

Takođe što se tiče seminarskog rada starijeg kolege čiji si kod okačio dao bi ti neke sugestije tj. na šta da obratiš pažnju.

Sama struktura klasa je ne realna. U redu je izvesti iz klase Artikal klase Gume, Felne, Ulja ali da one nasleđiju klasu Račun to je skroz pogrešno.

Jednostavno pri svakom kreiranju klase treba razmisliti o njenim atributitima koji je opisuju kao i o metodama koje bi radile sa tim atributima.

Konkretno jednu Gumu, Felnu,  Ulje nikako ne opisuje Račun sa svojim atributima tj. ne indentifikuje jednoznačno instancu klase.

Za kreiranu Gumu uopšte nje važno na kojem će računu biti jer takođe guma može da stoji i u magacinu da nije prodata, pa koji su onda njeni atributi vezani za Račun. Jednostavno instance ovih klasa u sebi nose mnogo nepotrebnih podataka.

Šta bi trebalo uraditi ???

Konkretno Gume, Felne, Ulja da budu izvedene samo iz klase Artikal jer tu su podaci koji je dopunjuju.

Što se računa tiče realizovati ga tako da u sebi sadrži privatni podatak nizArtikala koji je po tipu pokazivač na snovnu klasu.

I onda će račun u sebi sadržati ono što i treba tj. nizArtikala a ne artikli da imaju račun.

Takoće dodati metodu za ispis cene artikla na računu u kojoj će se pozivati virtualne funkcije koje računaju cenu za artikal ( na specifičan način u zavisnosti od tipa artikla ) i vraćati ukupnu cenu svih artikala na računu.


Ovakva realizacija sitema će imati smisla i biti lako proširiva...


maddog

Valja li ovaj kod?

Zanima me da li je pametno da koristim friend class, ili ne.


#include <iostream.h>


class clsVozilo{
private:
int cena_osnovna;
char marka[50];
char registracija[20];
int kubikaza;

public:
virtual void upis();
virtual void ispis();
virtual void poklon();
virtual void cena();

friend class subKamion;
friend class subAutobus;



};

class clsRacun{
private:
int placanje;
char ime[65];
char prezime[65];
char ulica[65];
int broj;
int dostava;

public:
void upis();
void ispis();

friend class subKamion;
friend class subAutobus;


};

class subAutobus:public clsVozilo,clsRacun
{
private:
int brsedista;
int brspratova;

public:
void upis();
void ispis();
void cena();
void poklon();

};

class subKamion:public clsVozilo,clsRacun
{
private:
int nosivost;
int brOsovina;
int prikolica;

public:
void upis();
void ispis();
void cena();
void poklon();
};

class subAutomobil:public clsVozilo,clsRacun
{
private:
int brVrata;
int dvosed;
int kabriolet;

public:
void upis();
void ispis();
void poklon();

};



void clsVozilo::upis()
{

cout<<"Unesite registarski broj:";
cin>>registracija;
cout<<"Unesite cenu:";
cin>>cena_osnovna;
cout<<"Unesite marku:";
cin>>marka;
cout<<"Unesite kubikazu:";
cin>>kubikaza;
}

void clsVozilo::ispis()
{
cout<<"Marka vozila je: "<<marka<<endl;
cout<<"Registarski broj vozila je: "<<registracija<<endl;
cout<<"Cena vozila je: "<<cena_osnovna<<endl;
cout<<"Broj kubika je: "<<kubikaza<<endl;
}

void clsVozilo::poklon()
{
if(kubikaza<2000)
cout<<"Dobijate na poklon besplatnu registraciju za vozilo ispod 2000 kubika!\n";
else
cout<<"Zao nam je, ali besplatnu registraciju dobijaju samo vozila ispod 2000 kubika!\n";
}

void clsVozilo::cena()
{

cout<<"Cena sa PDV-om iznosi: "<<cena_osnovna*1.18<<endl;

}



void clsRacun::upis()
{

cout<<"Unesite ime i prezime vlasnika vozila: ";
cin>>ime>>prezime;
cout<<"Ulica: ";
cin>>ulica;
cout<<"Broj stana: ";
cin>>broj;
cout<<"Da li je zelite gratis dostavu na kucnu adresu(0-NE, 1-DA): ";
cin>>dostava;
cout<<"Izaberite nacin placanja(1-Gotovinski, 2-Lizing): ";
cin>>placanje;
}

void clsRacun::ispis()
{
cout<<endl<<"***Podaci o kupcu vozila***"<<endl;
cout<<ime<<" "<<prezime<<" sa stanom u ulici \""<<ulica<<"\" broj "<<broj;
if(dostava==1)
{
cout<<" zeli dostavu na kucnu adresu."<<endl;
}
else
cout<<" zeli sam da preuzme vozilo."<<endl;

}

void subAutobus::upis()
{
clsRacun::upis();
clsVozilo::upis();
cout<<"Unesite broj sedista autobusa: ";
cin>>brsedista;
cout<<"Unesite broj spratova:";
cin>>brspratova;
while(brspratova<1 || brspratova>2)
{
cout<<"Molimo vas unesite 1 ili 2 sprata: ";
cin>>brspratova;
}
}


void subAutobus::ispis()
{
clsRacun::ispis();
clsVozilo::ispis();
cout<<"Broj sedista autobusa je: "<<brsedista<<endl;
cout<<"Broj spratova autobusa je: "<<brspratova<<endl;

}

void subAutobus::poklon()
{
if(brspratova==2)
cout<<"Dvospratni autobusi na poklon dobijaju besplatno osiguranje!\n";
else
cout<<"Jednospratni autobusi na poklon dobijaju PP aparat.\n";
}

void subAutobus::cena()
{
if(placanje==1)
{
cout<<"Za gotovinsko placanje dobijate oslobadjanje od PDV-a na stetu prodavca!"<<endl;
cout<<"Cena sa popustom je: "<<cena_osnovna<<endl;
}
else
cout<<"Puna cena sa PDV-om iznosi: "<<cena_osnovna*1.18<<endl;
}


void subKamion::upis()
{

clsRacun::upis();
clsVozilo::upis();
cout<<"Unesite nosivost kamiona u kilogramima: ";
cin>>nosivost;
cout<<"Unesite broj osovina: ";
cin>>brOsovina;
cout<<"Da li kamion ima prikolicu(0-NE, 1-DA): ";
cin>>prikolica;
}

void subKamion::ispis()
{
clsRacun::ispis();
clsVozilo::ispis();
cout<<"Nosivost vaseg kamiona je; "<<nosivost<<endl;
cout<<"Broj osovina kamiona je: "<<brOsovina<<endl;
if(prikolica==1)
cout<<"Kamion ima prikolicu."<<endl;
else
cout<<"Kamion nema prikolicu."<<endl;

}

void subKamion::poklon()
{
if(prikolica==1)
cout<<"Kao poklon dobijate ciradu sa logoom vase firme!"<<endl;
else
cout<<"Kamioni bez prikolice nemaju pravo na poklon."<<endl;
}

void subKamion::cena()
{
if(placanje==1)
{
cout<<"Za gotovinsko placanje dobijate oslobadjanje od PDV-a+ 10% na stetu prodavca"<<endl;
cout<<"Cena sa popustom je: "<<cena_osnovna-cena_osnovna*0.1<<endl;
}
else
cout<<"Puna cena sa PDV-om iznosi: "<<cena_osnovna*1.18<<endl;
}


void subAutomobil::upis()
{
clsRacun::upis();
clsVozilo::upis();
cout<<"Unesite broj vrata automobila: "<<endl;
cin>>brVrata;
cout<<"Da li je automobil dvosed(0-NE, 1-DA): ";
cin>>dvosed;
cout<<"Da li je automobil kabriolet(0-NE, 1-DA): ";
cin>>kabriolet;
}

void subAutomobil::ispis()
{
clsRacun::ispis();
clsVozilo::ispis();
cout<<"Broj vrata vaseg vozila je; "<<brVrata<<endl;
if(kabriolet==1)
cout<<"Vas automobil je kabriolet."<<endl;
if(dvosed==1)
cout<<"Vas automobil je dvosed."<<endl;
}

void subAutomobil::poklon()
{
if(kabriolet==1)
cout<<"Kao poklon dobijate kisobran."<<endl;
else
cout<<"Zao nam je nemate pravo na poklon."<<endl;

}



I da li je u primeru iz proslog posta trebalo kArtikal *pokK[50];
Zasta ce mi niz kada se upotrebljava samo jedna promenljiva? moze li ovo drugacije, ili ima neku svrhu?

marjan

Odgovor na 2. pitanje: možeš da se zadržiš u petlji malo duže, tj. da izvršiš više izbora, pa onda svaki izbor dodaje novi element niza.
Unix is user-friendly—it's just choosy about who its friends are.

Zepi

Generalno što se tiče frend funkcija i klasa osim ako nije u pitanju overload operatora ja ih zaobilazim u širokom luku.

Ako ti teba neki lakši način za pristip atributima koristi protected za atribute koje će ti koristiti izvedene klase.

Vidim i dalje da klase izvodiš iz računa što sam več rekao nije realna prezentacija situacije.

Probaj da ovaj heder fajl učitaš u StarUML-u i videćeš da logoka i nije baš na svom mestu.

Mada konkretno ta ovu priču sa vozilima račun ima totalno drugačiju interpretaciju tj. nema nekog posebnog smisla.

Za prvi primer (sa priloženog seminarskog) kreiranje računa sa nizom artikala je veoma realno i korisno.
Ovde bi to mogla biti RentaCar clasa npr. koja bi u sebi imala niz slobodnih vozila naprimer i da se za odabrano vozilo dobije cena njegovog iznajmljivanja.(tema za razmišljanje)

Što se tiče drugog pitanja može kArtikal *pokK[50]; ali ako bi to bio atribut u klasi račun i da ga popunjavas sa novim instancama objekata Ulje, Felne ili Gume.


Zepi

Na gore već navedenom linku
[url="//csl.tfc.kg.ac.rs/Nastava/OOP/Projekti/"]csl.tfc.kg.ac.rs/Nastava/OOP/Projekti/[/url]

dodati su projekti zadataka sa posednjeg časa vežbi.

Konkretno radi se o zadacima koji imaju ulogu da na lak način dočaraju studentu osobine nasleđivanja i polimorfizma.
Takođe pokazano je kreiranje niza pokazivača na osnovnu klasu u koje je moguće postavljati instance izvedenih klasa.

Konkretno dodati su sledeći zadaci:

Sisari.rar, Figure.rar, Horses.rar

Zepi


Na gore već navedenom linku
[url="//csl.tfc.kg.ac.rs/Nastava/OOP/Projekti/"]csl.tfc.kg.ac.rs/Nastava/OOP/Projekti/[/url]

dodati su projekti zadataka sa posednjeg 11-og časa vežbi.



Konkretno dodati su sledeći zadaci:

Valjak.rar, Lekovi.rar

Na času su objašnjene mane u realizaciji zadataka i šta bi trebalo prepraviti da bi se dobilo na funkcionalnosti, ovo se odnosi na projekat Lekovi.rar

Zepi

Na gore već navedenom linku
[url="//csl.tfc.kg.ac.rs/Nastava/OOP/Projekti/"]csl.tfc.kg.ac.rs/Nastava/OOP/Projekti/[/url]

dodat je projekat "Resenje Stampaci" sa II kolokvijuma.

Glavni deo projekta "main()" je rađen tako da se nakon svakog uspešno rešenog problema
istestira njegova upotreba u glavnom delu programa.