Wprowadzenie do programowania
Wprowadzenie do programowania
w języku C
w języku C
Instrukcje sterujące przebiegiem
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
siminski@us.edu.pl
www.us.edu.pl/~siminski
Autor
Kontakt
Instrukcje wyrażeniowa i złożona
Instrukcje wyrażeniowa i złożona
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
2
Strona :
Instrukcja 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;
;
Instrukcja złożona
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żane do dowolnej głębokości.
{
int i = 0, j = 1, k;
k = i + j;
printf( "k = %d", k );
}
Instrukcje warunkowe
Instrukcje warunkowe
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
3
Strona :
Instrukcja warunkowa if i instrukcja alternatywy if-else
if( wyra enie )
ż
instrukcja
if( wyra enie )
ż
instrukcja_1
else
instrukcja_2
prawda
fałsz
wyrażenie
instrukcja_1
instrukcja_1
prawda
fałsz
wyrażenie
instrukcja
Instrukcja warunkowa if
Instrukcja alternatywy if-else
Instrukcje warunkowe
Instrukcje warunkowe
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
4
Strona :
Jakiego typu jest wyrażenie warunkowe?
W języku C nie ma predefiniowanego typu Boolean.
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).
if( delta < 0 )
brak_rozw_rzecz = 1;
else
brak_rozw_rzecz = 0;
brak_rozw_rzecz = ( delta < 0 );
W niektórych przypadkach stosowanie instrukcji warunkowej może być zbędne
Instrukcje warunkowe, cd. ...
Instrukcje warunkowe, cd. ...
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
5
Strona :
Gdy potrzebne są TRUE i FALSE
#define TRUE 1
#define FALSE 0
Porównywanie z zerem zwykle można uprościć
if( delta == 0 )
. . .
if( !delta )
. . .
#define TRUE (0==0)
#define FALSE (!TRUE)
Można jeszcze inaczej, wykorzystując typ wyliczeniowy.
if( delta != 0 )
. . .
if( delta )
. . .
Operator
Znaczenie
==
równe
!=
różne
!
logiczna negacja
&&
logiczny and
||
logiczny or
Przydatne operatory
Instrukcje warunkowe, cd. ...
Instrukcje warunkowe, cd. ...
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
6
Strona :
Uwaga na zagnieżdżone instrukcje if-else
if( kwota >= 0 ) /* Wydaje si */
ę
if( kwota > 0 )
printf( "Dochod" );
else
printf( "Strata" );
if( kwota >= 0 ) /* Jest */
if( kwota > 0 )
printf( "Dochod" );
else
printf( "Strata" );
if( kwota >= 0 )
{
if( kwota > 0 )
printf( "Dochod" );
}
else
printf( "Strata" );
Trzeba:
if( kwota >= 0 )
if( kwota > 0 )
printf( "Dochod" );
else
printf( "Zero!" );
else
printf( "Strata" );
Instrukcja przełączająca switch
Instrukcja przełączająca switch
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
7
Strona :
Postać ogólna
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.
Instrukcja przełączająca switch, cd. ...
Instrukcja przełączająca switch, cd. ...
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
8
Strona :
Przykład + ilustracja graficzna
int przypadek;
. . .
switch( przypadek )
{
case 0 : puts( "przypadek == 0" );
case 1 : puts( "przypadek == 1" );
default : puts( "przypadek != 0 i przypadek != 1" );
}
puts( ”przypadek != 0 i przypadek != 1” );
puts( ”przypadek != 1” );
puts( ”przypadek == 0” );
przypadek == ?
sterowanie:
wejście do instr. switch
sterowanie:
wyjście z instr. switch
case
0:
case 1:
defau
lt:
Instrukcja przełączająca switch, cd. ...
Instrukcja przełączająca switch, cd. ...
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
9
Strona :
Instrukcja switch to nie jest instrukcja wyboru ― jak ją „zrobić” w C?
int przypadek;
. . .
switch( przypadek )
{
case 0 : puts( "przypadek == 0" );
break;
case 1 : puts( "przypadek == 1" );
break;
default : puts( "przypadek != 0 i przypadek != 1" );
}
puts( ”przypadek != 0 i przypadek != 1” );
puts( ”przypadek != 1” ); break;
puts( ”przypadek == 0” ); break;
przypadek == ?
sterowanie:
wejście do instr. switch
sterowanie:
wyjście z instr. switch
case
0:
case 1:
defau
lt:
Instrukcja break — powoduje wyjście (zakończenie wykonania) instrukcji iteracyjnej
lub instrukcji switch.
Instrukcja przełączająca switch, cd. ...
Instrukcja przełączająca switch, cd. ...
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
10
Strona :
Przykład wykorzystania
switch( znak )
{
case ’0’ :
case ’1’ :
case ’2’ :
case ’3’ :
case ’4’ :
case ’5’ :
case ’7’ :
case ’8’ :
case ’9’ : puts( ”Cyfra” );
break;
case ’,’ :
case ’.’ :
case ’;’ : puts( ”Znak interpunkcyjny” );
break;
default : if( znak >= ’A’ && znak <= ’Z’ )
puts( ”Du a litera” );
ż
else
if( znak >= ’a’ && znak <= ’z’ )
puts( ”Mała litera” );
else
puts( ”Inny znak” );
break;
}
Przykład — rozpoznanie czy znak jest literą, cyfrą lub znakiem interpunkcyjnym.
char znak;
znak = getchar();
Instrukcja przełączająca switch, cd. ...
Instrukcja przełączająca switch, cd. ...
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
11
Strona :
Przykład wykorzystania
switch( get_key_from_keyboard() )
{
case ALT_F1 : show_last_used_help();
break;
case CTRL_F1 : show_current_context_help();
break;
case F1 : show_general_help();
break;
case CTR_F4 :
case ESC : close_current_window();
break;
}
Przykład — rozpoznanie i obsługa klawiszy naciskanych przez użytkownika.
Instrukcja przełączająca switch, cd. ...
Instrukcja przełączająca switch, cd. ...
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
12
Strona :
Uwagi dodatkowe
switch( error_code )
{
case -1 : puts( ”Bł d!” );
ą
make_report();
break;
case 0 : puts( ”Brak bł du” );
ę
do_something();
break;
}
Instrukcje nie muszą stanowić bloku:
switch( error_code )
{
case -1 : {
puts( ”Bł d!” );
ą
make_report();
break;
}
case 0 : {
puts( ”Brak bł du” );
ę
do_something();
break;
}
}
Uwaga ― przypadek default nie musi być ostatnim na liście. Warto dla tego
przypadku również stosować instrukcje break.
Instrukcje iteracyjne
Instrukcje iteracyjne
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
13
Strona :
Instrukcja iteracyjna do-while
do
instrukcja
while( wyra enie );
ż
Przypadek ogólny
do
{
ci g instrukcji
ą
}
while( wyra enie );
ż
Z wykorzystaniem instrukcji złożonej
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.
wyrażenie
instrukcja
prawda
fałsz
Instrukcje iteracyjne
Instrukcje iteracyjne
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
14
Strona :
Przykład wykorzystania iteracji do-while
. . .
do
{
printf( "Podaj wiek osoby:" );
gets( linia );
wiek = atoi( linia );
if( wiek <= 0 )
printf( "Wiek musi być liczb dodatni i ró n od zera!\n" );
ą
ą
ż ą
}
while( wiek <= 0 );
. . .
Zabezpieczenie wprowadzania danych danych, do-while + if
Instrukcje iteracyjne
Instrukcje iteracyjne
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
15
Strona :
Przykład wykorzystania iteracji do-while ― organizacja prostego menu
. . .
do
{
puts( "\nFormatowanie dysku, wybierz opcje:" );
printf( "\n1. Format\n2. Szybki format\n3. Diagnostyka\n4. Koniec\n>” );
klawisz = getchar(); fflush( stdin );
switch( klawisz )
{
case '1' : full_disk_format();
break;
case '2' : quick_disk_format();
break;
case '3' : check_disk();
break;
}/* switch */
}
while( klawisz != ’4’ );
. . .
Zamiast fflush:
void czyszczenie_bufora()
{
while( getchar() != '\n' )
;
}
Instrukcje iteracyjne
Instrukcje iteracyjne
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
16
Strona :
Instrukcja iteracyjna while
while( wyra enie )
ż
instrukcja
Przypadek ogólny
while( wyra enie )
ż
{
ci g instrukcji
ą
}
Z wykorzystaniem instrukcji złożonej
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.
wyrażenie
instrukcja
prawda
fałsz
Instrukcje iteracyjne
Instrukcje iteracyjne
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
17
Strona :
Przykład wykorzystania iteracji while ― sylwestrowe odliczanie ;-)
int licznik = 10;
while( licznik > 0 )
{
printf( "\n%d...", licznik );
licznik--;
}
printf( ”\nNowy Rok!!!” );
Porównywanie z zerem często zapisuje się krócej
while( licznik > 0 )
{
printf( "\n%d...", licznik );
licznik--;
}
while( licznik )
{
printf( "\n%d...", licznik );
licznik--;
}
Uwaga — wersja uproszczona może być niebezpieczna
int licznik = 11;
while( licznik > 0 )
{
printf( "\n%d...", licznik );
licznik = licznik - 2;
}
licznik-–
odpowiada
licznik = licznik - 1
Instrukcje iteracyjne
Instrukcje iteracyjne
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
18
Strona :
Instrukcja iteracyjna for
int licznik;
while( )
{
}
printf( ”\nNowy Rok!!!” );
Nie ma nic wspólnego — poza nazwą — z instrukcją iteracyjną for z języka Pascal.
Instrukcja for w języku C stanowi uogólnienie schematu iteracji while.
int licznik;
for( ; ; )
printf( ”\nNowy Rok!!!” )
licznik = 10;
licznik > 0
licznik--;
Inicjalizacja
Warunek
Modyfikacja
printf( "\n%d...", licznik );
Ciało iteracji
licznik = 10
licznik > 0
licznik--
printf( "\n%d...", licznik );
Inicjalizacja
Warunek
Modyfikacja
Ciało iteracji
Instrukcje iteracyjne
Instrukcje iteracyjne
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
19
Strona :
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.
int licznik;
for( licznik = 10; licznik > 0; printf( ”\n%d...”, licznik-- ) )
;
printf( ”\nNowy Rok!!!” );
int i, j;
for( i = 0, j = 10; i != j; i++, j-- )
printf( ”\ni = %d j = %d”, i, j );
Instrukcje break i continue
Instrukcje break i continue
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
20
Strona :
Instrukcje break i continue — wspomaganie iteracji i instrukcji switch
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 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
. . .
}
Instrukcje break i continue
Instrukcje break i continue
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
21
Strona :
Przykład wykorzystania instrukcji break i continue
. . .
for( ; ; )
/* Iteracja niesko czona czyli p tla */
ń
ę
{
puts( "\nFormatowanie dysku, wybierz opcje:" );
printf( "\n1. Format\n2. Szybki format\n3. Diagnostyka\n4. Koniec\n>” );
klawisz = getchar(); fflush( stdin );
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 */
}
. . .
Stosowanie break i continue jest
czasem bardzo wygodne, są to jednak
instrukcje niestrukturalne i ich
stosowanie może zacznie pogorszyć
czytelność kodu.
Instrukcja return
Instrukcja return
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
22
Strona :
Instrukcja powrotu z podprogramu
Każda funkcja wraca do miejsca swojego wywołania po osiągnięciu końca jej bloku
lub napotkaniu instrukcji return.
Jeżeli po słowie return występuje wyrażenie, to wartość tego wyrażenia jest
przekazywana do miejsca wywołania.
Instrukcja return może być również stosowana dla funkcji o type rezultatu void,
umożliwia to wcześniejsze zakończenie działania funkcji.
float delta( float a, float b, float c )
{
return b * b - 4 * a * c;
}
float pole_trojkata( float a, float h )
{
return 0.5 * a * h;
}
float wczytaj_liczbe_f( char komunikat[] )
{
char bufor_tekstowy[ 80 ];
printf( komunikat );
fgets( bufor_tekstowy, 80, stdin ) ;
return atof( bufor_tekstowy );
}
Instrukcja return
Instrukcja return
Instrukcje sterujące przebiegiem programu
Język C
Język C
Podstawy i języki programowania
Podstawy i języki programowania
Copyright © Roman Simiński
23
Strona :
Instrukcja powrotu ― plusy i minusy
void wypisz_info( float sum_dochod )
{
if( sum_dochod == 0 )
{
printf( "Nic nie zarobiles" );
return;
}
if( sum_dochod > 0 )
{
printf( "Zarobiles!" );
return;
}
if( sum_dochod < 0 )
{
printf( "Straciles!" );
return;
}
}
void wypisz_info( float sum_dochod )
{
if( sum_dochod == 0 )
printf( "Nic nie zarobiles" );
else
if( sum_dochod > 0 )
printf( "Zarobiles!" );
else
printf( "Straciles!" );
}
void wypisz_info( float sum_dochod )
{
if( sum_dochod == 0 )
printf( "Nic nie zarobiles" );
if( sum_dochod > 0 )
printf( "Zarobiles!" );
if( sum_dochod < 0 )
printf( "Straciles!" );
}
Napisać funkcję, otrzymującą jako parametr sumaryczny roczny dochód, wyświetlającą
informację tekstową o zarobku, stracie bądź zerowym dochodzie.