• Nie Znaleziono Wyników

Podstawy programowania Podstawy programowania w jw języku C++ ęzyku C++

N/A
N/A
Protected

Academic year: 2021

Share "Podstawy programowania Podstawy programowania w jw języku C++ ęzyku C++"

Copied!
61
0
0

Pełen tekst

(1)

Podstawy programowania

Podstawy programowania

w j

w języku C++

ęzyku C++

Instrukcje sterujące wykonaniem

programu

Część druga

Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi uważnego w nim uczestnictwa. Opracowanie to jest chronione prawem autorskim. Wykorzystywanie jakiegokolwiek fragmentu w celach innych niż nauka własna jest nielegalne. Dystrybuowanie tego opracowania lub jakiejkolwiek jego części oraz wykorzystywanie zarobkowe bez zgody autora jest zabronione. Roman Simiński

roman.siminski@us.edu.pl www.us.edu.pl/~siminski Autor

(2)

Instrukcje wyrażeniowa

Instrukcje wyrażeniowa

Instrukcja wyrażeniowa — to każde poprawne wyrażenie w języku C (również

wyrażenie puste) zakończone znakiem średnika.

Wykonanie takiej instrukcji polega na wyznaczeniu wartości danego wyrażenia.

x = 0;

a + b;

x = a + b;

(3)

Instrukcje złożona

Instrukcje złożona

Copyright © Roman Simiński Strona : 3

Instrukcja złożona — zwana inaczej blokiem, to lista instrukcji ujęta w nawiasy

klamrowe {}.

Blok traktowany jest jako pojedyncza instrukcja.

Identyfikator zadeklarowany w obrębie bloku ma jego zakres.

Bloki mogą być zagnieżdżone do dowolnej głębokości.

W obrębie zagnieżdżonych bloków następuje przesłanianie nazw.

{ int i = 0, j = 1, k; k = i + j; { float k = 10.2; printf( "k = %g", k ); } printf( "k = %d", k ); }

k = 10.2

k = 1

(4)

Instrukcja warunkowa

Instrukcja warunkowa

if( W ) I I W tak nie if( W ) I

jeżeli ( warunek W jest prawdziwy )

wykonaj instrukcję I

Instrukcja warunkowa obejmuje swoim zasięgiem jedną, następną instrukcję.

Jeżeli instrukcja warunkowa ma obejmować więcej niż jedną instrukcję, należy

ująć je w {}, tworząc instrukcję złożoną.

(5)

Instrukcja alternatywy

Instrukcja alternatywy

Copyright © Roman Simiński Strona : 5

if( W ) I1 else I2

if( W ) I1 else I2

jeżeli ( warunek W jest prawdziwy )

wykonaj instrukcję I1

w przeciwnym przypadku

wykonaj instrukcję I2

I1 W tak nie I2

Instrukcja alternatywy obejmuje swoim zasięgiem jedną, następną instrukcję,

zarówno w części if jak i else.

Jeżeli instrukcja alternatywy ma obejmować więcej niż jedną instrukcję, należy

ująć je w {}, tworząc instrukcję złożoną.

(6)

Instrukcja warunkowa i alternatywy — przykład

Instrukcja warunkowa i alternatywy — przykład

...

if( dystans != 0 )

cout << "Spalanie " << ( paliwo * 100 ) / dystans << " l na 100 km"; ...

...

if( dystans != 0 )

cout << "Spalanie " << ( paliwo * 100 ) / dystans << " l na 100 km"; else

cout << "Nie dokonam obliczen dla zerowego dystansu."; ...

Instrukcja warunkowa

Instrukcja alternatywy

Średnik

(7)

Instrukcje warunkowe — kiedy wyrażenie jest fałszywe a kiedy prawdziwe?

Instrukcje warunkowe — kiedy wyrażenie jest fałszywe a kiedy prawdziwe?

Copyright © Roman Simiński Strona : 7

W C89 nie ma predefiniowanego typu Boolean — używa się liczb całkowitych.

W języku C++ i C99 zdefiniowany jest typ bool i wartości false i true.

W C99 zdefiniowany jest typ _Bool i wartości false i true (stdbool.h).

Każde wyrażenie dające w wyniku wartość całkowitą różną od zera jest

traktowane jako prawdziwe, a dające w wyniku wartość zerową jest traktowane

jako fałszywe.

W wyrażeniach relacyjnych i porównania prawda to

1

, fałsz to

0

całkowite (int).

Operator

Znaczenie

==

równe

!=

różne

!

logiczna negacja

&&

logiczny and

||

logiczny or

(8)

Instrukcja alternatywy a instrukcje warunkowe

Instrukcja alternatywy a instrukcje warunkowe

float a, b, c, delta; . . .

delta = b * b – 4 * a * c;

if( delta < 0 )

cout << "Brak pierwiastków rzeczywistych" << endl; if( delta == 0 )

cout << "Jeden pierwiastek rzeczywisty" << endl; if( delta > 0 )

cout << "Dwa pierwiastki rzeczywiste" << endl; if( delta < 0 )

cout << "Brak pierwiastków rzeczywistych" << endl; else

if( delta == 0 )

cout << "Jeden pierwiastek rzeczywisty" << endl; else

cout << "Dwa pierwiastki rzeczywiste" << endl;

Złożenie instrukcji alternatywy:

(9)

A co zrobić, gdy w C89 potrzeba TRUE lub FALSE?

A co zrobić, gdy w C89 potrzeba TRUE lub FALSE?

