Autor Beitrag
DelphX
Hält's aus hier
Beiträge: 5



BeitragVerfasst: So 25.10.09 15:19 
Hi,
Ich bin neu hier und interessiere mich fürs Programmieren zudem hab ich das auch in der Schule (Ich nutze Zuhause Delphi7 aber in der Schule haben wir Delphi6. Ich habe im vorfeld angefangen mir Wissen anzueignen und bin jezt auf dieses schöne Forum hier gestoßen. Ich hoffe ich kann hier so einiges Lernen und später wenn ich genug weiss das erlernte auch Vermitteln.
Ich bin grade dabei einen Taschenrechner zu Programmieren (Wie der Windows Rechner)
mit *, /, +, -
Er soll auch Kommazahlen errechnen.
Das Problem ist ich komm gar nicht weiter.
Zum Beispiel hat mir mein Lehrer irgendwas von einem Zeichenkettenanfangsmelder erzählt und die erstellung von Struktogrammen und damit komm ich gar nicht klar.
Mich würde es sehr freuen wenn ich hilfe finden könnte so das wir schritt für schritt gemeinsam alles durchgehen können und vorallem das verständnis kommt.

Also ich erstelle die Ereignisse für die Ziffern z.B "Ziffernklickereignis" & "ButtonClickEreignis"
Dann die Befehle dort hin wie z.B "If sender Btn1 = xxx then ....."
Es ist nicht so das ich keine ahnung habe nur komme ich irgendwie nicht klar. Einige dinge versteh ich auch nicht wie z.B beim Geteilt da muss man irgendwie noch etwas spezielles machen wegen "0" Teilung. Und dann hat der Lehrer noch irgendwas vom Zeichenkettenanfangsmelder geredet. Ich weiss das er Zeichenkette true oder false sezt ist ein Boolean Typ.
Aber ich komm immer so durcheinander ich würd gern mal etwas struktur im Kopf haben und struktugramme selbst gut erstellen können.
Aso ich bin da echt am Verzweifeln.

Moderiert von user profile iconNarses: Titel geändert, war: "Brauche Dringend Hilfe Taschenrechner".
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: So 25.10.09 16:05 
Hi, und :welcome:

Viele, viele Fragen auf einmal!
user profile iconDelphX
Zitat:

Aber ich komm immer so durcheinander ich würd gern mal etwas struktur .....

Sieht glaube so aus, als willst du alles auf einmal machen und verlierst damit den Überblick!
Hilfe bekommst Du in diesem Forum sicher.
Aber:
user profile iconDelphX
Zitat:

Mich würde es sehr freuen wenn ich hilfe finden könnte so das wir schritt für schritt gemeinsam alles durchgehen können und vorallem das verständnis komm

ist das nicht ein wenig viel Hilfe :?:
Ich glaube das würde diese Forum sprengen. :wink:

Helfen können wir Dir, bei einer Frage zu einem Problem, nicht bei Deinem ganzen Problem :wink:
und
user profile iconDelphX
Zitat:
z.B beim Geteilt da muss man irgendwie noch etwas spezielles machen wegen "0" Teilung

Wenn ich mich so richtig erinnere, gibt es auch noch DelphiHilfe, da steht so was drin. :wink:
Stell also eine konkrete Frage und schon geht es los :D
gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!


Zuletzt bearbeitet von ALF am So 25.10.09 18:43, insgesamt 1-mal bearbeitet
DelphX Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: So 25.10.09 16:32 
Ohh vielen dank Ihr seid hier wirklich nett.
Also ich werd heute abend zu einem Freund gehen der mir versucht die Lage zu erklähren.
Ich werd das mal mit Ihm durchgehen dann werde ich sicher immer noch einige Fragen haben weil jezt bevor ich dahingehe währe es denke ich mal vlt zuviel fürs Forum ich möchte keinem zur Last fallen oder so. Das iss auch das beste denke ich dann stelle ich keine Fragen die später eh geklährt werden. Dannbleibt eig. nur noch das übrig was wirklich unverständlich für mich ist. Ich danke euch wirklich für eure hilfe :)
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: So 25.10.09 19:09 
Hallo und :welcome: in der Entwickler-Ecke,

also, dein Versuch uns zur Last zu fallen ist schlecht ausgefallen :). Wir freuen uns immer, wenn jemand Interesse am Programmieren findet. Für den Anfang kann ich dir auf jeden Fall raten: Geb nicht zu schnell auf. Programmieren besteht nun mal aus Frustmomenten und Fehlersuche. Auf jeden Fall empfehle ich dir, niemals die reine Copy+Paste-Methode zu benutzen, sondern immer zu versuchen, den Programmcode haarklein zu verstehen.

