Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Kaburagi

[PASCAL] Sortowanie w pliku .dat

Rekomendowane odpowiedzi

Witam, zrobiłem sobie program na bazę danych (jest mi potrzebny), ale nie wychodzi mi sortowanie (po nazwiskach) w owym pliku.

Użyłem metody bąbelkowej, bo jest prosta i chyba zrozumiała dla każdego, ale przy kompilacji, program krzyczy "type missmatch" w procedurze "sort".

 

Problem w tym, że na widać jak na tacy, że obydwie zmienne są stringami, stąd moje niezrozumienie całej tej sytuacji.

 

Czy moglibyście wskazać błąd i pomóc w jego rozwiązaniu?

 

Oto kod mojego programu:

 

program
      baza_danych;
uses
   crt,dos;
type
   osoba=record
   nazwisko,t:string[20];
   wiek:integer;
   end;
var
  plik: file of osoba;
  os:osoba;
  test:boolean;
  l:integer;

function menu:char;
var
  z:char;
  test:boolean;
begin
    repeat
    clrscr;
    writeln('[W] Zapisywanie elementow do pliku');
    writeln('[E] Wyswietlanie na ekranie');
    writeln('[s] Sortowanie');
    writeln('[D] Kasowanie');
    writeln('[K] Koniec');
    z:=upcase(readkey);
    if (z='W') or (z='K') or (z='E') or (z='D') then test:=true
                             else test:=false;
    until test;
menu:=z;
end;

procedure zapisz;
var
  wiek1:string[10];
  poz:integer;
  znak:char;
begin
    if fsearch('dane.dat','')='' then rewrite(plik)
                                 else
                                 begin
                                 reset(plik);
                                 seek(plik,filesize(plik));
                                 end;
    repeat
    with os do
         begin
              writeln('osoba ',filepos(plik));
              write('podaj nazwisko: '); readln(nazwisko);

              repeat
                    write('podaj wiek: '); readln(wiek1);
                    val(wiek1,wiek,poz);
                    if (wiek<=0) or (wiek>=200) or (poz<>0) then
                    begin
                         gotoxy(1,wherey-1);
                         delline;
                    end;
              until (wiek>0) and (wiek<200) and (poz=0);
         end;
             write(plik,os);
             l:=l+1;
             write('Esc konczy zapisywanie inny klawisz kontynuuje');
             znak:=readkey;
             gotoxy(1,wherey); delline;
             until znak=#27;
             close(plik);
end; {---------------------------------------koniec zapisz}

procedure wypisz;
begin
    clrscr;
    if fsearch('dane.dat','')='' then begin
                                           writeln('file not  found');
                                           delay(5000);
                                           exit;
                                           end;
writeln('----------zawartosc pliku DANE.DAT----------');
reset(plik);
while not eof(plik) do
begin
read(plik, os);
with os do
writeln(nazwisko:22,wiek:5);
if (filepos(plik)+1) mod 23 =0 then begin
                                     write('nacisnij neter');
                                     readln;
                                     clrscr;
                                     end;
end;  {-------------------------------------koniec wypisz}
writeln('nacisnij dowolny klawisz');
readkey;
close(plik);
end;

procedure sort;
var
  i,j:integer;
begin
    clrscr;
    reset(plik);
    read(plik,os);
    for i:=1 to l-1 do
        if os.nazwisko[i]>os.nazwisko[i+1] then
	with os do
           begin
                t:=nazwisko[i];
                nazwisko[i]:=nazwisko[i+1];
                nazwisko[i+1]:=t;
           end;
        writeln('Sortowanie zakonczone');
        readln;
end;


begin
    clrscr;
    assign(plik,'dane.dat');
    test:=false;
    repeat
          case menu of
               'W':zapisz;
               'E':wypisz;
               'S':sort;
               'D':erase(plik);
               'K':test:=true;
          end;
    until test;
end.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

w której linii?

procedure sort;
var
  i,j:integer;
