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.

sortowanie bębelkowe-licznik porównań

sledziu_88 31 Paź 2008 20:25 1207 12
  • #1 31 Paź 2008 20:25
    sledziu_88
    Poziom 9  

    hejka
    mam prośbę czy ktoś może mi podać jak powinna wyglądać procedura czynie wiem jakie polecenie w Pascalu liczące ilość porównań liczb w sortowaniu bąbelkowym?

    Code:
    program sort;
    
    const zakres=99;
    var
    Liczby:array[1..zakres] of integer;
    i,j,k,n,wybor:integer;
    procedure czytaj;
              begin
              writeln ('program kt˘rego zadaniem jest sortowanie liczb');
              write ('podaj ilosc liczb');
              read(n);
              for i:=1 to n do
                  begin
                  write('liczba ',i,'=');
                  read(liczby[i]);
                  end;
              end;
    procedure czytajzpliku;
    var F:Text;
        begin
             assign(F,'liczby.txt');
             reset(F);
             i:=1;
             while not EOF(F) do
              begin
                   read (F,Liczby[i]);
                   inc(i);
              end;
             close(F);
             n:=i=1;
        end;
    procedure zapiszdopliku;
    var F:text;
        begin
             assign (F,'Liczby_posortowane.txt');
             rewrite(F);
             for i:=1 to n do
             write (F, Liczby[i],' ');
             close(F);
             writeln('posortowana tablica zostala zapisana do pliku');
        end;
    procedure pisz;
              begin
                   writeln('oto posegregowane elementy');
                   for i:=1 to n do
                       begin
                            write(Liczby[i],' ');
                       end;
                   readln;
              end;
    procedure sortuj




              begin
                   for i:=1 to n-1 do begin
                   for j:=1 to n-1 do begin
                   if Liczby[j]>Liczby[j+1] then
                      begin
                           k:=Liczby[j];
                           Liczby[j]:=Liczby[j+1];
                           Liczby[j+1]:=k;
                      end;
              end;
    end;
    end;
        begin
             writeln('1: wpisze liczby z klawiatury');
             writeln('2:przeczytaj liczby z pliku');
             write ('wybieram: ');
             readln(wybor);
             case wybor of
             1:czytaj;
             2:czytajzpliku;
        end;
    sortuj;
           case wybor of
           1:pisz;
           2:zapiszdopliku;
    end;
    readln;
    end.





    tak wygląda mój program...
    aha i jak ktoś by mógł mi napisać co zrobić żeby wczytywać liczby z pliku to też bym był rad bo to też podpatrzyłem skądś;)
    z góry dzięki za pomoc:)

    Kod proszę umieszczać w znacznikach code - krzychoocpp

    0 12
  • #2 31 Paź 2008 22:36
    Szymon Tarnowski
    Poziom 27  

    Dodaj zmienną, wyzeruj na początku i przy każdym porównaniu ją inkrementuj.
    Co do wczytywania zmiennych to sprawa jest dość skomplikowana. Możesz prosto wczytywać pliki jako pliki tekstowe i przetwarzać je przy pomocy polecenia read/readln ale na dłuższą metę to jeden błąd w pliku i program się wysypuje. Najlepiej by było wczytywać z pliku znak po znaku, sklejać znaki w łańcuchy oddzielone znakami białymi a następnie konwertować je na liczby.

    0
  • #3 01 Lis 2008 13:40
    ed-ek
    Poziom 34  

    Były 2 błędy chyba spowodowane przepisywaniem kodu, bo kod się nie kompilował. Używaj do przenoszenia kodu pliku xxx.pas CTRL + C oraz CTRL + V. W zamieszczonym kodzie wyrzuciłem menu, możesz go dodać, ale w innej formie niż napisałeś. Plik jest zapisany w głównym katalogu dysku C: pod nazwą liczby.txt
    W pascalu max długość nazwy pliku wynosi 8 znaków.

    Code:

    uses crt;
    const zakres=99;
    var
    Liczby:array[1..zakres] of integer;
    z_pliku:array[1..zakres]of integer;
    i,j,k,n,wybor,ile_porownan:integer;
    F:text;
    procedure czytaj;
    begin
    writeln ('program kt˘rego zadaniem jest sortowanie liczb');
    write ('podaj ilosc liczb ');
    read(n);
    for i:=1 to n do
    begin
    write('liczba ',i,'= ');
    read(liczby[i]);
    end;
    end;
    procedure czytajzpliku;
    var F:Text;
        ii:integer;
    begin
    assign(F,'c:\liczby.txt');
    reset(F);
    i:=1;
    while not EOF(F) do
    begin
    readln (F,ii);
    z_pliku[i]:=ii;
    inc(i);
    end;
    close(F);
    {n:=i+1;}
    end;
    procedure zapiszdopliku;
    var F:text;
    begin
    assign (F,'c:\Liczby.txt');
    rewrite(F);
    for i:=1 to n do
    writeln (F, Liczby[i],' ');
    close(F);
    writeln('posortowana tablica zostala zapisana do pliku');
    end;
    procedure pisz;
    begin
    writeln('oto posegregowane elementy');
    for i:=1 to n do
    write(Liczby[i],' ');
    readln;
    end;
    procedure sortuj;
    begin
    for i:=1 to n-1 do begin
    for j:=1 to n-1 do begin
    ile_porownan:=ile_porownan+1;
    if Liczby[j]>Liczby[j+1] then
    begin
    k:=Liczby[j];
    Liczby[j]:=Liczby[j+1];
    Liczby[j+1]:=k;
    end;end;end;end;

    begin
     clrscr;
     ile_porownan:=0;
    {writeln('1: wpisze liczby z klawiatury');
    writeln('2:przeczytaj liczby z pliku');
    write ('wybieram: ');
    readln(wybor);
    case wybor of
    1:czytaj;
    2:czytajzpliku;
    end;}
    czytaj;
    sortuj;
    pisz;
    zapiszdopliku;
    {case wybor of
    1:pisz;
    2:zapiszdopliku;
    end;}
    czytajzpliku;
    writeln('liczby zapisane w pliku');
     for i:=1 to n do
     write(z_pliku[i],' ');
     writeln;
     writeln('ilosc porownan= ',ile_porownan );
     writeln('press any key');
    readkey;
    end.

    0
  • #4 01 Lis 2008 14:15
    Samuraj
    Poziom 35  

    O wcięciach to kolega pewnie nie słyszał, przez co kod jest zupełnie nie czytelny.
    Szymon naprowadził jak trzeba a Ty zamiast wędki dałeś rybę. Jaki efekt z tego - osoba która pisała post niczego się nie nauczy a zadanie nie było specjalnie skomplikowane.

    0
  • #5 01 Lis 2008 19:08
    sledziu_88
    Poziom 9  

    coś tutaj chyba jest nie tak w tym kodzie od ed-ek ;/
    dzięki za wszelaką pomoc ale proszę spójrzcie co tam jest źle...

    0
  • #6 02 Lis 2008 08:52
    ed-ek
    Poziom 34  

    Samuraj napisał:
    O wcięciach to kolega pewnie nie słyszał, przez co kod jest zupełnie nie czytelny.
    Szymon naprowadził jak trzeba a Ty zamiast wędki dałeś rybę. Jaki efekt z tego - osoba która pisała post niczego się nie nauczy a zadanie nie było specjalnie skomplikowane.

    Nie rozumiem do kogo nasz pretensje o wcięcia. Kod jest kopią oryginału z pewnymi zmianami. Co do ryby i wędki, to autor napisał dużo, a nawet bardzo dużo. Nie mogę zgodzić sie ze stwierdzeniem Szymona:
    Cytat:

    Co do wczytywania zmiennych to sprawa jest dość skomplikowana. Możesz prosto wczytywać pliki jako pliki tekstowe i przetwarzać je przy pomocy polecenia read/readln ale na dłuższą metę to jeden błąd w pliku i program się wysypuje. Najlepiej by było wczytywać z pliku znak po znaku, sklejać znaki w łańcuchy oddzielone znakami białymi a następnie konwertować je na liczby.

    Aby ustrzec się od nieprawidłowego wpisania liczby, procedurę kontroli należy umieścić przed wpisaniem liczby do pliku.
    sledziu_88: program jest wykonywalny: nie ma błędów. Prawdopodobnie źle przepisałeś. Korzystaj z CTRL......do kopiowania kodu. Napisz jaki błąd wyrzuca kompilator. Potem mogę Ci dodać menu i obsługę błędu otwarcia nieistniejącego pliku.

    0
  • #7 02 Lis 2008 20:27
    sledziu_88
    Poziom 9  

    program działa w ten sposób:
    pokazuje menu:
    1.wpisze z klawiatury
    2.wczyta z pliku
    wybieram 1. , podaję ilość liczb, podaję liczby, po podaniu ostatniej wciskam enter i znów chce podać ilosć liczb, podaję liczby i po ostatnim enterze wyłącza się program z jakims błędem

    0
  • #8 03 Lis 2008 14:23
    ed-ek
    Poziom 34  

    Ewidentnie masz źle przepisany program, bo działa bez zarzutu. Jeszcze raz go podam, teraz z wcięciami i powyrzucanymi {........}

    Code:

    uses crt;
    const zakres=99;
    var
    Liczby:array[1..zakres] of integer;
    z_pliku:array[1..zakres]of integer;
    i,j,k,n,wybor,ile_porownan:integer;
    F:text;

    procedure czytaj;
    begin
    writeln ('program kt˘rego zadaniem jest sortowanie liczb');
    write ('podaj ilosc liczb ');
    read(n);
    for i:=1 to n do
    begin
    write('liczba ',i,'= ');
    read(liczby[i]);
    end;
    end;

    procedure czytajzpliku;
    var F:Text;
        ii:integer;
    begin
     {$I-}
    assign(F,'c:\liczby.txt');
    reset(F);
    if (IOResult  <>0) then writeln('brak pliku');
    i:=1;
    while not EOF(F) do
    begin
    readln (F,ii);
    z_pliku[i]:=ii;
    inc(i);
    end;
    close(F);
     {$I+}
    end;

    procedure zapiszdopliku;
    var F:text;
    begin
    assign (F,'c:\Liczby.txt');
    rewrite(F);
    for i:=1 to n do
    writeln (F, Liczby[i],' ');
    close(F);
    writeln('posortowana tablica zostala zapisana do pliku');
    end;
    procedure pisz;
    begin
    writeln('oto posegregowane elementy');
    for i:=1 to n do
    write(Liczby[i],' ');
    readln;
    end;

    procedure sortuj;
    begin
    for i:=1 to n-1 do begin
    for j:=1 to n-1 do begin
    ile_porownan:=ile_porownan+1;
    if Liczby[j]>Liczby[j+1] then
    begin
    k:=Liczby[j];
    Liczby[j]:=Liczby[j+1];
    Liczby[j+1]:=k;
    end;end;end;end;

    begin
     clrscr;
     ile_porownan:=0;
    czytaj;
    sortuj;
    pisz;
    zapiszdopliku;
    czytajzpliku;
    writeln('liczby zapisane w pliku');
     for i:=1 to n do
     write(z_pliku[i],' ');
     writeln;
     writeln('ilosc porownan= ',ile_porownan );
     writeln('press any key');
    readkey;
    end.

    Kopiuj:
    Najedź myszką na początek kodu pokazanego na Forum. Naciśnij lewy przycisk myszy i przesuń jej wskaźnik na koniec kodu. Zmienia się kolor tła na niebieski. Po zaznaczeniu naciśnij CTRL + c. Otwórz Notatnik. Naciśnij CTRL + v. Pojawi się kopia. Zapisz ją tam gdzie chcesz z rozszerzeniem pas, np liczby.pas

    0
  • #9 03 Lis 2008 21:14
    sledziu_88
    Poziom 9  

    skopiowałem jak pisałeś i nic;]
    http://rapidshare.com/files/160363282/sortnet.pas.html
    sam zobacz...

    Zdania rozpoczynamy wielką literą i kończymy kropką. Proszę poprawić wszystkie swoje posty przed napisaniem następnego. Kod proszę umieszczać na forum, a nie na serwisach typu rapidshare, proszę poprawić to natychmiast - krzychoocpp.

    0
  • #10 04 Lis 2008 13:28
    ed-ek
    Poziom 34  

    Jestem bezsilny. Uruchom program w trybie pracy krokowej. Jeżeli wyświetli błąd, podaj jaki i w której linii. Jeżeli nie potrafisz przetłumaczyć, spisz info z ekranu i podaj na forum. Pliku który podałeś linkiem, nie mogę ściagnac. Zamieszczam plik wykonywalny exe
    Program się wykonuje, nie potrafię określić bez dodatkowych info dlaczego ci się nie wykonuje.

    0
  • #11 04 Lis 2008 23:55
    sledziu_88
    Poziom 9  

    program się wykonuje Twój ale jak wciskam ostatni raz enter-po ostatniej liczbie-ułamkiem sekundy widać że coś się dalej wyświetla ale program się kończy i zamyka tak szybko że nic nie idzie zobaczyć ;]
    dla mnie to jest czarna magia...

    Moderowany przez krzychoocpp:

    Za niezastosowanie się do uwag w poprzednim poście, nagradzam kolegę ostrzeżeniem

    0
  • #12 05 Lis 2008 00:09
    Samuraj
    Poziom 35  

    Start->Uruchom i wpisz CMD a następnie nazwę tego programu. Efektem tego będzie to że okno dosu nie zamknie się po skończeniu pracy programu.

    0
  • #13 05 Lis 2008 20:06
    sledziu_88
    Poziom 9  

    o matko co to za forum gdzie czepiają się małej litery na początku zdania... jakieś naciągane te zasady...
    jestem aktywny na trzech innych forach i jakoś problemow z tego nie robią ;]

    dziękuję wszystkim za pomoc a swoich przyzwyczajeń nie zmienię ;]
    pozdrawiam

    0