Anfängerfrage: Ermittlung der Teiler einen positiven Ganzzahl



  • Hallo zusammen,

    vorweg: Ich bin Anfänger und beschäftige mich erst seit 2 Wochen mit c++, deswegen bitte ich um Verständnis für zu einfache Fragen 😃

    Folgendes Problem: Aufgabenstellung

    Erstellen Sie ein Programm mit dem Namen aufgabe4-2.cpp. Dieses Programm soll
    entscheiden, ob eine eingegebene positive Ganzzahl (int) teilbar durch die Teiler 2 bis 10 ist.
    Stellen Sie sicher, dass die Zahl positiv ist! Gehen Sie dabei wie folgt vor:
    i. Erstellen Sie eine Funktion, welche die Zahl und den Teiler als Parameter erwartet.
    Ist die Zahl teilbar, soll der Wert true, andernfalls der Wert false zurückgegeben
    werden. Nutzen Sie die Modulo-Funktion (%)
    ii. Im Hauptprogramm soll der Rückgabewert ausgewertet werden und eine
    entsprechende Ausgabe auf dem Bildschirm erfolgen
    Beispielausgabe:
    Eingegebene Zahl: 14
    14 ist teilbar durch 2
    14 ist nicht teilbar durch 3

    So, und hier meine "Lösung" ( die natürlich nicht funzt):

    #include <iostream>
    using namespace std;
    
    int eingabe; //Globale Deklaration der Variablen eingabe und a
    int a;
    
    int rechnung(int eingabe, int a) // Deklaration und Definition der Unterfunktion rechnung
    {
        while (a<=10)
              {
                 if ((eingabe%a)==0) 
                    {
                    return true;
                    }
                 else if ((eingabe%a)!=0)
                    {
                    return false;
                    }
               }
    }
    
    int main()        //Hauptprogramm
    { 
      cout << "-----> Dieses Programm berechnet die Teiler einer positiven, ganzen Zahl <-----" << endl;
      cout << "Bitte eine positive, ganze Zahl eingeben!" << endl;
      cin >> eingabe;
      if (eingabe<=0)
         {
           cout << "Diese Eingabe ist ungueltig! Bitte Programm neu starten!" << endl;
           return 0;
          }
    rechnung(eingabe, a=1);
    if (rechnung(eingabe,a)==true) 
             {
              cout << eingabe << " ist teilbar durch " << a << endl;
              a=a++;
              rechnung(eingabe,a);
             }         
    else if (rechnung(eingabe,a)==false)
             {
             cout << eingabe << " ist nicht teilbar durch " << a << endl;
             a=a++;
             rechnung(eingabe,a);
             }    
    }
    

    Zuerst sei gesagt, ich verstehe das mit dem Rückgabewert nicht ganz.

    Ist der Rückgabewert eine Variable vom Typ bool mit dem Wert "true" bzw. "false" oder wird das true so zurückgegeben wie ich mir das da oben mit "return true;" gedacht habe?

    Ich habe keine Ahnung wie ich der Variable a den Startwert 2 (soll die Teiler von 2-10 testen) so zuweise, daß sie auch inkrementiert werden kann.
    Wie inkrementiere ich a, daß das auch übernommen wird?

    Leider berechnet das Programm nur ob die Zahl durch 1 teilbar ist, anstatt wie von mir gewünscht im Hauptprogramm den Rückgabewert true oder false zu interpretieren, eine entsprechende Meldung auszugeben und die funktion rechnung dann erneut aufzurufen bis a dann gleich 10 ist.

    Danke für Eure Antworten

    MfG



  • blind.io schrieb:

    Ist der Rückgabewert eine Variable vom Typ bool mit dem Wert "true" bzw. "false" oder wird das true so zurückgegeben wie ich mir das da oben mit "return true;" gedacht habe?

    Was hast du dir denn dabei gedacht? So wie's jetzt ausschaut wird das true bzw. false (was vom Typ bool ist) in ein int umgewandelt. false ist dann 0 und true irgendwas ungleich 0, meistens 1. Lass die Funktion ein bool zurückgeben, das ist sinnvoller.

    blind.io schrieb:

    Ich habe keine Ahnung wie ich der Variable a den Startwert 2 (soll die Teiler von 2-10 testen) so zuweise, daß sie auch inkrementiert werden kann.
    Wie inkrementiere ich a, daß das auch übernommen wird?

    a=a++;
    

    Mal darüber nachgedacht, was das macht? Kleiner Tip: Es gibt einen wichtigen Unterschied zwischen Prä- und Postinkrement.
    Ersetz die Zeile erstmal durch a++ oder ++a, dann funktionierts schonmal. Aber nachdenken solltest du trotzdem 😉



  • #include <iostream>
    
    bool is_valid(const unsigned short, const unsigned short);
    
    int main()
    {
    	std::cout << "=> Positive Teiler V0.1 Beta <=" << std::endl;
    	unsigned int number = 0;
    	do {
    		std::cout << "Zahl: " << std::endl;
    	} while (!(std::cin >> number) || number == 0);
    
    	for (unsigned short i = 1; i <= 10; ++i)
    		std::cout << number << " ist " << (is_valid(number, i) ? "nicht " : "") << "durch " << i << " teilbar." << std::endl;
    }
    
    bool is_valid(const unsigned short value, const unsigned short step)
    {
    	return (value % step == 0);
    }
    

    ... guck es dir an ... wenn de was nicht verstehst sag bescheid.



  • Hier das funzt jetzt:

    #include <iostream>
    using namespace std;
    
    int eingabe; //Globale Deklaration der Variablen eingabe, a, b
    int a=2;
    bool b;
    
    int rechnung(int eingabe, int a, bool b) // Deklaration und Definition der Unterfunktion rechnung
    {
                 if ((eingabe%a)==0) 
                    {
                    return b=true;
                    }
                 else if ((eingabe%a)!=0)
                    {
                    return b=false;
                    }
    
    }
    
    int main()        //Hauptprogramm
    { 
      cout << "-----> Dieses Programm berechnet die Teiler einer positiven, ganzen Zahl <-----" << endl;
      cout << "Bitte eine positive, ganze Zahl eingeben!" << endl;
      cin >> eingabe;
      if (eingabe<=0)
         {
           cout << "Diese Eingabe ist ungueltig! Bitte Programm neu starten!" << endl;
           return 0;
          }
          else
          {
    while (a<=10)
    {
    rechnung(eingabe, a, b);
    if (rechnung(eingabe, a, b)==true) 
             {
              cout << eingabe << " ist teilbar durch " << a << endl;
              }         
    else if (rechnung(eingabe, a, b)==false)
             {
             cout << eingabe << " ist nicht teilbar durch " << a << endl;
             }
    a++;
    }
    
    }
    
    }
    

    Bei der if-else if Anweisung am Schluss:
    Frage ich da den Rückgabewert nur von b oder von der ganzen Funktion ab?

    MfG



  • 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