Skocz do zawartości


Close Open
Close Open
- - - - -

Problem z 'ulepszeniem' programu w pascalu


  • Please log in to reply
26 replies to this topic

#1

  • Goście

Napisany 25 November 2006 - 23:03 PM

Mam mały problem z programem który najpierw losuje liczby a potem uklada je wg kolejności. Mam go zmienić tak żeby nie wykonywał "pustych operacji" tzn że jak liczby zostaną poukładane to żeby program zakończył działanie
uses crt;
var i,p,j:integer;
var A:array[1..100] of integer;
    begin
         clrscr;
         Randomize;
         for i:=1 to 10 do
             begin
                  A[i]:=Random(100);
                  write (A[i],' ');
             end;
             writeln;
         for i:=1 to 9 do
         for j:=1 to 9 do
         if A[j]>A[j+1]
         then
             begin
             p:=A[j];
             A[j]:=A[j+1];
             A[j+1]:=p
             end;
    for j:=1 to 10 do
        write (A[j],' ');
        readln;
    end.
Nauczyciel powiedział żeby użyć "repeat until", jednakże już z połtorej godziny próbuje zmienić ten program, ale bez rezultatów. Czy może mi ktoś pomóc ze zmianą tego programu tak żeby było w nim "repeat until" ?

Z góry dziękuję za pomoc.

#2 sbstn_s

sbstn_s

    bezsamogłoskowicz

  • Forumowicze
  • PipPipPipPipPipPipPipPip
  • 5017 Postów:

Napisany 25 November 2006 - 23:18 PM

Przejrzyj tą stronę => http://pl.wikipedia....wiki/Sortowanie . Masz tam sporo przykładowego kodu.
Sebastian
---
amd athlon 64 x2 4600+ (windsor jh-f3) // scythe ninja+ rev. b // abit ax78 // a-data extreme edition ddr2 800+ 2x2gb // samsung hd403lj // nec nd-4571a // lg ced-8120b // twintech geforce 9600gt // arctic-cooling accelero s1 rev 2 // akasa amber ak-183-l2b // zalman fanmate 2 // tagan tg380-u01 // logic concept 402k black // 2x fander fx 120-b
dell studio 15

#3

  • Goście

Napisany 25 November 2006 - 23:43 PM

No niby jest tam o sortowaniu bąbelkowym (sam znalazlem zanim napisalem ten post), ale ja z tego niewiele rozumiem, pozatym tam nie ma nic o zmianie na repeat until. Jestem dopiero w 3 klasie liceum i dopiero od tej klasy mam programowanie i mam poprostu przerobić ten program żeby wykorzystywał repeat until.

PS. sbstn_s dzięki za dobre chęci.

#4 kurc66

kurc66

    Początkujący

  • Forumowicze
  • PipPipPip
  • 66 Postów:

Napisany 25 November 2006 - 23:55 PM

 i:=1;

  repeat

    posortowane := true;

    for j:=1 to 9 do

      if A[j] > A[j+1] then

        begin

          p:=A[j];

          A[j]:=A[j+1];

          A[j+1]:=p;

          posortowane := false;

        end;

    i := i + 1;

  until posortowane or (i > 9);

this is the end, beautiful friend

#5 Wojtek-J

Wojtek-J

    Uczestnik

  • Forumowicze
  • PipPipPipPip
  • 152 Postów:

Napisany 25 November 2006 - 23:58 PM

Akurat bąbelkowe to te co masz zaimplementowane. Poczytaj o innych :) np. QuickSort (to jest z rekurencją ale bardzo wydajne)

Przez wstawianie jest jeden for i jeden while (podejrzewam że zamiast repeat until może być while ;))

#6

  • Goście

Napisany 26 November 2006 - 00:26 AM

