Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyj±tek www.elektroda.pl do Adblock.
Dzięki temu, że ogl±dasz reklamy, wspierasz portal i użytkowników.

[TP] Wyszukiwanie w pliku oraz sortowanie b±belkowe

mariusz181818 15 Cze 2010 17:22 1506 4
  • #1 15 Cze 2010 17:22
    mariusz181818
    Poziom 1  

    Witam potrzebuje pomocy w napisaniu programu. Program ma być spisem bibliotecznym(baza danych (autor, nazwa ksi±żki, Id ksi±żki)) i ma on zawierać:
    - wprowadzenie informacji
    - wy¶wietlenie informacji
    - wyszukanie informacji
    - zapisanie informacji
    - wczytanie informacji
    - sortowanie b±belkowe informacji(najlepiej według wszystkich( tytul, autor, id) albo chociaż jednego)
    Większo¶ć z tego zrobiłem ale stan±łem nad wyszukiwaniem i sortowaniem:/
    Tu podaje kod:

    Code:
    program spis_bib;                   {nazwa programu}
    
    uses crt;                       {modul crt}
    const x=2;                      {stala czyli ile bedzie ksiazek do wprowadenia}
    type zbior=record              {rekord czyli zbior pol dotyczacych okreslonej ksiazki}
    tyt:string[40] ;  {tytul ksiaki}
    aut:string[30] ;  {autor ksiazki}
    id:string[20] ;  {numer identyfikacyjny ksiazki}
    end;
    var spis:array[1..x] of zbior;
    var ksiazka:zbior;
    var plik:file of zbior;
    var q:char;
    procedure wpro; {procedura wprowadzania danych}
    var i:byte;
    begin
    for i:=1 to x do
        begin
        writeln('Podaj tytul ksiazki');
        readln(spis[i].tyt);
        writeln('Podaj autora ksiazki');
        readln(spis[i].aut);
        writeln('Podaj ID ksiazki');
        readln(spis[i].id);
        end;
    end;
    procedure pokaz;     {procedura pokaze wprowadzone wczesniej dane}
    var i:byte;
    begin
    writeln('Wprowadziles natepujace dane:') ;
    for i:=1 to x do
        begin
        with spis[i] do
             begin
             writeln;
             writeln;
             writeln('-----------------------------------------------------------');
             write('Tytul: ',tyt,'   ');
             write('   Autor: ',aut);
             writeln('     ID    ',id);
             writeln;
             end;
        end;
    end;
    procedure zapis;        {zapisze dane do pliku}
    var i:integer;




    begin
    assign(plik,'c:\spis_bibl.dat'); {kojarzymy zmienna plikowa z fizycznym zbiorem na dysku}
    rewrite(plik);                  {tworzymy i  otwieramy skojarzony plik}
    for i:=1 to x do
        begin ksiazka:=spis[i];
        write(plik,ksiazka);
        end;
    close(plik);                  {zamykamy plik}
    end;
    procedure czytaj;        {wczytywanie poprzednio zapisanego pliku}
    var i:integer;
    begin
    assign(plik,'c:\spis_bibl.dat');     {kojarzymy zmienna plikowa z fizycznym zbiorem na dysku}
    reset(plik);           {otwieramy plik}
    for i:=1 to x do
        begin
        read(plik,ksiazka);
        spis[i]:=ksiazka;
        end;
    close(plik);
    end;

    BEGIN {PROGRAM GLOWNY- WYWOLANIE PROCEDUR}
    repeat
    clrscr;
    wpro;
    pokaz;
          writeln('Czy zapisac elementy(t/n)');
          readln(q);
          if q='t' then
           begin
    zapis;
    writeln('Elementy zosaly zapisane')
    end
           else
           keypressed;
           writeln('Aby zakonczyc program nacisnij klawisz "t" w innym przypadku dowolny ');
           until
           readkey='t';
    end.


    Prosił bym o pomoc w dokonczeniu tego programu...

    Regulamin, p. 11 - poprawiłem temat.
    [Dr.Vee]

    0 4
  • #2 15 Cze 2010 20:38
    lanky
    Poziom 17  

    A czemu sortowanie b±belkowe ? Jest chyba najwolniejsze ze wszystkich jakie znam. No ale dobra tak ładnie wkleiłe¶ kod to ci trochę podpowiem.

    Code:

    procedure bombel_Spis;
    var
    i,j: integer;
    tmp: string;
    begin
    for i:=0 to High(Spis)-1 do
    for j:=0 to High(Spis)-1 do

        if Spis[j].tyt[1] > Spis[j+1].tyt[1] then
          begin
            tmp := Spis[j].tyt;
            Spis[j].tyt := Spis[j+1].tyt;
            Spis[j+1].tyt := tmp;
          end;
    end;
    ---------------------
    var
    Spis: array[0..3] of Tzbior;
    i: byte;
    begin
      Spis[0].tyt:= 'Zorro';
      Spis[1].tyt:= 'Geisha';
      Spis[2].tyt:= 'Ninia';
      Spis[3].tyt:= 'Armagedon';
     
      Bombel_Spis;
     
      for i:= 0 to 3 do writeln(Spis[i].tyt);
      readln;

    Co do szukania użyj modułu system
    Code:

     for i:= 0 to 3 do
      if Pos('Zorro',Spis[i].tyt) = 1 then writeln('Jest Zorro')else
      if i = 3 then writeln('Ohh.. Została wypożyczona przez D"Artagnana');


    Oczywi¶cie to jest wszystko pi * dzwi :)

    0
  • #3 16 Cze 2010 19:04
    wrych
    Poziom 20  

    Polecał bym sortowanie b±belkowe według schematu

    Code:
    for j := ile-1 downto 1 do
    
      for i:=1 to j do
        if a[i] > a[i+1] then przestaw(a[i], a[i+1]);

    gdzie zadeklarowana tablica ma postać var a: Array[1..ile] of Typ_danych;
    Dla typu rekordowego sam musisz napisać procedurę przestaw, zamieniaj±c± poszczególne pola rekordów miejscami - sama zamiana tytułów (wg kol. lanky) zrobi ci tylko zamieszanie w bazie. Ponadto w mojej propozycji jest mniej porównań, nie trzeba porównywać elementów w czę¶ci tablicy już posortowanej...

    0
  • #4 16 Cze 2010 20:46
    lanky
    Poziom 17  

    Cytat:

    Ponadto w mojej propozycji jest mniej porównań.

    W takim razie proszę napisz nam sortowanie b±belkowe w pascalu na takim przykładzie co ja dałem i policzymy ile u ciebie będzie porównań.
    Bo przestaw(a[i], a[i+1]); bardzo mnie interesuje :D
    Cytat:

    sama zamiana tytułów (wg kol. lanky) zrobi ci tylko zamieszanie w bazie

    Rozumiem ,że powinienem od razu całego gotowca tu wstawić ?

    0
  • #5 17 Cze 2010 17:22
    wrych
    Poziom 20  

    Kolego lanky nie ma co się denerwować. Nie o gotowca tu chodzi, tylko o to, że prosz±cemu o pomoc należałoby zwócić uwagę na konieczno¶ć przestawiania całych rekordów (wszystkich pól), a nie tylko pola tytuł.
    Ty proponujesz n*n porównań, a ja (n-1) + (n-2) + (n-3) + ... + 1 = ... Sam odpowiedz sobie na pytanie, która liczba większa. A procedurę przestaw trzeba napisać stosownie do definicji typu rekordowego, np wg Twojego schematu, ale dla wszystkich pól.

    0