Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pyramide zeichnen (https://www.delphipraxis.net/88466-pyramide-zeichnen.html)

me2u 15. Mär 2007 19:22


Pyramide zeichnen
 
Hi,

ich soll in Informatik eine (möglichst große) Pyramide in Delphi zeichnen.

Ich hab das jetzt auch soweit, dass pro Zeile immer mehr Sternchen (meine Pyramidenbauteile :D) dazukommen, jedoch geht das nur in eine Richtung und man müsste eben noch Leerzeichen einfügen, dass der oberste Punkt der Pyramide genau in der Mitte ist.

http://www.directupload.net/images/070315/Gg2uDMTn.jpg

Das ist mein Problem, denn ich weiß absolout nicht wie es geht. Ich habe zwar schon mit einer zweiten FOR Schleife expeimentiert, aber dann hatte ich es genau andersrum, also dass die Pyramide pro Zeile am Anfang immer mehr Leerzeichen bekommt.

Hier mal mein Code, soweit ich ihn für durchschaubar halte ^^

Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    pnlTitel: TPanel;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var y : integer;
    i : integer;
    zeile : string;

begin
  y := 0;
  Memo1.Lines.Clear;
  while y < Memo1.Height do
    begin
      zeile := '';
      for i := 0 to (y div 15) do
        begin
          zeile := zeile + '*'
        end;

      Memo1.Lines.Add (zeile);
      y := y + 15;
    end;
end;

end.
Wenn ihr wollt, könnt ihr euch alle Delphi Dateien auch vom Webspace von mir ziehen: http://ironthunder.ir.funpic.de/Pyramide.rar

Hoffe, ihr könnt mir helfen.

Mit freundlichen Grüßen
me2u

fLaSh11 15. Mär 2007 19:26

Re: Pyramide zeichnen
 
Ändere einfach die Property "Aligment" auf Center, dann sind deine Sternchen in der Mitte... (und bilden auch eine Dreieck)

3_of_8 15. Mär 2007 19:31

Re: Pyramide zeichnen
 
Wenn du eine Pyramide zeichen willst, nimm dafür lieber ein TImage.

me2u 15. Mär 2007 19:34

Re: Pyramide zeichnen
 
Zitat:

Zitat von fLaSh11
Ändere einfach die Property "Aligment" auf Center, dann sind deine Sternchen in der Mitte... (und bilden auch eine Dreieck)

hmm jo, stimmt eigentlich :D

Sieht jetzt so aus:

http://www.directupload.net/images/070315/5ko8uBZo.jpg

Das Problem ist nur, dass wir das ganze mit Schleifen lösen sollen. Das ist der Sinn der Übung. Wäre das privat und nur für mich, würde mir das ausreichen, da ich ja nur das Dreieck haben will. Aber mein Lehrer will wahrscheinlich eher die Schleife sehen.

Naja, hat noch jemand einen Vorschlag ? Wäre sehr nett !



Zitat:

Zitat von 3_of_8
Wenn du eine Pyramide zeichen willst, nimm dafür lieber ein TImage.

Da kann man aber nicht die Zeilen einzeln ansteuern oder ? Also das man ein Sternchen mehr macht oder sowas. Liege ich da richtig ?

3_of_8 15. Mär 2007 19:48

Re: Pyramide zeichnen
 
Was meinst du mit "einzelnen Zeilen"? Du kannst die Höhe und Breite in Pixeln bestimmen und wenns dir Spaß macht kannst du die Pyramide auch aus einzelnen Quadraten aufbauen, wodurch du wieder einzelne "Zeilen" hast. Auf jeden Fall sieht das sehr viel schöner aus.

me2u 15. Mär 2007 19:49

Re: Pyramide zeichnen
 
Könntest du das mal bitte etwas konkreter auf mein Beispiel anwenden ?

also kann man da dann machen, dass ein Quadrat gezeichnet wird, dann eine Zeile weiter 2 Quadrate usw.

fLaSh11 15. Mär 2007 19:52

Re: Pyramide zeichnen
 
Zitat:

Zitat von me2u
Aber mein Lehrer will wahrscheinlich eher die Schleife sehen.

Du hast in deinem Code doch eine While- und eine For-Schleife drin...?!

//Edit: Quote-Tag

Neutral General 15. Mär 2007 19:56

Re: Pyramide zeichnen
 
Hi,

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i,x,y: Integer;
begin
  for i:= 0 to 200 do
  begin
    x:= 300 - i; // 300 ist die X Position der Spitze
    y:= 10 + i; // 10 ist die Y Position der Spitze
    Canvas.Pen.Color := RGB(random(256),random(256),random(256)); // wenn mans bunt haben will :P (randomize ins FormCreate!
    Canvas.MoveTo(x,y);
    Canvas.LineTo(x+i*2,y);
  end;
end;
vielleicht so ? ;)

