Mengen definieren

Für Fragen von Einsteigern und Programmieranfängern...
tictac
Beiträge: 23
Registriert: Di 3. Apr 2012, 11:30

Mengen definieren

Beitrag von tictac »

hallo!
also ich hoffe, dass die Frage hierher gehört:
ich möchte eine Menge definieren, in der das große und kleine Alphabet, die 10 Ziffern, ß und _ vorhanden sind. Ich habe schon einiges dazu im Internet gelesen, aber das funktioniert bei mir alles irgendwie nicht... :(
ich hoffe, mir kann jemand erklären, wie ich das machen muss.
vielen dank schonmal!
tictac

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Mengen definieren

Beitrag von carli »

Code: Alles auswählen

[1, 2, 3]

Code: Alles auswählen

[1..4, 8..12]

Code: Alles auswählen

['a'..'z', 'A'..'Z']

Code: Alles auswählen

['a..z']-['f', 'g']

tictac
Beiträge: 23
Registriert: Di 3. Apr 2012, 11:30

Re: Mengen definieren

Beitrag von tictac »

hallo carli,
aber wo schreib ich das hin?
muss eine variable damit jetzt in der prozedur "gefüllt" werden? aber was schreibe ich bei der variablendeklaration?
oder muss ich das ganze bei Konstanten hinschreiben?

tictac

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Mengen definieren

Beitrag von carli »

Code: Alles auswählen

var a: set of byte;
begin
  a:=[1..5];
  a+=[8]; // ergibt [1..5,8]
  a*=[4..10]; // nur noch [4,5,8]
end

Code: Alles auswählen

const abc: set of byte = ['a'..'z', 'A'..'Z'];
begin
  if 'f' in abc then showmessage('alles ist OK');
end

Code: Alles auswählen

var x: set of (a, b, c);
begin
  if (x*[b, c])<>[] then showmessage('x enthält b und c');
end

tictac
Beiträge: 23
Registriert: Di 3. Apr 2012, 11:30

Re: Mengen definieren

Beitrag von tictac »

hallo carli,
danke! ich habe das jetzt mit der konstante gemacht, das gibt keine fehlermeldung mehr, allerdings nur solange, wie ich kein 'ß' mit reinschreibe. wenn ich das mache, dann kommt als fehler:
ordinal expression expected

warum geht das dann nicht?

vielen dank für die hilfe!

tictac

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: Mengen definieren

Beitrag von theo »

Das geht nicht, weil du UTF-8 im Editor hast. Dabei ist ß wie öäü mit 2 Byte dargestellt.

Erklär doch mal, was du am Ende erreichen willst, so geht das leider nicht.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Mengen definieren

Beitrag von mse »

@theo:
Ui, schon wieder ein Veteran! ;-)

Martin

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: Mengen definieren

Beitrag von theo »

mse hat geschrieben:@theo:
Ui, schon wieder ein Veteran! ;-)
tictac hat einfach von Veteranen geschriebene Beispiele gelesen. :wink:

Sets sind nicht Unicode-tauglich, egal mit welcher Kodierung.

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: Mengen definieren

Beitrag von theo »

@tictac: Wenn du bspw. wissen willst, wieviele "erlaubte Buchstaben" ein String enthält, kannst du das mit neuerem Compiler z.B. so lösen.
Hol dir die utf8tools hier: http://wiki.lazarus.freepascal.org/Theodp" onclick="window.open(this.href);return false;

Code: Alles auswählen

uses utf8scanner;
 
procedure TForm1.Button1Click(Sender: TObject);
var s:TUTF8Scanner;
  i,definedchars,undefinedchars:integer;
begin
 definedchars:=0;
 undefinedchars:=0;
 s:=TUTF8Scanner.Create('aböcdüefgöhß');
 for i:=1 to s.Length do
  case s.UTF8Chars[i] of
  'a'..'z','A'..'Z','ß','_': inc(definedchars);
 else
  inc(undefinedchars);
 end;
 s.free;
 Caption:=Format('[%d %d]',[definedchars,undefinedchars]);
end;

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: Mengen definieren

Beitrag von creed steiger »

Ganz ehrlich,einfach ist aber anders ;)

mal so in die Runde gefragt:
Wie lösen eigentlich anderes IDE´s/Sprachen das Problem mit den Kodierungen?

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: Mengen definieren

Beitrag von theo »

creed steiger hat geschrieben:Ganz ehrlich,einfach ist aber anders ;)
Wieso? Der Kern ist ja nur:

Code: Alles auswählen

s:=TUTF8Scanner.Create('aböcdüefgöhß');
 for i:=1 to s.Length do 
   case s.UTF8Chars[i] of  'a'..'z','A'..'Z','ß','_': inc(definedchars);
 end;
 s.free;
Finde ich ziemlich einfach.

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: Mengen definieren

Beitrag von creed steiger »

Für dich ist da klar einfach.Allerdings muss ein Anfänger erstmal auf
http://wiki.lazarus.freepascal.org/Theodp" onclick="window.open(this.href);return false;
kommen,offiziell ist das ja bei Lazarus nicht dabei?
Wenn du mal den Stecker ziehst ist es auch weg im SVN ist dein Code ja auch nicht.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Mengen definieren

Beitrag von mse »

creed steiger hat geschrieben: Wie lösen eigentlich anderes IDE´s/Sprachen das Problem mit den Kodierungen?
Sie arbeiten beispielsweise mit UnicodeString und sagen FPC dass der Quellcode in utf-8 codiert ist durch -Fcutf8 oder {$codepage utf8}. Falls du mehr über dieses Beispiel wissen willst frage bitte hier:
http://www.lazarusforum.de/viewforum.php?f=53

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Mengen definieren

Beitrag von carli »

theo hat geschrieben:@tictac: Wenn du bspw. wissen willst, wieviele "erlaubte Buchstaben" ein String enthält, kannst du das mit neuerem Compiler z.B. so lösen.
Hol dir die utf8tools hier: http://wiki.lazarus.freepascal.org/Theodp" onclick="window.open(this.href);return false;

Code: Alles auswählen

uses utf8scanner;
 
procedure TForm1.Button1Click(Sender: TObject);
var s:TUTF8Scanner;
  i,definedchars,undefinedchars:integer;
begin
 definedchars:=0;
 undefinedchars:=0;
 s:=TUTF8Scanner.Create('aböcdüefgöhß');
 for i:=1 to s.Length do
  case s.UTF8Chars[i] of
  'a'..'z','A'..'Z','ß','_': inc(definedchars);
 else
  inc(undefinedchars);
 end;
 s.free;
 Caption:=Format('[%d %d]',[definedchars,undefinedchars]);
end;
Nur zu doof, dass dieser Code quadratische Komplexität hat.

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: Mengen definieren

Beitrag von theo »

carli hat geschrieben: Nur zu doof, dass dieser Code quadratische Komplexität hat.
Du hast immer einen flotten Spruch auf Lager, was?
Bin durchaus an besseren Vorschlägen interessiert.
Dein bisheriger Beitrag in diesem Thread funktioniert nur leider gar nicht.
Zuletzt geändert von theo am Sa 21. Apr 2012, 14:11, insgesamt 1-mal geändert.

Antworten