Perykles Posted November 12, 2009 Report Share Posted November 12, 2009 Witam, Niedawno zająłem się programowaniem w Pascalu. Próbowałem zrobić algorytm obliczający silnię, ale cały czas wyskakują jakieś błędy i nie mogę tego skompilować. var n,s,i:integer; begin writeln(Program obliczajacy silnie); writeln(Podaj liczbe, z ktorej chcesz obliczyc silnie :); readln(n); s:=1 i:=n repeat s:=s-i i:=i-1 until i<=1 writeln(s); end.[pascal] Nie wiem co jest nie tak Jestem nowicjuszem w programowaniu Gdzie tu jest błąd? Link to comment Share on other sites More sharing options...
olesio Posted November 12, 2009 Report Share Posted November 12, 2009 Mam nadzieję że nikt nie ma mi za złe że podam link do konkurencyjnego [?] portalu, ale jest tam w artykule zawarty przykłąd jak obliczyć silnie dowma sposobami. Ja polecam sposób rekurencyjny. KOD http://4programmers.net/Turbo_Pascal/Potęga,_logarytm,_silnia,... Pozdrawiam: olesio Link to comment Share on other sites More sharing options...
Perykles Posted November 12, 2009 Author Report Share Posted November 12, 2009 Dzięki za pomoc. Link to comment Share on other sites More sharing options...
xevil21 Posted November 12, 2009 Report Share Posted November 12, 2009 var n,s,i:integer; begin writeln(Program obliczajĄcy silnie); writeln(Podaj liczb, z ktrej chcesz obliczy† silni: ); readln(n); s:=1 i:=n repeat s:=s-i i:=i-1 until i<=1 writeln(s); End.[pascal] łoł , ale styl :angry: lepiej kup książkę albo znajdź jakiś kurs a tu masz rozwiązanie http://www.unit1.pl/67,txt Pozdrawiam! Link to comment Share on other sites More sharing options...
Perykles Posted November 12, 2009 Author Report Share Posted November 12, 2009 No wiesz, wczoraj zacząłem programować...Dwa miesiące uczyłem się algorytmów na informatyce, ale nic poza tym, nie mam żadnego doświadczenia. Link to comment Share on other sites More sharing options...
ktoś Posted November 12, 2009 Report Share Posted November 12, 2009 OK, pobawmy się. Możesz mnie uświadomić, w jaki sposób s:=1 i:=n repeat s:=s-i i:=i-1 until i<=1 liczy silnię? Z tego co pamiętam, silnia liczby to iloczyn tej liczby i wszystkich niezerowych liczb naturalnych mniejszych od niej Można to zaprogramować na 2 sposoby, iteracyjnie, albo rekurencyjnie. Algorytm iteracyjny wygląda tak: bierzesz sobie zmienną zawierającą dotychczasowy iloczyn i inicjujesz go wartością neutralną - ważne, neutralną bierzesz inną zmienną i pakujesz do niej liczbę, z której silnię będziesz liczyć w pętli przypisujesz do dotychczasowego iloczynu wynik mnożenia dotychczasowego iloczynu przez liczbę, a liczbę zmniejszasz o 1. do czasu, gdy liczba osiągnie wartość 1 To jest gotowy, działający algorytm. I teraz 2 zadania. Banalne: przepisz to na język zrozumiały dla komputera Dające mi odrobinę sadystycznej przyjemności: przepisz ten kod tak, żeby nie wywalił się przy liczeniu silni dla 40 Link to comment Share on other sites More sharing options...
Perykles Posted November 13, 2009 Author Report Share Posted November 13, 2009 Dzięki za informacje. Zrobiłem tak: Uses crt; var s,i,n:longint; Begin clrscr; Writeln('Wpisz liczbe: '); Read(n); s:=1; i:=n; Repeat s:=s*i; i:=i-1; Until i<=1; Writeln(s); Delay(3000); End. Wszystko działa, dzięki za pomoc. Nareszcie to zrozumiałem Problem tylko w tym, że wywala przy s>5. Co mam zrobić żeby przy większych liczbach nie wywalało? Link to comment Share on other sites More sharing options...
ktoś Posted November 14, 2009 Report Share Posted November 14, 2009 Od razu coś z zakresu optymalizacji: Read(n); i:=n; Jesteś pewny, że potrzebujesz zarówno zmiennej i jak i zmiennej n? Twoj longint jest trochę short. 5! zmieści Ci się w zmiennej typu byte (8 bitów) 8! w word lub shortint (chyba oba mają 16 bitów) 12! w int (32 bity) 20! w longint (64 bity) Oczywiście podałem długości zmiennych unsigned. Kompilator wywala jakiś błąd? To jest gotowy, działający algorytm. I teraz 2 zadania.2) Dające mi odrobinę sadystycznej przyjemności: przepisz ten kod tak, żeby nie wywalił się przy liczeniu silni dla 40 a no musisz sobie sam napisać obsługę zmiennych liczbowych o większej długości. Najłatwiej jest zadeklarować stringa i operować na kolejnych znakach. A że takie rozwiązanie jest do dupy, to inna sprawa. Trochę lepiej będzie na tablicach bajtów, gdzie każdy bajt przyjmuje wartości z zakresu 0-9. Ale nie po to mamy procesor zdolny przeliczać 4 bajty na raz, żeby go katować 10x większą ilością mnożeń, zwłasza, że mamy do dyspozycji inty i longi. BTW: 40! Przyznaję, że ja tutaj poszedłem trochę na łatwiznę, ale ostatecznie ja wieszam się na kablach, a nie na pętlach. A bc to rewelacyjny wynalazek Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.