Der Taschenrechner ist mit Sicherheit ein beliebtes Übungsprogramm, dass die wichtigsten Programmierelement beinhaltet. Außerdem ist es beliebig erweiterbar, ein Taschenrechner ist im Grunde genommen ein Endlosprojekt mit schnellen Erfolgen, also optimal für einen Einsteiger.

Viel Spaß beim Programmieren
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: So 25.10.09 19:48 
Also einwas schonmal:

ausblenden Delphi-Quelltext
1:
if sender Btn1 = xxx then					


Keine Ahnung was du damit bezwecken willst. Für mich sieht es so aus, als ob du alle Rechenoperationen in einer Methode unterbringen willst? Das ist zwar möglich, aber um es zu verstehen, solltest du vorher wenigstens entfernt was von OOP gehört haben. Für den Anfang schlage ich also vor, lieber jedem Button genau eine Rechenoperation mit einem eigenen Ereignis zu spendieren.

Vielleicht solltest du dir mal das hier ansehen:
[url]crashkurs.christian-stelzmann.de[/url] - Delphi Crashkurs von user profile iconChristian S.
[url]de.wikibooks.org/wiki/Delphi[/url] - Wikibooks zum Thema Delphi
Delphi für Kids (Buch) von Hans-Georg Schumann (nicht unbedingt nötig, wenn du die beiden Referenzen zuvor verstanden hast. Aber auf jeden Fall ein sehr leichter Einstieg)

- "Zeichenkettenanfangsmelder" hab ich noch nie gehört
- Division durch Null: Warum fragst du nicht einfach ab, ob Divisor = 0? Ansonsten kannst du das auch mit try ... except lösen, was jedoch IMHO leicht unsauber wäre.
DelphX Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: So 25.10.09 23:18 
Okay aso ich war beim Kollegen und hab das meiste verstanden.
Aso ich poste hier mal den Quelltext rein und den Teil den ich nicht kapiere der ist markiert & in Violett sind (Moderiert von user profile iconNarses: waren) Kommentare und genauere Erläuterungen...aso ab da versteh ich eig kaum noch was. Den rest könnte ich eig. Problemlos Programmieren. Ist nur dazu da falls Ihr euch das mal im Gesamtzusammenhang ansehen wollt.
Wenn Ihr wollt kann ich euch nochmal das Struktogramm geben das währe kein Problem:

