# Will ja nicht nerven ;-(



## DunklerEngel (10. Juli 2004)

Nachdem ich alle meinen Übungen gut nachvollziehen konnte, erreicht mich jetzt ein Problem, wo ich wirklich das Gefühl habe, dass ich ohne Tips nicht vorankomme und wahrscheinlich die Fehler nur noch zunehmen.

Sinn der Aufgabe habe ich verstanden. Ich bin der Ansicht, es geht hier darum, das Wahrheits-Falschheits-Prinzip, logische Operatoren (wie logisches und usw.) und gleichzeitig if-else-Verzweigungen und Modulo abzufragen.
Das ist sehr viel auf einmal,....die Aufgabenstellung ist so konfus, dass ich hier mit einem Notizzettel sitze und versuche, das ganze grafisch darzustellen.

Hat jemand heute vielleicht die Zeit und vor allen Dingen auch die Lust, mit mir gemeinsam diese Aufgabe zu lösen? *verzweifelt*bin.

Aufgabe:
Schreiben Sie ein Programm,  das eine Jahreszahl über die Tastatur abfragt, und dann ausgibt, ob das Jahr ein Schaltjahr ist. Ein Jahr ist kein Schaltjahr, wenn die Jahreszahl nicht durch 4 teilbar ist. Ein Jahr ist ein Schaltjahr, wenn die Jahreszahl durch 4 aber nicht durch 100 teilbar ist. Es ist ebenfalls ein Schaltjahr, wenn die Jahreszahl durch 4, durch 100 und durch 400 teilbar ist.

Benutzen Sie zur Überprüfung der Teilbarkeit den modulo-Operator % und 3 if-else-Verzweigungen. Zur Erinnerung: wenn eine Zahl x nicht durch y teilbar ist, dann liefert der Ausdruck (x % y) einen Wert grösser als 0 und ist WAHR.

Benutzen Sie eine Integer-Variable ergebnis, der Sie eine 1 zuweisen, wenn das Jahr ein Schaltjahr ist, oder eine 0, falls nicht.

Implementieren Sie die Ausgabe in einer zweiten if-else-Verzweigung, die abhängig vom Wert der Variable ergebnis ausgibt, ob das Jahr ein Schaltjahr war, oder nicht.
_____
 ich denke, jetzt wisst ihr, warum ich nicht mehr klarkomme. Ich weiss wohl, was verlangt wird, habe auch schon einen Anfang gemacht, aber weiss z. B. nicht, wie ich einzelne Variablen zuweisen soll, um sie hinterher einfach nur einzusetzen.
Hat jemand von Euch für mich Zeit? 

Liebe Grüsse
Anja


----------



## Dario Linsky (10. Juli 2004)

```
int istSchaltjahr = 0;
if(jahr % 4 == 0) {
  if(jahr % 100 == 0) {
    if(jahr % 400 == 0) {
      istSchaltjahr = 1;
    }
    else {
      istSchaltjahr = 0;
    }
  }
  else {
    istSchaltjahr = 1;
  }
}
else {
  istSchaltjahr = 0;
}

if(istSchaltjahr == 1) {
  std::cout << jahr << " ist ein Schaltjahr" << std::endl;
}
else {
  std::cout << jahr << " ist kein Schaltjahr" << std::endl;
}
```

PS: Das ist wohl die Standardaufgabe an Berufsschulen, oder?


----------



## drvj (10. Juli 2004)

Hallo,

lässt sich so realisieren: ( eventuelle Fehler nicht ausgeschlossen )


```
#include <iostream>
#include <stdlib.h>

using namespace std;

int main(int argc, char *argv[])
{
  
  int jahreszahl,schaltjahr;
  
  schaltjahr = 0;
  cout << "Bitte Jahreszahl eingeben:" << endl;
  cin >> jahreszahl;
  
  if ( jahreszahl % 4 == 0 )
  {
    schaltjahr = 1;
    if ( jahreszahl % 100 == 0 )
    {
        schaltjahr = 0;
        if ( jahreszahl % 400 == 0 )
        {
            schaltjahr = 1;
        }
    }
  }	
  
  if ( schaltjahr ) cout << "Schaltjahr: Ja" << endl;
  else cout << "Schaltjahr: Nein" << endl;

  return 0;
}
```

mfg Jens


----------



## DunklerEngel (10. Juli 2004)

Hmmh, also ich mache einen Fernlehrgang....bin 31 und habe bereits meinen Hauptberuf. Da ich zuvor ausser ein wenig html nicht viel programmiert habe, fällt es mir natürlich dementsprechend schwerer, als wie Dir z. B. ;-)

Wäre schön, wenn ich noch auf einer Berufsschule wäre , dann wäre ich ja auch noch jünger.

