Zum Inhalt springen

Help !!! Programm Schaltjahr - will nicht so...


Empfohlene Beiträge

Geschrieben

Hi @all,

brauch Hilfe beim Programm Schaltjahr.

Wenn man ein Jahr eingibt, wird einem angezeigt, ob es ein Schaltjahr ist oder nicht.

Bei der Eingabe "0" soll das Programm beendet werden.

Nun zu meinem Problem:

1. Wenn ich 0 eingebe bringt er mir erst die Ausgabe "Dies ist kein Schaltjahr" und beendet dann.

2. Wenn ich zum Beispiel 2004 eingebe, bringt er mir auch als Ergebnis "Dies ist kein Schaltjahr"....

Was mach ich falsch?????:confused: :confused:

Bitte helft mir....

thx kaffeemacher :)

Hier der Quellcode:


//---------------------------------------------------------------------------

#pragma hdrstop
#pragma argsused
#include <iostream.h>
#include <conio.h>

//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
//Variablendeklaration und -initialisierung
int iJahr = 1;
//char cEingabe = NULL;

//Wiederhole solange iJahre nicht gleich 0
do
{
while(iJahr != 0)
{
//Eingabe des Jahres
cout << "Bitte geben Sie das Jahr zur Ueberpruefung ein: " << endl;
cout << "Programmende mit 0" << endl;
cout << endl;
cout << "Jahr: ";
cin >> iJahr;

if(iJahr % 4 == 0)
{
if(iJahr % 100 == 0)
{
if(((iJahr % 400) == 0) && (iJahr >= 1600))
{
cout << "Dies ist ein Schaltjahr" << endl;
getch();
}
else
{
cout << "Dies ist kein Schaltjahr" << endl;
getch();
}
}
else
{
cout << "Dies ist kein Schaltjahr" << endl;
getch();
}
}
else
{
cout << "Dies ist kein Schaltjahr" << endl;
getch();
}
//Bildschirminhalt löschen
clrscr();
}
}while(iJahr != 0);


getch();
return 0;
}
[/PHP]

Geschrieben
Original geschrieben von Kaffeemacher

1. Wenn ich 0 eingebe bringt er mir erst die Ausgabe "Dies ist kein Schaltjahr" und beendet dann.

Wenn du das verhindern willst, musst du zwischen der Eingabe und der Berechnung aus der Schleife springen, z.B. mit break, oder die Berechnung in ein Block mit

if(iJahr != 0)

einschließen.

2. Wenn ich zum Beispiel 2004 eingebe, bringt er mir auch als Ergebnis "Dies ist kein Schaltjahr"....
So steht's auch in deinem Code: Ist das Jahr durch vier, aber nicht durch 100 teilbar, gibst du "kein Schaltjahr" aus.

Du hast übrigens eine do-while und eine while Schleife mit identischer Abbruchbedingung verschachtelt. Eine tut's auch. ;)

Geschrieben

Naja ein do-while ist hier schon inordnung, so wird es wenigstens einmal aufgerufen. ;)

Also so:


bool isLeapYear( int year )
{
if( year % 4 == 0 ) {
if( year >= 1582 ) {
if( !(year % 100 == 0)
|| (year % 400 == 0)) {
return true;
}
}
}
return false;
}

// main

do {
// Ausgabe Sachen mit cout
int year;
std::cin >> year;
isLeapYear(year) ? std::cout << "Schaltjahr\n" : std::cout << "kein Schaltjahr\n"
} while( year != 0 )
[/PHP]

Was ich aber noch machen würde, ist das verhindern ungültiger/falscher Eingaben, was z.B. passiert, wenn ich eine string eingeben und keine Zahl?

Geschrieben

Hi @ALL;

ich mein Problem mit Eurer Hilfe gelöst.

So und hier die Lösung: :)


//---------------------------------------------------------------------------

#pragma hdrstop
#pragma argsused
#include <iostream.h>
#include <conio.h>

//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
//Variablendeklaration und -initialisierung
int iJahr = 1;

