Telefonbuch mit Record in PASCAL

Aufrufe: 883     Aktiv: 13.05.2021 um 12:24

0

Hallo, ich habe mal ein Programm geschrieben, dass mit Textdateien arbeitet. Jedes Element bekommt dabei eine Nummer. Darüber suche ich auch. Wie kann man das Umschreiben, sodass man über Vor- und Nachname suchen kann? ich kriege das einfach nicht hin. Ich hänge das Programm dann mal an

program zzzzzzzzzz; uses crt, dos; type TAltNeu= (neu,alt); Telefonbuch = record Name, Vorname: string[20] ; Telefonnummer:integer;end; TElement=Telefonbuch; Tdatei= File of TElement; var datei: Tdatei ; function dateioeffnen( var datei:tdatei;altneu:TAltNeu):boolean; var pfad: string; begin write('Pfad:'); readln(pfad); {$I-} assign(datei,pfad); if altneu=neu then rewrite(datei) else reset(datei); {$I+} dateioeffnen:= IOResult=0;

end;

function startok (var datei:tdatei) :boolean ; var ch:char; begin clrscr; writeln(utf8decode('Wählen Sie:')); writeln(utf8decode('N) für neue Datei')); writeln(utf8decode('B) für bestehende Datei')); writeln(utf8decode('A) für Ende')); repeat ch:=readkey; until ch in ['a','A','n','N','b','B']; case ch of 'n','N': startok:= dateioeffnen(datei,neu) ; 'b','B': startok:= dateioeffnen(datei,alt); 'a','A':startok:=false; end ;

end; procedure Elementausgabe (element:telement); begin with element do begin write(FilePos(datei):3,':'); writeln(Vorname,',',Name); writeln(' ',Telefonnummer); end; end; procedure ElementEingabe (var element:telement); begin with element do begin write('Name:'); readln(Name); write('Vorname:'); readln(vorname); write('Telefonnummer:'); readln(telefonnummer); end; end;

procedure Aendern(var datei:tdatei); var ch:char; nummer:integer; ELEMENT:TElement ;

begin clrscr; write(utf8decode('Welche Daten ändern?')); readln(nummer); dec(nummer); if nummer<FileSize(datei) then begin seek(datei,nummer); read(datei,element); Elementausgabe(element); writeln(utf8decode('Dieses Element ändern (J/N)?')); ch:=readkey; if ch in ['j','J'] then begin elementeingabe(element); seek(datei,nummer); write(datei,element); end end; end;

procedure NeuEingabe( var datei:tdatei); var neuesElement:TElement; begin clrscr; seek(datei, FileSize(datei)); write('Neues Element mit der Nummer'); writeln(FilePos(datei)+1); ElementEingabe(neuesElement); write(datei,neuesElement);

end;

procedure Zeigen(var datei:tdatei ); const maxzeile=5 ; var element:Telement; ch:char; nummer:integer; begin clrscr;writeln('Nummer:'); readln(nummer); dec(nummer); if nummer<FileSize(datei) then begin seek(datei,nummer); read(datei,element); clrscr; Elementausgabe(element); end; readkey;

end;

procedure Loeschen( var datei:tdatei); var nummer:integer; ch:char; ELEMENT:TElement ; begin clrscr; write(utf8decode('Welche Daten ändern?')); readln(nummer); dec(nummer); if nummer<FileSize(datei) then begin seek(datei,nummer); read(datei,element); Elementausgabe(element); writeln(utf8decode('Dieses Element ändern (J/N)?')); ch:=readkey; if ch in ['j','J'] then begin rewrite(datei,nummer); end;

end;

end;

procedure menu (var datei:tdatei); var ch:char; begin repeat clrscr; writeln('Wählen Sie:'); writeln(utf8decode(' A)Ändern eines Datenelements')); writeln('N)Eingabe eines neuen Elements'); writeln('Z)Zeigen aller Daten'); writeln(utf8decode('L)Löschen eines Elements')); writeln('E) Ende'); repeat ch:=readkey; until ch in ['a','A','n','N','z','Z','l','L','e','E'] ; Case ch of 'a','A':Aendern(datei); 'n','N':NeuEingabe(datei); 'z','Z':zeigen(datei); 'l','L':Loeschen(datei); end;

until ch in ['e','E'] ; close(datei); end;

begin if startok(datei) then menu(datei); end.

Diese Frage melden
gefragt

Punkte: 10

 
Kommentar schreiben
1 Antwort
0

Hallo jemabrauns, meine Kenntnisse in Pascal sind leider 35 Jahre alt, also nicht mehr ganz frisch. Seither bin ich in C unterwegs. Ich habe mal Dein Programm angeschaut. Soweit reichen meine Kenntnisse noch. Wenn Du es einfach gestalten willst musst Du halt das ganze Telefonbuch durchsuchen und den eingegebenen Namen mit den Namen aus der Datei vergleichen.

  1. Du lässt den Suchnamen eingeben. 2. Du gehst die Datei wie bei „zeigen“ durch und vergleichst den eigegebenen Suchnamen mit dem gespeicherten Namen. 3. Wenn Du den Namen gefunden hast gibst Du ihn mit der Elementnummer aus. 4. Gibt es mehrere Treffer gibst Du alle mit der Elementnummer aus und lässt am Ende das gewünschte Element auswählen. 5. Wenn Du den Namen nicht findest gibt es eine Fehlermeldung. Alles andere wird zu aufwändig. Du müsstest Dir zusätzlich zur Datendatei eine Indexdatei mit Namen und der Datensatznummer generieren. Diese sollte dann idealerweise sortiert sein damit man den Namen schnell finden kann. Stichwort B-Baum. Speziell bei Dingen wie Name hast Du dann auch noch das Problem, dass halb Deutschland Thomas Müller heißt. Ein Index muss aber eindeutig sein. Dann brauchst Du noch ein weiteres Kriterium um diese Eindeutigkeit herzustellen – also lieber bleiben lassen.

Sicher ist die Stringanalyse der interessanteste Teil der neuen Prozedur. Hier kann man sich richtig austoben und z.B. mit Wildcards wie ? oder * arbeiten. Was Pascal hier heutzutage in der Run Time Library als Unterstützung bietet weiß ich leider nicht. Du kannst das ja Stück für Stück verfeinern. Am besten schreibst Du für die Analyse des Namens eine eigene Funktion. Im ersten Schritt suchst Du exakte Treffer. Karl-Heinz ist nur Karl-Heinz und nicht Karlheinz. Dann erweiterst Du diese um „uppercase „ (heißt so in C). Dann ist Karl-Heinz auch karl-heinz. Wenn Du dann noch Lust hast kannst Du die Wildcards einbauen. Dann wäre karl* = Karl-Heinz, karl-heinz, karl, Karl, Karl-Heinrich…. Ich wünsche Dir viel Spaß beim Realisieren. Gruß jobe.

Diese Antwort melden
geantwortet

Sonstiger Berufsstatus, Punkte: 505

 

Kommentar schreiben