Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zahlen symmetrisch (https://www.delphipraxis.net/110992-zahlen-symmetrisch.html)

xShadowBoZz 27. Mär 2008 18:57


Zahlen symmetrisch
 
hab wieder mal ein problem, ich wollte einfach ma ausprobiern was ich so alles mit zaheln kann und hab geguckt ob ich herausfinden kann ob eine zahl symmetrisch ist oder nicht.
hierbei musste ich allerdings festellen das ich das nicht hinkrieg.
ich weis einfach nicht wie ich es abfragen soll und wollte hier wissen ob mir jmd helfen kann.

also: biem anwenden des programms gebe ich irgendeine zahl in ein editfeld ein und drueck auf einen button, hier bei soll dann (z.b) label9.caption:='symmetrisch';
zumindestens hab ich mir das so vorgestellt nur weis ich nicht genau wie ich das abfragen soll.
ich wuerd das gern ungefair so machen

lg
andy :dp:

DeddyH 27. Mär 2008 18:59

Re: Zahlen symmetrisch
 
Du meinst Primzahlen?

xShadowBoZz 27. Mär 2008 19:01

Re: Zahlen symmetrisch
 
>.< habs grad bemerkt das ich von primzahlen rede.
sry aber ja meine symmetrische zahlen.

Der.Kaktus 27. Mär 2008 19:06

Re: Zahlen symmetrisch
 
Hallo,
mich mal eben kundig gemacht habe, da Begriff Symmetrische Zahlen mir kein Begriff war..Du meinst also

"Wir wollen eine natürliche Zahl „symmetrisch" nennen, wenn ihre Zifferndarestellung von rechts gelesen ebenso lautet wie von links. Dabei soll stets auch die 0 als Anfangsziffer mitberücksichtigt werden. So sind z.B. 15251, 037730 und 0000 symmetrische Zahlen."

dies?

wido 27. Mär 2008 19:07

Re: Zahlen symmetrisch
 
Hmmm ... was Du meinst sind Primzahlen. Hab noch nie den Begriff von "symmetrische Zahl" gehört. Naja, die einfachste Methode ist folgende:

Du willst prüfen ob die Zahl z eine Primzahl ist. Also ermittelst Du alle Zahlen x zw. 2 und z-1 und schaust nach, ob z modulo x = 0 ist:

Delphi-Quellcode:
function IstPrimzahl(z : integer) : boolean;
var
  i : integer;
begin
  result := true;
  for i := 2 to z-1 do
    if z mod i = 0 then
      begin
        result := false;
        exit;
      end;
end;
Das Problem ist übrigens auch als Faktorisierungsproblem bekannt. Eine effiziente Lösung ist nicht existent. Allerdings kannst Du den Aufwand für den Bruteforce Ansatz verringern. Du musst z.B. prinzipiell nicht bis z-1 testen sondern nur bis Wurzel aus z etc.. Aber das führt zu weit.

Für was magst das ganze denn verwenden?

DeddyH 27. Mär 2008 19:08

Re: Zahlen symmetrisch
 
Eine mathematische Formel für symmetrische Zahlen kenne ich jetzt nicht, aber wenn Du sie als String betrachtest, solltest Du der Lösung schnell nahe kommen.

dominikkv 27. Mär 2008 19:12

Re: Zahlen symmetrisch
 
Delphi-Quellcode:
function isPrime(Zahl: Integer): Boolean;
var
  Temp: Integer;
begin
  Temp := 2;
  while ((Zahl mod Temp) <> 0) and (Zahl > Temp) do
    inc(Temp);

  result := Zahl = Temp;
end;

DeddyH 27. Mär 2008 19:14

Re: Zahlen symmetrisch
 
Hallo! Symmetrische Zahlen, nicht Primzahlen :P

dominikkv 27. Mär 2008 19:17

Re: Zahlen symmetrisch
 
Zitat:

Zitat von DeddyH
Hallo! Symmetrische Zahlen, nicht Primzahlen :P

ohh..ähh..was sind symmetrische Zahlen? Wikipedia kennt das nicht^^
Ist zB die 8 eine symmetrische Zahl? Oder meint der sowas wie 123321?

DeddyH 27. Mär 2008 19:19

Re: Zahlen symmetrisch
 
Siehe #4. 12345 ist nicht symmetrisch, 12321 hingegen schon. Du kannst auch mal nach Palindrom schauen ;)

Der.Kaktus 27. Mär 2008 19:19

Re: Zahlen symmetrisch
 
Zitat:

Zitat von dominikkv
Zitat:

Zitat von DeddyH
Hallo! Symmetrische Zahlen, nicht Primzahlen :P

ohh..ähh..was sind symmetrische Zahlen? Wikipedia kennt das nicht^^
Ist zB die 8 eine symmetrische Zahl? Oder meint der sowas wie 123321?

schau mal meine Erkundungen an...7 Antworten hoeher ;-)

