Unterfunktion mit call by value

studine

Mitglied
Hallo,

ich bereite mich gerade auf meine Prüfung vor und habe eine Aufgabe, wo ich eine Unterfunktion programmieren muss und zwar eine Mittelwert Berechnung. Leider liefert mir die Anzeige immer den Wert 2.00000 als Mittelwert bei einem Feld mit Zufallszahlen

C:
/*Hier das Programm was schon vorgegeben ist: */
# include <stdio.h>
# include <stdlib.h>

float Mittelwert ( int i, float *feld);

int main ()
{
    float number;
    float mittel;
    float feld[100];
    int i;

/*Feld mit Zufallszahlen füllen*/
    for (i=0; i<100; i++)
    {
        number=rand();
        feld[i]=((number/(float)RAND_MAX)*5)+1;
    }

/*Mittelwert bestimmen*/
    mittel=Mittelwert(i, feld);

    if (mittel>2.9)
        printf("%f :Ich bin gut!\n",mittel);
    else printf ("%f :Du Flasche!\n",mittel);
    return 0;
}

/*Und hier die Unterfunktion die ich programmiert habe: */

float Mittelwert (int n, float *feld)
{


int summe=0;
int i=0;


for (i=0; i<n; i++)
{
  summe=feld[i]+summe;
}

return summe/n;
}

Was mache ich falsch? Ich kann keinen Fehler finden. Über Ratschläge würde ich mich sehr freuen.

Viele Grüße

Iri
 
Zuletzt bearbeitet von einem Moderator:
Ich sehe gerade, dass mein Program gar nicht richtig dargestellt wird. Entschuldigt diesen Fehler, aber ich weiß leider auch hier nicht wie ich das richtig mache. Vielleicht kann mir da auch nochmal wer helfen. DANKE :)
 
Codetags wie folgt "[ CODE=Cpp ]" bis "[ /CODE ]" nur ohne Leerzeichen.

Ich glaube du greifst falsch auf die Arrays zu (hab aber ewig kein C mehr gemacht in Java würde das so gar nicht funktionieren :) )

C++:
//falsch
for (i=0; i<100; i++)
{
number=rand();
feld[i]=((number/(float)RAND_MAX)*5)+1;
}
//richtig
for (i=0; i<100; i++)
{
number=rand();
feld[i]=((number/(float)RAND_MAX)*5)+1;
}

//falsch
for (i=0; i<n; i++)
{
summe=feld+summe;
}

//richtig
for (i=0; i<n; i++)
{
summe=feld[i]+summe;
}
 
So hier jetzt der richtige Code. Danke für die Hilfe.
Bei der ersten Korrektur erkenne ich keinen Unterschied, oder ich sehe ihn einfach nicht. Bei der zweiten korrektur habe ich das i in klammern eingefügt. Trotzdem kein richtiges Ergebniss

C++:
# include <stdio.h>
# include <stdlib.h>

float Mittelwert ( int i, float *feld);

int main ()
{
    float number;
    float mittel;
    float feld[100];
    int i;

/*Feld mit Zufallszahlen füllen*/
    for (i=0; i<100; i++)
    {
        number=rand();
        feld[I]=((number/(float)RAND_MAX)*5)+1;
    }

/*Mittelwert bestimmen*/
    mittel=Mittelwert(i, feld);

    if (mittel>2.9)
        printf("%f :Ich bin gut!\n",mittel);
    else printf ("%f :Du Flasche!\n",mittel);
    return 0;
}

float Mittelwert (int n, float *feld)
{


int summe=0;
int i=0;


for (i=0; i<n; i++)
{
  summe=feld[i]+summe;
}

return summe/n;
}
 
Hallo studine,

in deiner Mittelwert-Funktion musst du "summe" als float deklarieren, sonst bekommst du durch die implizite Konvertierung nach int falsche Werte. Der Compiler müsste dir aber dazu auch eine Warnung ausgegeben haben.

Gruß
MCoder
 
Hi,

in Zeile 15 startest du die for-Schleife mit "i" als Zähler, ein paar Zeilen weiter (18) verwendest du aber "I".
Das Programm dürfte sich so gar nicht compilieren lassen...

Grüße,
BK
 
@Bratkartoffel Das ist mir beim Einfügen von Codetags im ersten Beitrag auch aufgefallen. Dies wird wohl eher ein Resultat des Editors hier sein: Fügt man [i] ohne Codetags ein, so ändert der Editor (oder Xenforo) die Tagnamen zu Großbuchstaben um.

@studine Bitte rücke deinen Code richtig ein, dann kann man ihn besser lesen und dir folglich einfacher helfen. Hierbei empfiehlt sich eine IDE mit Autoformatting.
 
Hi

@studine Abgesehen vom falschen Typ der Variable "summe" in der Mittelwert() sind mir noch 2 Probleme aufgefallen:

1. Die rand() Funktion liefert nur int's zurück, von daher könntest du die Variable "number" in der main() von float auf int stellen.
2. Das Programm liefert immer die selben Zufallszahlen zurück da du den Zufallsgenerator nicht per srand() initialisierst.
3. Beim Aufruf der Mittelwert() verwendest du die Zählvariable i, welche zu dem Zeitpunkt 99 ist. Du berücksichtigst also die letzte Zahl, feld[99] nicht in der Berechnung.

Mit den vier Anpassungen läufts bei mir wie gewünscht, wobei halt durch die Natur des Zufallszahlengenerators halt immer etwas um die 3.5 (Zahlen 1-6, Mittelpunkt 7/2 = 3.5) rauskommen muss:
Bash:
# gcc -Wall -std=gnu99 test.c
# for i in $( seq 1 10 ); do ./a.out && sleep 1; done
3.545048 :Ich bin gut!
3.789394 :Ich bin gut!
3.453192 :Ich bin gut!
3.453098 :Ich bin gut!
3.642770 :Ich bin gut!
3.360437 :Ich bin gut!
3.625713 :Ich bin gut!
3.267277 :Ich bin gut!
3.536814 :Ich bin gut!
3.414873 :Ich bin gut!

Grüße,
BK
 
Zuletzt bearbeitet:
Vielen lieben Dank für die tolle Hilfe.

ich habe aus int summe --> float summe gemacht und es kam tatsächlich eine andere Zahl raus aber wieder immer nur ein und dieselbe Zahl.

Dann habe ich versucht srand() anstatt rand() zu verwenden, da hat der compiler gemeckert "Too few arguments to function 'srand'"

Wie ich i verändern muss dass die letzte zahl miteinbezogen wird weiß ich nicht.

Also bei mir klappts immer noch nicht.

VG
 
Hi

srand ist nicht als rand-Ersatz gedacht.
srand wird ein einziges Mal, zB. am Programmanfang, aufgerufen und sorgt dafür, dass
die folgenden rands wirklich verschiedene Zahlen liefern (statt bei jedem Programmstart die selben)

Voraugesetzt, man schafft es, dem srand immer eine andere Zahl zu übergeben.
Dafür bietet sich zb. ein Timestamp an (also wie viel Sekunden seit 1970 vergangen sind):
C++:
srand(time(0));
 

Neue Beiträge

Zurück