Prüfenbutton

Für Fragen von Einsteigern und Programmieranfängern...
Tuningmax
Beiträge: 9
Registriert: Do 10. Jun 2021, 12:32
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Prüfenbutton

Beitrag von Tuningmax »

Hallo zusammen,

ich brauche dringend eure hilfe.
ich muss ein Prüfen button einführen der einen schlüssel aus buchstaben A bis Z(benutzer gibt den schlüssel ein) prüft und dann den buchstaben aus dem alphabet löscht.

Genaue aufgabenstellung sowie das program habe ich angefügt...ich brauchsé dringend eure hilfe,da ich nicht mehr wiederhohlen kann und die klasse schaffen muss mir mein mpi lehrer aber ein strich durchziehen kann mit der aufgabe.Ich verzweifle an dieser ich g´habe schon stunden rumexperimentiert.

lg

Lazarus eingabe:

unit unit3b;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Menus,
Buttons, ExtCtrls;

type

{ TFKrypto_3b }

TFKrypto_3b = class(TForm)
BiBtEnde: TBitBtn;
BtVerschluesseln: TButton;
BtKlartextLaden: TButton;
BtChiffreSpeichern: TButton;
BtChiffreLaden: TButton;
BtEntschluesseln: TButton;
BtKlartextSpeichern: TButton;
BtSaeubern: TButton;
BtPruefen: TButton;
EdAlphabet: TEdit;
EdSchluessel: TEdit;
LbChiffre: TLabel;
LbAlphabet: TLabel;
LbSchluessel: TLabel;
LbKlartext: TLabel;
MemKlartext: TMemo;
MemChiffre: TMemo;
OpenDialogKlartext: TOpenDialog;
OpenDialogChiffre: TOpenDialog;
Panelinkorrekt: TPanel;
SaveDialogChiffre: TSaveDialog;
SaveDialogKlartext: TSaveDialog;
procedure BtChiffreLadenClick(Sender: TObject);
procedure BtChiffreSpeichernClick(Sender: TObject);
procedure BtEntschluesselnClick(Sender: TObject);
procedure BtKlartextSpeichernClick(Sender: TObject);
procedure BtKlartextLadenClick(Sender: TObject);
procedure BtVerschluesselnClick(Sender: TObject);
procedure BtSaeubernClick(Sender: TObject);

private

public

end;

var
FKrypto_3b: TFKrypto_3b;
Klartext, Alphabet, schluessel, chiffre, s1, s2 : String;
i, j : Integer;

implementation

{$R *.lfm}

{ TFKrypto_3b }

procedure TFKrypto_3b.BtVerschluesselnClick(Sender: TObject);
begin
Klartext := Uppercase(MemKlartext.text);
Alphabet := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
Schluessel := Uppercase(EdSchluessel.text);
chiffre := '';

for i := 1 to Length(Klartext) do // Klartext verschlüsseln
if Klartext in ['A'..'Z' ] then
begin
j := pos(Klartext,Alphabet);
chiffre := chiffre + schluessel[j];
end
else chiffre := chiffre + Klartext;

MemChiffre.Text := chiffre; // Ausgabe Chiffre

end;

procedure TFKrypto_3b.BtSaeubernClick(Sender: TObject);
begin
MemKlartext.Clear;
MemChiffre.Clear;
EdSchluessel.clear;

end;


procedure TFKrypto_3b.BtChiffreSpeichernClick(Sender: TObject);
begin
if SaveDialogChiffre.Execute then MemChiffre.lines.SaveToFile(SaveDialogChiffre.FileName);
end;

procedure TFKrypto_3b.BtEntschluesselnClick(Sender: TObject);
begin
chiffre := MemChiffre.text;
Alphabet := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
Schluessel := Uppercase(EdSchluessel.text);
Klartext :='';

for i := 1 to Length(chiffre) do // Chiffre entschlüsseln
if chiffre in ['A'..'Z' ] then
begin
j := pos(chiffre,schluessel);
Klartext := Klartext + alphabet[j];
end
else Klartext := Klartext + chiffre;

