Anfängerfrage: Ermittlung der Teiler einen positiven Ganzzahl



  • Jetzt mal ehrlich:

    (!(std::cin >> number) || number == 0);
    (is_valid(number, i) ? "nicht " : "")
    const unsigned short
    

    sowas ist nicht unbedingt für jemand verständlich
    der erst 2 Wochen programmiert!

    #include <iostream>
    using namespace std;
    
    bool teilbar(int zahl, int teiler) {
    
            if( zahl%teiler == 0 ) {        //Wenn Zahl durch teiler teilbar ist
                    return true;            //gebe true zurück
            } else {                        //Ansonsten
                    return false;           //gebe false zurück
            }
    
    }
    
    int main() {
    
            int zahl = 0;
    
            cout << "Teilerermittlungsprogramm" << endl;
    
            cout << "Bitte eine Zahl eingeben" << endl;
            cin >> zahl;                                 //zahl einlesen
    
            for(int i = 2; i <= 10; i++) {               //In einer Schleife überprüfen wir alle Zahlen von 2 bis 10... 
                    if(teilbar(zahl,i)) {                //...ob sie Teiler von zahl sind
    
                            cout << "Die Zahl " << zahl << " ist teilbar durch " << i << endl;
                    } else {
                            cout << "Die Zahl " << zahl << " ist nicht teilbar durch " << i << endl;
                    }
            }
    
            return 0;
    }
    

    So ich denke damit solltest du besser zurechtkommen.
    Schau mal ob du diesen code verstehst.



  • Also Devils Code da versteh ich gar nichts von 😉

    Xapeks ist verständlich, da sieht man mal wieviel unnötigen Code ich in meiner Lösung geschrieben habe.

    Aber ich arbeite noch dran und bin sehr lernwillig

    Vielen Dank für eure Antworten

    MfG



  • Ach ja, nur damit das nicht untergeht: Dein Fehler oben war, dass a++ und ++a schon selbst a = a + 1 darstellen, aber bei ersterem wird der alte wert zurückgeliefert. Du hast also quasi erst a um eins erhöht, es dann aber wieder mit seinem alten Wert überschrieben.



  • Storm.Xapek.de schrieb:

    bool teilbar(int zahl, int teiler) {
    
            if( zahl%teiler == 0 ) {        //Wenn Zahl durch teiler teilbar ist
                    return true;            //gebe true zurück
            } else {                        //Ansonsten
                    return false;           //gebe false zurück
            }
    
    }
    

    Sowas sollte man niemanden sehen lassen - gerade wenn er erst 2 Wochen programmiert, sonst gewöhnt er sich's noch an! :p

    bool teilbar(int zahl, int teiler)
    {
      return zahl % teiler == 0;
    }
    


  • Nochmal vielen Dank für Eure Antworten

    Geniales Forum, ihr werdet noch einiges von mir hören 😉

    MfG



  • Nja ich erklär auch mal meinen Ansatz ... basiert nat. auf deinem! Aber da du ihn ja nicht verstanden hast ^^ Mit Comments =>

    [cpp]#include <iostream>

    bool is_valid(const unsigned short, const unsigned short); // Deklaration

    int main()
    {
    std::cout << "=> Positive Teiler V0.1 Beta <=" << std::endl;
    unsigned int number = 0; // vom type unsigned int (unsigned, da positiv) mit default-value 0.
    do {
    std::cout << "Zahl: " << std::endl; // Ausgeben ...
    } while (!(std::cin >> number) || number == 0); ... solange die Eingabe falsch war bzw. number == 0 ist.

    for (unsigned short i = 1; i <= 10; ++i) // von 1 - 10 alle Zahlen (Teiler) durchgehen
    std::cout << number << " ist " << (is_valid(number, i) ? "nicht " : "") << "durch " << i << " teilbar." << std::endl; // und jeweils gucken ob teilbar ist und wenn teilbar dann kein "nicht" mit in den Stream packen ...
    }

    bool is_valid(const unsigned short value, const unsigned short step)
    {
    return (value % step == 0); // if (value % step == 0) return true; else return false; ... 😉
    }[/cpp]



  • Danke Devil!

    Hier mein heutiges Werk:

    Aufgabe 4-3 – Ermittlung des Jahrestages
    Schreiben Sie ein Programm (aufgabe4-3.cpp), das nach Eingabe von Jahr, Monat und
    Tag in einer Funktion berechnet, welcher Tag des Jahres vorliegt. Gehen Sie wie folgt vor:
    a. Lesen Sie im Hauptprogramm Jahr, Monat und Tag ein. Überprüfen Sie die Eingaben
    auf Sinn.
    b. Erstellen Sie eine Funktion, welche den Jahrestag berechnet. Nehmen Sie zuerst an,
    dass jeder Monat 31 Tage besitzt. Ziehen Sie dann für die kürzeren Monate die
    entsprechenden Tage wieder ab. Schaltjahre können anhand der Auswertung der
    Jahreszahl berücksichtigt werden. (Sollte die Schaltjahresregel nicht klar sein, einfach
    im Internet nachforschen 􀃆 Wikipedia ist hierbei sehr behilflich).

    So, jetzt habe ich ein noch relativ "grobes" Programm geschrieben, um zu zählen der wievielte Tag eines Jahres vorliegt.

    Ist aber noch nicht besonders elegant, da die Eingaben zB erst nachdem alle Eingaben drin sind geprüft werden. Außerdem benutze ich gerade noch vereinfachte Monate a 31 Tage, was ja eigentlich nicht stimmt. Und die Schaltjahrregel ist ebenfalls noch nicht drin. Und er kann nur von 1950 bis 2100 berechnen.

    Zu der Schaltjahrregel hätte ich direkt noch eine Frage: Das Programm muss ja ein Ausgangsjahr kennen, ab dem alle 4 Jahre ein weiteres Schaltjahr folgt. Wie setze ich so einen Orientierungspunkt? (hört sich wahrscheinlich ziemlich doof an die Frage :))

    #include <iostream>
    using namespace std;
    
    int jahr;
    int monat;
    int tag;
    int ergebnis;
    
    int jahrestag (int jahr, int monat, int tag);
    
    int main()        
    {
    cout << "Dieses Programm berechnet den Jahrestag nach Eingabe des Datums!" << endl;
    cout << "Bitte Jahr eingeben!" << endl;
    cin >> jahr;
    cout << "Bitte Monat eingeben!" << endl;
    cin >> monat;
    cout << "Bitte Tag eingeben!" << endl;
    cin >> tag;
    
    if ((tag>31) || (tag<=0) || (monat>12) || (monat<=0) || (jahr<1950) || (jahr>2100))
    {
    	cout << "Diese Eingabe war ungültig! Bitte Programm neu starten!" << endl;
    	return 0;
    }
    else 
    {
    ergebnis= jahrestag(jahr, monat, tag);
    }
    
    cout << "Dieses Datum ist der " << ergebnis << "-te Tag des Jahres " << jahr << endl;
    }
    
    int jahrestag (int jahr, int monat, int tag)
    {
    	return (tag+(monat-1)*31);
    
    }
    

    MfG



  • Für ein Schaltjahr gibt es folgende Regel:
    Ein Jahr ist ein Schaltjahr, wenn die Jahreszahl durch 400 teilbar ist, oder durch 4 aber nicht durch 100.

    EDIT: hier hatte ich schon die entsprechende Funktion hingeschrieben, aber ich denke du solltest sie zu Übungszwecken selbst screiben.

    Für den Monat gibt es wohl verschiedene Lösungswege. Ein einfacher wäre in einem int monate[12] geordnet die Tage der entsprechenden Monate einzutragen. mit monate[monat-1] erhälst du dann die Tage des entsprechenden Monats.

    Irgendwo hatten wir dieselbe Aufgabenstellung vor kurzem hier im Forum, vllt findest du den Thread ja wieder. (ich weisz nicht mehr wie der ausgegangen war)

    Achja: hau mal die globalen Variablen da weg in die main.

    Und dass er nur von 1950 bis 2100 rechnen kann ist ja definitiv deine eigene Schuld, lass doch einfach die Überprüfung bez. des Jahres in der If-Schleife weg.



  • Shinja schrieb:

    Für ein Schaltjahr gibt es folgende Regel:
    Ein Jahr ist ein Schaltjahr, wenn die Jahreszahl durch 400 teilbar ist, oder durch 4 aber nicht durch 100.

    Aaah!

    Shinja schrieb:

    EDIT: hier hatte ich schon die entsprechende Funktion hingeschrieben, aber ich denke du solltest sie zu Übungszwecken selbst schreiben.

    Das denke ich auch. Wenn man sich selbst durchbeisst, dann hat man es irgendwann auch wirklich verstanden.

    Shinja schrieb:

    Für den Monat gibt es wohl verschiedene Lösungswege. Ein einfacher wäre in einem int monate[12] geordnet die Tage der entsprechenden Monate einzutragen. mit monate[monat-1] erhälst du dann die Tage des entsprechenden Monats.

    Ist int monate[12] ein Feld? Felder kommen erst in zwei Wochen, ich vermute bis dahin sollen wir alles ohne Felder schreiben.

    Shinja schrieb:

    Achja: hau mal die globalen Variablen da weg in die main.

    Warum? Ist das schlechter Stil, Variablen global einzuführen wenn man sie nur in einem Teil des Programms braucht? Kostet das Leistung? Weil funktionieren tut es ja.

    MfG



  • bool Schaltjahr = ((jahr % 4 == 0 && jahr % 100 != 0)  || jahr % 400 == 0);
    

    ... steht doch auf der Seite ... wo isn da noch ein Problem?


Anmelden zum Antworten