Programowanie Ins ster

Z Skrypty dla studentów Ekonofizyki UPGOW

Instrukcje sterujące

Instrukcje sterujące służą do podejmowania decyzji w programie. Omówię je w składni występującej w języku C, identyczna syntaktyka została zresztą zaadoptowana w kolejnych językach C++, Java, C#. W języku C nie występują zmienne typu logicznego, czyli takie, które mogą przyjmować tylko dwie wartości true (prawda) lub false (fałsz). W zamian sprawdza się po prostu wartość danej zmiennej lub wyrażenia. Jeżeli wyrażenie ma liczbową wartość zero, to jego logiczna wartość (stan) jest false. Gdy wartość liczbowa wyrażenia różni się od zera, wówczas jego stan logiczny jest true. Naturalnie, stan logiczny true albo false otrzymamy również gdy w danym wyrażeniu występują operatory logiczne (np. > , < , = =, ...). W MATLAB także nie występuje expicite typ logiczny, obowiązuje w zamian taka sama konwencja, jak w języku C.

Spis treści


Instrukcja warunkowa if

Instrukcja warunkowa if ma postac:

if (warunek)

instrukcja;
Gdy wyrażenie w nawiasie ma wartość różną do zera czyli jest logicznie prawdziwe, instrukcja jest wykonywana, w przeciwnym wypadku pomijana. Słowo „wyrażenie” w nawiasie lepiej ze względów dydaktycznych zastąpić słowem „warunek”, które bezpośrednio oddaje sens logiczny wyrażenia, o to właśnie chodzi przy instrukcjach sterujących. Przykład:
int i = 2,  j = 4,  k;
if (i < j)   k = i + j;
Opcja zastąpienia pojedynczej instrukcji przez blok instrukcji obowiązuje także dla innych instrukcji sterujących, nie będę już tego powtarzał przy ich omawianiu poniżej.

Występuje bardziej rozbudowana forma instrukcji warunkowej if;

if(warunek)

instrukcja_A;

else

instrukcja_B;
Jeżeli warunek w nawiasie jest prawdziwy (wartość wyrażenia różna od zera), wykonywana jest instrukcja_A, w przeciwnym wypadku instrukcja_B. Przykład:
int i, j, k;                                                  
if  ( i  <  j )                                        
  k = j - i;
else
  k = i - j;

Pętle

Pętla while

while (warunek)

instrukcja;
Jeżeli warunek jest spełniony/prawdziwy, to instrukcja zostaje wykonywana i ponownie przystępuje się do testowania prawdziwości warunku w nawiasie. Instrukcja wykonywana jest tak długo, jak długo jest prawdziwy warunek. Dopiero, gdy wyrażenie w nawiasie przyjmie wartość zero (warunek nieprawdziwy), nastąpi przerwanie pętli i przejście do wykonywania instrukcji programu poniżej pętli. Instrukcja występująca w pętli while w ogóle nie będzie wykonywana, gdy warunek od razu nie jest prawdziwy. Przykład:
int i = 0, j = 6, r;
while (i < j)    {   
  r = j - i; 
  i = i + 1;           }

Pętla zostaje wykonana 6 razy, po zakończeniu iteracji zmienna r = 1.

Pętla do ... while

Pętla iteracyjna do … while przyjmuje postać

do

instrukcja;

while(warunek)

Najpierw wykonywana jest instrukcja, następnie sprawdzany warunek logiczny, jeżeli jest prawdziwy, wykonanie instrukcji zostanie powtórzone. Znowu jest sprawdzany warunek w nawiasie, i tak w kółko, dopóki warunek jest prawdziwy. Warunek jest badany po wykonaniu instrukcji, a nie przed, jak w pętli while. Instrukcja zostanie wykonana co najmniej jeden raz, nawet gdy warunek nie będzie prawdziwy od początku. Przykład:
int i = 1, s = 0;
do 
s = s + i * i;
while (i < 6);

pętla liczy sumę s kwadratów liczb naturalnych od 1 do 5, po jej zakończeniu s = 1 + 4 + 9 + 16 + 25 = 55.

Pętla for

Pętla for ma postać:

for (instr_pocz; warunek; instr_krok)

instrukcja;

Najpierw wykonywana jest instr_pocz (początkowa), potem sprawdza się warunek, jeżeli warunek prawdziwy, to wykonywana jest instrukcja będąca treścią pętli. Na zakończenie każdego obiegu pętli wykonywana jest instr_krok. Instrukcja instr_pocz nie musi być tylko jedną instrukcją, może być ich kilka, wtedy są oddzielone przecinkami, podobnie jest w przypadku instr_krok. Składniki pętli: instr_pocz, warunek, instr_krok - niekoniecznie muszą wystąpić. Możliwe jest pominięcie któregokolwiek z nich, zachowując jednak średnik oddzielający go od sąsiedniego składnika. Opuszczenie warunku traktowane jest tak, jak gdyby był tam warunek prawdziwy.

Przykład,

int i, suma = 0;
for (i = 0; i < 10; i = i + 1)
  suma = suma + i;

W pętli odbywa się sumowanie liczb całkowitych od 0 do 10, po zakończeniu pętli for zmienna suma = 55.

Instrukcja wyboru switch

Instrukcja wyboru switch wygląda następująco

switch (wyrażenie) {

case wart_1:
instr 1;
break;
case wart_2:
instr 2;
break;
.......
case wart_n;
instr n;
break;
default:
instr ;
break;

Obliczane jest wyrażenie w nawiasie przy słowie switch, może to być tylko wyrażenie typu całkowitego. Jeżeli jego wartość odpowiada którejś z wartości podanej w jednej z etykiet case, wówczas wykonywane są instrukcje począwszy od tej etykiety, wykonywanie ich kończy się po napotkaniu instrukcji break. Powoduje to wyjście z instrukcji switch, za jej klamrę zamykającą. Jeżeli wartość wyrażenia nie zgadza się z żadną z wartości podanych przy etykietach case, to wykonywane są instrukcje po etykiecie default. Etykieta default może być w dowolnym miejscu instrukcji switch, np. na jej początku. Etykiety default może w ogóle nie być. Jeżeli wartość wyrażenie nie zgadza się z żadną z wartości przy etykietach case, a etykiety default nie ma, to instrukcja switch nic nie robi. Instrukcji występujących po etykiecie case nie musi kończyć instrukcja breake, gdy jej nie ma, to wykonywane są instrukcje po następnej etykiecie case. Po napotkaniu przypadku zgodnego z badanym wyrażeniem i braku break zakłada się, że wszystkie umieszczone po tym przypadku wartości wyrażeń przy kolejnych słowach case w klamrach instrukcji switch są także równe wyrażeniu, a więc następujące po nich instrukcje są wykonywane, aż do wystąpienia w którejś z nich break. Przykład:

int m, n;
switch (m) {
case 10 :  n = m ;
break;
case 20 :  n = m + 1 ;
break;
case 30 :  n = m - 1 ;
break;     }

W zależności od wartości zmiennej m wystąpią następujące wartości zmiennej n; n = 10 gdy m = 10, n = 21 gdy m = 20, n = 29 jeżeli m = 30. Dla innych wartości m instrukcja switch nie zmieni wartości zmiennej n. Jeżeli w powyższym kodzie usuniemy słowa kluczowe break

int m, n;
switch (m)                   {
case 10 :  n = m ;
case 20 :  n = m + 1 ;
case 30 :  n = m - 1 ;       }

wówczas n = 10 dla m = 10, n = 20 jeżeli m = 20, n = 29 gdy m = 30. Dla innych wartości m instrukcja switch nie zmieni wartości zmiennej n, tj. nic nie zrobi.

Instrukcja break

Przerywa instrukcję switch, powoduje także natychmiastowe zakończenie/przerwanie wykonywania pętli; for, while, do ... while.

Jeżeli mamy do czynienia z kilkoma pętlami, zagnieżdżonymi jedna wewnątrz drugiej, to instrukcja break powoduje przerwanie tylko tej najbardziej wewnętrznej pętli, w której występuje. To przerwanie pętli z wyjściem o jeden poziom wyżej.

Instrukcja continue

Instrukcja continue

Występuje zwykle wewnątrz pętli while, for, do ... while. Powoduje ona zaniechanie wykonywania instrukcji będących treścią pętli, jednak sama pętla nie zostaje przerwana. Instrukcja continue przerywa tylko bieżący obieg pętli i zaczyna następny obieg, kontynuując pracę pętli. Innymi słowy, napotkanie instrukcji continue odpowiada natychmiastowemu przejściu/skokowi na sam koniec pętli, do etykiety stojącej przed klamrą zamykającą pętlę, komputer "pomyśli", że wykonał treść pętli i przystąpi do następnego obiegu. W ten sposób instrukcje pętli leżące poniżej continue, aż do końca pętli, nie będą realizowane.

Zadania

Przedstawione w tym rozdziale przykłady są elementarne, tak dobrane, aby nie rozpraszać uwagi czytelnika dodatkowymi szczegółami, zwłaszcza tego, który nie miał jeszcze kontaktu z programowaniem. Nieco bardziej rozwinięte przykłady znajdują się w Dodatku 1. Na zakończenie tego rozdziału podaję listę zadań. Wykonanie ich będzie ułatwione, po zapoznaniu się z treścią Dodatku.

  1. Napisz program, który wypisuje na ekranie trzy kolumny. W pierwszej kolumnie są kolejne liczby naturalne, od 1 do 10, w drugiej ich kwadraty, w ostatniej kolumnie ich trzecie potęgi.
  2. Napisz program, który tworzy jednowymiarową tablicę sześcio-elementową. Elementami tablicy są losowo wybrane liczby naturalne z przedziału < 1, 49 >.
  3. Napisz program, który tworzy tablicę dwuwymiarową (macierz) o rozmiarach 10 * 10. Elementami tablicy są losowo wybrane liczby zmiennoprzecinkowe z przedziału < 0, 1 >.
  4. Napisz program, który prosi użytkownika o podanie wartości liczbowej promienia koła, następnie oblicza i wypisuje na ekran jego pole, średnicę i obwód. Dalej oblicza i wypisuje na ekran objętość kuli o takim promieniu.
  5. Napisz program, który pyta o podanie liczby naturalnej sześciocyfrowej, potem dzieli ją na pojedyncze cyfry. Wypisuje te cyfry na ekran, każda oddzielone od sąsiednich pięcioma gwiazdkami.
  6. Napisz program, który prosi o podanie trzech liczb naturalnych. Następnie sprawdza i informuje, czy mogą one być traktowane jako długości boków trójkąta prostokątnego.
  7. Napisz program obliczający i wypisujący na ekran iloczyn liczb nieparzystych, od 1 do 21.
  8. Napisz program, wczytujący 6 liczb, następnie wypisuje na ekran najmniejszą z nich.
  9. Napisz program, który pyta użytkownika o podanie imienia, "Podaj imię, ...". Po wpisaniu przez użytkownika imienia sprawdza, czy ostatnią literą imienia jest a. Jeżeli tak, to wypisuje na ekran "Witam Panią", jeżeli nie, to wypisuje "Witam imię", gdzie imię oznacza łańcuch znaków podany przez użytkownika.
  10. Napisz program, który wyprowadza na ekran następującą kombinację gwiazdek
*

* *

* * *

* * * *