jcp, PLIK4


Rozdział

Instrukcje

Rodzaje instrukcji Instrukcja zawiera definicję obliczenia i określenie

sposobu wykonania tego obliczenia. Program jest ciągiem instrukcji wykonywanych kolejno od pierw­szej do ostatniej, o ile nie używa się, łamiących zasadę programowania struktu­ralnego, instrukcji skoku. Przekładem instrukcji generowanym przez kompilator jest fragment programu realizujący obliczenie zdefiniowane tą instrukcją.

Instrukcja prosta nakazuje bezwarunkowe wykonanie pojedynczego obliczenia. Z dowolnego ciągu instrukcji można utworzyć instrukcję zlożonq. Instrukcja wa­runkowa i instrukcja wyboru pozwalają na podejmowanie decyzji o dalszym przebiegu obliczeń, instrukcje pętli umożliwiają wielokrotne wykonywanie pew­nego fragmentu programu.

0x01 graphic

4.2. Instrukcja prosta

Instrukcja prosta

4.2 'ł

Instrukcje proste to:

instrukcja pusta złożona z samego znaku średnika ;

dowolne wyrażenie zakończone znakiem średnika ;

Jeżeli w instrukcji nie występuje operator przypisania (bezpośrednio lub pośred­nio w wywoływanej funkcji), to wykonanie tej instrukcji nie powoduje żadnego efektu, nie ulega zmianie wartość żadnej zmiennej.

int nOpakowania, nKartony = 1 ;

f/ instrukcja pusta

nOpakowania = nKartony - 1 ; // zmiana wartości nOpakowania i nKartony++ ; 1/ zmiana wartości nKartony

nOpakowania + nKartony ; // bez rezultatu

Instrukcja złożona Dowolny ciąg instrukcji ograniczony nawiasami w klamrowymi { i } jest instrukcja z~oźonc~. Instrukcja

złożona jest równoważna instrukcji prostej, tzn. może wystąpić we wszystkich tych miejscach programu, w których dozwolone jest występowanie instrukcji prostej.

float flŚrednica, flPromień ; flPromień = 3.5 ;

flŚrednica = 7,1 + 2 * flPromień++ ;

//

{ flŚrednica = 2 * flPromień ; flPromień = 1 ; }

!* średnik przed } nie może zostać opuszczony *l

46 Rozdział ~l. Instrukcje

Instrukcja warunkowa [j, Podjęcie decyzji o wykonaniu lub pominięciu

7 pewnego obliczenia możliwe jest za pomocy instrukcji warunkowej

if ( wyrażenie ) instrukcja

I Gdy wartość wyrażenia jest różna od 0 (prawda), to wykonywana jest instrukcja. W przeciwnym przypadku (fałsz - wyrażenie ma wartość 0) instrukcja nie jest wykonywana (rys 4.1 .).

long (Kolejny, (Wybrany ; char cFlaga ;

if ( (Kolejny > (Wybrany ) cFlaga = 0 ; if ( (Kolejny < (Wybrany )

cFlaga = 1 ;

(Kolejny = (Wybrany - (Kolejny ; i

0x01 graphic

0x01 graphic

Rys. 4.1. Instrukcja warunkowa

4.4. Instrukcja warunkowa 4%

li

if ( (Kolejny == (Wybrany )

if ( (Kolejny ) cFlaga = 2 ;

if ( ! (Kolejny ) cFlaga = 3 ;

// (Kolejny != 0

// (Kolejny == 0

Bardziej rozbudowana postać instrukcji warunkowej umożliwia dodatkowo określenie obliczenia, które zostanie wykonane, gdy wartość wyrażenia będzie równa 0 (fałsz - rys. 4.2.)

if ( wyrażenie ) instrukcja-1 else instrukcja_2

Rys. 4.2. Rozszerzona instrukcja warunkowa double dbMa, dbWinien, dbSaldo, dbDdebet ;

if ( dbMa > dbWinien )

dbSaldo = dbMa - dbWinien ;

dbDebet = -1 ;

0x01 graphic

4g Rozdział 4. Instrukcje

else

dbSaldo = -1 ;

dbDebet = dbWinien - dbMa ;

//

int nPoziom, nGranica ;

if ( nGranica > nPoziom ) nPoziom = 3 ; else nPoziom-- ; /* średnik przed else nie może zostać opuszczony */

Obydwie postacie instrukcji warunkowej mogą być w sobie nawzajem dowol­nie zagnieżdżane, co wymaga ustalenia zasady wiązania słów kluczowych if i else. W języku C++ obowiązuje zasada odnoszenia słowa else do najbliższego niezwiązanego słowa if. A więc:

if (A) if (B) C;else D; jest równoważne

if (A) { if (B) C; else D; } Podobnie

if ( A ) if ( B ) C ; else if ( D ) E ; else F ; odpowiada

if (A) { if (B) C; else { if (D) E; else F; }}

Instrukcja wyboru . - ) Instrukcja wyboru pozwala na wykonanie jednego

V z wielu możliwych obliczeń, zastępuje ona wielokrot­nie zagnieżdżoną instrukcję warunkową.

0x01 graphic

4.5. Instrukcja wyboru 49 switch ( wyrażenie sterujctce )

_ 'i i

i case wyrażenie stałe 1 cictg instrukcji I i~

case wyrażenie stale n citEg instrukcji n default : cicfg_instrukcji 0

i

Wyrażenia_sta~e to takie wyrażenia, których wartości można obliczyć podczas kompilacji Realizacja instrukcji wyboru (rys. 4.3.) polega na obliczeniu wartości wyrażenia_sterujctcego, odszukaniu wyrażenia_stalego o takiej samej wartości i wykonaniu cicFgtt instrukcji związanego z tym wyrażeniem starym. Każdy z cictgów instrukcji związanych z poszczególnymi wartościami wyraże­nia_stazzego musi kończyć się instrukcją break powodującą zakończenie wyko­nywania instrukcji wyboru. Gdy poszukiwanie wyrażenia stałego o wartości rów­nej wyrażeniu sterującemu nie zakończy się sukcesem, jest wykonywany cictg instrukcji 0. Fragment instrukcji wyboru rozpoczynający się słowem de­fault może być pominięty - jeżeli w tym przypadku wartość wyraże­nia_sterujctcego nie jest równa żadnemu wyrażeniu_stafemu, to nie wykonuje się żadnej instrukcji.

int nLicznikA, nLicznikB, nLicznikXY, nNieznany ; char cZnak ;

switch ( cZnak ) i

case 'A' : ++nLicznikA ; break ; case 'B' : ++nLicznikB ; break ; case 'X'

case 'Y' : ++nLicznikXY ; break ; default : ++nNieznany ;

//

Rozdziat 4. Instrztkcje int nStanAktualny, nStanNastępny ;

const int nMaska = Ox3A ;

switch ( nStanAktualny & nMaska )

case nMaska & 0x02 : nStanNastępny = 0x15 ; I nStanAktualny = 0x21 ;

break ;

case nMaska & 0x30 : nStanNastępny = 0x1 F; nStanAktualny = 0x21;

break; default : nStanAktualny = 0 ; nStanNastępny = 0 ;

0x01 graphic

Rys. 4.3. Instrukcja wyboru

4.6. lnstnukcje pętli 51

Instrukcje pętli ! i Wielokrotne wykonanie pewnego fragmentu pro­

6

gramu można uzyskać za pomocą jednej z trzech ist­niejących w języku C++ instrukcji pętli. Instrukcja i pętli wyliczeniowej ma postać

for ( inicjacja ; wyrażeniegraniczne ; wyrażenie zliczajc~ce ) instrukcja~owtarzana

'4 ,' Realizacja tej instrukcji pętli (rys. 4.4.) rozpoczyna jednokrotne wykonanie ini­

cjacji będącej definicją zmiennej licznikowej lub instrukcją ustalającą jej wartość ~~, (w inicjacji można również ustalić wartości kilku zmiennych licznikowych). Na- j stępnie oblicza się wartość wyrażenia-granicznego - jeżeli wartość ta jest różna

od 0 (prawda), to jest wykonywana instrukcja_powtarzana. Dalej oblicza się wy­rażenie_zliczajc~ce i następuje powrót do obliczenia wyrażenia-granicznego. Opuszczenie pętli następuje po uzyskaniu przez wyrażenie~raniczne wartości i, I

równej 0 (fałsz).

Rys. 4.4. Instrukcja pętli wyliczeniowej

0x01 graphic

52 Rozdziaf 4. Instrukcje int nSuma = 0 ;

for ( int nKolejny = 0 ; nKolejny <= 9 ; nKolejny ++ ) nSuma += nKolejny ; /* inicjacja to definicja zmiennej */ //

char 'szNapis = "aAbBcC" ;

int nPozycja, nLiczbaWersalików = 0 ;

for ( nPozycja = 0 ; nPozycja < 6 ; nPozycja++ )

if ( 'szNapis > 'Z' ) i

*szNapis = *szNapis & OxSF ; nLiczbaWersalików++ ;

szNapis++ ;

/' inicjacja to instrukcja przypisania */

Instrukcjapętli uprzedzającej ma postać

while ( wyrażenie-graniczne ) instrukcja~owtarzana

Wykonanie tej pętli (rys. 4.5.) polega na obliczeniu wartości wyraże­nia~ranicznego - gdy jest ona różna od 0 (prawda), wykonuje się instruk­cję_powtarzaną i powraca do obliczenia wartości wyrażenia-granicznego. Opuszczenie pętli następuje po uzyskaniu przez wyrażenieJgraniczne wartości 0 (fałsz).

char *szTekst = "pewien napis" ;

int nDługość = 0 ;

while ( *szTekst++ ) nDługość++ ;

/* ostatni element łańcucha znaków ma wartość 0 (fałsz) */

//

0x01 graphic

4.6. Instrukcje pętli 53

float flSuma = 1573.821, flSkładnik = 3.51; int nLicznik = 0 ;

while ( nSuma > 1 E-10 ) i

nSuma = nSkładnik ; nSkładnik *= nSkładnik ; nLicznik++ ;

Rys. 4.5. Instrukcja pętli uprzedzającej

Dotychczas przedstawione instrukcje pętli najpierw dokonują sprawdzenia wa­runku wyjścia (czyli obliczenia wartości wyrażenia granicznego), a potem ewen­tualnie wykonują instrukcję powtarzaną. Jeżeli więc po pierwszym obliczeniu wartość wyrażenia granicznego okaże się równa 0, to instrukcja powtarzana w ogóle nie zostanie wykonana. Odwrotną właściwość ma instrukcja pętli po­twierdzajc~cej

do instrukcja~owtarzana while ( wyrażenie-graniczne ) ;

Schemat realizacji tej pętli (rys. 4.6.) polega na wykonaniu irLStrukcji_ powtarza­nej, po którym następuje obliczenie wartości wyrażertia~ranicznego. Gdy wyra­żenie to ma wartość różną od 0 (prawda), następuje powrót do wykonania in­

0x01 graphic

54

Rozdział 4. Instrukcje

strukcji~owtarzaraej, a w przeciwnym wypadku (wartość równa 0 - fałsz) reali­zacja pętli kończy się.

Rys. 4.6. Instrukcja pętli potwierdzającej

long IOdcinekAB = 3, IOdcinekCD = 2 ; do

IOdcinekAB *= IOdcinekAB ; IOdcinekCD += IOdcinekCD ;

while ( IOdcinekAB < IOdcinekCD ) ;

/* IOdcinekAB == 9 , fOdcinekCD == 4 '/

Niewłaściwa konstrukcja instrukcji pętli może doprowadzić do jej nieskoń­czonego wykonywania. Przerwanie zapętlonego programu umożliwia jedynie zewnętrzna interwencja operatora.

0x01 graphic

0x01 graphic

4.7. Instrukcje skoków

i I: int nSuma, nLicznik ;

for ( int nKolejny = 0 ; nKolejny < 10 ; nLicznik++ )

nSuma += nLicznik ; // nKolejny nie zmienia się //

float flWysokość = 3.485e2, flEpsilon = 1.38534e-2 ; long (Powtórzenia ;

while ( flWysokość != 0)

flWysokość -= flEpsilon ;

(Powtórzenia++ ;

i

/* flWysokość nigdy nie uzyska wartości dokładnie równej 0 */ //

unsigned char ucElement = 5; do

ucElement = 2 ;

while ( ucElement != 0 ) ;

/* ucElement nigdy nie będzie równe 0, ucElement == 5, 3, 1, 255, 253, ... */

Instrukcje skoków

%~ i l W języku C++ występują trzy instrukcje skoków.

Dwie z nich służą ułatwianiu konstruowania pętli, i trzecia to instrukcja skoku bezwarunkowego do miej­

sca oznaczonego etykietą. Stosowanie tych instrukcji, szczególnie instrukcji sko­ku bezwarunkowego, jest niezgodne z zasadami programowania strukturalnego. Każdy program zawierający instrukcje skoku można zastąpić równoważnym pro­gramem strukturalnym.

Jr6 Rozdział 4. Instrukcje

Zaprzestanie wykonywania pętli umożliwia instrukcja: break ;

Powoduje ona zakończenie wykonywania tej instrukcji pętli, w której się bezpo­średnio znajduje.

char *pCiąg = "aabaxaba"; int nPozycja = 0 ;

while ( *pCiag ) i

if ( 'pCiag -_ 'x' ) break ; nPozycja++ ;

pCiag++ ;

}

/* zapis równoważny */

while ( *pCiag && *pCiąg++ !_ 'x' ) nPozycja++ ;

Pominięcie niektórych wykonań instrukcji powtarzanej w pętli umożliwia in­strukcja:

continue ;

Powoduje ona zaprzestanie wykonywania instrukcji powtarzanej i przejście do dalszego wykonywania instrukcji pętli.

char *szWersaliki = "abCDeFGh" ; int nLicznik = 0 ;

for ( ; *szWersaliki ; szWersaliki++ ) f

if ( *szWersaliki >_ 'A' && *szWersaliki <_ 'Z' ) continue ; if ('szWersaliki >_ 'a' && *szWersaliki <_ 'z' )

{ *szWersaliki = °szWersaliki & OxSF ; nLicznik++ ; }

4.7. Instrukcje skoków Jr%

/*zapis równoważny `/

for ( ; *szWersaliki ; szWersaliki++ )

if ( *szWersaliki >_ 'a' && 'szWersaliki <_ 'z' ) i

'szWersaliki = *szWersaliki & OxSF ;

nLicznik++ ;

Bezwarunkowa instrukcja skoku ma natomiast postać:

goto etykieta ;

gdzie etykieta jest identyfikatorem znajdującym się przed instrukcją i oddzielo­nym od niej znakiem dwukropka : .



Wyszukiwarka

Podobne podstrony:
jcp, PLIK8
jcp, PLIK7
jcp, PLIK2
jcp, ST
jcp, ST
plik4 CSPC53RHVVT4MPPG67QV74YSEEASYTUCTWH4EIQ
plik4, Chrześcijaństwo, Z seminarium u Saletynów
jcp, PLIK11
jcp, PLIK12
Podstawy ukladow cyfrowych, plik4
jcp, PLIK13
jcp, PLIK6
Plik4(dom)
Plik4(korelacja1)dodmodmod
Plik4(korelacja1)
JCP

więcej podobnych podstron