C Komische Fehler mit C - was mache ich falsch?

gustl87

Commander
Registriert
Aug. 2004
Beiträge
2.407
Hallo also ich lerne gerade C und stolpere über komische Fehler. Hier erstmal der Code:

Code:
#include <stdio.h>
#include <stdlib.h>

int main()
{
double bruch1, bruch2, ergebnis, z1, n1, z2, n2;
char a;

printf("Zaehler der ersten Zahl eingeben:\n");
scanf("%lf",&z1);

printf("Nenner der ersten Zahl eingeben:\n");
scanf("%lf",&n1);

printf("Rechenzeichen eingeben:\n");
scanf("%c",&a);

printf("Zaehler der zweiten Zahl eingeben:\n");
scanf("%lf",&z2);

printf("Nenner der zweiten Zahl eingeben:\n");
scanf("%lf",&n2);

bruch1 = (z1/n1);
bruch2 = (z2/n2);

switch(a)
{
case '+':
ergebnis = bruch1+bruch2;
case '-':
ergebnis = bruch1-bruch2;
case '/':
ergebnis = bruch1/bruch2;
case '*':
ergebnis = bruch1*bruch2;
}

printf("Das Ergebnis ist:%lf\n",&ergebnis);

return 0;
}

So und jetzt die Fehler^^ also der Compiler spuckt schon mal sowas aus:

Code:
/Users/gb/c/v1/main.c||In function 'main':|
/Users/gb/c/v1/main.c|53|warning: format '%lf' expects type 'double', but argument 2 has type 'double *'|
||=== Build finished: 0 errors, 1 warnings ===|
Was soll das? Bzw. was mache ich falsch?

Und dann kann ich in dem Programm schön die Zahlen eingeben, aber keine Variable (z1 oder so) hat danach den Wert der eingegebenen Zahl?! Und bei der Char-Abfrage wird zwar die Zeile ausgegeben, dass ein Char abgefragt wird (also die printf über dem scanf) aber die scanf wird übersprungen und es erscheint direkt die nächste printf - Zeile.
Komischerweise passiert letzteres nicht, wenn ich die Char-Abfrage ganz an den Anfang setze vor die Zahlenabfragen.

Komischerweise werden auch keine Werte eingelesen wenn ich andere Datentypen angebe.

Sehr seltsam und ich weiss da nicht weiter ...

Vielen Dank!

-gb-
 
Zuletzt bearbeitet:
erstmal mach in deiner switch ein paar breaks, sonst rechnest du immer alles bis zum Ende durch:
Code:
switch (a)
{
case a:
...;
break;
case b:
...;
break;
default:
...;
break;
}
Dann printf(), die Argumente müssen nicht als Referenz übergeben werden -> Warnung, da Referenz angegeben, aber Typ erwartet.
 
Gut ok aber ... es sollte ja doch zumindest etwas gehen?! Kann das mal jemand ausprobieren? Nicht, dass meine Kombination aus Codeblocks und OSX schuld ist.

&ergebnis - also ohne & bei printf?

@ Blitzmerker: Und wie geht das?

Danke!

-gb-
 
Zuletzt bearbeitet:
"@ Blitzmerker: Und wie geht das?"

wie wärs damit das & vor der var wegzulassen?
ich weiß nich ob es nötig ist für die c befehle in c++ kann man zumindestens mit cout/cin einfach nur variablen ausgeben

btw hat das LuXon schon erwähnt!
 
Zuletzt bearbeitet:
Sieht jetzt so aus. Mit dem zweimal %c fragt er jetzt auch das Char ab. Aber rechnen tut der immer noch nicht.

Code:
#include <stdio.h>
#include <stdlib.h>

int main()
{
double bruch1, bruch2, ergebnis, z1, n1, z2, n2;
char a;

printf("Zaehler der ersten Zahl eingeben:\n");
scanf("%lf",&z1);

printf("Nenner der ersten Zahl eingeben:\n");
scanf("%lf",&n1);

printf("Rechenzeichen eingeben:\n");
scanf("%c %c",&a);

printf("Zaehler der zweiten Zahl eingeben:\n");
scanf("%lf",&z2);

printf("Nenner der zweiten Zahl eingeben:\n");
scanf("%lf",&n2);

bruch1 = (z1/n1);
bruch2 = (z2/n2);

switch(a)
{
case '+':
ergebnis = bruch1+bruch2;
break;
case '-':
ergebnis = bruch1-bruch2;
break;
case '/':
ergebnis = bruch1/bruch2;
break;
case '*':
ergebnis = bruch1*bruch2;
break;
}

printf("Das Ergebnis ist %lf\n",ergebnis);

return 0;
}

