Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje

Programiranje Programski jezici, tehnike, alatke...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 3.6.2010, 16:15   #1
sunce86
Član
 
Član od: 14.4.2006.
Poruke: 103
Zahvalnice: 1
Zahvaljeno 8 puta na 8 poruka
Određen forumom c++ zadatak

Radi se o problemu mreznog transporta, tj imam n cvorova, svaki cvor ima svoj "neki" broj, tj ponudu NECEGA ako je broj pozitivan, i potraznju NECEGA ako je broj negativan. Postoje grane izmedju cvorova (broj tih grana je izmedju n-1 i n*(n-1)/2) i putem tih grana mogu se transportovati te jedinice NECEGA. Svaka grana ima svoju cenu transporta po jedinici robe, i zadaci mreznog protoka se baziraju na problemu pronalazenja minimalne cene koju je potrebno platiti da bi svi cvorovi imali svoju potraznju tj ponudu 0. Tj iz svih cvorova koji imaju ponudu +3, da te tri jedinice odu u one cvorove gde je minus, i da se tako kompenzuju na nulu.

Imam zadatak da ucitam iz txt fajla neke brojeve. Input bi dakle bio ovako nesto:

"
1,2; 1
2,4; 2
4.1; 3
1,4; 2

1
-2
-4
5
"
Cvorovi su oznaceni brojevima, pretpostavimo npr da ih ima 4. Ono sto karakterise grane, su pocetni cvor, krajnji cvor i cena transporta tom granom.
Ovde gore su 1,2 pocetna i krajnja tacka grane jedan itd....... 1 2 3 2 su cene transporta tim granama.... dole 1 -2 -4 5 su ponude i potraznje ta 4 cvora...

e sad, moj zadatak je da ovo gore bude ukucano u txt fajlu, a da c++ ucita te brojeve u promenljive. Inace, te promenljive ce biti prosledjene listi, jer su mi za zadatak potrebne 2 liste... prva lista je lista cvorova, koja ce imati jedan "sadrzaj"=ponudu i pokazivac a druga lista je lista grana, koja ce imati 3 "sadrzaja", pocetnu tacku, krajnju tacku i cenu. Ako postoji mogucnost da se ti brojevi direktno ucitaju u liste bilo bi super, ali ja nisam nesto vican programiranju, pa sam dosao do zakljucka da je lakse prvo staviti u promenljive, a zatim vrednost tih promenljivih redom smestiti u liste, pa sa njima dalje raditi sta vec treba.

Ima li neko ideju kako to uraditi?



Ocajni student.
sunce86 je offline   Odgovor sa citatom ove poruke
Stara 3.6.2010, 16:54   #2
Todors
Član
 
Član od: 16.4.2010.
Lokacija: Pančevo
Poruke: 462
Zahvalnice: 41
Zahvaljeno 68 puta na 63 poruka
Određen forumom Re: c++ zadatak

Nisam baš siguran, ali ovo mi liči na enumeraciju kolekcija iz generičke klase Enumerable, ili pak možda grešim.
Todors je offline   Odgovor sa citatom ove poruke
Stara 3.6.2010, 17:09   #3
sunce86
Član
 
Član od: 14.4.2006.
Poruke: 103
Zahvalnice: 1
Zahvaljeno 8 puta na 8 poruka
Određen forumom Re: c++ zadatak

sunce86 je offline   Odgovor sa citatom ove poruke
Stara 3.6.2010, 18:18   #4
Todors
Član
 
Član od: 16.4.2010.
Lokacija: Pančevo
Poruke: 462
Zahvalnice: 41
Zahvaljeno 68 puta na 63 poruka
Određen forumom Re: c++ zadatak

Malo je kompleksno, moras prvo da naucis kako se prave i koriste generičke klase i metode. Sa njima možeš da praviš čvorove kao što si zamislio.
evo ti linkovi http://www.codeproject.com/KB/mcpp/cppcligenerics.aspx i http://msdn.microsoft.com/en-us/libr...8VS.80%29.aspx za početak.
Todors je offline   Odgovor sa citatom ove poruke
Stara 3.6.2010, 18:58   #5
bvitnik
Starosedelac
 
Član od: 27.12.2005.
Lokacija: Pančevo
Poruke: 1.303
Zahvalnice: 63
Zahvaljeno 438 puta na 328 poruka
Određen forumom Re: c++ zadatak

