• Nie Znaleziono Wyników

Podstawy Programowania

N/A
N/A
Protected

Academic year: 2021

Share "Podstawy Programowania"

Copied!
170
0
0

Pełen tekst

(1)

Podstawy Programowania

Monika Wrzosek

Instytut Matematyki Uniwersytet Gdański

Matematyka 2019/20

(2)

Sprawy organizacyjne

E-mail: mwrzosek@mat.ug.edu.pl Konsultacje: p.225

Materiały: http://www.mat.ug.edu.pl/~mwrzosek Literatura

Stephen Prata, "Język C++. Szkoła programowania". Wydanie VI.

Helion 2012.

Jerzy Grębosz, "Symfonia C++ Standard".

Jerzy Grębosz, "Opus Magnum C++11".

Kody źródłowe przykładowych programów z książki i ćwiczenia z odpowiedziami: www.ifj.edu.pl/private/grebosz/opus.html Mirosław J. Kubiak, "C++. Zadania z programowania z

przykładowymi rozwiązaniami", Helion 2011.

(3)

Sprawy organizacyjne

Zintegrowane środowisko programistyczne Microsoft Visual Studio,

Visual Studio Code, CLion,

Code::Blocks, Dev C++, Egzamin

Egzamin pisemny, złożony z zadań i pytań teoretycznych, np.:

Przeanalizuj podany program i podaj wynik jego działania.

Zmodyfikuj podany program, używając pętli while.

Podaj przykład typu fundamentalnego.

Zdefiniuj tablicę o elementach typu float złożoną z 10 wierszy i 8 kolumn. Do elementu o indeksie wierszowym 3 i kolumnowym 5 wpisz wartość 4.5.

Jaka jest różnica między wskaźnikiem stałym a wskaźnikiem do

Monika Wrzosek (IM UG) Podstawy Programowania 3 / 170

(4)

Sprawy organizacyjne

Szkic wykładu

Instrukcje sterujące Typy

Operatory Tablice Funkcje Rekurencja*

Napisy Struktury Wskaźniki*

(5)

Wprowadzenie

Algorytm - skończony ciąg jasno zdefiniowanych czynności elementarnych, koniecznych do wykonania postawionego zadania.

Przykład: przepis na ciasto.

Dane wejściowe: 200g mąki, 100g cukru, 100g masła, 2 jajka.

Dane wyjściowe: ciasto.

Lista kroków:

1. Rozgrzej piekarnik do 180 stopni.

2. Wrzuć do miski mąkę, cukier, masło i jajka.

3. Miksuj składniki przez 5 min.

4. Formę do pieczenia wysmaruj masłem i oprósz bułką tartą.

5. Przełóż masę z miski do formy.

6. Formę umieść w piekarniku.

7. Odczekaj 40 min.

8. Wyjmij ciasto i wyłącz piekarnik.

(6)

Cechy algorytmów

poprawność - algorytm daje oczekiwane wyniki,

jednoznaczność - zawsze daje te same wyniki przy takich samych danych wejściowych,

skończoność - wykonuje się w skończonej liczbie kroków, sprawność - czasowa (szybkość działania) i pamięciowa Sposoby zapisu algorytmów

1 Lista kroków

2 Pseudokod - metoda pośrednia między 1. i 4.

3 Schemat blokowy

4 Język programowania

(7)

Przykład: średnia arytmetyczna dwóch liczb rzeczywistych

Sposób 1: lista kroków

1 pobierz pierwszą liczbę

2 pobierz drugą liczbę

3 dodaj liczby do siebie

4 wynik dodawania podziel przez dwa

5 wypisz otrzymaną wartość

6 zakończ

Sposób 2: pseudokod

1 pobierz x

2 pobierz y

3 wykonaj działanie (x + y )/2

4 wypisz wynik

5 zakończ

(8)

Sposób 3: schemat blokowy

Sposób 4a: program w języku C++

#i n c l u d e <i o s t r e a m >

i n t main ( ) {

f l o a t x , y ; s t d : : c i n >> x ; s t d : : c i n >> y ;

s t d : : c o u t << " Ś r e d n i a a r y t m e t y c z n a w y n o s i : " << ( x+y ) / 2 ; }

(9)

Sposób 4b: program w języku Pascal

Program S r e d n i a ; Var x , y : R e a l ; B e g i n

R e a d l n ( x ) ; R e a d l n ( y ) ;

W r i t e l n (’ Ś r e d n i a a r y t m e t y c z n a w y n o s i : ( x+y ) / 2 ) ; End .

Sposób 4c: program w języku Python

x = f l o a t( i n p u t ( ) ) y = f l o a t( i n p u t ( ) )

p r i n t (" Ś r e d n i a a r y t m e t y c z n a w y n o s i : ", ( x+y ) / 2 )

(10)

Pierwszy program w C++

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; int main()

{

c o u t << " W i t a j w ś w i e c i e C++"; return 0;

}

Każdy program musi zawierać specjalną funkcję o nazwie main.

Od tej funkcji zaczyna się wykonywanie programu.

Definicja funkcji składa się z wiersza int main(), będącego

nagłówkiem funkcji oraz ujętej w nawiasy klamrowe { } treści funkcji.

Nagłówek to krótki opis interfejsu funkcji.

Treść funkcji zawiera instrukcje wykonywane przez tę funkcję.

Instrukcje to wyrażenia C++ zakończone średnikami.

Ostatnia instrukcja funkcji, return (nazywana instrukcją powrotu), kończy wykonywanie programu.

(11)

Pierwszy program w C++

#include <iostream>

using namespace std;

i n t main ( ) {

cout << " W i t a j w ś w i e c i e C++"; r e t u r n 0 ;

}

Zmienna cout (console out) pozwala wyświetlić komunikat w konsoli.

Zapis << oznacza wysłanie komunikatu ujętego w cudzysłowach (Witaj w świecie C++) do cout.

Przed użyciem cout należy dołączyć do programu plik iostream, zawierający m.in. definicję cout. Służy do tego dyrektywa #include.

