[C++] variablentyp für dezimal- bzw kommazahlen gesucht

warcraft9105

Erfahrenes Mitglied
Hallo,
schreibe gerade ein Programm wo man seine Schulnoten und alles eintragen und speichern kann. Jetzt will ich den Schnitt eines bestimmten Faches berechnen, dazu zähle ich die Anzahl der Noten eines Faches und addiere die Summe der Notenwertigkeit zusammen. Danach teile ich einfach die Summe durch die Anzahl, wie man das eben in der Schule glernt hat ;). Jetzt habe ich nur ein Problem: und zwar weis ich nicht welchen Datentypen ich für die variable verwenden soll.
Hier mal ein bisschen Code:
Code:
             int anzahlnoten = 0;
             int summenoten = 0;
             int art;
             float schnitt = 0;

             int jahr = Int32::Parse((cbox_schuljahr_note->SelectedIndex).ToString()) + 1;
             int fach = Int32::Parse((cbox_fach_note->SelectedIndex).ToString()) + 1;

             for(int i = 0; i < dlf_datensaetze->getCount(); i++)
             {
                 if(Int32::Parse(dlf_datensaetze->getFieldValue(i,0)) == jahr)
                 {
                     if(Int32::Parse(dlf_datensaetze->getFieldValue(i,1)) == fach)
                     {
                         switch(Int32::Parse(dlf_datensaetze->getFieldValue(i,3)))
                         {
                         case 0:
                             art = 1;
                             break;
                         case 1:
                             art = 1;
                             break;
                         case 2:
                             art = 2;
                             break;
                         }

                         summenoten += Int32::Parse(dlf_datensaetze->getFieldValue(i,4)) * art;
                         anzahlnoten += 1 * art;
                     }
                 }
             }
             if(anzahlnoten != 0)
             {
                 schnitt = summenoten / anzahlnoten;
                 lbl_schnitt_note->Text = schnitt.ToString();
             }
             else
             {
                 lbl_schnitt_note->Text = "Keine Noten vorhanden!";
             }

Hier habe ich es mit dem Datentyp float versucht. Geht aber auch nicht.

Bitte um Hilfe.

Danke, warcraft9105
 
Er hat mir nicht Kommazahlen sondern ganze Zahlen ausgegeben.
Weiß nicht warum ich da 1 * art geschrieben habe:D...
Hab den Fehler aber jetzt gefunden... ich muss die zwei Zahlen die ich teile (anzahlnoten, summenoten) auch als double bzw. float definieren, dann gehts.
Weißt du wie man die Länge von float oder double verändern kann?

MfG, warcraft9105
 
Sehr sonderbar. Sollte nicht normal das Ergebnis einer int Division ein Float/Double sein falls man es nicht explizit wieer als int speichert?

Weißt du wie man die Länge von float oder double verändern kann?
Sowiet ich weiß garnicht. Oder meinst du nur in der Ausgabe? Da du es als String in einer GUI ausgeben willst musste dir da schon selbst den String basteln z.B. über substr.

C++:
string schnittStr = schnitt.ToString();

lbl_schnitt_note->Text = schnittStr.substr(0, 4);

So sollten nur 2 Nachkommastellen (Falls immer nur eine Vorkommastelle vorhanden ist) ausgegeben werden. Allerdings ohne Rundungen.
 
Zuletzt bearbeitet von einem Moderator:
Sehr sonderbar. Sollte nicht normal das Ergebnis einer int Division ein Float/Double sein falls man es nicht explizit wieer als int speichert?
Nein, warum auch.
Es wird mit int dividiert also gibt es auch logischerweise einen int Wert zurück.

Und zur Ausgabe als String mit 2 Nachkomma
Code:
meinWert.ToString("0.00")
 
Genau das macht er, er konvertiert es implizit ;)

float fltTest = 5 / 2

-> 5 / 2 = 2,5, wird aber gerundet zu 2, weil das Ergebnis zuerst nur im Speicher als Integer vorliegt. Dann wird dieses Ergebnis in eine Floatvariable geschrieben und dabei natürlich implizit konvertiert (streng genommen nicht gecastet, wenn man nach dem Wortlaut der .NET Spezifikation geht). Das "nützt" dir aber natürlich nix mehr, der Wert im Speicher war Integer und daher natürlich schon gerundet.

Du musst dafür sorgen, dass zumindest 1 an der Rechenoperation beteiligter Datentyp ein Gleitkommatyp ist, damit der Wert im Speicher auch ein Gleitkommatyp wird. Also zB

float fltTest = (float)5 / 2

mfg
 
ValueMember ist für Datenbinding, was du laut deinem Code nicht machst.
(dann bräuchtest du auch nicht casten :D )

Was du benötigst wäre wohl SelectedItem
Code:
if(cb.SelectedItem!=null)
  return cd.SelectedItem.ToString();
oder über SelectedIndex
Code:
if(cb.SelectedIndex>=0)
  return cb.Items[cb.SelectedIndex].ToString();
 
Natürlich hab ich Display und ValueMember
Code:
 cbox_schuljahr_note->DataSource = dlf_schuljahr->getDataTable();
                        cbox_schuljahr_note->DisplayMember = "Jahr";
                        cbox_schuljahr_note->ValueMember = "schuljahr";

                     cbox_fach_note->DataSource = dlf_fach->getDataTable();
                        cbox_fach_note->DisplayMember = "Name";
                        cbox_fach_note->ValueMember = "fach";

Bis jetzt mache ich es ja noch über den Index aber was ist wenn ich die Combobox sortieren lasse dann stimmt der Indexwert nicht mehr mit dem überein das ich eigentlich will;)
Weißt du wie ich an den ValueMember komme

MfG, warcraft9105
 
Zurück