Znači ako sam dobro razumeo, tvoj problem je samo učitavanje podataka iz fajla a ne i rešavanje problema mrežnog transporta? Rešavanje problema mrežnog transporta znaš da uradiš?

E to je već malo opširna tema. Parsiranje, tako se zove ono što tebi treba, je cela nauka. Elem:

1) Ako imaš slobodu u izboru formata fajla, onda možeš da koristiš neku gotovu biblioteku/klasu koja će da ti podatke upisuje/čita iz fajla u, recimo, nakom XML obliku. U tom slučaju potraži na internetu takvu klasu/biblioteku. Nemam ništa konkretno da ti predložim. Da koristiš Javu, Properties ili Preferencies klase bi ti odlično poslužile.

2) Ako ti je format fajla unapred zadat, onda moraš da pišeš svoj parser. Kod komplikovanih formata fajlova, obično se koriste alati za izradu leksera i parsera. Za C\C++ obično se koriste Lex + Bison. Problem je što te alate moraš da znaš da koristiš i izrada ovoga što tebi treba bi poprilično potrajala. S obzirom da je format tvog fajla poprilično jednostavan, najbolji izbor je da praviš svoj ad-hoc parser. Evo kako ćeš:

a) Utvrdi koje karaktere iz fajla treba da ignorišeš (space, newline).
b) Utvrdi koji karakteri ti predstavljaju delimetre, odnosno karaktere koji ti razgraničavaju tzv. tokene. U tvom primeru gore karakteri ',' ';' i newline bi ti predstavljali delimetre.
c) Utvrdi šta su ti tokeni, odnosno delovi podataka iz fajla koji nose neku informaciju i koje treba učitati. Kod tebe su to celi brojevi, sa ili bez znaka. Znači, recimo, '-12', '3', '55' su tebi tokeni.
d) Definisaćeš stanja svog parsera. Stanje možeš da predstaviš po želji a obično je jedna int promenljiva sasvim dovoljna, kojoj ćeš da dodeljuješ vrednosti, recimo 0 do (broj_stanja - 1). U svakom stanju parser se drugačije ponaša kada učita karaktere iz fajla.

Tok parsiranja za format koji si gore naveo ti sada ide ovako:

a) Parser staviš u početno stanje (0). Čitaš karakter po karakter i smeštaš u string. Kada naletiš na delimeter (,), prestaješ sa čitanjem, vrednost u stringu (token) konvertuješ u int (atoi(), stoi()), staviš u promenljivu, parser staviš u stanje 1.
b) Sada ponovo radiš isto ali učitavaš do ';' delimetra i vrednost smeštaš u novu promenljivu. Parser stavljaš u stanje 2.
c) U sledećem koraku ponovo radiš isto ali čitaš do newline-a, ignorišući space ispred, i vrednost stavljaš u novu promenljivu. U ovom trenutku si cela jedna linija fajla je parsirana. Tri promenljive koje su učitane sada smeštaš u listu ili kakvu god strukturu podataka koristiš za svoje potrebe. Parser stavljaš u stanje 0 i ideš sve iz početka sa novom linijom.

Kao što vidiš, stanje parsera ti određuje koji delimeter ti određuje kada je kraj učitavanja, određuje ti promenljivu u koju treba smestiti učitanu vrednost i određuje ti dokle se stiglo sa učitavanjem jedne linije.

Kad dođeš do prazne linije, one što ti razdvaja potraživanja, parser stavljaš u neko novo stanje (3?) i zatim na sličan način učitavaš i sledeće vrednosti. Jedno posebno stanje parsera možeš da koristiš kao stanje greške (recimo -1). To će ti služiti u slučaju kada se karakteri koji su učitani ne slažu sa onim što se očekuje. Recimo neka od gornjih linija bi mogla da glasi " 2,3.4; bla " što je neregularno i što bi parser morao nekako da prevaziđe ako želiš da nastavi rad.

Veoma komplikovana tema i ne očekujem da razumeš ovo što sam poprilično šturo opisao. Jednostavno nema lakog načina.
bvitnik je offline   Odgovor sa citatom ove poruke
Stara 3.6.2010, 19:30   #6
sunce86
Član
 
