myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   Hilfe bei Funktionen in C mit Primfaktorzerlegung (https://mygully.com/showthread.php?t=3120518)

Fre4krider 06.12.13 16:17

Hilfe bei Funktionen in C mit Primfaktorzerlegung
 
Hi

ich soll eine Funktion schreiben welche vom Hauptprogramm aufgerufen wird und eine Primfaktorzerlegung durchfüht. Die Primfaktorzerlegung habe ich bereits geschrieben und funktioniert auch, jetzt muss ich das vorhandene Programm in meine Funktion einbauen.

ABER! so dass es unabhängig von der main funktioniert. D.h. die main() wird leer abgegeben.
Das Problem ist dass sich meine Funktion eine variable merken muss ohne globale Variable, da die Funktion nach jeder Primzahl wieder "neu startet".
Hab das versucht mit einem Zähler der beim ersten aufruf hochzählt, aber es stimmt troztdem hinten und vorne nicht =( Ich hab hier mal mein Code:

Die int main ist durch den Prof zum testen vorgegeben
  • -1 wenn die letzte mögliche Primzahl errechnet wurde solange bis neue zahl eingegeben wird
  • -2 Im Fehlerffall (zahl<2)

Code:

#include <stdio.h>
#include <stdlib.h> //entfernen

int primfaktor(int);

int main()
{
    int pf ;
    while ((pf = primfaktor(12))>1)
          printf("%d\n", pf) ;
    while((pf = primfaktor(7))>1)
              printf("%d\n", pf) ;
              printf( "%d\n", primfaktor(1));
 
  system("PAUSE");        //entfernen
  return 0;
}





int primfaktor (int wert)
{  //int zahl=wert;
    int n;
    static int zahl;
while (n<1)
{
  zahl=wert;
}
 
 
  int erg, t, x;
 
  if (zahl<2)
  {
  return -2;
  }
  else
  {
      t=2;
      erg=zahl;

      while (zahl>t)
      {
            x=erg%t;
            while (x==0)
            {
                  erg=erg/t;
                  x=erg%t;   
                  return t;
                   
            }
            while (x>0)
            {
                  t=t+1;
                  x=erg%t;
                  if (t==zahl)
                  {
                        x=0;
                  }
            }
      }
     
         
  }
  return -1;    //test falls Funktion mal durchläuft
         
}

So kommt nur -2 raus, aber eigentlich sollte return t; doch einen Teiler ausgeben!?!?
Hoffe mir kann jemand helfen

ZarrocZuckz 06.12.13 18:19

Also so wie die funkton schon anfängt kann es nie funktionieren:

Code:

    int n;
    static int zahl;

while (n<1)
{
  zahl=wert;
}

n wurde nicht initialisiert also dürfte das programm überhaupt nicht kompiliert werden. was hat eine zuweisung denn überhaupt in einer while-schleife zu suchen?
Falls n mit 0 initialisiert wird hast du da ne endlosschleife

Matze500 06.12.13 22:18

Zitat:

n wurde nicht initialisiert also dürfte das programm überhaupt nicht kompiliert werden.
natürllich wir kompiliert ist kein "Fehler" an sich jedoch kann irgendetwas in n stehen.

[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

Die rot makierte stelle ist sehr wichtig in C da man Variablen initilisieren muss, sonst kann dort irgendetwas drin stehen und somit wird deine while schleife nicht einmal ausgeführt.
In deinem Fall könnte n z.B 3568422 sein sieht man vorallem gut wenn man in Eclipse /VS den Debugger benutzt. Und nur als Tipp der Debugger ist dein bester Freund beim Programmieren!!!

Die restlichen Farben sind Anmerkungen.

Code:

#include <stdio.h>
#include <stdlib.h> //entfernen

int primfaktor(int);

int main()
{
    int pf ;
    while ((pf = primfaktor(12))>1)
          printf("%d\n", pf) ;
    while((pf = primfaktor(7))>1)
              printf("%d\n", pf) ;
              printf( "%d\n", primfaktor(1));
 
  system("PAUSE");        //entfernen
  return 0;
}





int primfaktor (int wert)
{
    int n = 0; //wichtig sonst kann irgendetwas darin stehen in C!!!
    int zahl; // static braucht man eigentlich nicht
while (n<1) //while Schleife bis jetzt auch noch unsinnig da du nichts mit n machst bring auch nur was bei arrays also int primfaktor(int *werte)
{
  zahl=wert;
}
 
 
  int erg, t, x;
 
  if (zahl<2)
  {
  return -2;
  }
  else
  {
      t=2;
      erg=zahl;

      while (zahl>t)
      {
            x=erg%t;
            while (x==0)
            {
                  erg=erg/t;
                  x=erg%t;   
                  return t;
                   
            }
            while (x>0)
            {
                  t=t+1; //kann man auch so schreiben t+=1; oder t++;(Inkrementation um 1)
                  x=erg%t;
                  if (t==zahl)
                  {
                        x=0;
                  }
            }
      }
     
         
  }
  return -1;    //test falls Funktion mal durchläuft
         
}


ZarrocZuckz 06.12.13 22:40

Zitat:

Zitat von Matze500 (Beitrag 25104340)
natürllich wir kompiliert ist kein "Fehler" an sich jedoch kann irgendetwas in n stehen.

VS kompiliert es bei mir nicht, falls es doch kompiliert wird hast du natürlich recht und die while schleife wird in 99,9% der fälle niemals ausgeführt

Fre4krider 07.12.13 13:03

sorry ihr habt recht, das n war ein überbleibsel von einem vorherigem test mit einem zähler.
die while hab ich auch nur als Test, sinvoller wär ein if. Etwas durcheinander der Code hätte ihn vorher nochmal schön machen sollen
Hier nochmal der Code etwas schöner und leicht verändert: Alles Hinter // ist das entscheidennde


Ich suche nach einer Lösung um zahl nur einmal den Wert aus "wert" zuzuweisen.
Wenn ich n=0 mache wird n jedes mal beim aufrufen der Funktion 0, und dann funktioniert meine Funktion ja nicht richtig oder?

// Ok bei static wird immer mit 0 inizialisiert also ist beim ersten aufruf zahl=0, beim 2ten 6 (sollte zumindest), es kommt aber dauerschleife 2 raus !!!!! WARUM!?!?

Matze500 07.12.13 16:25

Zitat:

es kommt aber dauerschleife 2 raus !!!!! WARUM!?!?
Da du die Funktion immer mit dem selben wert aufrufst und der erste teiler von 12 die 2 ist.

Hier eine rekursive Lösung von mir die läuft wenn ihr math.h verwenden dürft. Dann muss man keine global variable nutzen. iterativ sieht das dann schon wieder anders aus da ist das wesentlich komplizierter.

Code:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int primfaktor(int);

int main()
{
int pf ;
pf = primfaktor(12); //Ausgabe 3*2*2 ist richtig
printf("%d\n", pf);
pf = primfaktor(7); //Ausgabe 7 ist auch richtig
printf("%d\n", pf);

system("PAUSE");
return 0;
}


int primfaktor (int zahl)
{

        if ((zahl==0) || (zahl==1))
        {
                printf("Werteingabe unzulaessig, da x nicht 0 oder 1 sein darf.");
                return -1;
        }

        int teiler=2;
     
        int x = sqrt((double)zahl);
     
    while (zahl%teiler!=0)
      {
          if (teiler>=x)
            {
                        return zahl;
            }
          else
            {
                        teiler++;
            }
      }

        printf("%d*",primfaktor(zahl/2));

    return teiler;
}


Fre4krider 08.12.13 13:10

wow cool danke auch gleich ein neuer algorithmus für die primzahlen.
ich weis nicht ob math.h erlaubt ist da der Compiler vom Prof etwas zickig ist.
Ich habe seit grade auch eine funktionierende Lösung (wenn auch deutlich komplizierter)
Aber viele Dank =)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:29 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.