Willkommen |
|
myGully |
|
Links |
|
Forum |
|
|
|
 |
06.12.13, 16:17
|
#1
|
Fragger
Registriert seit: Nov 2010
Ort: BW
Beiträge: 48
Bedankt: 11
|
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
|
|
|
06.12.13, 18:19
|
#2
|
Anfänger
Registriert seit: Jun 2010
Beiträge: 17
Bedankt: 2
|
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
|
|
|
06.12.13, 22:18
|
#3
|
Student der Informatik
Registriert seit: Jul 2010
Ort: NRW nähe Münster ;)
Beiträge: 355
Bedankt: 261
|
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
}
|
|
|
06.12.13, 22:40
|
#4
|
Anfänger
Registriert seit: Jun 2010
Beiträge: 17
Bedankt: 2
|
Zitat:
Zitat von Matze500
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
|
|
|
07.12.13, 13:03
|
#5
|
Fragger
Registriert seit: Nov 2010
Ort: BW
Beiträge: 48
Bedankt: 11
|
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!?!?
|
|
|
07.12.13, 16:25
|
#6
|
Student der Informatik
Registriert seit: Jul 2010
Ort: NRW nähe Münster ;)
Beiträge: 355
Bedankt: 261
|
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;
}
|
|
|
08.12.13, 13:10
|
#7
|
Fragger
Registriert seit: Nov 2010
Ort: BW
Beiträge: 48
Bedankt: 11
|
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 =)
|
|
|
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
HTML-Code ist Aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 Uhr.
().
|