Ergänzung:

Und als komfortable Procedure:

Delphi-Quellcode:
procedure DrawPyramide(Canvas: TCanvas;const x,y,Height: Integer; Coloured: Boolean);
var i: Integer;
    fx,fy: Integer;
begin
  for i:= 0 to Height do
  begin
    fx:= x - i;
    fy:= y + i;

    if Coloured then
      Canvas.Pen.Color := RGB(random(256),random(256),random(256));

    Canvas.MoveTo(fx,fy);
    Canvas.LineTo(fx+i*2,fy);
  end;
end;

// Aufruf
DrawPyramide(Canvas,200,30,400,true);
Gruß
Neutral General

himitsu 15. Mär 2007 20:02

Re: Pyramide zeichnen
 
StringOfChar?

i = 1 to zeilen

i-mal für die Sterne
und (zeilen - i)-mal für die Leerzeichen davor

Delphi-Quellcode:
for i := 1 to 30 do
  Memo1.Lines.Add(StringOfChar(' ', 30 - i) + StringOfChar('*', i));

alternativ deines mit den Strings
Delphi-Quellcode:
L := '                      ';
S := '*';
Repeat
  Memo1.Lines.Add(L + S);
  S := S + '*';
  Delete(L, 1, 1);
Until L = '';

me2u 15. Mär 2007 20:28

Re: Pyramide zeichnen
 
Hab nochmal geguckt in der Aufgabenstellung. Also wir sollen das schon mit den Sternchen da machen.

Danke himitsu ! Habs jetzt zum Laufen bekommen. Es ist zwar nicht ganz gerade, aber ich denke das liegt an Delphi und nicht am Code.

Bei deiner zweiten Möglichkeit ist es etwas ungüngstig, dass die Größe von den Leerzeichen abhängt. Also wird nicht unbedingt das größtmögliche Dreieck "konstruiert". Man müsste irgendwie (y DIV 15) * ' ' rechnen können, aber das geht ja nicht oder ?

3_of_8 15. Mär 2007 20:31

Re: Pyramide zeichnen
 
Wenn schon, dann liegt es an Windows bzw. der eingestellten Schriftart. Aber was meinst du überhaupt mit "nicht ganz gerade"? Etwa dass ein Leerzeichen nicht so breit ist wie ein * oder umgekehrt? Dann stell die Schrift auf Courier New.

Kedariodakon 15. Mär 2007 20:35

Re: Pyramide zeichnen
 
Das liegt nicht am Code, das liegt am proportionalen Zeichensatz in deinem Memo, stell zum Beispiel mal auf "Courier New" (ist ein nichtportionaler = alle Zeichen sind gleich breit) um, dann sollte das grade sein.

Seh schon Rot...

Bye Christian

me2u 15. Mär 2007 20:36

Re: Pyramide zeichnen
 
Zitat:

Zitat von 3_of_8
Wenn schon, dann liegt es an Windows bzw. der eingestellten Schriftart. Aber was meinst du überhaupt mit "nicht ganz gerade"? Etwa dass ein Leerzeichen nicht so breit ist wie ein * oder umgekehrt? Dann stell die Schrift auf Courier New.

Mit nicht ganz gerade meine ich das hier:

http://www.directupload.net/images/070315/r58RKrrK.jpg


Courier New ? Irgenwie keine so gute Idee :D :

http://www.directupload.net/images/070315/wNfddF2K.jpg

Keine Ahnung wieso das jetzt so ist !?


[edit]
AAAAH, es liegt am Code:

Wenn ich
Code:
y := Memo1.Height;
Memo1.Lines.Clear;
for i := 1 to (y div 15) do
  Memo1.Lines.Add(StringOfChar(' ', (y div 15) - i) + StringOfChar('*', i));
benutze, dann sieht es so rechtsbündig aus.

Benutze ich einen anderen Code, dann stimmts.

himitsu 15. Mär 2007 20:38

Re: Pyramide zeichnen
 
