Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Praktische Informatik (http://www.informatikerboard.de/board/board.php?boardid=6)
--- Programmierung 2 (http://www.informatikerboard.de/board/thread.php?threadid=3686)


Geschrieben von Victor am 19.09.2017 um 09:58:

 

Ich weiss das hier meine Idee nicht ganz so richtig ist.
Aber das sind irgendwie die Gedankengänge die ich hier rein geschrieben habe.

Für die X Koordinate muss ich ja die for schleife über die X Werte gehen lassen ,daher habe ich getX genommen.

Aber das zeigt nur Fehler großes Grinsen

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
void CRectangle::draw(CScreen& screen) const
{
	for(int getX() = 0; getX()>0 ; getX()++){


		setPoint(m_x,#);
	}
}



Ich hoffe der Code hat wenigstens bisschen Logik?



Geschrieben von Victor am 19.09.2017 um 20:35:

 

Kannst du mir noch weiter helfen string ?
Besser bisschen Hilfe von dir als gar keine großes Grinsen
Ohne deine Hilfe schaffe ich gar nichts



Geschrieben von as_string am 20.09.2017 um 22:03:

 

Das hier:
code:
1:
for(int getX() = 0; getX()>0 ; getX()++){...}

Ist in so vieler Hinsicht falsch und blödsinnig, dass ich gar nicht weiß, wo ich anfangen soll.
getX() ist doch keine Variable (genauer: kein LValue), der Du eine 0 zuweisen könntest oder die Du eins hochzählen könntest!
Warum sollte die Schleife bei 0 anfangen?
Was sollte die Bedingung ">0" bringen? Das ist beim ersten Durchlauf dann ja nie wahr, wenn Du vorher den Schleifenzähler mit 0 initialisiert hast!

Für mich zeigt das, dass Du noch nicht mal mit so eine grundlegende Sache wie eine for-Schleife auch nicht im Ansatz verstanden hast.
Lass uns deshalb mal anders anfangen. Nehmen wir als Beispiel das Rechteck mit den Ecken (5,5) und (15,25). Um dieses Rechteck zeichnen zu können, müssen wir die Methode setPoint(x, y, c) ja mehrfach aufrufen, und zwar für jeden einzelnen "Punkt" innerhalb dieses Rechtecks.
Wir müssen also z. B. die erste Zeile des Rechtecks zeichnen, indem wir für alle Punkte mit den Koordinaten 5 bis 15 für den x-Wert und 5 für den y-Wert aufrufen.
Also prinzipiell muss das hier ausgeführt werden:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
screen.setPoint( 5, 5, '#');
screen.setPoint( 6, 5, '#');
screen.setPoint( 7, 5, '#');
screen.setPoint( 8, 5, '#');
screen.setPoint( 9, 5, '#');
screen.setPoint(10, 5, '#');
screen.setPoint(11, 5, '#');
screen.setPoint(12, 5, '#');
screen.setPoint(13, 5, '#');
screen.setPoint(14, 5, '#');
screen.setPoint(15, 5, '#');

Das würde eine horizontale Linie mit den dem Füllzeichen '#' ausgeben. So könnten wir jetzt Zeile für Zeile weiter machen, also nochmal diese ganzen Anweisungen allerdings mit einer 6 für die y-Koordinate. Und so weiter bis zur 25 in der y-Koordinate.

Das wäre natürlich nicht sehr flexibel, weil man ja für unterschiedliche Rechtecke direkt den kompletten Quellcode ändern müsste. Deshalb wollen wir das mit Schleifen lösen, die flexibel die Anweisungen passend zu den Eckpunkten "generieren".

Deshalb für Dich zuerst mal eine einfache Aufgabe: Schreibe mir einfach mal eine for-Schleife auf für die erste Zeile. Verwende als Laufvariable einfach ein "i" und schreibe die ganzen Zahlen einfach zuerst fix rein. Das können wir dann später noch besser machen. Ich stelle mir also sowas vor:
code:
1:
2:
3:
4:
5:
for(...) {
    screen.setPoint(i, 5, '#');
}

Was muss in der Klammer hinter "for" statt der Pünktchen stehen, damit i der Reihe nach mit den Zahlen 5 bis 15 belegt wird?

Gruß
Marco



Geschrieben von as_string am 20.09.2017 um 22:06:

 

Ich habe gerade nochmal die Aufgabe angeschaut. Da ist der zweite Eckpunkt nicht (15,25) sondern (25,15). Das hatte ich falsch in Erinnerung. Das spielt aber letztlich keine wichtige Rolle im Moment. Du kannst meinetwegen den einen oder den anderen nehmen, wie Du möchtest...

Gruß
Marco



Geschrieben von Victor am 22.09.2017 um 23:14:

 

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
void CRectangle::draw(CScreen& screen) const
{

	for(int i = 5; 25>=i; i++) {
	    screen.setPoint(i, 5, '#');
	   
	}
  i++;
}


Ich habe am ende noch ein i++ eingebaut ,damit es auch irgendwann eine Zeile höher geht?

Aber das Problem ist ,ich will ja das es irgendwann aufhört oder ?

Irgendwie while Schleife einbauen oder wie?



Geschrieben von as_string am 22.09.2017 um 23:50:

 

Zitat:
Original von Victor
code:
1:
2:
3:
	for(int i = 5; 25>=i; i++) {

Nein, das ist schon falsch. Der zweite ist die "condition", aber das ist nicht die Abbruch-Bedingung, sondern eigentlich eine "Weitermach-Bedingung". So lange wie diese "true" ergibt, wird die Schleife fortgesetzt. Du hast es also gerade falsch rum formuliert.
Lies Dir doch am Besten mal das hier durch:
https://www.tutorialspoint.com/cprogramming/c_for_loop.htm
Zitat:
Original von Victor
Ich habe am ende noch ein i++ eingebaut ,damit es auch irgendwann eine Zeile höher geht?

Und was soll das bringen? Dann wird halt am Ende nochmal i hochgezählt. Das wurde innerhalb der Schleife schon von 5 bis 25 hoch gezählt. Wenn Du es noch eins weiter zählst, wird einfach i 26 sein. Es wird mit i aber gar nichts mehr gemacht und deshalb ist das völlig irrelevant.
Aber i ist ja so wie so nicht die Zeilennummer sondern die Spalte. Du willst ja gar nicht i erhöhen sondern Du willst noch eine zweite Variable für die Spalte einführen, also z. B. j. Der Trick ist, dass Du bei screen.setPoint(i, 5, '#'); die 5 ersetzt, z. B. mit einem j.
Dann machst Du um die for-Schleife mit i noch eine weitere for-Schleife außen rum, in der Du das j von 5 bis 15 hoch zählst. Dann hast Du eine innere und eine äußere Schleife und innerhalb der inneren rufst Du screen.setPoint auf. An dieser Stelle hast Du sowohl i als auch j, zuerst wird i und j beide 5 sein. Die innere Schleife zählt i bis 25 hoch. Dann kommt aber wieder die äußere for-Schleife zum Zug und zählt j auf 6 hoch. Mit j=6 wird dann aber i in der inneren wieder neu auf 5 initialisiert und die innere Schleife läuft wieder bis 25 hoch. Jetzt aber wird setPoint mit einer 6 für die y-Koordinate aufgerufen, so dass die zweite Zeile komplett ausgegeben wird. Usw.
Kannst Du das mal probieren?



Geschrieben von Victor am 23.09.2017 um 22:50:

 

Etwa so String?

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:

void CRectangle::draw(CScreen& screen) const
{
    for(int j = 5; 15>=j;j++){
	for(int i = 5; 25>=i; i++) {
	    screen.setPoint(i, j, '#');
	    
	}
    }




Geschrieben von as_string am 24.09.2017 um 00:01:

 

Das sieht doch schon ganz gut aus! Wink

Jetzt haben wir die Koordinaten für die Ecken, also die 5, 25 und die 5, 15 noch hard-coded im Quelltext stehen. Die wollen wir aber aus den Eckpunkten ermitteln!
Also, i ist ja die Zählvariable für die Spalten, also für x. Du muss von der x-Koordinate vom einen CPoint für die linke(-untere) Ecke bis zur x-Koordinate der rechten(-oberen) Ecke laufen für jede Zeile. Du musst also die 5 und die 25 in der inneren for-Schleife entsprechend ersetzen.
Genauso auch in der äußeren for-Schleife die 5 mit dem y-Wert der (linken-)unteren Ecke und die 15 mit der y-Koordinate der (rechten-)oberen Ecke.
Wie kommst Du aber an diese Koordinaten ran? Die Methode ist in der Klasse CRectangle. Du kannst also innerhalb der Klasse direkt auf die jeweiligen Member-Variablen zugreifen. Welches sind denn diese Variablen und wie kommst Du über die Punkte zu den richtigen X/Y-Koordinaten?

Außerdem haben wir auch das Füllzeichen '#' noch hart-kodiert. Auch hierfür haben wir in CRectangle eine Member-Variable, die den richtigen Wert beinhaltet.

Versuch mal, ob Du richtigen Werte für die vier Koordinaten (der beiden Eckpunkte) und das Füllzeichen raus bekommst und an die richtigen Stellen einsetzen kannst.

Gruß
Marco



Geschrieben von Victor am 24.09.2017 um 04:07:

 

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:

void CRectangle::draw(CScreen& screen) const
{
    for(int j = 5; 15>=j;j++){
    	screen.CRectangle(i,j,`#´);
	for(int i = 5; 25>=i; i++) {
	    screen.setPoint(i, j, '#');
	    screen.CRectangle(i,j,`#´);


	}
    }
}


Dafür müsste ich doch diesenCRectangle Konstruktor aufrufen siehe meinen Code?
Soll ich auch da Werte reinschreiben?



Geschrieben von as_string am 24.09.2017 um 11:40:

 

Ohje... das hat doch wirklich keinen Zweck! Ließ endlich mal ein Buch zur Objektorientierten Programmierung! Das macht doch überhaupt gar keinen Sinn das hier mit trial-and-error zu probieren!

Also erstens: ein Konstruktor ist dafür da, ein neues Objekt aufzubauen, Du hast aber schon ein Objekt, sonst könntest Du doch die Methode draw() gar nicht aufrufen, da sie nicht statisch ist!
Dann ruft man doch einen Konstruktor nicht in der Art eines Methodenaufrufs eines Objekts screen einer völlig anderen Klasse auf. Wie kommt man denn nur auf so einen Schwachsinn überhaupt.
Dann hast Du doch gar keinen Konstruktor, der zwei int und ein char akzeptieren würde.
Du hast überhaupt gar keinen blassen Schimmer, was es mit Klassen und Objekten überhaupt auf sich hat und schon gar nicht, weshalb das so ist. Du hast überhaupt keine Vorstellung was Kapselung ist, manchmal denke ich, Dir ist noch nichtmal der Unterschied zwischen Variablen und Methoden richtig klar etc. Du hast Schwierigkeiten grundlegende Konstrukte wie eine for-Schleife zu verwenden. Da schaffst es in eine kurze Programmzeile mehr als 3 Syntaxfehler und ungezählte semantische Fehler einzubauen.

Also das bringt hier wirklich rein gar nichts. Nimm Dir ein Buch. Wenn Du da was nicht verstehst, kannst Du gerne dazu dann fragen, aber das hier ist einfach Zeitverschwendung für alle Beteiligten.

Gruß
Marco



Geschrieben von Victor am 24.09.2017 um 13:24:

 

Aber wie soll ich den sonst den Konstruktor aufrufen ?

So klappt es auch irgendwie nicht ?

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:

void CRectangle::draw(CScreen& screen) const
{
    for(int j = 5; 15>=j;j++){
    	CRectangle(i,j,`#´);
	for(int i = 5; 25>=i; i++) {
	    screen.setPoint(i, j, '#');
	    CRectangle(i,j,`#´);


	}
    }




Geschrieben von Victor am 24.09.2017 um 13:36:

 

Meine andere IDee wäre so ?
Aber funktioniert auch net

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:

void CRectangle::draw(CScreen& screen) const
{
    for(int j = 5; 15>=j;j++){
    	this->CRectangle(CPoint i,Cpoint j , `#´);
	for(int i = 5; 25>=i; i++) {
	    screen.setPoint(i, j, '#');
	    this->CRectangle(CPoint i,Cpoint j , `#´);


	}
    }



Geschrieben von Victor am 24.09.2017 um 16:09:

 

Sind meine Idee wieder nicht gut ?
Ich möchte aber wissen wie es geht großes Grinsen

Habe im Netz herum gegoogelt .

Es steht teilweise drinnen das man Konstruktor in Funktionen mit this aufrufen kann ?

Aber das gibt ja trotzdem Fehler bei Eclipse



Geschrieben von as_string am 24.09.2017 um 21:24:

 

Wieso um alles in der Welt willst Du einen Konstruktor aufrufen??? Ich hab doch schon erklärt dass das Schwachsinn an dieser Stelle ist!



Geschrieben von Victor am 24.09.2017 um 22:03:

 

Wie soll ich das dann hier machen ?

Wie kommst Du aber an diese Koordinaten ran? Die Methode ist in der Klasse CRectangle. Du kannst also innerhalb der Klasse direkt auf die jeweiligen Member-Variablen zugreifen. Welches sind denn diese Variablen und wie kommst Du über die Punkte zu den richtigen X/Y-Koordinaten?


Forensoftware: Burning Board, entwickelt von WoltLab GmbH