Član od: 14.4.2006.
Poruke: 103
Zahvalnice: 1
Zahvaljeno 8 puta na 8 poruka
Određen forumom Re: c++ zadatak

Za pocetak treba samo da ucitam te podatke iz fajla i odgovarajuce podatke smestim u odgovarajuce liste. Ne treba da resavam ceo problem mreznog transporta.

Sto se tice liste, imam vec napravljenu gotovu jednospregnutu listu koja izgleda ovako:

Kod:
#ifndef LIST_DEF
#define LIST_DEF

#include <stdlib.h>
#include <iostream>
using namespace std;

template <class T>
class List{
	private:
		struct listEl{
			T content;//sadrzaj
			T content2;
			struct listEl *next;//pokazivac na sledeci elemenat
		};
		listEl *head;//prvi element liste(glava liste)
		listEl *tail;//nije lose za imati, moze povecati upotrebljivost strukture
		int noEl;
	public:
		List(){
			head=tail=NULL;
			noEl=0;
		}
		List(const List<T> &);//konstruktor kopije
		List<T>& operator=(const List<T>&);//prekloplen operator =
		virtual ~List();

		int size() const {return noEl;}//broj elemenata u liste
		bool empty() const {return head==NULL?1:0;}

		bool add(int, const T&);
		bool remove(int);//brisanje elementa iz liste
		bool read(int, T&)const; //ocitani element se smesti u T - funkcija vraca uspelo-neuspelo

		void clear();

};

template <class T>
ostream& operator<<(ostream & out, const List<T> &l){
	out<<endl;
	out<<"--------"<<endl;
	for(int i=1;i<=l.size();i++){
		if(i!=1) out<<", ";
		T res;
		l.read(i,res);
		out<<res;
	}
	out<<endl<<"--------"<<endl;
	return out;
}

template <class T>
List<T>::List(const List<T> &l){
	head=NULL;tail=NULL;
	noEl=0;
	for(int i=1;i<=l.noEl;i++){
		T res;
		if(l.read(i,res))
			add(i,res);
	}
}

template <class T>
List<T>& List<T>::operator=(const List<T> &l){
	if(this!=&l){
		clear();
		head=NULL;tail=NULL;
		noEl=0;
		for(int i=1;i<=l.noEl;i++){
			T res;
			if(l.read(i,res))
				add(i,res);
		}
	}
	return *this;
}

template <class T>
List<T>::~List(){
	while(!empty()){
		remove(1);
	}
}

template <class T>
bool List<T>::add(int n, const T& newContent){
	bool isempty=empty();
	if(n<1 || (!isempty && n>noEl+1))
		return false;
	else{
		listEl *newEl=new listEl;
		if(newEl==NULL)
			return false;
		else{
			newEl->content=newContent;
			if(n==1){
				newEl->next=head;
				head=newEl;
			}else if(n==noEl+1){ //novi ide na kraj liste
				newEl->next=NULL;
				tail->next=newEl;
			}else{
				listEl *temp=head;
				for(int i=2;i<n;i++)
					temp=temp->next;
				newEl->next=temp->next;
				temp->next=newEl;
			}
			noEl++;

			if(newEl->next==NULL) //znaci da je novi element zakacen na kraj liste
				tail=newEl;

			return true;
		}
	}
}

template <class T>
bool List<T>::remove(int n){
	if(empty() || n<1 || n>noEl)
		return false;
	else{
		if(n==1){
			listEl *temp=head;
			head=head->next;
			delete temp;
			noEl--;
		}else{
			listEl *temp=head;
			for(int i=2;i<n;i++)
				temp=temp->next;
			listEl *del=temp->next;
			temp->next=del->next;
			if(tail==del) //znaci brise se poslednji
				tail=temp; //setovati tail na trenutni pretposlednji element
			delete del;
			noEl--;
		}
		return true;
	}
}

template <class T>
bool List<T>::read(int n,T& retVal)const{
	if(empty() || n<1 || n>noEl)
		return false;
	else{
		if(n==1)
			retVal=head->content;
		else if(n==noEl)
			retVal=tail->content;
		else{
			listEl *temp=head;
			for(int i=1;i<n;i++)
				temp=temp->next;
			retVal=temp->content;
		}
		return true;
	}
}

template <class T>
void List<T>::clear(){
	while(!empty()){
		remove(1);
	}
}