MemKlartext.Text := Klartext; // Ausgabe Klartext

end;

procedure TFKrypto_3b.BtKlartextSpeichernClick(Sender: TObject);
begin
if SaveDialogKlartext.Execute then MemKlartext.lines.SaveToFile(SaveDialogKlartext.FileName);
end;

procedure TFKrypto_3b.BtKlartextLadenClick(Sender: TObject);
begin
if OpenDialogKlartext.Execute then
begin
MemKlartext.clear;
MemKlartext.lines.LoadFromFile(OpenDialogKlartext.FileName)
end;
end;


procedure TFKrypto_3b.BtChiffreLadenClick(Sender: TObject);
begin
if OpenDialogChiffre.Execute then
begin
MemChiffre.clear;
MemChiffre.lines.LoadFromFile(OpenDialogChiffre.FileName)
end;
end;

end.


Genaue aufgabe:

Bei der Eingabe des Schlüssels durch den Benutzer können natürlich Eingabefehler auftreten, z.B. ein
Buchstabe taucht mehrfach auf oder die Länge passt nicht. Daher empfiehlt es sich, dem Benutzer die
Möglichkeit zu geben, seinen Schlüssel prüfen zu lassen. Genau das sollst du nun angehen!
Auf der nächsten Seite findest du eine Abbildung, die ein entsprechendes Fenster (Formular) darstellt. Durch Betätigen der Schaltfläche ‚Prüfen‘ wird der Schlüssel auf Korrektheit geprüft und in jedem Fall
eine Information ausgegeben. Erweitere dein Formular zunächst um die neuen Komponenten (ein
Button und ein Panel). Wie muss die zugehörige Ereignisbehandlungsroutine im Quelltext nun
aufgebaut sein? Schreibe sie anhand der folgenden Anleitung und teste dein erweitertes Programm. Jeder Buchstabe des Schlüssels wird – nacheinander – gelesen und im Alphabet unmittelbar
danach gelöscht. Wenn der Schlüssel korrekt ist, darf im Alphabet-String nichts mehr stehen: er
muss dann leer sein, denn jeder Buchstabe des Alphabets muss im Schlüssel ja genau einmal
verwendet werden.
Dateianhänge
Screenshot (7).png
(67.75 KiB) Noch nie heruntergeladen
Screenshot (6).png
(65.54 KiB) Noch nie heruntergeladen
Screenshot (5).png
(68.13 KiB) Noch nie heruntergeladen
Screenshot (4).png
(298.28 KiB) Noch nie heruntergeladen

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Prüfenbutton

Beitrag von six1 »

schöne Aufgabe und sicher lösbar...

Schau mal StringReplace an. Damit könntest du Zeichen in einem Alphabet-String entfernen.

Beispiel, um alle Vorkommen von 'A' in einem String durch '' (nichts) zu ersetzen:
Stringreplace( AlphabetString, 'A', '', [rfreplaceall]);
Gruß, Michael

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: Prüfenbutton

Beitrag von Thandor »

Für die Prüfung auf doppelte Buchstaben kann man ein Array['A'..'Z'] of Bolean anlegen und den String Zeichen für Zeichen durchgehen und das Array prüfen. Wenn True, kam der Buchstabe schon mal vor, wenn false nicht. Anschließend mit Delete das Zeichen aus den Alphabetstring entfernen.
Was für Probleme sind zu erwarten, wenn du mit einer Schleife die Zeichen des Alphabetstrings durchläufst und aber mit Delete Zeichen entfernst?

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Prüfenbutton

Beitrag von Winni »

Hi!

Ein typisches Beispiel für die so oft vergessenen Sets.

Code: Alles auswählen

var AlphaSet : Set of Char = ['A'..'Z'];
Und dann brauchst Du noch

Code: Alles auswählen

If 'A' in Alphaset then exclude (Alphaset,'A');

Macht das Leben deutlich unkomplizierter.