//Wiederhole solange iJahre nicht gleich 0
while(iJahr != 0)
{
//Eingabe des Jahres
cout << "Bitte geben Sie das Jahr zur Ueberpruefung ein: " << endl;
cout << "Programmende mit 0" << endl;
cout << endl;
cout << "Jahr: ";
cin >> iJahr;

if(iJahr == 0)
{
break;
}
else
{
if(iJahr % 4 == 0)
{
if(iJahr % 100 == 0)
{
if(((iJahr % 400) == 0) && (iJahr >= 1600))
{
cout << "Dies ist ein Schaltjahr" << endl;
getch();
}
else
{
cout << "Dies ist kein Schaltjahr" << endl;
getch();
}
}
else
{
cout << "Dies ist ein Schaltjahr" << endl;
getch();
}
}
else
{
cout << "Dies ist kein Schaltjahr" << endl;
getch();
}
//Bildschirminhalt löschen
clrscr();
}
}

getch();
return 0;
}
//---------------------------------------------------------------------------
[/PHP]

thx kaffeemacher

Geschrieben
Original geschrieben von Kaffeemacher

Normalerweise müsste die Schleife doch abbrechen, wenn iJahre=0, oder???

while( iJahre ==0 )

{

Bedingung

}

Wieso passiert das nicht????

Diese Schleife läuft solange iJahre gleich 0 ist. Erst wenn iJahre ungleich 0 ist, bricht

die Schleife ab.

Gruß

Guybrush

Geschrieben
Original geschrieben von Kaffeemacher

Und zwar:

Normalerweise müsste die Schleife doch abbrechen, wenn iJahre=0, oder???

while( iJahre ==0 )

{

Bedingung

}

Wieso passiert das nicht????

Was meinst du und was hast du geschrieben? - Denn oben in deinem Quelltext steht "while(iJahre!=0)", also so wie es richtig ist und deine Frage ist anders rum.;)

Ich würde die Schaltjahre Funktionalität in eine Funktion packen ist lesbarer und man kann mal schnell umbauen! :cool:

Frage (hatte ich schonmal gestellt): Was passiert, wenn ich "a" eingebe?

Geschrieben
Original geschrieben von Kaffeemacher

Hi,

hab allerdings noch eine Frage:

:)

Und zwar:

Normalerweise müsste die Schleife doch abbrechen, wenn iJahre=0, oder???

while( iJahre ==0 )

{

Bedingung

}

Wieso passiert das nicht????

Danke für EURE Bemühungen


if(iJahr == 0)
{
return 0;
}
[/PHP]

Geschrieben

Hi

Und zwar hab ich folgendes gemeint:

Z.B:

int iJahre = 1;

while ( iJahre != 0 )

{

cout << "Bitte Jahr eingeben:" << endl;

cin>> iJahre

if ( iJahre % 4 = 0 )

{

cout << "Es ist ein Schaltjahr";

}

}

Wenn man nun bei der EINGABE => 0 eingibt, sollte er doch

eigentlich die Schleife beenden, oder ???

