Delphi 7 < Pascal < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 16:49 Sa 13.01.2007 | Autor: | garfieldone |
hallo alle zusammen,
ich habe ein ganz dringendes problem. und zwar möchte ich gerne mit delphi 7 gerne die binomialverteilung berechnen. mein spezielles problem ist die berechnung von n über k.
ich bin für jede kleinste hilfe und andeutung, wie ich das programmieren kann dankbar. ausführliche erklärungen würden mir besonders weiter helfen.
schon mal vielen dank
lg kerstin
|
|
|
|
Hallo Kerstin!
> mein spezielles problem ist die berechnung von n über k.
Das sollte nicht so schwierig sein, denke ich.
"n über k" ist ganz einfach wie folgt zu berechnen:
[mm] \vektor{n \\ k}=\bruch{n!}{k!(n-k)!}
[/mm]
Die Fakultäten im Bruch sollten sich relativ einfach z.B. mit einer FOR-Schleife oder einer REPAT-Schleife bestimmen lassen.
Gruß,
Tommy
|
|
|
|
|
hallöle,
erstmal vielen dank, dass hatte ich mir auch so gedacht... allerdings hapert es beim umsetzen, irgendwie steh ich momentan voll auf dem schlauch... könntest du mir oder jemand anderes bitte noch etwas genauer helfen?
vielen dank für eure mühe
lg kerstin
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 17:15 So 14.01.2007 | Autor: | rahu |
hallo kerstin
Tommy hat dir ja schon die formel zur bereichung gezeigt.
leider bin ich mir grade nicht sicher wie die syntax in delphi ist, hoffe aber dass sie wenigstens einigermaßen c - ähnlich ist
deine 2 varibalen n und k nenne ich mal k_in und n_in (beides int)
int Fakultaet(int in) //Funktion zur berechnung der Fakultät von in
{
int fak=1;
if(in<=0)return -1;
do{
fak = fak * in;
in--;
}while(in>0);
}
void main()
{
cin>>n_in;//einlesen n
cin>>k_in;//und k
if(n_in == k_in || n_in <= 0 || k_in <= 0)return;
cout<<"n über k="<<( Fakultaet(n_in) / (Fakultate(k_in)*(Fakultaet(n_in - k_in);
}
viele grüße
ralf
|
|
|
|
|
> hallöle,
> erstmal vielen dank, dass hatte ich mir auch so gedacht...
> allerdings hapert es beim umsetzen, irgendwie steh ich
> momentan voll auf dem schlauch... könntest du mir oder
> jemand anderes bitte noch etwas genauer helfen?
> vielen dank für eure mühe
> lg kerstin
Spontan fällt mir folgender ansatz dazu ein:
1) Der Bruch wird in drei Faktoren aufgeteilt:
Z sei die Fakultät im Zähler [n!].
N1 sei die erste Fakultät im Nenner [k!].
N2 sei die zweite Fakultät im Nenner [(n-k)!].
Somit musst du bei den Variablendeklarionen noch folgendes festlegen:
nueberk : longint; (Variable, welche am Ende das Ergebnis speichern soll)
i, Z, N1, N2 : longint; (i ist hier eine Laufzeitvariable, die wir Später brauchen)
2) Die einzelnen Fakultäten (also Z, N1 und N2) werden separat ermittelt. (vorher musst du natüröich die Parameter n und k einlesen - vielleicht indem du Werte aus einem Edit-Fenster ausliest)
Für Z ermittelt man den Wert wie folgt:
Z:=1; i:=1; (dies sind die Startwerte für Z und i; am besten weist du diese Werte gleich bei Programmstart zu. Besser wäre es jedoch die folgenden Anweisungen erst bei Proceduraufruf - oder Button-Click - zuzuweisen)
REPEAT
Z:=Z*i;
i:=i+1;
UNTIL i=n;
Anlog dazu gehst du bei der Bestimmung von k! und (n-k)! vor.
3) Es wird der Wert für nueberk mit folgender Anweisung ermittelt:
nueberk:=Z/(N1*N2);
4) Das Ergebnis wird ausgegeben (z.B. in ein Label)
Soweit meine Hinweise.
Einen Tipp noch am Schluß:
Definiere dir die Variablen am besten global (also im Hauptprogramm), dann sparst du dir die Übermittlung der Werte in die einzelnen Prozeduren.
Gruß,
Tommy
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:45 Mo 15.01.2007 | Autor: | Martin243 |
Hallo,
von mir noch eine kleine Optimierung der ersten beiden Punkte. Nicht Delpi-Spezifisches, nur etwas weniger Rechenaufwand. Ich erlaube mir, Tommys Text zu modifzieren:
1) Der Bruch wird in drei Faktoren aufgeteilt:
Z sei die Fakultät im Zähler dividiert durch max(k!, (n-k)!)
N sei die kleinere Fakultät im Nenner, also min(k!, (n-k)!)
Somit musst du bei den Variablendeklarionen noch folgendes festlegen:
nueberk : longint; (Variable, welche am Ende das Ergebnis speichern soll)
i, Z, N : longint; (i ist hier eine Laufzeitvariable, die wir Später brauchen)
2) Z und N werden separat ermittelt. (vorher musst du natüröich die Parameter n und k einlesen - vielleicht indem du Werte aus einem Edit-Fenster ausliest)
Für Z ermittelt man den Wert wie folgt:
Z:=1; i:=max(k+1, n-k+1); (oder wie auch immer die Funktion in Delphi lautet; dies sind die Startwerte für Z und i. Besser wäre es jedoch die folgenden Anweisungen erst bei Proceduraufruf - oder Button-Click - zuzuweisen)
REPEAT
Z:=Z*i;
i:=i+1;
UNTIL i >= n; (größer/gleich)
N:=1; i:=1;
REPEAT
N:=N*i;
i:=i+1;
UNTIL i = min(k,n-k); (oder die entsprechende Delphi-Funktion)
3) Es wird der Wert für nueberk mit folgender Anweisung ermittelt:
nueberk:=Z/N;
Das ist nur eine Frage de Effizienz. Für nicht allzu große Zahlen ist das aber unerheblich...
Gruß
Martin
|
|
|
|