# Zufallszahlen in array speichern und Mittelwert berechnen



## studine (20. Dezember 2013)

Hallo, ich habe mal wieder ein problem mit einem C-Programm.

Ich habe mit einem Zufallszahlen generator 100 Noten erstellt und diese in ein Feld gespeichert. Dieses Feld an eine Unterfunktion übergeben, die mir den Mittelwert vom Feld ausrechnen soll, der wieder an Main gesendet wird und dort an den Monitor ausgegeben wird. Leider gibt der Monitor immer wieder 0.000000 an. Ich hab schon alles mögliche ausprobiert, aber ich finde einfach den Fehler nicht. Kann mir jemand helfen? 

Hier mein Programm: 


```
#include <stdio.h>
float mittelwert(float *,int);

int main()
{
int i;
int anzahl_noten=100;               /*brauche 100 Zahlen(=Noten)*/
float noten[100];

srand (time(NULL));                 /*Zufallsgenerator*/
for(i=0;i<anzahl_noten;i++)
{
    noten[i]=rand()%6+1;            /*brauche Zahlen zwischen 1 und 6 und die sollen direkt in ein Feld*/
}
    mittelwert(noten, anzahl_noten); /*Funktionsaufruf*/

    printf ("Der Mittelwert liegt bei %f\n",mittelwert);

return 0;

}

float mittelwert(float *noten, int anzahl_noten)

{
    float mwert;
    float summe=0;
    int i;
    for (i=0;i<100;i++)
    {
        summe=summe+noten[i];
    }
    if (i>98)
    {
        mwert=summe/anzahl_noten;
    }

}
```


----------



## Jennesta (20. Dezember 2013)

Hallo, 

mir sind hier mehrere Fehler aufgefallen. Zuerst muss ich noch "stdlib.h" und "time.h" inkludieren um die funktionen "rand" und "time" nutzen zu können. Da du aber scheinbar zu einer Ausgabe kommst und es bei bei dir kompiliert, gehe ich davon aus, dass es bei dir standardmäßig dabei ist oder du es vergessen hast. 

Nun zum wichtigeren Teil. Deine Mittelwert-Funktion gibt keinen Rückgabewert zurück. Das wäre ganz nützlich um die Berechnung beim Aufrufer bekannt zu geben.

Aber selbst wenn sie einen Rückgabewert zurückgeben würde, würde dieser nirgendwo gespeichert. Das heißt du musst etwas wie 
	
	
	



```
float = mittelwert(noten, anzahl_noten);/*Funktionsaufruf*/
```
 machen. Sonst rechnet die Funktion zwar, aber teilt niemandem das Ergebnis mit.

Als letztes musst du noch der print-Funktion sagen was sie schreiben soll. Im moment übergibst du der Funktion nur die Funktion mittelwert. Damit kann sie aber eigentlich nichts anfangen. D.H.
du brauchst etwas wie 
	
	
	



```
printf ("Der Mittelwert liegt bei %f\n", a);
```


----------



## studine (21. Dezember 2013)

Danke für die Antwort. 

Den Funktionsaufruf habe ich in Zeile 16. 
wieso hast du ein a in print f geschrieben? 

Ich habe jetzt die Sachen die du angemerkt hast übernommen. es kommt trotzdem noch null raus


----------



## Jennesta (21. Dezember 2013)

Hallo, ich habe da einen Buchstaben unterschlagen, es müsste

```
float a = mittelwert(noten, anzahl_noten);/*Funktionsaufruf*/
```
heißen. Tut mir Leid.

Falls dein Code mit der Änderung noch nicht funktioniert, poste mal deinen ganzen Code.


----------



## studine (22. Dezember 2013)

juhu es klappt. DANKE. wegen so einem kleinen fehler....;-)

weiter gehts: Ich versuche den Median von einem sortierten Notenfeld auszugeben. Es funktioniert alles gut. Nur dass der Median unglaubwürdig hoch ist. Jetzt habe ich mal die  sortierten Noten mit ausgeben lassen. Da kommt nur quatsch raus. Findet jemand den Fehler? Meist sieht man den Wald vor lauter Bäumen nicht mehr....;-)  