Copyright © Roman Simiński Strona : 9

Rozwiązanie typowe:

#define TRUE 1 #define FALSE 0

Rozwiązanie dziwne lecz poprawne i ciekawe:

#define TRUE (0==0) #define FALSE (!TRUE)

Zamiast zmiennych boolowskich stosujemy zwykle zmienne typu int

int koniec_linii = FALSE; ...

if( koniec_linii )

puts( "Wykryto koniec linii!" )

Zwykle nie piszemy tak („mało maślane”):

if( koniec_linii == TRUE )

(10)

. . .

double kwota;

cout << "Podaj przychod: "; cin >> kwota; if( kwota >= 0 ) if( kwota > 0 ) cout << "Dochod"; else cout << "Strata"; cout << "Koniec” . . .

Uwaga na zagnieżdżone instrukcje warunkowe!

Uwaga na zagnieżdżone instrukcje warunkowe!

Podaj przychod: -100

(11)

Uwaga na zagnieżdżone instrukcje warunkowe!

Uwaga na zagnieżdżone instrukcje warunkowe!

Copyright © Roman Simiński Strona : 11

. . .

double kwota;

cout << "Podaj przychod: "; cin >> kwota; if( kwota >= 0 ) if( kwota > 0 ) cout << "Dochod"; else cout << "Strata"; cout << "Koniec” . . .

Podaj przychod: -100 Koniec

(12)

Uwaga na zagnieżdżone instrukcje warunkowe!

Uwaga na zagnieżdżone instrukcje warunkowe!

„Ify” z pułapką, wydaje się, że jest tak

jak sugerują wcięcia:

if( kwota >= 0 ) if( kwota > 0 ) cout << "Dochod"; else cout << "Strata";

A jest tak:

if( kwota >= 0 ) if( kwota > 0 ) cout << "Dochod"; else cout << "Strata";

Trzeba użyć instrukcji złożonej lub „sparować” if z else:

if( kwota >= 0 ) { if( kwota > 0 ) cout << "Dochod"; } else cout << "Strata"; if( kwota >= 0 ) if( kwota > 0 ) cout << "Dochod"; else cout << "Zero!"; else cout << "Strata";

(13)

Instrukcja iteracyjna do-while

Instrukcja iteracyjna do-while

Copyright © Roman Simiński Strona : 13

do instrukcja while( wyrazenie ); do { ciag instrukcji } while( wyrazenie );

Gdy iterowana jest jedna instrukcja:

Gdy iterowany jest ciąg instrukcji:

wyrażenie instrukcja

prawda fałsz

Instrukcja stanowiąca ciało iteracji do-while wykona się przynajmniej raz.

Wyrażenie występujące w nawiasach określa warunek kontynuacji, zatem

iteracja kończy się gdy wartość wyrażenia będzie zerowa.

(14)

Zastosowanie instrukcji do-while, wróćmy do średniego spalania

Zastosowanie instrukcji do-while, wróćmy do średniego spalania

#include <cstdlib> #include <iostream> using namespace std; int main()

{

float dystans, paliwo;

cout << endl << "Obliczam ile Twoj pojazd spala paliwa na 100 km" << endl; cout << "Dystans: " << flush;

cin >> dystans;

cout << "Paliwo: " << flush; cin >> paliwo;

if( dystans != 0 )

cout << "Spalanie " << (paliwo*100) / dystans << " l na 100 km" << endl; else

cout << "Nie dokonam obliczen dla takiego dystansu." << endl;

cout << "Nacisnij Enter by zakonczyc program..." << endl; cin.ignore();

cin.get();

return EXIT_SUCCESS; }

C ++

W tym miejscu użytkownik może wprowadzić nieprawidłowe dane. Nie pozwólmy mu na to!

(15)

Zastosowanie instrukcji do-while — weryfikacja danych

Zastosowanie instrukcji do-while — weryfikacja danych

Copyright © Roman Simiński Strona : 15

do {

cout << "Dystans: " << flush; cin >> dystans;

}

while( dystans <= 0 ); do

{

cout << "Paliwo: " << flush; cin >> paliwo;

}

while( paliwo <= 0 );

Wykonuj wczytywanie dystansu, dopóki jest

on nieprawidłowy.

Wykonuj wczytywanie il. paliwa, dopóki jest

ona nieprawidłowa.

(16)

Zastosowanie instrukcji do-while — lepsza weryfikacja danych

Zastosowanie instrukcji do-while — lepsza weryfikacja danych

do {

cout << "Dystans: " << flush; cin >> dystans;

if( dystans <= 0 )

cout << "Dystans musi byc wiekszy od zera!" << endl; }

while( dystans <= 0 ); do

{

cout << "Paliwo: " << flush; cin >> paliwo;

if( paliwo <= 0 )

cout << "Ilosc paliwa musi byc wieksza od zera!" << endl; }

while( paliwo <= 0 );

Wykonuj wczytywanie dystansu, dopóki jest

on nieprawidłowy, poinformuj o tym

użytkownika.

Wykonuj wczytywanie il. paliwa, dopóki jest

ona nieprawidłowa, poinformuj o tym

(17)

Zastosowanie instrukcji — gra w „za dużo, za mało”

Zastosowanie instrukcji — gra w „za dużo, za mało”

Copyright © Roman Simiński Strona : 17

Program losuje liczbę z przedziału od 1 do 100. Zadaniem użytkownika jest

odgadnięcie wylosowanej liczby.

Scenariusz działania programu:

