Hallo,
Ich habe ein kleines Programm zum üben geschrieben:
#include <stdio.h>
#include <conio.h>
int main()
{
int eins,zwei,drei,vier,fuenf,sechs,summe;
float schnitt;
printf("\nNotendurchschnittsrechner\n");
printf("\t\nNote:\tAnzahl:\n");
printf(" I\t"); scanf("%i",&eins);
printf(" II\t"); scanf("%i",&zwei);
printf("III\t"); scanf("%i",&drei);
printf(" IV\t"); scanf("%i",&vier);
printf(" V\t"); scanf("%i",&fuenf);
printf(" VI\t"); scanf("%i",&sechs);
summe=eins+zwei+drei+vier+fuenf+sechs;
schnitt=(eins*1+zwei*2+drei*3+vier*4+fuenf*5+sechs*6)/summe;
printf("\nAnzahl der Schler: %i\n",summe);
printf("\nNotendurchschnitt: %.2f\n\n",schnitt);
printf("\n by Radon");
printf ("\n\t\t\tTaste druecken, um Programm zu beenden...");
getch();
}
Es soll den Notendurchschnitt einer Arbeit berechnen (Ich denke es ist
leicht zu verstehen). Das Problem ist, dass das Ergebnis auf ganze
Zahlen gerundet wird. Wisst ihr welchen Typ von Variable ich benutzen
sollte für Dezimalzahlen mit Kommastellen? Oder liegt es daran, dass in
der Rechnung schon gerundet wird?
Mfg Radon
Gehört nicht unmittelbar zur Fragestellung, könnte aber interessant
sein?
Runden, auf eine Stelle nach dem Komma ohne Verwendung von
Bibliotheken:
double dSum = 3.66;
sum = ((int)(sum * 10 + 0.5)) / 10; // sum = 3.7
2 Stellen nach dem Komma:
double dSum = 3.664;
sum = ((int)(sum * 100 + 0.5)) / 100; // sum = 3.66
Kann auch als Macro oder Inline-Funktion verwendet werden.
Blackbird
Code ist nicht getestet.
> double dSum = 3.66;> sum = ((int)(sum * 10 + 0.5)) / 10; // sum = 3.7
Das funktioniert so nicht, denn du führst eine Integer-Division durch.
Das Ergebnis wird keine Nachkommastellen mehr haben.
Auch, wenn du das behebst, geht das nur für positive Zahlen gut.
Danke an alle die mir geantwortet haben!
Ich habe es nacht Tobis Vorschlag gemacht:
schnitt=(float)(eins*1+zwei*2+drei*3+vier*4+fuenf*5+sechs*6)/(float)summ
e;
Vielen Dank dafür.
Einfach ein super Forum muss ich sagen. Immer nach ein paar Stundenen
massig Antworten!
Kate wrote:
> Können Sie mir bitte helfen diese aufgabe 9,1 muss ich aug ganze runden
Wo liegt das Problem?
Wenn du eine Fliesskommazahl an einen int zuweist, werden die
Nachkommastellen abgeschnitten.
Aus 3.2 wird so 3
Aber: aus 3.7 wird ebenfalls 3
Wenn man aber vorher zu der Zahl 0.5 dazuaddiert, dann wird
aus 3.2 zunächst 3.7 und davon die Kommastellen abgeschnitten
ergibt 3. So wie es sein soll.
Hat man 3.7, so wird das durch die Addition von 0.5 zu 4.2 und
davon die Kommastellen abgeschnitten macht das 4. Genau so wie
es sein soll. 3.7 auf ganze Zahlen gerundet ergibt 4
Für negative Zahlen läuft es andersrum, man muss 0.5 abziehen
Ein if mit ein Floating Wert kann gut gehen muss es aber nicht.
in sofern habe ich immer Bauchschmerzen wenn mir einer eine Lösung wie
if( Value > 0.0 )
vorschlagt.
außerdem stellt der Standardheader math.h die Funktion round zur
Verfügung die genau das macht, einen Floating Wert mathematisch korrekt
zu runden.
Sollte der Compiler die den Header nicht bereitstellen widerspricht das,
der ISO 9899:1999 und der Compiler sollte auf ein PC ausgemustert
werden. Hier gibt es wirklich genug Funktionierende ISO konforme
Compiler so das ich dort echt kein Grund sehe mich mit solchen Kaputen
fast C Compiler zum zu schlagen.
imon wrote:
> Ein if mit ein Floating Wert kann gut gehen muss es aber nicht.>> in sofern habe ich immer Bauchschmerzen wenn mir einer eine Lösung wie>> if( Value > 0.0 )>> vorschlagt.
Geb ich dir recht.
In dem Fall ist das aber ok. Entweder die Zahl ist positiv, ist
negativ oder aber sie ist 0. Es gibt herzlich wenig, was du
konkret hier gegen Rundungsfehler tun kannst.
Wenn du dir meine Beiträg hier in den Foren ansiehst, dann bin
ich normalerweise einer der ersten, der auf Rundungsfehler und
die damit zusammenhängenden Probleme hinweist :-)
> außerdem stellt der Standardheader math.h die Funktion round zur> Verfügung die genau das macht, einen Floating Wert mathematisch korrekt> zu runden.
Ooops. Jetzt rächt sich, dass ich mit C lange vor 1999 aufgehört
habe und zu C++ gewechselt bin.
Danke für die Info.
Schadet aber auch nichts, wenn der Frager weiss, wie man sowas
machen kann :-)