Adressparameter
-
Guten Abend.
So nun wie fang ich am besten an:Meine Aufgabenstellung:
`Aufgabe 10.1 (Adressparameter)
Die Lösungen zu quadratischen Gleichungen der Form
ax[h]2[/h]+bx+c=0 2
werden bekanntlich nach folgender Formel berechnet:
x[t]1/2[/t]=(-b±Wurzel(b[h]2[/h]-2ac)/(2*a)
Schreiben Sie eine C-Funktion, welche die Koeffizienten a, b und c als
Wertparameter entgegen nimmt und die Lösungen x1 und x2 über Adressparameter
zurückliefert. Ergänzen Sie das Programm um eine main()-Funktion, welche die
Koeffizienten einliest und das Ergebnis ausgibt.
Verwenden Sie dabei die folgenden Bibliotheksfunktionen aus <math.h>:
double pow(double x, double y); berechnet xy
double sqrt(double x); berechnet x
Achtung: Nicht für alle quadratischen Gleichungen gibt es eine reelle Lösung.`
Mein Ansatz in C:
/* Berechnung für */ /* Sebastian Jäschke */ #include <stdio.h> #include <math.h> int* berechne(double , double , double ); main() { char ch; double erg1; double erg2; double a; double b; double c; //int Vektor[1]; int *Zeiger,*Zeiger2; printf("Geben Sie bitte die Werte a,b,c der Reihe nach ein\n"); printf("a = "); scanf("%lf",&a); printf("b = "); scanf("%lf",&b); printf("c = "); scanf("%lf",&c); printf(" ======================================== \n"); /* Ausgabe */ if ((b*b)-4*(a*c)<0) { printf("b*b-4ac darf nicht < 0 sein!\n"); ch = getchar(); } else { if (a == 0) { printf("a darf nicht 0 sein. Division durch 0 ist nicht erlaubt!\n"); } else { Zeiger = berechne(a,b,c); Zeiger2 = Zeiger + sizeof(double)/4; printf("Die Ergebnisse lauten:\n"); printf("a = %0.4f\n",a); printf("b = %0.4f\n",b); printf("c = %0.4f\n",c); printf(("X1 = %.6f\n"),*Zeiger); printf(("X2 = %.6f\n"),*Zeiger2); printf("%i\n",Zeiger); printf("%i\n",Zeiger2); printf("%f\n",*Zeiger); ch = getchar(); } } } int* berechne(double a, double b, double c) { int Adressen[1]; double *Zeiger; double erg1=0,erg2=0; Zeiger = (int *) malloc((2*sizeof(double))); printf("%i\n",Zeiger); erg1=((b*(-1)+sqrt(pow(b,2)-4*a*c))/(2*a)); erg2=((b*(-1)-sqrt(pow(b,2)-4*a*c))/(2*a)); *Zeiger = erg1; printf(" . . . . . . . . . . . . . . . . . . . . \n"); printf("%i\n",&erg1); printf("%i\n",&erg2); printf("%f\n",erg1); printf("%f\n",erg2); printf(" -.-.-.- \n"); printf("%f\n",*Zeiger); return Zeiger; }
Und meine Ausgabe bei a=1 b=3 c=2:
Geben Sie bitte die Werte a,b,c der Reihe nach ein
a = 1
b = 3
c = 21708552
. . . . . . . . . . . . . . . . . . . .
1244588
1244572
-1.000000
-2.000000
-.-.-.-
-1.000000
Die Ergebnisse lauten:
a = 1.0000
b = 3.0000
c = 2.0000
X1 = 0.000000
X2 = 0.000000
1708552
1708560
0.000000Mein Problem:
Ich möchte die Ergebnisse erg1 und erg2 in den durch Zeiger per malloc markierten Bereich
schreiben und dann auslesen (zumindest glaube ich so die Vorderungen der Aufgabe zu erfüllen) aber sobald berechnen(...)
durchgelaufen ist und er in die main springt ist der Speicher nicht mehr Verfügbar (zumindest wenn ich den Debugger von Visual Studio 05
richtig interpretiere).
**
Hat jemand ne Idee was ich machen kann bzw. wie ich (sofern ich dies auf die Art und Weise nicht schaffe) die Aufgabenstellung
erfüllen kann?
**
Vielen Dank![u]
SebastianP.S.:
Der Großteil der Ausgaben ist lediglich für mich als Kontrolle gedacht dass ich auch die richtigen Adressen anspreche , die richtigen Werte in Zeigern stehen hab usw. ...
-
void berechne( double a, double b, double c, double *x1, double *x2 ) { // ... x1 = /* ... */ ; x2 = /* ... */ ; } int /* <-- !!!111elf */ main( /* --> */ void /* <-- */ ) { double a = 0., b = 0., c = 0.; double erg1 = 0.; double erg2 = 0.; // ... berechne( a, b, c, &erg1, &erg2 ); // ^ Übergabe der _Adressen_ von erg1 u. erg2 als Parameter // ... }
cheers, Swordfish
-
Dieser Thread wurde von Moderator/in Unix-Tom aus dem Forum MFC (Visual C++) in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Vielen Dank Sworfish.
Werds gleich mal ausprobieren.
-
/* Berechnung für eine Gleichung des Chemas ax²+bx+c=0*/ /* Sebastian Jäschke */ #include <stdio.h> #include <math.h> /* Prototyp der Methode zum Berechnen der beiden Ergebnisse*/ void berechne(double , double , double *x1, double *x2 ); /* Main mit Eigabe der Werte a,b,c für das Lösungschema (-b+-(Wurzel(b²-4ac))/(2a) Mögliche Fehler: b² < 4ac -> Negative Wurzel -> Keine relle Lösung a = 0 -> Division durch 0 -> Keine relle Lösung */ int main(void) { char ch; double erg1=0.,erg2=0.; double a=0.,b=0.,c=0.; printf("Geben Sie bitte die Werte a,b,c der Reihe nach ein\n"); printf("a = "); scanf("%lf",&a); printf("b = "); scanf("%lf",&b); printf("c = "); scanf("%lf",&c); printf(" ======================================== \n"); /* Ausgabe */ if ((b*b)-4*(a*c)<0) { printf("b*b-4ac darf nicht < 0 sein!\n"); } else { if (a == 0) { printf("a darf nicht 0 sein. Division durch 0 ist nicht erlaubt!\n"); } else { berechne(a,b,c,&erg1,&erg2); printf("Die Ergebnisse lauten:\n"); printf("a = %0.4f\n",a); printf("b = %0.4f\n",b); printf("c = %0.4f\n",c); printf("X1 = %0.6f\n",erg1); printf("X2 = %0.6f\n",erg2); } } return 0; } void berechne(double a, double b, double c,double *x1, double *x2) { x1=((b*(-1)+sqrt(pow(b,2)-4*a*c))/(2*a)); x2=((b*(-1)-sqrt(pow(b,2)-4*a*c))/(2*a)); }
Leider bekomme ich folgende Fehler:
error C2440: 'Funktion': 'double' kann nicht in 'double *' konvertiert werden
Zeile 42
error C2440: '=': 'double' kann nicht in 'double *' konvertiert werden
Zeile 56
error C2440: '=': 'double' kann nicht in 'double *' konvertiert werden
Zeile 57Hm sollte doch bei Java bleiben ^^
Ne Spaß bei Seite jemand ne Idee?
-
Sollte das nicht so aussehen?
void berechne(double a, double b, double c,double *x1, double *x2) { *x1=((b*(-1)+sqrt(pow(b,2)-4*a*c))/(2*a)); *x2=((b*(-1)-sqrt(pow(b,2)-4*a*c))/(2*a)); }
Du willst doch nicht den Zeiger sondern den speicher auf den der Zeiger zeigt verändern.
Gruß Matthias
-
auserdem hast du auch vergessen deine funktions definition zu #ndern in zeile 8 fehlt noch ein double bevor die double* kommen
void berechne(double , double , /* -->*/ double, /* <--*/double *x1, double *x2 );
MFG
-
CTecS schrieb:
Sollte das nicht so aussehen?
void berechne(double a, double b, double c,double *x1, double *x2) { *x1=((b*(-1)+sqrt(pow(b,2)-4*a*c))/(2*a)); *x2=((b*(-1)-sqrt(pow(b,2)-4*a*c))/(2*a)); }
oder so:
void berechne (double a, double b, double c,double *x1, double *x2) { double v1 = sqrt(b*b-4*a*c); double v2 = 2*a; *x1=(v1-b)/v2; *x2=(-v1-b)/v2; }
^^wenn man nicht alles doppelt berechnen will
-
Erstmal Danke an alle.
Der Pprototyp war falsch und auch die Zeile x1= ..... ; bzw. x2= ..... ; müssen *x1 bzw +x2 heißen.
Wie gesagt danke.Hier mein fertiger (und funktionierender QC):
/* Berechnung für eine Gleichung des Chemas ax²+bx+c=0*/ /* Sebastian Jäschke */ #include <stdio.h> #include <math.h> /* Prototyp der Methode zum Berechnen der beiden Ergebnisse*/ void berechne(double a, double b, double c, double *x1, double *x2 ); /* Main mit Eigabe der Werte a,b,c für das Lösungschema (-b+-(Wurzel(b²-4ac))/(2a) Mögliche Fehler: b² < 4ac -> Negative Wurzel -> Keine relle Lösung a = 0 -> Division durch 0 -> Keine relle Lösung */ int main(void) { double erg1=0.,erg2=0.; double a=0.,b=0.,c=0.; printf("Geben Sie bitte die Werte a,b,c der Reihe nach ein\n"); printf("a = "); scanf("%lf",&a); printf("b = "); scanf("%lf",&b); printf("c = "); scanf("%lf",&c); printf(" ======================================== \n"); /* Ausgabe */ if ((b*b)-4*(a*c)<0) { printf("b*b-4ac darf nicht < 0 sein!\n"); } else { if (a == 0) { printf("a darf nicht 0 sein. Division durch 0 ist nicht erlaubt!\n"); } else { berechne(a,b,c,&erg1,&erg2); printf("Die Ergebnisse lauten:\n"); printf("a = %0.4f\n",a); printf("b = %0.4f\n",b); printf("c = %0.4f\n",c); printf("X1 = %0.6f\n",erg1); printf("X2 = %0.6f\n",erg2); } } return 0; } void berechne(double a, double b, double c,double *x1, double *x2) { *x1=((b*(-1)+sqrt(pow(b,2)-4*a*c))/(2*a)); *x2=((b*(-1)-sqrt(pow(b,2)-4*a*c))/(2*a)); }