#endif
Kao sto vidite, ona ima sve metode koje su mi potrebne za sada. A pored tog fajla u projektu imam i main.cpp fajl u kom sad uradio:

Kod:
#include <iostream>
#include <fstream>
#include <string>
#include "list.hpp"
using namespace std;

int main () {

    int n,i=0;
    cout<<"Unesite broj cvorova:"<<endl;
    cin>>n;

    int a[n*(n-1)/2],b[n*(n-1)/2],c[n*(n-1)/2]; //nizovi za smestanje pocetnih i krajnjih cvorova grana i cene grana
    int d[n]; //niz ponuda i potraznji (maksimalno moze biti koliko i cvorova)
    int m=0;
    List<int> cvorovi;
    List<double> grane;
    char chars; //promenljiva chars koja sluzi za jedenje znakova izmedju brojeva


    ifstream inFile;
    char inputFilename[] = "input.txt";
    inFile.open(inputFilename, ios::in);
    if (!inFile) {
        cerr << "Nije moguce otvoriti fajl" << inputFilename << endl;
        exit(1);
    }

    while (inFile>>a[i] >> chars >> b[i] >> chars >> c[i]) {

        cout<<a[i]<<b[i]<<c[i]<<endl;
        i++;
    }






    for (i=0; i<5; i++) {
        cout<<a[i]<<", "<<b[i]<<", "<<c[i]<<endl;
        cout<<"======================================="<<endl;
    }
    inFile.close();





    cvorovi.add(1,4);
    cvorovi.add(2,3);
    cout<<cvorovi<<endl;



}
Za pocetak sam probao da smestim podatke iz fajla u staticke nizove. Takodje, koristio sam promenljivu "chars" za "jedenje" onih delova txt fajla koje treba da izbacim.
Ali sad imam problem sa ucitavanjem dela txt fajla koji je posle novog reda. Ne znam kako sad to da ucitam u niz d[m] npr.

Ovo za cvorove i grane na kraju sam samo probavao da li radi lista.

Da li mislite da se ovo moze ovako odraditi? I kako ucitati ostatak?

Napominjem da imam samo ovaj jedan zadatak, tj samo sada radim ovo sa fajlovima, i format u txt fajlu je uvek ovakav.
sunce86 je offline   Odgovor sa citatom ove poruke
Stara 3.6.2010, 22:16   #7
sunce86
Član
 
Član od: 14.4.2006.
Poruke: 103
Zahvalnice: 1
Zahvaljeno 8 puta na 8 poruka
Određen forumom Re: c++ zadatak

Za drugara koji mi je objasnio alforitam, moze ovako?

Kod:
   do {
        switch(p) {

        case 0:
            getline(inFile,pomocna,';');
            a[i]=integer(pomocna);
            i++;
            p=1;
            break;

        case 1:
            getline(inFile,pomocna,',');
            b[j]=integer(pomocna);
            j++;
            p=2;
            break;

        case 2:
            getline(inFile,pomocna,'\n');
            c[k]=integer(pomocna);
            k++;
            if (inFile.peek()=='\n') {
                p=3;
            } else {
                p=0;
            }
            break;

        case 3:

            while (!EOF) {
            getline(inFile,pomocna,'\n');
            d[m]=integer(pomocna);
            m++;
            p=3;
            break;
            }
            p=4;
            break;


        }} while (p!=4);
sunce86 je offline   Odgovor sa citatom ove poruke
Stara 4.6.2010, 0:45   #8
sunce86
Član
 
Član od: 14.4.2006.
Poruke: 103
Zahvalnice: 1
Zahvaljeno 8 puta na 8 poruka
Određen forumom Re: c++ zadatak

Malo sam popravio ovaj zadnji case 3 ali nece da mi ocita ove cifre sto su posle reda pauze

Ako mozes bvitnik da mi pomognes, ne znam da li je dobar ovaj uslov u case 2:

Kod:
if (inFile.peek()=='\n') {
                p=3;
            } else {
                p=0;
            }
Ceo projekat je na adresi: http://rapidshare.com/files/394971183/pstablo.rar.html

ps: ubija me ovo ceo dan, nikako bar da unesem cifre, a liste jos nisam ni krenuo da radim
sunce86 je offline   Odgovor sa citatom ove poruke
Stara 4.6.2010, 3:06   #9
bvitnik
Starosedelac
 
