Hilfe mein Programm macht nicht das was ich möchte!
-
Ich soll ein Programm schreiben, dass eine Liste von Zahlen generiert und anschließend die Anzahl der Primzahlen ausgibt. Leider gibt mein Programm immer 0 für die Anzahl der Primzahlen aus. Den Algorithmus für die Primzahlen, der in der Funktion isPrime() steckt, habe ich aus dem Internet und dieser funktioniert tadelos. Hier ist der Programmcode:
#include<stdio.h> #include<stdlib.h> #include<math.h> int zahlen[100]; int zaehler = 2; int izaehler; int isPrime(int zahl) //Problem! { zahlen[0] = 0; zahlen[1] = 0; for(zaehler;zaehler <= (sizeof(zahlen)/sizeof(int));zaehler++) { if(!zahlen[zaehler]) { if(zaehler==zahl) //Vergleich der übergebenen Zahl mit der Primzahl und Rückgabe eines Wertes 0 oder 1, um die Anzahl der Primzahlen zu bestimmen. { return 1; } else { return 0; } for(izaehler = 1;(izaehler*zaehler) < (sizeof(zahlen)/sizeof(int));++izaehler) { zahlen[(izaehler*zaehler)] = 1; } } } } int numPrimes(double* liste,int l) //Problem! { int i,anzahl_primzahlen=0,zahl; for(i=0;i<l;i++) { zahl=liste[i]; anzahl_primzahlen+=isPrime(zahl); } return anzahl_primzahlen; } int main() { double x,z,b,d; int l, i; d = RAND_MAX; printf("Geben Sie die Laenge der Liste ein:\n"); scanf("%i",&l); double liste[l]; printf("Geben Sie die rechte Intervallgrenze ein:\n"); scanf("%lf",&b); printf("\nLaenge der Liste = %i\n",l); printf("Rechte Intervallgrenze = %.0lf\n",b); x = b/d; for(i=0;i<l;i++) { z = x * rand(); liste[i] = z; } printf("Zufallswerte: "); for(i=0;i<l;i++) { printf("%.0lf ",liste[i]); } printf("\n"); printf("Anzahl der Primzahlen = %i\n",numPrimes(liste,l)); //Problem! return EXIT_SUCCESS; }
-
Kann mir hier keiner helfen?
-
Du verdienst es, dass dir keiner hilft.
Dein Code ist grauenvoll bzw. überhaupt nicht formatiert, bekommst du da nicht selbst Augenkrätze von?
Du benutzt keine Codetags, den "fehlerfreien Code aus dem Internet" hast du verunstaltet und kaputt gemacht, ein weiterer Grund, dass wohl keiner deinen Code reparieren UND lesbar machen will.
-
bool isPrime(int Number) { // z.B. für jede Zahl kleiner sqrt(Number) prüfen ob Number ohne Rest durch durch sie teilbar ist // wenn es keine gibt die Number teilt ist Number eine Primzahl } int main() { int* Zahlen; int Anzahl; int AnzahlPrimzahlen = 0; // Anzahl einlesen // Array erstellen, Zufallszahlen generieren // Durch alle Zufallszahlen gehen, für jede prüfen ob sie eine Primzahl ist, wenn ja AnzahlPrimzahlen++ // Ausgabe // Speicher freigeben }
So jetzt nochmal von vorne ohne Copy & Paste von Code den du scheinbar nicht verstehst
-
Danke, dass war keine große Hilfe. Könnte hier einer mal einen gescheiten Kommentar abliefern.
-
Um die Primzahlen zu bestimmen, benutze ich in diesem Programm das Sieb von Eratosthenes. Wenn man den Code definitiv nicht lesen kann, was ich mir nicht vorstellen kann, modelle ich ihn gerne nochmal um. Aber im Prinzip tritt das Problem bei IsPrime auf, wo ich versuche die Primzahlen mit der übergebenen Zahl zu vergleichen und dann einen Wert 0 oder 1 zurückgebe.
-
Man kann da doch gar nichts erkennen.
Formatiere mal deinen Code ordentlich. Code markieren und dann auf den C-Button unter demSmilie klicken.
Aber darauf achten, dass der Code auch richtig eingerückt ist.Und denk daran, dass du Hilfe möchtest. Dies ist ein freiwilliges Forum.
Dann solltest du es uns einfach machen und die gewünschten Informationen liefern.
Du kannst auch noch mal hier nachlesen: [url]http://www.c-plusplus.net/forum/136013
[/url]
-
Du hast ja nun dein Program in Funktionen zerlegt. Wenn du sagst das Program gibt immer 0 aus, was meinst du dann genau? Hast du es für alle möglichen Eingabe Parameter getestet? (Das ist nahuezu unmöglich!)
Was gibt den deine
numPrimes
Funktion zurück wenn du eine Array mit Primzahlen reingibst? Mach erstma diesen ganzen Eingabe-Quatsch weg und teste dienumPrimes
Funktion, z.Bdouble primes[] = {2,3,5,7,9}; printf("%d\n", numPrimes(primes,5);
Dann hast du schonmal einen Anhaltspunkt wo der Fehler zu suchen ist.
Ausserdem ist es fragwürdig eine double Zahl auf Primzahl zu überprüfen (die Signatur von
numPrimes
ist irreführend).
-
Ich habe den Code formatiert. Man kann alles überfliegen bis auf die Stellen, die mit //Problem gekennzeichnet sind. Den Code für den Algorithmus "Sieb des Eratosthenes habe ich wie gesagt aus dem Internet http://stefanhermann.com/?p=7.
Aber ich denke mir vielleicht ist doch die Probedivision einfacher. Ich hoffe mir kann einer sagen, wo das Problem im obigen Code liegt, weil ich glaube, dass man den Fehler schnell ausmerzen kann.
-
Ich kann auch die Stellen mit //Problem überfliegen :p
die
isPrime
ist natürlich Müll. Dennzahlen[i]
,i>1
ist uninitialisiert. Höchstwahrscheinlich wird aber dennoch inzahlen
alles 0 sein, da aberzähler == zahl
recht unwahrscheinlich ist, gibtisPrime
fast immer 0 zurück. Verfolge mal den Programmfluss unter der Annahme das inzahlen
überall 0 steht.Edit: dummerweise würde es bei meinem obigen Testbeispiel zweimal funktionieren
-
anfaenger2012 schrieb:
Ich hoffe mir kann einer sagen, wo das Problem im obigen Code liegt, weil ich glaube, dass man den Fehler schnell ausmerzen kann.
Nur ein Problem? Nu gut, hier ist eines:
18 if(zaehler==zahl) 19 { 20 return 1; 21 } 22 else 23 { 24 return 0; 25 }
Fällt Dir was auf? Die Funktion wird immer mit "return 0" beendet.
viele grüße
ralph
-
Ach und ich hoffe du siehst auch das die innere for-Schleife nie erreicht wird ...
-
Geschmacksmuster - ganz ohne double:
#include <stdlib.h> #include <stddef.h> #include <time.h> #include <stdio.h> #define sizeof_array( x ) ( sizeof( x ) / sizeof( x[0] ) ) void clear( FILE *file ) { int ch = 0; while( ( ch = getchar() ) != '\n' && ch != EOF ); } void generate_primes( unsigned *primes, size_t const size ) { size_t i = 2; size_t j = 0; primes[ 0 ] = 0; primes[ 1 ] = 0; for( /* i = 2 */; i < size; ++i ) { primes[ i ] = 1; } for( i = 2; i < size; ++i ) { if( primes[ i ] ) { for( j = i * i; j < size; j += i ) { primes[ j ] = 0; } } } } int main( void ) { unsigned primes[ 100 ]; unsigned nums_to_test = 0; unsigned max_test = 0; unsigned num = 0; unsigned num_primes = 0; size_t i = 0; generate_primes( primes, sizeof_array( primes ) ); while( printf( "Anzahl der zu testenden Zahlen: " ), scanf( "%u", &nums_to_test ) != 1 ) { fputs( "\nEingabefehler. Bitte wiederholen!\n\n", stderr ); clear( stdin ); } while( printf( "Obere Grenze (Maximum = %u): ", sizeof_array( primes ) - 1 ), scanf( "%u", &max_test ) != 1 || max_test > sizeof_array( primes ) - 1 ) { fputs( "\nEingabefehler. Bitte wiederholen!\n\n", stderr ); clear( stdin ); } putchar( '\n' ); srand( (unsigned) time( 0 ) ); for( /* i = 0 */; i < nums_to_test; ++i ) { num = 1 + rand() % max_test; printf( "%3u ist%s prim.\n", num, primes[ num ] ? ++num_primes, "" : " nicht" ); } printf( "\n%u von %u getestete Zahlen sind prim.\n\n", num_primes, nums_to_test ); }
-
Ich habe das Ganze nochmal umgeschrieben. Ich hoffe es ist ersichtlich, was ich machen möchte. Bitte sagt mir konkret, was in meinem Code nicht stimmt.
#include<stdio.h> #include<stdlib.h> #include<math.h> int isPrime_laenge = 1000; int isPrime_zahlen[1000]; int isPrime_zaehler = 2; int isPrime_izaehler; int isPrime(double zahl) { int i,l; double liste_primzahlen[1000]; l=1000; for(i=0;i<l;i++) { liste_primzahlen[i] = 0; } isPrime_zahlen[0] = 0; isPrime_zahlen[1] = 0; for(isPrime_zaehler;isPrime_zaehler < isPrime_laenge;isPrime_zaehler++) { if(!isPrime_zahlen[isPrime_zaehler]) { liste_primzahlen[isPrime_zaehler] = isPrime_zaehler; //Erstellung einer Liste mit Primzahlen for(isPrime_izaehler = 1;(isPrime_izaehler*isPrime_zaehler) < isPrime_laenge;++isPrime_izaehler) { isPrime_zahlen[(isPrime_izaehler*isPrime_zaehler)] = 1; } } } for(i=0;i<l;i++) { if(liste_primzahlen[i]==zahl&&zahl!=0) //Vergleich der Liste mit Primzahlen mit den übergebenen Zahlenwert { return 1; } } } int numPrimes(double* liste,int l) { int i,anzahl_primzahlen=0; double zahl; for(i=0;i<l;i++) { zahl=liste[2]; anzahl_primzahlen+=isPrime(zahl); } return anzahl_primzahlen; } int main() { double x,z,b,d; int l, i; d = RAND_MAX; printf("Geben Sie die Laenge der Liste ein:\n"); scanf("%i",&l); double* liste; liste = (double*)malloc(l*sizeof(double)); printf("Geben Sie die rechte Intervallgrenze ein:\n"); scanf("%lf",&b); printf("\nLaenge der Liste = %i\n",l); printf("Rechte Intervallgrenze = %.0lf\n",b); x = b/d; for(i=0;i<l;i++) { z = x * rand(); liste[i] = z; } printf("Zufallswerte: "); for(i=0;i<l;i++) { printf("%.0lf ",liste[i]); } printf("\n"); printf("Anzahl der Primzahlen = %i\n",numPrimes(liste,l)); free(liste); return EXIT_SUCCESS; }
-
Einheitlich den Quelltext einrücken -> sieht besser aus.
Globale Variable sollte man möglichst vermeiden.
Wenn ich nichts übersehen hab solltest du dir folgendes genau durchlesen:
http://www.c-plusplus.net/forum/172876-full
-
anfaenger2012 schrieb:
Ich habe das Ganze nochmal umgeschrieben. Ich hoffe es ist ersichtlich, was ich machen möchte. Bitte sagt mir konkret, was in meinem Code nicht stimmt.
Warum bist Du zu faul einen Debugger zu benutzen? Damit würdest Du den Fehler schnell finden.
mfg Martin