www.vorhilfe.de
- Förderverein -
Der Förderverein.

Gemeinnütziger Verein zur Finanzierung des Projekts Vorhilfe.de.
Hallo Gast!einloggen | registrieren ]
Startseite · Mitglieder · Impressum
Forenbaum
^ Forenbaum
Status VH e.V.
  Status Vereinsforum

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Suchen
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Softwaretechnik und Programmierung" - Programm funktioniert nicht
Programm funktioniert nicht < Softwaretechnik+Pro < Praktische Inform. < Hochschule < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Softwaretechnik und Programmierung"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

Programm funktioniert nicht: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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);



}

        
Bezug
Programm funktioniert nicht: Antwort
Status: (Antwort) fertig Status 
Datum: 11:09 Do 02.06.2011
Autor: fencheltee

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

Bezug
                
Bezug
Programm funktioniert nicht: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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

Bezug
                        
Bezug
Programm funktioniert nicht: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 16:24 Do 02.06.2011
Autor: Event_Horizon

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ß.


Bezug
                        
Bezug
Programm funktioniert nicht: Antwort
Status: (Antwort) fertig Status 
Datum: 13:24 So 05.06.2011
Autor: MathePower

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

Bezug
                
Bezug
Programm funktioniert nicht: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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


Bezug
        
Bezug
Programm funktioniert nicht: Antwort
Status: (Antwort) fertig Status 
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


Bezug
                
Bezug
Programm funktioniert nicht: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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

Bezug
                        
Bezug
Programm funktioniert nicht: Antwort
Status: (Antwort) fertig Status 
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


Bezug
                
Bezug
Programm funktioniert nicht: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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

Bezug
                        
Bezug
Programm funktioniert nicht: Antwort
Status: (Antwort) fertig Status 
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


Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Softwaretechnik und Programmierung"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
ev.vorhilfe.de
[ Startseite | Mitglieder | Impressum ]