Član od: 27.12.2005.
Lokacija: Pančevo
Poruke: 1.303
Zahvalnice: 63
Zahvaljeno 438 puta na 328 poruka
Određen forumom Re: c++ zadatak

To bi u principu trebalo da bude to. Nažalost nemam vremena da detaljno gledam kod i testiram ga a kamoli da debagujem jer i sam radim na dva projekta za faks i u škripcu sam sa vremenom.

Osnove sam ti objasnio, samo nastavi.
bvitnik je offline   Odgovor sa citatom ove poruke
Stara 4.6.2010, 10:35   #10
sunce86
Član
 
Član od: 14.4.2006.
Poruke: 103
Zahvalnice: 1
Zahvaljeno 8 puta na 8 poruka
Određen forumom Re: c++ zadatak

Ok, falio je samo 1 getline u case 2 u uslovu da bih preskocio taj prazan red. Sada radi.
sunce86 je offline   Odgovor sa citatom ove poruke
Stara 4.6.2010, 11:10   #11
Boris B.
Član
 
Član od: 3.5.2006.
Lokacija: Beograd
Poruke: 101
Zahvalnice: 11
Zahvaljeno 11 puta na 10 poruka
Određen forumom Re: c++ zadatak

Lepo je to sto si uneo podatke, ali i dalje ti ostaje osnovni problem da resis: trazenje minimalne cene transporta.

Nisam se previse upustao u problem, ali mi na prvi pogled opasno smrdi da se resava Madjarskom metodom:

http://en.wikipedia.org/wiki/Hungarian_algorithm

Mada to je prilicno napredna tema. Na kom si faksu?

I zaboravi na generike, to se radi samo sa tonom vektora za svaki property po jedan (C nacin) ili jednim vektorom objekata sa property-ima(C++ nacin).
Boris B. je offline   Odgovor sa citatom ove poruke
Stara 4.6.2010, 12:14   #12
sunce86
Član
 
Član od: 14.4.2006.
Poruke: 103
Zahvalnice: 1
Zahvaljeno 8 puta na 8 poruka
Određen forumom Re: c++ zadatak

Na Fakultetu Tehnickin nauka. Nije mi zadatak da resim problem minimalnog transporta, nego da samo napravim "podlogu" za resavanje, tj treba sad ove podatke iz txt fajla koje sam smestio u nizove da prebacim u 2 liste, na taj nacin da se posle sa tim listama moze operisati, da li madjarskim metodom, da li metodom severozapadnog ugla, ili fogelovom, nije ni bitno.

Prva lista je lista cvorova, a svaki cvor je okarakterisan jednim integerom (ponudom ili potrebom). Pored tog sadrzaja element liste sadrzi samo 1 pokazivac na sledeci element i to je to.

E sad, problem mi je druga lista, lista grana, jer je svaka grana okarakterisana pocetnim cvorom, krajnjim cvorom i cenom transporta, sto znaci da svaki element liste treba da sadrzi 3 podatka, tj 2 integera i 1 double i naravno pokazivac.

Ne znam kako da realizujem drugu listu, a prvu sam realizovao ovako:

Kod:
#ifndef LIST_DEF
#define LIST_DEF

#include <stdlib.h>
#include <iostream>
using namespace std;

template <class T>
class List{
	private:
		struct listEl{
			T content;//sadrzaj
			struct listEl *next;//pokazivac na sledeci elemenat
		};
		listEl *head;//prvi element liste(glava liste)
		listEl *tail;//nije lose za imati, moze povecati upotrebljivost strukture
		int noEl;
	public:
		List(){
			head=tail=NULL;
			noEl=0;
		}
		List(const List<T> &);//konstruktor kopije
		List<T>& operator=(const List<T>&);//prekloplen operator =
		virtual ~List();

		int size() const {return noEl;}//broj elemenata u liste
		bool empty() const {return head==NULL?1:0;}

		bool add(int, const T&);
		bool remove(int);//brisanje elementa iz liste
		bool read(int, T&)const; //ocitani element se smesti u T - funkcija vraca uspelo-neuspelo

		void clear();

};

