´Frage zu schleife

Tutorials.at
Verfügbare Informationen zu "´Frage zu schleife"

  • Qualität des Beitrags: 0 Sterne
  • Beteiligte Poster: dani93 - Xin - DrPhil_Guth
  • Forum: Tutorials.at
  • Forenbeschreibung: Programmierforum
  • aus dem Unterforum: C / C++
  • Antworten: 40
  • Forum gestartet am: Mittwoch 19.04.2006
  • Sprache: deutsch
  • Link zum Originaltopic: ´Frage zu schleife
  • Letzte Antwort: vor 16 Jahren, 4 Monaten, 28 Tagen, 10 Stunden, 17 Minuten
  • Alle Beiträge und Antworten zu "´Frage zu schleife"

    Re: ´Frage zu schleife

    dani93 - 20.11.2007, 16:00

    ´Frage zu schleife
    Hallo!
    Ich habe gerade erst mit dem c programmieren angefangen und stehe vor einer Aufgabe, die ich einfach nicht lösen kann.
    Hier die Angabe:
    Es sind alle zweistelligen natürlichen Zahlen auszugeben:
    - die durch ihre Ziffernsumme teilbar sind
    - die durch das Produkt ihrer Ziffern teilbar sind
    - die größer sind als das Vierfache ihrer Ziffernsumme

    Hier mein bisheriger Quellcode (nur zum ersten Punkt):

    Code: #include <stdio.h>
    #include <conio.h>

    void main()

    {

     int z=10, zif, zifsum;

     printf ("Folgende zweisetelligen Zahlen sund durch ihre Ziffernsumme teilbar:\n");

     while (z<100)
     {
      zif=z%10;
      zifsum+=zif;
      z=(z-zif)/10;
      z++;

      if (z%zifsum==0)
      {
       printf ("%d\n", z);
      }

     }

    }
    Hoffe auf schnelle Hilfe!
    danke im voraus, dani



    Re: ´Frage zu schleife

    Xin - 20.11.2007, 18:28


    1.) Benutze
    Code: Code-Tags
    Siehe über dem Eingabe-Fenter "code".

    2.) Das ist eine Hausaufgabe. Stelle Fragen, die Dir helfen das Problem zu lösen. Die Frage "Wer löst meine Hausaufgabe" ist verhältnismäßig uninteressant zu beantworten.



    Re: ´Frage zu schleife

    dani93 - 20.11.2007, 20:07

    tut leid
    sorry :oops: , aber ich hab die aufgabe bereits gelöst. Das Thema kann gelöscht werden.



    Re: ´Frage zu schleife

    Xin - 20.11.2007, 20:30

    Re: tut leid
    dani93 hat folgendes geschrieben: sorry :oops: , aber ich hab die aufgabe bereits gelöst. Das Thema kann gelöscht werden.
    Im optimalen Fall endet ein Thema mit einer Lösung, vielleicht schreibst Du die Antwort auf die Frage noch dazu - vielleicht findet irgendjemand mit einer ähnlichen Frage dieses Thema und freut sich, dass Du die Antwort noch gepostet hast.

    Für Fragen muss man sich nicht entschuldigen. Wenn Du eine Verständnisfrage hast, ist die Bereitschaft Dir zu helfen ganz anders, als wenn Du eine Hausaufgabe postest und nach einer Lösung für das Problem fragst.



    Re: ´Frage zu schleife

    dani93 - 22.11.2007, 15:28

    lösung
    ist zwar etwas kompliziert, aber es funktioniert.

    Code: #include <stdio.h>
    #include <conio.h>

    void main()

    {

     int zs=10, zp=10, z4=10, zif1, zif2, zif3, zif4, zif5,
         zif6, zifsums, zifpro, zifsum4, zifsum4_4;

     printf ("Folgende zweisetelligen Zahlen sind durch ");
     printf ("ihre Ziffernsumme teilbar:\n");

     while (zs<100)
     {
      zif1=zs%10;
      zif2=((zs-zif1)/10)%10;
      zifsums=zif1+zif2;

      if (zs%zifsums==0)
      {
       printf ("%d\n", zs);
      }
      zs++;
     }

     getch();
     clrscr();


     printf ("\nFolgende zweistelligen Zahlen sind durch ");
     printf ("das Produkt ihrer Ziffern teilbar:\n");

     while (zp<100)
     {
      zif3=zp%10;
      zif4=((zp-zif3)/10)%10;
      zifpro=zif3*zif4;

      if (zifpro>0&&zp%zifpro==0)
      {
       printf ("%d\n", zp);
      }
      zp++;
     }

     getch();
     clrscr();


     printf ("\nFolgende zweistelligen Zahlen sind groesser ");
     printf ("als das 4-Fache ihrer Ziffernsumme:\n");

     while (z4<100)
     {
      zif5=z4%10;
      zif6=((z4-zif5)/10)%10;
      zifsum4=zif5+zif6;
      zifsum4_4=zifsum4*4;

      if (zifsum4_4<z4)
      {
       printf ("%d\n", z4);
      }
      z4++;
     }

     getch();

    }



    Re: ´Frage zu schleife

    dani93 - 22.11.2007, 16:52

    neue frage
    ich bin mittlerweile schon bei der nächsten aufgabe:
    Auszugeben sind alle dreistelligen zahlen, die gleich der summe der Fakultäten ihrer ziffern ist. Hab ich zwar schon geschrieben, das Programm zeigt aber nichts an. ich suche schon seit zwei tagen und finde den fehler nicht. Verzeiht die komischen Variablen, aber dies ist nur ein ausschnitt aus einem grösseren Programm:


    Code:  int zf=100, zif7, zif8, zif9, count, zifsumf=0, fak1=1, fak2=1,    fak3=1;

     printf ("\nFolgende dreistelligen Zahlen sind durch ");
     printf ("die Summe der Fakultäten ihrer Ziffern teilbar:\n");

     while (zf<1000)
     {
      zif7=zf%10;
      zif8=((zf-zif7)/10)%10;
      zif9=((((zf-zif7)/10)-zif8)/10)%10;

       for (count=1; count>=zif7; count++)
       {
        fak1*=count;
       }

       for (count=1; count>=zif8; count++)
       {
        fak2*=count;
       }

       for (count=1; count>=zif9; count++)
       {
        fak3*=count;
       }

       zifsumf=fak1+fak2+fak3;

       if (zifsumf==zf)
       {
        printf ("%d\n", zf);
       }

      zf++;
     }


     getch();

    }



    Re: ´Frage zu schleife

    Xin - 22.11.2007, 22:09

    Re: neue frage
    Zu Deiner gelösten Aufgabe schreibst Du, dass Du es etwas kompliziert findest. Das ist erstmal egal, hauptsache gelöst.
    Wenn Du es optimieren möchtest, müsstest Du Redundanzen (Wiederholungen) entfernen. Das macht zum einen das Programm kleiner und vielleicht auch übersichtlicher - und: Teile des Programms werden wiederverwendbar.

    dani93 hat folgendes geschrieben: ich bin mittlerweile schon bei der nächsten aufgabe:
    Auszugeben sind alle dreistelligen zahlen, die gleich der summe der Fakultäten ihrer ziffern ist. Hab ich zwar schon geschrieben, das Programm zeigt aber nichts an. ich suche schon seit zwei tagen und finde den fehler nicht. Verzeiht die komischen Variablen, aber dies ist nur ein ausschnitt aus einem grösseren Programm:

    Die Variablenbezeichnung ist nicht zu verzeihen. BESONDERS bei größeren Programmen brauchst Du lesbare Variablennamen.

    Warum zeigt das Programm nichts an?
    Du berechnest Fakultäten. Oder zumindest willst Du das machen... <- drei Punkte...

    Ein Programmvorschlag:
    Code: #include <stdio.h>

    char DivSum ( int zs )
    {
      return !( (zs % ((zs / 10) + (zs % 10)) ) ) ;
    }

    char DivProd( int zs )
    {
      int prod = (zs / 10) * (zs % 10);

      return (prod) ? !( zs % prod ) : 0;
    }

    char GtFour ( int zs )
    {
      return   zs > ( 4 * ((zs / 10) + (zs % 10)) );
    }

      /* Erweiterungen für Dein 2. Programm */

    char DivFac( int zs )
    {
      int fac[] = { 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880 };  // Keine Berechnung => schneller ^^

      return (fac[ zs / 100 ] + fac[ (zs / 10) % 10 ] + fac[ zs % 10 ]) == zs;
    }

      /* Ende der Erweiterungen für Dein 2. Programm */

    void Loop( char const * headline, char (*condition)( int ), int start, int overrun )
    {
      printf( "%s\n", headline );

      int zs = start;
      for( ;zs < overrun; zs++ )
        if( condition( zs ) )
          printf ("%d\n", zs);
    }

    int main( void )
    {
      Loop( "Folgende zweisetelligen Zahlen sind durch ihre Ziffernsumme teilbar:", DivSum, 10, 100 );
      Loop( "Folgende zweistelligen Zahlen sind durch das Produkt ihrer Ziffern teilbar:", DivProd, 10, 100 );
      Loop( "Folgende zweistelligen Zahlen sind groesser als das 4-Fache ihrer Ziffernsumme:", GtFour, 10, 100 );

      /* Ausführung Deines zweiten Programms */

      Loop( "Folgende dreistelligen Zahlen sind durch die Summe der Fakultäten ihrer Ziffern teilbar:", DivFac, 100, 1000 );
    }

    Das Programm in der Form würde aber niemand erwarten.
    Was ich erwarten würde wäre
    Code: int main( void )
    da main laut Standard ein int zurückgeben *MUSS*. Der Standard ist hier Blödsinn, trotzdem sollte man sich dran halten, wenn Software nicht nur bei Dir übersetzt werden soll.

    Die getc und ClearScreens habe ich rausgenommen, die conio.h gibt's unter Linux nicht und ich war zu faul diese Befehle für Linux reinzupacken.



    Re: ´Frage zu schleife

    dani93 - 23.11.2007, 15:13

    ?
    Tja danke für die lösung, aber ich brauch das Programm für die schule und es soll gerade diese for-Schleifen enthalten.
    Ich brauche kein besseres programm sondern nur den Fehler im jetzigen.
    Trotzdem danke für die Mühe.



    Re: ´Frage zu schleife

    Xin - 23.11.2007, 15:39

    Re: ?
    dani93 hat folgendes geschrieben: Tja danke für die lösung, aber ich brauch das Programm für die schule und es soll gerade diese for-Schleifen enthalten.
    ICh brauche kein besseres programm sondern nur den Fehler im jetzigen.
    Trotzdem danke für die Mühe.

    Drei Punkte sind kein Satzendezeichen...



    Re: ´Frage zu schleife

    dani93 - 23.11.2007, 15:41

    ??
    des versteh ich jetzt net



    Re: ´Frage zu schleife

    Xin - 23.11.2007, 15:54

    Re: ??
    dani93 hat folgendes geschrieben: des versteh ich jetzt net

    ... :->

    Da wo drei Punkte stehen (und damit meine nicht ausschließlich die drei Punkte eine Zeile zuvor), hat der Schreiber etwas gedacht, was er aber nicht explizit geschrieben hat. Drei Punkte sind das geschriebene schrillende Alarmsignal, quasi der Wink mit dem kompletten Zaun, dass da etwas steht, was nicht geschrieben wurde.
    Du darfst also mal zwischen den Zeilen lesen und wenn Du das tust, dann habe ich Dir (nicht) aufgeschrieben, warum Dein Programm hängen bleibt.



    Re: ´Frage zu schleife

    dani93 - 23.11.2007, 16:18

    Re: neue frage
    Zitat: Das Programm in der Form würde aber niemand erwarten.
    Was ich erwarten würde wäre
    Code: int main( void )
    hab ich gemacht aber nicht reinkopiert



    Re: ´Frage zu schleife

    Xin - 23.11.2007, 16:19

    Re: neue frage
    Funktionieren Deine Fakultätsberechnungen nun...?



    Re: ´Frage zu schleife

    dani93 - 23.11.2007, 16:20

    nein
    nix
    nur ein blinkender cursor



    Re: ´Frage zu schleife

    Xin - 23.11.2007, 16:47

    Re: nein
    dani93 hat folgendes geschrieben: nix
    nur ein blinkender cursor
    *grübel*

    Okay, dann bin ich jetzt auch ratlos.
    Fällt jemanden noch etwas ein, wie man den Hinweis auf die Fakultätsberechnungen noch offensichtlicher verpacken könnte?



    Re: ´Frage zu schleife

    dani93 - 23.11.2007, 16:50

    komisch
    Als weitere Aufgabe soll ich es sowieso noch in eine schleife kürzen, aber zuerst brauch ich das lange. Ich übeleg schon seit drei tagen und mir fällt keine lösung ein. (gibt es überhaupt so eine zahl???)



    Re: ´Frage zu schleife

    Xin - 23.11.2007, 17:18

    Re: komisch
    dani93 hat folgendes geschrieben: Als weitere Aufgabe soll ich es sowieso noch in eine schleife kürzen, aber zuerst brauch ich das lange. Ich übeleg schon seit drei tagen und mir fällt keine lösung ein. (gibt es überhaupt so eine zahl???)

    145, wenn ich mich recht entsinne.

    Dein Cursor steht da und blinkt. Anscheinend macht der Computer nach dem Programmstart nichts mehr.
    Würde er nichts mehr machen, wäre er fertig, aber das DOS-Prompt kommt ja nicht, also ist er nicht fertig.

    Das schreit nach Endlosschleife (oder zumindest etwas sehr ähnliches).

    Schleifen hast Du reichlich.

    Die beste Möglichkeit Programme zu testen ist printf().
    Code: printf( "1\n" );
    ... text
    printf( "2: Erwarte: %d == 123\n", variable );
    ... text
    printf( "3\n" );

    Wo hängt er sich weg - werden Deine Erwartungen erfüllt? Wenn nein - erwartest Du etwas falsches oder ist an der Stelle das Programm schon aus dem Ruder gelaufen...



    Re: ´Frage zu schleife

    dani93 - 23.11.2007, 17:23

    code
    ich hab am anfang ein printf drin und as geht aber dann geht gar nichts mehr. hier der gesamte code:

    Code: #include <stdio.h>
    #include <conio.h>

    void main()             //hab auch schon int main probiert, hilft aber nichts

    {

     int zf=100, zif7, zif8, zif9, count, zifsumf=0, fak1=1, fak2=1, fak3=1;

     printf ("\nFolgende dreistelligen Zahlen sind durch ");
     printf ("die Summe der Fakultäten ihrer Ziffern teilbar:\n");

     while (zf<1000)
     {
      zif7=zf%10;
      zif8=((zf-zif7)/10)%10;
      zif9=((((zf-zif7)/10)-zif8)/10)%10;

       for (count=1; count>=zif7; count++)
       {
        fak1*=count;

        if (fak1==0)
        {
         fak1=1;
        }
       }

       for (count=1; count>=zif8; count++)
       {
        fak2*=count;

        if (fak2==0)
        {
         fak2=1;
        }
       }

       for (count=1; count>=zif9; count++)
       {
        fak3*=count;

        if (fak3==0)
        {
         fak3=1;
        }
       }

       zifsumf=fak1+fak2+fak3;

       if (zifsumf==zf)
       {
        printf ("%d\n", zf);
       }

      zf++;
     }


     getch();

    }



    Re: ´Frage zu schleife

    Xin - 23.11.2007, 17:45

    Re: code
    dani93 hat folgendes geschrieben: ich hab am anfang ein printf drin und as geht aber dann geht gar nichts mehr.
    ...dann bau mehr printfs ein...

    Code: void main()             //hab auch schon int main probiert, hilft aber nichts
    Doch... es entspricht dem Standard.

    Bei Deinen beinahe Endlosschleifen kann aber der Standard auch nicht mehr helfen.



    Re: ´Frage zu schleife

    dani93 - 23.11.2007, 17:55

    Fehler
    ich hab jetzt "einen" fehler gefunden. (falsche zeichen in der for-schleife count<=zif) aber es geht trotzdem nicht. wenn ich nach jeder fakultätsberechnung ein printf mache gibt er nur unsinnige zahlen aus
    zB negative fakultäten



    Re: ´Frage zu schleife

    Xin - 23.11.2007, 19:11

    Re: Fehler
    dani93 hat folgendes geschrieben: ich hab jetzt "einen" fehler gefunden. (falsche zeichen in der for-schleife count<=zif)
    Hey, hey, dann kann ich den Zaun ja wieder aufstellen, der Arm tat auch langsam vom Winken weh.

    dani93 hat folgendes geschrieben: aber es geht trotzdem nicht. wenn ich nach jeder fakultätsberechnung ein printf mache gibt er nur unsinnige zahlen aus
    zB negative fakultäten
    Faszinierend.
    Dann würde ich mal so eine Facultätsschleife als Funktion schreiben und die genau testen, weil soviel kann man da eigentlich nicht verkehrt machen:
    Code:
    int fac( int f )
    {
      int result = 1;
      while( f )
      {
         result *= f;
         --f;
      }

      return result;
    }


    Wählst Du f zu groß (und dafür muss f nicht wirklich groß sein, ich schätze, so im Bereich von 12-15) wird die Zahl einfach so extrem groß, dass der Computer sie als negativ versteht.

    Ein Computer rechnet nicht wie im Matheunterricht. Computer haben eine andere Mathematik, die "zufälligerweise" in einem gewissen Bereich der normalen Mathematik entspricht.
    Verlässt man den Bereich, kommen zwar richtige Ergebnisse heraus, aber halt nicht das, was Du von Deiner Mathematik erwartest...

    Code:
    int main( void )
    {
      char i = -128;

      i = i - 1;

      if( i == -129 ) printf( "Mathematik rulezz\n" );
      else            printf( "Informatik rulezz\n" );
    }



    Re: ´Frage zu schleife

    dani93 - 23.11.2007, 19:14

    zu groß
    Zitat: Wählst Du f zu groß (und dafür muss f nicht wirklich groß sein, ich schätze, so im Bereich von 12-15) wird die Zahl einfach so extrem groß, dass der Computer sie als negativ versteht.

    zu groß :?:
    ich will nur die fakultät der ziffern und die kann ja höchstens 9 :lol: sein.
    noch ein versuch :roll: :

    Code: #include <stdio.h>
    #include <conio.h>

    void main()

    {

     long int zf=100, zif7, zif8, zif9, zifsumf=0, fak1=1, fak2=1, fak3=1;

     printf ("\nFolgende dreistelligen Zahlen sind durch ");
     printf ("die Summe der Fakultäten ihrer Ziffern teilbar:\n");

     while (zf<1000)
     {
      printf ("z %ld\n", zf);
      zif7=zf%10;
      zif8=((zf-zif7)/10)%10;
      zif9=((((zf-zif7)/10)-zif8)/10)%10;

      printf ("ziffer1=  %ld\n", zif7);
       if (zif7==0)
        {
         fak1=1;
        }
       else
       {
       while (zif7>0)
       {
        fak1=fak1*zif7;
        --zif7;
       }
       }
        printf ("fak1 %ld\n\n", fak1);


      printf ("ziffer2=  %ld\n", zif8);
        if (zif8==0)
        {
         fak2=1;
        }
       else
       {
       while (zif8>0)
       {
        fak2=fak2*zif8;
        --zif8;
       }
       }
       printf ("fak2 %ld\n\n", fak2);


      printf ("ziffer3=  %ld\n", zif9);
       if (zif9==0)
        {
         fak3=1;
        }
       else
       {
       while (zif9>0)
       {
        fak3=fak3*zif9;
        --zif9;
       }
       }
           printf ("fak3 %ld\n\n", fak3);


       zifsumf=fak1+fak2+fak3;
       printf ("zifsum %d\n\n", zifsumf);

       if (zifsumf==zf)
       {
        printf ("\n\n\n~~~~~ %ld\n ~~~~~\n\n", zf);
       }

      zf++;
      getch();
      clrscr();
     }


     getch();

    }
    Es funktioniert, solange keine ziffer größer als 4 ist, dann gibt er irgendwelche zahlen aus.



    Re: ´Frage zu schleife

    Xin - 24.11.2007, 12:55

    Re: zu groß
    dani93 hat folgendes geschrieben: Zitat: Wählst Du f zu groß (und dafür muss f nicht wirklich groß sein, ich schätze, so im Bereich von 12-15) wird die Zahl einfach so extrem groß, dass der Computer sie als negativ versteht.

    zu groß :?:
    ich will nur die fakultät der ziffern und die kann ja höchstens 9 :lol: sein.
    noch ein versuch :roll: :

    ...code...

    Es funktioniert, solange keine ziffer größer als 4 ist, dann gibt er irgendwelche zahlen aus.

    Drei Dinge.
    1.) Ich gucke mir keinen Code mehr von Dir an, der derart formatiert ist.
    Bei meinen Schülern geht das sehr einfach: Stimmt die Einrückung nicht, ist der Code falsch - ich kompiliere ihn nicht, also gibt es keine Ergebnisse, keine Ergebnisse bedeutet, dass er nicht meinen Erwartungen entspricht, was bedeutet, dass er falsch ist.

    2.) Es heißt int main(void).
    Ich habe keine Lust Deinen Code jedesmal anzupassen, damit er hier kompiliert werden kann. Wenn er nicht kompiliert werden kann, ist Dein Code falsch. Halte Dich an den Standard, auch wenn alte Compiler void main() kompilieren, heißt das nicht, dass es richtig ist. Ich benutze Deinen Compiler nicht.

    3.) Dein Code ist falsch.
    Und zwar nicht nur, wenn die Zahl größer 4 ist, sondern 2697 von 2700 Berechnungen. Er funktioniert nur beim ersten Durchgang durch die Schleife. Das heißt in der Schleife veränderst Du etwas, so dass die nachfolgenden Rechnungen nicht mehr korrekt ablaufen.



    Re: ´Frage zu schleife

    dani93 - 24.11.2007, 13:32

    re
    1. der code sieht so unordentlich aus, weil ich ihn dauernd ändere.
    2. das mit dem void main() haben wir in der schule so gelernt, ist angewohnheit.
    3. das da ein fehler bei der berechnung ist, hab ich auch schon mitbekommen, aber ich finde ihn nicht.



    Re: ´Frage zu schleife

    Xin - 24.11.2007, 13:56

    Re: re
    dani93 hat folgendes geschrieben: 1. der code sieht so unordentlich aus, weil ich ihn dauernd ändere.
    Dann ändere ihn ordentlich.
    Das hilft zum einen Dir zu verstehe, was Du da eigentlich tust und zum anderen sehe ich es als sehr unfreundlich, wenn ich Dir helfen soll Sourcecodes zu korrigieren, die Du einfach nur hinklatschst.
    Wenn Du Dir keine Mühe gibst, warum sollte ich mich bemühen.

    dani93 hat folgendes geschrieben: 2. das mit dem void main() haben wir in der schule so gelernt, ist angewohnheit.
    Dann hast Du etwas falsches gelernt: gewöhne Dich um.

    dani93 hat folgendes geschrieben: 3. das da ein fehler bei der berechnung ist, hab ich auch schon mitbekommen, aber ich finde ihn nicht.

    Ich weiß nicht, wer Dir programmieren beibringt, aber es macht keinen Sinn Programme in einem Block zu testen. Schreib eine Funktion, die Dir die Fakultät berechnet als abgeschlossenes Problem, damit kannst Du den Fehler, den Du in Deinem Code machst, nur schwer nachbilden - anders ausgedrückt: Du machst ihn nicht, also hast Du eine Fehlerquelle ausgeschaltet.

    Wenn Dein Lehrer von Dir verlangt die Schleifen dreimal auszuformulieren, also redundanten und damit fehleranfälligen Sourcecode zu erzeugen, dann unterrichtet er falsch. Redundanter Sourcecode ist grundsätzlich zu vermeiden.
    Weiterhin scheint er zu versäumen, dass es wichtig ist, zu vermitteln, wie man testet und debuggt, damit man solche Probleme alleine mit einem Komzept angehen kann.

    Vereinfache das Problem: Wenn Du die Fakultätsberechnung nicht in eine Funktion setzen möchtest, kommentierre die Schleife aus und probiere einzelne Zahlen aus, in dem Du z.B. zf = 456 setzt und das Programm nur für diese eine Zahl ausführst. Du wirst sehen, dass die Fakultäten korrekt sind.
    Anschließend fügst Du die Schleife wieder ein und lässt sie nur von 120 bis 122 laufen. Die erste Zahl wird richtig sein, die beiden anderen falsch.

    Fällt Dir etwas auf? Zeigen die Zahlen, die falsch sind, eine Regelmäßigkeit, von Schleifendurchlauf zu Schleifendurchlauf, die Dir einen Hinweis geben kann, warum sie falsch sind?

    Ansonsten habe ich Dir bereits zuvor einen deutlichen Hinweis gegeben. Lies ihn, denk drüber nach.



    Re: ´Frage zu schleife

    dani93 - 24.11.2007, 14:03

    ok
    danke für den tipp.
    cih werde den code jetzt neu schreiben und mal so anfangen wie du gesagt hast und dann den Fehler suchen. da ich das programm schon morgen haben muss, werde ich nicht mehr schreiben und später die richtige lösung posten.

    Zitat: Wenn Dein Lehrer von Dir verlangt die Schleifen dreimal auszuformulieren, also redundanten und damit fehleranfälligen Sourcecode zu erzeugen, dann unterrichtet er falsch. Redundanter Sourcecode ist grundsätzlich zu vermeiden.

    als weitere aufgabe ist das programm in nur eine schleife zu kürzen.



    Re: ´Frage zu schleife

    dani93 - 24.11.2007, 14:36

    Juhuuuuuuuu
    Es lebt!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    Danke Xin!!!
    Ich vollidiot habe vergessen nach jedem durchlauf die Fakultätten zurückzusetzen, dann ist klar das so hohe zahlen rauskommen. Danke Xin du hasst mir sehr geholfen.
    Zur erklärung ich gebe jetzt zuerst die zahl und dann die fakultäten aus. wenn die fi- anweisung wahr, das heißt z=summe, hält das programm an und fährt bei eingabe mit der berechnung fort. Frage: ist 145 wirklich die einzige zahl, auf die das zutrifft?

    hier der code:
    Code: #include <stdio.h>
    #include <conio.h>

    int main(void)

    {

     int z=100, ziffer1, ziffer2, ziffer3,
         fakultaet1=1, fakultaet2=1, fakultaet3=1, summe;

     while (z<1000)
     {
      ziffer1=z%10;
      ziffer2=((z-ziffer1)/10)%10;
      ziffer3=((((z-ziffer1)/10)-ziffer2)/10)%10;
      printf ("zahl %d\n", z);

      while (ziffer1>0)
      {
       fakultaet1*=ziffer1;
       --ziffer1;
      }
      printf ("fakultaet1 %d\n", fakultaet1);

      while (ziffer2>0)
      {
       fakultaet2*=ziffer2;
       --ziffer2;
      }
      printf ("fakultaet2 %d\n", fakultaet2);

      while (ziffer3>0)
      {
       fakultaet3*=ziffer3;
       --ziffer3;
      }
      printf ("fakultaet3 %d\n\n", fakultaet3);

      summe=fakultaet1+fakultaet2+fakultaet3;

      if (summe==z)
      {
       printf ("~~~~~Zahl= %d~~~~~\n", z);
       getch();
       clrscr;
      }
      ++z;
      fakultaet1=1;
      fakultaet2=1;
      fakultaet3=1;
     }

      getch();

    }

    jetzt muus ich das nur mehr irgendwie kürzen...



    Re: ´Frage zu schleife

    dani93 - 24.11.2007, 16:34


    hier ist die kurze version. Falls es noch etwas daran auszusetzen gibt, melde dich bitte bei mir. Auf jeden fall danke für deine Hilfe und danke das du mir nicht die lösung, sondern nur hinweise gegeben hast, so hab ich auch noch was gelernt dabei.

    Code: #include <stdio.h>
    #include <conio.h>

    int main(void)

    {

     int z=100, zif, fak=1, summe, help;

     while (z<1000)
     {
      help=z;
      zif=help%10;


      if (zif==0)
      {
       zif=1;
      }

      while (zif>0)
      {

       fak*=zif;
       --zif;

       if (zif==0)
       {
        help=(help-zif)/10;
        zif=help%10;
        summe+=fak;

        fak=1;
       }
      }

      if (summe==z)
      {
       printf ("%d\n", z);
       getch();
       clrscr;
      }
      ++z;
      summe=0;
     }

      getch();

    }



    Re: ´Frage zu schleife

    Xin - 24.11.2007, 21:16


    dani93 hat folgendes geschrieben:
    Frage: ist 145 wirklich die einzige zahl, auf die das zutrifft?
    Dein langes Programm zeigt vom Aufbau die Struktur, die sich aus Deinem Problem ableitet. Drei mal Fakultät ausrechen, addieren, prüfen.
    Was anderes macht mein Programm auch nicht und es warf auch ausschließlich 145 raus.
    Die Vermutung liegt nahe, dass es neben 145 nichts mehr gibt.

    dani93 hat folgendes geschrieben: hier der code:
    Code: ...
    jetzt muus ich das nur mehr irgendwie kürzen...
    Im Idealfall hältst Du Dich an die Regeln der Logik. Irgendwie könnte auch so aussehen:
    Code:
    int main( void )
    {
      printf( "145\n" );
    }

    dani93 hat folgendes geschrieben: hier ist die kurze version. Falls es noch etwas daran auszusetzen gibt, melde dich bitte bei mir.
    Hmm... ich verstehe es nicht.
    Also würde ich in meiner Arroganz sagen, dass es falsch ist.

    dani93 hat folgendes geschrieben: Auf jeden fall danke für deine Hilfe und danke das du mir nicht die lösung, sondern nur hinweise gegeben hast, so hab ich auch noch was gelernt dabei.
    Das wichtigste hast Du nicht gelernt. Zu prüfen, ob das was Du tust Deinen Erwartungen entspricht. Ich habe Dein Programm kompiliert und stellte mit großen Erstaunen fest... es spruckt 145 raus.

    Ich weiß nicht warum und ich habe auch keine Lust es nachzuvollziehen, wieso es ausgerechnet 145 ausgibt. Es ist nicht offensichtlich, warum es 145 auspuckt - jedenfalls nicht für mich.

    Was ich sehe ist jedenfalls, dass Du keine Fakultäten berechnest, es also vollkommen egal ist, was es berechnet, denn Du löst das falsche Problem und damit ist es die falsche Lösung für Dein Problem.

    Was wäre denn die Summe der Fakultäten der einzelnen Ziffern von 900?
    Laut Deinem Programm ist 9! + 0! + 0! = 1.

    Wenn Du in den Supermarkt gehst und Fleisch bestellst, bist Du zufrieden, wenn Du Fleisch bekommst? Ich würde mir zumindest mal die Farbe ansehen und mal schnuppern... der gekürzte Code müffelt jedenfalls etwas und sieht gar nicht gut aus... ^^



    Re: ´Frage zu schleife

    dani93 - 25.11.2007, 13:27

    re
    hmmm...
    ich weiß was du meinst.

    Code:  
    #include <stdio.h>
    #include <conio.h>

    int main (void)
    {

     int zf=100, fak=1, zif, help, zifsumf;

     while (zf<1000)
      {
       help=zf;
       zif7=help%10;
       printf ("\n\nzahl: %d\n", zf);

       while (help>0)
       {

        if (zif7==0)
        {
         zif7=1;
        }

        fak*=zif7;
        --zif7;

        if (zif7==0)
        {
         help=(help-zif7)/10;
         zif7=help%10;
         zifsumf+=fak;
         printf ("summe: %d\n", zifsumf);
         fak=1;
        }
       }

       if (zifsumf==zf)
       {
        printf ("%d\n", zf);
        getch();
        clrscr;
       }
       ++zf;
       zifsumf=0;
      }


    }

    also jetzt kommt nicht immer 1 raus.



    Re: ´Frage zu schleife

    Xin - 25.11.2007, 14:18

    Re: re
    dani93 hat folgendes geschrieben: Xin hat folgendes geschrieben:
    Was ich sehe ist jedenfalls, dass Du keine Fakultäten berechnest, es also vollkommen egal ist, was es berechnet, denn Du löst das falsche Problem und damit ist es die falsche Lösung für Dein Problem.
    hmmm...
    ich weiß was du meinst.
    Wenn Du wüßtest, was ich meine, warum berechnest Du dann weiterhin keine Fakultäten?



    Re: ´Frage zu schleife

    dani93 - 25.11.2007, 14:20


    hmmm...
    dann weiß ich nicht was du meinst.
    Code: fak*=zif7;
    und was ist dann das?



    Re: ´Frage zu schleife

    Xin - 25.11.2007, 15:02


    dani93 hat folgendes geschrieben: hmmm...
    dann weiß ich nicht was du meinst.
    Code: fak*=zif7;
    und was ist dann das?
    Hmm...
    <xynic>
    Du wurdest mathematisch noch nicht wirklich aufgeklärt, oder? ansonsten kann ich mir Deine vermutlich ungewollte verbale Ejakulation nicht erklären.

    Das ist eine Erektion der Summen, auch Multiplikation genannt. Häufen sich gleichartige Multiplikationen, werden es Potenzen. Haben die Multiplikationen wertemäßig eher einen Hänger, wie in Deinem Fall, spricht man nicht von Impotenz, sondern von einer Fakultät.
    Mir scheint, so erklärt sich auch das abfallende Leistung deutscher Fakultäten.

    Sprich am besten mit dem Mathekunde-Lehrer Deines Vertrauens darüber. Multiplikationen nicht mit anderen Dingen zu velwechsern lernt man gewöhnlich in der 2. oder 3. Klasse. Vielleicht ziehst Du Dich abends mal einem Mathebuch zum Selbststudium zurück, zu wissen, was da so abgeht kann sehr befriedigend sein.
    </xynic>



    Re: ´Frage zu schleife

    dani93 - 25.11.2007, 15:15


    Zitat: Mir scheint, so erklärt sich auch das abfallende Leistung deutscher Fakultäten.
    bin kein deutscher

    Zitat: Multiplikationen nicht mit anderen Dingen zu velwechsern lernt man gewöhnlich in der 2. oder 3. Klasse.
    Da war ich öfters geistig nicht anwesend.

    Zitat: Wenn Du wüßtest, was ich meine, warum berechnest Du dann weiterhin keine Fakultäten?
    einmal zur klarstellung:
    habe ich es richtig verstanden, dass bei einer fakultät eine zahl immer mit der nächstkleineren multipliziert wird bis die zahl eins ist?

    ich versteh das überhaupt nicht.



    Re: ´Frage zu schleife

    Xin - 25.11.2007, 16:07


    dani93 hat folgendes geschrieben: Zitat: Mir scheint, so erklärt sich auch das abfallende Leistung deutscher Fakultäten.
    bin kein deutscher
    Solange Du deutsche Schulen besuchst, rettet Dich das auch nicht.

    dani93 hat folgendes geschrieben: Zitat: Multiplikationen nicht mit anderen Dingen zu velwechsern lernt man gewöhnlich in der 2. oder 3. Klasse.
    Da war ich öfters geistig nicht anwesend.
    Das ist etwas früh, um aus dem Lernprozess auszusteigen.
    Ich traf im Studium Leute, die kein Bruchrechnen konnte, aber Multiplizieren können die meisten.

    dani93 hat folgendes geschrieben: Zitat: Wenn Du wüßtest, was ich meine, warum berechnest Du dann weiterhin keine Fakultäten?
    einmal zur klarstellung:
    habe ich es richtig verstanden, dass bei einer fakultät eine zahl immer mit der nächstkleineren multipliziert wird bis die zahl eins ist?

    ich versteh das überhaupt nicht.
    Erstaunlich. Du verstehst ganz genau, aber Du gibst Dir nicht die Mühe zu prüfen, ob das Verstandene sich mit dem deckt, was Du programmierst. Den Part darf ich hier übernehmen.

    Ich schließe aus Deinem Namen, dass Du rund 14 Jahre alt bist. 14 wird man in der 7. oder 8. Klasse. Du hast also noch 2 Jahre Zeit, um Dir anzugewöhnen den Inhalt Deines Kopfes zum Denken zu verwenden.

    Das Schlüsselwort in Deiner Aussage habe ich fett markiert.
    Dein Sourcecode enthält bei der Fakultätsberechnung kein "bis". Ohne "bis" kein korrekter Sourcecode. Du hast nicht vergessen, while einzubauen, denn sonst hättest Du mir nicht die Frage gestellt, ob eine Multiplikation eine Fakultät ist. Du hast Dir einfach keine Mühe gegeben, darüber nachzudenken.
    Das wäre nichtmals aufgefallen, hättest Du Deinen Code einfach kopiert. Oder mal damit verglichen hättest, warum Du hier eine Fakultät mit einer Multiplikation berechnest, dort aber eine Schleife verwendest.

    Ich kann Dir nur mitgeben, dass mich nicht interessiert, ob Du in der Grundschule geistig abwesend warst oder ob Dein Lehrerkollegium zu blöd ist, Dich beim Denken zu fördern.

    Nach der 10. Klasse bleiben die Lehrer auf der Schule und Du musst alleine klarkommen. Das heißt selbst einen Ausbildungsplatz oder eine weiterführende Schule finden, die Dich aufnehmen möchte.
    Weiterführende Schulen machen inzwischen übrigens auch Tests, nicht nur Ausbilder.

    Ich für meinen Teil erwarte von einem 14jährigen, dass er auf dem Wissensstand eines 14jährigen ist und mich nicht fragt, was eine Multiplikation ist.
    Du hast hoffentlich gelernt, dass ein richtig scheinendes Ergebnis noch lange kein richtiges Ergebnis sein muss.
    Ich erwarte von einem 14jährigen, dass er seine Handlungen selbst in Frage stellst und prüfst - beim Programmieren also überlegt und testet und nicht nur runterschreibt und hofft, dass es funktioniert.
    Sonst funktioniert Programmierung nicht.

    Ansonsten ist Deine Rechtschreibung zu gut für einen Nicht-Deutschen, als das ich über die falsche Groß-/Kleinschreibung hinwegsehen mag.

    So sind die Erwartungen an Dich da draußen.
    Wenn Dir meine Worte dazu nicht gefallen und Du lieber 'nen Lutscher und aufmunterndere Worte wünschst - also wie ein 2. Klässler behandelt werden möchtest - brauchst Du es nur zu sagen.

    Du hast es geschafft den Sourcecode zu formatieren und "void main()" aufzugeben. Wenn Du es schaffst Dein Handeln zu durchdacht auszuführen und Dein Denken auch mal auf die Rechtschreibung zu lenken, darf ich nett zu Dir sein und darf Dich trotzdem altergemäß ansprechen.



    Re: ´Frage zu schleife

    dani93 - 25.11.2007, 20:01


    Zitat: dani93 hat folgendes geschrieben:
    Zitat:
    Mir scheint, so erklärt sich auch das abfallende Leistung deutscher Fakultäten.
    bin kein deutscher
    Solange Du deutsche Schulen besuchst, rettet Dich das auch nicht.
    Nix deutsche Schule.

    Zitat: Das heißt selbst einen Ausbildungsplatz oder eine weiterführende Schule finden, die Dich aufnehmen möchte.
    Weiterführende Schulen machen inzwischen übrigens auch Tests, nicht nur Ausbilder.
    schon passiert
    1. Klasse HTL

    Zitat: Dein Sourcecode enthält bei der Fakultätsberechnung kein "bis". Ohne "bis" kein korrekter Sourcecode.
    Heißt das, dass der Code zwar das richtige Ergebnis ausgibt, aber semantisch falsch ist?



    Re: ´Frage zu schleife

    Xin - 25.11.2007, 20:37


    dani93 hat folgendes geschrieben: Zitat: dani93 hat folgendes geschrieben:
    Zitat:
    Mir scheint, so erklärt sich auch das abfallende Leistung deutscher Fakultäten.
    bin kein deutscher
    Solange Du deutsche Schulen besuchst, rettet Dich das auch nicht.
    Nix deutsche Schule.
    Ok, vielleicht nicht so klever bei einem .at-Forum auf deutsch zu schließen... ^^

    Bedeutet das, dass Du Glück gehabt hast, oder wie sieht es in Österreich aus? (oder sonstwo, immerhin können andere Staaten ja auch auf .at-Foren kommen)

    dani93 hat folgendes geschrieben: Zitat: Das heißt selbst einen Ausbildungsplatz oder eine weiterführende Schule finden, die Dich aufnehmen möchte.
    Weiterführende Schulen machen inzwischen übrigens auch Tests, nicht nur Ausbilder.
    schon passiert
    1. Klasse HTL
    Hmm... also 9. Klasse. Früh eingeschult, hmm?
    Naja, soviel mehr scheinen die österreich'schen Schulen nicht zu taugen, denn nach 8 vollendeten Schuljahren, hätte Multiplikation != Fakultät doch bekannt sein können. ;->

    dani93 hat folgendes geschrieben: Zitat: Dein Sourcecode enthält bei der Fakultätsberechnung kein "bis". Ohne "bis" kein korrekter Sourcecode.
    Heißt das, dass der Code zwar das richtige Ergebnis ausgibt, aber semantisch falsch ist?
    Naja, wenn die Fakultät von 9! + 0! + 0! bei Dir 1 ist, dann muss irgendwas haken. Wenn ich Dich frage, was ist 1+1 ist und Dir einen Würfel gebe, könntest Du auch ein richtiges Ergebnis haben.
    Der Weg zur Lösung könnte aber Punktabzug geben. ;-)



    Re: ´Frage zu schleife

    dani93 - 25.11.2007, 20:47


    Zitat: Bedeutet das, dass Du Glück gehabt hast, oder wie sieht es in Österreich aus? (oder sonstwo, immerhin können andere Staaten ja auch auf .at-Foren kommen)
    Viva Austria!!!
    und naja Hauptschul-Schnitt war 1,06

    Zitat: Naja, wenn die Fakultät von 9! + 0! + 0! bei Dir 1 ist, dann muss irgendwas haken. Wenn ich Dich frage, was ist 1+1 ist und Dir einen Würfel gebe, könntest Du auch ein richtiges Ergebnis haben.
    Das Problem hab ich schon behoben.



    Re: ´Frage zu schleife

    Xin - 25.11.2007, 21:52


    dani93 hat folgendes geschrieben: Zitat: Bedeutet das, dass Du Glück gehabt hast, oder wie sieht es in Österreich aus? (oder sonstwo, immerhin können andere Staaten ja auch auf .at-Foren kommen)
    Viva Austria!!!
    und naja Hauptschul-Schnitt war 1,06
    Dann warst Du entweder ein sehr guter Schüler (der aber eine Multiplikation für eine Fakultät hält) oder Deine Schule vergab auch bei weniger guten Leistungen sehr gute Noten.

    dani93 hat folgendes geschrieben: Zitat: Naja, wenn die Fakultät von 9! + 0! + 0! bei Dir 1 ist, dann muss irgendwas haken. Wenn ich Dich frage, was ist 1+1 ist und Dir einen Würfel gebe, könntest Du auch ein richtiges Ergebnis haben.
    Das Problem hab ich schon behoben.
    Hmm... guck an, meine Kristallkugel scheint nicht bis Österreich hellsehen zu können.

    Hast Du Dein Programm denn lauffähig und geprüft?



    Re: ´Frage zu schleife

    DrPhil_Guth - 26.11.2007, 11:54


    So jetzt reichts aber...
    Aus diesem Thread ist kompletter Müll geworden.

    Die eigentliche Frage die gestellt wurde, wurde schon längst beantwortet,
    die neue Frage hat nichts damit zu tun.
    Der Fragesteller ist nicht in der Lage eigenständiges Handeln und eine gewisse "grundbegabung" zu zeigen, und auch wenn ich Xin's einwände gut verstehen kann, die Untergriffe die er an den Tag legt (auch wenn derjenige gegen die sie gerichtet sind sie nicht versteht) gleichen mittlerweile einem kleinen Flamewar.

    Also, wenn ihr weiterdiskutieren wollt, wer woher kommt, wieso welche Noten hat usw., tut das bitte in der Offtopic ecke.
    Wenn ihr weiter über eine Frage diskutieren wollt,versuchts mal mit nem neuen Thread (ich glaube es ging um Fakultäten oder so...), und vor allem versucht diesmal sachlich zu bleiben.

    Bis dahin,
    -sense-



    Mit folgendem Code, können Sie den Beitrag ganz bequem auf ihrer Homepage verlinken



    Weitere Beiträge aus dem Forum Tutorials.at

    Umrechner Arabische in Römische Zahlen - gepostet von Walgo am Donnerstag 19.07.2007
    Problem mit Repeat-Schleife - gepostet von orluk am Samstag 11.08.2007
    qIp, ICQ, MSN, Trilian und andere... - gepostet von Dirty Oerty am Samstag 17.11.2007
    Notenprogramm von C zu C++ fehlerhaft - gepostet von Kleriker am Dienstag 09.05.2006
    Befehl zum löschen einer Datei - gepostet von Bratwurst am Dienstag 14.08.2007
    Projekt: SuperMario64 - Nachfolger - gepostet von vpascal am Samstag 09.06.2007
    schon wieder probleme: getchar() - gepostet von detewe89 am Donnerstag 03.05.2007
    C oder Basic - gepostet von absoluter noob tith am Sonntag 09.07.2006



    Ähnliche Beiträge wie "´Frage zu schleife"

    Alphabet mit schleife - dani93 (Freitag 30.11.2007)
    Schleife beim Dialog mit dem Schurken - Mirko (Donnerstag 26.10.2006)
    schleife funktioniert nicht - detewe89 (Sonntag 29.04.2007)
    -Close- The big Rase auf dem VRH "Zur Goldenen Schleife - Sooy (Sonntag 24.06.2007)
    Problem mit Repeat-Schleife - orluk (Samstag 11.08.2007)
    Schleife rei & Co GmbH - Tytroninus (Sonntag 17.06.2007)
    Schleife (Anfänger) - Joe (Freitag 07.12.2007)
    «Big Brother» geht in die Endlos-Schleife - narcotic (Sonntag 17.10.2004)
    char / schleife - Michael (Samstag 11.11.2006)
    22.04.2006 Golden Club Schleife - Dr.med.Wurst (Montag 03.04.2006)