AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Liste von Namen auf Charakteristiken überprüfen
Thema durchsuchen
Ansicht
Themen-Optionen

Liste von Namen auf Charakteristiken überprüfen

Ein Thema von diavy · begonnen am 18. Sep 2012 · letzter Beitrag vom 21. Sep 2012
Antwort Antwort
Seite 1 von 2  1 2      
diavy

Registriert seit: 11. Apr 2012
54 Beiträge
 
#1

Liste von Namen auf Charakteristiken überprüfen

  Alt 18. Sep 2012, 16:20
Hallo zusammen, wiedermal habe ich ein Problem.

Es geht um folgendes:
Ich soll ein Programm schreiben, bei dem eine Liste von Namen auf 2 Sachen überprüft werden sollen:
a) ob sie mit einem/r ausgewählten Buchstaben/Buchstabenkombination beginnen
b) ob kein genannter Buchstabe im Namen vorkommt

Jene Namen die die ausgewählte Bedingung erfüllen, sollen dargestellt werden.

Ich habe zu erst das Programm ohne die "Liste" geschrieben, sprich nur mit einem Namen, um zu überprüfen ob ich das mit den Bedingungen hinbekommen. Das hat 1A geklappt.
Nun hänge ich jedoch an der "Liste". Ich habe die Variablen die von mehreren Objekten benutzt werden sollen unter "public" deklariert, da ich mir dadurch erhofft habe, sie würden global werden (was ja Pflicht sein sollte wenn mehrere Objekte drauf zugreifen sollen, oder?).

Irgendetwas haut trotzdem nicht hin.


Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    edt_name: TEdit;
    Label1: TLabel;
    Button1: TButton;
    edt_start: TEdit;
    lbl_name: TLabel;
    lbl_letter: TLabel;
    procedure RadioButton1Click(Sender: TObject);
    procedure RadioButton2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    i:integer;name:array of string;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.RadioButton1Click(Sender: TObject);
var error:boolean; j,l:integer; word:string;
begin
for l:=1 to i do
        begin
        word:=name[l];
        error:=false;
        for j:=1 to Length(word) do
                if edt_start.Text[j]<>word[j] then error:=true;
        if error=false then label1.Caption:=Label1.Caption + word
        else Label1.Caption:=label1.Caption + '';
        end;
end;

procedure TForm1.RadioButton2Click(Sender: TObject);
var error:boolean; j,k,l:integer; word:string;
begin
for l:=1 to i do
        begin
        word:=name[l];
        error:=false;
        for j:=1 to Length(edt_start.Text) do
                for k:=1 to Length(word) do
                        if edt_start.text[j]=word[k] then error:=true;
        if error=true then Label1.Caption:=Label1.Caption+''
        else Label1.Caption:=Label1.Caption + word
        end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SetLength(name,(i+1));
name[i]:=edt_name.Text;
inc(i);
edt_name.text:='';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
i:=1;
end;

end.
Wär nett wenn mir wieder wer helfen könnte.
Miniaturansicht angehängter Grafiken
delphitrouble.jpg  
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Liste von Namen auf Charakteristiken überprüfen

  Alt 18. Sep 2012, 16:23
a) Pos() = 1
b) Pos()
Markus Kinzler
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: Liste von Namen auf Charakteristiken überprüfen

  Alt 18. Sep 2012, 16:46
Nur als Tips:

Mit High(Array) / Low(Array) kann man obere und untere Grenze eines Array ermitteln und dieses mit
for i:=Low(Array) to High(Array)
durchlaufen. Damit könntest du dir die Variable i sparen.

Und der Vergleich if error=true / if error=false ist unschön und doppeltgemoppelt (und birgt auch eine Fehlerquelle, auch wenn ich die trotz der vielen Erklärungen die an dieser Stelle immer kommen, nicht verstanden habe).
if error then reicht vollkommen bzw. if not error then.
Liest sich doch auch schöner.

Die Access Violation klingt danach, das auf ein nicht vorhandenen Array-Element zugegriffen wird. Ich glaube da du immer nach dem hinzufügen eines neuen Namens schon ein Inc(i) machst, bist du mit dem Zähler um eines zu hoch.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Liste von Namen auf Charakteristiken überprüfen

  Alt 18. Sep 2012, 16:55
(und birgt auch eine Fehlerquelle, auch wenn ich die trotz der vielen Erklärungen die an dieser Stelle immer kommen, nicht verstanden habe)
Ganz einfach: False ist mit 0, True mit 1 deklariert (die Konstanten meine ich). Der Unterschied zwischen
if Dings = true then und
if Dings then liegt darin, dass die erste Variante auf 1, die zweite aber auf <> 0 prüft. Von daher kann man also genausogut schreiben
if Dings <> false , aber das sieht irgendwie *bäh* aus, oder nicht?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Liste von Namen auf Charakteristiken überprüfen

  Alt 18. Sep 2012, 16:59
Genaugenomnmen ist False 0 und True <> 0. Das macht einen Vergleich auf True noch gefährlicher, da bei Delphi True 1 ist und bei (der) Windows (API) -1 ( Komplement). hat man nun ein False veiner Funktion der API und vergleicht diese gegen die Konstante kommt was Falsches raus. Deshalb sollte man nie auf True Prüfen!
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.021 Beiträge
 
Delphi 12 Athens
 
#6

AW: Liste von Namen auf Charakteristiken überprüfen

  Alt 18. Sep 2012, 16:59
Die Access-Violation kommt, da nach dem SetLength(name, I+1) ein Inc(I) kommt. Der Array Index beginnt immer bei 0, daher ist ein Zugriff auf name[I] immer außerhalb der Arraygrenzen. Wenn du das Range-Checking eingeschaltet hättest, wäre die Fehlermeldung auch hilfreicher.

Unschön: Die Verwendung von "name", da TForm bereits ein Property "Name" hat, und "word" ist ein Datentyp. Die Delphi-Syntax lässt das zwar zu, aber es verwirrt eigentlich nur.

Warum schreibst du nicht eine Prozedur, die ein einzelnes Wort überprüft, und diese fütterst du dann in einer Schleife mit den einzelnen Listenelementen?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Liste von Namen auf Charakteristiken überprüfen

  Alt 18. Sep 2012, 17:07
Genaugenomnmen ist False 0 und True <> 0. Das macht einen Vergleich auf True noch gefährlicher, da bei Delphi True 1 ist und bei (der) Windows (API) -1 ( Komplement). hat man nun ein False veiner Funktion der API und vergleicht diese gegen die Konstante kommt was Falsches raus. Deshalb sollte man nie auf True Prüfen!
Ich schrieb ja, dass ich die Delphi-Konstanten meine
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Liste von Namen auf Charakteristiken überprüfen

  Alt 18. Sep 2012, 17:09
Ich habe dich ja nicht verbessert, sondern deine Ausführungen etwas vertieft.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Liste von Namen auf Charakteristiken überprüfen

  Alt 18. Sep 2012, 17:12
Wir können das am Freitag bei einem Bierchen ja vertiefen
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Liste von Namen auf Charakteristiken überprüfen

  Alt 18. Sep 2012, 17:40
Das ist zuviel des Guten:
Delphi-Quellcode:
for j:=1 to Length(word) do
                if edt_start.Text[j]<>word[j] then error:=true;
ich würde das verwenden:
Delphi-Quellcode:
error:=false;
j:=0;
repeat
  inc(j,1);
  if if edt_start.Text[j]<>wort[j] then error:=true;
until (j>=length(wort)) or error;
und wort statt word, da word ein Typ ist.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz