Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Komischer Fehler

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
09.09.2012, 00:59 Uhr
~Rumeos
Gast


Hallo miteinander

Ich habe ein Problem.

In der Schule bekamen wir ein Buch (C programmieren von Anfang an) welches eigentlich sehr gut ist.

Nun musste ich (Aufgabe vom Buch) ein erstes kleineres Programm erstellen welches Grad Celsius in verschiedene andere Temperaturen umwandeln sollte. Dies habe ich nun gemacht und eigentlich sollte auch alles richtig sein aber... zuerst mal den Code:

---------------------------------------------------------------------------------------


C++:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>                                                    //Präprozessor stdio wird eingefügt
#include <ctype.h>                                                    //Präprozessor ctype wird eingefügt

void main()                                                           //Hauptteil ohne Rückgabe kommt
{                                                                     //Hauptteil beginnt
     float temperatur;                                                //"temperatur" wird deklariert
     char zeichen;                                                    //"zeichen" wird deklariert
    
     printf("\n\tT E M P E R A T U R R E C H N E R\n");               //Titel
    
     printf("\n1 Fahrenheit \n2 Reamur \n3 Kelvin");                  //Auswahlmöglichkeiten
     printf("\n4 Rank \n0 Ende");                                     //Auswahlmöglichkeiten
    
     printf("\n\nAuswahl: ");                                         //Auswahl
     zeichen=getchar();                                               //Eingabe von "zeichen"
     fflush(stdin);                                                   //Enter-Fehlinterpreationsbeheber
     printf("\n");                                                    //Zeilenabstand
    
     switch(zeichen)                                                  //Wechsel zu "zeichen"
     {                                                                //Erster "zeichen"-Block beginnt
         case '0':                                                    //Wenn 0 eingegeben wurde
              break;                                                  //beende Block
        
         case '1': case '2': case '3':case '4':                       //wenn 1,2,3 oder 4 eingegeben wurde
              printf("Bitte Grad Celsius eingeben: ");                //Eingabe Aufforderung
              scanf("%f",&temperatur);                                //Eingabe von "temperatur"
              fflush(stdin);                                          //Enter-Fehlinterpreationsbeheber
                                                                      //beende Block                
        
         if(temperatur>=-273.15)                                      //Wenn temperatur grösser oder gleich -273.15
              switch(zeichen)                                         //wechsle zu "zeichen"
              {                                                       //Zweiter "zeichen"-Block beginnt
                   case '1':                                          //Wenn "zeichen" gleich 1
                        printf("\n%2.f Grad sind %2.f Fahrenheit",    //Ausgabe (Resultat)
                        temperatur,9.0/5.0*temperatur+32.0);          //Ausgabe (Resultat)
                        getchar();                                    //Enter-Eingabe Aufforderung
                  
                   case '2':                                          //Wenn "zeichen" gleich 2
                        printf("\n%2.f Grad sind %2.f Reamur",        //Ausgabe (Resultat)
                        temperatur,4.0/5.0*temperatur);               //Ausgabe (Resultat)
                        getchar();                                    //Enter-Eingabe Aufforderung
                  
                   case '3':                                          //Wenn "zeichen" gleich 3
                        printf("\n%2.f Grad sind %2.f Kelvin",        //Ausgabe (Resultat)
                        temperatur,temperatur+273.15);                //Ausgabe (Resultat)
                        getchar();                                    //Enter-Eingabe Aufforderung
                  
                   case '4':                                          //Wenn "zeichen" gleich 4              
                        printf("\n%2.f Grad sind %2.f Rank",          //Ausgabe (Resultat)
                        temperatur,9.0/5.0*(temperatur+273.15));      //Ausgabe (Resultat)
                        getchar();                                    //Enter-Eingabe Aufforderung
                        
                        break;                                        //Beende Block
              
              }                                                       //Zweiter "zeichen"-Block endet  
              
              else                                                    //Wenn if nicht zutrifft
                  printf("\nDiese Temperatur gibt es nicht!");        //Ausgabe (Resultat)
                  getchar();                                          //Enter-Eingabe Aufforderung
                  
              default:
                  printf("Ungueltige Option!");                       //Wenn kein Case zutrifft
                  getchar();                                          //Enter-Eingabe Aufforderung    
                                                                              
     }                                                                //Erster "zeichen"-Block endet
    
    
        
}                                                                     //Hauptteil endet



--------------------------------------------------------------------------------------

Sorry für die vielen Kommentare

Nun aber zu meinem Problem. Das Programm sollte wie gesagt je nach gewählter Zahl die danach eingegebene Temperatur in eine andere Einheit umwandeln.

Gibt man aber bei diesem Programm z.B. 1 für Fahrenheit ein, und danach die Temperatur kommt nicht nur die umgewandelte Temperatur in Fahrenheit sondern gleich alle.

