Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Sanduhr aus sternen
Flepe - So 20.12.09 23:41
Titel: Sanduhr aus sternen
hi ich bins noch mal dies mal muss ich eine sanduhr aus sternen machen(jenachdem welche zahl man eintippt im beispiel ist es 5) diese sollte dann so aussehen
Quelltext
1: 2: 3: 4: 5: 6:
| * * * * * * * * * * * * * * * * * * |
diese Sanduhr sollte dann nicht aus 4 dreiecken sondern nur aus zweien zusammengesetzt sein also au den beiden folgenden
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| * * * * * * * * *
UND AUS DEM * * * * * * * * * |
das ganze solte mit schleifen gelöst sein
wenn ihr hier dann einen code zur lösung postet bitte kommentiert es denn ich muss es schon verstehn weil sonst bringt es mir nichts.
Moderiert von
Narses: Topic aus VCL (Visual Component Library) verschoben am So 20.12.2009 um 23:34
jaenicke - So 20.12.09 23:57
Was hast du dir denn schon für Gedanken dazu gemacht? Wo haperts denn? :nixweiss:
Flepe - Mo 21.12.09 00:16
es habert daran das ich diese dreiecke nicht hinbekomme diese vier heir hab ich schon
Quelltext
1: 2: 3: 4: 5:
| * * * * * UND * * * * *UND * UND * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
die funktionieren so
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| for x := 1 to Menge do begin for y:=1 to Menge do begin canvas.textout((groesse*2*count)+x*groesse,(groesse*2*count)+y*groesse,'*'); canvas.Font.Color:=Farbe[random(fmax)]; end; menge:=menge-1; end; |
und
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| for x := Menge downto 1 do begin for y:=1 to Menge do begin canvas.textout(x*groesse,(groesse*2*count)+y*groesse,'*'); canvas.Font.Color:=Farbe[random(fmax)]; end; menge:=menge-1; end; |
und
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| for y:= Menge downto 1 do begin for x:= 1 to Menge do begin
canvas.textout((groesse*count*2)+x*groesse,y*groesse,'*'); canvas.Font.Color:=Farbe[random(fmax)]; end; menge:=menge-1 end; |
und
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| for y := 1 to menge do begin for x := count to menge do begin Canvas.TextOut(x*groesse,y*groesse,'*'); canvas.Font.Color:=Farbe[random(fmax)]; end; count := count -1; end; |
mir fehlen halt jetzt noch die im ersten beitrag gezeichneten und aus diesen vier zusammensetzen dürfen wir nicht
Flepe - Mo 21.12.09 16:38
weis das wirklich keiner ich müsste es bis morgen wissen
Jann1k - Mo 21.12.09 17:41
Du hast doch den Quelltext zu den anderen Dreiecken, wenn du den verstehst solltest du die Sanduhr doch auch hinkriegen. Du musst doch für die erste Hälfte nur in jeder Zeile jeweils 2 Sterne weniger zeichnen als in der davor, bis du nur noch einen Stern zeichnest, dann immer 2 mehr bis du bei deiner Ausgangsgröße bist.
der organist - Mo 21.12.09 19:35
schreib dir doch mal nen Pseudocode, damit lässt sich einfacher überlegen....
Flepe - Mo 21.12.09 22:13
wenn ich ja wüsste wie es geht würd ich nicht fragen hab da nämlich schon bestimmt 3-4 tage dran rumüberlegt
Hidden - Mo 21.12.09 22:23
hi :)
Vielleicht hilft dir der Gedanke, mal die verschiebenden Leerzeichen rauszulassen und nur die Anzahl der Sterne in jeder Zeile zu betrachten ;)
mfG,
Flepe - Di 22.12.09 00:41
ja schon klar das ich da nicht mit leerzeichen arbeite das ist da oben nur um zu zeigen wie das aussehen soll
FinnO - Di 22.12.09 01:09
mach doch ne Kombi aus Dreieck 3 und 4 *scratch* etwas unsauber zwar, aber man kann ja erst das eine Dreick zeichnen und dann das andere daneben. Zum beispiel, wohlgemerkt.
Flepe - Di 22.12.09 01:59
ja klar aber das dürfen wir nicht wie ich in meinem zweiten beitragbereids erwähnt hatte
Hidden - Di 22.12.09 03:52
Hi :)
Wie wäre es denn, mit beträgen zu arbeiten? Dann ginge die Schleife von -5 bis 5 in Zweierschritten und es sind jeweils Abs(i) Sterne in jeder Reihe. Für Zweierschritte brauchst du entweder eine While-Scheife, oder du nimmst for und schreibst überall wo du i hast stattdessen Abs(2*i)
mfG,
Flepe - Di 22.12.09 13:49
hi hidden kannst du mir das mal als kommentierten code geben verstehe noch nicht wie du das meinst
Hidden - Di 22.12.09 18:32
Hi ;)
Wo ich deinen Quelltext sehe: Du veränderst ja die Zielschranke der for-Schleife, so etwas versuche ich immer tunlichst zu vermeiden.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| for x := 1 to Menge do begin for y:=1 to Menge do begin canvas.textout((groesse*2*count)+x*groesse,(groesse*2*count)+y*groesse,'*'); canvas.Font.Color:=Farbe[random(fmax)]; end; menge:=menge-1; end; |
In Pseudocode sähe mein Ansatz so aus(das hättest du sicher auch gekonnt :roll:)
- Für i von minus fünf bis fünf tue:
- Mache Abs(i) Sterne in die Zeile(aufs mittige Einrücken achten).
- Nächste Zeile.
Flepe - Di 22.12.09 19:16
sorry aber das ist halt so unere aufgabe auf die art die formen zu zeichnen deshalb hab ich ja nach deinem code gefragt weil ich nicht genau verstehe was du mit i meinst von eingabe-2*eingabe to eingabe (-5 to 5) habe ich verstanden). und es muss in der aufgabe auch keine for schleife sein es kann auch jede andere der 3 schleifen sein
Flepe - Mi 23.12.09 22:39
keiner ne idee ich muss das heute bis 23:59 abgeschickt haben
Sylvus - Mi 23.12.09 23:33
die idee steht da :)
Du musst sie nur umsetzten:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| ...
for I:=0-max to max do zeichneBaelle(abs(I)); ...
procedure zeichneBaelle(anz:integer); begin
position:=(max DIV anz)*fak1;
for I:=1 to anz do begin Canvas.textout(position,'*'); Inc(position,fak2);
end; |
Wenn du es hiermit nicht schaffst, solltest du dir mal die Grundlagen anschauen, gibt viele Tutorials :)
Flepe - Do 24.12.09 00:42
Moderiert von
Narses: Komplett-Zitat des letzten Beitrags entfernt.
prinzipiele(oder wie man das schreibt) verstehe ich es nur was sin die variablen max, zeichneBealle(absI) und was ist fak1 und fak2
und in welcher prozedur steht die erste for schleife?
---
Moderiert von
Narses: Beiträge zusammengefasst---
ist zwar net gelöst aber meine zeit ist abgelaufen trotzdem danke für die lösungsvorschläge.
Sylvus - Do 24.12.09 02:44
naja max ist deine reihe, also z.B. 5 - dachte das wäre klar
zeichneBealle ist keine Variable, sondern eine Prozedur
absI - da steht abs(I) - das ist der absolut Betrag von I, also wenn I=-3 dann ist abs(I)=3
fak1 und fak2 sind einfach zwei Faktoren, die du dir so aussuchen solltest, dass es schön aussieht, hab ich aber auch hingeschrieben. Werte wären zum Beispiel: fak1=2 und fak2=1.5
Die Prozedur kannst du dir selbst ausdenken, mache einen Button, oder im OnCreate Ereignis der Form.
Das ganze war ein PseudoCode, da du dich leider noch nicht so auskennst, dass du das alles nachvollzeihen kannst (nicht böse gemeint, jeder fängt man an) empfehle ich dir, wie auch schon vorhin, ein Tutorial zu Delphi!
Damit kommst du viel weiter, dann schaffst du das nächste Mal die Aufgaben auch selbst!
Viele Grüße
Sylvus
Flepe - Do 24.12.09 03:00
wir haben das als aufgabe für die schule gemacht und haben halt erst dieses schuljahr angefangen . ist ja egal jezt ist zu spät aber dadurch verschlechtert sich meine note nicht . trotzdem verstehe ich nicht wie der absolute betrag zustande kommt und wie ich fak1 und fak2 beide frei bestimmen kann
Hidden - Do 24.12.09 03:26
Hi :)
Das will sich mir auch gerade nicht bis ins letzte Dateil erschließen :gruebel: die Position ist eindimensional angegeben, das heißt man erreicht so wohl kaum eine Ausgabe über mehrere Zeilen, oder? =)
Was fak1 und fak2 anbelangt, so sind es beides Variablen, die die Position festlegen. Sie sind damit doch von einander abhängig und können nicht beide frei gewählt werden.
Meine Deutung: fak1 sollte sich auf die x-Koordinate beziehen, fak2 auf die y-Koordinate. Tut es aber nach dem Quelltext so nicht.
mfG,
PS: Wir können dir ja nicht einfach den Quelltext geben, deshalb ist Pseudocode hier wahrscheinlich das meißte, was du bekommst. Das mag etwas schwer erscheinen wenn du das Arbeiten mit Schleifen, etc., nicht gewohnt bist. Dann musst du leider manchmal ein wenig knobeln ;)
Sylvus - Do 24.12.09 14:48
der quellcode funktioniert so nicht, kann ja mal eben einen richtigen schreiben.
Ich hab mich nur um die X-Verschiebung gemacht, Y-Richtung hab ich mal vorrausgesetzt. Es war ja ein PseudoCode!
Außerdem ist deine Einstellung falsch, nur weil deine Zeit abgelaufen ist, kann man es trotzdem noch fertig machen, oder????
Grüße
Sylvus
P.S. ich schreib gleich mal den ganzen Code
So Leute, nur für euch der komplette Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| var Form1: TForm1; max,Y:integer;
implementation
{$R *.dfm}
procedure zeichneBaelle(anz:integer); var position,I,fak1,fak2:integer;
begin if anz<>0 then begin
fak1:=strtoint(form1.Edit1.Text); fak2:=strtoint(form1.Edit2.Text);
position:=(max - anz)*fak1;
for I:=1 to anz do begin Form1.Image1.Canvas.TextOut(position+10,Y,'*'); position:=position+fak2; end; end; end;
procedure TForm1.Button1Click(Sender: TObject); var I:integer; begin Image1.Canvas.Rectangle(0,0,Image1.Width,Image1.Height); max:=strtoint(Edit3.Text); Y:=10; for I:=0-max to max do begin zeichneBaelle(abs(I)); Inc(Y,10); end; end; |
Und das ganze sieht dann mit verschiedenen fak1 und fak2 so aus, wie im Anhang :)
Wenn du die gerade haben möchtest, empfehle ich dir die Werte 5 und 10!
Bis dann
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!