aber was heisst std Ich darf nur Ausdrücke benutzen, die bereits in dem aktuell vorliegenden Studienheft vorkommen...

Aber danke für Deine Hilfe

____
upss, da hat zeitgleich noch jemand einen Tip gegeben.

Dieser Ausdruck: #include <stdlib.h>
den kenne ich nicht....und den darf ich sicherlich nicht verwenden.
Kannst Du mir diesen Ausdruck erklären?


----------



## Dario Linsky (10. Juli 2004)

> aber was heisst std Ich darf nur Ausdrücke benutzen, die bereits in dem aktuell vorliegenden Studienheft vorkommen...


Das ist der Namensraum, in dem unter anderem die Eingabe- und Ausgabe-Objekte (cout und cin) liegen. Den musst du angeben, wenn du irgendetwas auf die Konsole ausgeben willst.


----------



## DunklerEngel (10. Juli 2004)

Ich gebe auf die Konsole immer mit <<cout<<endl;

aus....ist doch auch richtig, oder?
Aber ich sehe schon...hmmh...kann ich nicht std ganz weglassen?
Ich versuche jetzt erstmal mein Programm umzuschreiben.

Aller Anfang ist schwer  beneide Euch richtig um Eure Kenntnisse. Habe aber auch erst am 24.06. begonnen und bin jetzt bei dem 3. Studienheft. Ein Heft hat ca. um die 75 Seiten, und am Ende muss ich halt Aufgaben fertigen.
Oftmals sind die Aufgaben so konfus gestellt, dass man schnell etwas "wichtiges" überlesen kann.


----------



## Dario Linsky (10. Juli 2004)

> beneide Euch richtig um Eure Kenntnisse.


Um meine C++-Kenntnisse würde ich mich selbst nicht beneiden. 

Die Angabe von std musst aber immer irgendwie benutzen.
Du kannst den Namensraum komplett einbinden, und dann direkt auf cout, cin, endl, und so weiter zugreifen:

```
using namespace std;
```
Du kannst auch nur die Objekte aus dem Namensraum einbinden, die du brauchst, um auf diese Objekte zugreifen zu können:

```
using std::cout;
using std::endl;
```

Oder du lässt diese Einbindung ganz weg, musst dann aber den Namensraum davor schreiben:

```
std::cout << "Text" << std::endl;
```


----------



## DunklerEngel (10. Juli 2004)

So, jetzt habe ich mal versucht, nach dem ersten Tip in diesem Thread mein Programm so umzuschreiben mit den Werten usw., die mir bekannt sind. Aber es klappt leider nicht. Der Compiler gibt mir Fehlermeldungen:


```
#include <iostream.h>
int istschaltjahr = 0;
if(jahr % 4 == 0)   {
if(jahr % 100 == 0)   {
if(jahr % 400 == 0)   {
istSchaltjahr = 1;}
}
else {
istSchaltjahr = 0;
}
}
else {
istSchaltjahr = 1;
}
}
else {
istSchaltjahr = 0;
}
if(istSchaltjahr == 1)   {
cout<<"ist ein Schaltjahr"<<endl;
}
else {
cout<<"ist kein Schaltjahr"<<endl;
}




  char p[50];
  cin.getline (p,50);
  cin.getline (p,50);

}
```

Normalerweise arbeite ich vor dem char p[50] noch mit der Funktion void main()

Noch eine Frage: Wozu muss ich drei else-Verzweigungen schreiben, wenn dort (sorry, wenn ich so dumm frage), doch eh dasselbe steht else istschaltjahr = 0 und istschaltjahr = 1, wieso doppelt? *grübel*

______
nochmal edit: std hatte ich noch nicht gelernt, ich bin mir sicher, man wird sich fragen, wie ich darauf komme...gibt es nicht einen anderen weg, ganz ohne std? Ich verstehe schon, was Du meinst, aber muss ich nicht noch eine int_var ergebnis einfügen? Wie in der Aufgabenstellung verlangt? Also eine, die auch als solche bezeichnet wird?

Und warum beneidest Du dich nicht? Sei stolz drauf, ich habe massenhaft Kontakte im Internet, denkst Du, einer kann C++? Niemand , die programmieren nur ihre foren usw. mit php und haben bisher nichts anderes gemacht.


----------



## Dudadida (10. Juli 2004)

> _Original geschrieben von DunklerEngel _
> *Dieser Ausdruck: #include <stdlib.h>
> den kenne ich nicht....und den darf ich sicherlich nicht verwenden.
> Kannst Du mir diesen Ausdruck erklären? *



