[Pascal] Książka telefoniczna

connor01
Użytkownik
Użytkownik
Posty: 37
Rejestracja: 12 lut 2014, o 13:38
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 3 razy

[Pascal] Książka telefoniczna

Post autor: connor01 »

Witam.
Mam do napisania książkę telefoniczną w pascalu, napisałem już fragment kodu, niestety przy dodawaniu nowego kontaktu tworzy się tylko pusty plik.

Kod: Zaznacz cały

program Project1;
type
  osoba=record
    imie: string;
    telefon: integer;
  end;
var
  a: integer;
  imie: array [1..100] of osoba;
  telefon: array [1..100] of osoba;
  plik: textfile;
  imie1: 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);
              writeln ('Dodaj nowy kontakt');
              readln (ktos.imie);
              writeln ('Dodaj numer');
              readln (ktos.telefon);
              writeln (plik,imie1);
              ktos.imie:= imie1;
              closefile (plik);
            end;
          end;
  until a=7 ;
end.
Awatar użytkownika
Kacperdev
Użytkownik
Użytkownik
Posty: 3260
Rejestracja: 23 mar 2010, o 19:19
Płeć: Mężczyzna
Lokalizacja: Bydgoszcz
Podziękował: 17 razy
Pomógł: 686 razy

[Pascal] Książka telefoniczna

Post autor: Kacperdev »

Szczerze mówiąc totalnie do bani.
Nie wiadomo co tu się dzieje. Skoro stworzyłeś typ danych rekordowy, to go tablicuj:

Kod: Zaznacz cały

ktos : array [1..100] of osoba
Wtedy do poszczególnych osób możesz się odwoływać

Kod: Zaznacz cały

ktos[1].imie:='Andżej';
To co napisałeś nie ma prawa dobrze działać bo nie ma prawa dobrze się skompilować.

Zamiast

Kod: Zaznacz cały

 assignfile (plik,'C:\Książka telefoniczna.txt');

Kod: Zaznacz cały

 assign (plik,'C:\Książka telefoniczna.txt');
W pliku w ogóle nie indeksujesz danych.
To tak na początek.
connor01
Użytkownik
Użytkownik
Posty: 37
Rejestracja: 12 lut 2014, o 13:38
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 3 razy

[Pascal] Książka telefoniczna

Post autor: connor01 »

Trochę poprawiłem, ale teraz wywala mi błędy

Kod: Zaznacz cały

var
  a: integer;
  ktos: array [1..100] of osoba;
  plik: text;

Kod: Zaznacz cały

begin
  assign (plik,'C:\Książka telefoniczna.txt');
  rewrite (plik);
  writeln ('Dodaj nowy kontakt');
  readln (ktos.imie);
  writeln ('Dodaj numer');
  readln (ktos.telefon);
  close (plik);
end;
Awatar użytkownika
Kacperdev
Użytkownik
Użytkownik
Posty: 3260
Rejestracja: 23 mar 2010, o 19:19
Płeć: Mężczyzna
Lokalizacja: Bydgoszcz
Podziękował: 17 razy
Pomógł: 686 razy

[Pascal] Książka telefoniczna

Post autor: Kacperdev »

Zanosi się na dłuższą bajkę :D.

Chyba nie rozumiesz logiki programu.

Tworzymy tablicę struktury, bo nasza ksiązka telefoniczna nie bedzie posiadała jednego kontaktu. :D
Tablicowanie pozwala indeksować naszą listę.

Zrezygnowałbym w ogole z

Kod: Zaznacz cały

plik: text;
na rzecz

Kod: Zaznacz cały

plik : file of osoba
. Dzieki temu nie bedziemy musieli do pliku zapisywać oddzielnie każdej komórki z recordu, tylko od razu cały record. Poza tym pliki binarne zwiększają wydajność programu.

Potrzebne vary:

Kod: Zaznacz cały

var
  ktos: array [1..100] of osoba;
  plik: file of osoba;
  name : string;
  phone : integer;
  i : integer;
Teraz główna ciało:

Otwierasz plik i robisz w nim cuda. :D. W otwartym pliiku próbujesz wypisywać na ekranie. Dlatego burzy się kompilator. Poza tym 'ktos' jest zdefinowane jako tablica a nie pojedyncza zmienna stąd tak nie możesz

Kod: Zaznacz cały

program Baza;
uses crt;
type
  osoba=record
    imie: string;
    telefon: integer;
  end;
var
  ktos: array [1..100] of osoba;
  plik:file of osoba;
  name : string;
  phone : integer;
  i : integer ;

begin
for i:=1 to 5  do
begin
  readln(name);
  ktos[i].imie:=name;
  readln(phone);
  ktos[i].telefon:=phone;
end;


  assign(plik,'baza.txt');
  rewrite(plik);
  for i:=1 to 5  do write(plik,ktos[i]);
  close(plik);

end.
Przykładowy kod do zapisu informacji o 5 osobach.
connor01
Użytkownik
Użytkownik
Posty: 37
Rejestracja: 12 lut 2014, o 13:38
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 3 razy

[Pascal] Książka telefoniczna

Post autor: connor01 »

Też chciałem użyć

Kod: Zaznacz cały

plik : file of osoba
ale przy próbie kompilacji wywala mi błąd

Kod: Zaznacz cały

[dcc32 Error] Project3.dpr(9): E2155 Type 'osoba' needs finalization - not allowed in file type
Używam Delphi
Awatar użytkownika
Kacperdev
Użytkownik
Użytkownik
Posty: 3260
Rejestracja: 23 mar 2010, o 19:19
Płeć: Mężczyzna
Lokalizacja: Bydgoszcz
Podziękował: 17 razy
Pomógł: 686 razy

[Pascal] Książka telefoniczna

Post autor: Kacperdev »

Skopiowałeś dokładnie mój kod i go skompilowałeś?
connor01
Użytkownik
Użytkownik
Posty: 37
Rejestracja: 12 lut 2014, o 13:38
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 3 razy

[Pascal] Książka telefoniczna

Post autor: connor01 »

Skopiowałem z tym, że musiałem usunąć moduł crt bo delphi go nie obsługuje.-- 28 maja 2014, o 19:09 --To powiesz co mam zrobić z tym błędem?
ODPOWIEDZ