Arrays mit Zustandsänderung



  • relativfrisch schrieb:

    Der Fahrer geht die Autos entlang und startet dann jedes zweite, nachdem er beim 6. angelangt ist, nimmt er jedes dritte Auto und stellt es an bzw. falls es an ist, macht es wieder aus, das macht er so lange, bis die Anzahl der Autos gleich der Abstände seiner Vorgänge ist, also auf das Beispiel bezogen 6.



  • Dommel schrieb:

    relativfrisch schrieb:

    Der Fahrer geht die Autos entlang und startet dann jedes zweite, nachdem er beim 6. angelangt ist, nimmt er jedes dritte Auto und stellt es an bzw. falls es an ist, macht es wieder aus, das macht er so lange, bis die Anzahl der Autos gleich der Abstände seiner Vorgänge ist, also auf das Beispiel bezogen 6.

    👍

    ok geb mich geschlagen!



  • hallo, danke für die schnellen Antworten.

    Ja, die Abstände sind vorgegeben, also bei der Eingabe von 6 wird von 2 bis 6 hochgezählt, und jeweils erfolgt ein durchlauf durch das Array.

    Also ich hab es bis jetzt so gemacht, das ich mir mit einer Schleife die Namen ausgeben lasse "Auto 1 ... bis Auto 6, das muss ja noch gar nicht in ein Array, da es sich in der Tat ja nicht ändert. Jetzt hab ich so meine Probleme damit, dieses "aus" und "an" in ein Array zu bekommen und wie weise ich dann einen neuen Wert zu? Könnt ihr mir da nen kleinen Wink geben. In Java ging das ja immer richtig einfach, wenn man nen String in ein Array gepackt hat, aber hier find ich irgendwie nicht die Möglichkeit ein ganzes Wort in eine Arrayposition einzufügen.

    Naja, ein Spiel ist es ja nicht wirklich, aber mir ist auch keine so richtig gute andere Bezeichnung eingefallen, aber man könnte es ja auch als Dominofunktion bezeichnen, aber das klingt auch nicht gerade gut 🙂



  • #include <iostream>
    #include <string>
    using namespace std;
    
    string array[]={"Hallo","Test"};
    

    geht doch einfach!



  • da es sich ja nur um an/aus-Zustände handelt, würd ich am einfachsten ein bool-Array nehmen. Das ist wohl am einfachsten...



  • wollt nur zeigen das es geht...



  • Du kannst es auch mit einem struct und nem Array machen, also:

    struct car {
      std::string name;
      bool running;
    };
    

    dann ein array erstellen

    const int carcount = 6;
    car cars[carcount];
    
    // init
    ...
    
    // später in der Zuweisung
    ...
    cars[i].running = !(cars[i].running);
    ...
    


  • Hallo,

    ich hab es jetzt so geamcht, dass ich mir ein int array erstellt habe und dann anfangswerte zuweise (hier die 2). das ganze schaut so aus:

    for(int i=0; i<= autos; i++)
    	  {
    		array[i] = 2;
    	  }
    	return 0;
    

    mit einer schleife lasse ich mir dann immer die namen ausgeben, also auto 1....

    for (int anzahl = 1; anzahl <= autos; anzahl++)
    	{	
    	 cout << "Auto " << anzahl << ":        ";
    for (int i=1; i<= sizeof(iarray); i++)
    		{
    		 if (array[i] == 2)
    		 {
    			 cout << " an " << endl;
    		 }
    		 else if (array[i] == 3)
    		 {
    			 cout << " aus " << endl;
    		 }
    		 else // falls eine andere Zahl dort stehen sollte
    		 {
    		 }
    		 break;
    		}
     }
    	 return 0;
    }
    

    und gleich dahinter die jeweiligen anfangszustände, also alle Autos aus.

    so jetzt hab ich nen problem mit der zustandsänderung. es soll ja dann ab 2 beginnend das array für die länge durchlaufen werden und dann der zustand geändert werden. (bsp. bei 2, also 2, 4, 6; dann geht es weiter bei 3, dann wird 3 geändert und 6....)

    der code schaut so aus

    int aenderungZustand(int autos)
    { 
    	int au = autos;
    		for ( int i = 2 ; i <= au ; i++)
    		{
    			if(array[i] == 2)
    			{
    				array[i]=3;
    			}
    			else if(array[i] == 3)
    			{
    				array[i]=2;
    			}
    			else
    			{
    				array[i]=0;
    			}
    		}
    

    wo ,mache ich denn da jetzt den fehler, bei dieser sache hier wird jeder zustand jedes mal geändert, also es wird immer jeder punkt im array durchlaufen, wobei ja nur beim ersten die vielfachen von 2, beim 2 durchlauf die vielfachen von 3 usw. geändert werden sollen.

    und mein 2. tes momentanes problem besteht in der erneuten ausgabe.

    int zustandSichtbar(int anzahl)
    { 
    	int an = anzahl;
    	for (int anzahl = 1; anzahl <= an; anzahl++)
    	{	
    	 cout << "Auto " << anzahl << ":        ";
    
         for (int i=1; i<= sizeof(array)/sizeof(array[i]);i++)
    	 {  
    		 switch(array[i])
    		 {
    		case 2: cout << " aus " << endl;  break;
    
    		case 3: cout << " an " << endl;  break;
    
    		default: cout << endl; break;
    		 }	 
    	 }
    return 0;
    }
     return 0;
    }
    

    hier werden jetzt alle zustände nochmal ausgegeben, was ja falsch ist
    das wird ausgegeben:
    Auto 1 : aus
    an
    aus....
    Auto 2: aus
    an
    aus...
    ...

    das ist ja falsch da es so aussehen sollte
    Auto 1: aus
    Auto 2: an
    Auto 3 aus

    Also da muss irgendwo noch der Fehler sein, dass ich immer das ganze array hinter jedem auto ausgebe und nicht nur die position. aber ich find den fehler da nicht... 👎

    Kann mir jemand von euch da bei meinen problemem mal kurz helfen? danke



  • hm, na gut, dann doch fertige Schleife ...

    Ich versteh' nicht, wieso Du da mit int rummachst, ein Auto kann doch nur an oder aus sein. Ein bool reicht hier vollkommen. Die Namen brauchst Du ja nicht, wie Du sagtest, also brauchst auch erstmal kein struct, aber dann nimm doch ein Array von bool.

    const int carcount = 6;
    bool cars[carcount];
    
    // Init, ist zwar eigentlich standard false, aber sicherheitshalber:
    for (int i = 0; i < carcount; ++i) { cars[i] = false; }
    
    // Erstmal abstand hochzählen
    for (int abstand = 2; abstand <= carcount; abstand++) {
      // Alle Autos ablaufen
      for (int i = 0; i < carcount; ++i) {
        // Wenn Auto im aktuellen Abstand:
        if ( (i+1) % abstand == 0 ) {  // (i + 1), um weil der Array-Index bei "0" beginnt, die Autos aber bei "1"
          cars[i] = !cars[i];  // Wechsel zwischen true (an) und false (aus)
        }
      }
    }
    
    // Ausgabe:
    std::cout << "Endzustand:" << std::endl;
    for (int i = 0; i < carcount; ++i) {
      std::cout << "Auto " << (i+1) << ": " (cars[i] ? "an" : "aus") << std::endl;
    }
    

    Ist jetzt ungetestet, aber sollte so laufen, evtl. 2-3 Syntaxfehler, aber von der Logik her sollte das so funzen.



  • was vielleicht noch eleganter wäre ist, wenn du statt '++i' und der Modulo-Abfrage einfach 'n += Abstand' schreibst. 🙂

    Also:

    for (int i=Abstand-1; i<carcout; i += abstand)
      cars[i] = !cars[i];
    


  • Jop, hast Recht, spart auf jeden Fall unnötige Schleifendurchläufe.



  • Hallo nochmals, ich hab jetzt den Code mal nachvollzogen und das scheint ja mit der Lösung gut zu klappen, bloß eine Frage hab ich dazu noch, wenn ich das Compiliere, bekomme ich an dieser Stelle ne Fehlermeldung:

    std::cout << "Endzustand:" << std::endl;
    for (int i = 0; i < carcount; ++i) {
      std::cout << "Auto " << (i+1) << ": " (cars[i] ? "an" : "aus") << std::endl;
    

    Was hat das std:: da zu zuchen, muss ich da noch etwas anlegen für?



  • das

    std::cout
    

    bedeutet, das er das cout aus dem namespace std holt..

    Hast du irgendwo (am anfang deines programmes) schon sowas stehen:

    using namespace std;
    //oder
    using std:cout;
    using std::endl;
    

    wenn ja, kannst die std da wegmachen!

    Und im übrigen, wäre die Fehlermeldung nicht schlecht, das wir die mal uns anschauen könnten 🙄



  • Ja okay, sorry wegen der Fehlermeldung 😉 ich reich sie jetzt mal nach.

    Das mit dem std hat sich dank deiner Hilfe auch geklärt, es sind alle Fehlermeldungen verschwunden. Ich hatte den std schon weiter oben anders definiert.
    Aber nun zur letzten Fehlermeldung und zwar an dieser Codestelle:

    std::cout << "Auto " << (i+1) << ": " (cars[i] ? "an" : "aus") << std::endl
    

    Fehlermeldung: " error C2064: Ausdruck ergibt keine Funktion, die 1 Argument übernimmt"



  • Oh Sorry,

    std::cout << "Auto " << (i+1) << ": " (cars[i] ? "an" : "aus") << std::endl;
    

    muss natürlich

    std::cout << "Auto " << (i+1) << ": " << (cars[i] ? "an" : "aus") << std::endl;
    

    Hatte ein "<<" vergessen, aber ich hatte ja gesagt, dass evtl. 2-3 Syntaxfehler drin sind. 😃



  • Da fehlt ein <<.

    [edit]zu spät[edit]



  • Hey super, dank euch beiden, jetzt läuft es! 😉 Ich hab am Ende da so viel schon ausgetestet gehabt, nochmal das ganze Array neu übergeben usw. aber das war mir auch nicht aufgefallen.... klasse!!!

    Also danke


Anmelden zum Antworten