Problem

(18)

Zastosowanie instrukcji — gra w „za dużo, za mało”

Zastosowanie instrukcji — gra w „za dużo, za mało”

Wczytana < Wylosowana

Wczytana = Wylosowana true

true true false false false Wczytana > Wylosowana Stop Start

Wylosuj liczbę i zapamiętaj

Wczytaj liczbę

Wyświetl, że za dużo

Wyświetl, że za mało Wyświetl, że za to ta liczba

(19)

Pierwsza przymiarka — deklaracja zmiennych

Pierwsza przymiarka — deklaracja zmiennych

Copyright © Roman Simiński Strona : 19

#include <cstdlib> int main()

{

int wczytana, wylosowana; return EXIT_SUCCESS;

}

W zmiennej wylosowana zapamiętamy liczbę wylosowaną przez komputer. W zmiennej wczytana

(20)

Pierwsza przymiarka — komunikat wstępny

Pierwsza przymiarka — komunikat wstępny

#include <cstdlib> #include <iostream> using namespace std; int main()

{

int wczytana, wylosowana;

cout << endl << "Witaj w grze w \"Za duzo, za malo\"";

cout << endl << "Odgadnij wylosowana liczbe (1 .. 100)" << endl; return EXIT_SUCCESS;

}

Będziemy korzystać z strumieni wejścia-wyjścia

(21)

Pierwsza przymiarka — losowanie liczby

Pierwsza przymiarka — losowanie liczby

Copyright © Roman Simiński Strona : 21

#include <cstdlib> #include <iostream> using namespace std; int main()

{

int wczytana, wylosowana;

cout << endl << "Witaj w grze w \"Za duzo, za malo\"";

cout << endl << "Odgadnij wylosowana liczbe (1 .. 100)" << endl; srand( 1000 );

wylosowana = rand() % 100 + 1; return EXIT_SUCCESS;

}

Losowanie zalążka generatora liczb

pseudolosowych. Stały zalążek nie jest dobry... :-\

Losowanie liczby z wykorzystaniem generatora licz pseudolosowych.

(22)

Pierwsza przymiarka — komunikat wstępny i losowanie liczby

Pierwsza przymiarka — komunikat wstępny i losowanie liczby

srand( 1000 );

wylosowana = rand() % 100 + 1;

Inicjalizacja generatora liczb pseudolosowych (stały zalążek o wartości 1000):

Tak zainicjowany generator będzie działał powtarzalnie. Należy uzmiennić zalążek,

przykładowo uzależniając go od bieżącego czasu:

srand( ( unsigned )time( NULL ) );

Funkcja rand() generuje liczby pseudolosowe z przedziału

0

..RAND_MAX. My

potrzebujemy liczby od

1

..

100

.

Ograniczamy zakres używając operatora modulo (reszta z dzielenia) oznaczonego

(23)

Pierwsza przymiarka — lepszy dobór zalążka generatora pseudolosowego

Pierwsza przymiarka — lepszy dobór zalążka generatora pseudolosowego

Copyright © Roman Simiński Strona : 23

#include <cstdlib> #include <ctime> #include <iostream> using namespace std; int main() {

int wczytana, wylosowana;

cout << endl << "Witaj w grze w \"Za duzo, za malo\"";

cout << endl << "Odgadnij wylosowana liczbe (1 .. 100)" << endl; srand( ( unsigned )time( NULL ) );

wylosowana = rand() % 100 + 1; return EXIT_SUCCESS;

}

Losowanie zalążka generatora liczb pseudolosowych zależnego ob aktualnej wartości timera

(24)

Główna iteracja programu

Główna iteracja programu

int main() { . . . wylosowana = rand() % 100 + 1; do { cout << '>' << flush; cin >> wczytana;

if( wczytana > wylosowana ) cout << "Za duzo" << endl; else

if( wczytana < wylosowana ) cout << "Za malo" << endl; else

cout << "Brawo, to ta liczba!" << endl << "Nacisnij Enter by zakonczyc"; }

while( wylosowana != wczytana ); cin.ignore();

cin.get();

return EXIT_SUCCESS; }

(25)

Główna iteracja programu

Główna iteracja programu

Copyright © Roman Simiński Strona : 25

int main() { . . . wylosowana = rand() % 100 + 1; do { cout << '>' << flush; cin >> wczytana;

if( wczytana > wylosowana ) cout << "Za duzo" << endl; else

if( wczytana < wylosowana ) cout << "Za malo" << endl; else

cout << "Brawo, to ta liczba!" << endl << "Nacisnij Enter by zakonczyc"; }

while( wylosowana != wczytana ); cin.ignore();

cin.get();

return EXIT_SUCCESS; }

(26)

Główna iteracja programu

Główna iteracja programu

int main() { . . . wylosowana = rand() % 100 + 1; do { cout << '>' << flush; cin >> wczytana;

if( wczytana > wylosowana ) cout << "Za duzo" << endl; else

if( wczytana < wylosowana ) cout << "Za malo" << endl; else

cout << "Brawo, to ta liczba!" << endl << "Nacisnij Enter by zakonczyc";

}

while( wylosowana != wczytana ); cin.ignore();

cin.get();

return EXIT_SUCCESS; }

Porównaj wczytaną liczbę z wylosowaną i wyprowadź odpowiedni komunikat

(27)

Instrukcja przełączająca switch

Instrukcja przełączająca switch

Copyright © Roman Simiński Strona : 27

