Ergebnis überprüfen



  • Hi, hi

    ich wollte ausprobieren wie ich ein engegebenes Jahr überprüfen kann ob es ein Schaltjahr ist. Doch irgendwas funktioniert nicht 😕 :

    #include "stdafx.h"
    #include <iostream.h>
    
    double dJahr;
    double* pdJahr = &dJahr;
    
    int main(int argc, char* argv[])
    {
    	cout << "Geben Sie das Jahr ein, von dem Sie wissen moechten ob es ein Schaltjahr ist.\n";
    	cin >> *pdJahr;
    	if(*pdJahr % 400 == 0 && *pdJahr % 100 != 0 || *pdJahr % 400 == 0)
    	{
    		cout << "Das angegebene Jahr ist ein Schaltjahr." << endl;
    	}
    	else
    	{
    		cout << "Das angegebene Jahr ist kein Schaltjahr." << endl;
    	}
    	return 0;
    }
    


  • Warum einen Zeiger auf deinen double? Übergib doch gleich dJahr 😕

    Außerdem prüfst du zweimal auf %400==0 statt beim zweiten Mal auf %4==0

    MfG SideWinder



  • #include <iostream>
    #include <conio.h>
    using namespace std;
    
    template <typename T> void eingabe( T& x )
    {
       cout << "Input:  ";
       cin >> x;
    }
    
    template <typename T> void ausgabe ( const T x )
    {
       cout << "Output: ";
       cout << x;
    }
    
    int isSchaltjahr( int jahr ) 
    {
      return !(jahr%4) && jahr%100 || !(jahr%400);
    }
    
    int main()
    {
        int jahr;
        eingabe(jahr);
        ausgabe( isSchaltjahr(jahr) );
    
        getch();
    }
    


  • @ Erhard Henkes
    👍 Danke, werde den Code mal bei mir mit einbringen!

    @SideWinder
    Um in Variablen etwas zu speichern oder abzurufen benötige ich doch einen Zeiger?



  • @Erhard: Ob Templatefunktionen das richtige sind in diesem Fall?

    @FUNPAQ: Nein du brauchst keinen Zeiger um in einer Variablen etwas zu speichern, du verwechselst etwas:

    int x;
    x = 5; // Funktioniert
    
    // Du meinst das:
    void swap(int a,int b)
    {
        int tmp = b;
        b = a;
        a = tmp;
    }
    
    int x = 5,y=7;
    swap(x,y);
    cout << a << " " << b; // Wird weiterhin "5 7" ausgeben, Grund: Die Variablen werden kopiert und bloß die Kopien werden bearbeitet.
    
    // Operatoren sind in diesem Fall auch "Funktionen" allerdings gibt es in C++ die Möglichkeit Referenzen statt Zeiger zu benützen. Da op>> im Normalfall mit Referenzen arbeitet wird keine Kopie angelegt - bloß ein anderer Name für die übergebene Variable:
    
    int x;
    cin >> x; // Übernimmt x als Referenz (also auch call by reference), x wird direkt bearbeitet
    
    // Für das swap-Beispiel sieht die zeigerlose Variante so aus:
    void swap(int& a,int& b)
    {
        int tmp = b;
        b = a;
        a = tmp;
    }
    

    Sodala, hoffentlich passt alles ;).

    MfG SideWinder



  • SideWinder schrieb:

    @Erhard: Ob Templatefunktionen das richtige sind in diesem Fall?

    Zumal es eine Einsteigerfrage ist... Verwirrt nur unnötig.



  • Ja stimmt, exceptions und eigene namespaces fehlen noch. 😃



  • Hi, hi

    ich habe das ganze nun so gelöst:

    // Jahr.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    #include <iostream.h>
    
    int dJahr;
    
    int main(int argc, char* argv[])
    {
    	int i = 0;
    	while(i == 0)
    	{
    	  cout << "Geben Sie das Jahr ein, von dem Sie wissen moechten ob es ein Schaltjahr ist.\n(0) Um das Programm zu beenden\n";
    	  cin >> dJahr;
    	  if(dJahr == 0)
    	  {
    		  break;
    	  }
    	  else if(dJahr % 4 == 0 && dJahr % 100 != 0 || dJahr % 400 == 0)
    	  {
    		  cout << "Das angegebene Jahr ist ein Schaltjahr.\n" << endl;
    	  }
    	  else if(dJahr == 1)
    	  {
    		  break;
    	  }
    	  else
    	  {
    		  cout << "Das angegebene Jahr ist kein Schaltjahr.\n" << endl;
    	  }
    	}
    	return 0;
    }
    

    Eigentlich war nur der Zeiger im ersten Versuch Schuld am Fehler (Warum auch immer?). Zusätzlich habe ich noch eine Schleife hinzugefügt, weil ich sonst für jedes Jahr das Programm immer neu starten müsste.

    Nachdem ich gemerkt habe, dass ich mir dir Zeiger wohl nochmal anschauen sollte, habe ich mir ein Tutorial runtergeladen. Dort werden die Zeiger besser beschrieben als in meinem Buch :p . Jedoch ist mir aufgefallen, dass dort Zeiger so gesetzt werden:

    int *piZahl = &iZahl
    

    In meinem Buch aber:

    int* piZahl = &iZahl
    

    Ich habe das natürlich gleich ausprobiert. Beide Möglichkeiten haben funktioniert. Ist es also egal welche Möglichkeit man hernimmt 😕



  • Es ist vollkommen egal, nimm was dir besser gefällt (also eine Stilfrage). Du kannst (Betonung auf kannst - du darfst aber nicht ;)) auch soetwas machen:

    int           *                       pointer
    = 0;
    

    MfG SideWinder


Anmelden zum Antworten