[C++]Ouput hoog-laag

Pagina: 1
Acties:

  • Chip.
  • Registratie: Mei 2006
  • Niet online
Hallo,

Ik heb een programma dat de afstand van x aantal, in dit geval 3, punten van elkaar berekent. Dit is de code:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <cmath>
using namespace std;

struct Punt
{
    float x;
    float y;
};

float afstandP2P(Punt p1, Punt p2)
{
    return sqrt(pow(p1.x - p2.x,2) + pow(p1.y - p2.y,2));
}

int main()
{
    Punt p1, p2, p3;
    
    cout << "Bereken de afstand van 3 punten tot elkaar." << endl;
    cout << "Voer de x-coordinaat in voor punt 1: ";
    cin >> p1.x;
    cout << "Voer de y-coordinaat in voor punt 1: ";
    cin >> p1.y;
    cout << endl << "Voer de x-coordinaat in voor punt 2: ";
    cin >> p2.x;
    cout << "Voer de y-coordinaat in voor punt 2: ";
    cin >> p2.y;
    cout << endl << "Voer de x-coordinaat in voor punt 3: ";
    cin >> p3.x;
    cout << "Voer de y-coordinaat in voor punt 3: ";
    cin >> p3.y;
    
                // Cout
}


Nu moet ik ervoor zorgen dat het programma dus de afstand van alle punten van elkaar berekent dus:
De afstand van punt 1 naar punt 2, afstand van punt 2 naar punt 3 en de afstand van punt 3 naar punt 1 niet moeilijk toch? Nauw nu zit ik met het volgende probleem ik moet de afstand van die 3 outputten in de volgorde van hoog naar laag. Nu kan ik dit doen met een heleboel if else structuur maar ik vroeg me af of er geen gemakkelijkere manier is???

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Arrays en een standaard sorteeralgoritme? Dat kan sequentiëel zijn, of iets als quicksort als je daaraan toe bent.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Zoals de poster hierboven me al zegt, plaats de afstanden in een array.
Je kunt dan de sort-implementatie van de STL gebruiken: http://www.sgi.com/tech/stl/sort.html.

De tekst op deze pagina zal je waarschijnlijk een beetje als chinees in de oren klinken, maar er wordt een voorbeeldje gegeven van hoe je sort() moet gebruiken ;)

  • Chip.
  • Registratie: Mei 2006
  • Niet online
Zal eens ermee gaan prutsen :D

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:14

.oisyn

Moderator Devschuur®

Demotivational Speaker

Als je 3 dingen sorteren wilt sorteren dan kun je dat natuurlijk ook gewoon met de hand doen door 3x te verwisselen: Als het tweede element hoger is dan het eerste, wissel ze om. Als het derde element hoger is dan het tweede, wissel ze om. Als het tweede element vervolgens weer hoger is dan het eerste, wissel ze weer om. Nu zijn ze gegarandeerd gesorteerd :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MeMoRy
  • Registratie: Augustus 2004
  • Laatst online: 17-07 12:50
ik weet niet of je ook nog moet herinneren welke afstanden tussen welke punten zijn, dan zou je nog een structje moeten maken

code:
1
2
3
4
5
6
struct Afstand
{
    int begin;
    int eind;
    float afst;
};

U vraagt, wij antwoorden.


Verwijderd

.oisyn schreef op vrijdag 23 februari 2007 @ 23:10:
Als je 3 dingen sorteren wilt sorteren dan kun je dat natuurlijk ook gewoon met de hand doen door 3x te verwisselen: Als het tweede element hoger is dan het eerste, wissel ze om. Als het derde element hoger is dan het tweede, wissel ze om. Als het tweede element vervolgens weer hoger is dan het eerste, wissel ze weer om. Nu zijn ze gegarandeerd gesorteerd :)
Oftewel, sequential sort. Bij weinig elementen heel simpel, handig en performant, maar als 't aantal elementen oploopt zijn er betere sort algorithmes.

  • Teun_2
  • Registratie: Oktober 2003
  • Laatst online: 24-11 21:33
Is dat niet bubble sort?
Maar zoek eens naar quicksort/heapsort etc.