Za pomocą dyrektywy using do programu dodajemy standardową (std) przestrzeń nazw. Dzięki temu piszemy krótko cout zamiast std::cout.

(12)

Instrukcja deklaracji i instrukcja przypisania

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t i ; i = 5 ;

c o u t << " Zmienna i "; c o u t << " o w a r t o ś c i "; c o u t << i ;

c o u t << e n d l ; i = i + 1 ;

c o u t << " T e r a z z m i e n n a i ma w a r t o ś ć " << i ; r e t u r n 0 ;

}

Wynik działania programu:

Zmienna i o w a r t o ś c i 5 T e r a z z m i e n n a i ma w a r t o ś ć 6

(13)

Instrukcja deklaracji i zmienne

Aby zapisać w komputerze jakąkolwiek informację, trzeba wskazać położenie tej danej oraz określić ilość zajmowanego przez nią miejsca.

Instrukcja int i; mówi, że program potrzebuje tyle pamięci, ile zajmuje liczba całkowita oznaczana nazwą int (ang. integer ).

Już sam kompilator zajmie się szczegółami alokacji i oznaczenia odpowiedniego miejsca w pamięci.

Deklaracja nie tylko określa typ, ale deklaruje nazwę tak, że

napotykając dalej na nazwę i, program będzie odnosił się zawsze do tego samego miejsca w pamięci.

i to zmienna.

W C++ wszystkie zmienne trzeba deklarować. Jeśli jakaś deklaracja zostanie pominięta, kompilator zgłosi błąd.

Deklaracja int i; to deklaracja definiująca lub krócej definicja.

(14)

Instrukcja przypisania

Instrukcja przypisania powoduje przypisanie wartości pewnemu miejscu w pamięci.

Instrukcja i = 5; powoduje przypisanie liczby 5 miejscu oznaczonemu jako zmienna i.

Symbol = to operator przypisania.

Przypisanie wykonywane jest od strony prawej do lewej.

W instrukcji i = i + 1 kompilator najpierw wykona działanie znajdujące się po prawej stronie operatora przypisania: i + 1,

otrzymując wartość 6. Następnie operator przypisania wstawi tę nową wartość do zmiennej i.

Wykonując polecenie cout << i;, program nie wyświetli znaku i, ale pokaże liczbę z tej zmiennej - czyli 5.

(15)

Instrukcja cin

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t i ;

c o u t << " P o d a j j a k ą ś l i c z b ę "; c i n >> i ;

c o u t << " Nada ł e ś z m i e n n e j w a r t o ś ć : " << i ; r e t u r n 0 ;

}

Wynik działania programu w przypadku, gdy użytkownik wpisał z klawiatury 2:

P o d a j j a k ą ś l i c z b ę

Nada ł e ś z m i e n n e j w a r t o ś ć : 2

(16)

Instrukcja warunkowa if

Składnia if (warunek) {

blok_instrukcji }

Jeśli warunek jest spełniony, czyli daje wartość true (prawda), program wykonuje blok_instrukcji zawarty w nawiasach klamrowych.

Jeśli warunek nie jest spełniony, czyli daje wartość false (fałsz), blok_instrukcji jest pomijany.

W przypadku, gdy blok_instrukcji składa się z pojedynczej instrukcji, nawiasy klamrowe można pominąć.

(17)

Instrukcja warunkowa if

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t i ;

c o u t << " P o d a j l i c z b ę d o d a t n i ą "; c i n >> i ;

i f ( i <= 0 )

c o u t << " Podana l i c z b a j e s t n i e p o p r a w n a ! "; r e t u r n 0 ;

}

(18)

Instrukcja warunkowa if

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t i ;

c o u t << " P o d a j l i c z b ę d o d a t n i ą "; c i n >> i ;

i f ( i <= 0 ) {

c o u t << " Podana l i c z b a j e s t n i e p o p r a w n a ! "; i = − i ;

c o u t << " Twoja l i c z b a po p o p r a w c e : " << i ; }

r e t u r n 0 ; }

(19)

Instrukcja warunkowa if else

Instrukcja if pozwala zdecydować, czy dana instrukcja lub blok instrukcji mają być w ogóle wykonane.

Instrukcja if else pozwala zdecydować, która z dwóch instrukcji (lub bloków) ma być wykonana.

Składnia (1)

if (warunek_wyboru) instrukcja1

else

instrukcja2

Składnia (1) - inny sposób formatowania kodu if (warunek_wyboru) instrukcja1

else instrukcja2

(20)

Instrukcja warunkowa if else

Składnia (2)

if (warunek_wyboru) {

blok_instrukcji1 }

else {

blok_instrukcji2 }

Jeśli warunek_wyboru jest spełniony (ma wartość true), program wykona blok_instrukcji1, a blok_instrukcji2 pominie.

W przeciwnym razie, jeśli warunek_wyboru nie jest spełniony, program pominie blok_instrukcji1, a wykona blok_instrukcji2.

(21)

Instrukcja warunkowa if else

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t i ;

c o u t << " P o d a j l i c z b ę "; c i n >> i ;

i f ( i > 0 )

c o u t << " Twoja l i c z b a j e s t d o d a t n i a . "; e l s e

c o u t << " Twoja l i c z b a j e s t u jem na l u b r ówna 0 . "; r e t u r n 0 ;

}

(22)

Instrukcja warunkowa if else

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t i ;

c o u t << " P o d a j l i c z b ę "; c i n >> i ;

i f ( i > 0 ) i = i + 2 ;

c o u t << " Wynik : " << i ; e l s e

i = i + 5 ;

c o u t << " Wynik : " << i ; }

Program powoduje błąd kompilacji. Kompilator widzi pojedyncze if z instrukcją i = i + 2;. Dalej jest instrukcja z obiektem cout. Jak dotąd wszystko w porządku. Teraz jednak kompilator dochodzi do

niepowiązanego z niczym else, więc zgłasza błąd składniowy.

(23)

Instrukcja warunkowa if else

Jeśli do kodu dodamy nawiasy klamrowe, uzyskamy zamierzony efekt:

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t i ;

c o u t << " P o d a j l i c z b ę "; c i n >> i ;

i f ( i > 0 ) {

i = i + 2 ;

c o u t << " Wynik : " << i ; }

e l s e {

i = i + 5 ;

c o u t << " Wynik : " << i ; }

}

(24)

Konstrukcja if else if else

W programach komputerowych często mamy więcej możliwości niż proste

"tak" i "nie". Instrukcję if else można rozbudować tak, aby obsługiwała także takie sytuacje.

Składnia (1)

if (warunek_wyboru1) instrukcja1

else

if (warunek_wyboru2) instrukcja2

else

instrukcja3

(25)

Konstrukcja if else if else

Składnia (1) - inny sposób formatowania kodu if (warunek_wyboru1)

instrukcja1

else if (warunek_wyboru2) instrukcja2

else

instrukcja3

(26)

Konstrukcja if else if else

Składnia (2)

if (warunek_wyboru1) {

blok_instrukcji1 }

else {

if (warunek_wyboru2) {

blok_instrukcji2 }

else {

blok_instrukcji3 }

}

(27)

Konstrukcja if else if else

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t i ;

c o u t << " P o d a j l i c z b ę "; c i n >> i ;

i f ( i > 0 )

c o u t << " Twoja l i c z b a j e s t d o d a t n i a . "; e l s e

i f ( i < 0 )

c o u t << " Twoja l i c z b a j e s t u jem na . "; e l s e

c o u t << " Twoja l i c z b a j e s t r ówna 0 . "; r e t u r n 0 ;

}

(28)

Zagnieżdżona instrukcja if else

Składnia

if (warunek_wyboru1) instrukcja1 else if (warunek_wyboru2) instrukcja2

else if (warunek_wyboru3) instrukcja3 . . .

else instrukcjaN

Przykład: Program obliczający stopień na podstawie liczby otrzymanych punktów według kryteriów:

0 . . . 49 - 2 50 . . . 59 - 3 60 . . . 69 - 3.5 70 . . . 79 - 4 80 . . . 89 - 4.5 90 . . . 100 - 5

(29)

Zagnieżdżona instrukcja if else

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t p u n k t y ; f l o a t s t o p i e n ;

c o u t << " P o d a j l i c z b ę p u n k t ów ( [ 0 , 1 0 0 ] ) : "; c i n >> p u n k t y ;

i f ( p u n k t y <=49) s t o p i e n =2;

e l s e i f ( p u n k t y <=59) s t o p i e n =3;

e l s e i f ( p u n k t y <=69) s t o p i e n = 3 . 5 ; e l s e i f ( p u n k t y <=79) s t o p i e n =4;

e l s e i f ( p u n k t y <=89) s t o p i e n = 4 . 5 ; e l s e s t o p i e n =5;

c o u t << " Twoja o c e n a : " << s t o p i e n ; r e t u r n 0 ;

}

(30)

Operator wyboru ?:

Składnia

wyrażenie1 ? wyrażenie2 : wyrażenie3

Jeśli wyrażenie1 jest prawdziwe, wartością całego wyrażenia z operatorem wyboru jest wyrażenie2.

W przeciwnym wypadku wartością całego wyrażenia jest wyrażenie3.

Przykład 1: 5 > 3 ? 6 : 2

5 jest większe od 3, więc całe wyrażenie przyjmie wartość 6.

Przykład 2: 5 == 3 ? 6 : 2

5 nie jest równe 3, więc całe wyrażenie przyjmie wartość 2.

(31)

Operator wyboru ?:

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t a , b , c ;

c o u t << " P o d a j d w i e l i c z b y c a ł k o w i t e : " << e n d l ; c i n >> a >> b ;

c = a > b ? a : b ;

c o u t << " Wi ę k s z a z l i c z b " << a << " i " << b << " t o " << c ; r e t u r n 0 ;

}

Przykładowy wynik działania programu:

P o d a j d w i e l i c z b y c a ł k o w i t e : 2

6

Wi ę k s z a z l i c z b 2 i 6 t o 6

(32)

Operator wyboru ?: i instrukcja if else

Ten sam program z wykorzystaniem if else zamiast ?:

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t a , b , c ;

c o u t << " P o d a j d w i e l i c z b y c a ł k o w i t e : " << e n d l ; c i n >> a >> b ;

i f ( a > b ) c = a ; e l s e c = b ;

c o u t << " Wi ę k s z a z l i c z b " << a << " i " << b << " t o " << c ; r e t u r n 0 ;

}

(33)

Instrukcja switch

Składnia

switch (wyrażenie) {

case wartość1 : {instrukcja1; break;}

case wartość2 : {instrukcja2; break;}

. . .

default : {instrukcjaN; break;}

}

Najpierw obliczane jest wyrażenie umieszczone w nawiasach po słowie switch.

Jeśli jego wartość odpowiada którejś z wartości podanej w jednej z etykiet case, wykonywane będą instrukcje począwszy od tej etykiety.

Ich wykonywanie kończy się po napotkaniu instrukcji break. Działanie instrukcji switch zostaje wówczas zakończone.

(34)

Instrukcja switch

switch (wyrażenie) {

case wartość1 : {instrukcja1; break;}

case wartość2 : {instrukcja2; break;}

. . .

default : {instrukcjaN; break;}

}

Jeśli wartość wyrażenia nie zgadza się z żadną z wartości w etykietach case, wykonywane będą instrukcje po etykiecie default.

Etykieta default jest opcjonalna, tzn. może zostać pominięta.

Wówczas, jeśli w zbiorze etykiet case nie ma żadnej etykiety równej wartości wyrażenia, instrukcja switch nie będzie wykonana.

Instrukcje występujące po etykiecie case nie muszą kończyć się instrukcją break. Jeśli jej nie umieścimy, to będą wykonywane instrukcje znajdujące się pod następną etykietą case.

(35)

Instrukcja switch

Przykład: Program obliczający stopień na podstawie liczby otrzymanych punktów według kryteriów:

0 . . . 49 - 2 50 . . . 59 - 3 60 . . . 69 - 3.5 70 . . . 79 - 4 80 . . . 89 - 4.5 90 . . . 100 - 5

(36)

Instrukcja switch

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t p u n k t y ; f l o a t s t o p i e n ;

c o u t << " P o d a j l i c z b ę p u n k t ów ( [ 0 , 1 0 0 ] ) : "; c i n >> p u n k t y ;

p u n k t y = p u n k t y / 1 0 ; s w i t c h ( p u n k t y ) {

c a s e 5 : { s t o p i e n = 3 ; b r e a k; } c a s e 6 : { s t o p i e n = 3 . 5 ; b r e a k; } c a s e 7 : { s t o p i e n = 4 ; b r e a k; } c a s e 8 : { s t o p i e n = 4 . 5 ; b r e a k; } c a s e 9 :

c a s e 10 : { s t o p i e n = 5 ; b r e a k; } d e f a u l t : { s t o p i e n = 2 ; b r e a k; } }

c o u t << " Twoja o c e n a : " << s t o p i e n ; }

(37)

Pętla for

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t i ;

for (i=0; i<5; i=i+1)

cout << "C++ zna pętle." << endl;

c o u t << "C++ w i e , k i e d y p r z e s t a ć . " << e n d l ; r e t u r n 0 ;

}

Wynik działania programu:

C++ z n a p ę t l e . C++ z n a p ę t l e . C++ z n a p ę t l e . C++ z n a p ę t l e . C++ z n a p ę t l e .

C++ w i e , k i e d y p r z e s t a ć .

(38)

Pętla for

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t i ;

f o r (i = 0; i < 5; i = i + 1)

c o u t << "C++ z n a p ę t l e . " << e n d l ;

c o u t << "C++ w i e , k i e d y p r z e s t a ć . " << e n d l ; r e t u r n 0 ;

}

Inicjalizacja pętli. Pętla zaczyna się od ustawienia liczby całkowitej i na 0: i=0;.

Instrukcja ta wykonuje się tylko raz.

Warunek pętli. Program sprawdza, czy i jest mniejsze od 5: i<5;

Treść pętli. Jeżeli tak, program wykonuje następną instrukcję:

cout << "C++ zna pętle." << endl;

Krok pętli. Po zakończeniu treści pętli program zwiększa i o 1: i=i+1, co kończy pierwszy cykl pętli.

Następnie pętla zaczyna drugi cykl od porównania nowej wartości zmiennej i z 5.

Nowa wartość, 1, jest również mniejsza niż 5, więc pokazywany jest kolejny napis i cykl kończy się zwiększeniem i . Kolejne etapy cyklu powtarzają się, aż i osiągnie wartość 5. Wtedy sprawdzenie warunku daje fałsz, więc program przechodzi do

(39)

Pętla for

Składnia

for (inicjalizacja; warunek_pętli; krok_pętli) {

treść }

Zwykle pętla for obejmuje następujące działania:

1. Ustawienie wartości początkowych (inicjalizacja).

2. Wykonanie testu w celu sprawdzenia, czy pętla ma być dalej wykonywana (warunek pętli).

3. Wykonanie działań objętych pętlą (treść pętli).

4. Aktualizacja wartości używanej (lub używanych) w teście (krok pętli).

(40)

Pętla for

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t l i m i t , i ;

c o u t << " P o d a j w a r t o ś ć p o c z ą tkow ą o d l i c z a n i a : "; c i n >> l i m i t ;

f o r ( i = l i m i t ; i ; i = i − 1 ) c o u t << " i = " << i << e n d l ;

c o u t << " Gotowe , bo j u ż i = " << i << e n d l ; r e t u r n 0 ;

}

Przykładowy wynik działania programu:

P o d a j w a r t o ś ć p o c z ą tkow ą o d l i c z a n i a : 4 i = 4

i = 3 i = 2 i = 1

Gotowe , bo j u ż i = 0

(41)

Pętla for

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t l i m i t , i ;

c o u t << " P o d a j w a r t o ś ć p o c z ą tkow ą o d l i c z a n i a : "; c i n >> l i m i t ;

f o r ( i = l i m i t ; i; i = i − 1 ) c o u t << " i = " << i << e n d l ;

c o u t << " Gotowe , bo j u ż i = " << i << e n d l ; r e t u r n 0 ;

}

- Warunkiem pętli jest wyrażenie: i;

- W C++ każda wartość zmiennej i różna od zera będzie prawdą, a wartość zero - fałszem.

- Pętla zakończy się zatem w chwili, gdy i przyjmie wartość 0.

- Uwaga: Program nie działa dla pewnych wartości zmiennej limit.

Jakich?

(42)

Pętla for

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t l i m i t , i ;

c o u t << " P o d a j w a r t o ś ć p o c z ą tkow ą o d l i c z a n i a : "; c i n >> l i m i t ;

f o r ( i = l i m i t ; i ; i = i − 1 ) c o u t << " i = " << i << e n d l ;

c o u t << " Gotowe , bo j u ż i = " << i << e n d l ; r e t u r n 0 ;

}

- Pętla for to pętla z uprzednim sprawdzeniem warunku, co oznacza, że warunek pętli jest sprawdzany przed każdym cyklem pętli. Jeśli warunek już na samym początku nie będzie spełniony, pętla nie wykona się ani razu.

- Wynik działania programu, gdy użytkownik wprowadzi wartość 0:

P o d a j w a r t o ś ć p o c z ą tkow ą o d l i c z a n i a : 0

Gotowe , bo j u ż i = 0

(43)

Pętla for

W pętli for możliwa jest deklaracja zmiennej.

Zmienna taka będzie jednak istniała tylko w tej pętli. Zatem kiedy program zakończy wykonywanie pętli, zmienna zostanie usunięta.

Poniższy program zakończy się błędem kompilacji.

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

f o r (int i = 0; i < 5 ; i = i + 1 ) c o u t << "C++ z n a p ę t l e . " << e n d l ; cout << i;

r e t u r n 0 ; }

Instrukcję i = i + 1 można zastąpić operatorem inkrementacji i++.

Instrukcję i = i - 1 można zastąpić operatorem dekrementacji i--.

(44)

Pętla for

Program umożliwia obliczenie silni liczby n dla (0 ≤ n ≤ 7).

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t n , s , i ;

c o u t << " P o d a j l i c z b ę n ( 0 <= n <= 7 ) : "; c i n >> n ;

s = 1 ;

f o r ( i = 1 ; i <= n ; i ++) s = s ∗ i ;

c o u t << " S i l n i a l i c z b y " << n << " j e s t r ówna : " << s ; r e t u r n 0 ;

}

Wynik działania programu dla n = 5.

P o d a j l i c z b ę n ( 0 <= n <= 7 ) : 5 S i l n i a l i c z b y 5 j e s t r ówna 120

(45)

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t k , s =0;

c o u t << " P o d a j l i c z b ę c a ł k o w i t ą : "; c i n >> k ;

c o u t << " Z l i c z a n i e c o " << k << e n d l ; f o r (i n t i = 0 ; i < 1 0 0 ; i = i + k ) {

c o u t << i << e n d l ; s = s + i ;

}

c o u t << " Suma j e s t r ówna : " << s ; }

P o d a j l i c z b ę c a ł k o w i t ą 30 Z l i c z a n i e c o 3 0 :

0 30 60 90

Suma j e s t r ówna 180

(46)

Pętla while

Składnia

while (warunek_pętli) {

treść }

Najpierw program wyznacza wartość wyrażenia warunek_pętli ujętego w nawiasy. Jeśli wynikiem jest true, wykonywane są instrukcje z treści pętli.

Po zakończeniu treści pętli, program ponownie wyznacza wartość warunku pętli.

Proces trwa tak długo, dopóki warunek nie przyjmie wartości false.

(47)

Pętla for i pętla while

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

f o r (int i = 0; i < 5; i++)

c o u t << "C++ z n a p ę t l e . " << e n d l ;

c o u t << "C++ w i e , k i e d y p r z e s t a ć . " << e n d l ; }

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

int i = 0;

w h i l e (i < 5) {

c o u t << "C++ z n a p ę t l e . " << e n d l ; i++;

}

c o u t << "C++ w i e , k i e d y p r z e s t a ć . " << e n d l ; }

(48)

Pętla for i pętla while

Pętla for w postaci:

for (inicjalizacja; warunek_pętli; aktualizacja) {

instrukcje }

może zostać zapisana następująco:

inicjalizacja;

while (warunek_pętli) {

instrukcje aktualizacja }

(49)

Pętla for i pętla while

Podobnie pętla while w postaci:

while (warunek_pętli) treść

może zostać zapisana następująco:

for ( ; warunek_pętli; ) treść

Pętla for wymaga trzech wyrażeń, ale mogą być to wyrażenia puste, obowiązkowe są tylko średniki. Brak warunku pętli for jest traktowany jako wyrażenie stałe true, więc następująca pętla będzie pętlą nieskończoną:

for ( ; ; ) treść

Pętle while są używane zwykle wtedy, kiedy trudno z góry przewidzieć, ile razy pętla powinna się wykonać.

(50)

Program sumuje liczby całkowite do momentu wprowadzenia 0.

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t x , s ;

c o u t << " P o d a j l i c z b ę : "; c i n >> x ;

s = x ;

w h i l e ( x != 0 ) {

c o u t << " P o d a j l i c z b ę : "; c i n >> x ;

s = s + x ; }

c o u t << " Suma j e s t r ówna : " << s ; }

P o d a j l i c z b ę : 5 P o d a j l i c z b ę : 2 P o d a j l i c z b ę : 6 P o d a j l i c z b ę : 0 Suma j e s t r ówna : 13

(51)

Pętla do while

Pętla do while istotnie różni się od pętli for i while, gdyż warunek jest w niej sprawdzany po wykonaniu treści.

Wobec tego pętla do while wykona się zawsze co najmniej raz, niezależnie od spełnienia (bądź niespełnienia) warunku.

Składnia do {

treść

} while (warunek_pętli)

(52)

i n t main ( ) {

i n t x , s =0;

c o u t << " P o d a j l i c z b ę : "; c i n >> x ; while ( x != 0 )

{

c o u t << " P o d a j l i c z b ę : "; c i n >> x ; s = s + x ;

}

c o u t << " Suma j e s t r ówna : " << s ; }

i n t main ( ) {

i n t x , s =0;

do {

c o u t << " P o d a j l i c z b ę : "; c i n >> x ; s = s + x ;

} while ( x != 0 ) ;

c o u t << " Suma j e s t r ówna : " << s ; }

(53)

Pętla do while

Program wykonuje sumowanie liczb całkowitych. Sumowanie zostaje zakończone, gdy suma składników przekroczy wartość 100.

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t x , s , l i c z n i k ; s = 0 ;

l i c z n i k = 0 ; do

{

c o u t << " P o d a j l i c z b ę : "; c i n >> x ;

s = s + x ; l i c z n i k ++;

}w h i l e ( s <= 1 0 0 ) ;

c o u t << " Suma j e s t r ówna : " << s << e n d l ; c o u t << " L i c z b a s k ł a d n i k ów : " << l i c z n i k ; }

(54)

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t x , s =0 , l i c z n i k =0;

do {

c o u t << " P o d a j l i c z b ę : "; c i n >> x ;

s = s + x ; l i c z n i k ++;

}w h i l e ( s <= 1 0 0 ) ;

c o u t << " Suma j e s t r ówna : " << s << e n d l ; c o u t << " L i c z b a s k ł a d n i k ów : " << l i c z n i k ; }

P o d a j l i c z b ę : 30 P o d a j l i c z b ę : 25 P o d a j l i c z b ę : 40 P o d a j l i c z b ę : 8 Suma j e s t r ówna : 103

L i c z b a s k ł a d n i k ów : 4

(55)

Instrukcje break i continue

Instrukcje break i continue umożliwiają programowi pomijanie części kodu.

Instrukcja break

I Oprócz instrukcji switch może być użyta wewnątrz dowolnej pętli.

I Powoduje natychmiastowe przerwanie wykonywania pętli.

I Jeśli mamy do czynienia z pętlami zagnieżdżonymi, instrukcja break powoduje przerwanie tylko tej pętli, w której została bezpośrednio użyta. Jest to więc przerwanie z wyjściem o jeden poziom wyżej.

Instrukcja continue

I Znajduje zastosowanie w pętlach.

I Powoduje, że program pomija resztę treści pętli i zaczyna nowy cykl pętli.

I W odróżnieniu od instrukcji break sama pętla nie zostaje przerwana.

Przerwany jest tylko bieżący obieg pętli.

(56)

Instrukcja break

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t i = 7 ; w h i l e ( 1 ) {

c o u t << "Pę t l a , i = " << i << e n d l ; i = i − 1 ;

i f ( i < 5 ) {

c o u t << " P r z e r w a n i e p ę t l i . "; b r e a k;

} } }

Pę t l a , i = 7 Pę t l a , i = 6 Pę t l a , i = 5

P r z e r w a n i e p ę t l i .

(57)

Instrukcja continue

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t k ;

f o r ( k = 0 ; k < 1 2 ; k = k +1) {

c o u t << "A";

i f ( k > 1 ) c o n t i n u e; c o u t << " b " << e n d l ; }

}

Ab Ab

AAAAAAAAAA

(58)

Zagnieżdżenie pętli

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

f o r (i n t i = 1 ; i <= 7 ; i ++) {

f o r(i n t j = 1 ; j <= i ; j ++) {

c o u t << " ∗ "; }

c o u t << e n d l ; }

}

∗∗

∗∗∗

∗∗∗∗

∗∗∗∗∗

∗∗∗∗∗∗

∗∗∗∗∗∗∗

(59)

Typy danych

Aby zapisać w komputerze jakąś daną, trzeba zapamiętać trzy jej podstawowe cechy:

miejsce przechowywania informacji, przechowywaną wartość,

rodzaj przechowywanej wartości.

Typ użyty w deklaracji zmiennej decyduje o rodzaju informacji, a nazwa zmiennej symbolicznie opisuje wartość.

(60)

Typy danych

Przykład int stopień;

stopień = 5;

Instrukcje te mówią, że przechowywana jest liczba całkowita (ang.

integer ), stopień to nazwa wartości, w tym wypadku: 5.

Program znajduje dostatecznie duży fragment pamięci, aby zapisać liczbę całkowitą, zapamiętuje jego położenie, przypisuje temu miejscu etykietę stopień i wstawia w to miejsce wartość 5.

Instrukcje te nie mówią, gdzie w pamięci znajduje się wartość, ale program pamięta i to. Za pomocą operatora & można pobrać adres zmiennej stopień.

(61)

Typy danych

Operator & (czyt. ampersand ) pobiera adres zmiennej.

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t s t o p i e n ; s t o p i e n = 5 ; i n t s = 2 ;

c o u t << " Zmienna s t o p i e n o w a r t o ś c i : " << s t o p i e n ; c o u t << " i a d r e s i e : " << &s t o p i e n << e n d l ;

c o u t << " Zmienna s o w a r t o ś c i : " << s ; c o u t << " i a d r e s i e : " << &s ;

}

Zmienna s t o p i e n o w a r t o ś c i : 5 i a d r e s i e : 0x6ffe3c Zmienna s o w a r t o ś c i : 2 i a d r e s i e : 0x6ffe38

(62)

Typy danych

Zasady tworzenia nazw zmiennych:

Jedyne znaki dopuszczalne w nazwach to litery, cyfry oraz podkreślenie (_).

Pierwszy znak nie może być cyfrą.

Wielkie litery są odróżniane od małych liter.

Nazwa nie może być słowem kluczowym języka C++.

Nazwy zaczynające się od dwóch podkreśleń lub od podkreślenia i za nim wielkiej litery są zarezerwowane dla implementacji, to znaczy dla kompilatora i wykorzystywanych przez niego zasobów.

Nazwy zaczynające się od pojedynczego podkreślenia zarezerwowane są jako identyfikatory globalne implementacji.

Długość nazwy zmiennej nie jest ograniczona i wszystkie znaki są brane pod uwagę.

(63)

Typy danych

Przykłady poprawnych i niepoprawnych nazw zmiennych.

int delta; poprawna

int Delta; poprawna, inna niż delta

int DELTA; poprawna, inna niż dwie poprzednie Int liczba; niepoprawna, zamiast Int powinno być int int myszka_miki; poprawna

int myszka-miki; niepoprawna, nie można używać minusów int _delta2; poprawna, ale zarezerwowana

int __delta; poprawna, ale zarezerwowana int 2delta; niepoprawna, zaczyna się od cyfry

int double; niepoprawna, double jest słowem kluczowym int begin; poprawna, begin jest słowem kluczowym ale Pascala int w_szczebrzeszynie_chrzaszcz_brzmi_w_trzcinie; poprawna

(64)

Systematyka typów w C++

Typy języka C++ można podzielić dwojako:

Pierwszy podział:

I typy fundamentalne

np: int, short, long, long long, char, float, double, long double

I typy pochodne, które powstają na bazie typów fundamentalnych np: tablice, funkcje, wskaźniki, struktury

Drugi podział:

I typy wbudowane, czyli takie, w które język C++ jest wyposażony

I typy zdefiniowane przez użytkownika

(65)

Typy całkowitoliczbowe

Różne typy całkowite C++ różnią się ilością miejsca przeznaczonego na wartość.

Większe zużycie pamięci oznacza możliwość zapisywania większych wartości.

Niektóre typy pozwalają zapisywać wartości dodatne i ujemne (typy ze znakiem, signed), inne uniemożliwiają zapisanie wartości ujemnych (typy bez znaku, unsigned).

Określając ilość pamięci zajmowanej przez typy całkowitoliczbowe, mówi się zwykle o szerokości. Im więcej pamięci dana wartość zajmuje, tym jest szersza.

Podstawowe typy całkowitoliczbowe C++, ułożone według rosnącej szerokości: char, short, int, long, long long.

(66)

Bity i bajty*

Podstawową jednostką pamięci komputerowej jest bit.

O bicie można myśleć jako o przełączniku elektronicznym, który może być albo włączony, albo wyłączony.

Wyłączenie oznacza wartość 0, włączenie: 1.

8-bitowy fragment pamięci może przyjmować 256 różnych wartości:

skoro mamy 8 bitów, z których każdy daje 2 możliwości, to razem mamy 28 = 256 możliwości.

Zatem w 8-bitowej jednostce pamięci możemy zapisać na przykład liczby od 0 do 255 lub od −128 do 127.

Każdy dodatkowy bit podwaja liczbę dostępnych kombinacji, zatem na 16 bitach można zapisać 65 536 różnych wartości, a

na 32 bitach - 4 294 672 296.

(67)

Bity i bajty*

Przez bajt zwykle rozumie się 8-bitowy fragment pamięci. Tak rozumiany bajt jest jednostką miary pamięci komputera, gdzie kilobajt = 1024 bajty, a megabajt = 1024 kilobajty.

Jednak w C++ bajt zdefiniowano inaczej.

Bajt (byte) składa się z przynajmniej tylu sąsiadujących bitów, ilu trzeba na zapisanie podstawowego zestawu znaków używanego w danej implementacji.

Wobec tego liczba możliwych wartości bajta musi być przynajmniej równa liczbie różnych znaków.

Zwykle bazuje się na zestawach znaków ASCII mających 8 bitów na znak. Dlatego w C++ bajt ma przeważnie 8 bitów.

Jednak w przypadku programowania w środowisku bazującym na większych zestawach znaków, jak Unicode, bajt może mieć 16, a nawet 32 bity.

(68)

Bity i bajty*

Korzystając z różnej liczby bitów na wartość, typy short, int i long pozwalają zapisywać liczby całkowite rożnej szerokości. Dobrze byłoby, gdyby każdy z tych typów zawsze miał tę samą szerokość na wszystkich systemach - na przykład typ short 16 bitów, typ int 32 bity itd. Jednak żadna wielkość nie jest odpowiednia jednocześnie dla wszystkich

możliwych konstrukcji komputerów. C++ jest elastyczny i określa tylko gwarantowaną wielkość minimalną.

Liczby typu short muszą mieć przynajmniej 16 bitów.

Liczby typu int muszą być nie mniejsze od liczb typu short.

Liczby typu long muszą mieć przynajmniej 32 bity i być nie mniejsze od liczb typu int.

Aby poznać ograniczenia liczb całkowitych w używanym systemie, można skorzystać z narzędzi dostępnych w samym C++. Operator sizeof zwraca wyrażoną w bajtach wielkość typu lub zmiennej.

(69)

Ograniczenia liczb całkowitych*

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t n _ i n t = INT_MAX ; s h o r t n _ s h o r t = SHRT_MAX ; l o n g n _ l o n g = LONG_MAX;

l o n g l o n g n _ l l o n g = LLONG_MAX ;

c o u t << " i n t ma " << s i z e o f (i n t) << " b a j t y . " << e n d l ; c o u t << " s h o r t ma " << s i z e o f n _ s h o r t << " b a j t y . " << e n d l ; c o u t << " l o n g ma " << s i z e o f n _ l o n g << " b a j t y . " << e n d l ; c o u t << " l o n g l o n g ma " << s i z e o f (l o n g l o n g) << " b a j t ów . "; c o u t << e n d l << e n d l << " Warto ś c i m a k sy m a ln e : " << e n d l ; c o u t << " i n t : " << n _ i n t << e n d l ;

c o u t << " s h o r t : " << n _ s h o r t << e n d l ; c o u t << " l o n g : " << n _ l o n g << e n d l ;

c o u t << " l o n g l o n g : " << n _ l l o n g << e n d l << e n d l ;

c o u t << " M i n i m a l n a w a r t o ś ć t y p u i n t = " << INT_MIN << e n d l ; c o u t << " B i t ów na b a j t = " << CHAR_BIT << e n d l ;

}

(70)

Ograniczenia liczb całkowitych*

Przykładowy wynik programu (Dev C++, Windows 10)

i n t ma 4 b a j t y . s h o r t ma 2 b a j t y . l o n g ma 4 b a j t y . l o n g l o n g ma 8 b a j t ów .

Warto ś c i ma k s ym a l ne : i n t: 2 1 4 7 4 8 3 6 4 7 s h o r t: 3 27 67 l o n g: 2 1 4 7 4 8 3 6 4 7

l o n g l o n g: 9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 7

M i n i m a l n a w a r t o ś ć t y p u i n t = −2147483648 B i t ów na b a j t = 8

(71)

Inicjalizacja zmiennych

Inicjalizacja stanowi połączenie deklaracji i przypisania.

i n t a = 5 ;

i n t b = a ; // b=5

i n t c = a + b + 3 ; // c =13

Jeśli zmienne zdefiniowane w funkcji nie zostaną zainicjalizowane, wartość zmiennej będzie nieokreślona. Oznacza to, że wartość ta będzie

przypadkowa, zależna od tego, co znajdowało się akurat w pamięci w chwili tworzenia danej zmiennej.

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t a = 5 ; i n t b , c , d ;

c o u t << a << " , " << b << " , " << c << " , " << d ; }

5 , 1 , 0 , 4 4 3 7 2 8 8 0

(72)

Typy całkowitoliczbowe - char

Typ char przechowuje znaki takie jak litery i cyfry.

O ile przechowywanie w komputerze liczb nie stanowi problemu, to z przechowywaniem znaków nie jest już tak łatwo.

Języki programowania zamiast liter przechowują ich kody, dlatego typ char jest kolejnym typem liczbowym.

(73)

Typy całkowitoliczbowe - char

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

c h a r c = ’B ’; i n t i = c ;

c o u t << " Kod A S C I I z n a k u " << c << " t o " << i << e n d l ; c o u t << " Dodajemy do kodu z n a k u j e d y n k ę : " << e n d l ; c = c + 1 ;

i = c ;

c o u t << " Kod A S C I I z n a k u " << c << " t o " << i << e n d l ; }

Kod A S C I I z n a k u B t o 66

Dodajemy do kodu z n a k u j e d y n k ę : Kod A S C I I z n a k u C t o 67

(74)

i n t main ( ) {

c h a r c = ’B ’; i n t i = c ;

c o u t << " Kod A S C I I z n a k u " << c << " t o " << i << e n d l ; c o u t << " Dodajemy do kodu z n a k u j e d y n k ę : " << e n d l ; c = c + 1 ;

i = c ;

c o u t << " Kod A S C I I z n a k u " << c << " t o " << i << e n d l ; }

Zapis ’B’ oznacza kod liczbowy znaku B, więc inicjalizacja zmiennej c typu char wartością ’B’ powoduje ustawienie c na 66.

Następnie program przypisuje tę samą wartość zmiennej i typu int tak, że c i i mają wartość 66.

Następnie cout wyświetla wartość zmiennej c jako B, a zmiennej i jako 66.

To typ zmiennej decyduje o sposobie jej wyświetlenia przez cout.

Zmienna c zawiera tak naprawdę liczbę całkowitą, można stosować do niej operacje arytmetyczne, np. dodanie jedynki. Powoduje to zmianę

(75)

Tabela rozszerzona ASCII

(czyt. aski; ang. American Standard Code for Information Interchange)

(76)

Typy całkowitoliczbowe - bool

Nazwa tego typu pochodzi od nazwiska angielskiego matematyka George’a Boole’a, który stworzył matematyczny zapis praw logiki.

W obliczeniach zmienna typu bool (nazywana też zmienną logiczną) może mieć jedną z dwóch wartości: true (prawda) lub false (fałsz).

Faktycznie jednak stan prawda przechowywany jest za pomocą wartości 1, natomiast stan fałsz za pomocą wartości 0.

i n t x = 8 ; b o o l b ; b = f a l s e; b = 6 ; b = 0 ; b = ( x > 5 ) ;

(77)

Typy całkowitoliczbowe - bool

#i n c l u d e <i o s t r e a m >

u s i n g n a m e s p a c e s t d ; i n t main ( )

{

i n t n , i ;

b o o l p i e r w s z a = t r u e;

c o u t << " P o d a j l i c z b ę n a t u r a l n ą : "; c i n >> n ;

i = 2 ;

w h i l e ( i < n ) {

i f ( n % i == 0 ) p i e r w s z a = f a l s e; i ++;

}

i f ( p i e r w s z a )

c o u t << " L i c z b a " << n << " j e s t l i c z b ą p i e r w s z ą "; e l s e

c o u t << " L i c z b a " << n << " n i e j e s t l i c z b ą p i e r w s z ą "; }

(78)

Typy zmiennoprzecinkowe

Typy reprezentujące liczby zmiennoprzecinkowe umożliwiają pracę na liczbach rzeczywistych z różną dokładnością:

float - ang. floating point: zmienny przecinek

double - ang. double precision: podwójna dokładność

long double - ang. long: długi, ulepszona wersja typu o podwójnej precyzji, rozszerzona dokładność

Przykłady

12.34 2.52e+8 = 252000000

939001.32 2.52e8 = 252000000

0.00023 8.33E-4 = 0.000833

5.0 -16.32e-3 = −0.01632

(79)

Typy zmiennoprzecinkowe

Typy te opisuje się przez liczbę cyfr znaczących oraz dopuszczalny zakres wykładników.

Cyfry znaczące to cyfry, które mają wpływ na wielkość liczby.

Liczby 123, 1.23, 0.123, 0.000123 mają 3 cyfry znaczące.

Liczba 12.3000 ma 6 cyfr znaczących.

Cyfry znaczące w C++ w typie:

float - muszą być zapisywane przynajmniej na 32 bitach

double - przynajmniej na 48 bitach i nie mniej niż w typie float long double - wymaga się przynajmniej tylu bitów, ile jest w typie double

Jednak zwykle typ float ma 32 bity, double 64, a long double 80, 96 lub 128 bitów.

Zakres wykładników dla wszystkich trzech typów nie może być mniejszy niż od −37 do +37.

(80)

Typy zmiennoprzecinkowe

Najczęsciej spotykane szerokości i zakresy wartości typów zmiennoprzecinkowych dla kompilatorów 32 bitowych.

float 32 bity 3.4e-38 . . . 3.4e38 double 64 bity 1.7e-308 . . . 1.7e308 long double 80 bitów 3.4e-4932 . . . 1.1e4932

Cytaty

Powiązane dokumenty

Napisać program generujący 20 węzłów listy jednokierunkowej z polami danych generowanymi losowo z zakresu od 1 do 20 oraz wypisujący po kolei wszystkie pola danych.. Pomiędzy

[r]

Niech Z będzie zbiorem tych funkcjonałów, które zerują wszystkie elementy zbioru A, natomiast W - zbiorem tych funkcjonałów, które zerują wszystkie elementy zbioru Z. Niech V

ROCZNIKI POLSKIEGO TOWARZYSTWA MATEMATYCZNEGO Seria I: PRACE MATEMATYCZNE X (1966).. ANNALES SOCIETATIS MATHEMATICAE POLONAE Serio I: COMMENTATIONES MATHEMATICAE X

Znajdź warunek na λ i µ, który gwarantuje, że istnieje rozkład stacjonarny.. Jaki

6–57: Liczby różnorodności porostów (LDV) taksonów referencyjnych i wskaźników eutrofizacji oraz suma częstości występowania taksonów na wybranych forofitach

The high-frequency electronic ballast output stage as a resonance half-bridge class-D converter is analyzed. A stage mathematical model as dependence of voltages and currents in

Przy rysowaniu SKUF istotne jest dostrzeżenie podwójnego układu szeregów i kolumn, tymczasem znaczna część dzieci w wieku do 7 lat, a także pewna grupa