switch( wyra enie )ż {

case wyra enie_stałe : instrukcjeż case wyra enie_stałe : instrukcjeż . . .

default : instrukcje }

Instrukcja switch:

sprawdza czy wartość wyrażenia jest równa jednemu z kilku przypadków

określonych wyrażeniem stałym,

wykonuje skok do instrukcji zapisanych za owym wyrażeniem stałym.

Jeżeli nie znaleziono przypadku pasującego do wartości wyrażenia, wykonywane

są instrukcje zapisane po frazie default.

Instrukcja służy do podejmowania decyzji wielowariantowych.

Wszystkie wyrażenia są typu całkowitego.

(28)

Przykład — wykorzystanie instrukcji warunkowych

Przykład — wykorzystanie instrukcji warunkowych

int main() {

int nadwozie;

cout << "\nJaki typ nadwozia lubisz?"; cout << "\n1. Sedan\n2. SUV\n3. Coupe"; cout << "\nWpisz 1, 2 lub 3: ";

cin >> nadwozie;

if( nadwozie == 1 )

cout << "\nChyba lubisz eleganckie limuzyny!"; if( nadwozie == 2 )

cout << "\nWidze, ze ciagnie Cie w teren!"; if( nadwozie == 3 )

cout << "\nTy to pewnie lubisz szybka jazde!"; cout << "\n\nEnter=Koniec"; cin.ignore(); cin.get(); return EXIT_SUCCESS; }

(29)

Przykład — wykorzystanie instrukcji warunkowych, analiza

Przykład — wykorzystanie instrukcji warunkowych, analiza

Copyright © Roman Simiński Strona : 29

int main() {

int nadwozie;

cout << "\nJaki typ nadwozia lubisz?"; cout << "\n1. Sedan\n2. SUV\n3. Coupe"; cout << "\nWpisz 1, 2 lub 3: ";

cin >> nadwozie;

if( nadwozie == 1 )

cout << "\nChyba lubisz eleganckie limuzyny!"; if( nadwozie == 2 )

cout << "\nWidze, ze ciagnie Cie w teren!"; if( nadwozie == 3 )

cout << "\nTy to pewnie lubisz szybka jazde!"; cout << "\n\nEnter=Koniec"; cin.ignore(); cin.get(); return EXIT_SUCCESS; }

(30)

Przykład — wykorzystanie instrukcji warunkowych, analiza

Przykład — wykorzystanie instrukcji warunkowych, analiza

int main() {

int nadwozie;

cout << "\nJaki typ nadwozia lubisz?"; cout << "\n1. Sedan\n2. SUV\n3. Coupe"; cout << "\nWpisz 1, 2 lub 3: ";

cin >> nadwozie;

if( nadwozie == 1 )

cout << "\nChyba lubisz eleganckie limuzyny!"; if( nadwozie == 2 )

cout << "\nWidze, ze ciagnie Cie w teren!"; if( nadwozie == 3 )

cout << "\nTy to pewnie lubisz szybka jazde!"; cout << "\n\nEnter=Koniec"; cin.ignore(); cin.get(); return EXIT_SUCCESS; }

(31)

Przykład — wykorzystanie instrukcji przełączającej

Przykład — wykorzystanie instrukcji przełączającej

Copyright © Roman Simiński Strona : 31

int main() {

int nadwozie;

cout << "\nJaki typ nadwozia lubisz?"; cout << "\n1. Sedan\n2. SUV\n3. Coupe"; cout << "\nWpisz 1, 2 lub 3: ";

cin >> nadwozie;

switch( nadwozie ) {

case 1 : cout << "\nChyba lubisz eleganckie limuzyny!"; case 2 : cout << "\nWidze, ze ciagnie Cie w teren!"; case 3 : cout << "\nTy to pewnie lubisz szybka jazde!"; } cout << "\n\nEnter=Koniec"; cin.ignore(); cin.get(); return EXIT_SUCCESS; }

Instrukcja switch: jedna zmienna i porównanie z wartościami znanymi na etapie kompilacji

(32)

Przykład — przetestujmy w działaniu...

Przykład — przetestujmy w działaniu...

int main() {

int nadwozie;

cout << "\nJaki typ nadwozia lubisz?"; cout << "\n1. Sedan\n2. SUV\n3. Coupe"; cout << "\nWpisz 1, 2 lub 3: ";

cin >> nadwozie;

switch( nadwozie ) {

case 1 : cout << "\nChyba lubisz eleganckie limuzyny!"; case 2 : cout << "\nWidze, ze ciagnie Cie w teren!"; case 3 : cout << "\nTy to pewnie lubisz szybka jazde!"; } cout << "\n\nEnter=Koniec"; cin.ignore(); cin.get(); return EXIT_SUCCESS; } Dlaczego?

(33)

Instrukcja przełączająca switch, zasada działania

Instrukcja przełączająca switch, zasada działania

Copyright © Roman Simiński Strona : 33

. . .

switch( nadwozie ) {

case 1 : cout << "\nChyba lubisz eleganckie limuzyny!"; case 2 : cout << "\nWidze, ze ciagnie Cie w teren!"; case 3 : cout << "\nTy to pewnie lubisz szybka jazde!"; }

. . .

cout << "\nChyba lubisz eleganckie limuzyny!";

cout << "\nWidze, ze ciagnie Cie w teren!"

cout << "\nTy to pewnie lubisz szybka jazde!"

nadwozie == ?

1

2

(34)

Instrukcja przełączająca switch, zasada działania

Instrukcja przełączająca switch, zasada działania

. . .

switch( nadwozie ) {

case 1 : cout << "\nChyba lubisz eleganckie limuzyny!"; case 2 : cout << "\nWidze, ze ciagnie Cie w teren!"; case 3 : cout << "\nTy to pewnie lubisz szybka jazde!"; }

. . .

cout << "\nChyba lubisz eleganckie limuzyny!";

cout << "\nWidze, ze ciagnie Cie w teren!"

cout << "\nTy to pewnie lubisz szybka jazde!" nadwozie == 1

nadwozie: 1

1

2

(35)

Instrukcja przełączająca switch, zasada działania

Instrukcja przełączająca switch, zasada działania

Copyright © Roman Simiński Strona : 35

. . .

switch( nadwozie ) {

case 1 : cout << "\nChyba lubisz eleganckie limuzyny!"; case 2 : cout << "\nWidze, ze ciagnie Cie w teren!"; case 3 : cout << "\nTy to pewnie lubisz szybka jazde!"; }

. . .

cout << "\nChyba lubisz eleganckie limuzyny!";

cout << "\nWidze, ze ciagnie Cie w teren!"

cout << "\nTy to pewnie lubisz szybka jazde!" nadwozie == 2

nadwozie: 2

1

2

(36)

Instrukcja przełączająca switch vs. instrukcja case z Pascala

Instrukcja przełączająca switch vs. instrukcja case z Pascala

Instrukcja przełączająca switch przełącza przebieg wykonania programu, do

instrukcji, której etykieta (umieszczona za słowem case) ma wartość równą

wyrażeniu w nawiasach instrukcji switch.

Instrukcja wyboru case (Pascal) wykonuje instrukcję przypisaną do etykiety

o wartości równej selektorowi zapisanemu pomiędzy słowami case a of.

Działanie instrukcji przełączającej switch jest całkowicie odmienne od działania

instrukcji wyboru case.

Można jednak w językach C/C++ wykorzystać instrukcję przełączającą switch do

realizacji instrukcji analogicznej do instrukcji wyboru case.

Do tego zadania wykorzystuje się instrukcje break — powoduje wyjście

(zakończenie wykonania) z najbliższej instrukcji iteracyjnej lub instrukcji

(37)

Instrukcja przełączająca switch, zasada działania

Instrukcja przełączająca switch, zasada działania

Copyright © Roman Simiński Strona : 37

switch( nadwozie ) {

case 1 : cout << "\nChyba lubisz eleganckie limuzyny!"; break;

case 2 : cout << "\nWidze, ze ciagnie Cie w teren!"; break;

case 3 : cout << "\nTy to pewnie lubisz szybka jazde!"; break;

}

cout << "\nChyba lubisz eleganckie limuzyny!";

cout << "\nWidze, ze ciagnie Cie w teren!"

cout << "\nTy to pewnie lubisz szybka jazde!" nadwozie == 2 nadwozie: 2

1

2

3

break; break; break;

(38)

Instrukcja przełączająca switch + iteracja do-while = proste menu

Instrukcja przełączająca switch + iteracja do-while = proste menu

Połączenie instrukcji iteracyjnej do-while oraz instrukcji przełączającej switch

pozwala na zorganizowanie prostego, ale użytecznego, menu konsolowego.

(39)

Instrukcja przełączająca switch + iteracja do-while = proste menu

Instrukcja przełączająca switch + iteracja do-while = proste menu

Copyright © Roman Simiński Strona : 39

. . .

char klawisz; do

{

cout << "\nFormatowanie dysku, wybierz opcje:\n1. Format";

cout << "\n2. Szybki format\n3. Diagnostyka\n4. Koniec\n>" << flush; cin >> klawisz;

switch( klawisz ) {

case '1' : cout << "\nWybrales formatowanie\n"; break;

case '2' : cout << "\nWybrales szybki format\n"; break;

case '3' : cout << "\nWybrales diagnostyke\n"; break;

} }

while( klawisz != '4' );

cout << "\n\nWybrales Koniec, nacisnij Enter by potwierdzic..."; cin.ignore();

cin.get(); . . .

(40)

Typ zmiennej sterującej a typ wartości przypadku

Typ zmiennej sterującej a typ wartości przypadku

char klawisz; . . .

cin >> klawisz; switch( klawisz ) {

case '1' : cout << "\nWybrales formatowanie\n"; break;

case '2' : cout << "\nWybrales szybki format\n"; break;

case '3' : cout << "\nWybrales diagnostyke\n"; break; } int nadwozie; . . . cin >> nadwozie; switch( nadwozie ) {

case 1 : cout << "\nChyba lubisz eleganckie limuzyny!"; break;

case 2 : cout << "\nWidze, ze ciagnie Cie w teren!"; break;

case 3 : cout << "\nTy to pewnie lubisz szybka jazde!"; break;

(41)

Instrukcja przełączająca switch — przykład wykorzystania

Instrukcja przełączająca switch — przykład wykorzystania

Copyright © Roman Simiński Strona : 41

switch( znak ) { case ’0’ : case ’1’ : case ’2’ : case ’3’ : case ’4’ : case ’5’ : case ’7’ : case ’8’ :

case ’9’ : cout << ”Cyfra” << flush; break;

case ’,’ : case ’.’ :

case ’;’ : cout << ”Znak interpunkcyjny” << flush; break;

default : if( znak >= ’A’ && znak <= ’Z’ ) cout << ”Du a litera” << flush;ż else

if( znak >= ’a’ && znak <= ’z’ ) cout << ”Mała litera” << flush; else

cout << ”Inny znak” << flush; break;

}

char znak;

cout << "Podaj znak: " << flush; cin >> znak;

(42)

Instrukcja przełączająca switch — uwagi dodatkowe

Instrukcja przełączająca switch — uwagi dodatkowe

switch( error_code ) {

case -1 : cout << ”Blad!”; break;

case 0 : cout << ”OK!”; break;

}

Instrukcje nie muszą stanowić bloku:

switch( error_code ) { case -1 : { cout << ”Blad!”; break; } case 0 : { cout << ”OK!”; break; } }

Uwaga ― przypadek default nie musi być ostatnim na liście. Warto dla tego

przypadku również stosować instrukcje break.

(43)

Instrukcja iteracyjna while

Instrukcja iteracyjna while

Copyright © Roman Simiński Strona : 43

while( wyra enie )ż instrukcja

while( wyra enie )ż {

ci g instrukcjią }

Gdy iterowana jest jedna instrukcja:

Gdy iterowany jest ciąg instrukcji:

wyrażenie

instrukcja

prawda fałsz

Instrukcja stanowiąca ciało iteracji while może nie wykonać się wcale.

Wyrażenie występujące w nawiasach określa warunek kontynuacji, zatem

iteracja kończy się gdy wartość wyrażenia będzie zerowa.

(44)

Instrukcja iteracyjna while — sylwestrowe odliczanie ;-)

Instrukcja iteracyjna while — sylwestrowe odliczanie ;-)

int licznik = 10;

while( licznik > 0 ) {

cout << endl << licznik << "..."; licznik--;

}

cout << endl << "Nowy Rok!!!" << endl;

licznik-–

odpowiada

licznik = licznik - 1

Porównanie z zerem czasem zapisuje się w skróconej wersji:

int licznik = 10; while( licznik > 0 ) { . . . } int licznik = 10; while( licznik ) { . . . }

Uwaga — wersja uproszczona może być niebezpieczna

int licznik = 11; while( licznik ) { . . . licznik = licznik - 2; }

(45)

Od instrukcji while do instrukcji for

Od instrukcji while do instrukcji for

Copyright © Roman Simiński Strona : 45

int licznik; while( ) { ; ; } licznik = 10; licznik > 0

licznik--cout << endl << licznik << "..."

Inicjalizacja Warunek

Ciało iteracji

Modyfikacja

int licznik;

for( ; ; ) licznik = 10 licznik > 0 licznik--cout << endl << licznik << "..."

Inicjalizacja Warunek Modyfikacja

Ciało iteracji

Iteracja for w C/C++ nie ma nic wspólnego — poza nazwą — z instrukcją

iteracyjną for z języka Pascal.

(46)

Instrukcja iteracyjna for — ogólny schemat

Instrukcja iteracyjna for — ogólny schemat

inicjalizacja; while( warunek ) { ciało_iteracji modyfikacja }

for( inicjalizacja; warunek; modyfikacja ) ciało_iteracji

Uwaga — poszczególne sekcje iteracji for mogą być dowolnymi legalnymi, być

może złożonymi, wyrażeniami w języku C. Mogą to być wyrażenia przecinkowe.

W części inicjalizacyjnej w C++ wolno deklarować zmienne, w C nie wolno.

for( int licznik = 10; licznik > 0; cout << endl << licznik-- << "..." ) ;

int licznik;

for( licznik = 10; licznik > 0; printf( ”\n%d...”, licznik-- ) ) ;

C ++

(47)

Instrukcje break i continue — wspomaganie iteracji i instrukcji switch

Instrukcje break i continue — wspomaganie iteracji i instrukcji switch

Copyright © Roman Simiński Strona : 47

switch( klawisz ) { case '1' : full_disk_format(); break; case '2' : quick_disk_format(); break; case '3' : check_disk(); break; }

Instrukcja break pozwala na natychmiastowy „wyskok” z najbardziej

zagnieżdżonej, dowolnej instrukcji iteracyjnej lub instrukcji switch.

Instrukcja continue pozwala na przerwanie bieżącego przebiegu dowolnej

iteracji i przejście do wykonania następnego jej przebiegu od jego początku.

Dla iteracji while i do-while instrukcja continue powoduje przeniesienie

sterowania do fazy testowania warunku kontynuacji. W przypadku iteracji for

sterowanie przenoszone jest do wyrażenia modyfikującego a potem do testowania

warunku.

klawisz = getchar(); while( klawisz != '\n' ) { if( klawisz == 'k' ) break; else . . . }

(48)

Instrukcje break i continue — wspomaganie iteracji i instrukcji switch

Instrukcje break i continue — wspomaganie iteracji i instrukcji switch

. . .

for( ; ; ) // Iteracja niesko czona czyli p tla ń ę

{

cout << "\nFormatowanie dysku, wybierz opcje:\n1. Format";

cout << "\n2. Szybki format\n3. Diagnostyka\n4. Koniec\n>" << flush; cin >> klawisz;

if( klawisz == ’4’ ) // Czy wybrano klawisz ko ca?ń break; // Tak, wychodzimy z iteracji

if( !( klawisz >= ’0’&& klawisz <= ’9’) ) // Czy klawisz jest cyfr ?ą

continue; // Klawisz nie jest cyfr , nie ma co dalej sprawdzaćą

switch( klawisz ) { case '1' : full_disk_format(); break; case '2' : quick_disk_format(); break; case '3' : check_disk(); break; }// switch } . . .

(49)

Iteracyjne przetwarzanie ciągów liczbowych

Iteracyjne przetwarzanie ciągów liczbowych

Copyright © Roman Simiński Strona : 49

Problem 1

Napisać program wyznaczający średni, dobowy kurs waluty EURO na podstawie

kursów notowanych na początku każdej godziny.

Pod koniec doby analityk wprowadza zanotowane liczby — program ma

wyznaczyć na tej podstawie średnie kurs dobowy.

(50)

Wyznaczanie sumy ciągu liczb o znanej liczbie elementów

Wyznaczanie sumy ciągu liczb o znanej liczbie elementów

const int MAKS_LB_KURSOW = 24; int main()

{

float kurs, sumaryczny; int lb_kursow;

cout << "\nWyznaczam dobowy sredn kurs waluty EURO."; cout << "\nWprowadz 24 dodatnie liczby -- kursy EURO";

cout << "\nzanotowane na poczatku kazdej godziny.\n" << flush;

for( sumaryczny = 0, lb_kursow = 1; lb_kursow <= MAKS_LB_KURSOW; lb_kursow++ ) {

cout << '>' << flush; cin >> kurs;

sumaryczny = sumaryczny + kurs;

}//for

cout << "\nKurs sredni: " << sumaryczny / MAX_LB_KURSOW; cout << endl << "Nacisnij Enter by zakonczyc...";

cin.ignore(); cin.get(); return EXIT_SUCCESS; } #include <cstdlib> #include <iostream> using namespace std;

(51)

Iteracyjne przetwarzanie ciągów liczbowych

Iteracyjne przetwarzanie ciągów liczbowych

Copyright © Roman Simiński Strona : 51

Problem 2

Uzupełnić poprzedni program o wyznaczanie kursu minimalnego i

maksy-malnego.

Wyznaczanie minimum i maksimum

Jeżeli wczytany kurs jest mniejszy od minimalnego, to niech on się stanie

minimalnym. Jeżeli wczytany kurs jest większy od maksymalnego, to niech on

się stanie maksymalnym. Jak ustawić wartość startową minimum i maksimum?

3.50 3.52 3.48 • • • 3.47

1 2 3 24

3.50 3.52 3.48 • • • 3.47

1 2 3 24

Ten element potraktujemy osobno — on będzie startową wartością minimalną, maksymalną i sumaryczną. Te elementy obsłużymy iteracyjnie, począwszy od drugiego, porównując z minimum, maksimum i doliczając do sumy.

(52)

Wyznaczanie sumy, min. i maks. ciągu liczb o znanej liczbie elementów

Wyznaczanie sumy, min. i maks. ciągu liczb o znanej liczbie elementów

#include <cstdlib> #include <iostream> using namespace std;

const int MAKS_LB_KURSOW = 24; int main()

{

float kurs, sumaryczny, maksymalny, minimalny; int lb_kursow;

cout << "\nWyznaczam dobowy, sredni, minimalny i maksymalny kurs"; cout << "\nwaluty EURO. Wprowadz 24 dodatnie liczby -- kursy EURO"; cout << "\nzanotowane na poczatku kazdej godziny.\n>" << flush;

// Wczytanie pierwszego kursu

cin >> kurs;

// Pierwszy i jedyny na razie kurs to kurs minimalny, maksymalny i sumaryczny

maksymalny = minimalny = sumaryczny = kurs;

(53)

Wyznaczanie sumy, min. i maks. ciągu liczb o znanej liczbie elementów

Wyznaczanie sumy, min. i maks. ciągu liczb o znanej liczbie elementów

Copyright © Roman Simiński Strona : 53

for( lb_kursow = 2; lb_kursow <= MAKS_LB_KURSOW; lb_kursow++ ) {

cout << '>' << flush; cin >> kurs;

sumaryczny = sumaryczny + kurs;

if( kurs < minimalny ) minimalny = kurs; if( kurs > maksymalny ) maksymalny = kurs;

}//for

cout << "\nKurs najwyzszy: " << maksymalny; cout << "\nKurs najnizszy: " << minimalny;

cout << "\nKurs sredni: " << sumaryczny / MAKS_LB_KURSOW; cout << endl << "Nacisnij Enter by zakonczyc...";

cin.ignore(); cin.get();

return EXIT_SUCCESS;

(54)

Iteracyjne przetwarzanie ciągów liczbowych

Iteracyjne przetwarzanie ciągów liczbowych

Problem 3

Napisać program przyśpieszający ocenę wyników sprintera. Sprinter

wielokrotnie pokonuje jednakowy dystans, notując kolejno osiągane czasy.

Po treningu zawodnik siada do komputera, wpisuje kolejne czasy i oczekuje, że

program wyznaczy mu czas najlepszy, najgorszy oraz średni.

Liczba wprowadzanych czasów jest bliżej nieznana. Może ich być np. kilka,

kilkanaście, kilkadziesiąt.

(55)

Iteracyjne przetwarzanie ciągów liczbowych

Iteracyjne przetwarzanie ciągów liczbowych

Copyright © Roman Simiński Strona : 55

Scenariusz działania programu:

Program wyświetla informację o jego przeznaczeniu.

Program wczytuje kolejno czasy, przy czym ich liczba nie jest z góry ograniczona

ani wcześniej znana.

Po zakończeniu wprowadzania czasów, program wyznacza czas najlepszy,

najgorszy i średni.

Program kończy swoje działanie po naciśnięciu przez użytkownika klawisza

Enter.

(56)

Suma, średnia, minimum, maksimum dla nieograniczonego ciągu liczb

Suma, średnia, minimum, maksimum dla nieograniczonego ciągu liczb

#include <cstdlib> #include <iostream> using namespace std; int main()

{

float czas, sumaryczny, najlepszy, najgorszy; int licznik;

cout << "\nWprowadz kolejne czasy, a ja wyznacze nalepszy, najgorszy"; cout << "\noraz sredni. Podaj zerowy czas aby zakonczyc wprowadzanie."; cout << "\nNie rob jaj, nie wpisuj ujemnych czasow.\n>" << flush;

cin >> czas;

(57)

Suma, średnia, minimum, maksimum dla nieograniczonego ciągu liczb

Suma, średnia, minimum, maksimum dla nieograniczonego ciągu liczb

Copyright © Roman Simiński Strona : 57

if( czas == 0 )

cout << "Nic do roboty"; else

{

sumaryczny = najgorszy = najlepszy = czas; licznik = 1; cout << ">" << flush; cin >> czas; while( czas != 0 ) {

sumaryczny = sumaryczny + czas; // lepiej: sumaryczny += czas;

if( czas > najgorszy ) najgorszy = czas; if( czas < najlepszy ) najlepszy = czas;

licznik = licznik + 1; // lepiej: licznik++;

cout << ">" << flush; cin >> czas;

}//while

cout << "\nCzas najlepszy: " << najlepszy; cout << "\nCzas najgorszy: " << najgorszy;

cout << "\nCzas sredni: " << sumaryczny / licznik;

(58)

Suma, średnia, minimum, maksimum dla nieograniczonego ciągu liczb

Suma, średnia, minimum, maksimum dla nieograniczonego ciągu liczb

cout << endl << "Nacisnij Enter by zakonczyc..."; cin.ignore(); cin.get(); return EXIT_SUCCESS; } 2/3

(59)

To co poprzednio ale inaczej — wersja mocno niestrukturalna!

To co poprzednio ale inaczej — wersja mocno niestrukturalna!

Copyright © Roman Simiński Strona : 59

#include <cstdlib> #include <iostream> using namespace std; int main()

{

float czas, sumaryczny, najlepszy, najgorszy; int licznik;

cout << "\nWprowadz kolejne czasy, a ja wyznacze nalepszy, najgorszy"; cout << "\noraz sredni. Podaj zerowy czas aby zakonczyc wprowadzanie."; cout << "\nNie rob jaj, nie wpisuj ujemnych czasow.\n";

(60)

Iteracja

Iteracja

for

for

bez warunku staje się pętlą,

bez warunku staje się pętlą,

break

break

pozwoli na jej zakończenie

pozwoli na jej zakończenie

for( sumaryczny = licznik = 0; ; licznik++ )

{

cout << '>' << flush; cin >> czas;

// Znacznik konca danych, wyskakujemy

if( czas == 0 )

break;

// Wczytano pierwszy czas -- to teraz minimum i maksimum

if( licznik == 0 )

najgorszy = najlepszy = czas; sumaryczny = sumaryczny + czas; if( czas > najgorszy )

najgorszy = czas; if( czas < najlepszy ) najlepszy = czas; }//for

2/3

(61)

Być może nie wprowadzono żadnych danych

Być może nie wprowadzono żadnych danych

Copyright © Roman Simiński Strona : 61

if( licznik > 0 ) {

cout << endl << "Czas najlepszy: " << najlepszy; cout << endl << "Czas najgorszy: " << najgorszy;

cout << endl << "Czas sredni: " << sumaryczny /licznik; }

else

cout << "Nic do roboty";

cout << endl << "Nacisnij Enter by zakonczyc..."; cin.ignore();

cin.get();

return EXIT_SUCCESS; }

Cytaty

Powiązane dokumenty

Rezultatem funkcji jest wartość różna od zera, jeżeli strumień jest w pozycji końcowej, zero w przeciwnym wypadku.. Strumień jest w pozycji końcowej, jeżeli w wyniku

W przypadku wystąpienia końca pliku lub błędu, rezultatem funkcji jest liczba, potencjalnie zerowa, bezbłędnie zapisanych bloków.. size_t fwrite( void * ptr, size_t size, size_t

Dane wejściowe  informacje dostarczone do programu przez użytkownika, w celu umożliwienia wykonania algorytmu. Dane wyjściowe  są generowane przez program i

Można powiedzieć, że jest to dobrze wyszkolony pies - odpowiada tylko na określony zestaw znanych poleceń (ang. set of known commands ). Czasami, jak pies, po prostu się zamyka i

dyrektywa preprocesora - jest to oddzielna część kompilatora, której zadaniem jest wstępne odczytanie tekstu programu i wprowadzenie w nim pewnych modyfikacji.. Prefiks

Za każdym razem, gdy kompilator napotka komentarz w twoim programie, komentarz jest do niego całkowicie niewidoczny - z jego punktu widzenia jest to tylko jedna spacja (bez względu

\a (jak w alarmie) jest reliktem przeszłości, gdy do komunikowania się z komputerami często używano telegrafów (czy wiesz, czym jest teletekst?); wysłanie tego znaku do

Operator &gt;&gt; jest często nazywany operatorem ekstrakcji. Strumień cin, wraz z operatorem ekstrakcji, jest