» »

[c++] bubblesort

[c++] bubblesort

sebi7 ::

Žal kode ne morem objaviti ker Izpiše mi da tisti neki html znakci niso veljavni !

Objavit sem hotel kodo za bubble sort ker ga ne vem rešit!Tole je naloga


// Izdelajte postopek, ki prebral do 10 števil in jih izpisal po velikosti od najmanjšega proti najveèjemu.
// Vnos podatkov lahko predhodno zakljuèimo z vnosom vrednosti 0.

Problem je da ne vem predhodno zaključit oz ne gre.Dam break, in mi zakjuči predhodno ampak mi vseeno za polja vzame da sem vpisal 10 števil.Kako naj nastavim izpis da mi bo vzel tolko kolko števil sem vnesel?
Skratka če vpišem 4 števila in dam za peto število o se mi zaključi ampak rezultat mi izpiše neke
-832432432.Predvidevam da je zato ker mi ne upošteva 4 števila ampak vseh 10 števil in ostalim 6 številom avtomatično priredi tole število in jih tudi izpiše!
  • spremenilo: snow ()

Keki ::

uporabi zanko while, oz do-while. In daš while(element!=0)
Za bubble sort moreš nardit funkcijo ki argumente prenaša po referenci. Če ne veš kaj je to, se prvo nauči kako lahko prenašamo argumente.

potem je čisto preprosto vmesni je prvi, prvi je drugi, drugi je vmesni.


PS. Za objavo C++ kode uporavi direktivo st.koda C++ in /st.koda C++ v oglatih oklepajih
http://www.alfakan.si/
http://mihajerot.si/

Zgodovina sprememb…

  • spremenilo: Keki ()

sebi7 ::

Saj tole mam, ampak ne deluje!Tule je koda


#include <iostream.h>

void zamenjaj(int& prvi, int& drugi)
{
	// VHOD: polje[i] kot prvi, polje[i + 1] kot drugi
	// VRNE: polje[i] in polje [i + 1]
	int zacasni = prvi;
	prvi = drugi;
	drugi = zacasni;
}

void UrediPolje(int polje[], int velikost)
{
	
	for (int prehod = 0; prehod < velikost-1 ; prehod++)
	{
		for(int i = 0; i < velikost-1; i++)
		{
			if (polje[i] > polje[i + 1])
			{
				zamenjaj(polje[i],polje[i+1]);
			}
		}
	}
}

void IzpisiPolje(int polje[],int velikost)
		
{
		for(int i = 0; i < velikost; i++)
		{
			cout	<< polje[i]<< " ";
		}

}


		
		
		
int main()
			
		{
			
			const int vel_polja = 10;
			int polje[vel_polja];
			
			// 1. Vnos števil v polja
			do
			
			for(int i = 0; i < vel_polja; i++)
			{
				cout << "polje[" << i << "] = ";
				cin >> polje[i];
			}
			while(polje[i]!=0);
			

			UrediPolje(polje, vel_polja);
			cout<<"Podatki po urejanju"<<endl;
			IzpisiPolje(polje,vel_polja);
			return 0;		}

Tutankhamun ::

void Sort (int *table, int size)
{
	bool sort = true;
	do
	{
		sort = false;
		for (int i = 0; (i + 1) < size; ++i)
		{
			if (table [i] < table [i+1])
			{
				int tmp = table [i];
				table [i] = table [i+1];
				table [i+1] = tmp;
				
				sort = true;
			}
		}
	} while (sort);
}

int main(int argc, char* argv[])
{
	int size = 10;
	int table [10];

	table [0] = 3;
	table [1] = 1;
	table [2] = 2;
	table [3] = 8;
	table [4] = 5;
	table [5] = 6;
	table [6] = 1;
	table [7] = 2;
	table [8] = 9;
	table [9] = 7;

	Sort (table, size);

	return 0;
}
AMD Phenom QUAD 9950 Black Edition, 8GB

sebi7 ::

Jaz iz tega nič ne razumem.A bi lahko malo razložil kaj rabim s čim zamenjat?Delno razumem tvojo kodo, ampak sem še začetnik.

sebi7 ::