template <class T>
ostream& operator<<(ostream & out, const List<T> &l){
	out<<endl;
	out<<"--------"<<endl;
	for(int i=1;i<=l.size();i++){
		if(i!=1) out<<", ";
		T res;
		l.read(i,res);
		out<<res;
	}
	out<<endl<<"--------"<<endl;
	return out;
}

template <class T>
List<T>::List(const List<T> &l){
	head=NULL;tail=NULL;
	noEl=0;
	for(int i=1;i<=l.noEl;i++){
		T res;
		if(l.read(i,res))
			add(i,res);
	}
}

template <class T>
List<T>& List<T>::operator=(const List<T> &l){
	if(this!=&l){
		clear();
		head=NULL;tail=NULL;
		noEl=0;
		for(int i=1;i<=l.noEl;i++){
			T res;
			if(l.read(i,res))
				add(i,res);
		}
	}
	return *this;
}

template <class T>
List<T>::~List(){
	while(!empty()){
		remove(1);
	}
}

template <class T>
bool List<T>::add(int n, const T& newContent){
	bool isempty=empty();
	if(n<1 || (!isempty && n>noEl+1))
		return false;
	else{
		listEl *newEl=new listEl;
		if(newEl==NULL)
			return false;
		else{
			newEl->content=newContent;
			if(n==1){
				newEl->next=head;
				head=newEl;
			}else if(n==noEl+1){ //novi ide na kraj liste
				newEl->next=NULL;
				tail->next=newEl;
			}else{
				listEl *temp=head;
				for(int i=2;i<n;i++)
					temp=temp->next;
				newEl->next=temp->next;
				temp->next=newEl;
			}
			noEl++;

			if(newEl->next==NULL) //znaci da je novi element zakacen na kraj liste
				tail=newEl;

			return true;
		}
	}
}

template <class T>
bool List<T>::remove(int n){
	if(empty() || n<1 || n>noEl)
		return false;
	else{
		if(n==1){
			listEl *temp=head;
			head=head->next;
			delete temp;
			noEl--;
		}else{
			listEl *temp=head;
			for(int i=2;i<n;i++)
				temp=temp->next;
			listEl *del=temp->next;
			temp->next=del->next;
			if(tail==del) //znaci brise se poslednji
				tail=temp; //setovati tail na trenutni pretposlednji element
			delete del;
			noEl--;
		}
		return true;
	}
}

template <class T>
bool List<T>::read(int n,T& retVal)const{
	if(empty() || n<1 || n>noEl)
		return false;
	else{
		if(n==1)
			retVal=head->content;
		else if(n==noEl)
			retVal=tail->content;
		else{
			listEl *temp=head;
			for(int i=1;i<n;i++)
				temp=temp->next;
			retVal=temp->content;
		}
		return true;
	}
}

template <class T>
void List<T>::clear(){
	while(!empty()){
		remove(1);
	}
}

#endif
Imas li neku ideju?
sunce86 je offline   Odgovor sa citatom ove poruke
Stara 4.6.2010, 16:39   #13
bvitnik
Starosedelac
 
Član od: 27.12.2005.
Lokacija: Pančevo
Poruke: 1.303
Zahvalnice: 63
Zahvaljeno 438 puta na 328 poruka
Određen forumom Re: c++ zadatak

Umesto generičkih tipova (int, double), listi proslediš strukturu ili klasu koja sadrži 2 ili 3 polja, koliko ti već treba, odgovarajućih tipova.

Znači ovako nešto:

Kod:
struct grana
{
    int cvor1, cvor2;
    double cena;
};

//posle toga negde u kodu

List<grana> grane = new List<grana>();

struct grana grana1 = new struct grana;

grana1->cvor1 = 1;
grana1->cvor2 = 2;
grana1->cena = 3;

grane->add(0, grana1);
Umesto strukture možeš da koristiš klasu. Njena polja možeš da staviš public (isto što i struct) ili private + metode za dohvatanje i setovanje polja. To je tvoj izbor.
bvitnik je offline   Odgovor sa citatom ove poruke
Stara 5.6.2010, 0:20   #14
sunce86
Član
 
Član od: 14.4.2006.
Poruke: 103
Zahvalnice: 1
Zahvaljeno 8 puta na 8 poruka
Određen forumom Re: c++ zadatak

Uf sad si me malo zbunio sa ovim imenima

