Archief - [PROG][C++] 'van klein naar groot'programma

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Spokos

Legacy Member
beste mensen,

ik zou graag een programma hebben dat 3 getallen inleest en ze ordent van klein naar groot en afprint...Dit liefst met de 2 functies die ik heb geîmplementeerd. Enkel heb ik een probleem:) Voorlopig werkt het dus niet echt goed. Hij geeft gwn trug a,b en c weer in dezelfde volgorde. Kan er iemand mij helpen? De fout zal hem zitten in de references of in de output denkik, maar ik zou niet weten hoe ik het moet doen. Alvast bedankt.



Code:
beste mensen,

ik zou graag een programma hebben dat 3 getallen inleest en ze ordent van klein naar groot en afprint...Dit liefst met de 2 functies die ik heb geîmplementeerd. Enkel heb ik een probleem:) Voorlopig werkt het dus niet echt goed. Hij geeft gwn trug a,b en c weer in dezelfde volgorde. Kan er iemand mij helpen? De fout zal hem zitten in de references of in de output denkik, maar ik zou niet weten hoe ik het moet doen. Alvast bedankt.



#include <iostream>
using namespace std;

void sorteer(unsigned int&,unsigned int&,unsigned int&);
void wissel(unsigned int&,unsigned int&);

int main()
{
	unsigned int a,b,c;
	cout<<"Geef 3 gehele getallen a,b en c (STOP=a<0):"<<endl
	<<"a = ";
	cin>>a;
	cout<<"\nb= ";
	cin>>b;
	cout<<"\nc = ";
	cin>>c;
	sorteer(a,b,c);
	cout<<"Gesorteerd van klein naar groot in a,b en c geeft dit:"<<endl
	<<"a = "<<a<<"\tb = "<<b<<"\tc = "<<c;
	
}

void sorteer(unsigned int& a,unsigned int& b,unsigned int& c)
{
	unsigned int min=0,max=0;
	if (a>max)
	{
		max=a;
	}
	if (b>max)
	{
		max=b;
		min=a;
	}
	if (c>max)
	{
		max=c;
		if(a<b)
		{
			min=a;
		}
		if(b<a)
		{
			min=b;
		}
	}
	wissel(max,min);
}

void wissel (unsigned int& max,unsigned int& min)
{
	unsigned int hulp=max;
	max=min;
	min=hulp;
}

of mss dat er een fout in de ifs staat, ik zie het niet echt.


of mss dat er een fout in de ifs staat, ik zie het niet echt.

zoutvat

Legacy Member
Je sorteerfunctie klopt echt niet... Ik snap echt niet welke redenering je volgt.
Je kan hoogstens een wissel uitvoeren. Je elementen kunnen ook alledrie op de verkeerde plek zitten he!

zoutvat

Legacy Member
void sorteer(unsigned int& a,unsigned int& b,unsigned int& c)
{
unsigned int hoogste, middelste, laagste;

doe nu zelf wat denkwerk...

a = laagste;
b = middelste;
c = hoogste;
}

Op deze manier kan je de swap weglaten. Die heb je niet nodig om drie getalletjes te sorteren. Je kan ook gewoone en ingebouwde sort gebruiken of een echt sorteeralgoritme implementeren als je het liever zelf wil doen om bij te leren.

killgore

Legacy Member
of ga wat opzoekwerk doen over standaard sorteeralgoritmen. Want wat jij hier zal doen is gewoon een lus hardcoden :p.

Spokos

Legacy Member
mja maar het was de opdracht om deze 2 functies te gebruiken dus:s

Tyfius

Legacy Member
Ik zou uw sorteer functie eens grondig doornemen want die klopt van geen kanten.
Het beste is inderdaad wat killgore zei: standard sorting algorithms gebruiken. Er zijn er hopen die exact doen wat gij wilt doen.

Het is de fout van uw docent/prof/leerkracht om u deze niet aan te leren. Ze zijn er, ze zijn goed doordacht en ze werken.

zoutvat

Legacy Member
Inderdaad. Zoek eens op bubble sort (das een simpele), of insertion sort, of als je het wat moeilijker wil: quicksort of heapsort.