V bistvu sem zdaj razvozlal ampak ne deluje, saj sortira ampak jaz rabim tisti del ko vpišem ničlo potem me vrže iz funkcije in izpiše tiste številke po vrsti katere sem do takrat vpisal!Zdaj sem uspel nekaj začarati z break ampak ne dela.Saj prekine ko vpišem število nič ampak ne izpiše dobro ker mi izpiše 10 števil.

sebi7 ::

Prosim naj nekdo pove rešitev ker sem obupal!

Tutankhamun ::

Aaaa sm pa mislu da je bol pomembn sort funkcija, z drugimi zadevami se sploh nism

obremenjevau.... Evo ceu program ;).

void BubleSort (int *table, int size)
{
	bool sort = true;
	do
	{
		sort = false;
		for (int i = 0; (i + 1) < size; ++i)
		{
			if (table [i] < table [i+1])
			{
				int tmp = table [i];
				table [i] = table [i+1];
				table [i+1] = tmp;
				
				sort = true;
			}
		}
	} while (sort);
}

void PrintTable (int *table, int size)
{
	char *sep = "";

	for (int i = 0; i < size; ++i)
	{
		cout << sep << table [i];
		sep = ",";
	}

	cout << endl;
}

void LoadTable (int *table, int size)
{
	for (int i = 0; i < size; ++i)
	{
		cout << "Vpisi " << (int) (i+1) << ". stevilko: ";
		cin >> table [i];
	}
}

int main(int argc, char* argv[])
{
	int size;
	int *table;
	
	cout << "Koliko stevilk bi vnesel: ";
	cin >> size;
	cout << endl;

	table = new int [size]; /* create table */

	LoadTable (table, size); /* table load */
	cout << endl;

	cout << "Tabela pred sortiranjem:" << endl;
	PrintTable (table, size); /* table print */
	
	BubleSort (table, size); /* sort */
	cout << endl;

	cout << "Tabela po sortiranju:" << endl;
	PrintTable (table, size); /* table print */

	return 0;
}


Pa zato, ker tvoja naloga hoče lih sam do 10 številk, pa še eno ničlo, sm lih opazu,

pol pa mau spremeniš funkciji main () in LoadTable ()

int LoadTable (int *table)
{
	for (int i = 0; i < MAX_TABLE_SIZE; ++i)
	{
		cout << "Vpisi " << (int) (i+1) << ". stevilko: ";
		cin >> table [i];
		if (table [i] == 0)
			return i;
	}

	return MAX_TABLE_SIZE;
}

int main(int argc, char* argv[])
{
	int size;
	int table [MAX_TABLE_SIZE];
	
	size = LoadTable (table); /* table load */
	cout << endl;

	cout << "Tabela pred sortiranjem:" << endl;
	PrintTable (table, size); /* table print */
	
	BubleSort (table, size); /* sort */
	cout << endl;

	cout << "Tabela po sortiranju:" << endl;
	PrintTable (table, size); /* table print */

	return 0;
}


Čist na začetku programa, recva nad pred prvo funkcijo oziroma po includih dodej še to

vrstico.
#define MAX_TABLE_SIZE	10


Pa ne obupat no... :)
AMD Phenom QUAD 9950 Black Edition, 8GB

zigi ::

Ti imaš vedno polje[10], tudi če vpišeš manj znakov. Probaj v funkcijah UrediPolje in IzpisiPolje kot drugi parameter uporabiti i.

Ugibam.

sebi7 ::

Hvala za odgovore....zdaj moram samo še kodo razvozlat ker ga ne razumem najbolje:D

Keki ::

Prvo kot prvo bi blo bolše da na začetku uporabnik vnese velikost polja, ker če ti določiš s const = 10 in potem ne vneseš 10 elementov ti bo vseeno izpisalo "vrednosti" nezapolnjenih lokacij. Tak da če mate da je maksimalna velikost 10 daj na začetku cin velikost in pol preverjaj če je > 10 naj da return -1 če ne pač nadaljuješ. Ker tak ko bi ti rad naredo lahko narediš samo z dinamično alokacijo pomnilnika. Bom pastal mojo rešitev malo kasneje.

kasneje=zdaj :D
Dodal sem še funkcijo za vnos v polje in pa ideja je, da argumentov ki naj se v funkciji ne spremenijo določiš tudi z določilom const (ni nujno je pa dobro).

#include <iostream.h>

