Float Ausgabe funktioniert nicht



  • Hallo 🙂

    ich bin neu in diesem Forum und ein relativ blutiger C++ Anfänger.

    Wir schreiben morgen eine Arbeit in der Schule und das Hauptthema sind Felder. Der Lehrer hat uns leider so gut wie gar nichts erklärt und ich bin seit Tagen dabei mich komplett selbst reinzulesen.

    Ich hab hier folgendes Programm geschrieben um einen Notendurchschnitt zu berechnen:

    //------------------------------------------------------------------------------------------
    // Header Dateien
    #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    //------------------------------------------------------------------------------------------
    void FeldAuslesen(int*, int);
    void FeldEinlesen(int*, int);
    //------------------------------------------------------------------------------------------
    // Hauptfunktion: Einstiegspunkt 
    void main()
    {
    
    	while(1) 
    	{
    
    		system("cls");
    		printf("\n\n\tFeld Auslesen\n");
    		printf("\t--------------");
    		const int N=7;
    		int Feld[N];
    		float Durchschnitt=1;
    		Array Deklaration
    		Feld[0]=16;
    		Feld[1]=1;
    		Feld[2]=2;
    		Feld[3]=4;
    		Feld[4]=4;
    		Feld[5]=2;
    		Feld[6]=2;
    		Durchschnitt=(1*Feld[1]+2*Feld[2]+3*Feld[3]+4*Feld[4]+5*Feld[5]+6*Feld[6])/Feld[0];
    		FeldAuslesen(Feld, N);
    		FeldEinlesen(Feld, N);
    		printf("\n\n\t Durchschnitt: %1.2f", Durchschnitt);
    		printf("\n\n\t-----------------------------");
    		getch();
    
    }//main
    //-------------------------------------------------------------------------------------------------------------
    void FeldAuslesen(int* Feld, int N)
    {
    	printf("\n\n\n");
    	for (int i=0; i<N;i++)
    		printf("%4i", Feld[i]);
    }
    //-------------------------------------------------------------------------------------------------------------
    void FeldEinlesen(int* Feld, int N)
    {
    	printf("\n\n\n");
    	for (int i=0; i<N;i++)
    		Feld[i]= rand()%49+1;
    }
    

    Das Feld 0 ist übrigens die Schüleranzahl. Felder 1-6 sind die verschiedenen Notenanzahlen.

    Das meiste hat unser Lehrer uns einfach hingeklatscht ohne was dazu zu sagen.

    Meine Probleme sind nun folgende:

    1. Der Compiler gibt mir das Ergebnis (also den Durchschnitt) nicht als Kommazahl aus. Sondern rundet es immer ab. Ich hab ja Float als datentyp da stehen. Wieso macht er das? Wie kann ich das ändern?

    2. Ich bin nach tagelangem nachforschen immernoch nicht dahinter gekommen, wofür genau die Feldeinlesen und Feldauslesen Funktion gut ist und wie sie arbeitet. Kann mir die Funktionsweise der beiden mal bitte jemand erläutern und sagen wozu sie notwendig sind?

    3. (Ist nicht wichtig, aber wenn mir das noch einer zeigen könnte wär das auch cool 🙂 ) Ich möchte irgendwie hinkriegen, dass er mir für die Arrays zufällige Zahlen eingibt. Die Schüleranzahl soll z.B 20 sein und dann soll er die Notenzahlen zufällig auf diese 20 Schüler verteilen. Aber das ist drittrangig. Wichtig ist erstmal, dass ich das mit der aus und eingabe schnalle 😃



  • An der Berechnung sind nur int-Werte beteiligt. Also wird auch in int gerechnet.
    Es reicht einen Fließkommawert anzugeben (als Literal oder als cast)

    Durchschnitt=(1*Feld[1]+2*Feld[2]+3*Feld[3]+4*Feld[4]+5*Feld[5]+6*Feld[6])*1.0/Feld[0]; // die 1.0 ist das Literal
    // oder
    Durchschnitt=(1*Feld[1]+2*Feld[2]+3*Feld[3]+4*Feld[4]+5*Feld[5]+6*Feld[6])/(float)Feld[0]; // als cast
    

    FeldAuslesen dient zum Anzeigen des Feldes auf den Bildschirm.
    Dazu wird die Anfangsadresse und die Größe des Feldes übergeben.
    Da fehlen ein paar Leerzeichen oder \n bei der Ausgabe.

    FeldEinlesen dient zum Befüllen des Feldes mit Zufallswerten.
    Dazu wird die Anfangsadresse und die Größe des Feldes übergeben.
    Die Funktion ist aber falsch implementiert. Feld[0] wird falsch befüllt.

    Der Formatspecifier %f von printf erwartet als Längenangabe die gesamtzahl der Zeichen vor dem Punkt. Danach die Nachkommstellen.
    Wenn du eine Vorkommastelle und zwei Nachkommstellen haben willst ist die Angabe %4.2f (der Punkt zählt mit)

    Nutze beim nächsten mal bitte die Code-Tags (Code mit der Maus markieren uznd auf den C-Button unter dem 😡 klicken)
    Zudem ist das C und nicht C++ (falsches Unterforum)



  • Zu 3.
    Ermittele in einer Schleife z.B. 20 Zufallszahlen im Bereich von 1 bis 6 (die Noten)
    Abhängig von den Noten erhöhst du jedesmal den entsprechenden Eintrag von Feld[] um Eins.
    (nicht vergessen vorher das Feld mit Nullen zu befüllen).



    1. Da du nur mit int rechnest, kommt ein ganzzahliges Ergebnis raus.
      Mit
    Durchschnitt=(1*Feld[1]+2*Feld[2]+3*Feld[3]+4*Feld[4]+5*Feld[5]+6*Feld[6])/(float)Feld[0];
    

    erhältst du Nachkommastellen. Ich kann in der Rechnung an sich aber keinen Zusammenhang mit "Durchschnitt" erkennen.

    1. es muss int main heißen
    2. das alles ist C, nicht C++
    3. FeldEinlesen macht, was du unter 3 suchst. Was FeldAuslesen macht ist doch wohl nicht so schwer, dass du hier danach fragen musst!


  • Dankeschön 🙂 das hilft mir schon weiter.
    Ich verstehe aber eins noch nicht:

    printf("\n\n\n");
    for (int i=0; i<N;i++)
    Feld[i]= rand()%49+1;

    Was genau macht die fett gedruckte Zeile. Rand ist ja für einen zufälligen Wert. Aber wieso steht ein i statt ein N in dem Feld und warum ist die Klammer bei rand leer?

    Also ich hab mal probiert das Feldeinlesen wegzulassen. Dann schmeißt er mir nur hunderte von irgendwelchen Zahlen in die Konsole. Wieso das? Ich dachte das Auslesen erstellt bereits ein Feld.



  • Cabooze schrieb:

    Aber wieso steht ein i statt ein N in dem Feld

    Weil das der Index ist und du ja das ganze Feld füllen willst.

    Cabooze schrieb:

    und warum ist die Klammer bei rand leer?

    Weil da kein Paramter nötig ist.
    Guckst du hier: http://www.cplusplus.com/reference/cstdlib/rand/

    Cabooze schrieb:

    Also ich hab mal probiert das Feldeinlesen wegzulassen. Dann schmeißt er mir nur hunderte von irgendwelchen Zahlen in die Konsole. Wieso das? Ich dachte das Auslesen erstellt bereits ein Feld.

    Das FeldEinlesen sollte keine Auswirkungen auf dein Programm haben, da du es erst ganz am Ende aufrufst.
    FeldAuslesen erstellt kein Feld. Das passiert durch die Definition in Zeile 22.
    Gefüllt wird es ab Zeile 25.
    Zeile 24 macht einen Fehler. Bitte nur Originalcode per Copy&Paste.

    Du hattest vorhin noch eine Frage zu printf: http://www.cplusplus.com/reference/cstdio/printf/



  • Okay danke. Dann hab ich das Grundprinzip verstanden denk ich 🙂


Log in to reply