Da li moze kratko objasnjenje sta radi koja linija koda?
sunce86 je offline   Odgovor sa citatom ove poruke
Stara 5.6.2010, 2:41   #15
sunce86
Član
 
Član od: 14.4.2006.
Poruke: 103
Zahvalnice: 1
Zahvaljeno 8 puta na 8 poruka
Određen forumom Re: c++ zadatak

Ok, shvatio sam ovo poslednje, i uspeo sam da ubacim sve podatke u te 2 liste.
Samo jedno pitanje? Moze li ovako:

Kod:
    List<Grana> grane;
    Grana grana1;
    for (i=1; i<=k; i++) {
        grana1.cvor1=a[i-1];
        grana1.cvor2=b[i-1];
        grana1.cena=c[i-1];
        grane.add(i,grana1);
    }
Zbog cega si gore koristio (*grane).cvor1=1 itd???
Zbog cega si kod add funkcije stavio poziciju "0" ako brojanje elemenata liste pocinje od 1, koliko ja znam? Ili gresim?


Sad mi je problem ispis liste sa granama, jer za nju ne postoji preklopljen operator<< nego se izgleda mora prolaziti sa iteratorom kroz elemente??

ovako nesto:

Kod:
for(i=grane.begin(); i != grane.end(); i++) cout << (*i).x << " ";
Gde se definise iterator? U klasi liste? Postoji li neki drugi nacin, posto imam u nekoj knjizi definisan iterator kao deo neke liste ali nista ne kontam...
sunce86 je offline   Odgovor sa citatom ove poruke
Stara 6.6.2010, 21:51   #16
bvitnik
Starosedelac
 
Član od: 27.12.2005.
Lokacija: Pančevo
Poruke: 1.303
Zahvalnice: 63
Zahvaljeno 438 puta na 328 poruka
Određen forumom Re: c++ zadatak

Citat:
sunce86 kaže: Pregled poruke
Ok, shvatio sam ovo poslednje, i uspeo sam da ubacim sve podatke u te 2 liste.
Samo jedno pitanje? Moze li ovako:

Kod:
    List<Grana> grane;
    Grana grana1;
    for (i=1; i<=k; i++) {
        grana1.cvor1=a[i-1];
        grana1.cvor2=b[i-1];
        grana1.cena=c[i-1];
        grane.add(i,grana1);
    }
Zbog cega si gore koristio (*grane).cvor1=1 itd???
Zbog cega si kod add funkcije stavio poziciju "0" ako brojanje elemenata liste pocinje od 1, koliko ja znam? Ili gresim?
Primer samo. Lupio sam vrednosti 1, 2, 3. Umesto njih stavljaš ono što učitaš iz fajla. Znači a[i-1], b[i-1], c[i-1] kako već radiš.

0 je greška. Pretpostavio sam da se elementi liste indeksiraju od 0 a ne od 1.

Citat:
Sad mi je problem ispis liste sa granama, jer za nju ne postoji preklopljen operator<< nego se izgleda mora prolaziti sa iteratorom kroz elemente??

ovako nesto:

Kod:
for(i=grane.begin(); i != grane.end(); i++) cout << (*i).x << " ";
Gde se definise iterator? U klasi liste? Postoji li neki drugi nacin, posto imam u nekoj knjizi definisan iterator kao deo neke liste ali nista ne kontam...
operator<< je preklopljen koliko vidim. Možda fali "friend" ispred "ostream& operator<<(ostream & out, const List<T> &l)". Tvoja lista nema iteratore tako da ih ne možeš koristiti. Moraš ih sam napraviti a za to ti treba znanje i vreme a u tvom slučaju ti i nisu neophodni iteratori.
bvitnik je offline   Odgovor sa citatom ove poruke
Stara 7.6.2010, 12:15   #17
sunce86
Član
 
Član od: 14.4.2006.
Poruke: 103
Zahvalnice: 1
Zahvaljeno 8 puta na 8 poruka
Određen forumom Re: c++ zadatak

Pa da, preklopljen je taj operator, ali nece da radi ako se listi prosledi klasa, vec samo int, double itd.

Za ispisivanje liste sa granama sam iskoristio funkciju "read" ali je potrebno vise koda no dobro, nema veze.

