Toon posts:

Tellen van 00 tot 59

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb , dit hier al eens gevraagd, en kreeg het antwoord van maak een classe met een eigenoperator.
Na een week proberen en zoeken op het net is het mij nog steeds niet gellukt.

Ik zal eventjes het probleem uitleggen :

Ik heb in builder een analoge klok gemaakt.
Eronder staat het uur in getallen afgedrukt.

Maar als men boven de 60min gaat,
dan kom er 61 en zo op.
Dan zou het weer als 00 genoteerd moeten worden in de Label.
Dit zou geen probleem zijn
C++:
1
 if (minuten > 60 ) minuten = 00;

Maar ik had er graag een eigen datatype van gemaakt.
Dus kwam ik uit bij emun
C++:
1
emun minten { 00 , 01 };

Doet het niet.

Dus kort samengevat:
Ik had graag een datatype Minuten, en als variabele minuut = 59 en je telt er
1 bij, dat ik weer op 00 uitkom ( idd dubbel 0)

mvg

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
kun je niet minuten modulo 60 doen (in c++ en java is dat een minuten%60) ken builder verder niet.

Verwijderd

Topicstarter
dexter07051982 schreef op 22 February 2003 @ 15:09:
kun je niet minuten modulo 60 doen (in c++ en java is dat een minuten%60) ken builder verder niet.
Heb dit ook gezien in mijn vorig topic hierover,
maar het enigste wat ik weet over %-teken in C++ is:
C++:
1
2
3
4
int minuten = 61;
int resultaat;

resultaat = minuten%60;

En dit is bij mijn weten een restdeling.

  • Exirion
  • Registratie: Februari 2000
  • Nu online

Exirion

Gadgetfetisjist

code:
1
(minuten++)%60

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
ja en dat wil je toch ook
61 / 60 = 1 met een rest 1. dus in resultaat komt dan toch 1. das toch precies wat je hebben wou? en als ie het direct moet doen. exirion heeft dan volgens mij een hele goede oplossing.

Verwijderd

Topicstarter
dexter07051982 schreef op 22 februari 2003 @ 15:15:
ja en dat wil je toch ook
61 / 60 = 1 met een rest 1. dus in resultaat komt dan toch 1. das toch precies wat je hebben wou? en als ie het direct moet doen. exirion heeft dan volgens mij een hele goede oplossing.
OK, zover zijn we al :D

Thx,

maar werkt dit ook omgekeerd ?
Dus 00 - 1 = 59 ?

En aan de dubbele nullen, zijn die aan te passen ?

mVg

  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

Niet omgekeerd voor zover ik weet, (0 - 1) mod 60 is nog altijd -1 :)

[ Voor 10% gewijzigd door roelio op 22-02-2003 15:20 ]

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
ja
maar als je er dan weer 60 bij opteld kom je toch op 59 uit?

(((minuten++)%60) + 60) % 60;

[ Voor 21% gewijzigd door dexter07051982 op 22-02-2003 15:24 . Reden: voorbeeld ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 15:50

Robtimus

me Robtimus no like you

dexter07051982 schreef op 22 February 2003 @ 15:22:
ja
maar als je er dan weer 60 bij opteld kom je toch op 59 uit?

(((minuten++)%60) + 60) % 60;
waarom zo moeilijk doen? Dat is zo 2 optellingen en 2 delingen.
Het volgende scheelt iig een deling (verhoging is ff variabel; kan alles zijn groter dan -60):
code:
1
minuten = (minuten + verhoging + 60) % 60;

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

IceManX schreef op 22 februari 2003 @ 15:50:
waarom zo moeilijk doen? Dat is zo 2 optellingen en 2 delingen.
Het volgende scheelt iig een deling (verhoging is ff variabel; kan alles zijn groter dan -60):
code:
1
minuten = (minuten + verhoging + 60) % 60;

En -121 ? :P
Maar jouw code is wel correct als het max 60 is dat er bij komt :)