Winni

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: Prüfenbutton

Beitrag von Thandor »

Ich glaube wir müssen mal die Aufgabe sortieren...

Ich habe die Aufgabe so verstanden:
1. Es gibt ein Schlüssel, welcher vom Benutzer eingegeben wird.
2. Der Schlüssel muss jeden Buchstaben des Alphabets genau einmal enthalten, in belibiger Reihenfolge.
3. Es gibt ein Alphabet-String, der jeden Buchstaben genau einmal enhält zur überprüfung der obigen Bedingung.
4. Der Schlüssel soll Buchstabe für Buchstabe geprüft werden.
5. Der aktuelle Buchhstabe wird im Alphabet-String gesucht.
5a1. Wenn der Buchstabe im Alphabet-String existiert wird dieser aus dem Alphabet-String entfernt.
5b1. Wenn der Buchstabe nicht im Alphabet-String existiert, dann kam er bereits schon einmal im Schlüssel vor und somit ist der Schlüssel ungültig.
5b2 Einen Fehlerstring Erzeugen für die Ausgabe, dass der Schlüssel falsch ist.
5b3 Die Prüfung kann an dieser Stelle abgebrochen werden, da der Schlüssel ab hier falsch ist.
6 Wenn kein Fehler gefunden wurde, dann die Nachricht ausgeben, dass der Schlüssel gültig ist.

Also Ich hatte in meiner ersten Antwort auch einen Denkfehler, wo ich die Aufgabe nicht richtig erfasst hatte. Da der Alphabet-String anscheinend vorgegeben ist, fallen dann wohl andere Lösungen weg. Da wir nicht wissen, was für Funktionalitäten von Pascal bereits in dem Kurs des Threadserstellers behandelt wurden, ist es, meiner Meinung nach, nicht ziehlführend Techniken vorzuschlagen, die in der Schule leider oft nicht geleert werden. Wenn Sets bereits vorgekommen sind würde ich erwarten, dass die Aufgabenstellung diese dann auch nutzt, wenn die Datenstruktur, anhand derer geprüft werden soll, vorgegeben ist.

aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

Re: Prüfenbutton

Beitrag von aro »

Hallo,
das kann nicht funktionieren!

Schaue Dir die Zeile
j := pos(Klartext,Alphabet);
genau an.

J vom Type Integer soll die Position eines Zeichens bekommen.

Klartext ist Eine Zeichenkett.

und Pos gibt die Position zurück, an der sich Klartext in Alphabet befindet.

So lange Klartext keine Zeichenkette ist wie ABC oder FGH wirds Du immer 0 als Ergebnis bekommen!

Tuningmax
Beiträge: 9
Registriert: Do 10. Jun 2021, 12:32
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Prüfenbutton

Beitrag von Tuningmax »

Winni hat geschrieben:
Do 10. Jun 2021, 14:05
Hi!

Ein typisches Beispiel für die so oft vergessenen Sets.

Code: Alles auswählen

var AlphaSet : Set of Char = ['A'..'Z'];
Und dann brauchst Du noch

Code: Alles auswählen

If 'A' in Alphaset then exclude (Alphaset,'A');

Macht das Leben deutlich unkomplizierter.

Winni

Tuningmax
Beiträge: 9
Registriert: Do 10. Jun 2021, 12:32
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Prüfenbutton

Beitrag von Tuningmax »

Winni hat geschrieben:
Do 10. Jun 2021, 14:05
Hi!

Ein typisches Beispiel für die so oft vergessenen Sets.

Code: Alles auswählen

var AlphaSet : Set of Char = ['A'..'Z'];
Und dann brauchst Du noch

Code: Alles auswählen

If 'A' in Alphaset then exclude (Alphaset,'A');

Macht das Leben deutlich unkomplizierter.

Winni

Wie muss ich die dann einfügen?

Ich verstehe leider komplett Lazarus nicht,bzw wie ich das jetzt da einfügen muss...

Lg

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: Prüfenbutton

Beitrag von gladio »

