<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>https://wiki.otwartaedukacja.pl/index.php?action=history&amp;feed=atom&amp;title=Implementacja_algorytm%C3%B3w</id>
	<title>Implementacja algorytmów - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.otwartaedukacja.pl/index.php?action=history&amp;feed=atom&amp;title=Implementacja_algorytm%C3%B3w"/>
	<link rel="alternate" type="text/html" href="https://wiki.otwartaedukacja.pl/index.php?title=Implementacja_algorytm%C3%B3w&amp;action=history"/>
	<updated>2026-05-01T17:45:25Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>https://wiki.otwartaedukacja.pl/index.php?title=Implementacja_algorytm%C3%B3w&amp;diff=34&amp;oldid=prev</id>
		<title>Admin: Utworzono nową stronę &quot;== Implementacja algorytmów ==  Algorytmy to dokładny opis sposobu postępowania prowadzącego do określonego wyniku. Kolejne kroki algorytmu zapisuje się sekwencyjn...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.otwartaedukacja.pl/index.php?title=Implementacja_algorytm%C3%B3w&amp;diff=34&amp;oldid=prev"/>
		<updated>2017-06-26T20:22:42Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot;== Implementacja algorytmów ==  Algorytmy to dokładny opis sposobu postępowania prowadzącego do określonego wyniku. Kolejne kroki algorytmu zapisuje się sekwencyjn...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Implementacja algorytmów ==&lt;br /&gt;
&lt;br /&gt;
Algorytmy to dokładny opis sposobu postępowania prowadzącego do określonego wyniku. Kolejne kroki algorytmu zapisuje się sekwencyjnie (jeden po drugim). Środki używane do tego opisu mogą być różne. Najstarsze opisy miały charakter słowny. Na przykład starożytny matematyk grecki Euklides zauważył, że [https://pl.wikipedia.org/wiki/Algorytm_Euklidesa największy wspólny podzielnik dwóch liczb nie zmienia się, gdy od większej odejmiemy mniejszą]. Ta informacja wystarczy do sformułowania algorytmu znajdowania największego wspólnego mianownika (nazwanego algorytmem Euklidesa): odejmuj od większej liczby mniejszą, aż obie będą równe – wtedy każda z nich jest równa największemu wspólnemu mianownikowi pierwotnych liczb.&lt;br /&gt;
&lt;br /&gt;
Na [http://eduinf.waw.pl/inf/utils/010_2010/0208.php stronach I LO w Tarnowie] opisano dokładnie ten algorytm, podając kilka innych niż słowne jego opisów. W czasach rozwoju algorytmiki współczesnej dużą popularność zdobyły opisy rysunkowe algorytmów, zwane schematami blokowymi lub schematami przepływu. Na stronie [http://www.otwartaedukacja.pl/programowanie/schematy/ http://www.otwartaedukacja.pl/programowanie/schematy/] dostępne jest oprogramowanie do rysowania takich schematów (w planach jest jego rozwój – tak aby uzyskać możliwość zapamiętywania prac i generowania kodu programu). Nim narysowano poniższy diagram:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Nwp1.png]]&lt;br /&gt;
&lt;br /&gt;
Strzałki pokazują kierunek przepływu, a romby podejmowane decyzje. Znakami := oznaczamy operację podstawienia do zmiennej (a:=9 oznacza, że zmienna a otrzymuje wartość 9). Analizując krok po kroku taki diagram możemy zrozumieć działanie algorytmu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rysowanie algorytmów ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aby takie diagramy móc prosto przekształcić na programy, muszą one składać się ze schematów, którym można przyporządkować instrukcje programów. W zasadzie wystarczy trzy rodzaje schematów:&lt;br /&gt;
&lt;br /&gt;
- instrukcja warunkowa (wykonanie czegoś jeśli sprawdzony jest warunek);&lt;br /&gt;
- powtarzanie pod zadanym warunkiem;&lt;br /&gt;
- powtarzanie aż osiągnie się oczekiwany efekt (postawiony warunek).&lt;br /&gt;
&lt;br /&gt;
Stanie się to jasne, gdy przeanalizujemy przykłady (więcej szczegółów - zobacz kurs Pascala, który opublikował Aleksander Smywiński-Pohl: [http://www.apohllo.pl/dydaktyka/wdi/pascal http://www.apohllo.pl/dydaktyka/wdi/pascal]).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1. Instrukcja warunkowa (if)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Block_if.png]]&lt;br /&gt;
&lt;br /&gt;
Przykład:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot; &amp;gt;&lt;br /&gt;
if wyr_log then&lt;br /&gt;
  {instrukcja_1}&lt;br /&gt;
else&lt;br /&gt;
  {instrukcja_2};&lt;br /&gt;
{instrukcja_3};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;2. Powtarzanie pod zadanym warunkiem - pętla while&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Block-while.png]]&lt;br /&gt;
&lt;br /&gt;
Przykład:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot; &amp;gt;&lt;br /&gt;
var &lt;br /&gt;
 znak : char;&lt;br /&gt;
begin &lt;br /&gt;
 while not EOF do begin // poki jest coś do przeczytania - czytaj ze standardowego urządzenia wejście i zapisz na wyjście.&lt;br /&gt;
   read(znak);&lt;br /&gt;
   write(znak);&lt;br /&gt;
 end;&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;3. Powtarzanie aż osiągnie się oczekiwany efekt - pętla repeat&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Plik:Block-repeat.png]]&lt;br /&gt;
