Trojkat pascala

0

Hejka!! Mam pyt. szukalem tego w innych postach, ale nic niz znalazlem. Mam napisac program (w pascalu) wyswietlajacy na ekranie trojkat pascala:

                                   1
                                 1  1
                                1 2 1
                               1 3 3 1
                              1 6 4 6 1

itd.
uzytkownik ma podawac przy starcie programu ile poziomow ma zawierac ten trojkat.
Nie licze na gotowa implementacje, ale moze jakies wskazowki?? Z góry serdeczne dzieki!!

0

[code]
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
[/code]

Jak widać każda kolejna liczba w tym ciągu jest smą dwóch liczb będących nad nią... Wsytarczy, że sporządzisz odpowiedznią tablicę i będziesz dodawał w ten sposób co dwie wartości z niej

0

Zapisz sobie ten trójkąt lekko pochylony:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
...
Jak widać Tab[i, i] = 1, Tab[i, 0] = 1, Tab[i, j] = Tab[i-1, j] + Tab[i-1, j-1]
Czyli wyliczasz jeden wiersz i wyświetlasz go wyośrodkowany.
Potem drugi i także wyośrodkowany i tak dalej.

0

Dobry pomysł Dryobates...
Skorzstam z niego i dopiszę tyle:

SetLength(tab, ile);
for i:=0 to (ile-1) do Begin
SetLength(tab[i], i+1);
for j:=0 to i do
if ((j=i) or (j=0)) then tab[i, j]:=1
else Tab[i,j]:= Tab[i-1, j] + Tab[i-1, j-1];
end;

Tablica się zapełni, a z wyświetalniem formy choinki chyba sobie poradzisz...

0

W Pascalu nie ma tablic dynamicznych, więc nie skorzysta z tego. Trzeba z góry zadeklarować max. rozmiar.
Jeżeli operujesz np. na typie Extended to prawdopodobnie tablicę kw. zadeklarujesz max. 73x73
Możesz troszkę przechytrzyć te ograniczenia zapamiętując jedynie... jeden wiersz. Aby wyliczyć n-ty wiersz musisz jedynie pamiętać n-1 wiersz. Jeżeli więc masz:
1 2 1
to w następnym korzystając ze wzrou masz:
1 3 3 1
Haczyk jest taki, że musisz w takim wypadku mieć dwie tablice, bo gdy zapisujesz pierwszą trójkę, to tablica wygląda tak (jeżeli byłaby to jedna i ta sama tablica
1 3 1
i wyliczanie kolejenej pozycji spowodowałoby wstawienie:
1 3 4
Dlatego w tym wypadku musisz przechodzić wiersz od prawej. Wówczas tylko jeden wiersz wykorzystasz:
1 2 1
1 2 1 1
1 2 3 1
1 3 3 1
Możesz wtedy spokojnie zadeklarować tablicę o 1000 elementach, a co za tym idzie móc wypisać trójkąt o podstawie 1000 elementów.
Ale to tylko tak apropos optymalizacji, bo nie mam pojęcia, gdzie miałbyś na ekranie zmieścić ten tysiąc :)
Ponieważ i tak na ekranie na raz zmieści się tylko 25 lini, a co za tym idzie podstawa trójkąta będzie zawierać co najwyżej 25 liczb, to możnaby w ogóle zrezygnować z tablicy i skorzystać wyłącznie z rekurencji.

0

A co powiecie na cos takiego:

type
  linia=array[0..31] of word;

procedure pasc(p,st:byte;top:linia);
 var
  b:byte;
  nl:linia;
begin
 for b:=0 to 3*(st-p) do
  write(' ');
 for b:=0 to p do
  begin
   write(top[b]);
   if top[b]<10 then
    write('     ')
   else
    if top[b]<100 then
     write('    ')
    else
     if top[b]<1000 then
      write('   ');
  end;
 writeln; 
 nl[0]:=1;
 nl[p+1]:=1;
 for b:=1 to p do
  nl[b]:=top[b-1]+top[b];
 if p<st then
  pasc(p+1,st,nl);
end;

var 
  st:byte;
  l:linia;
begin

 writeln('          ..:: Trójk&plusmn;t Pascala ::..');
 writeln;
 writeln;
 write('Poziom zagłębienia :');
 readln(st);
 if (st=0)or(st>13) then
  begin
   writeln('Poziom zagłębienia musi zawierać się w przedziale (0,13>');
   halt(1);
  end;
 l[0]:=1;
 l[1]:=0;
 pasc(0,st-1,l);
 readln;

end.

//A my powiemy: Pochwalic sie chciales czy masz problem jakis? - lofix

???

1 użytkowników online, w tym zalogowanych: 0, gości: 1