Programmier Problem mit C

Das Forum fĂĽr Programmierer und Systemadmins. Von Shell-, Perl- und PHP-Scripts bis zur objektorientierten Programmierung mit C++.

Programmier Problem mit C

Beitragvon BoomerBoss » Do 08 Sep, 2005 17:00

Hallo erstmal
Ich bin nämlich neu hier
KOmmen wir sofort zur Sache

Ich bin ein totaler Noob in programmieren und lerne jetz C.
Nun wollte ich einen DMark in Uero Umrechner programmieren.
Das Problem is nur er funnktioniert nich richtig.
Ich hab den Rechner mit Turbo C gemacht
Quellcode:
#include <stdio.h>
#include <conio.h>

int main()
{
int DMark; /*Deutsche Mark*/
long double Kurs = 1.95583; /*Euro Kurs*/


printf ("DMark zu Euro Umrechner \n");
printf ("Deutsche Mark eingeben... ");

scanf ("%d" ,DMark); /*Eingabe und in DMark Integer ablegen*/
printf ("%d Deutsche Mark sind %d Euro", DMark, DMark / Kurs); /*Rechnen und anzeigen*/

getch();
return 0;
}

So wennn ich jetz den Rechner anmache fragt er nach der DMark Zahl
Wenn ich die eingebe komm eine -Euro Zahl so -27000

Kann mir daa jemand helfen???
BoomerBoss
Neu im Board
Neu im Board
 
Beiträge: 3
Registriert: Do 08 Sep, 2005 16:54

Beitragvon roro » Do 08 Sep, 2005 17:40

scanf ("%d" ,DMark); /*Eingabe und in DMark Integer ablegen*/

ersetzen durch

scanf ("%d" ,&DMark); /*Eingabe und in DMark Integer ablegen*/

Andere Frage, wieso verwendest du int fĂĽr DMark?
roro
Advanced Profi-User
Advanced Profi-User
 
Beiträge: 2347
Registriert: Di 11 Jan, 2005 15:22
Wohnort: Weiz

Beitragvon BoomerBoss » Do 08 Sep, 2005 17:41

ähhhm weiss ich nich
ainfach so spontan
und warum komm dieses Zeichen vor DMArk????
jetz zeigt er die richtige DMark zahl an aber es kom ein völlig falsches ergebnis immer noch raus
BoomerBoss
Neu im Board
Neu im Board
 
Beiträge: 3
Registriert: Do 08 Sep, 2005 16:54

Beitragvon roro » Do 08 Sep, 2005 17:45

& steht fĂĽr Pointer. Scanf erwartet einen Pointer und keinen Wert.
roro
Advanced Profi-User
Advanced Profi-User
 
Beiträge: 2347
Registriert: Di 11 Jan, 2005 15:22
Wohnort: Weiz

Beitragvon BoomerBoss » Do 08 Sep, 2005 17:51

mein prob is immer noch net gelöst
als ergebnis kommt andauernd -23688 oder so raus
BoomerBoss
Neu im Board
Neu im Board
 
Beiträge: 3
Registriert: Do 08 Sep, 2005 16:54

Beitragvon kirschi » Di 27 Sep, 2005 08:22

Hi!
Bittesehr, so funktioniert es korrekt:

1) das &DMark beim scanf hat roro schon ausgebessert

scanf ("%f" ,&DMark); /*Eingabe und in DMark Integer ablegen*/

2) nimm fĂĽr die Eingabe und den Kurs einen float und keinen double...
float hat gewöhnlich 4 Byte, double 8 Byte...4 reichen völlig aus

float DMark; /*Deutsche Mark*/
float Kurs = 1.95583; /*Euro Kurs*/

3) Du hast für den Kurs einen double gewählt, ihn aber als int angesprochen (mit dem %d), musst %f nehmen...

printf ("%0.2f Deutsche Mark sind %0.2f Euro", DMark, DMark / Kurs);

Ein paar Referenzen:
Allgemein:
http://www.cppreference.com/
IO-spezifisch
http://www.cppreference.com/stdio/printf.html
FĂĽr den Anfang empfehle ich 2 einfache BĂĽcher fĂĽr C und C++:
http://courses.iicm.edu/programmieren0/#d12e112
http://courses.iicm.edu/programmierpraktikum/skriptum/

LG, Kirschi
Woher soll ich wissen was ich denke, bevor ich höre, was ich sage?
Bild
kirschi
Board-Mitglied
Board-Mitglied
 
Beiträge: 129
Registriert: Fr 11 Jul, 2003 14:45
Wohnort: Graz

Beitragvon ulrich » Di 27 Sep, 2005 10:08

roro hat geschrieben:& steht fĂĽr Pointer.

nein, das & ist in dem fall der "adresse-von"-operator.
fĂĽr pointer steht *, um es salopp auszudrĂĽcken.
Code: Alles auswählen
int i = 0;              //ganze zahl i auf 0 setzen
int* ip = &i;           //dem "zeiger auf int" ip die _adresse_von_ i zuweisen
ulrich
Senior Board-Mitglied
Senior Board-Mitglied
 
