Archief - [c++] rare output

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.

[-AoLP-]Carp

Legacy Member
beste....

voor school moeten we een "groot" progje schrijven. er zit echter een rare fout in een van mn functies.

struct Datum{
int dag, maand, jaar;
};

Datum d1,d2;


bool is_schrikkeljaar(const int jaar){
if(jaar%4 == 0){
if(jaar%100 == 0 && jaar%400 != 0){
return false;
}
else return true;
}
}

int aantal_schrikkeljaren(const int jaar1, const int jaar2){
int aantal=0;
for(int i=jaar1; i<jaar2;i++){
//cout<<i<<" "; => hier zit er een probleem :confused:
if( is_schrikkeljaar(i))
aantal++;
}
return aantal;
}

int main(){

cin>>d1.jaar>>d2.jaar;
cout<<"aantal schrikkeljaren tusssen "<<d1.jaar<<" en "<<d2.jaar<<" : "<<aantal_schrikkeljaren(d1.jaar,d2.jaar)<<endl;

return 0;
}

output:
20 40 (input)
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 aantal schrikkeljaren tusssen 20 en 40 : 5

20 40
aantal schrikkeljaren tusssen 20 en 40 : 20

als ik in de functie aantal_schrikkeljaren die comment laat staan dan gaat hij in de fout. als ik die stukje code uit comment haal dan geeft hij het wel juist aantal schrikkeljaren+ alle i's.dit is maar een deel van mn programma.


mercie.

Cycloon

Legacy Member
Code:
bool is_schrikkeljaar(const int jaar){
    if(jaar%4 == 0){
        if(jaar%100 == 0 && jaar%400 != 0){
            return false;
        }
        else return true;
    }
}

Deze klopt natuurlijk niet want die geeft niet altijd een waarde terug. Ook de manier waarop je false en true weergeeft is nogal belachelijk.

Code:
bool is_schrikkeljaar(const int jaar){ return (jaar%4==0 && jaar%100!=0) || jaar%400==0 }

Mogelijks komt je probleem hierdoor...

Tyfius

Legacy Member
Volgens mij zit de fout niet daar, maar in uw is_schrikkeljaar functie. Ik miszie rond die comment toch niet direct iets, maar ik kan er over kijken.
Code:
bool is_schrikkeljaar(const int jaar){
	if(jaar%4 == 0){
		if(jaar%100 == 0 && jaar%400 != 0){
			return false;
		}
		else return true;
	}
}
Als uw jaar % 4 != 0 dan return je niets.

Probeer hetvolgende eens:
Code:
if (((jaar % 4 == 0) && (jaar % 100 != 0)) || (jaar % 400 == 0)) {
    return true;
}

return false;

edit: crap, te laat. /me waves his fist at Cycloon

teh_NiHiLiM

Legacy Member
Cycloon's code voor is_Schrikkeljaar is idd veel beter.

ik ken zelf helaas niet echt iets af van C++,
maar dit ziet er mij toch ook niet helemaal correct uit:

cout<<"aantal schrikkeljaren tusssen "<<d1.jaar<<" en "<<d2.jaar<<" : "<<aantal_schrikkeljaren(d1.jaar,d2.jaar)<<end l;

waarbij de output dan dit is:

20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 aantal schrikkeljaren tusssen 20 en 40 : 5
t'lijkt mij nie gezond da die functieoproep zo in 2 gekapt wordt daarzo ergens :crazy:
(of evalueert C++ eerst alle argumenten alvorens de functie als geheel te evalueren?)

[-AoLP-]Carp

Legacy Member
kheb die false toegevoegd en het werkt :D
toch een stomme fout :s

Tyfius

Legacy Member
teh_NiHiLiM zei:
Cycloon's code voor is_Schrikkeljaar is idd veel beter.

ik ken zelf helaas niet echt iets af van C++,
maar dit ziet er mij toch ook niet helemaal correct uit:

cout<<"aantal schrikkeljaren tusssen "<<d1.jaar<<" en "<<d2.jaar<<" : "<<aantal_schrikkeljaren(d1.jaar,d2.jaar)<<end l;

waarbij de output dan dit is:

20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 aantal schrikkeljaren tusssen 20 en 40 : 5
t'lijkt mij nie gezond da die functieoproep zo in 2 gekapt wordt daarzo ergens :crazy:
(of evalueert C++ eerst alle argumenten alvorens de functie als geheel te evalueren?)
Maakt niet uit, die ziet pas een ; als het einde van een statement. Hij mag dat op 100 lijnen zetten, dat gaat blijven werken.

teh_NiHiLiM

Legacy Member
Tyfius zei:
Maakt niet uit, die ziet pas een ; als het einde van een statement. Hij mag dat op 100 lijnen zetten, dat gaat blijven werken.

that's not my point :)

Code:
cout<<"aantal schrikkeljaren tusssen "<<d1.jaar<<" en "<<d2.jaar<<" : "<<aantal_schrikkeljaren(d1.jaar,d2.jaar)<<end l;

ik was wat verward door de manier waarop de cout te werk gaat :)

de meeste (alle?) talen gaan als volgt:
ze zien de cout, dan gaan ze eerst afzonderlijk alle gegeven parameters evalueren
(hier dus: een string, een veld, een string, een veld, een functie, end line)
waarbij de cout op zich dus nog niet als afgehandeld is bestempeld.
dus eerst zal de functie aantal_schrikkeljaren volledig uitgevoerd worden (met zijn eigen cout statement, hetgeen dus naar de output gestuurd wordt VOOR de cout van in het codeblok hierboven)
dat verklaart waarom de i's uit aantal_schrikkeljaren voor de strings van de cout staan.

forloRn_

Legacy Member
Ik heb het eens opgezocht en je hebt wel een punt. In tegenstelling tot bijvoorbeeld Java ligt de volgorde waarin C++ die dingen evalueert niet vast. Bij methods met side effects zoals deze kunnen verschillende compilers dan andere resultaten geven en dat is nooit goed.
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