wido 27. Mär 2008 19:23

Re: Zahlen symmetrisch
 
Ja, beschrieben hat er aber Primzahlen. Aber für symetrische Zahlen gibts ne einfache Methode:

Delphi-Quellcode:
uses sysutils;

function IstSymetrisch(z : integer) : boolean;
var
  i : integer;
  s : string;
begin
  result := true;
  s := IntToStr(z);
  for i := 1 to Length(s) do
    result := result and (s[i] = s[length(s) - (i - 1)]);
end;

dominikkv 27. Mär 2008 19:27

Re: Zahlen symmetrisch
 
ohje... das geht mir hier zu schnell^^
und wenn dann noch der erste beitrag editiert wird...

aber zum thema:
Delphi-Quellcode:
isSymmetrisch(Zahl: String{!}): Boolean;
var
  Anfang, Ende: Integer;
begin
  Anfang := 1;
  Ende := length(Zahl);
  if not odd(length(Zahl)) then
    begin
      while (Zahl[Anfang] = Zahl[Ende]) and (Anfang < Ende) do
        begin
          Inc(Anfang);
          Dec(Ende);
        end;
      result := Anfang > Ende;
    end else
      result := False;
end;
hab mal so erfunden^^

olee 27. Mär 2008 19:28

Re: Zahlen symmetrisch
 
Liste der Anhänge anzeigen (Anzahl: 1)
Mist eigentlich wär ich vor allen gewesen ....

wollte nur, dass es auch gut aussieht ^_^

Hmpf..

DeddyH 27. Mär 2008 19:35

Re: Zahlen symmetrisch
 
Noch ein Vorschlag:
Delphi-Quellcode:
uses StrUtils;

function IsSymmetricNumber(const i: Cardinal): Boolean;
begin
  Result := IntToStr(i) = ReverseString(IntToStr(i));
end;

olee 27. Mär 2008 19:39

Re: Zahlen symmetrisch
 
Funktioniert nur nicht immer ^^

123321 geht

1234321 geht nicht

DeddyH 27. Mär 2008 19:41

Re: Zahlen symmetrisch
 
Wie kommst Du zu dieser Annahme?

olee 27. Mär 2008 19:50

Re: Zahlen symmetrisch
 
Oh stimmt sry ...

... kleiner Denkdreher ^^ :cyclops:

rawsoul 27. Mär 2008 20:03

Re: Zahlen symmetrisch
 
Zitat:

Zitat von DeddyH
Siehe #4. 12345 ist nicht symmetrisch, 12321 hingegen schon. Du kannst auch mal nach Palindrom schauen ;)

Falsch, siehe #3 ;)

Man kann Primzahlen auch "aussieben", oder diese nach Fermat testen.

//Edit: Stop! Wenn ich mich recht erinnere, prüfen Siebmethoden und der Test nach Fermat nur nach Pseudoprimzahlen!

DeddyH 27. Mär 2008 20:06

Re: Zahlen symmetrisch
 