void zamenjaj(int& prvi, int& drugi)
{
	// VHOD: polje[i] kot prvi, polje[i + 1] kot drugi

	// VRNE: polje[i] in polje [i + 1]

	int zacasni = prvi;
	prvi = drugi;
	drugi = zacasni;
}

void vnosPolja(int polje[], const int velikost)
{
			for(int i = 0; i < velikost; i++)
			{
				cout << "polje[" << i << "] = ";
				cin >> polje[i];
			}
}

void UrediPolje(int polje[], const int velikost)
{
	
	for (int prehod = 0; prehod < velikost-1 ; prehod++)
	{
		for(int i = 0; i < velikost-1; i++)
		{
			if (polje[i] > polje[i + 1])
			{
				zamenjaj(polje[i],polje[i+1]);
			}
		}
	}
}

void IzpisiPolje(int polje[], const int velikost)
		
{
		for(int i = 0; i < velikost; i++)
		{
			cout	<< polje[i]<< " ";
		}

}

		
		
int main()
			
		{
			
			int vel_polja;
			
			cout<<"Vnesite velikost polja: ";
			cin>>vel_polja;
			
			if(vel_polja>10)
			{
                            cout<<"Vnesli ste preveliko število!";
                            return -1;
             }
             int polje[vel_polja];
             
			// 1. Vnos števil v polja             			
			vnosPolja(polje, vel_polja);
			

			UrediPolje(polje, vel_polja);
			cout<<"Podatki po urejanju"<<endl;
			IzpisiPolje(polje,vel_polja);
			
			return 0;		
   }
http://www.alfakan.si/
http://mihajerot.si/

Zgodovina sprememb…

  • spremenilo: Keki ()

Tutankhamun ::

Keki, čist komot lahko daš konstantno veliko polje pa nebo nič izpisalo neizpolnjenih polj. Pa ceu programček sm že dau gor, ki dela na način kot si ti naredu pa še na zahtevani način.

Pa da ne omenjam, da si naredu napako, ker se tabelce ne da tko alocirat. Dinamično se tabelca alocira z new operatorjem glej 3 poste viši.
	int vel_polja;
			
	cout<<"Vnesite velikost polja: ";
	cin>>vel_polja;
			
	if(vel_polja>10)
	{
		cout<<"Vnesli ste preveliko število!";
		 return -1;
	}
	int polje[vel_polja];
AMD Phenom QUAD 9950 Black Edition, 8GB

Keki ::

ja vem kak se dinamično alocira polje :D To sem samo omeno nisem dal v program.
http://www.alfakan.si/
http://mihajerot.si/

Gundolf ::

Huh keki. Ratal ti je narest do for(;;) while() zanko. Rabiš le do while() ali pa for(;;) zanko, ne pa obojega skupaj tlačit. Tako narediš le dvojno zanko. V tvojem primeru sicer čudežno dela, ni pa to pravilo, da ti bo taka neumnost vedno delala...

Drugače pa za začetek - sej funkcija urediPolje ti sprejme velikost polja kot parameter. Če ne napolniš polja do konca pač podaš manjšo vellikost pa bo. Za bolj resno rešitev pa seveda lahko uporabiš dinamično alocirano tabele. Oz. v tvojem primeru rabiš le razred vector iz standardne knjižnice.

Tutankhamun ::

Gundolf, to je vrjetn name letel dve zanki. Sm lih pogledu na net in vidu lepo dve for zanki za ta algoritem.
Sej ne rečem, lahk tut sam z eno, je pa čist dobr napisan in ni nobena neumnost še mn pa "čudež" da dela. Lahko pa predstaviš svoj čudež.
AMD Phenom QUAD 9950 Black Edition, 8GB

BigWhale ::

Ce se da nekaj napisati samo z eno for zanko namesto z dvema, potem bo v primeru ene zanke skoraj vedno stvar hitrejsa in bolj optimalna. Ne vedno ampak, saj pravim, skoraj vedno.

:)

Nested loops are a no-no! ;)

Tutankhamun ::

Ja pa napiš pol sam z eno zanko bubble sort. Gundolf je izjavu da je to neumnost. Js pa pač čakam da napiše pametnejše.

bubble sort
še en bubble sort
bubble sort
še en bubble sort

Povsod so dvojne zanke tko, da ne mi govort o neumnosti in da celo dela. Ker sovražm da mi kdo kej izjav da mam kej neumn narjen ne pokaže pa drgačnga algoritma.
AMD Phenom QUAD 9950 Black Edition, 8GB