Lasst es mal so wie es ist bei euch laufen und schaut ob es geht - ich glaube fast bei mir ist was anderes kaputt.

-gb-
 
Gut^^ aber was könnte der Fehler sein?

Wenn ich nach dem ersten scanf ein printf("%lf \n", z1); einbaue, dann zeigt mir das, dass z1 jetzt wirklich die eingegebene Zahl ist. Jedoch bekomme ich nach der Eingabe des Rechenzeichens einen Fehler.

Irgendwie sehr komisch, sitze da heute auch schon recht lange dran und konnte noch keine funktionierende Lösung finden ...

Vielen Dank!

-gb-
 
Code:
printf("Zaehler der ersten Zahl eingeben:\n");
scanf("%lf",&z1);
fflush(stdin);

printf("Nenner der ersten Zahl eingeben:\n");
scanf("%lf",&n1);
fflush(stdin);

printf("Rechenzeichen eingeben:\n");
scanf("%c",&a);
fflush(stdin);

printf("Zaehler der zweiten Zahl eingeben:\n");
scanf("%lf",&z2);
fflush(stdin);

printf("Nenner der zweiten Zahl eingeben:\n");
scanf("%lf",&n2);
fflush(stdin);

probers mal so

wenn auch nicht die optimale lösung, aber sie funktioniert^^
 
Zuletzt bearbeitet:
Ne so geht es bei mir immer noch nicht.

Code:
#include <stdio.h>
#include <stdlib.h>

int main()
{
double bruch1, bruch2, ergebnis, z1, n1, z2, n2;
char a;

printf("Zaehler der ersten Zahl eingeben:\n");
scanf("%lf",&z1);
fflush(stdin);

printf("Nenner der ersten Zahl eingeben:\n");
scanf("%lf",&n1);
fflush(stdin);

printf("Rechenzeichen eingeben:\n");
scanf("%c",&a);
fflush(stdin);

printf("Zaehler der zweiten Zahl eingeben:\n");
scanf("%lf",&z2);
fflush(stdin);

printf("Nenner der zweiten Zahl eingeben:\n");
scanf("%lf",&n2);
fflush(stdin);

bruch1 = (z1/n1);
bruch2 = (z2/n2);

switch(a)
{
case '+':
ergebnis = bruch1+bruch2;
break;
case '-':
ergebnis = bruch1-bruch2;
break;
case '/':
ergebnis = bruch1/bruch2;
break;
case '*':
ergebnis = bruch1*bruch2;
break;
}

printf("Das Ergebnis ist %lf\n",ergebnis);

return 0;
}

Und bei dir geht das?! Komisch mich lässt der nie ein Rechenzeichen eingeben ... und mit einem zweiten %c geht das zwar, aber gerechnet wird immer noch nix.

Komisch ...

-gb-
 
Zuletzt bearbeitet:
So funktioniert es!

Code:
#include <stdio.h>
#include <stdlib.h>

int main()
{
double bruch1, bruch2, ergebnis, z1, n1, z2, n2;
char x,a;

printf("Zaehler der ersten Zahl eingeben:\n");
scanf("%lf",&z1);

printf("Nenner der ersten Zahl eingeben:\n");
scanf("%lf",&n1);

printf("Rechenzeichen eingeben:\n");
scanf("%c%c",&x,&a);

printf("Zaehler der zweiten Zahl eingeben:\n");
scanf("%lf",&z2);

printf("Nenner der zweiten Zahl eingeben:\n");
scanf("%lf",&n2);

bruch1 = (z1/n1);
bruch2 = (z2/n2);

switch(a)
{
case '+':
ergebnis = bruch1+bruch2;
break;
case '-':
ergebnis = bruch1-bruch2;
break;
case '/':
ergebnis = bruch1/bruch2;
break;
case '*':
ergebnis = bruch1*bruch2;
break;
}

printf("Das Ergebnis ist %lf\n",ergebnis);

return 0;
}

Also es ist bei der Char-Abfrage schon ein Zeichen drinnen das nun an das x geht und verworfen wird. Das zweite Zeichen geht dann an a.

Trotzdem vielen Dank!!!

edit:
Und so geht es auch:

if (a=='+')
ergebnis=bruch1+bruch2;
else if (a=='-')
ergebnis=bruch1-bruch2;
else if (a=='/')
ergebnis=bruch1/bruch2;
else if (a=='*')
ergebnis=bruch1*bruch2;

Statt switch.

-gb-
 
Zuletzt bearbeitet:
Zurück
Oben