Program do zarządzania książką telefoniczną

0

Witam.
Mam do napisania książkę telefoniczną w pascalu, która ma zawierać takie opcje:

  1. Dodaj osobę
  2. Wyświetl wszystkich
  3. Wyświetl osobę nr.
  4. Znajdź osobę po imieniu
  5. Edytuj osobę nr.
  6. Usuń osobę nr.

Coś napisałem ale niestety nie działa

program Project9;
{$APPTYPE CONSOLE}
type
  osoba=record
    imie: string [100];
    telefon: integer;
  end;
var
  a: integer;
  imie: array [1..100] of osoba;
  telefon: array [1..100] of osoba;
  plik: textfile;
  napis: string;
  tel: integer;
  ktos: osoba;
begin
  repeat
    writeln ('1. Dodaj osobe');
    writeln ('2. Wyswietl wszystkich');
    writeln ('3. Wyswietl osobe nr.');
    writeln ('4. Znajdz osobe po imieniu');
    writeln ('5. Edytuj osobe nr.');
    writeln ('6. Usun osobe nr.');
    writeln;
    readln (a);
      case a of
        1:begin
            assignfile (plik,'C:\Ksišżka telefoniczna.txt');
            rewrite (plik);
              ktos.imie:= (napis);
              ktos.telefon:= (tel);
              closefile (plik);
            end;
          end;
  until a=7 ;
end.

dodanie kodu do treści posta - furious programming

0

A cokolwiek rozumiesz w tym coś co niby napisałeś?

0

No właśnie nie wiem jak to napisać by można było dodawać nowe osoby i numery telefonu

0

@connor - przede wszystkim zastanów się nad tym, jak ten program ma działać; Masz jasno określoną funkcjonalność, więc nie powinieneś mieć z tym większego problemu;

Przede wszystkim zwróć uwagę na to, że masz zaimplementować sześć różnych opcji, do których wypada napisać tyle samo funkcji/procedur (dla każdej po jednej); Najpierw zaprogramuj sobie kod głównej pętli do wyboru danej opcji; Od razu wspomnę, że pobieranie liczby z klawiatury jest ryzykowne, bo jak użytkownik wpisze ciąg, który nie jest liczbą - załatwi program; Pobieraj numer opcji pod postacią łańcucha znaków, który następnie konwertuj na liczbę np. funkcją TryStrToInt; Jeśli ciąg znaków uda się poprawnie przekonwertować to sprawdź, czy taka opcja istnieje; Jeśli nie istnieje - pokaż odpowiedni komunikat, a jeśli istnieje - przejdź do niej; W przypadku, gdy użytkownik podał wartość nieliczbową - pokaż komunikat i poproś o ponowne wprowadzenie numeru opcji; Główną pętlę przerwij wtedy, gdy użytkownik poda numer ostatniej opcji (czyli wyjścia z programu);

Przede wszystkim napisz sobie procedury do ładowania bazy z pliku oraz zapisu bazy z pamięci do pliku; Zaraz z poczatku programu wykonaj załadowanie bazy do macierzy, a na końcy programu zapisz bazę do pliku, choćby pustą; Jeśli korzystasz z pliku tekstowego do przechowywania bazy, to zapisz sobie w pierwszym wierszu pliku ilość rekordów bazy - będzie łatwiej wczytywać dane;

Poza tym nie korzystaj ze statycznej macierzy, bo nie wiesz ile rekordów w niej będzie; Są przecież macierze dynamiczne, którym możesz ustalać rozmiar w dowolnym momencie działania programu; Rozmiar ten będziesz musiał ustalić przede wszystkim w procedurze ładującej bazę z pliku, a także później, przy dodawaniu nowych rekordów lub ich usuwaniu;

Jeśli chodzi o rekord z informacjami o pojedynczej osobie, to niepotrzebnie używasz okrojonego do 100 znaków łańcucha - zamień go na zwykły String; Okrojone łańcuchy należy używać w przypadku, gdy rekordy zapisywane są do pliku typowanego;

To tyle na wstępie - czas uruchomić środowisko i klepać kod; Jeśli czegoś nie wiesz - pytaj, ale jeżeli brakuje Ci wiedzy z zakresu podstaw programowania w Delphi - zapoznaj się z jakimś kursem.

0

Ja bym jeszcze dodał, że należy użyć prawidłowego kodowania w nazwie pliku. Bo tutaj u Ciebie może być problem, co widać oo wklejeniu kodu. I zapis do C:\ też jest złym pomysłem ze względu na problemy z UAC i prawami zapisu do tej lokalizacji, których user może nie mieć.

0

W starym Delphi7 kodowanie łańcucha nazwy pliku raczej nie powinno sprawiać problemu, ale mimo wszystko lepiej nie używać znaków diakrytycznych - to brzydki rozwiązanie; Poza tym pod Delphi7, znaki diakrytyczne w konsoli nie zostaną prawidłowo wyświetlone, więc i tak nie ma sensu ich używać w kodzie;

W przypadku Lazarusa, użycie znaków diakrytycznych będzie sprawiać problemy, dlatego że w pamięci łańcuchy przechowywane są w postaci pewnie UTF, bo uniwersalne znaki zajmować będą po jednym bajcie, a diakrytyczne po dwa bajty; Trzeba by więc użyć funkcji konwertujących, np. Utf8ToAnsi, żeby móc załadować poprawnie taki plik; Natomiast konsola domyślnie także nie wyświetli poprawnie znaków diakrytycznych, więc trzeba użyć funkcji np. Utf8ToConsole;

Najlepszym rozwiązaniem będzie stworzenie pliku w tym samym katalogu, co plik wykonywalny aplikacji, i odniesienie się do niego przez pobranie ścieżki z ParamStr(0) (czy tam Application.ExeName) za pomocą funkcji ExtractFilePath, oraz dodanie do niej samej nazwy pliku bazy:

strFileName := ExtractFilePath(ParamStr(0)) + 'nazwa_pliku.bazy';

Jednak pytacz nie napisał jakiego środowiska czy kompilatora używa, więc dokładnie nie możemy określić właściwej drogi; Obstawiam, że używa Delphi7.

1 użytkowników online, w tym zalogowanych: 0, gości: 1