1.) Ich glaube, dass das scanf einfach kein %lf kennt. Zumindest laut der Definition von MS im Visual Studio gibt es das nicht. Wenn du einen Double einlesen willst, dann nimm %g.
2.) Ich weiß nicht, welche Entwicklungsumgebung du verwendest, aber ich rate dir, dass du dir eine ordentliche besorgst (kein vi) etc. Auf die Schnell tut es einmal devc++
http://dev-c.softonic.de/
Auf Dauer würde ich dir aber das Visual Studio empfehlen. Dann kannst du nämlich auch das Programm zeilenweise durchgehen mit F10 (nicht in Unterfunktionen springen) oder F11 (schon reinspringen). Mit devc++ geht das auch, aber frag mich nicht, nach den Tasten. Du kannst auch Watches setzen und damit direkt in die Variablen reinschauen. Es gibt zwar auch eine Möglichkeit, diese zu ändern, aber davon solltest du die Finger lassen. Lieber Code ausbessern und noch einmal.
3.) printf liefert als Rückgabewert die Anzahl der am Bildschirm ausgegebenen Zahlen. Das ist denke ich nicht das, was du gerne zurückgeben willst. Wenn du nichts zum Zurückgeben hast, dann setz den Rückgabewert void (nichts):
void diskriminante (double a,double b,double c)
4.) Dasselbe gilt für das Aufrufen eine Funktion.
5.) Wenn du ein return hast, dann ist die Funktion beendet. Du musst also kein else mehr hinten dranhängen, weil sonst käme man eh nicht mehr dorthin. Das ist zwar nicht so schlimm, verbessert aber die Lesbarkeit.
6.) Ich persönlich halte es für eine Unart, dass man für einen 20 Zeiler 3 extra Dateien anlegt. Darüber gibt es aber verschiedene Ansichten vorallem von den Linux Fanatikern, die wie es von früher gewohnt sind auf ihren 13 Zoll Röhrenmonitoren rein textbasiert im vi etwas zu schreiben mit maximal 25 Zeilen am Bildschirm, wo jedes mal scrollen schon eine große Herausforderung ist und man sich ja viel lieber mit diversen Compileroptionen herumspielt, um alle Files einzubinden, aber das ist jetzt schon leicht OT.
7.) Im Prototyp solltest du auch immer den Namen der Variable angeben. Muss zwar nicht immer sein, aber verbessert die Lesbarkeit.
8.) Ich binde immer auch conio.h an. Das gibt es aber nur unter Windows. Damit sind Befehle wie getch(). Das wartet auf einen Tastendruck (liest eigentlich einen char ein, aber man kann es sehr gut, als pause verwenden, damit nicht das Fenster gleich zu geht). Es ist auch von Compiler zu Compiler unterschiedlich, wo sich die Funktionen wie scanf, printf etc. befinden (meistens in der stdio.h), aber ich habe es auch schon gesehen, dass diese so aufrufbar sind.
9.) Wenn du Fließkommazahlen mit == vergleichst und vorher damit gerechnet hast, ist das immer eine etwas gefährliche Angelegenheit, da hier Rundungsfehler auftreten können, die zwar normalerweise keine Rolle spielen, da sie sehr klein sind, aber dann doch dazu führen, dass das Ergebnis nicht mehr stimmt (vor allem == 0 ist kritisch). Hier solltest du auf > -0.000001 und < 0.000001 vergleichen. Dafür habe ich ein Makro erstellt.
10.) Es ist nicht unbedingt gut, wenn man den Anwender vor dem schwarzen Bildschirm sitzen lässt. Eine kleine Eingabeaufforderung wäre nicht schlecht.
11.) Wenn der User einen Mist eingibt bei scanf, dann passiert irgendetwas. Das sollte man abfangen. Dafür gibt es den Rückgabewert von scanf. Dieser ist die Anzahl der erfolgreich gelesenen Zeichen. Für unseren Fall wird es denke ich genug sein, wenn wir eine Fehlermeldung ausgeben und dann das Programm beenden.
Anmerkung: Grundsätzlich sollte man allen Variablen sprechende Namen geben und keine Buchstaben, aber da es hier um ein Rechteck oder so geht, ist es OK.
Also hier einmal das Programm, wie ich es schreiben würde (dass es richtig rechnet, kann ich nicht sagen. Dass musst du überprüfen
![Zunge rausstrecken :P :P](/forum/styles/smilies/tongue.gif)
)
Code:
#include "stdio.h"
#include "conio.h"
#include "math.h"
#include "stdlib.h"
#define iszero(a) (((a)<0.000001) && ((a)>-0.000001))
void diskriminante (double a, double b, double c);
double getVar (void);
int main(void)
{
double a,b,c=0;
printf("Bitte geben Sie die Variable a ein: ");
a=getVar();
printf("Bitte geben Sie die Variable b ein: ");
b=getVar();
printf("Bitte geben Sie die Variable c ein: ");
c=getVar();
diskriminante (a, b, c);
getch();
return 0;
}
// diskriminante pos oder neg oder gleich null?
void diskriminante (double a,double b,double c)
{
double d_a, d_b, disk;
disk = b*b - 4*a*c;
printf ("%f %f %f",a,b,c);
if (iszero(disk))
{
d_a = (-b/(2*a));
printf(" Genau eine Loesung, da Diskriminante gleich Null, naemlich x = -b/(2*a) = %2f\n\n", d_a);
return;
}
if (disk > 0)
{
d_a =(-b + sqrt(disk)/(2*a));
d_b =(-b - sqrt(disk)/(2*a));
printf(" Zwei Loesungen, da Diskriminante groesser Null, naemlich (-b+disk)/(2*a) = %.2f\n und (-b-disk)/(2*a) = %.2f.\n\n", d_a, d_b);
return;
}
printf(" Da Diskriminante negativ keine reelen Loesungen vorhanden!\n\n");
return;
}
//GetVar Erstellen//
double getVar (void)
{
int ret;
double a;
ret=scanf ("%lf",&a);
if(ret==0)
{
printf("Sie haben keine gültige Zahl eingegeben. Programm wird beendet");
exit(4); //Bricht das Programm ab
}
return (a);
}