Primfaktorzerlegung in C mit Schnittstelle



  • 42**2 schrieb:

    Das mag sein, aber da kannst du mal sehen, was für Müll dein Lehrer fabriziert.Seine main-'Vorgaben' passen nicht zur Aufgabenstellung, der Mann hat keine Ahnung.

    Sorry, das halte ich für falsch. Es sollte mittels static-Variablen sehr wohl möglich sein sich den inneren Zustand der Funktion zwischen zwei Aufrufen zu merken. Imho passt die main().

    Und wie sollte das Ganze dann aussehen? Damit habe ich nämlich keine Ahnung 😞



  • Ich hab mittlerweile eine offensichtlich funktionierende Lösung erstellt, möchte diese aber nicht einfach so posten...

    Wie schon gesagt die Funktion muss sich zwischen den Aufrufen ihren inneren Zustand (=was war das n vom letzten Aufruf, wie weit ist dieses n schon zerlegt bzw. was ist noch davon übrig und wo steht i) merken. Das geht mit static. Sagt dir dieses Wort etwas? Wenn Nein dann nachgucken!

    Genauer gesagt:

    was war das n vom letzten Aufruf
    Wenn ich primfaktor(42); aufrufe dann ist das 42. Wenn ich danach primfaktor(11) schreibe ist das 11.

    wie weit ist dieses n schon zerlegt bzw. was ist noch davon übrig
    Beim ersten Aufruf mit Parameter 42 gibt die Funktion 2 zurück und von der 42 ist noch 42/2=21 übrig. Beim nächsten Aufruf kommt 3 zurück und es bleibt noch 21/3=7. usw...

    und wo steht i
    Sagen wir mal wir rufen die Funktion mit der Zahl 5*5*7=175 auf. Beim ersten Aufruf kommt 5 zurück und genau da bleibt n stehen, so dass beim nächsten Aufruf die zweite 5 zurück kommt. Dann geht es weiter bis zur sieben und da ist dann in diesem Fall auch Schluss. Man kann i auch wieder bei 3 anfangen lassen, dann dauert die Berechnung halt "länger" (auch wenn man das bei 42 oder 175 nicht merken dürfte).



  • KORREKTUR:

    Beim ersten Aufruf kommt 5 zurück und genau da bleibt i stehen,



  • static sagt mir was 😋



  • Nur Deppen benutzen (lokal) static.



  • Na dann los! Siehe was ich geschrieben hab.

    (Achso, static INNERHALB einer Funktion wohlgemerkt, das Wort hat zwei Bedeutungen je nachdem wo es steht. Ist dir bekannt?)



  • Nur Deppen benutzen (lokal) static.

    Wieso?



  • Das static soll ich dann quasi in die main-Funktion einbauen? 😕



  • Bumblebe3 schrieb:

    Das static soll ich dann quasi in die main-Funktion einbauen? 😕

    Natürlich nicht. primfaktor() muss sich seine inneren Zustände zwischen zwei Aufrufen merken.



  • Ja du hast recht 🙂 da war ich wieder zu schnell am Tippen!

    Gut ok, das ganze sollte ja dann irgendwie so aussehen:

    static int i = 1;

    oder?



  • Das ist schon mal kein schlechter Anfang!



  • Sind die statischen Variabeln zwingend notwendig? Weil so weit sind wir mit unserem Stoff noch gar nicht 😃



  • Also ohne statische Variablen wird das imho nix wenn man keine globalen Variablen (die in diesem Falle auch Murks wären) nutzen darf... Ich bin aber auch nur Anfänger, vielleicht irre ich mich?



  • Bumblebe3 schrieb:

    Sind die statischen Variabeln zwingend notwendig? Weil so weit sind wir mit unserem Stoff noch gar nicht 😃

    Der Aufgabenstellung nach, leider ja.

    Globale Variablen sind ja untersagt.



  • Es ginge auch rekursiv;
    aber wie gesagt, einerseits sollst du in der Funktion keine Ausgaben machen, andererseits willst du die Primfaktoren ja auch irgendwie dokumentieren, wo wenn nicht außerhalb?
    Dein Lehrer pfuscht.



  • Lass uns das Ganze trotzdem mal mit statischen Variabeln machen. Ansich steht nicht drin, dass ich sie nicht verwenden darf allerdings haben wir diese auch noch nicht behandelt!

    int primfaktor(int n)
    {
     static int i;
    }
    

    So oder bin ich komplett auf dem Holzweg?



  • So oder bin ich komplett auf dem Holzweg?

    Nö, passt schon daber das fehlt noch so Einiges. 😃
    (Es braucht mehr als eine static-Variable. Erst auf Papier den Algorithmus ausdenken und dann erst nach C übersetzen.)



  • Damit du was zum Probieren hast:

    int primfaktor(int n)
    {
     static int i= 0;
    
      i++;
    
      return i;
    }
    

    Und in main:

    printf ("%d\n" , primfaktor (1)); 
    printf ("%d\n" , primfaktor (1)); 
    printf ("%d\n" , primfaktor (1)); 
    printf ("%d\n" , primfaktor (1));
    


  • Schluss mit der Quälerei:

    int primfaktor (int zahl)
    {
        static int r = -1;
        static int z;
    
        if (r < 0)                      // Noch kein Zerlegungslauf gestartet
        {
            r = abs(zahl);
            z = zahl;
        }
    
        if (zahl != z)                  // Neue Zahl übergeben
        {
            r = abs(zahl);
            z = zahl;
        }
    
        if (abs(zahl) < 2)              // Ungültige Zahlen 0, 1, -1
        {
            return -2;
        }
    
        for (int i = 2; i <= r; ++i)    // Nächste kleinste Zahl ist gleichzeitig eine Primzahl
        {                               // (die anderen wurden bereits wegdividiert)
            if (r%i == 0)
            {
                r /= i;
                return i;
            }
        }
        r = -1;                         // Zerlegungslauf beendet
        return r;
    }
    

    Ich halte das auch nicht für die beste Aufgabe für static.

    viele grüße
    ralph

    EDIT: Man sollte die Aufgabe gründlich lesen 🙂



  • rkhb schrieb:

    Schluss mit der Quälerei:

    Fertige Lösungen postet ist keine gute Idee, das sollte sich mittlerweile eigentlich herumgesprochen haben...

    Und dein Code erfüllt das hier nicht

    Sobald sich der Wert der übergebenen Zahl n ändert beginnt die Funktion wieder von vorne mit der Primfaktorzerlegung.

    Aufruf nacheinander 42; 42; 15
    Ausgabe Soll: 2; 3; 3
    Ausgabe Ist: 2; 3; 7


Anmelden zum Antworten