Ergebnis in Array abspeichern



  • Hallo, es hat schon so ein ähnliches Thema gegeben, doch eine passende Lösung habe ich da nicht gefunden. Es geht nur drum, dass die Ergebnisse einer Schleife (Primzahlen) im Array abgespeichert werden. Es geht um Praktikumsaufgabe, darum sollen wir alles selbst programmieren und in reiner C-Sprache. Das heist also am ende der Schleife habe ich sowas:

    if (...){primzahl=zahl; printf("%d", primzahl);}
    

    jetzt muss anstatt der printf-Anweisung eine Anweisung die diese primzahlen im array abspeichert.
    Vielen Dank für eure Hilfe! 🙂



  • Du brauchst ein Array für z.B. 1000 Primzahlen:

    unsigned long primzahlen[1000] = {0};
    

    Und einen Index für das Array:

    int index = 0;
    

    und dann kannst du mit

    primzahlen[index++] = primzahl;
    

    die primzahlen im Array ablegen. Das ++ zählt index automatisch weiter.
    Du musst nur aufpassen das du dann nicht mehr als 1000 Zahlen ablegst.

    Der Formatspecifier bei printf() für unsigned long ist "%lu".



  • Hallo Dirk, vielen dank für die Antwort! hab versuht das umzusetzen, aber anscheinend fehlt mir noch an Erfahrung, denn ich krieg die Meldung: Unbehandelte Ausnahme bei 0x001f1697 in primzahl.exe: 0xC00000FD: Stack overflow.

    hier ist die komplette Code:

    #include<stdio.h>
    #include<stdlib.h>
    #define oe (unsigned char)148 
    void main()
    
    {
    float zahl=2;
    float summe,prim,primzahl;
    int c,i,t;
    int primzahlen[1000]={0};	//array
    int index = 0;
    printf("Willkommen zu meinem Programm!\ngeben Sie die Zahl ein, bis der Sie die Tabelle angezeigt haben m%cchten:\n",oe);
    scanf("%d",&t);
    printf("\nPrimzahlentabelle wird  zum Wert (%d) ermittelt\n\n\n\n",t);
    printf("______________________________________________________________________________\n\n");
    
    do
    
    {
    	zahl++;
    	i=zahl;
    	//printf("\n-----------------------------------%.f\n",zahl);
    	do
    	{
    
    	i--;
    	prim=zahl/i;
    
    	c=prim;
    	//printf("z = %.f  i = %d  p = %.3f \t",zahl,i,prim);
    	//if(t % 2==0){printf("\n");}
    		if(prim-c==0 &&  i !=zahl && i !=1)
    		{
    
    			//printf("\n %.f ist keine Primzahl\n",zahl);
    			zahl=zahl+1;
    			i=zahl-1;
    		}  
    
    	if(zahl/i==zahl){primzahl=zahl;}	
    	}while (prim-c!=0||i>=2);
    
    printf(" %.f\t",primzahl);
    
    primzahlen[index++] = primzahl;
    
    }while(zahl<t-3);
    
    printf("\n");
    printf("______________________________________________________________________________\n");
    printf("\n\n\n\n");
    
    system ("Pause\n\n\n");
    }
    

  • Mod

    Deine Primzahlen sind zwar falsch(die 2fehlt), aber an sich machst du keine Fehler, solange die Eingabe nicht mehr als 1000 Zahlen erzeugt. Tritt der Fehler gleich zum Start auf? Wenn ja, dann sind 1000 ints zu viel für die Stackgröße deines Systems. In Unix-Systemen ist die Stackgröße eine Umgebunsgvariable, die du ändern kannst, in Windows musst du die Stackgröße in die Executable eincompilieren. Oder du legst das Feld mit malloc auf dem Heap an.



  • Ich steig durch deinen Algorithmus auf die Schnelle nicht durch.
    Aber:

    primzahlen[index++] = primzahl; solltest du nur machen, wenn du auch eine Primzahl gefunden hast.
    Wo ist dein test darauf, ob index >= 1000 ist?
    Mach mal testweise in Zeile 43: printf("%3d: %.f\t",index, primzahl);

    Mit ausnahme der 2 sind alle Primzahlen ungerade. Also kannst du am Anfang schreiben primzahlen[index++] = 2; dann mit 3 weiter machen und nur alle ungerade Zahlen testen.

    Warum nimmst du float? Primzahlen sind Natürlich Zahlen.
    Darum unsigned long , das geht bis 4294967295.
    Wenn das nicht reicht, nimm unsigned long long, das geht bis 18446744073709551615.
    Das ist auf alle Fälle mehr, als float noch bis auf die Einerstelle genau anzeigen kann.

    Welchen Compiler benutzt du?



  • Hallo, vielen dank, hab versehen dass die "zahl" ab 2 anfängt, hab den Anfangswert jetzt auf 1 gemacht, jetzt wird auch 2 angezeigt);

    float benutze ich damit der selbe Wert prim(float)-c(int) (c=prim) nur dann
    c-prim==0 ergeben, wenn prim eine ganze Zahl ist; bei der if Anweisung
    wenn c-prim==0, wird die Schleife abgebrochen.

    hab jetzt mein Compiler (Visual Studio) neu gestartet, das Fehler wird nun nicht mehr angezeigt, doch wenn ich z.b. die 4-te Primzahl der Reihe angezeigt haben möchte, kommt 0 raus. Kann nicht kapieren, entweder das Array ist leer, oder etwas falsch bei der Ausgabe. Gruss

    jetziges Code:

    #include<stdio.h>
    #include<stdlib.h>
    #define oe (unsigned char)148 
    void main()
    
    {
    float zahl=1;
    float summe,prim,primzahl;
    int c,i,t;
    
    int primzahlen[1000]={0};	//array
    
    int index = 0;
    printf("Willkommen zu meinem Programm!\ngeben Sie die Zahl ein, bis der Sie die Tabelle angezeigt haben m%cchten:\n",oe);
    scanf("%d",&t);
    printf("\nPrimzahlentabelle wird bis zum Wert (%d) ermittelt\n\n\n\n",t);
    printf("______________________________________________________________________________\n\n");
    
    do
    
    {
    	zahl++;
    	i=zahl;
    	//printf("\n-----------------------------------%.f\n",zahl);
    	do
    	{
    
    	i--;
    	prim=zahl/i;
    
    	c=prim;
    	//printf("z = %.f  i = %d  p = %.3f \t",zahl,i,prim);
    	//if(t % 2==0){printf("\n");}
    		if(prim-c==0 &&  i !=zahl && i !=1)
    		{
    
    			//printf("\n %.f ist keine Primzahl\n",zahl);
    			zahl=zahl+1;
    			i=zahl-1;
    		}  
    
    	if(zahl/i==zahl){primzahl=zahl;}	
    	}while (prim-c!=0||i>=2);
    
    printf(" %.f\t",primzahl);
    
    }while(zahl<t-3);
    primzahlen[index++] = primzahl;
    printf("\n");
    printf("______________________________________________________________________________\n");
    printf("die 3-Stelle des arrays ist %d",primzahlen[4]);
    printf("\n\n\n\n");
    
    system ("Pause\n\n\n");
    }
    


  • und habe jetzt in die Zeile 43 printf("%3d: %.f\t",index, primzahl); gemacht, index ist überall 0... :xmas2:



  • Du schreibst in das Array ja erst, wenn du mit der Schleife komplett durch bist.
    Für den Rest der Ganzzahldivision gibt es den Modulo-Operator %

    9 % 2 = 1 (9 = 42+ 1 )
    9 % 3 = 3 (9 = 3
    3+ 0 )
    9 % 4 = 1 (9 = 24+ 1 )
    9 % 5 = 4 (9 = 1
    5+ 4 )



  • o doch, jetzt läuft es) hab die Anweisung mit index++ auserhalb der Schleife geschrieben)) vielen vielen Dank euch!!! :xmas1: 🙂 👍



  • DirkB schrieb:

    Du schreibst in das Array ja erst, wenn du mit der Schleife komplett durch bist.
    Für den Rest der Ganzzahldivision gibt es den Modulo-Operator %

    9 % 2 = 1 (9 = 42+ 1 )
    9 % 3 = 3 (9 = 3
    3+ 0 )
    9 % 4 = 1 (9 = 24+ 1 )
    9 % 5 = 4 (9 = 1
    5+ 4 )

    ich weiss nicht warum, aber mit modulo gings irgendwie nicht, hab bestimmt schon wieder was falsch gemacht) musste mir dann irgendetwas anderes einfallen lassen)
    da hatte ich dann (zahl % i == 0) gruss 🙂


Anmelden zum Antworten