Maar asl je nu maar drie getalletjes wil sorteren maakt het eigenlijk niet zoveel uit. Daarvoor zou ik nu ook geen sorteeralgoritme gebruiken.

Daedie

Legacy Member
Ge maakt het uzelf erg moeilijk.

kzal u verderhelpen met enkele tips, kga geen code voorschotelen.
- Ge hebt geen extra variabelen nodig in de sorteer-functie (dus geen min, max)
- zorg eerst dat het grootste getal in de c-variabele zit (2 wissels nodig)
- de waardes in a en b moeten dan nog onderling vergeleken woren (1 wissel)

3 testen met een wissel na elke test dus.

edit: bubblesort is een beke overkill voor een beginner he ^^. Dit is een basic oefeningske uit een inleidende cursus, heb ik ook nog moeten maken 2 jaar geleden :p.

killgore

Legacy Member
Spokos zei:
mja maar het was de opdracht om deze 2 functies te gebruiken dus:s

ik zeg toch neit dat je meer functies moet gebruiken.

Ik zeg gewoon dat jij in 3 stappen gaat hardcoden voor 3 variabelen wat eigenlijk selection sort (een eenvoudig algoritme) in 1 lus doet voor eigenlijk al gewoon een willekeurig aantal variabelen ;). Je kan evengoed een algemeen sorting algorithme in die 1 functie implementeren wat even "moeilijk" te verstaan is maar waarmee je wel meer bent.

een ander vrij eenvoudig algoritme is insertion sort.

En ik zal zelfs meer zeggen: selection & insertion zijn ondanks hun eenvoud & "traagheid" nog vrij vaak gebruikt (omdat ze vrij optimaal zijn voor korte lijsten).

edit: bubble, quick, heap, merge, ... zijn geavanceerdere (dat eerste wordt trouwens zelden gebruikt), daar zou ik niet naar kijken ;).

edit: om je eventjes te helpen, selection komt hier op neer:

Code:
Je hebt N variabelen in rij a
loop overalle variabelen van i=0 tot N-2
   zet variabele max op i
   loop nu over alle variabelen van j = i+1 tot j = N-1
      kijk of a[j] > a[max].
          Zo ja, zet max op j
          Zo nee, doe niets
   einde binnenste lus
   max bevat nu de POSITIE van het grootste element in die rij
   verwissel dan a[i] en a[max]
einde buitenste lus.

hierna is het algoritme gedaan.
enkele opmerkingen:
1)we houden in max de positie bij en niet de waarde. Als je met int's werkt lijkt dit nutteloos, reden is vooral omdat veel rijen ook complexere gegevens (tekst, grafische data, ...) bevatten en het dan sneller is om de positie bij te houden en slechts 1 keer alle data te kopiëren (bij het wisselen).
2) wil je sorteren van klein naar groot dan moet je die 1e > vervangen door < :p.
3) in de buitenste lus is het nutteloos om tot de laatste variabele in de rij te gaan (je kan deze hoogstens nog door zichzelf vervangen, wat nutteloos is).
4) in de binnenste lus vetrekken we op i+1 omdat we als start-max punt al i hebben gekozen, we moeten die variabele niet met zichzelf vergelijken. Hier meoten we natuurlijk wel tot de laatste variabele gaan.

Spokos

Legacy Member
hey, merci iedereen voor de nuttige info en tips, ik heb alles gelezen enzo, maar ik heb besloten om het te houden bij wat daedalus heeft gezegd. Hier mijn resultaat:
Code:
#include <iostream>
#include <cstdlib>
using namespace std;

void sorteer(int&,int&,int&);
void wissel(int&,int&);

int main()
{
	int a,b,c;
	cout<<"Geef 3 gehele getallen a,b en c (STOP=a<0):"<<endl
	<<"a = ";
	cin>>a;
	while (a>=0)
	{
		cout<<"b = ";
		cin>>b;
		b=abs (b);
		cout<<"c = ";
		cin>>c;
		c=abs (c);
		sorteer(a,b,c);
		cout<<"Gesorteerd van klein naar groot in a,b en c geeft dit:"<<endl
		<<"a = "<<a<<"\tb = "<<b<<"\tc = "<<c;
		cout<<"\n\nGeef 3 gehele getallen a,b en c (STOP=a<0):"<<endl
		<<"a = ";
		cin>>a;
	}
return 0;
}

