Array mit Zustandsänderungen

a400

Mitglied
Hallo, ich bin relativ frisch in C++ und brauch mal ne kleine Hilfe von euch bzw. ein paar Tipps.
Also ich soll ein kleines Fungame erstellen. Und zwar gibt der Benutzer eine Zahl ein z.B. 6
Nun soll auf dem Bildschirm die Ausgabe erfolgen:
"Auto 1: aus
Auto 2: aus
Auto 3: aus
Auto 4: aus
Auto 5: aus
Auto 6: aus"

Das heißt mit der Eingabe, werden die Autos erstellt, so und jetzt geht es los, der "unsichtbare Fahrer" rennt von Auto zu Auto und stellt es an bzw. aus und das soll so gehen. 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.
Die Ausgabe nachdem alle Schritte vollzogen sind, soll dann so ausschauen:
"Auto 1: aus
Auto 2: an
Auto 3: an
Auto 4: aus
Auto 5: an
Auto 6: an "

Jetzt meine Fragen dazu, wie löse ich das am Besten? Kann ich mir da irgendwie 2 Arrays erstellen, im ersten stehen die Autos mit den Nummern und im zweiten Array die Zustände? Und dann lasse ich die jeweils mit einem cout << ausgeben
so z.B

Code:
for-schleife ( for int i = 0; i<= eingabe; i++) 
{ 
cout << array1[i] << array2[i] << endl; 
}



Und dann noch das größte Problem dabei, wie kann ich das angehen mit dem Autofahrer, der die Autos in verschiedenen Abständen an und aus stellt, da hab ich noch überhaupt keine Idee, wie ich das angehen kann.
Wäre supergut, wenn mir jemand da etwas helfen könnte, bzw. sagen, ob ich da mit den arrays ganz und gar auf Abwegen bin, oder sich das so lösen ließe.

Aso und wie erstellt man so ein Stringarray bei Java war das ja immer ganz einfach...
array1 =new String array[]
 
moin


Also ein zweites Array brauchst du nicht, da die Position der Elemente des Arrays gleich die Nummer ist.

Jedeszweite an:
Code:
for(int i=1; i<7; i++)
{
    if(i%2 == 0)
        Array[i-1]=1;
}
Jedes dritte an:
Code:
for(int i=1; i<7; i++)
{
    if(i%3 == 0)
        Array[i-1]=1;
}

Ausgabe:
Code:
for(int i=1; i<7; i++)
{
    if(Array[i-1] == 1)
        cout<<"Auto "<< i << " : ein";

    if(Array[i-1] == 0);
        cout<<"Auto "<< i << " : aus";
}
So im Prinzip, hab es aber nicht getestet.


mfg
umbrasaxum
 
Wenn dein Projekt größer wird, und du noch viele Andere Zustände der Autos haben wirst, würde ich dir empfehlen dir das Entwurfsmuster Zustand (bei google unter STATE zu finden) anzuschaun. Dann kannste dir ne Menge IF Abfragen ersparen und es wird übersichtlicher.

Gruss

MFC OpenGL
 
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:
Code:
  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....

Code:
  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

Code:
  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; 
  			} 
  		}

o ,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.

Code:
  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
 
moin


Dies ist wohl falsch:
Code:
for (int i=1; i<= sizeof(iarray); i++)
Da dürfte der vierfache erwünschte Wert herauskommen.
Code:
for (int i=1; i<= sizeof(array) / sizeof(int); i++)

Wäre wohl angebrachter.


mfg
umbrasaxum
 
Ich hab da mal (quick'n'dirty) was programmiert. Ich hab es so angepasst das das Ergebnis herauskommt wie im Beispiel. Ich bezweifle aber, das das jetzt so korrekt ist weil demnach Auto 1 niemals an- bzw. ausgeschaltet wird. Ich vermute das die Aufgabenstellung doch noch etwas anders ist....

Code:
#include <iostream>
#include <string>

using namespace std;

void print_autos( bool *autos, unsigned int size )
{
  for (int i = 0; i < size; ++i) {
    cout << "Auto " << i+1 << ": " << ( autos[i] ? "an" : "aus" ) << endl;
  }
  cout << string(40, '-') << endl;
}

int main( )
{
  unsigned int anzahl, nr = 0, delta = 2;
  bool *autos;

  cout << "Anzahl der Autos: "; 
  cin >> anzahl;

  autos = new bool[anzahl];

  print_autos (autos, anzahl);
  
  while ( delta < anzahl ) {
    
    if ( nr + delta > anzahl ) 
      nr = ++delta;
    else 
      nr += delta;

    autos[nr-1] = ! autos[nr-1];
    
    print_autos (autos, anzahl);
  }

  delete autos;
}

--
dt
 
moin


Ist dir denn klar das bei einem Array das erste Element mit die Nummer 0 hat?


mfg
umbrasaxum
 
moin


Wie es aussieht wird nr niemals 1 so das niemals das Element 0 angesprochen werden kann.
Außerdem solltest du "int main()" immer mit "return 0;" beendet werden!


mfg
umbrasaxum
 
Zurück