myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

Hilfe bei Funktionen in C mit Primfaktorzerlegung

Willkommen

myGully

Links

Forum

 
Antwort
Themen-Optionen Ansicht
Ungelesen 06.12.13, 16:17   #1
Fre4krider
Fragger
 
Benutzerbild von Fre4krider
 
Registriert seit: Nov 2010
Ort: BW
Beiträge: 48
Bedankt: 11
Fre4krider ist noch neu hier! | 0 Respekt Punkte
Standard 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
Fre4krider ist offline   Mit Zitat antworten
Ungelesen 06.12.13, 18:19   #2
ZarrocZuckz
Anfänger
 
Registriert seit: Jun 2010
Beiträge: 17
Bedankt: 2
ZarrocZuckz ist noch neu hier! | 0 Respekt Punkte
Standard

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
ZarrocZuckz ist offline   Mit Zitat antworten
Ungelesen 06.12.13, 22:18   #3
Matze500
Student der Informatik
 
Registriert seit: Jul 2010
Ort: NRW nähe Münster ;)
Beiträge: 355
Bedankt: 261
Matze500 ist noch neu hier! | 0 Respekt Punkte
Standard

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 Mitglieder sichtbar. Bitte einloggen oder neu 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
           
}
__________________
[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
Powered by Windows 7
Matze500 ist offline   Mit Zitat antworten
Ungelesen 06.12.13, 22:40   #4
ZarrocZuckz
Anfänger
 
Registriert seit: Jun 2010
Beiträge: 17
Bedankt: 2
ZarrocZuckz ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
Zitat von Matze500 Beitrag anzeigen
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
ZarrocZuckz ist offline   Mit Zitat antworten
Ungelesen 07.12.13, 13:03   #5
Fre4krider
Fragger
 
Benutzerbild von Fre4krider
 
Registriert seit: Nov 2010
Ort: BW
Beiträge: 48
Bedankt: 11
Fre4krider ist noch neu hier! | 0 Respekt Punkte
Standard

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!?!?
Fre4krider ist offline   Mit Zitat antworten
Ungelesen 07.12.13, 16:25   #6
Matze500
Student der Informatik
 
Registriert seit: Jul 2010
Ort: NRW nähe Münster ;)
Beiträge: 355
Bedankt: 261
Matze500 ist noch neu hier! | 0 Respekt Punkte
Standard

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; 
}
__________________
[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
Powered by Windows 7
Matze500 ist offline   Mit Zitat antworten
Ungelesen 08.12.13, 13:10   #7
Fre4krider
Fragger
 
Benutzerbild von Fre4krider
 
Registriert seit: Nov 2010
Ort: BW
Beiträge: 48
Bedankt: 11
Fre4krider ist noch neu hier! | 0 Respekt Punkte
Standard

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 =)
Fre4krider ist offline   Mit Zitat antworten
Antwort


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 Uhr.


Sitemap

().