&lt;br /&gt;
Przykład:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot; &amp;gt;&lt;br /&gt;
var &lt;br /&gt;
 znak: char;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
 repeat &lt;br /&gt;
   writeln(&amp;quot;Wprowadź znak i naciśnij [enter]. Aby zakończyć wprowadź &amp;#039;k&amp;#039;&amp;quot;);&lt;br /&gt;
   readln(znak);&lt;br /&gt;
   write(&amp;quot;Wprowadziłeś &amp;quot;);&lt;br /&gt;
   writeln(znak);&lt;br /&gt;
 until znak = &amp;#039;k&amp;#039;;&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Od schematu do programu ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zobaczmy na przykładzie jak przekształcić najpierw diagram na postać standardową (złożoną wyłącznie z powyższych wzorców), a następnie na instrukcje.&lt;br /&gt;
&lt;br /&gt;
Schemat algorytmu NWP po przekształceniu na postać standardową:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Nwp2.png]]&lt;br /&gt;
&lt;br /&gt;
Schemat ten stworzony na portalu [http://www.otwartaedukacja.pl/programowanie/schematy/ http://www.otwartaedukacja.pl/programowanie/schematy/] &lt;br /&gt;
&lt;br /&gt;
Większe możliwości daje (angielski) portal [http://www.js-graph.net/demos/jsgdemoext/ http://www.js-graph.net/demos/jsgdemoext/].&lt;br /&gt;
&lt;br /&gt;
Poniższy rysunek pokazuje algorytm „rozkomponowany”. Wydzielono dwie „instrukcje”: pętlę powtarzania pod warunkiem (while - zielony) oraz instrukcję warunkową (wykonaj coś pod warunkiem, if, kolor popielaty).&lt;br /&gt;
&lt;br /&gt;
[[Plik:Nwp3.png]]&lt;br /&gt;
Możemy już zamienić te schematy na instrukcje Pascala. Zastosujemy metodę od ogółu do szczegółu.&lt;br /&gt;
&lt;br /&gt;
1. Najpierw szkielet programu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot; &amp;gt;&lt;br /&gt;
// start&lt;br /&gt;
&lt;br /&gt;
czytaj(a,b);&lt;br /&gt;
&lt;br /&gt;
// szukaj_nwp&lt;br /&gt;
&lt;br /&gt;
wypisz_wynik;&lt;br /&gt;
&lt;br /&gt;
//stop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Teraz sam algorytm :&lt;br /&gt;
&lt;br /&gt;
* schemat zielony: &amp;#039;&amp;#039;&amp;#039;while a&amp;lt;&amp;gt;b do [schemat szary]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* schemat szary: &amp;#039;&amp;#039;&amp;#039;if a&amp;lt;b then b:=b-a else a:=a-b;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Składamy to wszystko razem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot; &amp;gt;&lt;br /&gt;
// start&lt;br /&gt;
&lt;br /&gt;
czytaj(a,b);&lt;br /&gt;
&lt;br /&gt;
// szukaj_nwp&lt;br /&gt;
&lt;br /&gt;
while a&amp;lt;&amp;gt;b do if a&amp;lt;b then b:=b-a else a:=a-b;&lt;br /&gt;
&lt;br /&gt;
wypisz_wynik;&lt;br /&gt;
&lt;br /&gt;
//stop&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. Na koniec wypełniamy szczegóły&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot; line=&amp;quot;1&amp;quot; &amp;gt;&lt;br /&gt;
// start&lt;br /&gt;
var a,b : integer;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
//czytaj(a,b);&lt;br /&gt;
write(&amp;#039;a=&amp;#039;);readln(a);&lt;br /&gt;
write(&amp;#039;b=&amp;#039;);readln(b);&lt;br /&gt;
&lt;br /&gt;
// szukaj_nwp&lt;br /&gt;
while a&amp;lt;&amp;gt;b do if a&amp;lt;b then b:=b-a else a:=a-b;&lt;br /&gt;
&lt;br /&gt;
// wypisz_wynik;&lt;br /&gt;
writeln(&amp;#039;NWP=&amp;#039;,a);&lt;br /&gt;
&lt;br /&gt;
//stop&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Składanie programu z klocków ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Początkującym programistom może pomóc układanie programów z klocków – podobnych nieco do klocków Lego. Pomysł pochodzi z amerykańskiego projektu [https://scratch.mit.edu/ Scratch] - przeznaczonego do nauki programowania przez dla dzieci.&lt;br /&gt;
&lt;br /&gt;
Pod adresem [http://www.otwartaedukacja.pl/programowanie/bl/code/ http://www.otwartaedukacja.pl/programowanie/bl/code/] przygotowano taki graficzny edytor programów, który wykorzystuje projekt Blocky rozwijany przez Google.&lt;br /&gt;
&lt;br /&gt;
Powyższy algorytm Euclidesa może zostać poskładany z klocków następująco:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Nwp-bl.png]]&lt;br /&gt;
&lt;br /&gt;
Ten portal umożliwia między innymi generowanie kodu w różnych językach programowania. Na przykład w języku Python. Wśród bloczków nie ma operacji pobierania danych. Po ich dopisaniu (dwie pierwsze linijki - w miejsce zainicjowania konkretnymi liczbami) uzyskamy program:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot; &amp;gt;&lt;br /&gt;
a=int(input(&amp;#039;liczba a=&amp;#039;))&lt;br /&gt;
b=int(input(&amp;#039;liczba b=&amp;#039;))&lt;br /&gt;
while b != a:&lt;br /&gt;
  if a &amp;lt; b:&lt;br /&gt;
    b = b - a&lt;br /&gt;
  else:&lt;br /&gt;
    a = a - b&lt;br /&gt;
print(a)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wyjaśnienia wymagają zapisane w pierwszych linijkach operacje pobierania danych. Zapis int() oznacza wprowadzanie liczby całkowitej, input() odczyt tego co użytkownik komputera pisze na klawiaturze, a napisy (łańcuchy znaków) &amp;#039;liczba ...=&amp;#039; - co się wyświetli przed pobraniem danych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programowanie w Pythonie ==&lt;br /&gt;
&lt;br /&gt;
Porównując przejrzystość zapisu schematów blokowych, bloczków, programu w Pascalu i Pythonie, dyskusyjne wydaje się twierdzenie, że reprezentacja graficzna jest lepsza. Jeśli dodatkowo weźmie się pod uwagę, że programiści zaprzestali pisania programów w sposób mało przejrzysty – wydaje się, że nauczanie nawet małych dzieci programowania w takim języku jak Python jest lepszym pomysłem, niż zabawa z bloczkami. Choćby dlatego, że możemy liczyć na pomoc olbrzymiej społeczności programistów Pythona. Przeglądając kody programów dostępnych w internecie raczej rzadko trafimy na tak mało przejrzysty zapis, jak powyżej. Częściej będzie to coś w rodzaju:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot; &amp;gt;&lt;br /&gt;
pierwsza_liczba=int(input(&amp;#039;Podaj pierwszą liczbę całkowitą=&amp;#039;))&lt;br /&gt;
druga_liczba=int(input(&amp;#039;Podaj drugą liczbę całkowitą=&amp;#039;))&lt;br /&gt;
while druga_liczba != pierwsza_liczba:&lt;br /&gt;
  if pierwsza_liczba &amp;lt; druga_liczba:&lt;br /&gt;
    druga_liczba = druga_liczba - pierwsza_liczba&lt;br /&gt;
  else:&lt;br /&gt;
    pierwsza_liczba = pierwsza_liczba - druga_liczba&lt;br /&gt;
print(&amp;#039;Największy wspólny podzielnik=&amp;#039;,pierwsza_liczba)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pewną trudność sprawia fakt, że dostępne podręczniki programowania uczą konkretnych języków. Brakuje podręcznika, który pomagałby w nauce programowania, umożliwiając poznawanie języka niejako przy okazji. Dlatego taki podręcznik jest przygotowywany na zasadach otwartych.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>