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 user profile iconNarses: 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:)


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

//suche dir fak1 und fak2 so aus, dass es schön aussieht
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 user profile iconNarses: 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 user profile iconNarses: 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);

//suche dir fak1 und fak2 so aus, dass es schön aussieht
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