void sorteer(int& a,int& b,int& c)
{
	if (a>b) 
		wissel(a,b);
	if (a>c)
		wissel(a,c);
	if (b>c)
		wissel (b,c);
}

void wissel (int& max,int& min)
{
	unsigned int hulp=max;
	max=min;
	min=hulp;
}

zoutvat

Legacy Member
na twee maand lessen programmeren kregen we de opdracht om een heapsort te implementeren. Die is heeel veel moeilijker dan een bubble ofzo. Nuja, das dan wel unief, maar toch. En ik blijf erbij dat je voor drie getallen te sorteren niet een heel sorteeralgoritme moet uitdenken. En selectionsort optimaal? Helemaal niet!

killgore

Legacy Member
zoutvat zei:
na twee maand lessen programmeren kregen we de opdracht om een heapsort te implementeren. Die is heeel veel moeilijker dan een bubble ofzo. Nuja, das dan wel unief, maar toch. En ik blijf erbij dat je voor drie getallen te sorteren niet een heel sorteeralgoritme moet uitdenken. En selectionsort optimaal? Helemaal niet!

waar heb ik dat gezegd :x?

Ik ken genoeg sorteeralgoritmen om te weten waarover ik spreek hoor.

edit: om te verduidelijken: quicksort bv. geeft vaak problemen met overhead op korte rijen (zoiets van lengte 10). Van het moment dat de subrijen zo kort worden implementeert men vaak een selectionsort algoritme ipv verder te werken met het geadvanceerdere algoritme. Dergelijke hybrid sorts werken over het algemeen toch wel duidelijk sneller (je moet echter geen wonderen verwachten als O(n²) naar O(nlogn) ofzo :p.

Daedie

Legacy Member
zoutvat zei:
na twee maand lessen programmeren kregen we de opdracht om een heapsort te implementeren. Die is heeel veel moeilijker dan een bubble ofzo. Nuja, das dan wel unief, maar toch. En ik blijf erbij dat je voor drie getallen te sorteren niet een heel sorteeralgoritme moet uitdenken. En selectionsort optimaal? Helemaal niet!

bij is kwam heapsort het eerste jaar helemaal niet aan bod oO. Geen enkel echt sorteeralgoritme trouwens.

2de jaar: algoritmen & datastructuren, toen hebben we dat gezien ^^.

blackrabbit

Legacy Member
zoutvat zei:
na twee maand lessen programmeren kregen we de opdracht om een heapsort te implementeren. Die is heeel veel moeilijker dan een bubble ofzo. Nuja, das dan wel unief, maar toch. En ik blijf erbij dat je voor drie getallen te sorteren niet een heel sorteeralgoritme moet uitdenken. En selectionsort optimaal? Helemaal niet!

Welke unif?

zoutvat

Legacy Member
Durf ik echt niet :(. Ben er te bechaamd voor. Ik kon toen net programmeren he :)

Spokos

Legacy Member
weet er trouwens iemand hoe ik een datum inlees in deze vorm: bv. 12/12/2007
en hoek deze datum daarna weer in de uitvoer kan zetten?

dit werkt namelijk niet-->
int dag,maand,jaar;
cin>>dag>>maand>>jaar;
cout<<"Factuur betaald op "<<dag<<"/"<<maand<<"/"<<jaar<<endl

killgore

Legacy Member
Ik zou het zo doen:
lees hele regel in.
Check of regel met zo een formaat overeen komt (en haal ondertussen de juiste waarden eruit en steek ze in die int's).
Indien fout formaat, herhaal :).

Basis stringoperaties. Het is (imho) in dergelijke gevallen eenvoudiger om een hele string in te lezen en te evalueren als stukje per stukje in te lezen en te evalueren.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan