gleichschenkliges Dreieck

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Vanii
User
Beiträge: 9
Registriert: Sonntag 11. Januar 2015, 14:41

Hallo liebe Pythonfreunde,

letzte Woche haben wir im Informatikunterricht mit dem Thema Python begonnen. Dazu haben wir auch gleich am Ende der Stunde ein Arbeitsblatt bekommen als Hausaufgabe.
Nun und da liegt auch schon mein Problem, dass ich da nicht weiterkomme....
Also es geht um folgendes programm:

Code: Alles auswählen

def programm():
	a=input('A')
	b=input ('B')
	c=int (a)
	d=int(b)
	i=0
	r=c-2
	e='*'
	print(e*c)
	for i in range (d):
		print (e + ' '*r + e)
	print (e*c)
Das zeigt ein Rechteck aus Sternchen, nun muss ich das Programm so umschreiben, dass es anstatt des Rechteckes ein gleichschenkliges Dreieck zeichnet.
Ich hatte paar Ideen die alle nicht funktioniert, weil ich wahrscheinlich noch nicht mal einen richtigen Ansatz hatte ... Da ich nicht weiss ob ich jetzt nun drei Variablen (a,b,c) brauche oder doch nur die beiden (a,b) reichen und so weitere Ratlosigkeiten.

Deswegen bitte ich dringend um Hilfe für Hinweise,Tipps und Ratschläge! Denn ihr sollt mir ja kein fertiges Programm schreiben.
Zuletzt geändert von Hyperion am Sonntag 11. Januar 2015, 15:48, insgesamt 1-mal geändert.
Grund: Code in Python-Code Tags gesetzt
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Abgesehen von der Umständlichkeit und den schlechten Namen in der gezeigten *Funktion* (``programm`` ist ein absolut unsinniger Name dafür ;-) ), verstehst Du denn, wie das funktioniert?

Habt ihr denn schon andere Sprachen oder auch allgemeine Konzepte von Programmieraprachen kennengelernt? Sind Dir Bedingungen, Schleifen usw. ein Begriff?

Versuche Dir doch erst einmal *ohne* Python mit einem Zettel und einem Stift klar zu machen, wie Du selber vorgehen würdest! Male Dir doch einfach mal ein solches "Käsekästchen"-Dreieck auf. Überlege, welche Informationen (Seitenlängen z.B.) Du gegeben hast bzw. brauchst, um zu bestimmen, wo Du ein leerzeichen und wo ein Sternchen in ein Kästchen malen musst. Wenn Dir dieser Zusammenhang klar ist, kannst Du Dir allgemein überlegen, wie Du das nun Zeile für Zeile hinbekommst und was sich in jeder Zeile wie ändert. Daraus kannst Du dann ableiten, ob und wo Du eine Schleife benötigst und welche Werte sich darin jeweils pro Durchgang ändern.

Anschließend kannst Du dann diese Überlegungen in Python *codieren*.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Das obige Programm funktioniert übrigens nicht bei kleinen Zahlen! ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Hyperion hat geschrieben:Das obige Programm funktioniert übrigens nicht bei kleinen Zahlen! ;-)
Dann nimmt man halt dieses hier. :mrgreen:

Code: Alles auswählen

print('\n'.join(('*' * r for r in range(int(input('Length: ')) + 1))))
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@/me: Das macht aber etwas vollkommen anderes ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Vanii
User
Beiträge: 9
Registriert: Sonntag 11. Januar 2015, 14:41

Also das Programm wurde vom Lehrer so vorgegeben, kann also für die Mängel (kleine Zahlen und den unsinnigen Programmnamen) nichts. :K

Würde sagen ich kenne mich mit Programmiersprachen mäßig aus, Java kann ich zumindest ganz gut... Da fiel mir das Zeichnen nicht schwer.
Aber hier hab ich irgendwie das Problem, dass ich nicht weiß mit wo er mit Zeichnen anfängt. Habe da irgendwie noch nicht so das Vorstellungsvermögen und Verständnis dafür. Deswegen suche ich ja bei euch Hilfe. Weil ich bis jetzt beim rumprobieren auf nichts sinnvolles gekommen bin.

Ich weiß auch das for eine Schleife ist aber kann mir auch nicht erklären warum i=0 und r=c-2 und dann halt den Rest mit der Schleife. (Brauch ich den auch die Schleife für das Dreieck?)
Und deswegen weiß ich auch nicht wie ich das umzuschreiben habe... und Internet hat mir da auch nicht geholfen, da ich ja das Dreieck mit Hilfe von der Funktion darstellen soll und nicht mit Turtle o.ä. .

Mit dem Käsekästchen probier ich mal aus, habe da aber wahrscheinlich dann wieder das Problem mit dem codieren in Python, da man da ja keine einzelnen Käsekästchen (in meinem Fall Sternchen) platziert :? .