kurczę, czemu moj nauczyciel mosi byc taki niedouczony. Jak zrobi jedną lekcje na 4 to jest dobrze i zawsze mowi że musi miec oceny. pisze nam 2 programy (jeden jest w pierwszym poście) i mówi że mamy je przerobić. Nauczył moją klasę tego co tu napisąlem i funkcji repeat until i nic więcej, więc z tym TRUE FALSE nie moge uzyć niestety. Ale widze już w ktorym miejscu mam przerabiać. Bardzo dziękuję za pomoc może na podstawie tego True False wymyśle coś żby tego nie trzeba bylo użyć.
EDIT:
Doszedlem do takiej postaci
uses crt;
var i,p,j:integer;
var A:array[1..100] of integer;
    begin
         clrscr;
         Randomize;
         for i:=1 to 10 do
             begin
                  A[i]:=Random(100);
                  write (A[i],' ');
             end;
             writeln;
             repeat
             if A[j]>A[j+1]
             then
             begin
             p:=A[j];
             A[j]:=A[j+1];
             A[j+1]:=p;
             end;
             until
             for j:=1 to 10 do
             A[j]<A[j+1]
    for j:=1 to 10 do
        write (A[j],' ');
        readln;
    end.
Niestety w warunku until okazuje się że nie można użyć for to do :(

#7 Wojtek-J

Wojtek-J

    Uczestnik

  • Forumowicze
  • PipPipPipPip
  • 152 Postów:

Napisany 26 November 2006 - 01:27 AM

Błąd wywala bo tutaj:
           end;
            until
            for j:=1 to 10 do
            A[j]<A[j+1]
nie ma warunku przerwania. Ale nie wiem czy to jedyny błąd, nie mniej, to powinno działać:
uses crt;
var i,p,j:integer;
var A:array[1..100] of integer;
   begin
        clrscr;
        Randomize;
        for i:=1 to 10 do
            begin
                 A[i]:=Random(100);
                 write (A[i],' ');
            end;
            writeln;           
        //Ten kawałek odtąd ***********************   
        for i:=1 to 9 do
        for j:=1 to 9 do
        if A[j]>A[j+1]
        then
            begin
            p:=A[j];
            A[j]:=A[j+1];
            A[j+1]:=p
            end;
        //dotąd ***********************************
        
        //zamiensz z tym kawałkiem odtąd **********    
        j := 1;
  repeat
    begin
 	 i := 1;
 	 repeat 
     begin
    if A[i] > A[i+1] then
      begin
   	 p := A[i];
   	 A[i] := A[i+1];
   	 A[i+1] := p;
      end;
    i := i + 1; 	 
     end;	
 	 until (i = 10);
 	 j := j + 1;
    end; 
  until (j = 10);
  //dotąd ***********************************              
   for j:=1 to 10 do
       write (A[j],' ');
       readln;
   end.
Tylko nie gwarantuję za składnie, od lat nie mam do czynienia z Pascalem i nawet nie mam żadnego kompilatora żeby sprawdzić.

#8

  • Goście

Napisany 26 November 2006 - 01:52 AM

Jestem Bardzo wdzięczny. Program działa ok. Co prawda nie jestem dokładnie pewien na jakiej zasadzie, no ale cóż może moj "wspanialy" informatyk mnie oto nie spyta bo sam pewnie nie bedzie rozumiał jak to dziąla bo wszystko przepisuje z kartki;/ . Jeszcze tylko chcialem się upewnić. Ten program jak posegreguje to nie wykonuje pustych pętli? Z zmoje skompej wiedzy wygląda na to że on dziąl tak że j wrasta o 1 wtedy jak nie jest wykonywana if then?
PS. Wiem że pewnie teraz widać że nic nie umiem z programowania, no ale cóż, nic nie poradze że mój nauczyciel woli grać w pasjansa zamiast przeprowadzać lekcję;/
PS2. Jeszcze raz bardzo dziękuję za pomoc !

#9 Wojtek-J

Wojtek-J

    Uczestnik

  • Forumowicze
  • PipPipPipPip
  • 152 Postów:

Napisany 26 November 2006 - 02:06 AM

Ten program działa dokładnie tak samo jak twój. To to samo sortowanie bąbelkowe tylko przy wykorzystaniu innych pętli. Jeżeli chciałbyś aby nie wykonywać pustych przebiegów, trzeba (jak pisał wcześniej kurc66) przerwać sortowanie gdy podczas jednego przebiegu nie zostania wykonana żadna zmiana elementów - co oznacza że tablica jest już posortowana, powinno to wyglądać tak:
//zamiensz z tym kawałkiem odtąd **********    
        j := 1;
  repeat
    begin
 	 posortowane := true; //dodaj to
 	 i := 1;
 	 repeat 
     begin
    if A[i] > A[i+1] then
      begin
   	 p := A[i];
   	 A[i] := A[i+1];
   	 A[i+1] := p;
   	 posortowane := false; //i to
      end;
    i := i + 1; 	 
     end;	
 	 until (i = 10);
 	 j := j + 1;
    end; 
  until posortowane or (j = 10); //i zmien tutaj
  //dotąd ***********************************  

wówczas gdy program dostanie np. taki ciąg:
213456789
przerwie się wykonywanie już po trzecim przejściu, a nie jak bez tego warunku po 9.

#10

  • Goście

Napisany 26 November 2006 - 14:23 PM

ok. Dzięki. Będe sie kłócił z nauczycielem że nie da się inaczej zrobić jak będzie mial jakieś zastrzeżenia.

#11 Wojtek-J

Wojtek-J

    Uczestnik

  • Forumowicze
  • PipPipPipPip
  • 152 Postów:

Napisany 26 November 2006 - 14:47 PM

da sie ;) na wiele roznych sposobow :)