Wieso muss ich also erst irgendwo in die WHILE-Schleife folgendes einbauen, damit er die Schleife beendet?`???

if (iJahre == 0)

{

break;

}

thx kaffeemacher

Geschrieben

Die Schleife wird beendet, auch wenn du das break nicht machst. Allerdings erst dann, wenn der Schleifenkörper abgearbeitet wurde, weil erst dann die Schleifenbedingung wieder geprüft wird. Eine while-Schleife ist keine Laufzeitüberwachung der Schleifenvariable. Die Schleife wird nicht verlassen, nur weil iJahre irgendwo im Schleifenkörper den Wert Null annimmt.

Das sieht so aus:

1. Prüfung: wenn iJahre == 0, dann raus

2. cout <<

3. cin >>

4. if( ... )

5. zurück nach 1.

Du siehst, nach dem cin >> kommt immer erst der Rest des Körpers. Den willst du aber nicht ausführen lassen, wenn 0 eingegeben wurde. Da du hier break verwendest, könntest du die Schleifenbedingung auch ganz weglassen, indem du

while( true )

schreibst.

Oder - wie bereits gesagt - du schließt die ganze Prüfung und Ausgabe nach dem cin >> in ein

if( iJahre != 0 )

{

// Hier Prüfung und Ausgabe

}

ein.

Geschrieben

Mal ne etwas andere Frage zu deinem Code:

Ich dachte es wäre generell jedes Jahr ein Schaltjahr, welches durch 4 teilbar ist.

Du prüfst aber trotzdem noch ab, ob sie zusätzlich durch 100 und 400 teilbar sind.

Demnäch wäre eben 2004 kein Schaltjahr.

Und warum >1600?? Gibts erst seit 1600 Schaltjahre??

Geschrieben
Original geschrieben von 007ski

einfach

int iJahr = 0;

und

while(iJahr != 0)

aus dem spiel lassen ;)

Mit dieser Initialisierung wirst du nie in die while-Schleife kommen. Und zur Auflösung - wenn er in der while-Schlefie ist und ich gebe dann einen Buchstaben ein - hat er eine perfekte Endlosschleife. :D

Original geschrieben von FinalFantasy

Mal ne etwas andere Frage zu deinem Code:

Ich dachte es wäre generell jedes Jahr ein Schaltjahr, welches durch 4 teilbar ist.

Du prüfst aber trotzdem noch ab, ob sie zusätzlich durch 100 und 400 teilbar sind.

Demnäch wäre eben 2004 kein Schaltjahr.

Und warum >1600?? Gibts erst seit 1600 Schaltjahre??

Nicht ganz, nicht jedes Jahr was durch 4 teilbar, sondern jedes Jahr was durch 4 teilbar ist, nicht durch 100 teilbar, aber durch 400 und vor 1583 spielt!

Und korrekterweise musst man nicht 1600 nehmen, sondern 1582. Warum? - Habe ich vergessen, aber da gab es noch keins? - Aber so einfach war die Antwort glaube ich nicht.

Geschrieben

Sorry für Doppelpost, aber selbst wenn man im editieren ist werden die 15 Minuten gezählt?

Nicht ganz, nicht jedes Jahr was durch 4 teilbar, sondern jedes Jahr was durch 4 teilbar ist, nicht durch 100 teilbar, aber durch 400 und vor 1583 spielt! Weil, die Erde umkreist die Sonne in 365 Tage, 6 Minuten und ein paar Sekunden im Jahr - also nicht genau 365 Tage und wegen diesen Minuten musst man ncoh die anderen Sachen abfragen!

Und korrekterweise musst man nicht 1600 nehmen, sondern 1582. Warum? - Hmm, ich glaube dass hat mit Cesar zu tun. Ich weiß aber nicht merh was genau.

Könnte ein admin vielleicht den Teil von oben gegen diesen ersetzen?

Geschrieben

Nene, irgendwas kann da nicht stimmen. :D

Wenn das Jahr "nur 6,5min" länger als 365 Tage sein sollte, dann würde man mit diesen 6,5min nur alle 221Jahre einen Tag mehr pro Jahr voll bringen.

Mit deiner Formel hat man aber trotzdem annähernd alle 4 Jahre ein Schaltjahr.

Dafür müsste aber ein Jahr dann 365Tage und 6 Stunden dauern. Dann würden sich aber alle zwei Jahre Tag und Nacht umkehren.

Hm, ich glaub ich hab da irgendwo einen Denkfehler drin.

Geschrieben

MEINE FRAGE !!!!!!!!

Mein Programm funkt. OK.

Ich wollte nur wissen warum die Schleife nicht abgebrochen wird, obwohl ich doch gesagt habe dass die Schleife so lange durchlaufen soll bis iJahre nicht gleich 0. Gibt jemand also dann NULL ein sollte die Schleife doch abgebrochen werden.

Dass passiert aber erst wenn ich folgendes in die Schleife einfüge:

if ( iJahre == 0)

{

break;

}

thx kaffeemacher

Geschrieben
Original geschrieben von Kaffeemacher

Ich wollte nur wissen warum die Schleife nicht abgebrochen wird, obwohl ich doch gesagt habe dass die Schleife so lange durchlaufen soll bis iJahre nicht gleich 0. Gibt jemand also dann NULL ein sollte die Schleife doch abgebrochen werden.

Bitte nicht in diesen Zusammenhang "NULL" verwenden, dass ist was anderes.

Hmm, hatte mal bei mir schnell folgendes eingegeben und bei bricht das Programm bzw. die Schleife ab.


int y = 0;
do {
std::cin >> y;
std::cout << y << std::endl;
} while( y != 0);
std::cout << "ENDE!";
[/PHP]

Er bricht sofort die Schleife ab, wenn die Zahl eingeben wurde. Wo sind jetzt die genaue Frage? ;)

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...