Problem mit einem C-Programm (11. Klasse)



  • Hallo Community,

    wir haben in der Schule eine Aufgabe bekommen, ein Brutto zu Netto Rechner zu erstellen.
    Wir sind an den Anfängen von C und bei meinem Programm treten 2 Fehler auf.

    Hier mal der Quellcode:

    /***********************************
    *Dateiname:          Brutto_zu_Netto.cpp
    *Projektname:        Brutto_zu_Netto
    *Programmierer:      J.-P. Meinert
    *Erstellt am:        16.01.2014
    *Letzte Änderung:    16.01.2014
    *Version:            1.0.0
    *Beschreibung:       Programm zum Erlernen der Softwareentwicklung mit C
    *Notizen:            Brutto zu Netto berechner
    /************************************/
    
    #include "targetver.h"
    #include <stdio.h>
    #include <tchar.h>
    #include <conio.h>
    #include <iostream>
    
    int main(void)
    {
    							//lokale Variablen definieren
    	int mehrwertsteuer;	//Festkommazahl bzw. Ganzzahldatentyp
    	float ergebnismehrwertsteuer;
    	float ergebnisnettowert;
    	float bruttowert;			//Gleitkommazahlen bzw. Fließkommadatentypen
    	unsigned char weiter;	//Zeichendatentyp für Tastencodes
    	int fehler;				//0:kein Fehler, 1:Fehler 1, 2:Fehler 2
    
    	//BS <- Überschrift, Beschreibung //BS...Bildschirm
    	printf("\nB R U T T O   Z U   N E T T O   R E C H N E R   Version 1.0 von J.-P. Meinert\n");
    	printf("\n\rDer Rechner verarbeitet zwei Flie%ckommazahlen mit",225);
    	printf("\n\rden Mehrwertsteuers%ctzen 7%c und 19%c.",132,37,37);
    	printf("\n\rAls Erstes geben Sie den Bruttowert ein, danach den gew%cnschten Prozentsatz.",129);
    	printf("\n\rAnschlie%cend wird das Ergebnis angezeigt.",225);
    	printf("\n\rAlle Eingaben sind mit ENTER zu best%ctigen.",132);
    	printf("\n\rAnsonsten wird das Programm beendet.\n");
    
    	do
    	{
    								// BS <- "Bruttowert: "
    		printf("\n\tBruttowert: ");
    								//operand1 <- TASTATUR
    		scanf("%d",&bruttowert);fflush(stdin);	//Einlesen und Tastaturpuffer löschen
    								//BS <- "Mehrwertsteuersatz 7% oder 19%: "
    		printf("\t\nMehrwertsteuersatz 7%c oder 19%c: ",37,37);
    		do
    		{
    								//op <- TASTATUR //!!!Fehleingaben abfangen
    		mehrwertsteuer=getchar();fflush(stdin);	//Einlesen und Tastaturpuffer löschen
    			}while(!((mehrwertsteuer=='7') || (mehrwertsteuer=='19')));	
    
    								//Mehrfachauswahl zur Verarbeitung der Rechenoperation
    		switch(mehrwertsteuer)
    		{
    			case '7': //Mehrwertsteuer 7%
    					  ergebnismehrwertsteuer=(float)bruttowert / (int)107 * (int)7;
    					  ergebnisnettowert=(float)bruttowert / (int)107 * (int)100;
    					  break;
    			case '19': //Mehrwertsteuer 19%
    					  ergebnismehrwertsteuer=(float)bruttowert / (int)119 * (int)19;
    					  ergebnisnettowert=(float)bruttowert / (int)119 * (int)100;
    					  break;
    		}
    
    		printf("\n\tErgebnis Mehrwertsteuer: %.2f",ergebnismehrwertsteuer);
    		printf("\n\tErgebnis Nettowert: %.2f",ergebnisnettowert);
    
    		//BS-Ausgabe
    	printf("\n\n\tUm eine neue Rechnung zu starten, Taste ENTER dr%ccken, sonst beenden.\n",129);
    	//weiter <- Tastatur
    	weiter=getch();fflush(stdin); //Tastaturpuffer löschen
    	printf("\n\t---------------------------------------------------------------------\n");
    
    	}while(weiter==13);
    
    	system("PAUSE");
    	return 0;
    }
    

    Folgende Fehler treten auf:
    -Es nimmt die Zahl 19 nicht als Ergebnis für den Mehrwertsteuersatz
    -Es gibt mir als Ergebnis für die ausgerechnete Mehrwertsteuer und den Nettowert 0 aus

    Hoffe ihr könnt mir helfen. 🙄

    Gruß,
    allied



  • Du schreibst immer '7' und '19' obwohl du 7 und 19 meinst, warum? Schau dir nochmal an, wie man Literale der verschiedenen Typen schreibt.



  • '19' wären zwei Zeichen. getchar liest nur eins ein.
    getchar ist dafür die falsche Funktion

    Bei scanf dient %d zum einlesen von (Dezimal)-Integern. bruttowert ist aber bei dir ein float .

    Prozentzeichen gibt man bei printf aus, indem man es doppelt angibt.

    printf("Mehrwertsteuersatz 7%% oder 19%%:")
    

    Und wenn du soviel Wert auf Umlaute legst, kannst du die auch als hexadezimale Konstanten im Stringliteral angeben.

    printf("dr\x81cken");
    

    Mit der 13 meinst du sicherlich '\n' von der Entertaste. Dann schreib auch '\n' statt 13.
    (In diesem Fall ist das ein Zeichen, da der Compiler durch den \ erkennt, dass jetzt noch ein Zeichen kommt und er diese besonders behandeln muss.)



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Wenn du C programmierst, solltest du nicht iostream einbinden und deine Datei .c und nicht .cpp am Ende nenen, da beides C++ ist.

    Außerdem ist der Beitrag dann im falschen Forum.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C (C89, C99 und C11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • allied schrieb:

    Folgende Fehler treten auf:
    -Es nimmt die Zahl 19 nicht als Ergebnis für den Mehrwertsteuersatz
    -Es gibt mir als Ergebnis für die ausgerechnete Mehrwertsteuer und den Nettowert 0 aus

    Das ist so, weil diese Kombination gleich mehrere Fehler bzw. Probleme enthält.

    int mehrwertsteuer;	//Festkommazahl bzw. Ganzzahldatentyp
    mehrwertsteuer=getchar();
    switch(mehrwertsteuer) {
       case '19': //Mehrwertsteuer 19%
    

    1. getchar liest jeweils nur ein Zeichen der Standardeingabe und liefert dessen Ordnungszahl als Integer (siehe DirkB)
    Man kann zudem nur einstellige Zahlen einlesen.
    Es wäre besser eine Zeichenkette einzulesen und diese in eine Zahl umzuwandeln [atoi()]
    Einige Zeilen davor hat das doch auch schon (fast) funktioniert ->( scanf("%d",&bruttowert)) - wobei
    das mit dem Datentyp float auch noch Blödsinn ist (float bruttowert)

    2. Die switch Anweisung kann mit '19' nicht viel anfangen, hier wäre ein Integer sinnvoll.

    3. Mit Ziffern kann man nur schlecht rechnen, Integer besser.

    In der Regel hilft auch das Lesen der Doku (hier: VisualStudio)
    http://msdn.microsoft.com/en-us/library/x198c66c.aspx

    Die beiden Zeilen

    #include "targetver.h"
    #include <tchar.h>
    

    werden nicht verwendet und können somit entfallen. Sollte der Code Unicode-kompatibel
    verfasst werden würde <tchar.h> Sinn machen, Dann müsste man die Strings aber anders kodieren.

    Folgende Anweisung ist C++ und gehört hier garnicht hin (schon gesagt)

    #include <iostream>
    

    Bei Geld hört der Spass auf und deshalb NIEMALS Geld in float oder double verarbeiten. Es treten Rundungsfehler auf und einige Werte lassen sich garnicht
    erst zuweisen.

    float ergebnismehrwertsteuer;
      float ergebnisnettowert;
      float bruttowert;                //Gleitkommazahlen bzw. Fließkommadatentypen
    

    Folgendes ist zwar einfach und "billig" hat aber einige Nachteile, die hier
    auch bereits mehrfach ausdiskutiert wurden.

    system("PAUSE");
    

    Den Hilfetext sowie das Menu würde ich in Unterprogramme auslagern.
    Auch für andere Teile würden sich Unterprogramme anbieten.



  • Ich kenn mich noch nicht wirklich in C aus und kann auch nur daher das verwenden, was wir im Unterricht gemacht haben. Uns wurde vieles nicht genau erklärt, daher solch ein Code der für euch recht komisch erscheinen wird. ^^
    Ich kann bloß auf das zurückgreifen was wir in unserem Unterricht verwendet wurde.

    Das einzige was wir bis jetzt programmiert hatten war ein Basisrechner, der auf diesen Codes basiert.

    Gibt es Wege die Fehler mit kleinen Änderungen auszubessern?

    Danke schonmal für alle Antworten und sorry das ich's in das falsche Forum gepostet habe.

    Grüße,
    allied



  • Lies die mehrwertsteuer mit scanf ein. Dazu ist es da.

    Die Zeichenliterale musst du dann noch in Zahlenliterale umändern. ('7' zu 7)



  • Hab die "Literale" schon weggenommen, dann erkennt er es nichtmehr und die 7 geht auch nichtmehr. 😕



  • allied schrieb:

    Hab die "Literale" schon weggenommen, dann erkennt er es nichtmehr und die 7 geht auch nichtmehr. 😕

    Das etwas lockere "umändern" bedeutet nicht "weglassen" sondern eher eine Funktion aufrufen, die sowas macht. Hier käme z.B. atoi() infrage.



  • merano schrieb:

    Hier käme z.B. atoi() infrage.

    Aber nicht, wenn er die Zeichen mit getchar einliest.
    @allied
    getchar liest einzelne Zeichen ein. Und das Zeichen das die 7 darstellt ('7') hat einen anderen Wert als 7.

    Daher ist getchar die falsche Funktion dafür. Vor allem, weil die 19 auch aus zwei Zeichen besteht.

    DirkB schrieb:

    Lies die mehrwertsteuer mit scanf ein.

    Sonst zeig nochmal deinen aktuellen Code.



  • scanf("%d",&mehrwertsteuer);fflush(stdin);
    

    jetzt greift aber der switch nichtmehr ein und es nimmt jeden prozentsatz

    und ausrechnen tut es mir das ergebnis immer noch nicht



  • Das wird nur noch ein rumgerate.

    DirkB schrieb:

    Sonst zeig nochmal deinen aktuellen Code.



  • Also er nimmt jetzt die 7 und die 19. (:

    Wenn ich <iostream> rausnehme geht das system("Pause") aber nichtmehr

    #include "targetver.h"
    #include <stdio.h>
    #include <tchar.h>
    #include <conio.h>
    #include <iostream>
    
    int main(void)
    {
    							//lokale Variablen definieren
    	int mehrwertsteuer;	//Festkommazahl bzw. Ganzzahldatentyp
    	float ergebnismehrwertsteuer;
    	float ergebnisnettowert;
    	float bruttowert;			//Gleitkommazahlen bzw. Fließkommadatentypen
    	unsigned char weiter;	//Zeichendatentyp für Tastencodes
    	int fehler;				//0:kein Fehler, 1:Fehler 1, 2:Fehler 2
    
    	//BS <- Überschrift, Beschreibung //BS...Bildschirm
    	printf("\nB R U T T O   Z U   N E T T O   R E C H N E R   Version 1.0 von J.-P. Meinert\n");
    	printf("\n\rDer Rechner verarbeitet zwei Flie%ckommazahlen mit",225);
    	printf("\n\rden Mehrwertsteuers%ctzen 7%c und 19%c.",132,37,37);
    	printf("\n\rAls Erstes geben Sie den Bruttowert ein, danach den gew%cnschten Prozentsatz.",129);
    	printf("\n\rAnschlie%cend wird das Ergebnis angezeigt.",225);
    	printf("\n\rAlle Eingaben sind mit ENTER zu best%ctigen.",132);
    	printf("\n\rAnsonsten wird das Programm beendet.\n");
    
    	do
    	{
    								// BS <- "Bruttowert: "
    		printf("\n\tBruttowert: ");
    								//operand1 <- TASTATUR
    		scanf("%d",&bruttowert);fflush(stdin);	//Einlesen und Tastaturpuffer löschen
    								//BS <- "Mehrwertsteuersatz 7% oder 19%: "
    		printf("\t\nMehrwertsteuersatz 7%c oder 19%c: ",37,37);
    		do
    		{
    								//mehrwertsteuer <- TASTATUR //!!!Fehleingaben abfangen
    		scanf("%d",&mehrwertsteuer);fflush(stdin);
    			}while(!((mehrwertsteuer==7) || (mehrwertsteuer==19)));
    
    								//Mehrfachauswahl zur Verarbeitung der Rechenoperation
    		switch(mehrwertsteuer)
    		{
    			case 7: //Mehrwertsteuer 7%
    					  ergebnismehrwertsteuer=(float)bruttowert / (int)107 * (int)7;
    					  ergebnisnettowert=(float)bruttowert / (int)107 * (int)100;
    					  break;
    			case 19: //Mehrwertsteuer 19%
    					  ergebnismehrwertsteuer=(float)bruttowert / (int)119 * (int)19;
    					  ergebnisnettowert=(float)bruttowert / (int)119 * (int)100;
    					  break;
    		}
    
    		printf("\n\tErgebnis Mehrwertsteuer: %.2f",ergebnismehrwertsteuer);
    		printf("\n\tErgebnis Nettowert: %.2f",ergebnisnettowert);
    
    		//BS-Ausgabe
    	printf("\n\n\tUm eine neue Rechnung zu starten, Taste ENTER dr%ccken, sonst beenden.\n",129);
    	//weiter <- Tastatur
    	weiter=getch();fflush(stdin); //Tastaturpuffer löschen
    	printf("\n\t---------------------------------------------------------------------\n");
    
    	}while(weiter==13);
    
    	system("PAUSE");
    	return 0;
    }
    


  • Die Mehrwertsteuer hast du jetzt als Zahlenwert. Da brauchst du das switch gar nicht.

    ergebnismehrwertsteuer = bruttowert / (100+mehrwertsteuer) * mehrwertsteuer;
                          ergebnisnettowert      = bruttowert / (100+mehrwertsteuer) * 100;
    

    Die casts brauchst du da auch nicht, da sie nichts verändert haben.
    (und bruttowert auch schon ein Fleißkommatyp ist)

    iostream ist übrigens C++. Du programmierst aber C.

    Und system brauchst du nicht. Führe das Programm in der Konsole (CMD-Fenster) aus und es geht.
    Für C ist system in der stdlib.h



  • Das macht auf jedenfall Sinn 😃

    Aber ausrechnen tut es immer noch nicht 😕

    #include "targetver.h"
    #include <stdio.h>
    #include <tchar.h>
    #include <conio.h>
    
    int main(void)
    {
    							//lokale Variablen definieren
    	int mehrwertsteuer;	//Festkommazahl bzw. Ganzzahldatentyp
    	float ergebnismehrwertsteuer;
    	float ergebnisnettowert;
    	float bruttowert;			//Gleitkommazahlen bzw. Fließkommadatentypen
    	unsigned char weiter;	//Zeichendatentyp für Tastencodes
    	int fehler;				//0:kein Fehler, 1:Fehler 1, 2:Fehler 2
    
    	//BS <- Überschrift, Beschreibung //BS...Bildschirm
    	printf("\nB R U T T O   Z U   N E T T O   R E C H N E R   Version 1.0 von J.-P. Meinert\n");
    	printf("\n\rDer Rechner verarbeitet zwei Flie%ckommazahlen mit",225);
    	printf("\n\rden Mehrwertsteuers%ctzen 7%c und 19%c.",132,37,37);
    	printf("\n\rAls Erstes geben Sie den Bruttowert ein, danach den gew%cnschten Prozentsatz.",129);
    	printf("\n\rAnschlie%cend wird das Ergebnis angezeigt.",225);
    	printf("\n\rAlle Eingaben sind mit ENTER zu best%ctigen.",132);
    	printf("\n\rAnsonsten wird das Programm beendet.\n");
    
    	do
    	{
    								// BS <- "Bruttowert: "
    		printf("\n\tBruttowert: ");
    								//operand1 <- TASTATUR
    		scanf("%d",&bruttowert);fflush(stdin);	//Einlesen und Tastaturpuffer löschen
    								//BS <- "Mehrwertsteuersatz 7% oder 19%: "
    		printf("\t\nMehrwertsteuersatz 7%c oder 19%c: ",37,37);
    
    		do
    		{
    								//mehrwertsteuer <- TASTATUR //!!!Fehleingaben abfangen
    		scanf("%d",&mehrwertsteuer);fflush(stdin);
    			}while(!((mehrwertsteuer==7) || (mehrwertsteuer==19)));
    
    		ergebnismehrwertsteuer = bruttowert / (100+mehrwertsteuer) * mehrwertsteuer; 
            ergebnisnettowert = bruttowert / (100+mehrwertsteuer) * 100;
    
    		printf("\n\tErgebnis Mehrwertsteuer: %.2f",ergebnismehrwertsteuer);
    		printf("\n\tErgebnis Nettowert: %.2f",ergebnisnettowert);
    
    		//BS-Ausgabe
    	printf("\n\n\tUm eine neue Rechnung zu starten, Taste ENTER dr%ccken, sonst beenden.\n",129);
    	//weiter <- Tastatur
    	weiter=getch();fflush(stdin); //Tastaturpuffer löschen
    	printf("\n\t---------------------------------------------------------------------\n");
    
    	}while(weiter==13);
    
    	return 0;
    }
    


  • Du bist ein unbelehrbarer Noob.
    Dein Code ist genauso Schrott wie zu Beginn.
    Du hast alle hier gegebenen Hinweise nicht beachtet und wunderst dich, dass dein Schrottprogramm nach wie vor nicht läuft.
    Ich empfehle allen Hilfestellern hier aus dem Grund, dir nicht weiter zu helfen.



  • Wutz schrieb:

    Ich empfehle allen Hilfestellern hier aus dem Grund, dir nicht weiter zu helfen.

    Einen noch: Zweite Antwort, dritte Zeile.


Anmelden zum Antworten