eventuell ist es auch hilfreich mal etwas moderneres zu installieren:
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Prüfenbutton

Beitrag von Winni »

Hi!

Thandor hat das Ganze dankenswerterweise schon mal strukturiert.

Daran hab ich mich auf die Schnelle gehalten und mal ein Project draus gemacht.

Lies Dir das aber durch und versuche es zu verstehen.

Folgende Tricks wurden angewandt:

Das Edit1 hat eine maximale Länge von 1. So können gar keine längeren Eingaben getätigt werden.
Man muss nur prüfen, ob die Eingabe leer ist.

Zweitens ist die Eingabe auf ecUppercase gestellt - so werden automatisch Großbuchstaben eingegeben.
Die fehlerhafte Eingabe von Kleinbuchstaben ist ausgeschlossen.

Hoffe es hilft.
Winni
Dateianhänge
pruefen.zip
(126.92 KiB) 61-mal heruntergeladen

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Prüfenbutton

Beitrag von Winni »

gladio hat geschrieben:
Do 10. Jun 2021, 18:37
eventuell ist es auch hilfreich mal etwas moderneres zu installieren:
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Was denn??? Elektro-Autos??

aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

Re: Prüfenbutton

Beitrag von aro »

Hallo,

von mir würde Tuningmax eine glatte 6 bekommen, wenn er die Arbeit so abgibt !

Die Aufgabenstellung lautete ganz klar "tue es" und nicht "suche dir jemanden der es für dich tut und gib es für deine eigene Leistung aus".

Das sich Abschreiben nicht lohnt kann man doch jeden Tag in den Nachrichten hören, wenn ein Minister seinen Doktortitel zurückgeben muss.

Das hat doch nichts mehr mit Hilfestellung zu tun.
Wenn der Lehrer das Programm mit den bisherigen Leistungen vergleicht erkennt er sofort, das damit etwas nicht stimmt.
Aber vielleicht verfolgt er ja sogar das Thema in diesem Forum.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Prüfenbutton

Beitrag von Winni »

aro hat geschrieben:
Sa 12. Jun 2021, 11:34
Hallo,

von mir würde Tuningmax eine glatte 6 bekommen, wenn er die Arbeit so abgibt !

Die Aufgabenstellung lautete ganz klar "tue es" und nicht "suche dir jemanden der es für dich tut und gib es für deine eigene Leistung aus".

Das sich Abschreiben nicht lohnt kann man doch jeden Tag in den Nachrichten hören, wenn ein Minister seinen Doktortitel zurückgeben muss.

Das hat doch nichts mehr mit Hilfestellung zu tun.
Wenn der Lehrer das Programm mit den bisherigen Leistungen vergleicht erkennt er sofort, das damit etwas nicht stimmt.
Aber vielleicht verfolgt er ja sogar das Thema in diesem Forum.
Ach - Du hast nie abgeschrieben?

Kopfschüttel.

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

Re: Prüfenbutton

Beitrag von theo »

Ich sehe das auch wie aro.
Auf die Sprünge helfen: Ja, Hausaufgaben pfannenfertig lösen: Nein.

aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

Re: Prüfenbutton

Beitrag von aro »

Hallo Winni,
auch wenn Du mir das nicht glauben wirst, definitiv Nein !

Erstens wird man vom Abschreiben nicht schlauer und das waren damals auch ganz andere Zeiten.

Wir haben fürs Leben gelernt und nicht für die nächste Arbeit. In der Klasse war bei den Arbeiten absolute Ruhe und nicht so ein Chaos wie ich es ab und zu im Fernsehen sehe.
Da wäre jeder Betrugsversuch sofort entdeckt worden. Und die es wirklich mal versucht haben und erwischt wurden, erhielten sehr lehrhafte Konsequenzen.
Und das Internet gab es auch noch nicht, das man sich mal mühelos eine Hausaufgabe besorgen konnte.

Es waren andere Zeiten, aber ich möchte nicht mit heute tauschen

Antworten