Aktuell: Richtige Schleife wählen?; Alt: Fehlerquelle gesucht



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • @hustbaer

    Danke für die Tipps. Habe mich bemüht die einzelnen Punkte zu bearbeiten und werde es mir in Zukunft zu Herzen nehmen.
    Nur beim Titel bin ich mir nicht sicher. Ist dieser jetzt besser? Da ich nicht die ganze Zeit einen neuen Thread eröffnen will habe ich mir gedacht, sowohl das ältere alsauch das aktuelle Thema in den Titel aufzunehmen.

    Ich muss zugeben, dass ich mich nicht auf den Pfad konzentriert habe, sondern eher auf die Fehlermeldungen(Syntaxfehler, Fehlender Typspezifizierer) geachtet habe. Auch den Pfad werde ich in Zukunft berücksichtigen 😉

    @forumtbot

    Danke fürs verschieben und sry für die falsche Wahl

    Wünsche euch allen einen angenehmen start in den Tag



  • Könntet ihr mir einen Tipp geben welche Schleife ich benutzen muss? Ich verlange jetzt von niemandem das Programm zu schreiben da ich es selber lösen möchte 😉
    Und wie würde ich das mit den variablen machen? Es könnte dann ja theoretisch a-z und noch mehr geben. Kann man diese auch a1,a2,a3..,b1,b2,b3,.. usw benennen oder gibt es hierfuer eine einfachere Variante?

    Nur while, do-while und for sind schleifen. If/else sind abfragen.
    for eignet sich in deinem fall nicht wirklich, for-schleifen nur zum hoch oder runter zählen gemacht sind.
    eine while schleife prüft erst die Bedingung, und führt dann Code aus, bei einer do-while schleife wird erst Code ausgeführt und dann eine Bedingung geprüft.

    Ich würde vorschlagen, um Sicher zu stellen das du es Verstanden hast, solltest du mal 1 kleines bsp für jede Schleife hier posten. z.B. das keine 1x1 kann man mit jeder dieser Schleifen programmieren.

    Sobald du das raus hast kannst du dich deinem Spiel widmen. Alles andere würde wohl nur Furst verursachen.

    EDIT:
    Das Zauberwort für deine vielen Variablen ist Array.

    Bitte denke an sprechende Namen. a1 oder T1 ist nicht sprechend.
    Und beschäftige dich erstmal mit den Schleifen. die Arrays kann man dann angehen.



  • Danke Sqwan, für den Post und die kurzen Erläuterungen 🙂

    Ich werde mich gleich einmal hinsetzen und versuchen das 1x1 mit jeder dieser Schleifen zu schreiben. Danach werde ich die Ergebnisse hier posten.

    Hehe, das mit den Arrays hatte ich vermutet, habe da ein Beispiel gemacht aber wohl nicht ganz verstanden. Zuerst setze ich mich mal mit while, do-while und for auseinandern und später widme ich mich dem Array 🙂



  • Tut mir Leid, dass ich mich schon wieder wegen so einer Kleinigkeit melde...

    Habe eben mit der while Schleife begonnen und nocheinmal das Zählen von Anfang an angefangen. Es wird Debugt, zeig mir keine Fehler an und startet auch die Konsole.
    Doch es wird nicht gezählt, sondern nur die leere Konsole angezeigt.
    Bin den Code zig Mal durch gegangen, aber ich kann keinen Fehler finden... i++; sollte doch der Befehl sein den Wert um 1 zu erhöhen, und while (i <= 10 ), dass es nur maximal bis 10 zählen soll.

    Danke schonmal 😕

    Edit: Würdet ihr mir sagen in welcher Zeile der Fehler liegt wenn einer da ist?Thx

    /*
    
    	main.cpp
    
    */
    
    #include <iostream>
    
    using namespace std;
    
    int main()
    
     {
        int i = 1;                
    
        while (i <= 10) {         
            cout << i << endl;    
            i++;                  
        }
    }
    
    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());
    cin.get(); 
    
    return 0;
    
    }
    


  • Versuch den Fehler mal selbst zu finden.
    Dazu kommentierst du einfach Bestandteile aus, von denen du denkst das sie verantworklich sein könnten.

    So z.B.

    /*    
         main.cpp
    */
    
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int i = 1;                
    
        while (i <= 10) {         
            cout << i << endl;    
            i++;                  
        }
    }
    
    /* 
    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());
    cin.get(); 
    */ 
    return 0;
    
    }
    


  • Con5ti schrieb:

    Es wird Debugt, zeig mir keine Fehler an und startet auch die Konsole.

    Das kann nicht sein. Der Code sollte sich gar nicht kompilieren lassen, schon allein weil er zwei öffnende geschweifte Klammern, aber drei schließende enthält.



  • Danke euch zweien, naja jetzt ist ja wohl offensichtlich wo der Fehler lag 😉

    Eine } zu viel wie MFK schon sagte^^

    Ich bin jetzt gerade dabei mit "while" das 1x1 zu schreiben. Bis 1x10 hab ich es hinbekommen, war ja auch nicht allzu schwer 😉

    ich melde mich sobald ich eine mögliche Lösung gefunden habe



  • Hi ihr,

    ich habe jetzt viel herum probiert, und das war mein bestes Ergebnis.
    Ich habe nach while schleifen gegoogelt und wie man mit dieser das 1x1 schreibt, doch leider keinerlei Tipps in diese Richtung gefunden. Jeglich zu do while...

    Ich habe es versucht, doch fehlt mir die richtige Umsetzung und umständlich habe ich es auch gemacht.
    Habe jetzt nur 1x1 und 2x2 geschrieben..

    /*
    
    	main.cpp
    
    */
    
    #include <iostream>
    
    using namespace std;
    
    int main()
    
     {
        int i = 1;				//Hier habe ich die Variablen initialisiert. ICh nehme mal an, dass man mit dem richtigen Befehl auch nur 2 nehmen kann
    	int z = 1;
    	int x = 1;
    	int y = 2;
    	while (i <= 10)			//Könnte ich hier bestimmen, dass z seinen Wert auf , 2, 3, usw, änderen soll, sobald i = 10?							
    	{
    		cout << i <<  " * " << z << " betraegt " << i * z << endl;
    		i++;
    
    		if ( i == 10 )					//Wieso nehme ich hier if? Was ich eigentlich machen wollte ist, dass sobald i = 10, automatisch der nächste Schritt vom 1x1 kommt
    
    		while ( x <= 10 ) 	
    		{
    
    			cout << x <<  " * " << y << " betraegt " << x * y << endl;
    			x++;
    
    	}	
    	}
    
    	/*
    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());
    cin.get(); 
    
    return 0;
    
    }
    */
    


  • Hi

    Also mach dir mal die Aufgabe klar.

    1 x 1 = 1
    1 x 2 = 2
    1 x 3 = 3
    etc

    2 x 1 = 2
    2 x 2 = 4
    2 x 3 = 3
    etc
    ...
    10 x 10 = 100

    Beschäftigen wir uns mit dem Teil vor dem x. Hier müssen die Zahlen von 1 bis 10 hoch gezählt werden.

    Heißt

    deine zähler variable muss von 1 solange um 1 erhöht werden bis sie 10 ist
    {
         //Bei jedem erhöhungsschritt passiert das folgende
         //für jeden schritt muss die zähler variable mit den Zaheln von 1 bis 10 multipliziertwerden
         deine zweite zähler variable muss von 1 solange um 1 erhöht werden bis sie 10 ist
         {
              Das passiert hier: erster Zähler x zweiter Zähler
              //Das Ergebnis muss ausgegeben werden. 
              //Da du dich aktuell um while kümmerst passiert das hochzählen hier
              zweiter zähler + 1
         }
         // Auch hier nimmst du while
         erster zähler +1
    }
    

    Und bitte benutze sprechende Namen !!!!
    int i = 1;
    int z = 1;
    int x = 1;
    int y = 2;

    Hier spricht garnichts. Keiner weiß was es ist. Nicht mal du!
    Edit: Setz die Klammern bitte vernünftig untereinander und mach nicht so gnadenlos viele Leerzeilen zwischen jede Zeile. Das macht es für uns und noch mehr für dich unübersichtlich. Deine Klammern stimmen nämlich schon wieder nicht!!! Ich frag mich wie das laufen kann

    if ( i == 10 ) //Wieso nehme ich hier if? Was ich eigentlich machen wollte ist, dass sobald i = 10, automatisch der nächste Schritt vom 1x1 kommt

    Schreib an jede Zeile genau dran was sie macht.
    Wie schreibst du da ein if, wenn du keine Ahnung hast was es tut?
    Denk nach was du brauchst, und schreib es dann.



  • Hi Sqwan, danke für deine Mühe und dass du dir die Zeit nimmst.

    Ich bin jetzt Schritt für Schritt durchgegangen und habe darauf geachtet deine Anweisungen durchzusetzen. Doch einiges ist mir immernoch nicht klar, dies habe ich im Code kommentiert.

    Das if habe ich genommen, da ich dachte dass wenn die Bedingung von while nicht zutrifft, die Bedingung von if wiedergegeben wird....Dachte das kann man hier gebrauchen

    Ich schäm mich echt schon, dass ich das net gebacken bekomme...

    /*
    	main.cpp
    */
    
    #include <iostream>
    
    using namespace std;
    
    int main()
    
    {
        int ersterZähler = 1;				//Hier ordne ich den beiden Zählern ihre Anfangswerte zu
    	int zweiterZähler = 1;
    
    	?									//"Bei jedem erhöhungsschritt passiert das folgende"- //"für jeden schritt muss die zähler variable mit den Zaheln von 1 bis 10 multipliziertwerden" -
    	?									 //Dieser Schritt ist mir nicht ganz klar, ich dachte, dass die Multiplikationen erst im nächsten Abschnitt stattfinden
    
    	while (zweiterZähler <= 10 )		//Der zweiteZähler wird solange erhöht bis er 10 erreicht
    
    	{
    		cout << ersterZähler << " * " << zweiterZähler << endl;		//Gibt das Ergebnis aus
    		zweiterZähler++;											//Hier beginnt das Hochzählen von zweiterZähler
    	}
    
    	while(Bedingung)					//Hier soll ersterZähler erhöht werden.Daher bräuchte ich doch als Bedingung, dass wenn zweiterZähler = 10, soll ersterZähler erhöht werden oder?
    	{
    		ersterZähler++;                  //ersterZähler wird erhöht
    	}
    
    		cin.clear();
    		cin.ignore(cin.rdbuf()->in_avail());
    		cin.get(); 
    
    return 0;
    
    }
    


  • So. Sehr gut. Das sieht doch endlich mal nach einem verwertbaren Anfang aus.

    Das problem ist das du zu sehr in Schritten und zu wenig in Schleifen denkst.
    Schleife bedeutet, das etwas immer wieder passiert:

    while (zweiterZähler <= 10 )        //Der zweiteZähler wird solange erhöht bis er 10 erreicht 
        {
            cout << ersterZähler << " * " << zweiterZähler << endl;     //Gibt das Ergebnis aus
            zweiterZähler++;                                            //Hier beginnt das Hochzählen von zweiterZähler
        }
    
        while(Bedingung)                    //Hier soll ersterZähler erhöht werden.Daher bräuchte ich doch als Bedingung, dass wenn zweiterZähler = 10, soll ersterZähler erhöht werden oder?
        {
            ersterZähler++;                  //ersterZähler wird erhöht
        }
    

    Hier machst du folgendes.
    Du läuft 10 mal zählerZwei durch.
    Und danach 10 mal zählerEins.
    Du musst also zählerEins mal zählerZwei durchlaufen.

    Für dich heißt das

    Solange wie zählerEins kleiner ist als 10, muss die schleife ausgeführt werden, die so lange läuft wie zählerZwei kleiner als 10 ist.

    while(x)
    {
         while(y)
         {
         }
    }
    

    Das ist jetzt x*y
    Wie würde deiner Meinung nach jetzt x*y*z aussehen?



  • 🙂 Danke Sqwan, das positive Feedback gibt mir wieder Mut 😉

    Wenn

    while(x)
    {
         while(y)
         {
         }
    }
    

    x*y ist,

    wäre dann

    while(x)
    {
         while(y)
         {
    	        while(z)
    		{
    		}
         }
    }
    

    x*y*z ?

    Wenn ich das richtig verstanden habe, gibt es dann nicht ersterZähler, zweiterZähler und dritterZähler, sondern ich muss für z eine Variable aus ersterZähler und/oder zweiterZähler finden?

    Werde mich dann morgen da dran setzen, bin schon etwas müde 😉



  • Das ist auch besser so.
    Denn die Lösung hast du quasi.
    Wenn du noch nicht ganz klar kommst, schreib dir mal auf ein blatt was die schleife mach:

    while(x)
    {
         while(y)
         {
         }
    }
    


  • Auch wenn die Lösung schon direkt vor meinen Augen liegt, komme ich noch nicht so ganz drauf. 😉
    Ich vermute, dass ich nicht mehr weit entfernt bin und dass dieser Satz: "Solange wie zählerEins kleiner ist als 10, muss die schleife ausgeführt werden, die so lange läuft wie zählerZwei kleiner als 10 ist." mich zur Lösung bringen wird?
    Ganz durchschaut habe ich ihn noch nicht...

    Solange wie zählerEins kleiner ist als 10, muss diese Schleife ausgeführt werden. Und diese (zählerEins)Schleife muss so lange laufen wie zählerZwei kleiner ist als 10.
    Das heißt, dass zuerst zählerZwei läuft, und in der Schleife von zählerZwei, die Schleife zählerEins. Richtig so?

    Ich habe die die Aufgabe von deinem letzten Posting einmal gemacht. Zuerst auf Papier und dann am Pc eingetragen.

    while(x)				//Solange wie x True ist, wird die Anweisung ausgeführt.
    {						//Ansonsten fährt das Programm nach der while-Schleife fort
    	//Anweisung1
    
    	while(y)			//Sobald x nicht mehr erfüllt wird(false), fährt das Programm bei er 2. while-Schleife fort und führt
    	{					//Anweisung2 solange aus wie y true ist.
    
    		//Anweisung2 || while(z)	//Gibt es hier eine Anweisung, oder ist die Anweisung while(z)?
    
    		while(z)		//Sobald y false ist, fährt das Programm bei der 3. while-Schleife fort und führt
    		{				//Anweisung3 solange aus, wie z true ist
    			//Anweisung3
    		}
    	}
    }
    
    Das heißt:
    
    while(zweiterZähler <= 10)		
    
    {	
    	cout << ersterZähler << " * " << zweiterZähler << endl;		//Solange wie zweiterZähler <= 10, wird zweiterZähler hochgezählt bis er den Wert 10 erreicht.
    	zweiterZähler++;											//Danach fährt das Programm bei while(y) fort
    
    	while(y)					//Sobald zweiterZähler <= 10, false ist, führt das Programm while(y) aus.
    		{						
    			while(z)			//Die Anweisung von while(y), ist while(z)?
    			{					
    				//Anweisung3				
    			}
    		}
    }
    


  • Ich helfe dir mal. Ist aber nicht kompilierbar!
    Nur mal grade so aus dem Kopf, als kleiner Hilfe.
    Hätte eh einen C++ Compiler auf meinem Arbeitsrechner.
    Auf meinem Heimrechner übrigens auch nicht ^^

    int zaehlerEins = 1;
    int zaehlerZwei = 1;
    
    while(zaehlerEins <= 10)
    {
        while(zaehlerZwei <= 10)
        {
            cout << zaehlerEins * zaehlerZwei <<endl;
            zaehlerZwei++;
        }
        zaehlerZwei = 1;
        zaehlerEins++
    }
    

    Versuch das mal zum laufen zu bringen. Danach baust du es mal so um das es von 10 rückwärts läuft. Wenn du die schleifen nicht rein bekommst, kannst du das Spiel gleich vergessen.



  • Hi Sqwan danke für die Hilfestellung, das war ja schon sozusagen die Lösung 😉

    Konnte es zum laufen bringen, und habe das gleiche dann nocheinmal Rückwärts gemacht 🙂
    Hier mein Ergebnis

    /*
    	main.cpp
    
    */
    
    #include <iostream>
    
    using namespace std;
    
    int main()
    
    {
        int zaehlerEins = 10;
    	int zaehlerZwei = 1;
    
    		while(zaehlerEins >= 1)
    		{
    			while(zaehlerZwei <= 10 )
    			{
    				cout << zaehlerEins << " * " << zaehlerZwei << endl;
    				zaehlerZwei++;
    		        }
    				zaehlerZwei = 1;
    				zaehlerEins--;
    		}
    		cin.clear();
    		cin.ignore(cin.rdbuf()->in_avail());
    		cin.get(); 
    
    return 0;
    
    }
    


  • Okay. Dann ist jetzt wohl do-while and for dran.



  • Hui, ich muss sagen dass ich stolz auf mich bin 🙂 Konnte es lösen ohne irgendwo nachzusehen :DDD Wenn man es einmal versteht, ist es ja garnicht so schwer wue gedacht^^
    Womit soll ich als nächstes fortfahren? oder soll ich zu diesen Schleifen noch Übungen machen?

    do-while:

    /*
        main.cpp
    
    */
    
    #include <iostream>
    
    using namespace std;
    
    int main()
    
    {
       int ersterZähler = 1;
       int zweiterZähler = 1;
    
       do
       {
    	   do
    	   {
    		   cout << ersterZähler << " * " << zweiterZähler << endl;
    		   zweiterZähler++;
    	   }
    	   while(zweiterZähler <= 10);
    
    		zweiterZähler = 1;
    		ersterZähler++;
       }
       while(ersterZähler <= 10 );
    
            cin.clear();
            cin.ignore(cin.rdbuf()->in_avail());
            cin.get();
    
    return 0;
    
    }
    

    for:

    /*
        main.cpp
    
    */
    
    #include <iostream>
    
    using namespace std;
    
    int main()
    
    {
      int ersterZähler, zweiterZähler;
      for	(ersterZähler = 1; ersterZähler <= 10; ersterZähler++)
    		{
    		  for (zweiterZähler = 1; zweiterZähler <= 10; zweiterZähler++)
    		  {
    			  cout << ersterZähler << " * " << zweiterZähler << endl;
    		  }
    		}
    
            cin.clear();
            cin.ignore(cin.rdbuf()->in_avail());
            cin.get();
    
    return 0;
    
    }
    


  • Dein Einrückstil wird dir irgendwann noch böse aua machen.
    Außerdem solltest du deine Variablen erst da anlegen, wo du sie auch wirklich brauchst. In dem Fall jetzt in den for Schleifen.

    for (int ersterZähler = 1; ersterZähler <= 10; ersterZähler++)
    for (int zweiterZähler = 1; zweiterZähler <= 10; zweiterZähler++)
    

Anmelden zum Antworten