Du bist des Lesens mächtig?
Zitat:

sry aber ja meine symmetrische zahlen.

xShadowBoZz 28. Mär 2008 09:47

Re: Zahlen symmetrisch
 
also hab mir eure beispiele ma angesehen und hab mir dann was eigenes ueberlegt.

habs erst damit probiert:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var eins, zwei, drei, vier, fuenf: Integer;
begin
  eins:=StrToInt(edit1.text);
  zwei:=StrToInt(edit2.text);
  drei:=StrToInt(edit3.text);
  vier:=StrToInt(edit4.Text);
  fuenf:=StrToInt(edit5.Text);
  If eins + zwei = vier + fuenf then begin
    Label3.Visible:=StrToBool('False');
    Label2.Visible:=StrToBool('True');
  end
else
  begin
    Label2.Visible:=StrToBool('False');
    Label3.Visible:=StrToBool('True');
  end;
end;
(also das man 5 verschiedene Zahlen schreiben kann)

so wenn ich dann auf den button clicke
ist zb. 12321 = symmetrisch und 12231 = nicht symmetrisch
allerdings hab ich dann bemerkt das es auch einen kleine fehler gib.t
da es ja den wert des 1. felds mit dem 2. zusammen rechnet und mit der summe des 4. + 5. felds vergleicht.

so würde das programm also ausgeben das, zb.
12312 = symmetrisch ist.

also bin ich nochmal dran gegangen und hab einen anderen weg gesucht,
in diesem fall is mir dann eine ganz einfache lösung eingefallen und wollte fragen ob man das so machen kann oder ob es da auch sowas wie einen "Bug" gibt.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var eins, zwei, drei, vier, fuenf: Integer;
begin
  eins:=StrToInt(edit1.text);
  zwei:=StrToInt(edit2.text);
  drei:=StrToInt(edit3.text);
  vier:=StrToInt(edit4.Text);
  fuenf:=StrToInt(edit5.Text);
  If (eins = fuenf) and (zwei = vier) then begin
    Label3.Visible:=StrToBool('False');
    Label2.Visible:=StrToBool('True');
  end
else
  begin
    Label2.Visible:=StrToBool('False');
    Label3.Visible:=StrToBool('True');
  end;
end;
hier wird vergliechen ob
edit1.text = edit5.text ist
und ob
edit2.text = edit4.text ist

richtig so?



(noch nebenbei, klingt jetzt wahrschienlich etwas dumm oder so, aber ich hab des immer noch nicht kapiert wie ich eine function einbauen kann, kann mir jemand helfen, bzw. zeigen oder einen link zu einem tut geben?)

DeddyH 28. Mär 2008 09:53

Re: Zahlen symmetrisch
 
Der 2. Ansatz ist auf jeden Fall richtiger, wenn auch umständlich gelöst. Versuch es mal so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var eins, zwei, drei, vier, fuenf: Integer;
begin
  //Du solltest hier auf jeden Fall eine Fehlerbehandlung einbauen
  eins:=StrToInt(edit1.text);
  zwei:=StrToInt(edit2.text);
  drei:=StrToInt(edit3.text);
  vier:=StrToInt(edit4.Text);
  fuenf:=StrToInt(edit5.Text);
  //sprechende Bezeichner wären auch nicht schlecht ;)
  Label2.Visible := (eins = fuenf) and (zwei = vier);
  Label3.Visible := not Label2.Visible;
{
  If (eins = fuenf) and (zwei = vier) then begin
    Label3.Visible:=StrToBool('False');
    Label2.Visible:=StrToBool('True');
  end
else
  begin
    Label2.Visible:=StrToBool('False');
    Label3.Visible:=StrToBool('True');
  end;}
end;
Und zum Einsetzen von Funktionen solltest Du Dir die Einsteiger-Tutorials in diesem und anderen Foren mal ansehen. Ein kleines Beispiel:
Delphi-Quellcode:
function IsSymmetricNumber(const i: Cardinal): Boolean;
begin
  Result := IntToStr(i) = ReverseString(IntToStr(i));