hier mein Programm:


```
#include <stdio.h>

float noten_sortieren(int, float *);

int main()
{
    float noten[51];
    int i;
    int anzahl_noten=51;
    srand (time(NULL));
    for (i=0;i<anzahl_noten;i++)
    {
        noten[i]=rand () %6+1;
    }
    float sortierte_noten[i];
    sortierte_noten[i]=noten_sortieren(anzahl_noten, noten);
    for(i=0;i<anzahl_noten;i++)
    {
        printf("%f\n", sortierte_noten[i]);
        if (i==((anzahl_noten-1)/2)+1)
        {
            printf("Der Median der Noten betraegt: %f\n",noten[i]);
        }
    }
    return 0;
}

float noten_sortieren (int anzahl_noten, float *noten)
{
   int m;
   int n;
   int i;
   int tausch;

   for (m=0;m<anzahl_noten;m++)
   {
       for (n=0;n<anzahl_noten-1;i++)
       {
           if (noten[i+1]<noten[i])
           {
               tausch=noten[i];
               noten[i]=noten[i+1];
               noten[i+1]=tausch;
           }
       }
   }



return noten[i];
}
```

Ich habe gerade oben das von mir angegebene Programm etwas geändert weil ich  noch eine Input Variable in der Unterfunktion hinzugefügt habe und zwar int anzahl_noten. und wenn ich jetzt ausführe, dann : Notenkriese median.exe funktioniert nicht mehr

Habe gerade selber noch einen Fehler gefunden im Index des Feldes Noten. Sorry. Hier die neue Version. Aber jetzt kommt wieder quatsch in der Ausgabe raus....


```
#include <stdio.h>

float noten_sortieren(int, float *);

int main()
{
    float noten[51];
    int i;
    int n=51;
    srand (time(NULL));
    for (i=0;i<n;i++)
    {
        noten[n]=rand () %6+1;
    }
    float sortierte_noten[n];
    sortierte_noten[n]=noten_sortieren(n, noten);
    for(i=0;i<n;i++)
    {
        printf("%f\n", sortierte_noten[n]);
        if (i==((n-1)/2)+1)
        {
            printf("Der Median der Noten betraegt: %f\n",noten[n]);
        }
    }
    return 0;
}

float noten_sortieren (int n, float *noten)
{
   int m;

   int i;
   int tausch;

   for (m=0;m<n;m++)
   {
       for (i=0;i<n-1;i++)
       {
           if (noten[i+1]<noten[i])
           {
               tausch=noten[i];
               noten[i]=noten[i+1];
               noten[i+1]=tausch;
           }
       }
   }



return noten[i];
}
```


----------



## sheel (22. Dezember 2013)

Hi

deine Beiträge haben einen Bearbeitenbutton, bitte benützen.

Zur Funktion sortieren:
Der Returnwert macht überhaupt keinen Sinn
(bzw., du gibst die letzte Note zurück. Wozu?)

Zu main:
Willst du 50 oder 51 Noten?

In deinen ganzen Schleifen zählst du mit i von 0 bis n durch
und greifst aber auf das n-te Arrayelement zu.
n ist die Obergrenze, nicht das, was durchzählt bzw. jedes Arrayelement druchläuft.
Und [n-1] ist jeweils das letzte Arrayelement. [n] gibts nicht mehr,
das Verwenden davon macht Probleme.

Das ganze Array sortierte_noten ist überflüssig.
Nach Funktionsaufruf ist das Array noten selbst schon sortiert.
Und falls du das Array kopieren willst geht das nicht so wie in Zeile 15,
da weist du die letzte Note (eine einzelne Note) einem nicht existenten Arrayelement zu.

Und der Median ist nicht der "normale" Durchschnitt,
und es gibt nur einen Median. Raus aus der Schleife.


----------