[ Voor 9% gewijzigd door ACM op 22-02-2003 16:14 ]


  • Morty
  • Registratie: November 2001
  • Laatst online: 26-06 22:02
ACM schreef op 22 februari 2003 @ 16:13:
Maar jouw code is wel correct als het max 60 is dat er bij komt :)
Groter dan 60 is niet erg, als het maar niet kleiner is dan -60 ;)
code:
1
minuten = (minuten + (verhoging % 60) + 60) % 60;

Lijkt mij een mooiere oplossing, en verhoging kan alles zijn...

[ Voor 3% gewijzigd door Morty op 22-02-2003 16:33 ]


Verwijderd

Verwijderd schreef op 22 February 2003 @ 15:04:
Ik heb , dit hier al eens gevraagd, en kreeg het antwoord van maak een classe met een eigenoperator.
Na een week proberen en zoeken op het net is het mij nog steeds niet gellukt.
Het is nogthans heel eenvoudig hoor :)
Even snel een heel eenvoudig dingetje maken:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Minuten
{
public:
// constructors
Minuten() : mMinuten(0) {}
Minuten( const int inMinuten ) : mMinuten( inMinuten % 60 ) {};

// destructor
~Minuten() {}

// operatoren + conversie
Minuten& operator++() { mMinuten = ++mMinuten % 60; return *this; }
operator int() const { return mMinuten; }

private:
int mMinuten;
};

Zoals je merkt heb ik ook een constructor gemaakt waaraan je gelijk een int kan meegeven, en die zorgt er dan zelf wel voor dat je waarde binnen 0-59 komt te liggen. Dus als je 61 gaat meegeven wordt dat automatisch 1. Ik heb verder de preincrement gedefinieerd, en de conversie naar een int... Postincrement kan je nu makkelijk zelf ff doen :)

Een klein stukje code als
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;

// hier komt je Minuten class
// hetzij door een include, hetzij door ze hier te declareren

int main()
{
Minuten theMinuten(58);
cout << theMinuten << endl;
cout << ++theMinuten << endl;
cout << ++theMinuten << endl;
cout << ++theMinuten << endl;
return 0;
}

geeft dan bij uitvoer
code:
1
2
3
4
58
59
0
1


Zoiets dat je wou ? :)
Dus kort samengevat:
Ik had graag een datatype Minuten, en als variabele minuut = 59 en je telt er
1 bij, dat ik weer op 00 uitkom ( idd dubbel 0)
Hmm, ik was dus te snel met code schrijven :P
Maar die dubbel nul is heel eenvoudig te verkrijgen. Definieer gewoon ff een friend operator<< en zorg ervoor dat een extra nul wordt uitgeschreven :)
Ff snel doen (deze komt dus gewoon in je public interface van Minuten) :
C++:
1
2
3
4
5
6
7
8
9
friend ostream& operator<< (ostream& outStream, const Minuten& inMinuten)
{
  if ( inMinuten.mMinuten < 10 )
  {
    outStream << '0';
  }
  outStream << inMinuten.mMinuten;
  return outStream;
}

en dan wordt de output van het programma dat ik net gaf
code:
1
2
3
4
58
59
00
01


Smile :) ;)

[EDIT]
Verwijderd schreef op 22 februari 2003 @ 15:19:
OK, zover zijn we al :D
Thx, maar werkt dit ook omgekeerd ?
Dus 00 - 1 = 59 ?
Tuurlijk, je moet gewoon ff de gepaste operatoren herdefiniëren. Dus operator-- (predecrement + postdecrement) en operator- bvb. Om ff als voorbeeld de predecrement te nemen (komt dus ook in je publieke interface van Minuten):
C++:
1
Minuten& operator--() { mMinuten = mMinuten ? --mMinuten : 59; return *this; }


