Interpretation FOREACH in C



  • Hallo Leute,

    habe ein kleines Problem beim interpretieren dieser Pseudocode Foreach-Schleife,
    also ich will die folgende Schleife in C-Code umsetzten!

    For k from 0 to 2t -2 do
    {
       For each element of {(i, j ) | i + j = k, 0 [e]le[/e] i [e]le[/e] j [e]le[/e] t -1} do
       {
    
       }
    }
    

    was einer dieses Konstrukt in C-Code umzu setzen?? Vielen Dank schonmal!



  • Dafür gibts die For-Schleife 😉
    Bei der inneren Anweisung versteh ich allerdings nicht, was du meinst, und kann es deshalb nicht umsetzen.
    Wie wärs übrigens, wenn du zuerst C-Grundlagen anschauen würdest?

    //For k from 0 to 2t -2 do
    for (int k = 0; k < 2*t-2; k++)
    {
       // hier wäre die innere Schleife
    }
    


  • Nexus schrieb:

    Dafür gibts die For-Schleife 😉
    Bei der inneren Anweisung versteh ich allerdings nicht, was du meinst, und kann es deshalb nicht umsetzen.
    Wie wärs übrigens, wenn du zuerst C-Grundlagen anschauen würdest?

    //For k from 0 to 2t -2 do
    for (int k = 0; k < 2*t-2; k++)
    {
       // hier wäre die innere Schleife
    }
    

    *griiiiiiiiiiiiiiiiiins*

    natürlich versteh ich die äussere Schleife auch :p

    die innere Schleife ist aus einem Buch und das meint das, nicht ich ^^



  • int k, i, j;
    for (k = 0; k <= 2*t-2; ++k){
    	for(j = (k+1)/2; j <= k && j <= t-1; ++j){
    		i = k - j;
    		// ...
    	}
    }
    

    Nicht getestet!



  • Ben04 schrieb:

    int k, i, j;
    for (k = 0; k <= 2*t-2; ++k){
    	for(j = (k+1)/2; j <= k && j <= t-1; ++j){
    		i = k - j;
    		// ...
    	}
    }
    

    Nicht getestet!

    hui heftige schleife 😉 hm muss ich ich mal schritt für schritt durchgehen,
    auf anhieb versteh ich besonders nicht warum j = (k+1)/2

    auf jeden Fall Danke für die Antwort 🙂

    für weitere Vorschläge bin ich dennoch dankbar :p



  • alfredo78 schrieb:

    auf anhieb versteh ich besonders nicht warum j = (k+1)/2

    (k+1)/2 ist k/2 aufgerundet. j muss bei (k+1)/2 starten damit gilt i <= j.



  • Hya!

    Meine Interpretation sieht da so aus:

    #include <stdio.h>
    int main()
    {
    	int t=???, // t>=3
             k=0, i=0, j=0;
    
    	for ( k=4; k<2*t-2; k+=2 )
    	{
    		i=j=k/2;
    	}
    	return 0;
    }
    

    Erst ab k=4 gibt es ein i und ein j, das die bedingung i + j = k, 0 ≤ i ≤ j ≤ t -1
    erfüllt.
    desweiteren existiert für alle ungeraden k kein (i und j) das die bedingung erfüllt, daher das k+=2 in der for schleife
    🕶



  • Big Brother schrieb:

    Erst ab k=4 gibt es ein i und ein j, das die bedingung i + j = k, 0 ≤ i ≤ j ≤ t -1 erfüllt.

    😕
    Was ist mit i = j = k = 0 und t = 2 ?

    desweiteren existiert für alle ungeraden k kein (i und j) das die bedingung erfüllt,

    Was ist mit i = 0, j = 1, k = 1, t = 2 ?



  • oh, stimmt, für 0, 2, gilt das ja auch.
    ich ich bin da von ganzzahligen typen ausgegangen.
    wenn man die ungeraden werte dazu nimmt, kommt man meiner meinung nach auf
    i=j:= 0,0.5,1.0,1.5, ... usw.
    wie kommst du denn für k=1 auf t = 2 ? 😕
    k=2t-2=1
    t=1.5



  • Folgende Bedingungen sind gegeben:

    • 0 <= k <= 2t - 2 (folgt aus der äußeren Schleife)
    • i + j = k, 0 <= i <= j <= t -1 (folgt aus der Inneren)

    Für i = j = k = 0 und t = 2 sind all diese Bedingungen erfüllt also muss es vorkommen. Das gleiche gilt für i = 0, j = 1, k = 1 und t = 2. Wo du da jetzt Kommazahlen siehst ist mir ein Rätzel.



  • alfredo78 schrieb:

    *griiiiiiiiiiiiiiiiiins*

    natürlich versteh ich die äussere Schleife auch :p

    die innere Schleife ist aus einem Buch und das meint das, nicht ich ^^

    Sorry, dein erster Beitrag kam mir so vor, als hättest du keine Ahnung davon 😉

    Geht es darum, alle Zahlen zu finden, für die die Bedingung erfüllt ist, oder einfach eine der Variabeln zu inkrementieren? Wenn da nämlich alle Werte durchprobiert werden (also jeweils für i, und j), könntest du zwei weitere ineinander verschachtelte For-Schleifen machen und zuinnerst einen If-Block, der dann überprüft, ob die Bedingungen tatsächlich erfüllt sind.



  • Ben04 schrieb:

    Für i = j = k = 0 und t = 2 sind all diese Bedingungen erfüllt also muss es vorkommen. Das gleiche gilt für i = 0, j = 1, k = 1 und t = 2. Wo du da jetzt Kommazahlen siehst ist mir ein Rätzel.

    da hab ich ja so einiges übersehen f*ck !
    😃



  • Danke Ben04 fuer deine Mühen und auch den anderen 🙂



  • Die Bedingungen sind ja:

    (i)    0 <= k <= 2t-2
     (ii)   0 <= i <= j <= t-1
     (iii)  i+j=k
    

    Aus der Bedingung (iii) folgt sofort:

    (iv)   i=k-j
    

    Mit (iv) lässt sich (ii) wie folgt schreiben:

    (ii')  0 <= j <= t-1  und  k-j <= j
    

    Ich würde es dann wie folgt realisieren:

    for (k=0; k<=2*t-2; ++k) {
          for (j=0; j<=t-1 && j<=k; ++j) {
              i = k-j;
              if (i > j) continue;
    
    [...]
    
          }
       }
    

    Gruß mcr

    Zusätzliche Annahme, da die Aufgabe sonst keinen Sinn machen würde:

    i und j sind natürliche Zahlen!
    

    EDIT:
    in (ii') habe ich noch vergessen, j<=k mit zu den Bedingungen aufzunehmen.
    Sonst könnte i negativ werden, was ja auch nicht erlaubt ist.



  • danke fuer noch einen Ansatz 🙂

    ich hab jetzt auch mal einen selber hergeleitet, nachdem ich dank eurer Beiträge dieses Konstrukt verstanden habe (hoffe ich doch :p)

    // für t = 16
    /** edit: code falsch da j <= 15 nicht beachtet! **/
    
    for(k=0; k<= 30; k++)
    {
      for(j=k; j>=i; j--)
      {
         i=k-j;
    
         /** tu was **/
    
         i++;  /** abfangen bei ungeraden, dass nicht nochmal reinhuepft **/
    
      }
    }
    

    #edit: mist habe dabei nicht beachtet das j <= 15, muss ich nochmal gucken sorry *grins*

    #edit 2^^ : jup und nun komm ich auch auf Ben04's Ansatz 😛



  • mcr schrieb:

    Die Bedingungen sind ja:

    (i)    0 <= k <= 2t-2
     (ii)   0 <= i <= j <= t-1
     (iii)  i+j=k
    

    Aus der Bedingung (iii) folgt sofort:

    (iv)   i=k-j
    

    Mit (iv) lässt sich (ii) wie folgt schreiben:

    (ii')  0 <= j <= t-1  und  k-j <= j
    

    Ich würde es dann wie folgt realisieren:

    for (k=0; k<=2*t-2; ++k) {
          for (j=0; j<=t-1 && j<=k; ++j) {
              i = k-j;
              if (i > j) continue;
    
    [...]
    
          }
       }
    

    Gruß mcr

    Zusätzliche Annahme, da die Aufgabe sonst keinen Sinn machen würde:

    i und j sind natürliche Zahlen!
    

    EDIT:
    in (ii') habe ich noch vergessen, j<=k mit zu den Bedingungen aufzunehmen.
    Sonst könnte i negativ werden, was ja auch nicht erlaubt ist.

    die foreach bedingung ist hier aber nicht erfüllt.



  • kein x für u schrieb:

    die foreach bedingung ist hier aber nicht erfüllt.

    Was fehlt denn?



  • die foreach bedingung wird genau einmal erfüllt: bei t=1
    bei t=2 fehlt z.b. diese permutation: i=1, j= 0, k=1, t=2
    usw.



  • u != x schrieb:

    die foreach bedingung wird genau einmal erfüllt: bei t=1
    bei t=2 fehlt z.b. diese permutation: i=1, j= 0, k=1, t=2
    usw.

    Stimmt, i=1, j=0, k=1 und t=2 wird nicht angenommen. Nur ist das auch
    keine gültige Eingabe: Die Bedingung lautet doch:
    0 <= i <= j <= t-1

    In dieser Zeiles steckt ebenfalls i <= j drinnen.

    i=1 > 0=j

    Also ist dsa kein Gegenbeispiel für meine Schleifen!

    Gruß mcr



  • stimmt !
    ich bin aber auch ein trollo ! 🙄


Log in to reply