#12

  • Goście

Napisany 26 November 2006 - 15:20 PM

Możliwe;/ ale jeżeli piszecie że żeby dzialalo tak jak mój nauczyciel chciał , to trzeba użyć jeszcze True False, to poprostu będe się z nim kłócił że nie uczył mnie True False i ze inaczej nie da sie tego zrobić tylko z użyciem repeat until, zresztą pewnie i tak tylko ja bede miał to zadanie zrobione i to nie dzieki jego nauce tylko dzięki Wam. Bo sam bym wieki próbował przekrztalcać ten program i nigdyt bym nie wpadł by użyć 2 razy repeat until ;/

#13 Wojtek-J

Wojtek-J

    Uczestnik

  • Forumowicze
  • PipPipPipPip
  • 152 Postów:

Napisany 26 November 2006 - 16:37 PM

Na pewno być doszedł ;) Trochę byś po kombinował i by się udało :D

#14

  • Goście

Napisany 26 November 2006 - 16:52 PM

W życiu... Ja do tej pory nie rozumiem na jakiej zasadzie dziłają te dwie pętle :(
zwłaszcza że zamiast
p := A[j];
    A[j] := A[j+1];
    A[j+1] := p;
jest teraz wstawione "i" a skąd potem "j" się bierze to już wogóle nie rozumem:( ale to nic nowego bo tak zawsdze jest na lekcjach informatyki że nikt z moejj klasy nie rozumie zasady działania programu bo nauczyciel tego nie tłumaczy bo sam przepisuje albo z kompa albo z kartki :/ Ech klasa matematyczno-informatyczna w liceum w Warszawie, a ma informatyka jak dla podstawówki :P

#15 Wojtek-J

Wojtek-J

    Uczestnik

  • Forumowicze
  • PipPipPipPip
  • 152 Postów:

Napisany 26 November 2006 - 17:55 PM

Mówię na przykładzie tego kodu co ja napisałem.
Sortowanie działa na takiej zasadzie, że skupia się kolejno na każdym elemencie z tablicy (poza ostatnim, ale zaraz wyjdzie dlaczego). Przesuwa go w "górę" tablicy tak długo aż następny element będzie większy od aktualnie przesuwanego. I jeżeli jeszcze nie jest na końcu tablicy, zaczyna od następnego i przesuwa dalej aż napotka na większy (lub koniec tablicy).

Potem zaczyna od początku, i znowu przesuwa (tak jak bąbelki kolejne elementy idą do góry). Jeżeli za którymś razem podczas spaceru po całej tablicy nic nie przesunie, znaczy że skoro nie ma co przesuwać, to tablica jest posortowana. Zmienna j jest (w moim kodzie) dla pętli zewnętrznej. Wykonuje się ona tyle raze ile ilosc elementow - 1 bo tyle bedzie potrzeba w najbardziej skrajnym przypadku. Ot co. ;)

#16

  • Goście

Napisany 26 November 2006 - 22:15 PM

aha czyli zaczyna segregować od strony prawej ??
35 74 32 72 13 40 65 43 62 32
35 74 32 72 13 40 65 43 32 62
35 74 32 72 13 40 65 32 43 62
35 74 32 72 13 40 32 43 62 65
35 74 32 72 13 32 40 43 62 65
35 74 32 13 32 40 43 62 65 72
Itd. tak?

Wiem że pewnie teraz się śmiejesz że prawie nic nie rozumiem, ale nie chcę pokazać zrobionego NIE przezemnie programu:( i jeszcze nie rozumieć na jakiej zasadzie dziala, bo mój informatyk napewno mi tego nie wytlumaczy, a wkońcu chcę się czegoś nauczyć.

#17 Wojtek-J

Wojtek-J

    Uczestnik

  • Forumowicze
  • PipPipPipPip
  • 152 Postów:

Napisany 26 November 2006 - 23:12 PM

Nie, tak:
j=1 ; i=1
35 74 32 72 13 40 65 43 62 32 //pierwszy mniejszy od drugiego, wiec ok, przechodzę dalej
j=1 ; i=2
35 74 32 72 13 40 65 43 62 32 //drugi wiekszy od nastepnego trzeciego, zamieniam
35 32 74 72 13 40 65 43 62 32
dalej, j=1 ; i=3
35 32 74 72 13 40 65 43 62 32 //trzeci wiekszy od czwartego, wiec zamieniam
35 32 72 74 13 40 65 43 62 32
dalej: j=1 ; i=4
35 32 72 74 13 40 65 43 62 32 //znowu wiekszy od nastepnego
i tak dalej aż do:
j=1 ; i=9; kiedy to mamy:
35 32 72 13 40 65 43 62 32 74 //74 wybombelkowalo na sam koniec
teraz:
j=2 ; i=1 (i to samo od poczatku)
35 32 72 13 40 65 43 62 32 74 //pierwszt (i) wiekszy od drugiego (i+1) wiec zamieniam
32 35 72 13 40 65 43 62 32 74
j=2 ; i=2
32 35 72 13 40 65 43 62 32 74 //drugi (i) mniejszy od trzeciego (i+1) wiec ok, ide dalej
j=2 ; i=3
32 35 72 13 40 65 43 62 32 74 //trzeci wiekszy od czwartego wiec zamieniam
mam:
32 35 13 72 40 65 43 62 32 74
i tak dalej bombelkuje 72 aż do momentu:
j=2 ; i = 9
32 35 13 40 65 43 62 32 73 74
no i dwa bombelki mamy juz na "powierzchni" ;) lecimy dalej
j=3 ; i=1
32 35 13 40 65 43 62 32 73 74 //ok
j=3 ; i=2
32 35 13 40 65 43 62 32 73 74 // tab[i] > tab[i+1] => zamieniamy
32 13 35 40 65 43 62 32 73 74
potem ok ok, aż do momentu gdy napotkamy 65
j=3 ; i=5
32 13 35 40 65 43 62 32 73 74 // tab[i] > tab[i+1] wiec zamieniamy
32 13 35 40 43 65 62 32 73 74
i tak dalej dalej kolejno bombelkujemy i bombelkujemy :D

W pewnym momencie mamy sytuacje
13 32 35 32 40 43 62 65 73 74
wypychamy bombelek 35
13 32 32 35 40 43 62 65 73 74

Teraz przy kolejnym przebiegu petli nie pojdzie do gory zaden bombelek, co znczy ze tablica jst juz posortowany i nie ma sensu wiecej chodzi, z tad ten warunek o ktorym byla mowa. Jezeli nie byla dokonana zadna zmiana, nie zmienil sie na false i zasygnalizowal zeby konczyc bombelkowanie (nie zaczynac kolejnego obiegu) bo juz nie ma co sortowac. Bez tego warunku moglo by sie jeszcze cos wykonac. ;)

Tak mniej-więcej.

#18

  • Goście

Napisany 26 November 2006 - 23:24 PM

No teraz to rozumiem. Naprawde wielkie dzięki Wojtek-J za pomoc! Przepraszam że tak bardzo się napracowaleś przezemnie:( Ale cóż, za 5 i pół roku po studiach może też będe mogl pomagać na tym forum :)

#19 Wojtek-J

Wojtek-J

    Uczestnik

  • Forumowicze
  • PipPipPipPip
  • 152 Postów:

Napisany 26 November 2006 - 23:26 PM

No ja w sumie nie tak dawno zacząłem studia ;)

No i nie ma sprawy, postawisz mi kiedyś piwko :P

#20

  • Goście

Napisany 26 November 2006 - 23:49 PM

Ok :) Jutro napszie co mój nauczyciel powie na ten program.




0 Użytkowników czyta ten temat

0 użytkowników, 0 gości, 0 anonimowych użytkowników