begin
    clrscr;
    reset(plik);
    read(plik,os);
    for i:=1 to l-1 do
        if os.nazwisko[i]>os.nazwisko[i+1] then
	with os do
           begin
                t:=nazwisko[i];
                nazwisko[i]:=nazwisko[i+1];
                nazwisko[i+1]:=t; {-----------------------------------------------------w tej linii}
           end;
        writeln('Sortowanie zakonczone');
        readln;
end;

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

wyrzuć ograniczenie ze stringa i spróbuj jeszcze raz

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie pomaga...

Pierwsza moja myśl to może błąd gdzieś wyżej w kodzie, ale jak usuwam to jedną linijkę to reszta się kompiluje i działa... Nie śmiga tylko sortowanie... To zrozumiałe, bo bez tej jednej linijki cała procedura sortująca nie ma sensu.

 

Ale z linijką źle, bez też nie dobrze.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach


                t:=nazwisko[i];
                nazwisko[i]:=nazwisko[i+1];
                nazwisko[i+1]:=t; {-----------------------------------------------------w tej linii}

 

A nie jest przypadkiem tak że nazwisko[i+1] jest char-em (no przynajmniej w C by tak było) a chcesz do niego przypisać t - czyli string 20 elementowy?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Kaczor nie.

Zmienan t w tym momencie jest pusta. Chodzi o to by przechowała wartosć tylko i wyłącznie zawartość zmiennej os.nazwisko, później os.nazwisko zamienia się pozycjami z os.nazisko[i+1] i zmienna tymczasowa staje się kolejnym nazwiskiem, tak by trwał proces ciągły, do zakończenia się elementów.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Kaczor nie.

Zmienan t w tym momencie jest pusta. Chodzi o to by przechowała wartosć tylko i wyłącznie zawartość zmiennej os.nazwisko, później os.nazwisko zamienia się pozycjami z os.nazisko[i+1] i zmienna tymczasowa staje się kolejnym nazwiskiem, tak by trwał proces ciągły, do zakończenia się elementów.

Ale nie kłóci się to z tym:

nazwisko,t:string[20];

?

Jeśli nie to już się nie wtrącam - na pascalu się praktycznie nie znam.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie, nie powinno.

Na początku zmienna t, była poza recordami czyli było coś takiego:

 

nazwisko:string[20]
.
.
.
.
.
var
   t:string

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

rzecz w tym, że osoba to tak naprawdę zestaw osób (a nie tak jak powinno być pojedynczy element)

 

 

dodaj writeln( t ) ; i na razie nie dawaj linijki z podstawieniem; co się pokazuje na ekranie ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie pokazuje się nic.

Ale ja nie podstawiam całej osoby, ale jeden indeks.. a to już powienien być jeden element nie sądzisz?

 

 

gdy mamy tablicę

 

type
   os=array[1..10] of string;

 

to każdy jeden indeks (w tym przypadku od 1 do 10) to odrębne słowo, a nie zestaw słów.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

osoba {

imie, nazwisko, wiek, itd ;

}

 

osoby: array( 20 ) of osoba ;

 

a potem, żeby nie było ograniczeń w ilości:

osoba {

imie, nazwisko, wiek, itd ;

poprzednia, następna: ^osoba ;

}

 

osoby: ^osoba ;

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wybacz, nie rozumiem Twojego kodu.

 

Chodzi o to by rekordy przepisać do tablicy?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

myśl pseudokodem, łatwiej będzie zmieniać potem na właściwy język

 

tak, osoba to osoba, osoby to tablica osób

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Otóż moim zdaniem też poiwnno chodzić tak, jak podane jest na tej stronie...

Ale gdy tak robię to mam invalid qualifier.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie wiem, może napisałbyś tą procedurę sortowania opartą o resztę mojego programu..

Bo albo ja coś robię źle (i raczej to jest to), lub pascal dostał wariacji...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ok, rozkminiłem ;D

Dzięki za pomoc Januzi :)

Oby więcej było takich głów jak Twoja :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...