Berechnung von Binomialkoeffizienten

Baqk10

Mitglied
Guten Tag,
ich habe ein Problem, ich möchte ein Programm zur Berechnung von Binomialkoeffizienten schreiben(in C), jedoch müssen die Zahlen n und k eingelesen werden.
Es soll also anpassungsfähig sein.
In meiner for Schleife jedoch, weiß ich nicht wie ich die Variable deklarieren soll, damit die eingelesene Zahl genommen werden soll.
Als Beispiel :
ich nutze
PHP:
for(x==x; x==0; x-1)...
das Problem liegt im x==x, jedoch weiß ich nicht, wie ich es anders machen soll.

Hier der ganze Code, er ist compilierbar jedoch überspringt er alle for Schleifen:

PHP:
#include <stdio.h>
#include <stdlib.h>

int main()
{
int x,y,z;
float e=0;
float f=0;
float E=0;
float End=0;

printf("Gib die obere Zahl ein !\n");
scanf("%d",&x);
printf("Gib die untere Zahl ein !\n");
scanf("%d",&y);

for(x==x; x==0; x-1){
    e = x*(x-1);
    printf("e ist %f\n",e);
}
for (y==y; y==0; y-1){
    f=y*(y-1);
    printf("f ist %f\n",f);
    }

    z=x-y;
for (z==z; z==0; z-1){
    E=z*(z-1);
    printf("E ist %f\n",E);
    }

End =e/(f*E);
printf("\n\nDas Endergebnis ist %f",End);
}
 

cwriter

Erfahrenes Mitglied
Hi

das Problem liegt im x==x, jedoch weiß ich nicht, wie ich es anders machen soll.
Warum machst du es überhaupt so?
Willst du den Binomialkoeffizient überhaupt auf den Reellen Zahlen haben?`Dein Code sieht eher wie die Natürlichen Zahlen aus, also weg mit den floats.
Dann ist for folgendermassen definiert:
for(Start;Bedingung;Operation)
Start: Wird einmalig vor der Schleife ausgeführt.
Bedingung: Wird vor jedem Schleifendurchgang überprüft. Falls true, dann Schleife, sonst Ausbruch.
Operation: Wird am Ende jedes Durchgangs ausgeführt. Normalerweise wird darin die Iteration ausgeführt.

x==x ist immer true und daher doppelt unsinnig, denn in diesem Feld solltest du etwas machen, nicht etwas überprüfen.
Dann setzt du 'z' zu spät, denn bis dahin wären x und y schon andere Werte, wenn du denn tatsächlich x und y verändern würdest, aber du fragst den Computer nur, was x-1 (y-1) ist, statt im zu sagen, er solle x bzw. y verringern (x-- / x-=1).
Dann kannst du am Ende deine e/(fE) ausführen, aber auch das muss nicht float sein (warum?).

Hier der ganze Code, er ist compilierbar jedoch überspringt er alle for Schleifen:
Er überspringt alle Schleifen, wie die Bedingung x==0 halt nur dann wahr ist, wenn du 0 für x eingegeben hast. Du meinst wohl x != 0 bzw x > 0.

Gruss
cwriter
 

Baqk10

Mitglied
So, danke ich habe jetzt verstanden wieso float unnötig ist :D.
Aber das x==x hab ich gemacht, damit der eingelesene x Wert von scanf abgefragt wird.
Aber wie definiere ich diesen dort? Also ich stelle mir das so vor x=(Die Zahl die Eingelesen wurde).
Wie verwirkliche ich das, kannst du mir das sagen?
Ich dachte x==x sei Ok, weil in x der eingelesene Wert ist..
 

cwriter

Erfahrenes Mitglied
Aber das x==x hab ich gemacht, damit der eingelesene x Wert von scanf abgefragt wird.
Wurde es schon beim Scanf-Aufruf.
Aber wie definiere ich diesen dort?
Definiert hast du ihn gar nicht. Du hast x nur deklariert. Normalerweise initialisiert man die Variablen, bevor man sie an Funktionen übergibt (undefined behaviour). Hast du bei den floats auch gemacht (wenn auch falsch, float wäre "0.f", nicht "0"), aber bei den ints fehlt das.
Also ich stelle mir das so vor x=(Die Zahl die Eingelesen wurde).
Da du die Zahl in scanf schon nach x eingelesen hast, kannst du das erste Feld leer lassen (oder einfach "x" schreiben). Leerlassen ist aber für den Compiler besser.
Ich dachte x==x sei Ok, weil in x der eingelesene Wert ist..
Was macht denn == deiner Meinung nach?
Es ist schon ok, es hat einfach keinen sinnvollen Effekt.

Gruss
cwriter
 

Baqk10

Mitglied
Also ich verstehe nun was du mir sagen willst, mein Problem ist einfach, dass die for Schleifen übersprungen werden, eben weil wie du sagst x==x es nicht bringt und meine Bedingung falsch angegeben ist, das habe ich jetzt korrigiert, vielen Dank :D.
Es funktioniert nun bis "End = e /(f*E);"
Ich probiere ein wenig rum und würde dich ggf. bitte nochmal um Rat fragen falls es nicht klappt, aber ich denke es wird schon.
Vielen Dank :D
MfG