Pętle w C
W języku programowania C istnieją zasadniczo 3 rodzaje pętli: for, while, do while. 3 pętle różnią się zastosowaniem, ale w przeciwieństwie do innych języków programowania każda pętla jest w stanie (przy odrobinie pracy) wykonać to co może wykonać inna pęŧla (a nie jak for i while w pascal).
A więc zacznijmy omawiać poszczególne pętle:
- pętla for
składnia:
for (inicjalizacja licznika; warunek działania; czynność po wykonaniu jednego obrotu pętli) {
instrukcje
}
(Jeżeli pętla wykonuje jedną instrukcję można pominąć klamry)
przykład:
// W kwesti przypomnienienia nie można stosować czegoś takiego jak for (int i=1; ...) To dozwolone jest tylko w C++
for (i = 0; i<max; ++i) printf ('Oks');
lub
for (i = 1; i<max2; i += 2) printf ('s');
Pętla for najbardziej nadaje się w tedy gdy zazwyczaj wykonujemy określoną liczbę iteracji pętli.
Szczególne postacie pętli:
for (;;) printf ('A'); // nieskończona pętla odpowiednik (while(1))
for (; i<max;) // odpowiednik while (i<max)
- pętla while
składnia:
while (warunek) {
instrukcje
} (klamry dla jednej instrukcji można ominąć)
np,
while (blokada!=false) {
printf ('Nie ma blokady dla licznika: %d', i);
++i;
}
Pętla while najbardziej nadaje się do wykonywania nieznanej ilości iteracji.
Np. Pętla wiadomości w WinApi
Szczególne przypadki:
while (1) {printf ('s');} // nieskońćzona pętla
- pętla do while
składnia:
do {
instrukcje
} while (warunek); (klamry dla jednej instrukcji można ominąć)
np,
do {
printf ('Nie ma blokady dla licznika: %d', i);
++i;
} while (i<12); // Tu zaznaczam że do while zawsze wykona się przynajmniej 1 w przeciwieństwie do while
Pętla do while najbardziej nadaje się do wykonywania nieznanej ilości iteracji>=1.
Np. Pętla wiadomości w WinApi
Szczególne przypadki:
do {} while (1); {printf ('s');} // nieskońćzona pętla
Alternatywne i szczegółne metody (w większości przypadków niepolecane):
1) rekurencja
Przykład
int silnia (int liczba) {
if (liczba==0 || liczba==1) return 1; else return liczba * silnia (liczba-1);
}
int NWD (int a, int b){}
int quick_sort (int *tablica, int rozmiar) {}
UWAGA: wywoływanie kosztuje w pamięci i obliczeniowo. Pamięć na stosie jest ograniczona.
2) zabawy z if i goto (metody ulubione w assemblerze ale nie w c/c++)
przykład:
etykieta:
if (i<12) goto etykieta;
Zaburza strukturę i zaciemnia ideę przewodnią programu.
Jeżeli chcesz stosować goto nagminnie do przejdź na asma.