TABLICE W TURBO PASCALU I NIE TYLKO TABLICE

        

Ci¹g Fibonacciego zosta³ omówiony podczas zajêæ jako jeden z bardziej interesuj¹cych problemów algorytmicznych. Program ten to praktyczna realizacja tego realizacja tego zagadnienia.

PROGRAM Ciag_Fibonacciego_1;

USES Crt;

VAR

n,licznik,pierwsza,druga,z_p: LONGINT;

 BEGIN

     ClrScr;

     Write ('Podaj ilosc tworzonych liczb ci¹gu Fibonacciego n>=2, n = ');

     Readln (n);

     pierwsza:=0;

     druga:=1;

     Writeln;

     Writeln ('Liczby ciagu Fibonacciego: ');

     Writeln;

     Write (pierwsza:10,druga:10);

          FOR licznik:= 1 TO n-2 DO

     BEGIN

          z_p:=pierwsza+druga;

          pierwsza:=druga;

          druga:=z_p;

          Write (druga:10);

     END;

END.

 

program ciag_fibonacciego_kwadraty_szesciany ;

 var n,i,j,l: longint;

     a: array[1..46] of longint;

     x,y: real;

     k:char;

  begin

  Write(' Drukowanie wszystkich elementów ci¹gu  Fibonacciego (n<=46),');

  writeln('które s¹ kwadratami lub szeœcianami liczb naturalnych.');

   j:=1;

   while j=1

    begin

      Writeln(' Podaj n-ty numer ciagu');

       readln(n);

       if (n<=0) then writeln('Z³e dane');

        else

          begin

          writeln('f(1)=1');

         if n>1 then writeln ('f(2)=1');

         if n>2 then

         begin

         a[1]:=1;

         a[2]:=1;

          for i:=2 to n do

          begin

          a[i]:=a[i-1]+a[i-2];

          l:=0;

          repeat

            l:=l+1;

            x:=l*l;

          until x>=a[i];

          l:=0;

          repeat

          l:=l+1;

          y:=l*l*l;

          until y>=a[i];

          if a[i]=x then writeln ('f(',i,')=' , a[i],' ');

          if a[i]=y then writeln ('f(',i,')=' , a[i],' ');

                  end;

                end;

               end;

          writeln('czy chcesz pracowaæ dalej? ('t/n');

          readln(k);

          if k='n' then j:=0

          end;

          end.

 

         Zajmijmy siê teraz sposobem zamiany liczb dziesiêtnych na binarne wykorzystuj¹c do tego celu tablice. Przyk³adowy program z komentarzem

 

PROGRAM dz_na_bin;   { Zmiana uk³adu z dziesiêtnego na dwójkowy }

var cyfry : Array[1..16] of Integer;    { tu zapiszemy kolejne cyfry w uk³adzie dwójkowym }

    x, i : Integer; { x-liczba w uk³adzie dziesiêtnym; i  zmienna pomocnicza }

begin    { wprowadzamy liczby }

  repeat

    writeln('Podaj liczbê ca³kowit¹ 0 <= n <= 32767');

    readln(x)

  until x >= 0;

  for i:=1 to 16 do cyfry[i]:=0; { zerujemy cyfry "dwójkowe"}

     { wype³niamy tablicê cyframi od pozycji najmniej znacz¹cej }

  i:=1;

  while x>0 do

   begin

    cyfry[17-i]:=x mod 2;   { kolejna (od koñca) cyfra jest reszt¹ z dzielenia przez 2 }

    x:=x div 2;             { przesuwamy siê o jedn¹ cyfrê w lewo w zapisie dwójkowym }

    inc(i)

   end;

     { przeskakujemy pocz¹tkowe zera w tablicy 'cyfry'}

  i:=1; while (cyfry[i]=0) and (i<16) do inc(i);

     { wyprowadzamy liczb w zapisie dwójkowy na ekran }

  write('W zapisie dwójkowym = ');

  while i<=16 do

   begin

    write(cyfry[i]);

    inc(i);

   end;

  writeln;

  readln

end.

 

         Zbudujmy teraz program, który pozwoli oceniæ znajomoœæ tabliczki mno¿enia oraz wyœwietla procentowo prawid³owe wyniki

program test;

uses crt;

var

a,b:array[1..10] of integer;

i:integer;

pop:integer;

wynik:integer;

begin

clrscr;

randomize;

   pop:=0;

   for i:=1 to 10 do begin

                    a[i]:=random(11);

                    b[i]:=random(11);

                 end;

   for i:=1 to 10 do begin

                   write('jaki wynik ', a[i],'*',b[i],'=');

                   readln(wynik);

                   if wynik=(a[i]*b[i]) then pop:=pop+10;

                   end;

      writeln('uzyskales ',pop,'% ','odpowiedzi ');

      readln

      end.

         Wielomian w postaci wn(x)=(...((a0x+a)x+a2)x+.....+an-1)x+an  jak i wynikaj¹cy z tego sposób obliczenia wielomianu nazywamy schematem Hornera. Chcemy obliczyæ wn(z) czyli wartoœæ wielomianu dla wartoœci argumentu x=z oznaczamy tê wartoœæ przez y wtedy obliczenia przebiegaj¹ zgodnie z wzorami:

y:= ao          y:=yn+ai      I= 1,2, 3 ,…..n

z powy¿szych wzorów wynika, ¿e obliczenie wartoœci wielomianu stopnia n wymaga wykonania n mno¿eñ i dodawañ. Proszê przeanalizowaæ ten program

PROGRAM  alg_hor;  { Wartoœæ wielomianu wg algorytmu Hornera }

const

   MaxStWiel = 10; { maksymalny stopieñ wielomianu }

type

   t_a = array[0..MaxStWiel] of Real;  { typ tablicy zawieraj¹cej

                                   wspó³czynniki przy kolejnych potêgach x }

var

   n     : Integer;     { n - stopnie wielomianu }

   i     : Integer;     { zmienna pomocnicza }

   x     : Real;        { argument }

   a     : t_a;         { wspó³czynniki wielomianu }

   y     : Real;        { wynik }

 

begin

  write('Którego stopnia ma by† wielomian (max =', MaxStWiel, ')? ');

  readln(n);

  writeln('Podaj kolejne wartoœci wspó³czynników wielomianu');

  writeln('od wyrazu wolnego do stoj¹cego przy najwy¿szej potêdze x');

  for i := 0 to n do

    begin

     write('a[', i, ']:='); readln(a[i])

    end;

  write('Dla jakiego x obliczyæ wartoœæ wielomianu? ');

  readln(x);

 

  y := 0.0;      { przed rozpoczêciem obliczeñ wartoœæ wyniku zerujemy }

  for i := 0 to n do y := y*x + a[n-i]; { obliczamy wartoœæ wielomianu }

 

  writeln('y= ', y);

  readln

end.

          Przedstawiam teraz inny program analizy rozwi¹zania wielomianu

Program Wartosc_wielomianu;

uses crt;

var a:array [0..10] of integer;

    n,x,y:integer;

    i:byte;

begin

clrscr;

Writeln ('Podaj stopien n wielomianu max 10');

read (n);

for i:=0 to n do

              begin

              writeln ('Podaj ',i,' wspó³czynnik wielomianu');

              read (a[i]);

              end;

writeln ('Podaj argument x ');

read (x);

y:=a[0];

i:=0;

while i<n do

           begin

           i:=i+1;

           y:=y*x+a[i];

           end;

writeln ('WYNIK TEGO WIELOMIANU JEST',y);

repeat until keypressed;

end.

 

W tym programie pokazano w jaki sposób mo¿na zamieniaæ miêdzy sob¹ wiersze w tablicy

 

PROGRAM  zmiana_wierszy; { Zamiana miejscami i-tego i j-tego wiersza }

 

const n=5;  { rozmiary macierzy n - wierszy i m - kolumn }

      m=6;

type t_a=Array[1..n,1..m] of Integer; { definiujemy typ t_a }

const a:t_a=((1,2,3,4,5,6),   { definicja sta³ej typu t_a }

                   (1,1,1,3,4,1),

                   (3,4,5,6,7,1),

                   (0,0,0,0,0,1),

                   (5,5,4,4,1,1));

var i, j, k : Integer;

    x : Integer;

begin

  writeln('Macierz przed przestawieniem wierszy:');

  for i:=1 to n do

   begin

    for j:=1 to m do write(a[iä?ýt‘GHj�Ѩ�DÆ¿?Þ¬©ÿz¼Ê¬í¤U™öüÊÏšb]¾Åûõ減À|s«}êѳ»ó>VdúÒ…fŽ‚xçûÌÌ›}j!åÉó+n­È]›[ïQûÛjXu<ÓÇ:œ‘ÜÞÝ®ÿÜ7”÷€¯–¼or|_ñ?J³ewµ–ò$›äáU¤‰öÅNýæç±%ìðŸ#ék_û}.õK 6k}5o µ’4$³Æ#+í�š¯¨ÚÚÞé¦ÊöÍ/­&Ï™o7FDZ¯VÕÛó>)îx‡ÄoÉá™QÑ¼ë½ ûì̶Ÿì?û>†¸Èåʮߛ<�¼×³J^Þ<ÇÕe¸¯k ÛM»ð©KÑÈz­Û`�ù©|ß›oðÕSÐ`NiÐ(ÙL°ƒåëW`"²øŠ´QnÙãÝýÚÑŽU�wnEùsóqÅ`ÔN„šÜÔð¯‡u¿^,vöÚ~áö‹Ù8EOö}O¥zæ�¤éz§ö^�Ãb‹Ã·/!îX×*­ýÓâ3¼g5NDNsÎßüwÒ¨¬{|É!L¼ “‚½sÌ¿O›¯µpQÒºg…û÷=á–¥£Ü]_ÿcêð^Ùêoöè6[IÇ�·<â»MFæÏKÓæ¿»•#·�L²»÷6÷T�ZŸ6ˆùo^Öoü]âµËÝýÒÒ%ÿ–pçåZiRÉûÏʾn§Æ}æ�°¢‘ZH|¶ÝY7“Ë",q§˜KÀîÇÚ³¥Me.XŸJ|ðið‡‡w^¯üLï=ËÿtvO»Ðw.îÝ…} (ZÂâ*{J®cCƼ¯ËRnF^µ¡—³#ÊÓ¼Ñ@ùJÒmµ.æ¥ÔÚ­Š¯ÊµiÌ®úËQ×Ï_³×ü�^&ÿ°¬ßúuœæÇƯù(ž ÿ°ý—þ�ZøãÅ_òKõoû éŸú&þ´£¿É“#ôgÃ?qª´ÿòƒþº È£¤5BeÝQ ‰•yg‹øk‚¬Ú@-aûÍN[x~O’¸\MàÒßø“ŠˆØªÂ|�½Ú¡ÂÆ…S˜>YÿúõzÚæßfÖMµ,Z­ªüÊÝiÒ,0[É"ò¡KŸÀU@]O�>+kêº ŽSi–Bsõ¯øk{‰ã[=Nãæ†êðY\DÙ)$r�˜oÏ4°«Þ=ìjýÇÈ÷=ÆzŒîü5±>Ëkf’‘ÓrvTö®›YXã¼>K'—*‰GÑ«ÀÄÓåÐø¹@Ww—ó¸q° ô#Ò¼·ÇŸ ËKÁÐí”ó>š¸ëøSËq>Æ·+:0U}„ìyk»ÚHm.á{yâù^)“c©ühóÚ¯¤å>Ê…¬|#£/»ÿŠ©ãïu¬e¡Ô>9V¥�ûîOûê Ðto±7Hß/¯j–Ê:t‚Û}Ìç¤P¡súP½Ó)âaHì4o‡þ5ÔŠÉ&œšLþZ_Ê"8õ Ô×£øoំì¤Y¯ÚëÄ޾r¡Ïýs^µÅ[|ÆcžÎ{� %‘cm‘Û¢íHW€£ùU{í¿gÚ»¿€7ZñºŸ9Ìä¹™ÌøƒY±Ð´ö½Õ®E$Eümô‰¥éo¯è_Û¾3g´Ðß÷¶ú]¼¾O˜ŸÞ�úÿÀk¿ K–Ìé�räß'ð'†¯µ {ÃN–vðÁå¼Vr—FsÀ—ièáw ú1­¯Œ6ƒÄrÁáÍãÌÓ—ÝJ¼y‡ªGôkÛúÓöZŸC–á]ZˆåË‚ªŸ7j§$ÿ.êò¶>åû±F~¢|È[oÌO@µÜ~Ïž]S\o\¦m¬[m®z3ÿZéÃGSËÌeÉHú;ŽÖéN'ò¯cšÇÅ%¡Œ7ËP %‹+?=«;›Ü7š Ò¹§)5b5ÚŸ/zß©2,ÛF«÷jü5èP8æO|õû=Èõâoû Íÿ¡×YÎl|jÿ’‰àÏûÙèõ¯Žaù×®|/ÐnáÝáí^çNŸwú›ÿžÁ¾øýkÖÁæÎú8¯ds�ð¯Å1·ú5æ‰uÿ\îöèx§[ü1ñ¯ü´‹GŒzɨÇ^·×(žåâ*&…·ÂMtþòoøjÓÛtŽ[òLVö—ð§ÃpC»Xñ©q?¦ž‰ãÙ®ZÙ¤ yøŒÉ��‚üfÛ­¼<÷‡±¿™æý:WQ§Fð*Çemkaè!¶ü¹ýkÅ­˜JlófæÍ›kXú´¯&zù˜­8ÞÞÛ»åÿf¹¹¤ÎKTÆÍv­µWïË׊çuÝfæÙ?âS`úž®~T…qˆÏ©'ŠëÃÓ»;pô¾±%ȵŸøÞöy¯uhRK™rI’PDyþítÿ´�GÄú“a ÄÖöQ'œ’1fÔöëÍ{ÞÍBÇÖÔË5ŒQËxoC—Ãv·7hEûT@<0ýÅ�mé>]´>

  for i:=1 to n do

   begin

    for j:=1 to m do write(a[i,j]:3);

    writeln

   end;

  readln

end.

         Program umo¿liwia roz³o¿enie liczby na czynniki pierwsze z wykorzystaniem tablic

program rozklad_na_czynniki_pierwsze;

 uses crt;

 var n,i,p,cz:integer;

      {tabl:array[1..100] of integer; }

 begin

 clrscr;

  Write('Podaj n,  n=');  readln(n);

  writeln('Czynniki pierwsze liczby ',n,' :');

  {{  {for i:=2 to n do}

  {  i:=2 ;

     repeat

        if n mod i = 0 then

               p:= n div i;

                readln(tabl[i]);

                n:= p;

                write(tabl[i]);

       until i>n;

        { for i:=2 to n do

         write(tabl[i] ,','); }

 

trudniejszy nieco problem to obliczenie sumy odleg³oœci pomiêdzy kolejnymi punktami od punktu (x1,y1) do punktu (xn,yn) z pominieciem punktów zbyt odleg³ych od punktu poprzedniego}

 

 PROGRAM Dlugosc_Drogi;

  CONST

   LICZBA_PUNKTOW=30;

  TYPE

   Tab      =ARRAY[1..LICZBA_PUNKTOW] OF REAL;

   Nr_Punktu=1..LICZBA_PUNKTOW;

  VAR

   x,y    :Tab;

   Max_Odl:REAL;

   n      :Nr_Punktu;

   s      :REAL;

  PROCEDURE Wczytaj;    {wczytanie danych o punktach}

   VAR

    i:Nr_Punktu;

   PROCEDURE Wczytaj_Punkt

                        {wczytanie danych jednego punktu}

     (nr:Nr_Punktu);

    BEGIN

     WRITELN('   Podaj wspolrzedne punktu nr  ',nr);

     WRITE('   x =');

     READ(x[nr]);

     WRITE('   y =');

     READ(y[nr]);

     WRITELN

    END; {Wczytaj_Punkt}

 

   BEGIN {Wczytaj}

    REPEAT

     WRITE(' Ile punktów? ');

     READLN(n)

    UNTIL n<=LICZBA_PUNKTOW;

    FOR i:=1 TO n DO

     Wczytaj_Punkt(i);

    READLN

   END; {Wczytaj}

 

  FUNCTION Nast         {okreœlenie numeru kolejnego punktu}

    (nr:Nr_Punktu):INTEGER;

   VAR

    j:Nr_Punktu;

    d:REAL;

    f:BOOLEAN;

 

   FUNCTION Odl         {odleglosc miedzy dwoma punktami}

     (n1,n2:Nr_Punktu):REAL;{numery punktów}

    BEGIN

     odl:=sqrt(sqr(x[n1]-x[n2])+sqr(y[n1]-y[n2]))

    END; {Odl}

 

   BEGIN {Nast}

    j:=nr;

    f:=FALSE;

    IF j=n

     THEN Nast:=0

     ELSE

      WHILE (j<n) AND NOT f DO

       BEGIN

        WRITE('   Krok: ',j);

        j:=j+1;

        d:=Odl(nr,j);

        WRITE(' odleg³oœæ punktu ',nr,' od punktu ',j,' wynosi: ',d:10:2);

        IF d<=Max_Odl

         THEN

          BEGIN

           Nast:=j;

           f:=TRUE;

           s:=s+d;

           WRITELN

          END

         ELSE WRITELN(' punkt ',j,' odrzucony')

       END;

    IF NOT f

     THEN Nast:=0

   END; {Nast}

 

  PROCEDURE Wypisz;     {analiza punktów i obliczenia drogi}

   VAR

    i:INTEGER;

   BEGIN

    i:=1;

    s:=0;

    REPEAT

     i:=Nast(i)

    UNTIL i=0;

    WRITELN(' Rozpatrzono wszystkie punkty');

    WRITELN(' Ca³kowita d³ugoœæ drogi wynosi: ',s:10:2)

   END; {Wypisz}

 

  BEGIN {Program g³ówny}

   WRITE('Podaj krytyczna odleg³oœæ ');

   READLN(Max_Odl);

   Wczytaj;

   Wypisz;

   WRITELN('Naciœniecie klawisza Enter zakoñczy prace programu');

   READLN

  END. {Dlugosc_Drogi}

 

 

    {p:=n div i;  }

    {write(p,','); }

 

  { readln;

   end.        }

   {begin  }

 

   for i:=n downto 1 do

    if n mod i =0 then

 

 

     begin

     repeat

     cz:=n div i;

     write(cz,', ');

       n:=i;

      { i:=n;     }

 

 

     until n=i ;

        {readln( tabl[cz]);}

   {  for cz:=1 to n do

       write(cz,',');  }

     end;

readln;

 

     end.

 

Dziêkujê za zaanga¿owanie w czasie æwiczenia i zapraszam do dalszej walki z TURBO PASCALEM

powrót