Evo imam jos samo 1 zadatak... hehe... potrebno je sad da izaberem od svih grana koje sam uneo one grane koje mogu ciniti pokrivajuce stablo. Nije ni vazno sta je pokrivajuce stablo, uglavnom algoritam je ovakav:

Krenem od cvora 1, i trazim grane kod kojih je x.cvor1 == 1 ili x.cvor2==1 gde je x objekat klase Grana u koji sam ucitao tekuci element (granu) liste. Prvu granu koja ispunjava uslov treba da ispise, i da uzme njen drugi cvor, tj cvor koji nije 1, neka to bude 3. Sad ponovo krece od trojke, i kao i u prvom slucaju trazi grane kod kojih je x.cvor1==3 || x.cvor2==3 ali ne sme da to bude grana 1;3 ili 3;1 jer bi se vratili ponovo u tacku 1, a to ne sme. I tim algoritmom, treba da prodjem kroz sve grane. Ako se u nekoj tacki dodje do zakljucka da ne postoji x.cvor1=='neki broj' || x.cvor2=='neki broj' onda se ispisuje da nije moguce naci pokrivajuce stablo.

Naizgled deluje jednostavno. Ja se ubih smisljajuci petlje za ovo, ali nikako ne uspevam da se iskobeljam. Kao dosta iskusniji, imas li ideju kako bi se ovo resavalo?
sunce86 je offline   Odgovor sa citatom ove poruke
Stara 7.6.2010, 14:58   #18
aljosabre
Novi član
 
Član od: 11.12.2008.
Poruke: 20
Zahvalnice: 17
Zahvaljeno jedanput na jednoj poruci
Određen forumom Re: c++ zadatak

Mozes backtrackom, s tim da obelezis cvorove koje si posetio. To ti je najlakse ali verovatno moze optimalnije, rekurentno.
aljosabre je offline   Odgovor sa citatom ove poruke
Stara 7.6.2010, 20:01   #19
bvitnik
Starosedelac
 
Član od: 27.12.2005.
Lokacija: Pančevo
Poruke: 1.303
Zahvalnice: 63
Zahvaljeno 438 puta na 328 poruka
Određen forumom Re: c++ zadatak

Citat:
sunce86 kaže: Pregled poruke
Pa da, preklopljen je taj operator, ali nece da radi ako se listi prosledi klasa, vec samo int, double itd.
Moraš da preklopiš operator<< u toj klasi koju prosleđuješ listi. Operator<< preklopljen u listi samo prosleđuje odgovornost za ispis samim elementima liste.
bvitnik je offline   Odgovor sa citatom ove poruke
Stara 7.6.2010, 22:37   #20
sunce86
Član
 
Član od: 14.4.2006.
Poruke: 103
Zahvalnice: 1
Zahvaljeno 8 puta na 8 poruka
Određen forumom Re: c++ zadatak

To mi je jasno. Hteo sam reci, ako ispisem samo:

Kod:
cout<<neka_lista<<endl;
onda nece ispisati, vec moras da pristupis elementu liste:
Kod:
ime_klase g;
neka_lista.read(i+1,g);
cout<<g<<endl;
Mada nisam morao ovde preklapati operator u klasi, mogao sam:
Kod:
ime_klase g;
neka_lista.read(i+1,g);
cout<<g.cvor1<<endl;
cout<<g.cvor2<<endl;
cout<<g.cena<<endl;
No, nebitno. Sto se tice backtreka nisam uspeo, tj ne znam kako da ga implementiram, a i ne znam kako uopste moze s njim, procitao sam objasnjenje na wikipediji, nisam siguran da moze tako ???

sunce86 je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi

Alatke vezane za temu
Vrste prikaza

Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno


Slične teme
tema temu započeo forum Odgovora Poslednja poruka
Zadatak iz matematike... Down Force Brbljaonica 84 29.6.2010 12:39
Početni zadatak u VB-u de facto Programiranje 1 29.4.2009 18:17
Kviz na Pinku - matematički zadatak! stevan10 Brbljaonica 15 18.3.2009 13:00
Qbasic zadatak Gradimir Programiranje 9 14.3.2009 9:03
Jedan zadatak u C-u RuSkO_17 Programiranje 18 17.11.2008 17:30


Sva vremena su po Griniču +2 h. Sada je 2:45.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2024, vBulletin Solutions, Inc.
Hosted by Beograd.com