Freue mich auf jede weitere Hilfe, Danke
Gruß Vanii
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Hyperion hat geschrieben:@/me: Das macht aber etwas vollkommen anderes ;-)
Oh, stimmt. Dann wird es komplizierter.

Code: Alles auswählen

n = int(input('Length: '))
print('*\n{}\n{}'.format('\n'.join('*{}*'.format(' '* r) for r in range(n-2)), '*' * n))
Vorgehensweise:
  • Seitenlänge n eingeben
  • Einen Stern ausgeben
  • Dann n-3 mal in je einer neuen Zeile zwei Sterne ausgeben die durch 0 bis n-3 Leerzeichen getrennt sind
  • in einer neuen Zeile n Sterne ausgeben
BlackJack

@Vanii: Wo braucht man da denn Vorstellungsvermögen? Du hast den Code, Du kannst ihn *laufen lassen* und siehst ja was passiert. Und Du kannst Dir wie schon gesagt ein Blatt kariertes Papier nehmen und den Ablauf ganz einfach mal Schritt für Schritt selber durchgehen. Dann siehst Du auch welche Werte die Namen annehmen und doch dann hoffentlich auch wofür die jeweils gut sind. Also zum Beispiel warum `r` als ``c - 2`` definiert ist, sollte dann ziemlich schnell klar werden. Ich frage mich eher warum das bei der Höhe nicht berücksichtigt wird. Da war der Lehrer inkonsequent. Und die Zuweisung ``i = 0`` ist überflüssig, die kann man weglassen.

Mit dem ”zeichnen” wird da angefangen wo Sternchen ausgegeben werden. Die werden nicht beliebig platziert sondern eben Zeilenweise ausgegeben, mit entsprechenden Leerzeichen wo das nötig ist. Das wäre in Java nicht viel anders, also wenn Du sagst Du kannst in Java programmieren, dann müsstest Du das ja in Java auch hinbekommen können. Dann sollte das aber auch in Python möglich sein, denn *so* unterschiedlich ist das da nicht. In Python ist es sogar etwas einfacher weil die Ein- und Ausgabe etwas weniger Boilerplate-Code benötigt, und weil man weniger Schleifen braucht weil man Zeichenketten mit ganzen Zahlen multiplizieren kann.
Vanii
User
Beiträge: 9
Registriert: Sonntag 11. Januar 2015, 14:41

@/me Vielen Dank für die Hilfe :) , aber deine Funktion ist ja dann eine ganz anderen und das erfüllt dann nicht die Aufgabe