ausblenden volle Höhe 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:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
  Edt1: TEdit;
  Btn0: TButton;
  Btn1: TButton;
  Btn2: TButton;
  Btn3: TButton;
  Btn4: TButton;
  Btn5: TButton;
  Btn6: TButton;
  Btn7: TButton;
  Btn8: TButton;
  Btn9: TButton;
  BtnPlus: TButton;
  BtnMinus: TButton;
  BtnMal: TButton;
  BtnGeteilt: TButton;
  BtnClear: TButton;
  BtnGleich: TButton;
  procedure BtnClick(Sender: TObject);
  procedure FormCreate(Sender: TObject);
  procedure BtnOpClick(Sender: TObject);
  private
  { Private-Deklarationen }
  public
  { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  zahl, erg: double;
  ZkAm : boolean;
  zeichen, op, opspeicher : char;
  zeichenkette : ansistring;


implementation

{$R *.dfm}

procedure TForm1.BtnClick(Sender: TObject);
begin
 if Sender = Btn0 then zeichen := '0';
 if Sender = Btn1 then zeichen := '1';
 if Sender = Btn2 then zeichen := '2';
 if Sender = Btn3 then zeichen := '3';
 if Sender = Btn4 then zeichen := '4';
 if Sender = Btn5 then zeichen := '5';
 if Sender = Btn6 then zeichen := '6';
 if Sender = Btn7 then zeichen := '7';
 if Sender = Btn8 then zeichen := '8';
 if Sender = Btn9 then zeichen := '9';

if ZkAm = true
then
 begin
  ZkAm:= false;
  zeichenkette := zeichen;
 end
else zeichenkette := zeichenkette + zeichen;
 Edt1.Text := zeichenkette;
 end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 ZkAm := true;
 opspeicher := '0';
end;

procedure TForm1.BtnOpClick(Sender: TObject);
begin
 if Sender = BtnPlus then op := '+';
 if Sender = BtnMinus then op := '-';
 if Sender = BtnMal then op := 'x';
 if Sender = BtnGeteilt then op := '/';
 if Sender = BtnClear then op := 'c';
 if Sender = BtnGleich then op := '=';
Also ich versteh hier nur sehr wenig, was mir diese Abschnitte sagen sollen ich kann es wirklich nur schwer nachvollziehen. Auf einmal steht da das die Variable "op" auf "+" gesetzt wird wenn Sender "+" ist. Und im Nächsten abschnitt ist dann aufeinmal von der Variable "opspeicher" die rede?
Und dann versteh ich das mit dem Geteilt nicht. Was wurde da genau gemacht? Wie kann man das machen das das Geteilt bei ="0" ein "Error" ausgiebt.
Und wie man Plötzlich zur Variable "Erg kommt" Also das Konzept ist mir schwebig bewusst aber ich versteh es nicht und kann hier wirklich nichts nachvollziehen besonders was funktion & Zusammenhänge angeht.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
ZkAm := true;
 zahl := strtofloat(Edt1.Text);
  if opspeicher = '0' then erg := zahl;
  if opspeicher = '+' then erg := erg+zahl;
  if opspeicher = '-' then erg := erg-zahl;
  if opspeicher = 'x' then erg := erg*zahl;
  if opspeicher = '/' then erg := erg/zahl;
  if opspeicher = 'c' then erg := 0;
  if opspeicher = '=' then erg := erg;

 opspeicher := op;
 Edt1.Text := floattostr(erg);
end;

end.


Moderiert von user profile iconNarses: Color- durch Delphi- und Highlight-Tags ersetzt.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mo 26.10.09 00:00 
Hi,

also als erstes mal: Musst du dieses Konzept verwenden? Oder darfst du auch ein eigenes machen? Weil das Konzept hier ist schon ziemlich komprimiert.

:gruebel:

Anmerkung: Wenn man Variablen, die man nur an einer Stelle braucht, auch lokal deklariert, hat man einen besseren Überblick.

Also, fangen wir mal vorne an:

ausblenden 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:
procedure TForm1.BtnClick(Sender: TObject);
begin
 { In die Variable "Zeichen" wird die Zahl geschrieben, die gerade angeklickt wurde } 
 if Sender = Btn0 then zeichen := '0';
 if Sender = Btn1 then zeichen := '1';
 if Sender = Btn2 then zeichen := '2';
 if Sender = Btn3 then zeichen := '3';
 if Sender = Btn4 then zeichen := '4';
 if Sender = Btn5 then zeichen := '5';
 if Sender = Btn6 then zeichen := '6';
 if Sender = Btn7 then zeichen := '7';
 if Sender = Btn8 then zeichen := '8';
 if Sender = Btn9 then zeichen := '9';

if ZkAm = true then
  begin
    ZkAm:= false;
    zeichenkette := zeichen;
  end
else 
  zeichenkette := zeichenkette + zeichen;
 
Edt1.Text := zeichenkette;

end;


Die Variable ZkAm bedeuted eigentlich: "War der letzte Knopf eine Operation?" Das liegt daran, *Windows Rechner aufmach* tippst du ein: "1+7" dann steht da nur 7. (Ich muss ja ehrlicherweise zugeben, mir isses lieber wenn da die Rechnung da steht und nicht nur ein Ergebnis, aber Aufgabe ist Aufgabe). Das heißt, nach jeder Operation (in dem Fall das +) fängt er neu an, die Zahlen hinzuschreiben. Und genau dafür ist das ZkAm. Nach obigem Code wird genau danach gefragt: "Neue Zahlenreihe anfangen?" -> Wenn ja, dann zeichenkette = zeichen, sonst hänge es an die zeichenkette an.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.BtnOpClick(Sender: TObject);
begin
 if Sender = BtnPlus then op := '+';
 if Sender = BtnMinus then op := '-';
 if Sender = BtnMal then op := 'x';
 if Sender = BtnGeteilt then op := '/';
 if Sender = BtnClear then op := 'c';
 if Sender = BtnGleich then op := '=';

So, das hier ist ganz einfach. Hier wird einfach geguckt, welche Operation gedrückt wurde (op ist wieder lokal, da steht eben nur die Operation drin).
ausblenden 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:
  {Wir machen jetzt eine Operation, das heißt, danach fängt wieder eine Zahlenkette an}
  ZkAm := true;


  {Hier lesen wir jetzt erstmal die Zahl aus, die wir in dem Code oben eingegeben haben}
  zahl := strtofloat(Edt1.Text);

  {Jetzt nehmen wir die Operation, die DAS LETZTE MAL eingegeben wurde. 
   Du tippst z.B. "1+"...jetzt gibts ja noch nix zu rechnen. Erst wenn du "1+2+" 
   gedrückt hast, kann er was rechnen. Deswegen rechnet er nicht das, was du 
   jetzt eintippst sondern das vorher.}

  if opspeicher = '0' then erg := zahl;  //< Wenn opspeicher=0, dann rechne garnix, siehe unten
  if opspeicher = '+' then erg := erg+zahl;
  if opspeicher = '-' then erg := erg-zahl;
  if opspeicher = 'x' then erg := erg*zahl;
  if opspeicher = '/' then erg := erg/zahl;
  if opspeicher = 'c' then erg := 0;
  if opspeicher = '=' then erg := erg;

  {Und jetzt nimmt er die Operation, auf die due jetzt im Moment gedrückt hast,
   und speichert sie. Wenn du dann "1+2+5-" getippt hast, dann rechnet er eben das zweite
   Plus.}

  opspeicher := op;
  
  {So, und jetzt das Ergebnis wieder anzeigen}
  Edt1.Text := floattostr(erg);
end;



So *kopf rauch* und jetzt kommen wir noch hierzu:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.FormCreate(Sender: TObject);
begin
 ZkAm := true;
 opspeicher := '0';
end;

Das hier ist das aller erste was er macht. ZkAm ist true, logisch weil wir ja zuerst mal ne Zahlenreihe eintippen.

opspeicher ist 0 (siehe oben). Wenn du "1+" eintippst dann macht er eben noch nix, sondern erst bei "1+2+".

Anmerkung:
Diese Zeile hier ist für Teiloperationen zuständig. Wie du weißt, darf dabei "zahl" nie null sein.
ausblenden Delphi-Quelltext
1:
  if opspeicher = '/' then erg := erg/zahl;					

Also ganz banal:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  if opspeicher = '/' then 
     begin
       if zahl <> 0 then
         erg := erg/zahl
       else
         ...
     end;

Die Frage ist dann halt, was er machen soll wenn zahl doch 0 ist. Ne Fehlermeldung bringen z.B.?

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 26.10.09 02:01 
Da hier anscheinend jede Woche jemand nach Hilfe bezüglich eines Taschenrechners fragt, sollte eigentlich die Suche genug Beiträge finden.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 26.10.09 07:05 
Da zahl eine Fließkommazahl ist, wird das Prüfen direkt auf 0 nicht unbedingt reichen. Da wäre IsZero geeigneter, denn damit erwischt man auch eine Zahl "so gut wie 0".
DelphX Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 26.10.09 22:45 
ausblenden Delphi-Quelltext
1:
2:
{Hier lesen wir jetzt erstmal die Zahl aus, die wir in dem Code oben eingegeben haben}
  zahl := strtofloat(Edt1.Text);

das hier hab ich immer noch nicht icht richtig kapiert :(

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Mo 26.10.09 23:26 
der teil macht folgendes:

du hast eine zeichenkette. in deinem fall vermutlich lauter ziffern, also 1254. Da der PC aber nicht unterscheiden kann, was is jetzt ein zeichen, was eine zahl (intern im PC sind es ja nur bytes, also zahlen von 0 bis 255). Deswegen muss man dem PC sagen "bitte wandle diese ziffern in eine für dich lesbare zahl um". und genau das macht der befehl. Da es in unserem fall eine gleitkommazahl ist (also ein Floattyp: Real, Single, Double, Extended) und kein Ganzzahlentyp (Integer, ShortInt, SmallInt, LongInt, Int64) müssen wir den befehl StrToFloat verwenden. Str ist dabei die Abkürzung für String (also eine Zeichenkette), To heißt zu (no na ned), und Float heißt eben Gleitkommazahl. Und mit dieser Gleitkommazahl kann dann der PC herumrechnen, wie +, -, *, /, mod und so weiter. ;)

alles klar?

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Mo 26.10.09 23:26 
Naja die F1 taste wirkt wunder.

Zahl = typ(flieskommazahl)

Edit1.Text = String

zahl := string geht nicht

zahl := Wandel string to(in) float(flieskommazahl)

funktioniert
Hurra geschafft....
DelphX Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 26.10.09 23:36 
ahhhhh jezt geht mir ein Licht auf :D super ich kann jezt also den ganzen rechner runterschreiben.
Wie könnte man eigentlich Vorzeichen & Komma Realisieren so das man eingeben kann oder so ..oder -5,5 x 6 ?
Hätte da jemand eine Idee?
Aso ich könnte mir vorstellen sowas das man zu dem "ZiffernklickEreignis" ein '-' butten hinstellt der irgendwie als Zah gelten soll oder so...hmm keine ahnung. wo die Positiv zahl dann später in eine negativzahl im letzten schritt umgewandelt wird. aber so direkt hab ich keine besonmdere idee ich hoffe ich bin auf dem richtigen Pfad irgendwie....hmm
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Di 27.10.09 19:55 
ich würde da eher einen Knopf hinmachen "-a"...hmm, ne, a ist das normal nicht...egal, auf jedenfall als Operation.

Und dann

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
if Op='-a' then
  begin
    erg:=-erg;
    opspeicher := '0';
  end;

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)