C Noob die Zweite :D,hilfe bei char?

Graf-Porno

Ensign
Registriert
Okt. 2004
Beiträge
238
So mal wieder nen Prob wir versuchen gerade char in ner Funktion. Für a übergibt er in der getVar immer 1 an den Hauptteil.


Funktion.c
PHP:
#include <stdio.h>
#include <math.h>
#include "Funktionen.h"


// diskriminante pos oder neg oder gleich null?
double 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 (disk == 0)
{
	d_a = (-b/(2*a));
	return (printf(" Genau eine Loesung, da Diskriminante gleich Null, naemlich x = -b/(2*a) = %2f\n\n", d_a));
}
else if (disk > 0)
{
	d_a =(-b + sqrt(disk)/(2*a));
	d_b =(-b - sqrt(disk)/(2*a));
	return (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));
}
else 
{
	return (printf(" Da Diskriminante negativ keine reelen Loesungen vorhanden!\n\n"));
}
}
//GetVar Erstellen//

double getVar (char cVariablenName)
{
double a=0.0;
scanf ("%lf",&a);
return (a);
}


qGleichung.c
PHP:
#include <stdio.h>


int main(void)
{
double a,b,c=0;
a= getVar('a');
b= getVar('a');
c= getVar('a');
diskriminante (a, b, c);
return 0;
}

header.h
PHP:
double diskriminante (double, double, double);
double getVar (char);

Ich danke für jede Hilfe
 
Zuletzt bearbeitet:
Frage wo liegt das Problem? Was wird wo nicht richtig übergeben oder was meinst du?
 
Genau,
in der Funktion werden genau die richtigen Werte returnt, bloß sobald man die funktion dann im main einsetzt sind a,b,c immer gleich null!
 
Ist zwar lang her, dass ich C programmiert hab, aber hast du es beim scanf mit %ld versucht?? oder ist das d nur bei der ausgabe?? denn du hast da ein double und liest ja ein float ein...bin mir jetzt nicht ganz sicher :S:S
 
probiert macht sinn, irgendwo da muss ja auch das Problem liegen da die Werte ja irgendwie umgecastet werden, da sie am Ende ja immer 1.000 annehmen
 
Zuletzt bearbeitet:
Code:
double getVar (char cVariablenName)
{
double a=0.0;
scanf ("%lf",&a);
return (a);
}

Irgendwie verstehe ich die Funktion nicht. Sie bekommt einen Parameter übergeben der aber gar nicht benutzt wird. Überlege dir wozu du den Parameter übergibst und was eigentlich als Ergebnis der Funktion zurückgeliefert werden soll.

j o e
 
Zuletzt bearbeitet:
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 :P)

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);
}
 
andr_gin schrieb:
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.

*hust* Der C-Standard definiert genau, woher welche Funktion kommt. Wenn sie "so" aufrufbar sind oder nicht aus den definierten Header kommen, sollten man dringend drüber nachdenken, auf einen anständigen Compiler zu wechseln. Mir wäre keiner bekannt, wo sich die Standard C Funktionen in falschen Headern befinden.

Und zu deinem Programm, irgendwo mit exit ganz aus dem Programm zu springen wäre wohl aber auch eine Unart ;)
 
1.) Ja im Normalfall wird man eine Exception werfen, aber das wollen wir dem Guten nicht zumuten, oder eben einen Pointer auf die Variable akzeptieren und statt der Variable error oder nicht error zurückgeben.

2.) Ich weiß es nicht mehr genau, aber ich habe schon einmal den Fall gehabt, dass jemand printf verwendet hat und auf einem Compiler ist es gegangen und auf einem nicht. Wahrscheinlich hat der gar nichts eingebunden. Im Zweifelsfall lieber einen Header mehr einbinden. Schadet eigentlich nicht wirklich, solange man es nicht übertreibt. Ja ok die .exe wird ein paar KB größer, aber das dürfte für den Hausgebrauch egal sein.
 

Ähnliche Themen

Zurück
Oben