@ Hyperion, Blackjack Danke schon mal vielmals für die Hinweise! :)
Ich habe mir das jetzt auch auf ein kariertes Blatt aufgezeichnet, habe das jetzt mit der Sternchenausgabe verstanden. Nur immer noch nicht warum das "r" halt diese "c-2" zugeordnet hat :? . Und das scheint ja wichtig zu sein, da das r auch in der Schleife vorkommt und mit dem Leerzeichen (' ') multipliziert wird.
Mir macht einfach ausgedrückt halt vor allem Probleme die Schräge Sternchenlinie zu zeichnen. Also dann wahrschienlich die richtige Platzierung der Leerzeichen und damit auch die Aufstellung der for-Schleife :( .

So habe jetzt aber ganz rudimentär ein Programm geschrieben zu meiner Zeichnung vom karierten Blatt, da kommt auch einigermaßen ein gleichschenkliges Dreieck bei heraus:
def versuch ():
print (' '*4 + '*')
print (' '*3 + '*' + ' ' + '*')
print (' '*2 + '*' + ' '*3 + '*')
print (' ' + '*' + ' '*5 + '*')
print (' ' + '*'*6)

Habe dabei erstmal die Variablen rausgelassen bzw. eigentlich gar nicht die Funktion berücksichtigt... Nun muss ich das aber schaffen unterzubringen in die Funktion ( siehe oben am Anfang des Threads)
Werde das jetzt mal versuchen, aber über jede Hilfe freue ich mich trotzdem.
BlackJack

@Vanii: Überleg doch mal wieviele Zeichen breit die Ausgabe ist wenn man zum Beispiel 5 eingibt und wie breit wenn man nicht 2 von der Eingabe abziehen würde.

Und bezüglich der schrägen Linie: Wie viele Leerzeichen brauchst Du in jeder Zeile vor dem Sternchen für die schräge Linie? Mal Dir so ein Dreieck mal auf Kästchenpapier auf und schreib in jeder Zeile die Anzahl der Leerzeichen hin. Da sollte Dir etwas auffallen.
Vanii
User
Beiträge: 9
Registriert: Sonntag 11. Januar 2015, 14:41

@Blackjack Also mir ist schon klar das bei dem r von dem Wert dann 2 abgezogen werden, doch ich bekomm das einfach nicht in den Kopf warum da was abgezogen wird und was das letztendlich für Auswirkungen hat :( .

Bei dem Dreieck auf dem Papier ist mir ja schon aufgefallen, dass immer mehr Leerzeichen hinzukommen... Doch ich habe schon probiert z.B.: ' ' + 1 oder so zu schreiben, da man das ja für eine Schleife verallgemeinern muss. Hat aber natürlich nicht geklappt und jetzt weiß ich nicht mehr weiter. :?
BlackJack

@Vanii: Wie gesagt: Zähl die Zeichen. Wie viele Zeichen breit ist das Rechteck wenn man 5 eingibt. Mit ohne ohne die -2.

Zum Dreieck: Schau Dir ``for``-Schleifen noch mal genau an. Worüber schreibst Du den so eine Schleife‽ Was passiert in/vor jedem Schleifendurchlauf.
Vanii
User
Beiträge: 9
Registriert: Sonntag 11. Januar 2015, 14:41

@Blackjack Also habe jetzt nochmal das ursprüngliche Rechteckprogram eingeben und habe da beim ersten mal das -2 weggelassen und beim zweiten wieder mit dazu genommen und nun gesehen wofür das r steht :) ... So einfach kann das manchmal sein :roll:

Aber wie gesagt das sagt ja bei dem Rechteck aus, das immer in jeder Zeile -2 abgezogen werden muss, aber bei einem Dreieck ist das ja in jeder Zeile unterschiedlich.
Also ich habe mich vorhin schon in die for-Schleifen einglesen und da wird halt die Schleife solange abgefragt bis der Wert in der Klammer erreicht ist. Das wäre ja dann ja auch die Höhe meines Dreieckes. So und das ist nun mein Problem, die Aufstellung der Schleife, weil jede Zeile mehr oder weniger Leerzeichen braucht und ich nicht einfach +1 oder ähnliches schreiben kann :?
BlackJack

@Vanii: Schau Dir ``for``-Schleifen noch mal genauer an. Ich weiss nicht wie ich das jetzt noch deutlicher sagen soll ohne die Lösung zu verraten. Wie würdest Du denn die Zahlen 0 bis 9 in einer Schleife ausgeben?
Vanii
User
Beiträge: 9
Registriert: Sonntag 11. Januar 2015, 14:41

@Blackjack Ich weiß ehrlich gesagt nicht was ich mir noch alles anschauen soll :( . Habe mich schon Wochenende über die for-Schleifen informiert.
Die Zahlen von 0 bis 9 würde ich so ausgeben (i jetzt mal als Beispielsvariable): for i in range (10):
Ich weiß, dass in der Klammer bei der for-Schleife die Höhe des Dreieckes muss bzw. die Variable (z.B. h) dafür.
Nur bringt mich das kaum weiter :K
Denn egal was ich versuche ich bekomme halt diese Dreiecksform nicht hin... habe zwar die Spitze aber dann nur gerade Linien runter :?.
BlackJack

@Vanii: Also Du weisst wie man eine bestimmte Anzahl von Leerzeichen erzeugt und Du weisst wie man in einer Schleife bei jedem Durchlauf eine um 1 grössere Zahl ausgibt, aber Du bekommst es nicht hin in jedem Schleifendurchlauf ein Leerzeichen mehr als im vorhergehenden Durchlauf zu erzeugen‽ Das kann ich jetzt nicht glauben.
Vanii
User
Beiträge: 9
Registriert: Sonntag 11. Januar 2015, 14:41

@Blackjack wie man eine bestimme Anzahl Leerzeichen erzeugt weiß ich schon, da stimm ich dir zu. Aber ich sag ja, dass ich nicht weiß wie man bei einer Schleife bei jedem Durchlauf eine Zahl größer ausgibt :K ... Weil ich kann ja nicht einfach +1 oder so hinschreiben, das hat er dann halt nicht genommen bzw funktionerte nicht.
BlackJack

@Vanii: Aber Du weisst doch wie man die Zahlen 0 bis 9 in einer Schleife ausgibt, also 1, und dann 2, und dann 3, …. Das ist doch genau eins mehr als im vorhergehenden Durchlauf.
Vanii
User
Beiträge: 9
Registriert: Sonntag 11. Januar 2015, 14:41

@Blackjack Na aber er geht doch immer eins Runter und das sind ja dann Zahlen... :? Verstehe echt gerade nicht wie ich das auf mein Problem beziehen soll. :K
Tut mir ja leid, dass ich gerade (eigentlich die ganze Zeit) so schwer von Begriff bin, aber ich hab echt keine Ahnung wie er in jedem Durchlauf ein Leerzeichen hinzufügt.
BlackJack

@Vanii: Statt die Zahl selbst auszugeben musst Du sie halt dazu verwenden um eine Zeile mit Sternchen und Leerzeichen auszugeben so das am Ende ein Dreieck ensteht. Ich weiss nicht wie man da noch mehr helfen soll ohne tatsächlich das offensichtliche als Komplettlösung hinzuschreiben.
Antworten