damit es gleichmäßig wird, solltest du eher in ganzen Zeichen rechnen.

du kannst ja mit schrittgröße und Schriftart experimentieren.

z.B. Courier und
Delphi-Quellcode:
for i := 0 to 30 do
  Memo1.Lines.Add(StringOfChar(' ', 30 - i) + StringOfChar('*', 1 + i * 2));

[add]
keine ahnung?
is doch offensichtlich :shock:


bei dem obrigem Code muß das Leerzeichen halb so breit wie der stern sein
und hier sollte beides gleich breit sein ;)

http://www.delphipraxis.net/internal...ghlight=h%F6he

Kedariodakon 15. Mär 2007 20:56

Re: Pyramide zeichnen
 
da wird in jeder Zeile jeweils dann ein Sternchen zu wenig gesetzt...
Es kommen immer 2 dazu nicht nur eins...
Code:
1 Sternchen...
1      *
1+1   **
2+1  ***
3+1 ****

2 Sternchen...
1      *
1+2   ***
3+2  *****
5+2 *******
Bye Christian

me2u 15. Mär 2007 21:05

Re: Pyramide zeichnen
 
Aaaah, jetzt hab ichs geschnallt :D Danke !

Nur das Doofe daran ist jetzt, dass in der ersten Zeile 3 Sterne stehen.
Delphi-Quellcode:
for i := 0 to 30 do
  Memo1.Lines.Add(StringOfChar(' ', 30 - i) + StringOfChar('*', 1 + i * 2));
Habe es jetzt so gelöst:
Delphi-Quellcode:
for i := 0 to 30 do
  Memo1.Lines.Add(StringOfChar(' ', 30 - i) + StringOfChar('*', -1 + i * 2));
Ich weiß ehrlich gesagt nicht genau WIESO das jetzt so funktioniert, aber es sieht gut aus :)

http://www.directupload.net/images/070315/QK9tjzRp.jpg

Danke, ihr seid die Geilsten ! :D


[edit] Vergesst es :D Hab i falsch gehabt, fing an mit for i := 1 und nicht 0. Deshalb war die Rechnung falsch. Stimmt also alles, DANKE [/edit]

Kedariodakon 15. Mär 2007 21:18

Re: Pyramide zeichnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Da hatte ich doch grad selber schnell was zusammengebaut und du hasts selber... ;)

Delphi-Quellcode:
Procedure TForm1.cmdGoClick(Sender: TObject);
Var i: Integer;
    Sl: TStringList;
Begin
  Sl := TStringList.Create;
  For i := 0 To seLines.Value - 1 Do Begin //  seLines.Value = Anzahl der Zeilen
    Sl.Append( StringOfChar( #32, ( seLines.Value - 1 ) - i ) + StringOfChar( #42, i*2 + 1 ) );
  End;
  txtOut.Text := Sl.Text;
End;
Ich würd an deiner Stelle das so machen wich ich das gemacht habe (Mit hilfe einer StringListe) kannst ja mal eine 1000 Zeilen Pyramide erstellen, dann weist warum.

Zitat:

Zitat von me2u
Ich weiß ehrlich gesagt nicht genau WIESO das jetzt so funktioniert, aber es sieht gut aus :)

Warum ist ja einfach zu sagen...

Du brauchst in der ersten zeile einen Stern in jeder weiteren 2 Sterne mehr...
Also ist die Rechnung recht simpel: (Zeilennummer - 1) * 2 + 1 da bei dir (wie auch bei mir) Zeile 1 eigendlich 0 ist wird ganz simpel daraus: Zeilennummer * 2 + 1
So damit hätten wir die Sternchen...

Kommen wir zu den Leerzeichen...
die Letzte Zeile benötigt also keins und jede Zeile zuvor jeweils eins mehr...
Daraus folgt, dass wir die Anzahl der Zeilen kennen müssen!
Also ist die Anzahl an Leerzeichen einer Zeile Zeilenanzahl - Zeilennummer da wir beide aber wieder bei 0 statt bei eins anfangen müssen wir noch eins abziehn: Zeilenanzahl - Zeilennummer - 1


Bye Christian

me2u 7. Apr 2007 12:47

Re: Pyramide zeichnen
 
Ok danke an Alle !

Ich habe das meinem Lehrer präsentiert und er hat mir auch die volle Punktzahl, die es bei dieser Aufgabe zu erreichen gab, gegeben. Ihr seid die besten :) :) :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz