Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
05.03.2002, 18:09
xoix



ich bringe mir gerade funktionen bei (ich versuche es ) und wollte mir eine funktion machen, die mir die pq formel berechnet.
nun ja seht selbst:

Quellcode:
int pq (int x1, int x2, int b)   //x1*x²+x2*x+b=0    so ist der term
{

x2 /= x1;
b  /= x1;

x1 = -(x2/2) + sqrt((x2*x2)-b);  //wie ziehe ich ne wurzel in c
x2 = -(x2/2) - sqrt((x2*x2)-b);  //bzw. wie mache ich hoch ²
}

nun ich hab mal noch nicht kompiliert denn es wird in der weise sicherlich nicht funktionieren (sqrt lol - thx delphi :D) und mir ist noch nicht ganz klar wie ich das mit dem zurückgeben mache, denn ich lerne ja noch...

--

zum Seitenanfang zum Seitenende Profil || Suche
001
05.03.2002, 18:20
Tron



1. ich wuerd die parameter und den rueckgabewert als float deklarieren, das ist sinnvoller fuer gemischt quadratische gleichungen.
2. nix lol von wegen sqrt - die funktion heisst auch in c sqrt, deklriert ist sie in math.h
3. quadrieren machst du am besten mit x * x, es gibt auch die funktion pow(basis, exponent)
4. return das_was_du_zurueckgeben_willst;

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
002
05.03.2002, 18:23
xoix



dann lag ich ja gar nicht so falsch :)
kann ich auch 2 dinge auf einmal zurückgeben?
return x1;
return x2;
und x*x hab ich ja gemacht, wollte nur wissen obs da was besseres gibt, also programmiertechnisch und pow kannte ich nicht

thx für die antwort

--


Dieser Beitrag wurde am 05.03.2002 um 18:49 von xoix bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
003
05.03.2002, 18:31
Tron



Zitat:
xoix postete
kann ich auch 2 dinge auf einmal zurückgeben?
also
return x1;
return x2;

NEIN, kann man nicht. (darauf haette man durhc einfaches ueberlegen kommen keonnen *grr*)
sobald ein return kommt, wird dieser wert zurueckgegben und die funktion verlassen, es sind also durchaus mehrere returns erlaubt, z.b.

int f(int x)
{
..if (0 == x) return 42;
..if (1 == x) return 1;
..return x / 2;
}
// zugegeben, ziemlich doofes beispiel

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
004
05.03.2002, 18:49
xoix



Zitat:
Tron postete
NEIN, kann man nicht. (darauf haette man durhc einfaches ueberlegen kommen keonnen *grr*)

das war mir schon klar, es war ja auch ironisch gemeint, es war eine indirekte frage wie ich es sonst machen könnte...

--

zum Seitenanfang zum Seitenende Profil || Suche
005
05.03.2002, 19:10
xoix



also ich habe es jetzt mal probiert aber es funktioniert natürlich nicht, ich glaube ich habe da ein grundlegendes verständniss problem, also bitte nicht hauen für logische verunglimpfung:
Quellcode:#include <stdio.h>
#include <math.h>

float pqa (float& x1, float& x2, float& b)
{

x2 /= x1;
b  /= x1;
x1 = -(x2/2) + sqrt((x2*x2)-b);
return (x1);
}
float pqb (float& x1, float& x2, float& b)
{

x2 /= x1;
b  /= x1;

x2 = -(x2/2) - sqrt((x2*x2)-b);
return (x2);
}

int main()
{
float a,b,c;
printf("Geben sie die Zahlen so an(axhoch2+bx+c) : a b c\n");
scanf("%d %d %d",&a,&b,&c);
pqa(a,b,c);
printf("P1(%d | 0)\n",a);
pqb(a,b,c);
printf("P2(%d | 0)\n",a);

}

--

zum Seitenanfang zum Seitenende Profil || Suche
006
05.03.2002, 19:24
Tron



Zitat:
xoix postete
Quellcode:pqa(a,b,c);
printf("P1(%d | 0)\n",a);
pqb(a,b,c);
printf("P2(%d | 0)\n",a);

mannmannmann... denk mal genau nach was da in diesen zeilen gemacht wird, vor allem was printf ausgibt.

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
007
05.03.2002, 19:27
xoix