BigWhale ::

Vzemi LART tool in se z njim po glavi mahni. Petkrat.

Jaz tvojega algoritma nisem komentiral.

Trdim samo to, da, ce se nekaj lahko naredi z eno zanko namesto z dvema, bo slednja resitev pocasnejsa.

Kaj me brigajo tvoji bubble sorti.

Tutankhamun ::

Če se ti s tem svojim LART-om mahaš po glav ni treba še men to predlagat.

Pa tko nism teb nč reku. Sm reku za Gundolfa, tko da pšššššt.
AMD Phenom QUAD 9950 Black Edition, 8GB

Gundolf ::

Ne Tutankhamun, ni to nate letel :) Poglej od sebi7 izvorno kodo, čisto na koncu imaš primer, kjer je IMHO hotel napisal neko sintaktično kombinacijo for in do while zanke, pa ni vedel, da je naredil gnezdenje.

P.S. sem pa v izvornem postu res zgrešil ime 'krivca' :)

Zgodovina sprememb…

  • spremenil: Gundolf ()

Tutankhamun ::

Aaaaa. Potem pa sory za nesporazum. Pa ko si lih moderator lahk moje poste na konc brišeš.
AMD Phenom QUAD 9950 Black Edition, 8GB

Gundolf ::

Nah, z BWjem nista prestopila meje dobrega okusa, tako da posti kar ostanejo. Ampak zdej pa vseeno back on topic prosim.

Keki ::

Hm, ne razumem kaj si hoto povedat to z dvojno zanko. Načeloma bi naj bil bubble sort polja sestavljen iz 2h for zank prva je število prehodov druga pa laufa po polju samem al ne? Predvsem ne vidim while zanke v moji kodi :D
http://www.alfakan.si/
http://mihajerot.si/

Zgodovina sprememb…

  • spremenilo: Keki ()

Tutankhamun ::

Sej ni letel nate na sebi7 je letel. Gre se pa za dvojno zanko v main funkciji...
AMD Phenom QUAD 9950 Black Edition, 8GB

strictom ::

Danes pisali kontrolno pri programiranju. Druga naloga je bila bubblesort :)
"Violence is the last refuge of the incompetent" - Salvor Hardin

Keki ::

Aja, ker si keki napisal :D

@strictom
Heh, skor bi jo mogo znat če si prebral to temo :D
http://www.alfakan.si/
http://mihajerot.si/

strictom ::

30%/30%. Treba je še blo napisat naj izpiše 1. in 3. največje število.
"Violence is the last refuge of the incompetent" - Salvor Hardin

Gundolf ::

Ja keki, sori k sm tebe napisu, ko sem škilu kdo je pisec prvega posta, sem nekak tebe zadel, verjetno ker si se znajdu tam med obema sebi7-jevima postoma. Bom poskusu bit bolj pozoren vnaprej.

Keki ::

Eh sploh nisn zamero samo zmeden sem bil ker nisem vedo kje mam while zanko :D

@stictom
Če sortiraš od največjega do najmanjšega maš na indeksu 0 največje na indeksu 2 pa tretje največje. Samo izpišeš jih :D Če sortiraš obratno maš pa na indeksu velikost-1 največje pa na velikost-3 tretje največje.
__
Smo pa naredli kr lepo seminarsko o bubble sortu če kdo rabi samo copy paste :D
http://www.alfakan.si/
http://mihajerot.si/

Zgodovina sprememb…

  • spremenilo: Keki ()

strictom ::

Blo je od najmanjšega do največjega tako da je blo največje na indexu 9 (blo je 10 števil) 3. največje pa na indeksu 7.
"Violence is the last refuge of the incompetent" - Salvor Hardin


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C#] Domača naloga za faks

Oddelek: Programiranje
171928 (1552) Spura
»

Kruskalov algoritem težave pri implementaciji

Oddelek: Programiranje
51519 (1293) zacetnik11
»

[C#] pomoc pri vpisu elementov v listBox

Oddelek: Programiranje
101186 (1101) keworkian
»

[C++] urejanje nizov po velikosti

Oddelek: Programiranje
82155 (1936) Matako
»

Bubble sort

Oddelek: Programiranje
71459 (1351) OwcA

Več podobnih tem