Hoffe ihr könnt mir helfen!

MfG Rumeos

Bearbeitung von 0xdeadbeef:

edit- durch cpp-Tags ersetzt


Dieser Post wurde am 09.09.2012 um 01:56 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.09.2012, 02:05 Uhr
0xdeadbeef
Gott
(Operator)


Das liegt daran, dass du in den einzelnen cases kein

C++:
break;


stehen hast.

Ansonsten noch ein paar Anmerkungen:

C++:
void main()


ist durch den Standard nicht gedeckt; der Rückgabetyp von main ist immer int. Per Konvention steht ein Rückgabewert von 0 für "alles gut gelaufen" und andere Werte für Fehlercodes. Daher:

C++:
int main(void) {
  // Dein Code

  return 0;
}


Moderne Compiler hauen dir die andere Variante gerne mal um die Ohren.

Gleiches gilt für

C++:
fflush(stdin);


Das ist ebenfalls nicht standardkonform -- fflush ist nur für Ausgabeströme definiert. Man kann eine Toilette spülen, aber halt keinen Wasserhahn. Was du vermutlich meintest, ist etwas wie

C++:
int c;

do { c = getchar(); } while(c != EOF && c != '\n');


...welches alle Zeichen bis zum Ende der Zeile ignoriert. fflush auf Eingabeströmen ist eine Microsoft-Erweiterung, die auch dort nicht wirklich wohldefiniert ist. Das kriegst du spätestens zu spüren, wenn jemand versucht, dein Programm zu skripten und Dateien nach stdin umleitet.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.09.2012, 11:47 Uhr
Rumeos




Zitat von 0xdeadbeef:
Das liegt daran, dass du in den einzelnen cases kein

C++:
break;


stehen hast.

Ansonsten noch ein paar Anmerkungen:

C++:
void main()


ist durch den Standard nicht gedeckt; der Rückgabetyp von main ist immer int. Per Konvention steht ein Rückgabewert von 0 für "alles gut gelaufen" und andere Werte für Fehlercodes. Daher:

C++:
int main(void) {
  // Dein Code

  return 0;
}


Moderne Compiler hauen dir die andere Variante gerne mal um die Ohren.

Gleiches gilt für

C++:
fflush(stdin);


Das ist ebenfalls nicht standardkonform -- fflush ist nur für Ausgabeströme definiert. Man kann eine Toilette spülen, aber halt keinen Wasserhahn. Was du vermutlich meintest, ist etwas wie

C++:
int c;

do { c = getchar(); } while(c != EOF && c != '\n');


...welches alle Zeichen bis zum Ende der Zeile ignoriert. fflush auf Eingabeströmen ist eine Microsoft-Erweiterung, die auch dort nicht wirklich wohldefiniert ist. Das kriegst du spätestens zu spüren, wenn jemand versucht, dein Programm zu skripten und Dateien nach stdin umleitet.



Ach ja, das mit dem break hatte ich ganz vergessen. Vielen Dank für diesen Tipp.

Die anderen Fehler die du bemerkt hast sind wahr, allerdings nur bei c++. Bei c geht das alles.

Ach ja: Auch recht herzlichen dank für die Formatierung des Codes!
Aber wie macht man dass wenn es ein C-Code ist?

Nochmals allergrössten Dank für deine umfängliche Antwort!

mfG Rumeos
--
Programmier-Anfänger (C am lernen)

http://pandfute.wordpress.com/
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.09.2012, 12:17 Uhr
0xdeadbeef
Gott
(Operator)



Zitat von Rumeos:
Die anderen Fehler die du bemerkt hast sind wahr, allerdings nur bei c++. Bei c geht das alles.


Nein, das ist auch in C nicht standardkonform.


Zitat von Rumeos:

Ach ja: Auch recht herzlichen dank für die Formatierung des Codes!
Aber wie macht man dass wenn es ein C-Code ist?


Für C und C++ verwenden wir hier das gleiche Tag ( [ cpp ] ).
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.09.2012, 13:25 Uhr
Rumeos




Zitat:
Nein, das ist auch in C nicht standardkonform.


Bei DEC C++ geht funktioniert dass Programm aber. Man muss einfach die Dateiendung von .cpp oder in .c wechseln!


Zitat:
Für C und C++ verwenden wir hier das gleiche Tag ( [ cpp ] ).


ah ok. Vielen Dank. Ist gut zu wissen!
--
Programmier-Anfänger (C am lernen)

http://pandfute.wordpress.com/
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.09.2012, 19:23 Uhr
0xdeadbeef
Gott
(Operator)


"Funktioniert bei mir, muss richtig sein" ist für einen C-Programmierer eine ganz schlechte Einstellung, die du dir gar nicht erst angewöhnen solltest. Mein gcc haut mir deinen Code mit der Meldung um die Ohren, dass main int sein müsse, und wenn ich das geradeziehe, funktioniert er nicht, weil fflush(stdin) nicht definiert ist.