*verzweifel*

Quellcode:printf("P1(%d | 0)\n",pqa(a,b,c));  // ausgabe P1(0 | 0)
printf("P2(%d | 0)\n",pqb(a,b,c)); // ausgabe P2(0 | 0) *heul

so?
also ich glaube ich sollte lieber langsamer machen mit funktionen, ich mache das thema erst seit heute und ich sollte vielleicht lieber mit etwas kleinerem anfangen...

p.s. kannst du mir sagen was ich falsch mache? ich komme grad echt nicht drauf :(

--


Dieser Beitrag wurde am 05.03.2002 um 19:28 von xoix bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
008
05.03.2002, 19:29
Tron



Zitat:
xoix postete
Quellcode:printf("P1(%d | 0)\n",pqa(a,b,c));
printf("P2(%d | 0)\n",pqb(a,b,c));

wie waer's mit erst testen und dann fragen? sieht doch schon viel besser aus (;

<edit>das seht ich ja jetzt erst... mach mal GANZ SCHNELL die referenzen weg, das ist wirklich was fuer fortgeschrittene, damit basut du namelich grade ziemlich unfug!</edit>

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett


Dieser Beitrag wurde am 05.03.2002 um 19:31 von Tron bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
009
05.03.2002, 20:30
xoix



ja hab ich weggemacht, er druckt trotzdem nur 0 | 0 aus...
grrr

--

zum Seitenanfang zum Seitenende Profil || Suche
010
05.03.2002, 23:05
Codemasta



öhm .. entweder ist das neu oder ich hab keine ahung was float betrifft, aber seit wann macht man in nem funktions-header: float& x1 ??

also wenns sowas ibt, klärt mich bitte mal jemand diesbezüglich auf!

mfg codi

--

Ich wollt nur helfen ;(

zum Seitenanfang zum Seitenende Profil || Suche
011
06.03.2002, 00:33
Kriz



Muß der olle Kriz datt erstmal wieder geradebiegen, oder watt hier?

Erstmal zum mathematischen Verständnis: Die PQ-Formel funktioniert für den normalen Zahlengebrauch nur, wenn das Ergebnis unter der Wurzel positiv ist. Falls dies nicht der Fall sein sollte, muß man den Zahlenraum für die komplexen Zahlen verwenden. Erst dort wird eine negative Wurzel ziehbar. C++ unterstützt die komplexen Zahlen infolge der STL (Standard Template Library), ansonsten muß man sich diese Dinger in C durch Strukturen und passende Funktionen selber zusammenbasteln (außer man hat bereits eine passende C-Bibliothek irgendwo gefunden).

Ok, gehen wir mal davon aus, daß die komplexen Zahlen nicht behandelt werden sollen. Dann sieht der Code in C so aus (C++ rafft das natürlich auch):
Quellcode:#include <stdio.h>
#include <math.h>

int pq(double, double, double);

int main()
{
....double a, b, c, x; // Für ax²+bx+c = 0
....printf("a, b und c eingeben: ");
....scanf("%lf %lf %lf", &a, &b, &c);
....return pq(a, b, c);
}

int pq(double a, double b, double c)
{
....double p, q; // PQ-Werte
....double x1, x2; // Ergebniswerte
....double ptemp, qtemp; // Für Zwischenwerte
....
....// PQ-Formel: x1/x2 = -(p/2) ± Quadratwurzel( (p/2)² - q )
....
....// Falls a != 1, dann b und c durch a teilen
....if(a != 1.0)
....{
........b /= a;
........c /= a;
....}
....
....// b = p und c = q
....p = b;
....q = c;
....
....// p berechnen
....ptemp = -(p/2.0);
....
....// Wurzelteil berechnen
....qtemp = ((p/2.0)*(p/2.0)) - q;
....
....// qtemp muß positiv sein für diesen Zahlenbereich
....if(qtemp < 0.0)
....{
........printf("\a\nNegative Wurzel!\n");
........return 1;
....}
....else q = sqrt(qtemp); // Ansonsten Wurzel ziehen
....
....// ptemp nach p kopieren
....p = ptemp;
....
....// Ergebnisse berechnen
....x1 = p + q;
....x2 = p - q;
....
....// Ergebnis anzeigen
....printf("\n\nx1 = %f, x2 = %f\n", x1, x2);
....
....return 0;
}

Diese Funktion gibt das Ergebnis bereits in sich selber aus. Wenn man aber nur die Ergebnisse zurückliefern möchte, braucht man hier in C den Einsatz von Zeigern, da eine Funktion nur einen Wert zurückliefern kann. Das sähe dann so aus:
Quellcode:#include <stdio.h>
#include <math.h>

int pq(double, double, double, double*, double*);

int main()
{
....double a, b, c; // Für ax²+bx+c = 0
....double x1, x2; // Ergebniswerte, damit f(x) = 0 wird
....printf("a, b und c eingeben: ");
....scanf("%lf %lf %lf", &a, &b, &c);
....if(pq(a, b, c, &x1, &x2))
....{
........printf("\a\nNegative Wurzel!\n");
........return 1;
....}
....printf("\n\nx1 = %f, x2 = %f\n", x1, x2);
....return 0;
}

int pq(double a, double b, double c, double *x1, double *x2)
{
....double p, q; // PQ-Werte
....double ptemp, qtemp; // Für Zwischenwerte
....
....// PQ-Formel: x1/x2 = -(p/2) ± Quadratwurzel( (p/2)² - q )
....
....// Falls a != 1, dann b und c durch a teilen
....if(a != 1.0)
....{
........b /= a;
........c /= a;
....}
....
....// b = p und c = q
....p = b;
....q = c;
....
....// p berechnen
....ptemp = -(p/2.0);
....
....// Wurzelteil berechnen
....qtemp = ((p/2.0)*(p/2.0)) - q;
....
....// qtemp muß positiv sein für diesen Zahlenbereich
....if(qtemp < 0.0) return 1; // Negative Wurzel gefunden, abbrechen
....else q = sqrt(qtemp); // Ansonsten Wurzel ziehen
....
....// ptemp nach p kopieren
....p = ptemp;
....
....// Ergebnisse berechnen (durch Zeiger-Dereferenzierung)
....*x1 = p + q;
....*x2 = p - q;
....
....return 0;
}

Voilá =)

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
012
06.03.2002, 06:56
Tron



@Kriz: sehr schoene ausfuehrung (:

Zitat:
Codemasta postete
öhm .. entweder ist das neu oder ich hab keine ahung was float betrifft, aber seit wann macht man in nem funktions-header: float& x1 ??

also wenns sowas ibt, klärt mich bitte mal jemand diesbezüglich auf!

mfg codi

soso... du willst ein mod coden, hast angeblich ahnung von c++ und weisst aber nicht mal was eine referenz ist, soviel zu deiner ahnung von c++.

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
013
06.03.2002, 07:42
Codemasta



öhm .. eig. kann ich c++ aber über sowas steht in meinem c++ buch nix drin, in tutorials hab ich sowas auch noch nicht gesehen ?!?

naja, werd mich mal erkundigen!

und tron: du musst nicht alle runter machen wenn sie was nicht wissen ja, macht das jemand auch bei dir?? bestimmt nicht!

--

Ich wollt nur helfen ;(

zum Seitenanfang zum Seitenende Profil || Suche
014
06.03.2002, 13:50
Prefect



Übrigens gibt's auf http://www.thewall.de/coding/ ein Tutorial zu Funktionen.

Persönlich würde ich pass-by-reference (also diese &-Teil) nur für const-Parameter verwenden. Aber das ist wie gesagt MHO.

IIRC sieht der C99-Standard auch Unterstützung für komplexe Zahlen in C vor. Wofür das eigentlich gut sein soll weiß ich allerdings nicht. Wer mit komplexen Zahlen rechnet benötigt wahrscheinlich eh komplexer Mathelibs, am besten welche die auch gleich unendliche Genauigkeit und so unterstützen. Wie auch immer...

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
015
06.03.2002, 14:43
apfelkorn



öhm, prefi? auch der moderne heimcomputer hat bis jetzt nur normalerweise 256 mb speicherplatz... das dürfte ein wenig schwierig werden mit unendlicher genauigkeit...

--

zum Seitenanfang zum Seitenende Profil || Suche
016
06.03.2002, 15:36
[RMen]OneStone



Also das beste ist ja immernoch so:

pq.h
Quellcode:#include <math.h>

typedef struct pq_return_s
{
float x1, x2;
} pq_return_t;

pq.c
Quellcode:pq_return_t pq(float x1, float x2, float b)
{
pq_return_t pqrResult;
memset(&pqrResult, 0, sizeof(pq_return_t));

//deine Rechnung goes here...

pqrResult.x1 = 0; //or whatever ;)
pqrResult.x2 = 0; // or whatever
return pqrResult;
}

Was natürlich auch geht:

Quellcode:#include "pq.h"

float* pq(float x1, float x2, float b)
{
float *pfResult = 0;
pfResult = (float*) malloc(sizeof(float) * 2);

//deine Rechnung...

pfResult[0] = x1;
pfResult[1] = x2;
return pfResult;
}

Aber bitte vergiss am Ende deines Programms das free( ... ) nicht! Bevor jetzt irgend ein Neunmalkluger behauptet man könnte auch direkt float pfResult[2]; schreiben: Nein! Das geht nicht, da sonst der Array am Ende der Funktion destruktiert werden würde.

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/


Dieser Beitrag wurde am 06.03.2002 um 15:38 von [RMen]OneStone bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
017
06.03.2002, 16:08
Prefect



Nun, wenn man statt mit 3,1415926... einfach symbolisch mit Pi rechnet kann man durchaus unendliche Genauigkeit erreichen ;P

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
018
06.03.2002, 17:39
Kriz



Prefi:

Zitat:
Persönlich würde ich pass-by-reference (also diese &-Teil) nur für const-Parameter verwenden. Aber das ist wie gesagt MHO.
Da hast du vollkommen recht. Zeiger und Referenzen sollten bei read-only Gebrauch nur als const übergeben werden, bei read/write dagegen weniger. Es gibt da so eine böse Konstellation bei C++, mit denen man z.B. Klassenelemente trotz const Deklaration von außerhalb her ändern kann (Stichwort: mutable), aber das halte ich für super evil, denn dann kann man sich konstante Objekte eh sparen...

Komplexe C-Libs aufzubauen ist nicht schwer, man muß halt nur in Mathe ein wenig aufgepaßt und die Unterlagen noch alle beisammen haben, dann geht das schon.

Aber da die meisten eh (unwissentlich) C in einem C++ Compiler programmieren, sollte der Einsatz der <complex.h> nicht so tragisch sein. Außer man programmiert explizit in C (xyz.c), dann wird's eben kritisch. Da ich aber schon gehört habe, daß der GNU-C++ Compiler im Bereich der STL einige Defizite aufweisen soll, bin ich mir im Moment nicht sicher, ob die <complex.h> im aktuellen Release des GNU-C++ Compilers vollständig implementiert worden ist.

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
019
10.03.2002, 18:28
faer



@ Topic-Starter: Du solltest du Namen anders machen, sodass die Formel so aussieht: ax²+bx+c = 0. Das ist eigentlich die normale mathematische Schreibweise.

PS.: Das ist uebrigens nicht die pq-Formel, sondern eine Nullstellen-Gleichung einer Quadratischen Funktion. :D

--

Miss Mapple a GNU Half-Life Map Editor

zum Seitenanfang zum Seitenende Profil || Suche
020
10.03.2002, 18:35
Tron



genau genommen ist es gleichung zur bestimmung der nullstellen einer gemischtquadratischen gleichung. (;

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
021
10.03.2002, 19:10
apfelkorn



und überhaupt ist es schon fast eine reelle gleichung

--

zum Seitenanfang zum Seitenende Profil || Suche
022
10.03.2002, 19:12
Tron



eh? was du sagen wollen? ok, die grundmenge ist R, aber das hat nichts mit der gleichung zu tun, in C (die menge, nicht die sprache) sieht die gleichung immernoch genauso aus, nur dass sie dann immer loesungen hat.

--

'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams

'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett

zum Seitenanfang zum Seitenende Profil || Suche
023
10.03.2002, 22:50
apfelkorn



und ausserdem ist überhaupt die eigentliche lösung

--

zum Seitenanfang zum Seitenende Profil || Suche