Programm funktioniert nicht < Softwaretechnik+Pro < Praktische Inform. < Hochschule < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 11:00 Do 02.06.2011 | Autor: | jacob17 |
Hallo,
Möchte gerne ein Programm in C schreiben welches die Binomialkoeffizienten bis zu einem gewissen n berechnet. Dss Kompilieren funktioniert noch wunderbar, jedoch berechnet er nichts. Egal was man für n eingibt es erscheint jedesmal nur n mal die 1. Entdeckt jemand von euch den Fehler irgendwo? Denk' das irgendwas mit meiner Schleife in der Funktion binom nicht stimmt. Viele Grüße
jacob
#include <stdio.h>
int fakul(int a) {
int i,prod;
prod=1;
if(a==0)
return 1;
else
for(i=1;i<=a;i++) {
prod=prod*i;
}
return prod;
}
void binom(int b) {
int i,j,ko;
for(i=0;i<=b;i++) {
for(j=0;j<=i;j++)
ko=fakul(i)/(fakul(j)*fakul(i-j));
printf("%i",ko);
[mm] printf("\n");
[/mm]
}}
main()
{
int N;
printf("Bitte n eingeben: ");
scanf("%i",&N);
binom(N);
}
|
|
|
|
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
> Hallo,
> Möchte gerne ein Programm in C schreiben welches die
> Binomialkoeffizienten bis zu einem gewissen n berechnet.
> Dss Kompilieren funktioniert noch wunderbar, jedoch
> berechnet er nichts. Egal was man für n eingibt es
> erscheint jedesmal nur n mal die 1. Entdeckt jemand von
> euch den Fehler irgendwo? Denk' das irgendwas mit meiner
> Schleife in der Funktion binom nicht stimmt. Viele Grüße
> jacob
>
>
> #include <stdio.h>
>
> int fakul(int a) {
> int i,prod;
> prod=1;
> if(a==0)
> return 1;
> else
> for(i=1;i<=a;i++) {
> prod=prod*i;
> }
> return prod;
> }
>
> void binom(int b) {
> int i,j,ko;
> for(i=0;i<=b;i++) {
> for(j=0;j<=i;j++)
> ko=fakul(i)/(fakul(j)*fakul(i-j));
> printf("%i",ko);
> [mm] printf("\n");[/mm]Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
>
> }}
>
>
> main()
> {
>
> int N;
> printf("Bitte n eingeben: ");
> scanf("%i",&N);
> binom(N);
>
>
>
> }
hallo, da mein zug gleich kommt nur ne kleine anmerkung:
du berechnest nen bruch (beim binom) speicherst und gibst aber als int aus!
gruß tee
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 11:49 Do 02.06.2011 | Autor: | jacob17 |
Vielen Dank für deine Antwort.
Habe nun ko als Typ double initialisiert. Jetzt erscheint jedoch statt n-mal der 1 der Wert 0 :( Stimmt eigentlich die Logik dieser for Schleifen? Zunächst ist i gleich Null dann wird die innere Schleife durchlaufen für j ist Null dann geht es mit der äußeren weiter mit i gleich eins dann in die innere mit j=0 und j=1; Eigentlich müsste man das doch so programmieren könenn?
jacob
|
|
|
|
|
Hallo!
Ich bin auch etwas in Eile, und hab deine Schleifen nicht all zu genau geprüft.
Aber: Das Deklarieren von ko als double reicht u.U. nicht, weil die Division auf zwei INTs erfolgt, das Ergebnis sollte erstmal auch ein INT sein.
Evtl solltest du gleich bei der Berechnung der Fakultät ein DOUBLE benutzen. Das INT ist hier schlecht, weil es nen Maximalwert von 2,1Mrd hat, das wird bei Fakultäten schnell erreicht. Besser wäre ein UNSIGNED LONG, aber das DOUBLE hat den größen Zahlenbereich (Wenngleich die Anzahl der Stellen nicht so hoch ist wie beim UNSIGNED LONG)
Dann eine Optimierung: Du hast da ein [mm] \frac{i!}{j!} [/mm] mit $i>j_$ Überlege mal, daß sich da einiges rauskürzt, z.B. bei [mm] \frac{5!}{3!}=\frac{5*4*3*2*1}{3*2*1}=5*4
[/mm]
Das spart Rechenzeit, und die Zahlen werden nicht so groß.
|
|
|
|
|
Hallo jacob17,
> Vielen Dank für deine Antwort.
> Habe nun ko als Typ double initialisiert. Jetzt erscheint
> jedoch statt n-mal der 1 der Wert 0 :( Stimmt eigentlich
> die Logik dieser for Schleifen? Zunächst ist i gleich Null
> dann wird die innere Schleife durchlaufen für j ist Null
> dann geht es mit der äußeren weiter mit i gleich eins
> dann in die innere mit j=0 und j=1; Eigentlich müsste man
> das doch so programmieren könenn?
In der Funktion void binom(int b) sind
geschweifte Klammern vergessen worden:
void binom(int b) {
int i,j,ko;
for(i=0;i<=b;i++) {
for(j=0;j<=i;j++)
{
ko=fakul(i)/(fakul(j)*fakul(i-j));
printf("%i",ko);
/* [mm] printf("\n"); [/mm] */
}
}}
> jacob
Gruss
MathePower
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:19 Do 02.06.2011 | Autor: | felixf |
Moin!
> hallo, da mein zug gleich kommt nur ne kleine anmerkung:
> du berechnest nen bruch (beim binom) speicherst und gibst
> aber als int aus!
Was so auch richtig ist. Binomialkoefizienten sind nunmal ganzzahlig :)
LG Felix
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 17:28 Do 02.06.2011 | Autor: | felixf |
Moin!
> Möchte gerne ein Programm in C schreiben welches die
> Binomialkoeffizienten bis zu einem gewissen n berechnet.
> Dss Kompilieren funktioniert noch wunderbar, jedoch
> berechnet er nichts. Egal was man für n eingibt es
> erscheint jedesmal nur n mal die 1. Entdeckt jemand von
> euch den Fehler irgendwo?
Du willst das printf("%i",ko); in der innersten Schleife jedes mal durchfuehren. Momentan wird es nur nach der innersten Schleife ausgefuehrt, und ko hat dort den Wert [mm] $\binom{i}{i} [/mm] = 1$.
Du musst also geschweifte Klammern verwenden :)
Aber ganz allgemein. Du verwendest hier den moeglichst unguenstigsten und problematischsten Weg, alle Binomialkoeffizienten auszurechnen. Problematisch deswegen, da die Fakultaeten gerne mal nicht mehr in ein int passen, obwohl der zugehoerige Binomialkoeffizient noch locker in ein int passt. Und unguenstig, da du sehr viele Dinge viel zu oft ausrechnest und dein Programm damit unnoetig lange rechnet.
Besser geht es so: erstelle ein zweidimensionales Array der Groesse $(N+1) [mm] \times [/mm] (N+1)$, von dem du alle Eintraege $(i, j)$ mit $j [mm] \le [/mm] i$ nutzt, und fuelle es mit Hilfe der Additionsformel fuer Binomialkoeffizienten so, dass an $(i, j)$ der Wert [mm] $\binom{i}{j}$ [/mm] steht.
Das kannst du mit [mm] $O(N^2)$ [/mm] Additionen bewerkstelligen, und die auftretenden ganzen Zahlen verlassen nur dann den Wertebereich eines ints, wenn die Binomialkoeffizienten selber nicht mehr reinpassen.
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:29 Do 02.06.2011 | Autor: | jacob17 |
Hallo,
Das mit dem Feld probier ich später gleich mal aus.
Habe jetzt hinter der inneren Schleife um mein printf und der Variablenzuweisung für ko geschweifte Klammern gesetzt. Jetzt erscheint aufjedenfall nicht mehr nur die eins :)
In der Aufgabenstellung heißt es man solle eine Funktion schreiben mit int bin(int n,int k), wobei die Ergebnisse in einem Pascalschen Dreieck ausgegeben werden sollen. Jedoch frage ich mich warum man der Funktion noch eine zweite Variable übergeben soll. Falls man das tut wird doch nur n über k berechnet und nicht alle Kombinationen mit [mm] 0\le [/mm] k [mm] \le [/mm] n Somit kann man die Funktion schon so stehen lassen obwohl ihr nur eine Variable übergeben wird? Die Ausgabe ist jetzt schon ein Dreieck, jedoch stimmen die Reihenfolge und die Werte noch nicht ganz. Seid ihr sicher dass diese Schleifenkonstruktion der richtige Ansatz ist?
viele grüße
jacob
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 02:01 So 05.06.2011 | Autor: | felixf |
Moin!
> In der Aufgabenstellung heißt es man solle eine Funktion
> schreiben mit int bin(int n,int k), wobei die Ergebnisse in
> einem Pascalschen Dreieck ausgegeben werden sollen.
Damit kannst du die Feld-Methode ignorieren. Du sollst das hier wohl ganz primitiv mit der Fakultaetsmethode erledigen.
> Jedoch
> frage ich mich warum man der Funktion noch eine zweite
> Variable übergeben soll. Falls man das tut wird doch nur n
> über k berechnet und nicht alle Kombinationen mit [mm]0\le[/mm] k
> [mm]\le[/mm] n
Genau. Die Funktion soll ja auch nur [mm] $\binom{n}{k}$ [/mm] berechnen fuer gegebenes $n$ und $k$.
Und dann sollst du eine verschachtelte Schleife machen (wie du das schon hast), in der fuer jede Kombination von $n$ und $k$ der Binomialkoeffizient [mm] $\binom{n}{k}$ [/mm] ausgerechnet und ausgegeben wird.
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:44 Do 02.06.2011 | Autor: | jacob17 |
Also die Reihenfolge und die Werte stimmen doch. Jedoch fehlt der obere rechte Rand der nur aus einsen besteht. Habe die Laufindizes i und j bereits von Null auf Eins erhöht. Sieht jemand von euch den Fehler?
jacob
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 01:59 So 05.06.2011 | Autor: | felixf |
Moin!
> Also die Reihenfolge und die Werte stimmen doch. Jedoch
> fehlt der obere rechte Rand der nur aus einsen besteht.
> Habe die Laufindizes i und j bereits von Null auf Eins
> erhöht. Sieht jemand von euch den Fehler?
Nunja, wenn du den Laufindex von i und j nicht bei 0 anfangen laesst, dann ist es auch kein Wunder dass die Einsen fehlen... Es ist doch [mm] $\binom{n}{0} [/mm] = 1$ fuer jedes $n$.
LG Felix
|
|
|
|