Meanvalue in C



  • Hallo. Ich studiere Technische Informatik und bereite mich gerade auf eine Klausur in Informatik vor. Ich komme bei einer Aufgabe nicht komplett bis zum Schluss und bitte um Hilfe. Hier ist die Aufgabenstellung:
    Sie sollen ein kurzes C-Programm schreiben, welches Notenwerte einliest und den entsprechenden
    Mittelwert berechnet und ausgibt. Da Ihre Zielplattform nur ganze Zahlen verarbeiten
    kann, können Sie nur Integer-Arithmetik verwenden.
    Die Notenwerte entsprechen unseren Notenstufen im Fachhochschulbereich. Jede Note wird
    als Hundertstelnote (entsprechend 100, 130, 170, 200, 230, 270, 300, 330, 370, 400)
    gespeichert. Folgende Typdeklaration ist gegeben:
    typedef enum { false, true } bool;
    a) Deklarieren Sie die Funktion Meanvalue(). Die Funktion bekommt als Eingabeparameter
    die Anzahl der Feldelemente sowie ein Integerfeld mit den Notenwerten. Der
    Ausgabeparameter ist der Mittelwert als Integerzahl. Die Funktion liefert bei korrekter
    Ausführung true, andernfalls false zurück.
    b) Implementieren Sie die Funktion Meanvalue() gemäß Ihrer Deklaration aus a). Die
    Funktion soll den Mittelwert auf 2 Nachkommastellen (als Hunderstelnote) berechnen.
    Sofern eine Division durch Null auftritt oder eine negative Anzahl an Noten übergeben
    wird, gibt die Funktion false, andernfalls true zurück.
    Beispiel: Die Noten 1,0 und 2,0 (Eingabe 100, 200) ergeben als Mittelwert 150.
    c) Ergänzen Sie nachfolgende main()-Funktion: Lesen Sie in einer Schleife bis maximal
    100 Notenwerte von Tastatur in ein Feld ein. Lassen Sie im Anschluss mit Ihrer
    Funktion aus Aufgabe a) den Mittelwert berechnen und geben Sie bei Erfolg das
    Ergebnis auf 2 Nachkommastellen als Notenwert (z.B. 2.33) aus. Definieren Sie als
    Abbruchbedingung die Eingabe einer ungültigen Note, z.B. Wert < 100 oder > 400.
    Hier ist mein bisherigen Code:

    #include <stdio.h>
    #include<stdlib.h>
    
    typedef enum { false, true } bool;
    
    bool Meanvalue(int anzahl, int feld_noten[], int ausgabe);
    
    int main(void){
    	int feld_noten[] = {1.0, 2,0}; 
    	Meanvalue(2, feld_noten);
    	//printf ("%d", Meanvalue(&ausgabe));
    
    	return 0;
    }
    
    bool Meanvalue(int anzahl, int feld_noten[], int ausgabe){
    	if (anzahl <= 0){
    		return false;}
    	int puffer = 0;
    	int puffer1 = 0;
    	for (int i = 0; i <= anzahl; i++){
    		puffer = feld_noten[i] * 100; 
    		puffer1 = puffer + puffer1;}
    	ausgabe = puffer1 / anzahl;
    	return true;		
    }
    

    Ich weiss, dass der Code noch nicht ganz mit der Aufgabenstellung übereinstimmt. Ich versuche mich halt Stück für Stück ran zu tasen. Wenn ich das Programm jetzt debuge sehe ich, dass meine Funktion dem Mittelwert berechnet. Allerdings gibt die Funktion ja nur einen boolschen Wert zurück. Wie kann ich jetzt in meiner Main-Funktion auf die Variable ausgebe aus der Meanvalue-Funktion zurückgreifen?



  • Hast du schon was über Zeiger gelernt.

    Das Stichwort hier ist "Call by Value" bzw. "Call by Reference" und dessen Umsetzung in C

    Habt ihr z.B. eine swap-Funktion geschrieben?

    1.0 ist eine Fließkommazahl und ist bei int wenig sinnvoll. Das hat nichts mit den Vorgaben aus der Aufgabe zu tun.
    Dein feld_noten enthält z.Zt. 3 Elemente.

    ~Edit "Call by Reference"ergänzt~



  • Dein ausgabe-Parameter muss ein Zeiger sein (oder entsprechend dem Jargon deines Lehrers: ein Feld (mit einem Element als Inhalt)).
    Deine for-Schleife läuft zu weit.



  • Den "Prof" sollte man für die Aufgabenstellung windelweich schlagen.



  • Erstmal vielen Dank für die Antworten. Ja, das mit dem int macht schon wenig Sinn. Das mit dem Call-by-Value kann ich etwas wenig anfangen. Ich will ehrlich seien. Ich hatte dieses Semester viel damit zutun die Nachprüfungen nachzuholen und im Mai hatte ich noch einen Unfall gehabt. Dadurch war ich 1Monat krankgeschrieben. Aber egal, soll jetzt keine Ausrede seien. Ich will hier auch nicht Schmarotzermäßiges oder so.
    Mit den Antworten kann ich aber etwas wenig anfangen. Für eine Erklärungen oder ein Beispiel oder die Korrektur von meinem Code wäre ich aber sehr sehr dankbar.



  • Nee, ich habe immer noch zwei Probleme. Ich kann an meine Meanvalue-Funktion maximal drei Werte aus dem Array übergeben. Also wenn im Array 10 Werte sind, werden nur die ersten drei übergeben.
    Und ich habe nach wie vor kein Plan wie ich den Wert des ausgabe von der Main abfragen soll. Bitte um Hilfe.



  • Hier ein kleines Beispiel welches das Konzept erklären sollte, ohne deine Hausaufgaben zu machen 🙂

    void func (int *bar) { // bar ist ein Zeiger auf ein int
        *bar = 2; // * heisst: Dereferenziere den Zeiger bar
    }
    
    int main (void) {
        int foo = 1;
        func (&foo); // Wir übergeben nicht foo, sondern die Adresse (Zeiger auf) von foo
        printf ("%d\n", foo);
        return 0;
    }
    


  • Die 2 was du Meanvalue übergibst bestimmt wie oft deine for-schleife durchlaufen wird. Wenn du also 2 übergibst wird immer nur feld_noten[0], feld_noten[1] und feld_noten[2] abgerufen. Wenn du also n Werte in deinem Array hast musst du Meanvalue als anzahl n übergeben.

    Bei Zählergesteuerten Schleifen die ein Array durchlaufen muss die Laufvariable immer einen Wert kleiner sein als die Arraygröße ist.
    Somit muss ein Schleifenkopf so aussehen

    for (int i = 0; i < anzahl; i++)
    


  • Ok, Top. Bin etwas weiter gekommen. So sieht mein Code jetzt aus:

    #include <stdio.h>
    #include<stdlib.h>
    
    typedef enum { false, true } bool;
    
    bool Meanvalue (int anzahl, int feld_noten[100], int *ausgabe);
    
    int main(void){
    	int feld_noten[100] = {5,2,3,4};
    	//for (int i = 0; i <= 5; i++){
    		//scanf("%d", &feld_noten[i]);} 
    	int ergebnis = 0;
    	Meanvalue(2, feld_noten, &ergebnis); 
    	printf ("%d", ergebnis);
    
    	return 0;
    }
    
    bool Meanvalue(int anzahl, int feld_noten[100], int *ausgabe){
    	if (anzahl <= 0){
    		return false;}
    	int puffer = 0;
    	int puffer1 = 0;
    	for (int i = 0; i < anzahl; i++){
    		puffer = feld_noten[i] * 100; 
    		puffer1 = puffer + puffer1;}
    	*ausgabe = puffer1 / anzahl;
    	return true;		
    }
    

    Das letzte Problem ist, dass aus dem Array feld_noten nur die ersten beiden Werte an die Funktion übergeben werden. Also in diesem Beispiel nur 5 und 2. Wie kann ich das gesamte Feld an die Funktion übergeben?



  • Ok, Top. Bin etwas weiter gekommen. So sieht mein Code jetzt aus:

    #include <stdio.h>
    #include<stdlib.h>
    
    typedef enum { false, true } bool;
    
    bool Meanvalue (int anzahl, int feld_noten[100], int *ausgabe);
    
    int main(void){
    	int feld_noten[100] = {5,2,3,4};
    	//for (int i = 0; i <= 5; i++){
    		//scanf("%d", &feld_noten[i]);} 
    	int ergebnis = 0;
    	Meanvalue(2, feld_noten, &ergebnis); 
    	printf ("%d", ergebnis);
    
    	return 0;
    }
    
    bool Meanvalue(int anzahl, int feld_noten[100], int *ausgabe){
    	if (anzahl <= 0){
    		return false;}
    	int puffer = 0;
    	int puffer1 = 0;
    	for (int i = 0; i < anzahl; i++){
    		puffer = feld_noten[i] * 100; 
    		puffer1 = puffer + puffer1;}
    	*ausgabe = puffer1 / anzahl;
    	return true;		
    }
    

    Das letzte Problem ist, dass aus dem Array feld_noten nur die ersten beiden Werte an die Funktion übergeben werden. Also in diesem Beispiel nur 5 und 2. Wie kann ich das gesamte Feld an die Funktion übergeben?



  • Steht doch schon da:

    axels. schrieb:

    Die 2 was du Meanvalue übergibst bestimmt wie oft deine for-schleife durchlaufen wird. Wenn du also 2 übergibst wird immer nur feld_noten[0], feld_noten[1] und feld_noten[2] abgerufen. Wenn du also n Werte in deinem Array hast musst du Meanvalue als anzahl n übergeben.



  • Hallo,

    wie wäre es denn mit: IDEOne ?



  • Also der Code sieht jetzt so aus. Trotzdem werden nur die ersten zwei Werte übergeben. Danach bricht die For-Schleife ab.

    #include <stdio.h>
    #include<stdlib.h>
    
    typedef enum { false, true } bool;
    
    bool Meanvalue (int anzahl, int feld_noten[100], int *ausgabe);
    
    int main(void){
    	int feld_noten[100];
    	int ergebnis = 0;
    	for (int i = 0; i <= 5; i++){
    		scanf("%d", &feld_noten[i]);
    		Meanvalue(i, feld_noten[i], &ergebnis);}  
    	printf ("%d", ergebnis);
    
    	return 0;
    }
    
    bool Meanvalue(int anzahl, int feld_noten[100], int *ausgabe){
    	if (anzahl <= 0){
    		return false;}
    	int puffer = 0;
    	int puffer1 = 0;
    	for (int i = 0; i < anzahl; i++){
    		puffer = feld_noten[i] * 100; 
    		puffer1 = puffer + puffer1;}
    	*ausgabe = puffer1 / anzahl;
    	return true;		
    }
    


  • Was wäre eigentlich so schlimm daran gewesen, einfach die richtige Länge des Arrays als Parameter zu übergeben?

    int feld_noten[100] = {5,2,3,4}; // 4 Elemente im Array
    Meanvalue(4, feld_noten, &ergebnis); // Länge = 4
    


  • So jetzt funktioniert es. Vielen Dank für die Hilfe. Hier ist meine Lösung:

    #include <stdio.h>
    #include<stdlib.h>
    
    typedef enum { false, true } bool;
    
    bool Meanvalue (int anzahl, int feld_noten[100], int *ausgabe);
    
    int main(void){
    	int feld_noten[100];
    	int anzahl = 0;
    	int ergebnis = 0;
    	for (int i = 0; i <= 5; i++){
    		scanf("%d", &feld_noten[i]);
    		anzahl =  i;}
    	Meanvalue(anzahl, feld_noten, &ergebnis);  
    	printf ("%d", ergebnis);
    
    	return 0;
    }
    
    bool Meanvalue(int anzahl, int feld_noten[100], int *ausgabe){
    	if (anzahl <= 0){
    		return false;}
    	int puffer = 0;
    	int puffer1 = 0;
    	for (int i = 0; i < anzahl; i++){
    		puffer = feld_noten[i] * 100; 
    		puffer1 = puffer + puffer1;}
    	*ausgabe = puffer1 / anzahl;
    	return true;		
    }
    


  • Leider hast du nicht alle Aufgabenteile erfüllt.


Log in to reply