end;

procedure TForm1.Button1Click(Sender: TObject);
var eins, zwei, drei, vier, fuenf: Integer;
begin
  //Du solltest hier auf jeden Fall eine Fehlerbehandlung einbauen
  eins:=StrToInt(edit1.text) * 10000;
  zwei:=StrToInt(edit2.text) * 1000;
  drei:=StrToInt(edit3.text) * 100;
  vier:=StrToInt(edit4.Text) * 10;
  fuenf:=StrToInt(edit5.Text);
  if IsSymmetricNumber(eins + zwei + drei + vier + fuenf) then
    ShowMessage('Palindrom')
  else
    ShowMessage('Kein Palindrom');
end;

xShadowBoZz 28. Mär 2008 10:27

Re: Zahlen symmetrisch
 
Zitat:

Zitat von DeddyH
Der 2. Ansatz ist auf jeden Fall richtiger, wenn auch umständlich gelöst. Versuch es mal so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var eins, zwei, drei, vier, fuenf: Integer;
begin
  //Du solltest hier auf jeden Fall eine Fehlerbehandlung einbauen
  eins:=StrToInt(edit1.text);
  zwei:=StrToInt(edit2.text);
  drei:=StrToInt(edit3.text);
  vier:=StrToInt(edit4.Text);
  fuenf:=StrToInt(edit5.Text);
  //sprechende Bezeichner wären auch nicht schlecht ;)
  Label2.Visible := (eins = fuenf) and (zwei = vier);
  Label3.Visible := not Label2.Visible;
{
  If (eins = fuenf) and (zwei = vier) then begin
    Label3.Visible:=StrToBool('False');
    Label2.Visible:=StrToBool('True');
  end
else
  begin
    Label2.Visible:=StrToBool('False');
    Label3.Visible:=StrToBool('True');
  end;}
end;

ok also das mit funktionen einbauen seh ich mir noch an. und werd mal sehen ob ich mit deinem beispiel klar komme.
und zu dem was du veraendert hast soll alles soviel heisen wie(kommt unten drunter).... wenn ich das richtig verstanden habe.
// Fehlerbehandlung
damit meinst du einfach eine fehlerbehandlung xP, weis nicht genau was aber ich würde einfach vermuten wenn zb. edit1.text = nix ist, also einfach nur leer (ich habe bei jedem edit feld im "OnKeyPress" eine procedure eingefügt das man nur zahlen reinschreiben kann.)
bzw. zu dem hier werd ich noch sehen, da mir momentan grad dazu nichts einfällt.

ab
// sprechende Bezeichner wären.....
wird das wohl so erklärt:
Label2 ist nur visible (sichtbar) wenn eins = fuenf (der wert im editfeld) und zwei = vier ist.
und Label3 ist nur visible (sichtbar) wenn label2 nciht sichtbar ist.

hoffe das ich das dann richtig verstanden hab.
allerdings muss ich sagen momentan find ich das auf meine methode noch einfacher ^^ naja liegt wohl daran das ich das kann und noch net sooo weit gedacht hab ^^

DeddyH 28. Mär 2008 10:31

Re: Zahlen symmetrisch
 
Lass mal ein Edit leer und drück den Button, dann weißt Du, was ich mit Fehlerbehandlung meinte. Und mit sprechenden Bezeichnern meine ich, statt Label22 einen Namen wie lblVorname (nur als Beispiel) zu wählen, dann kann man evtl. auch ohne das Formular zu kennen auf den Sinn schließen ;)

xShadowBoZz 28. Mär 2008 10:57

Re: Zahlen symmetrisch
 
ja des mit edit leer lassen kommt halt mit dem problem
" is not a valid integer value.
muss ich halt noch gucken das dann entweder nichts kommt oder eine andere error nachricht.