Ansonsten ist Dev-C++ uralt und insbesondere für C++ nicht empfehlenswert. Da liegt noch ein MinGW 3.irgendwas bei, oder?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.09.2012, 21:09 Uhr
~f.-th.
Gast


Wie schon erwäht die alte DEV-C++ 4.9.9.2 mit dem MinGW 3.4.2 oder 3.4.5 stammt aus etwa 2005 und hatte ein paar Marotten.


Hier ein anderer Autor, der das DEV-Projekt aufgegriffen und überarbeitet hat:
http://orwelldevcpp.blogspot.de/

Eine von vielen Alternativen zur IDE DEV -> Code:Blocks 10.05. Nehmt da nicht die Version mit dem GCC 4.4.1 sondern ladet euch einen aktuelleren Compiler. Z.B. einfach zu installieren TDM-GCC 4.6.1. Es gibt noch aktuellere GCC. Leider sind nicht für Einsteiger einfach ans laufen zu bekommen.

Und wie mein Vorschreiber schon schrieb, versucht euch am C-Standard zu orientieren. Sonst ist die Wahrscheinlichkeit grösser, das ihr euch beim Compiler-Wechsel Ärger einfangen könnt, der nicht immer einfach zu finden ist.


Zu deinem Buch: Das bringt vielleicht schnelle Erfolgserlebnisse, hat aber nicht gerade den Ruf sehr gut am C-Standard zu sein. Da es von eurer Schule empfohlen wird (?) solltet ihr mit den Fehlern leben können. Es sollte da bessere C-Bücher geben. Leider auch schlechtere.


Zu deinem Quelltext:
Die Verschachtelung der der beiden switch mit dem if in Kombination mit nicht optimierter Quelltextformatierung fördert nicht gerade das Verständnis desselben.
Brauchst du das "äussere" switch?

Dann hast du noch Redundanzen im Quelltext - das heisst ein wenig anders sortiert brauchst du deutlich weniger Zeilen.

Okay, die fehlenden musst du aber hinzufügen

Viel Spass
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.09.2012, 17:42 Uhr
Rumeos



@0xdeadbeef


Zitat:
Ansonsten ist Dev-C++ uralt und insbesondere für C++ nicht empfehlenswert. Da liegt noch ein MinGW 3.irgendwas bei, oder?


Also jetzt bin ich gerade ein bisschen durcheinander. Was ist denn an Devc++ so schlecht?
Und welche IDE sollte ich dann sonst nehmen?


@~f.-th.


Zitat:
Zu deinem Buch: Das bringt vielleicht schnelle Erfolgserlebnisse, hat aber nicht gerade den Ruf sehr gut am C-Standard zu sein. Da es von eurer Schule empfohlen wird (?) solltet ihr mit den Fehlern leben können. Es sollte da bessere C-Bücher geben. Leider auch schlechtere.


Was ist denn an diesem Buch schlecht bzw. was soll man anders machen als in diesem Buch beschrieben ist? Und welches Buch ist dann für Anfänger mehr zu empfehlen?


Trotzdem allerbesten dank für die Hilfe
--
Programmier-Anfänger (C am lernen)

http://pandfute.wordpress.com/
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
10.09.2012, 18:09 Uhr
0xdeadbeef
Gott
(Operator)


Dev-C++ ist halt alt, und in den letzten zehn Jahren hat sich in der Compilertechnik einiges getan. C99 wirst du mit dem alten Ding beispielsweise kaum einsetzen können, von C11 ganz zu schweigen. Außerdem ist gcc um einiges strenger geworden, was Standardkonformität angeht (obwohl es natürlich vieles gibt, was ein Compiler nicht prüfen kann).

Was andere IDEs angeht, ich finde für Windows CodeLite ganz nett.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
10.09.2012, 21:24 Uhr
~f.-th.
Gast


Zu dem Buch: Ich gehe mal davon aus das dein Quelltext sich daran orientiert.

C++:
void main() // laut C-Standard nie zulässig - einige alte Compiler-Hersteller schrieben C-Quelltext allerdings so



in einem aktuellen guten C-Buch sollte folgendes stehen:

C++:
int main(void) // laut C-Standard so oder mit Argumenten
{
  ...
  fflush(stdin); // laut C-Standard ist das Ergebnis dieser Funktion nicht definiert - die muss also nicht so funktionieren wie gewünscht.
  ...
  return 0  // Laut C-Standard kann diese Zeile im Quelltext entfallen, wenn 0 zurück soll - der Compiler sollte 0 automatisch ergänzen. Andere Werte müssen im Quelltext erscheinen.
}



Dann kannst du ja noch im Netz nach Beiträgen zum Thema "printf kann rechnen" suchen.

MfG f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: