w02


Instrukcje sterujące
" program  nie zawsze wykonuje kolejne
instrukcje w porządku ich zamieszczenia w
tekście; niekiedy chcemy to zmienić
" aby to było mo\liwe  wprowadzono instrukcje
sterujące  kierują one przebiegiem program
Przykład: równanie kwadratowe.
Schemat działania programu:
1. Wczytanie parametrów trójmianu a,b,c
2. Czy a=0? Je\eli tak błąd, koniec
3. Wyliczenie delta
4. Czy delta>0
a. tak  wyliczenie pierwiastków
b. nie  komunikat o ich braku
" potrzeba instrukcji realizującym dobór ście\ki w
zale\ności od okoliczności (np. instrukcja
if)oraz wyra\eń sprawdzających warunki
" wyra\enia warunkowe w C
o brak specjalnego typu na przechowanie wartości
wyra\eń logicznych
o Wartości tych wyra\eń mogą być reprezentowane przez
dowolny typ numeryczny; prawda  wartość ró\na od 0,
fałsz  wartość równa 0
" wyra\enia logiczne w C++
o w C++: specjalny typ danych do przechowywania
wartości wyra\enia logicznego; jest to typ bool, stałe
tego typu to true (numerycznie = 1) oraz false
(numerycznie = 0)
o mo\liwy jest dawny sposób przechowywania informacji
logicznej
" instrukcja if  składnia:
A) if (wyrazenie)
instrukcja;
B) if (wyrazenie)
instrukcja1;
else
instrukcja2;
" instrukcja if  wykonanie:
A) oblicz wartość wyra\enia warunkowego
je\eli warunek spełniony (prawda/wartość ró\na
od zera  wykonaj instrukcja
je\eli nie  opuść ją przejdz do następnej
instrukcji (po if)
B) oblicz wartość wyra\enia warunkowego
je\eli prawda/wartość ró\na od zera  wykonaj
instrukcja1, opuść instrukcja2
je\eli nie  wykonaj instrukcja2
przejdz do następnej (po if)
#include
#include
/* Równanie kwadratowe; instrukcje if, return
biblioteka matematyczna */
int main()
{
double a,b,c;
std::cout << "Podaj a, b, c : ";
std::cin >> a >> b >> c;
std::cout << "a = " << a << " b = " << b << " c = " << c << "\n";
if (a==0.0)
{
std::cout << "Blad !!!\ta = "<< a << std::endl;
return 1;
}
double delta,x1,x2;
delta = b*b-4*a*c;
if(delta<0.0)
{
std::cout <<"Brak pierwiastkow rzeczywistych:\n"
<<"\t\tdelta = " << delta << std::endl;
return 0;
}
else
{
x1=(-b-sqrt(delta))/(2*a);
x2=(-b+sqrt(delta))/(2*a);
std::cout<<"Pierwiastki rzeczywiste rownania wynosza:\n"
<<"\tx1 = " << x1
<<"\n\tx2 = " << x2 << std::endl;
}
return 0;
}
Uwagi:
" blok instrukcji (instrukcja zło\ona)
" instrukcja return
" edycja programu, wcięcia
" funkcja sqrt  biblioteka matematyczna
double exp(double x) exp(x)
double log(double x) ln(x)
double log10(double x) log(x)
double pow(double x, double y) xy
double sqrt(double x) sqrt(x)
double fabs(double x) |x|
double sin(double x) sin(x)
double cos(double x) cos(x)
double tan(double x) tg(x)
double asin(double x) arcsin(x)
double acos(double x) arccos(x)
double atan(double x) arctg(x)
int abs(int k)
|k|
Podstawowe funkcje matematyczne
" u\ycie funkcji matematycznych wymaga:
o włączenia pliku nagłówkowego cmath
o opcji kompilatora  lm
gcc kwadrat.c  lm  o kwadrat
Konstrukcja else - if
Konstrukcja else  if
" realizuje decyzje wielowariantowe
" składnia:
if (wyra\enie0)
instrukcja0;
else if (wyra\enie1)
instrukcja1;
& &
else if (wyra\enie_k)
instrukcja_k;
else
instukcja_ostatnia;
" wykonanie  wyliczenie kolejnych wyra\eń,
pierwsze wyra\enie prawdziwe (ró\ne od 0)
powoduje wykonanie instrukcji z nią związanej i
zakończenie całej konstrukcji; je\eli \aden
warunek nie jest spełnione wykonana jest
instrukcja po ostatnim else
" przykład:
int punkty;
float ocena;
if (punkty>92)
ocena=5.0;
else if (punkty>85)
ocena=4.5;
else if (punkty>78)
ocena=4.0;
else if (punkty>70)
ocena=3.5;
else if (punkty>60)
ocena=3.0;
else
ocena=2.0;
Pętla while
" wykonuje instrukcję (blok) wiele razy
" składnia:
while (wyra\enie)
instrukcja;
" wykonanie: oblicza wartość wyra\enia, gdy
prawda/wynik ró\ny od 0, to wykonuje
instrukcję, a następnie znowu oblicza
wyra\enie. Ten cykl powtarza się do chwili
gdy wyra\enie fałszywe (= 0).
" nie ma gwarancji, \e pętla wykona się choćby
raz
" Przykład:
#include
#include
// przyklad petli while
int main()
{
std::cout << T[F] T[C]\n ;
std::cout << ---------------\n ;
float fahr=0,cels;
while (fahr<=150)
{
cels=5*(fahr-32.0)/9;
std::cout << std::fixed< < fahr=fahr+10;
}
}
T[F] T[C]
---------------
0.00 -17.78
10.00 -12.22
20.00 -6.67
30.00 -1.11
40.00 4.44
50.00 10.00
60.00 15.56
70.00 21.11
80.00 26.67
90.00 32.22
100.00 37.78
110.00 43.33
120.00 48.89
130.00 54.44
140.00 60.00
150.00 65.56
Pętla for
Inna realizacja powy\szego programu:
#include
#include
#define T_DOL 0 /* dolna wartosc temp. */
#define T_GORA 150 /* gorna wartosc temp. */
#define T_KROK 10 /* wartosc kroku temp. */
int main()
{
std::cout <<" T[F] T[C]\n";
std::cout <<"---------------\n";
for (int fahr=T_DOL; fahr<=T_GORA; fahr=fahr+T_KROK)
std::cout << std::fixed< << 1.0*fahr << std::setw(7)<< 5*(fahr-32.0)/9
<< std::endl;
return 0;
}
Uwagi:
" dyrektywa define  definicja stałej
symbolicznej
o ułatwia analizę i zmianę parametrów
o konwencja  stałe symboliczne piszemy du\ymi
literami
o nie dajemy znaku ; na końcu linii #define
" składnia pętli for:
for (instr_ini; warunek; instr_krok)
instrukcja;
gdzie: instr_ini  instrukcja inicjalizująca
warunek  wyra\enie warunkowe
instr_krok  instrukcja modyfikująca
" instrukcja for równowa\na sekwencji
instr_ini;
while(warunek)
{
instrukcja;
instr_krok;
}
" elementy instr_ini, warunek, instr_krok 
nie muszą wystąpić (ale średniki oddzielające 
tak)
" nie ma gwarancji, \e pętla będzie wykonana
chocia\ raz
" for często stosowana  sterowanie pętlą
skupione w jednym miejscu
#include
// Przyklad działania pętli for
int main()
{
int k, s1, s2, s3;
for (k=1, s1=0, s2=0, s3=0; k<=10; k=k+1)
{
s1=s1+k;
s2=s2+k*k;
s3=s3+k*k*k;
}
std::cout <<  Suma liczb =  << s1 << std::endl;
std::cout <<  Suma kwadratow liczb =  << s2 << std::endl;
std::cout <<  Suma szescianow liczb =  << s3 << std::endl;
return 0;
}
" często stosowana konstrukcja  zagnie\d\enie
pętli
Przykład: wydrukować w wierszy wydruku, pierwszy ma
zawierać sz gwiazdek, w ka\dym następnym ma być o 1
gwiazdkę więcej
#include
int main()
{
int w,sz;
std::cout << Podaj ilosc wierszy:  ;
std::cin >> w;
std::cout << Podaj szerokosc pierwszego wiersza:  ;
std::cin >> sz;
for (int k=0; k {
for(int n=0; n<(sz+k); n=n+1)
std::cout<< * ;
std::cout << std::endl;
}
}
Pętla do ... while
" składnia:
do
instrukcja;
while (warunek);
" działanie  podobne do pętli while. Ró\nica 
odwrócona kolejność wykonywania instrukcji oraz
sprawdzanie warunku
" mamy gwarancję, \e instrukcja będzie wykonana co
najmniej raz
" rzadziej stosowana ni\ while i for
Przykład:
#include
int main()
{
float tf;
std::cout << "Wejście: w stopniach Fahrenheita\n"
<< "By zakonczyc wpisz liczbe wieksza niz 1000\n"
<< "-------------------------------------------\n";
do
{
std::cout << "Podaj temperature : ";
std::cin >> tf;
std::cout << tf << " w skali Fahrenheita oznacza "
<< 5*(tf-32)/9 << " w skali Celsjusza.\n";
}
while(tf<=1000);
return 0;
}
Instrukcja switch
" realizacja decyzji wielowariantowej; spraw-
dzenie, czy wartość pewnego wyra\enia pasuje
do jednej z kilku wartości całkowitych
" składnia:
switch (selektor)
{
case wyra\enie_stałe_1 : ciąg_instr_1;
case wyra\enie_stałe_2 : ciąg_instr_2;
& & & & & & & & & & & & & & & & & & & & & &
case wyra\enie_stałe_k : ciąg_instr_k;
default : ciąg_instr_default;
}
" działanie:
o wyliczenie wartości wyra\enia selektor
o porównanie wyliczonej wartości kolejno do
wartości wyra\eń_stałych_k  je\eli zachodzi
równość, to następuje przeskok do ciągu_instr_k,
po czym wykonane są wszystkie instrukcje poni\ej
o je\eli \aden przypadek nie jest zgodny z wartością
selektora, to nastąpi przejście do przypadku
default (o ile występuje);
o przypadek default nie musi być na końcu !!!
" uwaga:
o selektor i wyra\nia_stałe_k muszą być typu
całkowitego lub znakowego
o gdy chcemy, by dla przypadku k wykonany był
tylko ciąg_instr_k, po jego zakończeniu dajemy
instrukcję break
o break przerywa wykonanie instrukcji switch
o wartości wyra\eń stałych nie mogą się powtarzać
o wyra\enia stałe  muszą być mo\liwe do
wyliczenia w chwili kompilacji
Przykład:
#include
/* Przykład u\ycia instrukcji switch, break */
int main()
{
int m;
std::cout <<  Podaj numer miesiaca :  ;
std::cin>>m;
switch (m)
{
case 1: case 3: case 5: case 7:
case 8: case 10: case 12:
std::cout <<  Liczba dni: 31\n ;
break;
case 4: case 6: case 9: case 11:
std::cout <<  Liczba dni: 30\n ;
break;
case 2:
std::cout <<  Liczba dni: 28 lub 29\n ;
break;
default:
std::cout <<  Niewlasciwy numer miesiaca\n ;
break;
}
}
switch vs. if & else if
" obie te instrukcje u\ywane w sytuacji wyboru
wielowariantowego
" konstrukcja if & else if ogólniejsza, bo mo\e
być stosowna równie\, gdy:
o obiekt wybierający (selektor) jest typu innego ni\ int
lub char
o wyra\enie specyfikujące wybór niekonieczne stałe
o decyzja o wyborze niekoniecznie przyrównanie
" switch  bardziej przejrzysta, chętnie stosowana
Instrukcja break
" mo\e wystąpić tylko we wnętrzu pętli lub
instrukcji switch
" pozwala na wcześniejsze opuszczenie pętli lub
instrukcji switch
" w przypadku zagnie\d\onych pętli bądz
instrukcji switch powoduje przerwanie tylko
jednej z nich  najciaśniej ją otaczającej
Przykład:
#include
int main()
{
int suma,k;
for (suma=0, k=1; ; k=k+1)
{
suma=suma+k*k*k;
if (suma>100) break;
}
std::cout << Przekroczenie nastapi dla k =  << k << \n ;
}
Instrukcja continue
" mo\e wystąpić tylko we wnętrzu pętli
" powoduje przerwanie kroku bie\ącego i
wykonanie od początku następnego kroku
zawierającej ją pętli
o dla while i do  przejście do sprawdzenia warunku
zatrzymania
o dla for  przekazanie sterowania do instrukcji
przyrostowej pętli
Przykład: wyliczmy sumę pierwszych N liczb całkowitych
z wyłączeniem tych, które są podzielne przez 7,
#include
/* Przykład u\ycia continue
operatory ! % */
int main()
{
int N;
std::cout <<  Podaj N:  ;
std::cin >> N;
int k,s;
N=N+1;
for (s=0, k=1; k {
if (!(k%7)) continue;
s=s+k;
}
std::cout << Suma wynosi:  << s<}
Podaj N: 200
Suma wynosi: 17258
Instrukcja skoku, etykiety
" składnia:
goto etykieta;
....
etykieta:
" działanie: powoduje bezwarunkowe
przekazanie sterowanie do instrukcji opatrzonej
etykietą
" etykieta  dowolna dozwolona w C/C++ nazwa;
nie wymaga deklaracji
" etykieta mo\e być umieszczona w dowolnym
miejscu w treści funkcji, z której jest wywołana
" instrukcja skoku nie powinna być nadu\ywana;
najczęściej stosowana przy wyjściach z
zagnie\d\onych pętli
for ( ... )
{
for ( )
{
....
if (niepowodzenie)
goto error; /* wyjście z wszystkich pętli */
....
}
}
....
error: // napraw błąd lub wypisz komunikat


Wyszukiwarka