bzw.
habs so probiert funktioniert allerdings net, :wall:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var eins, zwei, drei, vier, fuenf: Integer;
begin
  eins:=StrToInt(edit1.text);
  zwei:=StrToInt(edit2.text);
  drei:=StrToInt(edit3.text);
  vier:=StrToInt(edit4.Text);
  fuenf:=StrToInt(edit5.Text);
// Das hier sollte die Fehlerbehandlung sein
  If (eins or zwei or drei or vier or fuenf =$22) then
  Showmessage('Bitte fülle alle Felder aus!')
// ende der Fehlerbehandlung
  else
  If (eins = fuenf) and (zwei = vier) then begin
    Label3.Visible:=StrToBool('False');
    Label2.Visible:=StrToBool('True');
  end
else
  begin
    Label2.Visible:=StrToBool('False');
    Label3.Visible:=StrToBool('True');
  end;
end;

DeddyH 28. Mär 2008 11:10

Re: Zahlen symmetrisch
 
Schau Dir mal TryStrToInt an.

Die Muhkuh 28. Mär 2008 11:13

Re: Zahlen symmetrisch
 
Oder Delphi-Referenz durchsuchenStrToIntDef ;)

DeddyH 28. Mär 2008 11:14

Re: Zahlen symmetrisch
 
Dann weißt Du aber nicht, ob die Zahl eingegeben wurde oder nicht ;)

dominikkv 28. Mär 2008 11:16

Re: Zahlen symmetrisch
 
versuchs mal so:
Delphi-Quellcode:
uses
  StrUtils; // Uses ergänzen

function IsSymmetricNumber(const s: String): Boolean;
begin
  Result := s = ReverseString(s);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Temp: Integer; // Dummyvariable
  s: String;
begin
  s := edit1.text + edit2.text + edit3.text + edit4.text;
  // wenn du das ganze mit nur einem edit machen willst dann
  // s := edit1.text;

  if TryStrToInt(s, Temp) then // wenn in s eine zahl drinnsteht...
    begin
      Label2.Visible := IsSymmetricNumber(s);
      Label3.Visible := not Label2.Visible;
    end;
end;

xShadowBoZz 28. Mär 2008 11:47

Re: Zahlen symmetrisch
 
ok thx für die hilfe.

hab es jetzt auch geschaft bei mir im code einen fehler error einzubauen falls nicht alle editfelder *edit* meine ausgefüllt sind.

hab jetzt einfach das hinzugefügt.
Delphi-Quellcode:
try
  eins:=StrToInt(edit1.text);
  zwei:=StrToInt(edit2.text);
  drei:=StrToInt(edit3.text);
  vier:=StrToInt(edit4.Text);
  fuenf:=StrToInt(edit5.Text);
except
  ShowMessage('Bitte Fülle alle Felder aus!');
  abort;
end;

Khabarakh 28. Mär 2008 12:57

Re: Zahlen symmetrisch
 
*mal ein wenig aufräumt* *g*
Zitat:

Zitat von DeddyH
Eine mathematische Formel für symmetrische Zahlen kenne ich jetzt nicht, [...]

Wird schwer, ist schließlich vom Zahlensystem abhängig ;) .

Delphi-Quellcode:
StrToBool('False');
Kreativ :mrgreen: *scnr* .

Wenn ich das richtig sehe, berücksichtigt keine bisher gepostete Funktion die "Nullen-Regel" (s. #4). Dafür sollte aber ein einfaches Entfernen aller anhängenden Nullen genügen.

DeddyH 28. Mär 2008 13:03

Re: Zahlen symmetrisch
 
Zitat:

Zitat von Khabarakh
Wird schwer, ist schließlich vom Zahlensystem abhängig

Naja, die meisten Mathematiker (aber Nicht-Informatiker), die ich kenne (gut, sind nicht allzuviele), rechnen prinzipiell im Dezimal-System ;) . Bzgl. der Nullen habe ich keine eindeutige Aussage finden können, wie diese zu behandeln sind.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 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