Brutto in Netto rechner funktioniert nicht

… richtig!

So folgendes problem ich bin zurzeit dabei die sprache C zu lernen, als kleine Übung habe ich von meinem Vater die Aufgabe bekommen, ein tool zu entwickeln mit dem man Brutto in Netto und anders herum rechnen kann, heißt es rechnet 19% mwst vom Bruttowert ab gibt, den wert aus und zeigt den nettobetrag an. Selbiges macht es beim nettobetrag aber eben anderstrum.
Da das Programm auch von weniger versierten Nutzern verwendet werden soll habe ich mit einem script aus dem netzt den ich angepasst habe, geändert das man anstatt dem
‚.‘ bei einer kommazahl ein ‚,‘ angeben kann um unnötige anrufe zu vermeiden ;D.
aber irgendwie spuckt das Programm dadurch falsche lösungen aus meist weichen sie nur wenige Cent vom richtigen Ergebnis ab (und auch nur wenn ein komma ins spiel kommt), Allerdings kann ich meinen Fehler einfach nicht finden. bitte werft mal einen Blick drauf.

zum script noch ich weiß er ist nicht perfekt und es gibt sogar „goto“ wie gesagt ich bin noch am lernen.

Bitte lösungsvorschläge genau erklären^^

danke.

http://paste2.org/p/1573150

code liegt auf anderer seite um das Format zu wahren

Hallo Fragewurm,

 mwst=(x\*19)/100;

Also:

x = float
mwst = double
19 und 100 = integer

Wie jetzt genau gerechnet wird hängt nun von deinem Compiler und dessen Optimierung ab.
Besser ist es folgendes zu schreiben:

 mwst=(x\*19 **.0** )/100 **.0** ;

Selbiges gilt auch für

 netto=(x/81)\*100;

code liegt auf anderer seite um das Format zu wahren

Du kannst den Code hier reinstellen und mit dem -Tag versehen.

MfG Peter(TOO)

Hallo,

ein paar Korrekturen:

  • Es fehlt ein

    #include

darin ist strlen definiert.

scanf ("%s", &zahl);

ist falsch, da zahl schon ein Zeiger ist.
Richtig ist daher

scanf ("%s", zahl);

Mein Compiler (gcc) liefert die Warnung

a.c:37: Warnung: format »%s« erwartet Typ »char \*«, aber Argument 2 hat Typ »char (\*)[10]«

aus.

for (i=0; i
Da sind einige Semikoli zuviel. Verwende am besten die automatische Einrückung des Editors, wenn er dies falsch einrückt (so wie unter http://paste2.org/p/1573150 angegeben), dann verwende einen anderen, der dies richtig kann.
Richtig:


    
    for (i=0; i
    Besser, da das _i_ nur an der Stelle definiert ist, an der es auch verwendet wird:
    
    
        
        for (int i=0; i
        Dies ist wahrscheinlich auch die Fehlerquelle. Was mit Deinem Code passiert ist, dass erst die Schleife bis zum Ende der Zeichenkette _zahl_ durchlaufen wird (der Schleifenrumpf ist die leere Anweisung). Als nächstes kommt das _if_, da aber _i = strlen(zahl)_ ist, ist _zahl[i] immer == '\0'_, und der Rumpf ist auch wieder leer. Dann wird _zahl[i] (= zahl[strlen(zahl)])_ auf '.' gesetzt. Damit überschreibst Du die schließende \0 von der Zeichenkette _zahl_ mit einem '.'. Füge mal in Deinem Code nach der Schleife
        
        
            
            printf("%sX\n", zahl);
        
        
        
        ein und schaue, was Dir ausgegeben wird.
  • Und nun noch zwei mathematische Fehler:
    Falsch:

    printf(" Der Brutobetrag bel\x84uft sich auf %.2f Euro \n\n",x-mwst);

Richtig:

 printf(" Der Bruttobetrag bel\x84uft sich auf %.2f Euro \n\n",x+mwst);

Falsch:

netto=(x/81)\*100; 
printf("\n\n Die Mehrwertsteuer betr\x84gt %.2f Euro\n",netto-x);

Richtig:

netto=(x/119)\*100; 
printf("\n\n Die Mehrwertsteuer betr\x84gt %.2f Euro\n",x-netto);

(Und es gilt nicht netto=x*0.81.)

Die Berechnung

mwst=(x\*19)/100;

ist in Ordnung, da durch die Klammern sichergestellt ist, dass erst x * 19 durchgeführt wird (Ergebnis ist ein float), anschließend / 100 gerechnet wird, wieder ein float als Ergebnis.

zum script noch ich weiß er ist nicht perfekt und es gibt
sogar „goto“ wie gesagt ich bin noch am lernen.

Gerade da Du lernst solltest Du kein goto verwenden.

Howdy,

neben dem Gesagten gilt auch noch brutto=1.19*netto (oder netto=brutto/1.19). Bei der Ausgabe kann sich dann ergeben, dass Aufgrund von Rundung z.b. ein Wert von 42.02 fuer brutto2netto(50.0) ausgegeben wird.

brutto 50.0 netto 42.02 mwst 7.98

Die Kontrollrechung 42.02 + 19% ergibt dann einen Wert ungleich 50.0.

Defacto haben wir es hier aber mit einem netto-Wert von
ca. 42,01680672268908 zu tun, der nur gerundet als 42.02
ausgegeben wird.

Bitte also (Originalposter) immer im Hinterkopf haben, dass Computer Darstellungen von Realzahlen (float, double) ungenau sind oder sein können.

Gruss
norsemanna

danke für deine wie auch schon beim letzten mal sehr umfangreiche antwort.

bis zu dem zeitpunkt deiner antwort hatte ich bereits eine lösung gefunden. korrigierter script hier

http://paste2.org/p/1574430

/\* --N2B and BaCK (c) By TimHartmann-- \*/

#include 
#include 
#include 

 main()

 {
 int wahl, i;
 double mwst,netto;
 float x;
 char tmp[10];
 menue:
 system("cls");
 printf("\n\t\t\t Brutto, Netto Rechner");
 printf("\n\t\t\t -----------------------\n\n");
 printf("\n Bitte waehle eine Zahl oder druecke 'h' fuer Hilfe!\n"
 " Um Das Programm zu beenden Bitte 'x' eingeben!\n\n");
 printf("\n 1 Netto --\> Brutto\n\n"
 " 2 Brutto --\> Netto\n\n");
 wahl=getch();

 switch(wahl){

 case '1':

 printf("\n\n Bitte Nettobetrage eingeben: \n\n");
 scanf ("%s", &tmp); 
 for (i=0; i

Hallo,

bis zu dem zeitpunkt deiner antwort hatte ich bereits eine
lösung gefunden. korrigierter script hier

Das korrigiert das Ersetzen von ‚,‘ mit ‚.‘ (mein zweiten Punkt), die anderen Fehler bleiben bestehen, insbesondere die falsche Berechnung von Netto und Brutto. Teste mit
Netto --> Brutto: 1 --> 1.19
Brutto --> Netto: 1.19 --> 1

Übrigens: Bitte gebe als Stichwort nicht C++ an, da dies reiner C-Code ist.

Gruß
Diether