[ Voor 48% gewijzigd door Teun_2 op 24-02-2007 16:09 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:14

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zoutvat schreef op zaterdag 24 februari 2007 @ 16:09:
Maar zoek eens naar quicksort/heapsort etc.
Beetje nutteloos, om iets te sorteren hoef je natuurlijk niet te weten hoe zo'n sorteerfunctie werkt. std::sort() was al geopperd :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • FTPlus
  • Registratie: Februari 2003
  • Laatst online: 10-11-2024

FTPlus

Pluisje

Als het om het sorteren van specifiek 3 waarden gaat gebruik ik meestal deze manier:
(dit is pseudo code)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int a, b, c; // 3 waarden in willekeurige vollgorde

// a=1 b=2 c=3

if (b < a)
    swab(a, b);

// a=2 b=1 c=3

if (c < b)
    swab(b, c);

// a=2 b=3 c=1

if (b < a)
    swab(a, b);

// a=3 b=2 c=1

-=Waiz=-


  • Daos
  • Registratie: Oktober 2004
  • Niet online
FTPlus schreef op zondag 25 februari 2007 @ 04:34:
Als het om het sorteren van specifiek 3 waarden gaat gebruik ik meestal deze manier:
(dit is pseudo code)
...
Dat lijkt op Bubblesort. Het is zo'n beetje het slechtste algoritme dat er bestaat. Bovendien kan je beter met arrays werken. Het is kost dan geen moeite om je programma met een ander aantal dan 3 te laten werken.

En waarom zou je een sorteeralgoritme implementeren als er al een implementatie is? Zie hierboven:

  • Soultaker
  • Registratie: September 2000
  • Nu online
Daos schreef op zondag 25 februari 2007 @ 11:59:
Dat lijkt op Bubblesort. Het is zo'n beetje het slechtste algoritme dat er bestaat. Bovendien kan je beter met arrays werken. Het is kost dan geen moeite om je programma met een ander aantal dan 3 te laten werken.
Echt niet. De efficiëntie van sorteeralgoritmen wordt pas relevant als je uitgaat van een groot aantal elementen (al is 'groot' een rekbaar begrip en nogal van de situatie afhankelijk). Het gaat om het ordenen van drie elementen, en het sorteren van drie elementen met drie vergelijkingen is optimaal. Je zou wel gek zijn om daar een standaardalgoritme voor aan te roepen, want dat is gegarandeerd veel trager.

Wel grappig in deze context is dat Quicksort ook O(N2) worst case is, maar dat om de worst-case in praktische situaties te vermijden, meestal een optimalisatie wordt toegepast: in plaats van zomaar een element als pivot te kiezen, wordt de mediaan van het eerste, laatste en middelste element van de lijst genomen (dat helpt niet tegen de theoretische worst case, maar wel in de praktijk). Quicksort moet dus intern deze drie waarden sorteren; grote kans dat de Quicksort die in de standard library zit dus intern soortgelijke code bevat als wat oisyn en FTPlus suggereren. ;)

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Soultaker schreef op zondag 25 februari 2007 @ 12:29:
[...]

Echt niet. De efficiëntie van sorteeralgoritmen wordt pas relevant als je uitgaat van een groot aantal elementen (al is 'groot' een rekbaar begrip en nogal van de situatie afhankelijk). Het gaat om het ordenen van drie elementen, en het sorteren van drie elementen met drie vergelijkingen is optimaal. Je zou wel gek zijn om daar een standaardalgoritme voor aan te roepen, want dat is gegarandeerd veel trager.
Je hebt inderdaad minimaal 3 vergelijkingen nodig, maar je hebt minder dan de 3 swaps nodig die voorgesteld worden. De volgende code is bijvoorbeeld een stukje sneller:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdio.h>

void sort3(int *pa, int *pb, int *pc) {
  int a = *pa;
  int b = *pb;
  int c = *pc;
  int tmp;

  if (a <= b) {
    if (a <= c) {
      if (b > c) {
        /* a c b */
        tmp = b;
        b = c;
        c = tmp;
      }
      /* else a b c */
    }
    else {
      /* c a b */
      tmp = c;
      c = b;
      b = a;
      a = tmp;
    }
  }
  else {
    if (a <= c) {
      /* b a c */
      tmp = a;
      a = b;
      b = tmp;
    }
    else {
      if (b < c) {
        /* b c a */
        tmp = a;
        a = b;
        b = c;
        c = tmp;
      }
      else {
        /* c b a */
        tmp = a;
        a = c;
        c = tmp;
      }
    }
  }

  *pa = a;
  *pb = b;
  *pc = c;
}

int main() {
  int a = 3, b = 1, c = 2;

  sort3(&c, &b, &a);

  printf("Gesorteerd van hoog naar laag: %d %d %d\n", a, b, c);

  return 0;
}


Zo kan je blijven doorgaan...

In dit topic is snelheid geen issue, dus ik zie geen reden waarom je niet gewoon de bestaande sort zou kunnen gebruiken.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:14

.oisyn

Moderator Devschuur®

Demotivational Speaker

FTPlus schreef op zondag 25 februari 2007 @ 04:34:
Als het om het sorteren van specifiek 3 waarden gaat gebruik ik meestal deze manier:
(dit is pseudo code)
Euh, precies wat ik al zei dus ;)

Daos: Dat kun je niet zeggen. Conditional moves (cmov*) zijn met jouw code bijvoorbeeld niet mogelijk. Bovendien kost een registerswap (xchg) geen drol :).
Overigens, veel sorteerroutines quicksorten tot een deellijst onder een bepaalde threshold komt, waarna een shellsort gebruikt wordt.

[ Voor 57% gewijzigd door .oisyn op 25-02-2007 17:29 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1