Notenberechnung: Prozentzahl Runden - HILFE!!!
-
Hallo zusammen,
ich wollte euch mal um Rat fragen, da ich aus den Antworten die Google mir ausspuckt leider nicht schlau werde...
Wie ihr vllt im folgenden sehen könnt bin ich noch nicht sehr geübt in c++ und daher haben mich die Foren-Beiträge zu diesem Thema die ich über Google finden konnte eher verwirrt anstatt zu helfen ^^Mein Problem besteht darin, dass ich aus einer Maximal erreichbaren Punktzahl und der erreichten Punktzahl den Prozentwert ausrechnen und diesen auch sinnvoll Runden soll.
Mein "Programm" sieht bisweilen so aus:
#include <iostream>
#include <stdlib.h>
#include <iomanip>using namespace std;
int main()
{
int prozent;
int erreichbar;
int erreicht;cout << "Wilkommen beim Notenrechner!" << endl;
cout << "Bitte geben Sie die maximal erreichbare Punktzahl ein!" << endl;
cin >> erreichbar;
cout << "Geben Sie nun die erreichten Punkte an:" << endl;
cin >> erreicht;prozent = (((erreicht * 100) / erreichbar) * 10 + 5) / 10;
if (prozent <= 100 && prozent >= 92)
{
cout << prozent << "% = " << "Note: Sehr Gut!" << endl;
}
if (prozent <= 91 && prozent >= 81)
{
cout << prozent << "% = " << "Note: Gut!" << endl;
}
if (prozent <= 80 && prozent >= 67)
{
cout << prozent << "% = " << "Note: Befriedigend!" << endl;
}
if (prozent <= 66 && prozent >= 50)
{
cout << prozent << "% = " << "Note: Ausreichend!" << endl;
}
if (prozent <= 49 && prozent >= 30)
{
cout << prozent << "% = " <<"Note: Mangelhaft!" << endl;
}
if (prozent <= 29 && prozent >= 0)
{
cout << prozent << "% = " << "Note: Ungenuegend!" << endl;
}
system ("Pause");
return 0;
}Alle Noten und Prozentzahlen werden zwar richtig berechnet und ausgegeben aber eben nicht gerundet. Ich habe es mit 98.5 von 100 möglichen Punkten versucht jedoch wird egal was ich mache immer 98% angezeigt -.-
Es wäre sehr nett wenn ihr mir noch ein paar befehle die mir im Zusammenhang mit den Recherchen häufig über den Weg gelaufen sind erläutern könntet:
- float
- double
- powIch hoffe ihr könnt mir weiterhelfen...
MfG Chris
-
Du rechnest dort mit Ganzzahlen - und da werden Nachkommastellen einfach abgeschnitten.
Ansonsten zu deinen Fragen: float und double sind Datentypen für Gleitkommazahlen, damit könntest du auch Werte ausgeben, die Nachkommastellen verwenden. pow() ist eine Funktion zur Berechnung von Potenzen ab.
-
Er rundet immer ab? Das würde ich ausnutzen, indem ich die nichterreichten Punkte nehme und deren Prozente ausrechnet (normal abgerundet).
erreichteProzente=100-nichterreichteProzente.
-
Erst mal vielen Dank für die schnellen Antworten
jedoch hilft mir das auch nicht viel weiter...
Dass ich mit Ganzzahlen rechne war mir schon irgendwie klar nur weiß ich nicht ob die Nachkommastellen schon während oder erst nach der Berechnung abgeschnitten werden und was genau muss ich im Quelltext ändern, um Gleitkommazahlen zu benutzen? Habe es bereits versucht, indem ich (float) davor geschrieben habe nur scheint das noch nicht alles zu sein, da es keine auswirkung hatte... ):
-
Die Nachkommastellen werden direkt bei der Berechnung abgeschnitten, wenn du zwei Ganzzahlen (int und Kollegen) dividierst. Und im Zweifelsfalls wird die Zahl spätestens dann gerundet, wenn du ihn in eine int-Variable zurückschreibst. Um mit Gleitkommazahlen zu arbeiten, mußt du deinen Variablen einen anderen Typ geben:
double prozent;
-
Achsoooo ^^
ich war die ganze Zeit auf int festgefahren, weil ich dachte es wäre die einzige Möglichkeit Variablen einzubinden o.0 nun wäre dieses Problem endlich gelöst
nun wäre nur noch gut zu wissen wie ich dem Programm sagen kann, dass es zwar mit diesen Gleitkommazahlen arbeiten, jedoch nur Ganze Zahlen Ausgeben soll..
-
Du kannst dem Ausgabestream sagen, wie genau er die Zahlen ausgeben kann per
cout.precision(1);
(Darstellung mit einer Stelle nach dem Komma).
-
OK, damit hast du mir sehr geholfen!
Vielen Dank für die Kompetente und schnelle Beratung und noch eine angenehme Nacht wünsche ich
-
http://www.c-plusplus.net/forum/39342
Shade Of Mine schrieb:
int d2i(double d) { return d<0?d-.5:d+.5; }
std::cout << (int)double_variable;
ginge auch noch.
-
Danke FreakY<3Cpp!
Das erste Zitat von dir habe ich zwar nicht im Geringsten verstanden, aber das zweite hat prima funktioniert
Es ist sehr gut, dass du noch gepostet hast, denn CStoll's Methode wollte nicht Funktionieren, da Visual C++ dafür eine integer Variable forderte und ich habe ja vorher alle Variablen extra auf double umgeschrieben, damit die Nachkommastellen überhaupt berechnet werden ^^P.S.: Den selben Beitrag habe ich mir vorher schonmal angesehen nur da bin ich überhaupt nicht draus schlau geworden
Danke nochmal an alle!
MfG Chris
-
FreakY<3Cpp schrieb:
http://www.c-plusplus.net/forum/39342
Shade Of Mine schrieb:
int d2i(double d) { return d<0?d-.5:d+.5; }
std::cout << (int)double_variable;
ginge auch noch.
Wenn er C++ programmiert, dann wäre
static_cast< int >( doubleVariable )
besser angebracht, als die alten C-Casts.
Lg freeG
-
Immer so eine Sache der Notwendigkeit meiner Ansicht nach. In .NET gibt es auch für fast jeden Kram ein Convert.To(), trotzdem kann man auch mal bei solchen Datentypen einen normalen Cast benutzen. Zumindest meine Meinung...
-
FreakY<3Cpp schrieb:
Immer so eine Sache der Notwendigkeit meiner Ansicht nach. In .NET gibt es auch für fast jeden Kram ein Convert.To(), trotzdem kann man auch mal bei solchen Datentypen einen normalen Cast benutzen. Zumindest meine Meinung...
Du vergleichst Äpfel mit Birnen. Die casts in .net Sprachen machen mehr, als nur den Typen zurechtzubiegen. C-casts machen das nicht und sollten möglichst nicht benutzt werden.
-
pr0pag4nda:
Das erste Beispiel hebelt einfach den Effekt aus, dass eine Konversion zu int immer die Nachkommastellen abschneidet. Ist die Zahl positiv, so wird eben 0,5 hinzuaddiert, sodass z.B. 12,5 zu 13,0 wird und damit alle Zahlen, die eigentlich aufgerundet werden müssten, ab sofort einfach in den Abrundungsbereich der nachfolgenden Zahl konvertiert werden -> korrektes Rundungsverhalten.Ist die Zahl kleiner, ist das natürlich andersrum. -0,6 muss ja zu -1 gerundet werden. Wenn man 0,5 hinzufügt, wird das aber auf 0 gerundet. Also zieht man 0,5 ab, ist bei -1,1 und die Rundung ist wieder korrekt.