Du musst versuchen das Prinzip dahinter zu erkennen. Normalerweise kennt der Compiler nur einige wenige festgelegte Ausdrücke, mit der man fundamentale Logik- und Arithmetikaufgaben lösen kann, also if, for, while,... und Assembleranweisungen (mit _asm eingegeben). Alles andere muss über Funktionen bereitgestellt werden. Die werden entweder selbst geschrieben oder es werden bereits geschriebene im Programm verwendet. Da der Compiler aber die Definitionen dieser Funktionen zunächst nicht kennt, sagt man ihm, wo sie stehen. Das macht man mit #include. drvj hat einfach standardmäßig die Funktionen aus der Datei stdlib.h für den Compiler "bekannt gemacht", auch wenn keine Funktion daraus benutzt wurde (die #include-Anweisung macht prinzipiell einfach folgendes: sie sagt, füge die Datei, die ich dir in den eckigen Klammern angebe, an der Stelle ein, an der ich stehe).
Was den Namespace angeht, es gibt Funktionen die gehören zu einem bestimmten Namespace. Den muss man angeben, wenn man sie benutzen möchte. Dazu gehört cout auch. Deswegen muss man cout eigentlich entweder mit dem Namespace angeben, also std::cout oder man sagt dem Compiler, welchen Namespace man standardmäßig nimmt, das macht man mit using namespace.
Da du aber iostream.h (und nicht iostream) benutzt, brauchst du std nicht als namespace angeben (oder woran liegt's sonst, dass es trotzdem geht?).

Ach noch ein Tipp: Einrücken! Gewöhn dir einen EINHEITLICHEN Stil beim schreiben an. Auf jeden Fall nach jeder geschweiften Klammer die geöffnet wird um ein paar Bytes einrücken, nach jeder die geschlossen wird, wieder zurück (so wie in den Beispielposts hier).


----------



## Dario Linsky (10. Juli 2004)

Den von mir geposteten Code musst du natürlich auch noch in die main-Funktion einfügen, sonst bekommst du eben diese Compiler-Fehler. 



> Noch eine Frage: Wozu muss ich drei else-Verzweigungen schreiben, wenn dort (sorry, wenn ich so dumm frage), doch eh dasselbe steht else istschaltjahr = 0 und istschaltjahr = 1, wieso doppelt? *grübel*


Weil nur einer dieser Fälle eintreten wird. Grob übersetzt macht der Code ja auch nichts anderes als folgende Überlegung:

```
Wenn das Jahr durch 4 teilbar ist:
  Wenn das Jahr auch durch 100 teilbar ist:
    Wenn das Jahr auch durch 400 teilbar ist:
      Es ist ein Schaltjahr
    Sonst:
      Es ist kein Schaltjahr
  Sonst:
    Es ist ein Schaltjahr
Sonst:
  Es ist kein Schaltjahr
```
Das könnte man zwar noch abkürzen, aber darum geht's in deiner Aufgabe ja nicht. 



> nochmal edit: std hatte ich noch nicht gelernt, ich bin mir sicher, man wird sich fragen, wie ich darauf komme...gibt es nicht einen anderen weg, ganz ohne std?


Bei C++ musst du das verwenden, du kannst das mit C aber umgehen, indem du die Funktionen printf und scanf anstelle von cout und cin benutzt.



> aber muss ich nicht noch eine int_var ergebnis einfügen? Wie in der Aufgabenstellung verlangt? Also eine, die auch als solche bezeichnet wird?


Hast du doch, die Variable heißt "istSchaltjahr".


----------



## Dario Linsky (10. Juli 2004)

> Da du aber iostream.h (und nicht iostream) benutzt, brauchst du std nicht als namespace angeben (oder woran liegt's sonst, dass es trotzdem geht?).


Für C++ sollte man normalerweise Headerfiles ohne die Endung .h benutzen, also iostream statt iostream.h. Mein gcc kompiliert zwar beides und mit iostream.h funktioniert es auch ohne die Angabe des Namespaces, aber der Compiler bemängelt es trotzdem als deprecated.


----------



## alois (10. Juli 2004)

Das sieht mir nach einem verwöhnten Borland-User aus . Wir arbeiten in der Ausbildung auch nur mit Borland C++Builder 5, da gibt man die Headerdateien an und gut ist. Versucht man allerdings dann auf etwas weniger "kommerz-orientierteres" wie Dev-Cpp umzusteigen, hat man so seine liebe Not!

Ich schwafele, was ich sagen wollte ist folgendes: Versuch doch mal deinen Code etwas übersichtlicher zu gestalten, also nach jeder geschweiften Klammer z.B. einen Tabulatorsprung, das kann eine Menge bei der Übersichtlichkeit helfen.


----------



## DunklerEngel (10. Juli 2004)

> _Original geschrieben von alois _
> *Das sieht mir nach einem verwöhnten Borland-User aus . Wir arbeiten in der Ausbildung auch nur mit Borland C++Builder 5, da gibt man die Headerdateien an und gut ist. Versucht man allerdings dann auf etwas weniger "kommerz-orientierteres" wie Dev-Cpp umzusteigen, hat man so seine liebe Not!
> 
> Ich schwafele, was ich sagen wollte ist folgendes: Versuch doch mal deinen Code etwas übersichtlicher zu gestalten, also nach jeder geschweiften Klammer z.B. einen Tabulatorsprung, das kann eine Menge bei der Übersichtlichkeit helfen. *


Ja, genau, ich muss mit dem Borland C++ Builder arbeiten , die CD wurde mitgesandt.
Ja, ich weiss, ich habe bei meinem Testverfahren keine Einrückungen gemacht, mache es aber sonst eigentlich immer, aber danke dafür. Ist schon richtig, sonst verliert man schnell den Überblick.

So, gleich erstmal weiter versuchen, mein Programm zum Laufen zu bekommen


----------



## DunklerEngel (10. Juli 2004)

Fehlermeldung:
istschaltjahr wurde einem Wert zugewiesen, der nie verwendet wurde

Ich denke, ich mache einen kompletten main-Fehler!
#include <iostream.h>

void main()     {

int jahr;
cout<<"Bitte geben Sie eine Jahreszahl ein!"<<endl;
cin>>jahr;

int istschaltjahr = 0;
     if(jahr % 4 == 0)   {
        if(jahr % 100 == 0)   {
            if(jahr % 400 == 0)   {
istSchaltjahr = 1;

}
else {
istSchaltjahr = 0;
            }
                        }
else {
istSchaltjahr = 1;
           }
                        }
else {
istSchaltjahr = 0;
}
if(istSchaltjahr == 1)   {
std::cout<<jahr<<"ist ein Schaltjahr"<<std::endl;
}
else {

std::cout<<jahr<<"ist kein Schaltjahr"<<std::endl;
}

  char p[50];
  cin.getline (p,50);
  cin.getline (p,50);

}

Was mache ich nun wieder falsch?


----------



## Dario Linsky (10. Juli 2004)

C++ achtet sehr penibel auf Groß- und Kleinschreibung - noch penibler als wir. 
Die Variablen "istschaltjahr" und "istSchaltjahr" sind also zwei Verschiedene.

Aber die Meldung, die du gerade hier reinkopierst hast, ist soweit ich mich erinnern kann, kein Fehler, sondern nur eine Warnung.


----------



## DunklerEngel (10. Juli 2004)

*lol* ohne, dass ich Deine Antwort gelesen habe, habe ich es gesehen, dass ich das istschaltjahr einmal falsch geschrieben habe.
Ich glaube, ich sollte doch mal zum Augenarzt gehen *schäm*...hab soviele Stunden heute vor diesem Teil namens Rechner gesessen ;-)
Aber ich habe noch eine Neuigkeit.
Denn: Es geht ohne std...es geht, und es lässt sich übersetzen, und ich freue mich gerade so, hier mein Script präsentieren zu dürfen.
Habe für den Text noch penibel drauf geachtet, dass eine Leertaste nach dem Doppelpunkt kommt u. a.



#include <iostream.h>
void main() {

int jahr;
cout<<"Bitte geben Sie eine Jahreszahl ein: ";
cin>>jahr;

int istSchaltjahr = 0;
if(jahr % 4 == 0)   {
if(jahr % 100 == 0)   {
if(jahr % 400 == 0)   {
istSchaltjahr = 1;
}
else {
istSchaltjahr = 0;
}
}
else {
istSchaltjahr = 1;
}
}
else {
istSchaltjahr = 0;
}
if(istSchaltjahr == 1)   {
cout<<jahr<<" ist ein Schaltjahr."<<endl;
}
else {
cout<<jahr<<" ist kein Schaltjahr."<<endl;
}




  char p[50];
  cin.getline (p,50);
  cin.getline (p,50);

}


----------



## revelation (14. Juli 2004)

Sorry, Offtopic:

Man kann in HTML NICHT programmieren! Das, was eine Programmiersprache ausmacht, ist die Möglichkeit Algorithmen, also Problemlösungsstrategien, zu beschreiben. HTML kann das NICHT!
Es ist eine reine Beschreibungssprache eines statischen Dokumentes!


------------------------------------------------------
Tut mir leid, aber ich versuche schon seit langem gegen diese falsche Auffassung anzukämpfen.... 


Gruß
Johannes


----------



## alois (15. Juli 2004)

Schön dass wir das auch geklärt haben .

DunklerEngel, herzlichen Glückwunsch zum lauffähigen Programm.


----------