Je kan dan aan het voorbeeldprogramma es de volgende regels toevoegen om te zien dat het zal werken zoals je wil:
C++:
1
2
cout << --theMinuten << endl;
cout << --theMinuten << endl;


Als je nog vragen hebt, stel maar :)

[ Voor 18% gewijzigd door Verwijderd op 22-02-2003 16:57 ]


Verwijderd

Topicstarter
Verwijderd schreef op 22 February 2003 @ 16:40:
[...]
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Minuten
{
public:
// constructors
Minuten() : mMinuten(0) {}
Minuten( const int inMinuten ) : mMinuten( inMinuten % 60 ) {};

// destructor
~Minuten() {}

// operatoren + conversie
Minuten& operator++() { mMinuten = ++mMinuten % 60; return *this; }
operator int() const { return mMinuten; }

private:
int mMinuten;
};

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;

// hier komt je Minuten class
// hetzij door een include, hetzij door ze hier te declareren

int main()
{
Minuten theMinuten(58);
cout << theMinuten << endl;
cout << ++theMinuten << endl;
cout << ++theMinuten << endl;
cout << ++theMinuten << endl;
return 0;
}

C++:
1
2
3
4
5
6
7
8
9
friend ostream& operator<< (ostream& outStream, const Minuten& inMinuten)
{
  if ( inMinuten.mMinuten < 10 )
  {
    outStream << '0';
  }
  outStream << inMinuten.mMinuten;
  return outStream;
}

C++:
1
Minuten& operator--() { mMinuten = mMinuten ? --mMinuten : 59; return *this; }

C++:
1
2
cout << --theMinuten << endl;
cout << --theMinuten << endl;


Als je nog vragen hebt, stel maar :)
Hartelijk dank dude,
in school hebben we de constructor al gezien, maar de // destructor
nog nie :p ff snel bekijken wat dat doet.

Nogmaals, hartelijk dank

  • dexter07051982
  • Registratie: November 2001
  • Laatst online: 11-07 22:38
sorry, kan aan mij liggen. maar minuten kun je toch gewoon in een integer bijhouden op de manier die ik je eerder gegeven heb. en om er voor te zorgen dat er 01 02 03 enz komt kun je toch gewoon de iomanip.h importeren?
waarom dan zo moeilijk doen met een eigen class.

PS. de destructor doet het omgekeerde van de constructor. in plaats van geheugen reserveren (en eventueel een waarde in plaatsen) geeft die het geheugen weer vrij als je delete aanroept.

Verwijderd

dexter07051982 schreef op 22 February 2003 @ 18:45:
sorry, kan aan mij liggen. maar minuten kun je toch gewoon in een integer bijhouden op de manier die ik je eerder gegeven heb. en om er voor te zorgen dat er 01 02 03 enz komt kun je toch gewoon de iomanip.h importeren?
waarom dan zo moeilijk doen met een eigen class.
Die eigen class schrijf je 1 keer goed; dat kost je een kwartier en dan werkt dat voor altijd prima. Als je iedere keer je minuten in een integer bijhoudt (wat inderdaad prima zou kunnen) dan moet je iedere keer in je code die % 60 enzo zitten schrijven (iig moet je 'speciale' dingen gaan doen met je integer), en als je dat 1 keer vergeet zit je met een bug enzo...
En zoals je merkt hou ik ze in wezen ook in een integer bij. Dus Minute objecten nemen maar evenveel geheugen in als jouw integer, maar ik kan er wel makkelijker mee werken zonder me zorgen te moeten maken over die extra 0 ervoor indien nodig, over het feit dat zo'n ding slechts tussen 0-59 kan liggen, etc.
Waarom moeilijk doen ? :)
PS. de destructor doet het omgekeerde van de constructor. in plaats van geheugen reserveren (en eventueel een waarde in plaatsen) geeft die het geheugen weer vrij als je delete aanroept.
En niet alleen als je delete aanroept op een object. Ook gewoon als je object out of scope gaat...
Pagina: 1