Wstęp do programowania w języku C/Zadanie algorytmiczne: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Diks (dyskusja | edycje)
 
(Nie pokazano 20 wersji utworzonych przez jednego użytkownika)
Linia 6: Linia 6:
otrzymasz wspaniałe ciasto marchewkowe.
otrzymasz wspaniałe ciasto marchewkowe.


''Składniki:'' <math>1/2</math> szklanki cukru, 2 jajka, $3/4$ szklanki oleju,
''Składniki:''  
szczypta soli, 1 szklanka mąki, 1 łyżeczka sody, 1 łyżeczka cynamonu,
* <math>1/2</math> szklanki cukru,
2 duże marchwie, $3/4$ szklanki posiekanych orzechów, 1 łyżeczka
* 2 jajka,
utartej skórki z pomarańczy, 1 łyżeczka utartej skórki z cytryny.\\[.5cm]
* <math>3/4</math> szklanki oleju,
{\bf Przepis:}\\
* szczypta soli,  
Cukier, jajka i olej ubijać mikserem przez 2 minuty.\\
* 1 szklanka mąki,
W odrębnej miseczce wymieszać mąkę, sól, sodę i cynamon,
* 1 łyżeczka sody,  
a następnie dodać wymieszane składniki do ubitych jajek.\\
* 1 łyżeczka cynamonu,
Miksować 1 minutę.\\
* 2 duże marchwie,
Dołożyć marchew, orzechy, skórkę cytrynową i pomarańczową.\\
* <math>3/4</math> szklanki posiekanych orzechów,
Wymieszać.\\
* 1 łyżeczka utartej skórki z pomarańczy,  
Piec około 30 minut w temperaturze 180 stopni.\\
* 1 łyżeczka utartej skórki z cytryny.
Przygotować {\it krem waniliowy}.\\
 
Zimne ciasto posmarować na górze i po bokach kremem waniliowym.\\[.5cm]
''Przepis:''
 
# Cukier, jajka i olej ubijać mikserem przez 2 minuty.  
# W odrębnej miseczce wymieszać mąkę, sól, sodę i cynamon, a następnie dodać wymieszane składniki do ubitych jajek.
#Miksować 1 minutę.
#Dołożyć marchew, orzechy, skórkę cytrynową i pomarańczową.
#Wymieszać.
#Piec około 30 minut w temperaturze 180 stopni.
#Przygotować ''krem waniliowy''.
#Zimne ciasto posmarować na górze i po bokach kremem waniliowym.


=== Krem waniliowy ===
=== Krem waniliowy ===
  {\bf Składniki:}
''Składniki:''
  3 lyżki miękkiego masła, 2 szklanki cukru pudru,
* 3 łyżki miękkiego masła,
  2 lyżki mleka albo śmietanki, $1/2$ torebki cukru waniliowego.\\[0.5cm]
* 2 szklanki cukru pudru,
  {\bf Przepis:}\\
* 2 łyżki mleka albo śmietanki,  
  Ubijać przez chwilę masło mikserem.\\
* <math>1/2</math> torebki cukru waniliowego.
  Wsypywać stopniowo połowę cukru pudru jednocześnie ubijając.\\
 
  Następnie dodać mleko i wanilię jednocześnie ubijajac.\\
''Przepis:''
  Na koniec dodać resztę cukru pudru ciągle miksując.\\
# Ubijać przez chwilę masło mikserem.
  Jeśli masa jest zbyt gęsta, to dodać więcej mleka.\\[.5cm]
# Wsypywać stopniowo połowę cukru pudru jednocześnie ubijając.
Oto schemat pieczenia ciasta:\\[.5cm]
# Następnie dodać mleko i wanilię jednocześnie ubijajac.
SKŁADNIKI (``dane wejściowe'') $\rightarrow$
# Na koniec dodać resztę cukru pudru ciągle miksując.
[PRZEPIS, (PIEC, NARZĘDZIA, PIEKARZ] (``oprogramowanie i sprzęt'')
# Jeśli masa jest zbyt gęsta, to dodać więcej mleka.
$\rightarrow$ CIASTO ( ``wynik'')
 
=== Algorytm rozwiązywania równania kwadratowego w liczbach rzeczywistych. ===
''Schemat pieczenia ciasta:''
\begin{tabbing}
 
jeż\=eli a = 0, to\\
SKŁADNIKI (''dane wejściowe'') &rarr;
  \>jeż\=eli b = 0, to\\
[PRZEPIS, (PIEC, NARZĘDZIA, PIEKARZ)] (''oprogramowanie i sprzęt'')
      \>\>jeżeli c = 0, to r\a'ownanie jest nieoznaczone\\
&rarr; CIASTO (''wynik'')
      \>\>w przeciwnym razie nie ma rozwiązania\\
 
  \>w przeciwnym razie jest jedno rozwiązanie -c/b\\
=== Rozwiązywanie równania kwadratowego ===
w przeciwnym razie\\
 
  \>policz delta = b*b - 4*a*c\\
Równanie ma postać <math>ax^2+bx+c=0</math>.
  \>jeżeli delta $<$ 0, to nie ma rozwiązania\\
 
  \>w przeciwnym razie istnieją dwa (niekoniecznie r\a'ożne)\\
jeżeli a = 0, to
  \>\>rozwiązania
  jeżeli b = 0, to
      $\frac{-b + \sqrt{delta}}{2a}$ oraz
    jeżeli c = 0, to równanie jest nieoznaczone
      $\frac{-b - \sqrt{delta}}{2a}$.
    w przeciwnym razie nie ma rozwiązania
\end{tabbing}
  w przeciwnym razie jest jedno rozwiązanie -c/b
Schemat rowziązywania równania:\\[.5cm]
w przeciwnym razie
[DANE WEJŚCIOWE: liczby rzeczywiste $a,b,c$] $\rightarrow$ [CZŁOWIEK,
  policz delta = b*b - 4*a*c
MASZYNA] $\rightarrow$
  jeżeli delta $<$ 0, to nie ma rozwiązania
[WYNIK: rozwiązanie równania kwadratowego $ax^2+bx+c=0$].
  w przeciwnym razie istnieją dwa (niekoniecznie różne) rozwiązania:
    <math>\frac{-b + \sqrt{delta}}{2a}</math> oraz <math>\frac{-b - \sqrt{delta}}{2a}</math>.
 
''Schemat rowziązywania równania:''
 
[DANE WEJŚCIOWE (''liczby rzeczywiste a,b,c'')] &rarr; [CZŁOWIEK,
MASZYNA] &rarr;
[WYNIK: ''rozwiązanie równania kwadratowego'' <math>ax^2+bx+c=0</math>].


Zwróćmy uwagę na operacje, które musimy umieć wykonywać na liczbach
Zwróćmy uwagę na operacje, które musimy umieć wykonywać na liczbach
rzeczywistych, żeby móc ro\-zwią\-zy\-wać równanie kwadratowe za pomocą
rzeczywistych, żeby móc rozwiązywać równanie kwadratowe za pomocą
przedstawionego algorytmu. Należą do nich operacje arytmetyczne `+', `-',
przedstawionego algorytmu. Należą do nich operacje arytmetyczne `+', `-',
`*', `/', sqrt oraz porównania `$= 0$' i `$< 0$'.
`*', `/', sqrt oraz porównania `= 0' i `< 0'.
\pagebreak
 
=== Algorytm Euklidesa ===
 
Algorytm Euklidesa obliczania największego wspólnego dzielnika dwóch liczb całkowitych ''m'' i ''n''.
 
dopóki ''m &ne; n'' wykonuj
  jeżeli ''m > n'', to zastąp ''m'' przez ''m - n''
  w przeciwnym razie zastąp ''n'' przez ''n - m''
 
wynikiem jest ''m''.
 
''Schemat obliczania ''NWD(n,m)''
 
[DANE WEJŚCIOWE: (''dodatnie liczby całkowite $m$ i $n$'')] &rarr;
[CZŁOWIEK, MASZYNA] &rarr; [WYNIK: ''NWD(n,m)''].


=== Algorytm Euklidesa obliczania największego wspólnego  dzielnika dwóch liczb całkowitych dodatnich ===
\begin{tabbing}
do\=p\a'oki $m \ne n$ wykonuj\\
  \>jeżeli $m > n$, to zastąp $m$ przez $m - n$\\
  \>w przeciwnym razie zastąp $n$ przez $n - m$\\
\\
wynikiem jest $m$.
\end{tabbing}
Schemat obliczania $NWD(n,m)$:\\[.5cm]
[DANE WEJŚCIOWE: dodatnie liczby całkowite $m$ i $n$] $\rightarrow$
[CZŁOWIEK, MASZYNA] $\rightarrow$ [WYNIK: $NWD(n,m)$].
Algorytm Euklidesa działa dla liczb całkowitych dodatnich z operacją `-'
Algorytm Euklidesa działa dla liczb całkowitych dodatnich z operacją `-'
i relacjami $\ne$ oraz $>$. Jeżeli zamiast operacji odejmowania
i relacjami &ne; oraz >. Jeżeli zamiast operacji odejmowania
`-' wprowadzimy operację brania reszty z dzielenia ($\bmod$),
'-' wprowadzimy operację brania reszty z dzielenia ''mod'', algorytm Euklidesa można zapisać następująco.
algorytm Euklidesa można zapisać następująco.
\begin{tabbing}
policz r r\a'owne $n \bmod m$\\
do\=p\a'oki $r <> 0$ wykonuj\\
  \>zastąp $n$ przez $m$ i $m$ przez $r$\\
  \>policz r r\a'owne $n \bmod m$\\
\\
wynikiem jest $m$.
\end{tabbing}


\end{itemize}
policz r równe ''n mod m''
\pagebreak
dopóki ''r &ne; 0'' wykonuj
{\it Zadanie algorytmiczne} składa się ze
  zastąp ''n'' przez ''m'' i ''m'' przez ''r''
\begin{enumerate}
  policz ''r'' równe ''n mod m''


# scharakteryzowania dopuszczalnego, być może nieskończonego zbioru
wynikiem jest ''m''.
potencjalnych zestawów danych wejściowych oraz


== Zadanie algorytmiczne ==
''Zadanie algorytmiczne'' składa się ze:
# scharakteryzowania dopuszczalnego, być może nieskończonego zbioru potencjalnych zestawów danych wejściowych oraz
# określenia pożądanych wyników jako funkcji danych wejściowych.
# określenia pożądanych wyników jako funkcji danych wejściowych.
\end{enumerate}


Warunki na dane wejściowe i na dane wyjściowe (wyniki) nazywamy
Warunki na dane wejściowe i na dane wyjściowe (wyniki) nazywamy
{\it specyfikacją} zadania algorytmicznego.
''specyfikacją'' zadania algorytmicznego.


Przyjmuje się, że są zadane z góry,
Przyjmuje się, że są zadane z góry, albo opis dozwolonych akcji podstawowych,
albo opis dozwolonych akcji podstawowych,
albo konfiguracja sprzętowa, w ktorą je wbudowano. Rozwiązanie zadania algorytmicznego stanowi ''algorytm'' złożony
albo konfiguracja sprzętowa, w ktorą je wbudowano.
Rozwiązanie zadania algorytmicznego stanowi {\it algorytm} złożony
z elementarnych
z elementarnych
instrukcji zadających akcje z ustalonego zbioru. Algorytm taki, wykonany
instrukcji zadających akcje z ustalonego zbioru. Algorytm taki, wykonany
Linia 110: Linia 119:
instrukcje  sterujące, które wskazują kolejność wykonywania akcji
instrukcje  sterujące, które wskazują kolejność wykonywania akcji
podstawowych. Są trzy podstawowe typy instrukcji sterujących:
podstawowych. Są trzy podstawowe typy instrukcji sterujących:
\begin{itemize}
* następstwo,
# następstwo,
* wybór,
# wybór,
* iteracja (ograniczona, warunkowa).
# iteracja (ograniczona, warunkowa).
 
\end{itemize}
 
Możliwe jest składanie instrukcji podstawowych.
Możliwe jest składanie instrukcji podstawowych. Algorytmy powinny być zapisywane w jednoznaczny i formalny sposób. Językami zapisu algorytmów na użytek komputerów są ''języki programowania''. Język programowania składa sie z notacji
Algorytmy powinny być zapisywane w jednoznaczny i formalny sposób.
i reguł, według których zapisujemy algorytmy. Algorytm zapisany w języku programowania nazywamy ''programem''.
Językami zapisu algorytmów na użytek komputerów są {\it języki
''Programowaniem'' nazywamy proces układania programów dla komputerów.
programowania}.
 
Język programowania składa sie z notacji
== Etapy Programowania ==
i reguł, według których zapisujemy algorytmy.
 
Algorytm zapisany w języku programowania nazywamy {\it programem}.
{\it Programowaniem} nazywamy proces układania programów dla komputerów.
\pagebreak
\begin{center}
==     Etapy Programowania ==
\end{center}
\begin{enumerate}
# Etap projektowania
# Etap projektowania
\begin{itemize}
#* analiza problemu
# analiza problemu
#* specyfikacja rozwiązania problemu
# specyfikacja rozwiązania problemu
#* układanie algorytmu
# układanie algorytmu
#* sprawdzenie poprawności rozwiązania (zgodności ze specyfikacją)
# sprawdzenie poprawności rozwiązania (zgodności ze specyfikacją)
\end{itemize}
 
# Etap implementacji
# Etap implementacji
\begin{itemize}
#* kodowanie (tłumaczenie algorytmu na język programowania)
# kodowanie (tłumaczenie algorytmu na język programowania)
#* testowanie i usuwanie błędów (z pomocą komputera)
# testowanie i usuwanie błędów (z pomocą komputera)
\end{itemize}
 
# Etap instalacji na docelowym komputerze
# Etap instalacji na docelowym komputerze
# Etap użytkowania i pielęgnacji
# Etap użytkowania i pielęgnacji
\end{enumerate}
\pagebreak


== Język C ==
== Język C ==
Linia 156: Linia 147:
Dennisa Ritchie w 1972 roku. W roku 1973 część systemu operacyjnego
Dennisa Ritchie w 1972 roku. W roku 1973 część systemu operacyjnego
UNIX została przepisana w C. W 1978 Brian Kernigham i Dennis Ritchie
UNIX została przepisana w C. W 1978 Brian Kernigham i Dennis Ritchie
opublikowali książkę ``Język programowania C'', która wkrótce
opublikowali książkę ''Język programowania C'', która wkrótce
stała się biblią dla programujących w C. W roku 1989 Amerykański
stała się biblią dla programujących w C. W roku 1989 Amerykański
Narodowy Instytut Standaryzacji (American National Standards Institute)
Narodowy Instytut Standaryzacji (American National Standards Institute)
Linia 194: Linia 185:
       printf(" Rownanie ma dwa rozwiazania:\n ");
       printf(" Rownanie ma dwa rozwiazania:\n ");
       printf("x1 = %.2f, x2 = %.2f",
       printf("x1 = %.2f, x2 = %.2f",
             (-b-sqrt(delta))/2,(-b+sqrt(delta))/2);
             (-b-sqrt(delta))/(2*a),(-b+sqrt(delta))/(2*a));
     }
     }
   }
   }
Linia 216: Linia 207:
   printf(" dodatnie m i n < ");
   printf(" dodatnie m i n < ");
   scanf("%d %d", &m, &n);
   scanf("%d %d", &m, &n);
   printf(ŃWD(%d,%d) = ", m, n);
   printf("NWD(%d,%d) = ", m, n);


   while ( n != m)
   while ( n != m)
Linia 223: Linia 214:
     else
     else
       m = m - n;
       m = m - n;
^M  printf("%d\n", m);
  printf("%d\n", m);
   return 0;
   return 0;
}
}
Linia 239: Linia 230:
   printf(" dodatnie m i n < ");
   printf(" dodatnie m i n < ");
   scanf("%d %d", &m, &n);
   scanf("%d %d", &m, &n);
   printf(ŃWD(%d,%d) = ", m, n);
   printf("NWD(%d,%d) = ", m, n);


   r = n % m;
   r = n % m;
Linia 252: Linia 243:


</Source>
</Source>
\end{enumerate}


== Inny język ==
== Inny język ==
Linia 260: Linia 249:


<Source>
<Source>
program Rownanie(Input,Output);
program Rownanie(Input,Output);
var
var
Linia 288: Linia 276:
end.
end.


\pagebreak
program NWD1(input,output);
program NWD1(input,output);
var
var
Linia 302: Linia 289:
   Writeln('Najwiekszy wspolny dzielnik wynosi : ', m)
   Writeln('Najwiekszy wspolny dzielnik wynosi : ', m)
end.
end.


program NWD2(input,output);
program NWD2(input,output);
Linia 325: Linia 308:


end.
end.
</Source>


</Source>
== Struktura programu w C ==
Żeby program był zrozumiały" przez komputer musi być napisany zgodnie
 
Żeby program był zrozumiały przez komputer musi być napisany zgodnie
ze sztywnymi regułami dopuszczającymi używanie jedynie specjalnych
ze sztywnymi regułami dopuszczającymi używanie jedynie specjalnych
kombinacji wybranych symboli i słów kluczowych języka programowania,
kombinacji wybranych symboli i słów kluczowych języka programowania,
w którym piszemy nasz program. Zestaw reguł, o których jest mowa
w którym piszemy nasz program. Zestaw reguł, o których jest mowa
powyżej nazywamy {\it składnią języka programowania}.\\
powyżej nazywamy ''składnią języka programowania''.
 
Oprócz wyposażenia języka programowania w precyzyjną składnię potrzebne
Oprócz wyposażenia języka programowania w precyzyjną składnię potrzebne
jest jeszcze formalne i jednoznaczne określenie znaczenia ({\it semantyki})
jest jeszcze formalne i jednoznaczne określenie znaczenia (''semantyki'')
każdego wyrażenia dozwolonego składniowo.
każdego wyrażenia dozwolonego składniowo.
\\[0.5cm]
 
Ogólna struktura prostego programu w C:\\
 
  {\it dyrektywy preprocesora} \\
Ogólna struktura prostego programu w C:
main()\\
  ''dyrektywy preprocesora''
\{\\
main()
{\it deklaracje}\\
{
{\it instrukcje}\\
''deklaracje''
\}\\[0.5cm]
''instrukcje''
}
 
Żeby komputer wykonał algorytm należy postępować według następującego
Żeby komputer wykonał algorytm należy postępować według następującego
schematu:\\[.5cm]
schematu:
algorytm $\rightarrow$ programowanie ( w C )  $\rightarrow$ program ( w C )
 
$\rightarrow$ kompilacja $\rightarrow$ program w asemblerze $\rightarrow$
algorytm &rarr; programowanie (w C)  &rarr; program (w C) &rarr; kompilacja &rarr; program w asemblerze &rarr; kod maszynowy &rarr; ładowanie i wykonanie programu.
kod maszynowy $\rightarrow$ ładowanie i wykonanie programu.
 
== Pojęcie algorytmu ==
''Geneza pojęcia algorytm:''


\pagebreak
Geneza pojęcia algorytm:\\
Jest  to  termin  średniowieczno-łaciński,  ale  wywodzący  się  z
Jest  to  termin  średniowieczno-łaciński,  ale  wywodzący  się  z
arabskiego. Pochodzi  od  imienia  perskiego uczonego
arabskiego. Pochodzi  od  imienia  perskiego uczonego
Linia 364: Linia 352:
Te  dwa  połączone  nurty  dały
Te  dwa  połączone  nurty  dały
wspaniały wynik w postaci  pozycyjnego  zapisu  liczby  i  rozwoju
wspaniały wynik w postaci  pozycyjnego  zapisu  liczby  i  rozwoju
metod rachunkowych. \\[0.5cm]
metod rachunkowych.
Euklides: matematyk grecki żyjący około 300 lat p.n.e.

Aktualna wersja na dzień 11:46, 14 paź 2006

Przykłady algorytmów

Ciasto marchewkowe

Jeżeli weźmiesz produkty w podanych ilościach i postąpisz zgodnie z opisanymi czynnościami na pewno osiągniesz sukces - otrzymasz wspaniałe ciasto marchewkowe.

Składniki:

  • 1/2 szklanki cukru,
  • 2 jajka,
  • 3/4 szklanki oleju,
  • szczypta soli,
  • 1 szklanka mąki,
  • 1 łyżeczka sody,
  • 1 łyżeczka cynamonu,
  • 2 duże marchwie,
  • 3/4 szklanki posiekanych orzechów,
  • 1 łyżeczka utartej skórki z pomarańczy,
  • 1 łyżeczka utartej skórki z cytryny.

Przepis:

  1. Cukier, jajka i olej ubijać mikserem przez 2 minuty.
  2. W odrębnej miseczce wymieszać mąkę, sól, sodę i cynamon, a następnie dodać wymieszane składniki do ubitych jajek.
  3. Miksować 1 minutę.
  4. Dołożyć marchew, orzechy, skórkę cytrynową i pomarańczową.
  5. Wymieszać.
  6. Piec około 30 minut w temperaturze 180 stopni.
  7. Przygotować krem waniliowy.
  8. Zimne ciasto posmarować na górze i po bokach kremem waniliowym.

Krem waniliowy

Składniki:

  • 3 łyżki miękkiego masła,
  • 2 szklanki cukru pudru,
  • 2 łyżki mleka albo śmietanki,
  • 1/2 torebki cukru waniliowego.

Przepis:

  1. Ubijać przez chwilę masło mikserem.
  2. Wsypywać stopniowo połowę cukru pudru jednocześnie ubijając.
  3. Następnie dodać mleko i wanilię jednocześnie ubijajac.
  4. Na koniec dodać resztę cukru pudru ciągle miksując.
  5. Jeśli masa jest zbyt gęsta, to dodać więcej mleka.

Schemat pieczenia ciasta:

SKŁADNIKI (dane wejściowe) → [PRZEPIS, (PIEC, NARZĘDZIA, PIEKARZ)] (oprogramowanie i sprzęt) → CIASTO (wynik)

Rozwiązywanie równania kwadratowego

Równanie ma postać ax2+bx+c=0.

jeżeli a = 0, to
  jeżeli b = 0, to
    jeżeli c = 0, to równanie jest nieoznaczone
    w przeciwnym razie nie ma rozwiązania
  w przeciwnym razie jest jedno rozwiązanie -c/b
w przeciwnym razie
  policz delta = b*b - 4*a*c
  jeżeli delta $<$ 0, to nie ma rozwiązania
  w przeciwnym razie istnieją dwa (niekoniecznie różne) rozwiązania:
    b+delta2a oraz bdelta2a.

Schemat rowziązywania równania:

[DANE WEJŚCIOWE (liczby rzeczywiste a,b,c)] → [CZŁOWIEK, MASZYNA] → [WYNIK: rozwiązanie równania kwadratowego ax2+bx+c=0].

Zwróćmy uwagę na operacje, które musimy umieć wykonywać na liczbach rzeczywistych, żeby móc rozwiązywać równanie kwadratowe za pomocą przedstawionego algorytmu. Należą do nich operacje arytmetyczne `+', `-', `*', `/', sqrt oraz porównania `= 0' i `< 0'.

Algorytm Euklidesa

Algorytm Euklidesa obliczania największego wspólnego dzielnika dwóch liczb całkowitych m i n.

dopóki m ≠ n wykonuj
  jeżeli m > n, to zastąp m przez m - n
  w przeciwnym razie zastąp n przez n - m

wynikiem jest m.

Schemat obliczania NWD(n,m)

[DANE WEJŚCIOWE: (dodatnie liczby całkowite $m$ i $n$)] → [CZŁOWIEK, MASZYNA] → [WYNIK: NWD(n,m)].

Algorytm Euklidesa działa dla liczb całkowitych dodatnich z operacją `-' i relacjami ≠ oraz >. Jeżeli zamiast operacji odejmowania '-' wprowadzimy operację brania reszty z dzielenia mod, algorytm Euklidesa można zapisać następująco.

policz r równe n mod m
dopóki r ≠ 0 wykonuj
  zastąp n przez m i m przez r
  policz r równe n mod m 

wynikiem jest m.

Zadanie algorytmiczne

Zadanie algorytmiczne składa się ze:

  1. scharakteryzowania dopuszczalnego, być może nieskończonego zbioru potencjalnych zestawów danych wejściowych oraz
  2. określenia pożądanych wyników jako funkcji danych wejściowych.

Warunki na dane wejściowe i na dane wyjściowe (wyniki) nazywamy specyfikacją zadania algorytmicznego.

Przyjmuje się, że są zadane z góry, albo opis dozwolonych akcji podstawowych, albo konfiguracja sprzętowa, w ktorą je wbudowano. Rozwiązanie zadania algorytmicznego stanowi algorytm złożony z elementarnych instrukcji zadających akcje z ustalonego zbioru. Algorytm taki, wykonany dla dowolnego dopuszczalnego zestawu danych wejściowych, zawsze rozwiąże zadanie dostarczając wynik zgodny z oczekiwaniami. Algorytm musi zawierać instrukcje sterujące, które wskazują kolejność wykonywania akcji podstawowych. Są trzy podstawowe typy instrukcji sterujących:

  • następstwo,
  • wybór,
  • iteracja (ograniczona, warunkowa).


Możliwe jest składanie instrukcji podstawowych. Algorytmy powinny być zapisywane w jednoznaczny i formalny sposób. Językami zapisu algorytmów na użytek komputerów są języki programowania. Język programowania składa sie z notacji i reguł, według których zapisujemy algorytmy. Algorytm zapisany w języku programowania nazywamy programem. Programowaniem nazywamy proces układania programów dla komputerów.

Etapy Programowania

  1. Etap projektowania
    • analiza problemu
    • specyfikacja rozwiązania problemu
    • układanie algorytmu
    • sprawdzenie poprawności rozwiązania (zgodności ze specyfikacją)
  2. Etap implementacji
    • kodowanie (tłumaczenie algorytmu na język programowania)
    • testowanie i usuwanie błędów (z pomocą komputera)
  3. Etap instalacji na docelowym komputerze
  4. Etap użytkowania i pielęgnacji

Język C

Na tych zajęciach do zapisywania algorytmów będziemy używać języka programowania C. Język C został zaprojektowany przez Dennisa Ritchie w 1972 roku. W roku 1973 część systemu operacyjnego UNIX została przepisana w C. W 1978 Brian Kernigham i Dennis Ritchie opublikowali książkę Język programowania C, która wkrótce stała się biblią dla programujących w C. W roku 1989 Amerykański Narodowy Instytut Standaryzacji (American National Standards Institute) przyjął standard języka C zwany odtąd ANSI C. Ta wersja będzie podstawą tego wykładu.

Oto omówione poprzednio algorytmy zapisane w języku C:

Równanie kwadratowe

#include <stdio.h>
#include <math.h>

main()
{
  double  a, b, c,
          delta;

  printf(" Podaj wspolczynniki a, b, c < ");
  scanf("%lf %lf %lf", &a, &b, &c);

  if ( a == 0 )
    if ( b == 0 )
      if ( c == 0)
        printf(" Rownanie nieoznaczone.\n ");
      else
        printf(" Rownanie nie ma rozwiazania.\n");
    else{
      printf(" Rownanie ma jedno");
      printf(" rozwiazanie: %.2f\n ", -c/b);
    }
  else{
    delta = b*b - 4*a*c;
    if ( delta < 0 )
      printf(" Rownanie nie ma rozwiazania.\n ");
    else{
      printf(" Rownanie ma dwa rozwiazania:\n ");
      printf("x1 = %.2f, x2 = %.2f",
             (-b-sqrt(delta))/(2*a),(-b+sqrt(delta))/(2*a));
    }
  }

  return 0;
}

Algorytm Euklidesa

/* Algorytm Euklidesa z odejmowaniem. */

#include <stdio.h>

main()
{
  int m, n;

  printf("Podaj dwie liczby calkowite");
  printf(" dodatnie m i n < ");
  scanf("%d %d", &m, &n);
  printf("NWD(%d,%d) = ", m, n);

  while ( n != m)
    if ( n > m)
      n = n - m;
    else
      m = m - n;
   printf("%d\n", m);
   return 0;
}


/* Algorytm Euklidesa z ``dzieleniem''. */

#include <stdio.h>

main()
{
  int m, n, r;

  printf("Podaj dwie liczby calkowite");
  printf(" dodatnie m i n < ");
  scanf("%d %d", &m, &n);
  printf("NWD(%d,%d) = ", m, n);

  r = n % m;
  while ( r != 0){
    n = m;
    m = r;
    r = n % m;
  }
  printf("%d\n", m);
  return 0;
}

Inny język

Oto te same algorytmy zapisane w innym języku programowania --- w Pascalu (Wirth, 1971).

program Rownanie(Input,Output);
var
  a,b,c,
  delta : Real;
begin
  Write('Podaj wspolczynniki rownania');
  Writeln(' oddzielone pojedynczym odstepem:');
  Readln(a,b,c);

  if a = 0 then
    if b = 0 then
      if c = 0 then
        Writeln('Rownanie nieoznaczone.')
      else Writeln('Rownanie nie ma rozwiazania.')
    else Writeln('Rownanie ma jedno rozwiazanie: ',
                  -c/b)
  else
  begin
    delta := b*b - 4*a*c;
    if delta < 0 then
      Writeln('Rownanie nie ma rozwiazania.')
    else
      Writeln('x1 = ',(-b+Sqrt(delta))/(2*a),
              ' x2 = ',(-b-Sqrt(delta))/(2*a)
  end
end.

program NWD1(input,output);
var
  n, m : Integer;
begin
  Writeln('Podaj n i m oddzielone znakiem odstepu.');
  Readln(N,M);

  while n <> m do
    if n > m then n := n - m
    else m := m - n;

  Writeln('Najwiekszy wspolny dzielnik wynosi : ', m)
end.

program NWD2(input,output);
var
  n, m,
  r     : Integer;
begin

  Writeln('Podaj n i m oddzielone znakiem odstepu.');
  Readln(N,M);

  r := n mod m;
  while r <> 0 do
  begin
    n := m; m := r; r := n mod m
  end;

  Writeln('Najwiekszy wspolny dzielnik wynosi : ', m)

end.

Struktura programu w C

Żeby program był zrozumiały przez komputer musi być napisany zgodnie ze sztywnymi regułami dopuszczającymi używanie jedynie specjalnych kombinacji wybranych symboli i słów kluczowych języka programowania, w którym piszemy nasz program. Zestaw reguł, o których jest mowa powyżej nazywamy składnią języka programowania.

Oprócz wyposażenia języka programowania w precyzyjną składnię potrzebne jest jeszcze formalne i jednoznaczne określenie znaczenia (semantyki) każdego wyrażenia dozwolonego składniowo.


Ogólna struktura prostego programu w C:
dyrektywy preprocesora
main()
{
deklaracje
instrukcje
}

Żeby komputer wykonał algorytm należy postępować według następującego schematu:

algorytm → programowanie (w C) → program (w C) → kompilacja → program w asemblerze → kod maszynowy → ładowanie i wykonanie programu.

Pojęcie algorytmu

Geneza pojęcia algorytm:

Jest to termin średniowieczno-łaciński, ale wywodzący się z arabskiego. Pochodzi od imienia perskiego uczonego Muhammeda Al-Chwarizmi (IX wiek). Jego nazwisko pisane po łacinie brzmialo Algorismus. Dlaczego imię Al-Chwarizmiego przetrwało w postaci terminu algorytm? Otóż napisał on wiele prac naukowych, z których większość zachowała się. Oto one: Tablice (astronomia, kalendarz, sinus, cotangens), Arytmetyka (hinduski zapis pozycyjny, metody rachunkowe), Algebra (równania liniowe i kwadratowe), Kalendarz Żydowski, Kroniki, Geografia, Astrologia. Oczywiscie czerpal wiele z nauki greckiej i hinduskiej. Te dwa połączone nurty dały wspaniały wynik w postaci pozycyjnego zapisu liczby i rozwoju metod rachunkowych.