Beiträge: 287
Registriert: Do 13 Nov, 2003 14:27

Beitragvon ulrich » Di 27 Sep, 2005 10:18

2) nimm fĂĽr die Eingabe und den Kurs einen float und keinen double...

<haare sträub>
nie, nie, nie zum rechnen float verwenden! das ist ein absolutes no-no (wegen der bei float zu geringen anzahl gĂĽltiger stellen).
zum rechnen immer double: das sollte man sich zum prinzip machen, auch wenn es im vorliegenden beispiel möglicherweise nicht notwendig ist.
float hat gewöhnlich 4 Byte, double 8 Byte...4 reichen völlig aus

grmml.
stand der technik ist folgende empfehlung: zuerst schreibe man ein korrektes programm, dann optimiere man (falls überhaupt notwendig - ich rede hier von einem PC system, und nicht von beschränkten dingen, die auch in c programmiert werden (z.B. embedded systems und so...)).
ulrich
Senior Board-Mitglied
Senior Board-Mitglied
 
Beiträge: 287
Registriert: Do 13 Nov, 2003 14:27

Beitragvon Avelyn » Mo 17 Okt, 2005 16:19

Code: Alles auswählen
float DMark; /*Deutsche Mark*/
float Kurs = 1.95583; /*Euro Kurs*/


AuĂźerdem ist es ĂĽblich *alle* Variablen zu initialisieren. Also

Code: Alles auswählen
float DMark = 0.0f;
Avelyn
Neu im Board
Neu im Board
 
Beiträge: 3
Registriert: Mo 17 Okt, 2005 16:11

Beitragvon max_payne » Mo 17 Okt, 2005 16:29

ĂĽblich schon, aber nicht notwendig, sofern du sie dann nicht abfragst, ohne ihnen vorher einen wert(zb aus einer rechnung) zuzuweisen
max_payne
Ultimate Power-User
Ultimate Power-User
 
Beiträge: 4982
Registriert: Mo 30 Aug, 2004 12:25

Beitragvon ulrich » Di 18 Okt, 2005 08:11

max_payne hat geschrieben:ĂĽblich schon, aber nicht notwendig, sofern du sie dann nicht abfragst, ohne ihnen vorher einen wert(zb aus einer rechnung) zuzuweisen

aber sehr nĂĽtzlich beim debuggen...
auĂźerdem ist stand der technik das sogenannte RAII paradigma:
"resource aquisition is initialisation"
d.h. grob gesagt, nichts wird erzeugt, ohne sofort benutzt zu werden (und sollte auch nicht länger existieren als notwendig).
ulrich
Senior Board-Mitglied
Senior Board-Mitglied
 
Beiträge: 287
Registriert: Do 13 Nov, 2003 14:27

Beitragvon Max O » Di 18 Okt, 2005 18:48

ich hätte da nen andren vorschlag:
einfach einen string bzw in c ein char array einlesen. dann mit den funktionen atoi(char*) oder mit atof(char *) den string umwandeln in das gewĂĽnschte format.
atoi -> array to integer
atof -> array to float
Max O
Neu im Board
Neu im Board
 
Beiträge: 9
Registriert: Di 12 Apr, 2005 15:03

Beitragvon max_payne » Di 18 Okt, 2005 18:52

und was tust du, wenn sich einer vertippt und n buchstaben, etc reinhaut?
max_payne
Ultimate Power-User
Ultimate Power-User
 
Beiträge: 4982
Registriert: Mo 30 Aug, 2004 12:25

Beitragvon ulrich » Mi 19 Okt, 2005 08:36

fehlerabfrage und erneute aufforderung zur eingabe, was sonst?
ulrich
Senior Board-Mitglied
Senior Board-Mitglied
 
Beiträge: 287
Registriert: Do 13 Nov, 2003 14:27

Beitragvon Avelyn » Mi 19 Okt, 2005 16:16

Also ich würde nicht die atoi(), atof() funktionen benutzen, da sie ehrlich gesagt schon etwas zu alt sind, und keine Möglichkeit lassen Fehler zu überprüfen. In C am besten mit scanf() arbeiten:

Code: Alles auswählen
const char* str_int = "777";
const char* str_float = "333.3";
int i;
float f;

if(EOF == sscanf(str_int, "%d", &i))
{
  //error
}

if(EOF == sscanf(str_float, "%f", &f))
{
  //error
}


Den atoi() (und die Familie) haben einen markanten Nachteil: Sie geben alle 0 zurĂĽck wenn ein Fehler passiert ist, oder wenn sie "0" konvertieren.

P.s.: WahlweiĂźe geht auch strtod, da es den String position zurĂĽck gibt, ab wo die Konvertierung zur Zahl fehlgeschlagen ist.

Mfg Avelyn
Avelyn
Neu im Board
Neu im Board
 
Beiträge: 3
Registriert: Mo 17 Okt, 2005 16:11

Nächste

ZurĂĽck zu PROGRAMMIER FORUM

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 27 Gäste