Programowanie Ins ster

Z Skrypty dla studentów Ekonofizyki UPGOW

(Różnice między wersjami)
(Instrukcje sterujące)
Linia 61: Linia 61:
for (instr_pocz; warunek; instr_krok)
for (instr_pocz; warunek; instr_krok)
-
instrukcja;
+
: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.
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.
Linia 69: Linia 69:
<source lang="cpp">int i, suma = 0;
<source lang="cpp">int i, suma = 0;
for (i = 0; i <10; i = i + 1)
for (i = 0; i <10; i = i + 1)
-
suma = suma + i;
+
  suma = suma + i;
</source>
</source>
 +
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:
 +
<source lang="cpp">int m, n;
 +
switch (m) {
 +
case 10 :  n = m ;
 +
break;
 +
case 20 :  n = m + 1 ;
 +
break;
 +
case 30 :  n = m - 1 ;
 +
break; }
 +
</source>
 +
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'''
 +
<source lang="cpp">
 +
int m, n;
 +
switch (m)                  {
 +
case 10 :  n = m ;
 +
case 20 :  n = m + 1 ;
 +
case 30 :  n = m - 1 ;    }
 +
</source>
 +
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==

Wersja z 14:45, 24 mar 2010

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