PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einfaches Programm funktioniert nicht!



@|<0
14-05-2005, 16:57
Hallo,
Ich versuche gerade C zu lernen, und habe ein kleines test Programm geschrieben, um die funktionsweise von "if" zu testen.


/* bsp10012.c */
#include <stdio.h>
main() {
int wahl;
float betrag;
printf("\nE U R O R E C H N E R\n");
printf("\n1 DM --> EURO\n2 EURO --> DM");
printf("\n\nIhre Wahl: ");
scanf("%i",&wahl);
if (wahl == 1) {
printf("Bitte DM-Betrag eingeben: ");
scanf("%f",&betrag);
printf("\n%.2f DM sind %.2f EURO",betrag,betrag*0.51129);
}
if (wahl == 2) {
printf("Bitte EURO-Betrag angeben: ");
scanf("%f",&betrag);
printf("\n%.2f EURO sind %.2f DM",betrag,betrag*1.95583);
}
}

Wenn ich dieses Programm ausführe, bricht es an folgender Stelle nach dem Bestätigen der Eingabe ab:


E U R O R E C H N E R

1 DM --> EURO
2 EURO --> DM

Ihre Wahl: 1
Bitte DM-Betrag eingeben: 100

Woran kann das liegen?

Vielen Dank,

@|<0

bischi
14-05-2005, 17:22
Du liest wahrscheinlich einen String ein und versuchst den mit nem int zu vergleichen...

MfG Bischi

jeebee
14-05-2005, 19:12
/* 10012.c */
#include <stdio.h>
int main(int argc, char *argv[]) {
int wahl;
float betrag;
printf("\nE U R O R E C H N E R\n");
printf("\n1 DM --> EURO\n2 EURO --> DM");
printf("\n\nIhre Wahl: ");
scanf("%i",&wahl);
if (wahl == 1) {
printf("Bitte DM-Betrag eingeben: ");
scanf("%f",&betrag);
printf("\n%.2f DM sind %.2f EURO\n",betrag,betrag*0.51129);
}
if (wahl == 2) {
printf("Bitte EURO-Betrag angeben: ");
scanf("%f",&betrag);
printf("\n%.2f EURO sind %.2f DM\n",betrag,betrag*1.95583);
}

return 0;
}

Bei mir funktioniert allerdings auch deine Version ohne jegliche Änderungen... evtl hast du die Schlussausgabe nur nicht gesehen, weil du den letzten Zeilenumbruch (blau & fett) vergessen hast. Ich rate dir aber deine Programme immer mit den restlichen oben rot hervorgehobenen Änderungen zu schreiben, da diese zum guten Stil von C-Programmen gehören.

MfG jeebee

peschmae
14-05-2005, 20:28
Woran kann das liegen?


Stdout-Ausgaben sind gepuffert. Der Puffer wird nur auf den Bildschirm geschrieben wenn er
a) voll ist
b) deine Ausgabe ein Endzeilenzeichen \n enthält

Was ich weiss ist dass es sein kann - wenn das Programm abstürzt - dass die letzte Ausgabe es zwar bis in den Buffer aber nicht auf den Bildschirm geschafft hat. Möglicherweise gilt das auch für das normale Programmende - also dein Programm schreibt in den Buffer und beendet sich - und der Buffer wird gar nie auf den Bilschirm geschrieben.

Also - wie von jeebee schon erwähnt - am besten der Ausgabe ein \n anhängen. (Ich vergess das übrigens auch immer, bin etwas Java-System.out.println() gewöhnt ;))

Mal jetzt abgesehen von der Frage:
Dein Programm ist überhaupt nicht geschützt gegen Fehlereingaben von Benutzern. Das würde ich noch machen (Rückgabewert von Scanf prüfen, Buffer leeren und neu einlesen, etc).
Es sei denn du bist dir dessen bewusst und lässt das einfach weg um das Beispielprogramm erst mal etwas übersichtlicher zu gestalten. Das darf man auch ;)

@bischi: scanf("%i",&wahl); liest die Zahl und speichert sie im Int dessen Adresse übergeben wurde. Das haut schon hin :)

MfG Peschmä

@|<0
14-05-2005, 21:22
/* 10012.c */
#include <stdio.h>
int main(int argc, char *argv[]) {
int wahl;
float betrag;
printf("\nE U R O R E C H N E R\n");
printf("\n1 DM --> EURO\n2 EURO --> DM");
printf("\n\nIhre Wahl: ");
scanf("%i",&wahl);
if (wahl == 1) {
printf("Bitte DM-Betrag eingeben: ");
scanf("%f",&betrag);
printf("\n%.2f DM sind %.2f EURO\n",betrag,betrag*0.51129);
}
if (wahl == 2) {
printf("Bitte EURO-Betrag angeben: ");
scanf("%f",&betrag);
printf("\n%.2f EURO sind %.2f DM\n",betrag,betrag*1.95583);
}

return 0;
}
da diese zum guten Stil von C-Programmen gehören.

Das Problem ist das ich als Anfänger die Bedeutung des "guten Stils" nicht kenne.
Kannst du mir diese Änderungen vielleicht erklären?
EDIT: Mit den \n gehts... Big THX

Danke.

peschmae
15-05-2005, 09:13
Naja, "void main" geht nur deshalb weil soviel ich weiss per Default void-Funktionen von C eigentlich als Funktionen die int zurückgeben verwendet werden. Das ist eher noch so ein Überbleibsel aus 30 Jahren C-Geschichte. Korrekt ist "int main".

Das return 0 ist halt weils eine Funktion ist die ints zurückgibt - 0 heisst hier "kein Fehler bei Ausführung des Programms"

http://www.eskimo.com/~scs/C-faq/q11.12.html

Ob (int argc, char *argv[]) oder () ist eigentlich eher egal - ersteres ermöglicht dir halt noch den Zugriff auf die Argumente die deinem Programm auf der Kommandozeile übergeben wurden. Erlaubt ist aber beides.

MfG Peschmä

jeebee
15-05-2005, 21:37
Wenn du den gcc mit dem Schalter -Wall (alle Warnungen) benutzt, sagt er dir sogar das main() eine Funktion vom Typ int sein sollte. Wenn ich void main() benutze erhalte ich die Meldung "program terminated with errcode 12", wenn ich int main() und return 0 benutze erhalte ich die Meldung "programm terminated with errcode 0".