Wprowadzenie do programowania w języku C


Wprowadzenie do programowania
Wprowadzenie do programowania
w języku C
w języku C
Część pierwsza
Aagodny start
Autor
Roman Simiński
Kontakt
siminski@us.edu.pl
www.us.edu.pl/~siminski
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.
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Jak powstawał język C?
Jak powstawał język C?
Ludzie
Kenneth Thompson
Urodzony w 1943 roku w Nowym Orleanie. Otrzymuje tytuł
magistra Uniwersytetu Kalifornijskiego w 1966, jest entuzjastÄ…
elektroniki, jednak to informatyka staje siÄ™ jego pasjÄ….
Zaraz po studiach dołącza do grupy z laboratorium firmy Bell,
pracującej wspólnie z GE i MIT nad systemem Multics.
W 1969 projektuje i opracowuje system Unix, wkrótce potem język
B. W 1971 przenosi system Unix na komputer PDP-11, potem
przepisuje jego kod w języku C. Rozwija system Unix (np.
implementuje koncepcję potoków opracowaną przez D.McIlroy'a).
W połowie lat 70-tych rozpoczyna również pracę dydaktyczną, na początku lat
80-tych stworzony przez niego komputer szachowy Belle zdobywa mistrzostwo
świata w zawodach komputerów szachowych. Kontynuuje pracę dydaktyczną,
otrzymuje wiele nagród. W roku 2000 odchodzi z Laboratorium firmy Bell.
Copyright © Roman SimiÅ„ski Strona : 2
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Jak powstawał język C?
Jak powstawał język C?
Ludzie
Dennis M. Ritchie
Urodzony w 1941 w Bronxville (N.Y.), w 1963 kończy Harvard
z dyplomem fizyka, pięć lat pózniej broni doktorat z
matematyki.
Zainteresowany teoretycznymi podstawami informatyki trafia,
wzorem ojca, do laboratorium firmy Bell. W 1968 dołącza do
zespołu pracującego nad systemem Multics. Tu spotyka się
z K. Thompsonem.
Po wycofaniu się firmy Bell z projektu Multics kontynuuje współpracę
z K. Thompsonem, w 1972 roku tworzy język C w oparciu o opracowany przez
Thompsona język B.
Kieruje i bierze udział w wielu projektach związanych z rozwojem systemów
operacyjnych. Wielokrotnie nagradzany, wybrany do U.S. National Academy of
Engineering .
Napisana wspólnie z Brianem Kernighan'em książka The C Programming
Language staje się biblią entuzjastów języka C.
Copyright © Roman SimiÅ„ski Strona : 3
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Jak powstawał język C?
Jak powstawał język C?
Ludzie
Brian Kernighan
Urodzony w 1942 w Toronto (Ontario), w roku 1964 kończy
Uniwersytet w Toronto i otrzymuje dyplom w zakresie fizyki
inżynieryjnej, w roku 1969 broni doktorat z elektroniki na
Uniwersytecie w Princeton.
W 1969 rozpoczyna pracÄ™ w laboratorium badawczym firmy
Bell. Opracowuje i współuczestniczy w opracowaniu wielu
programów dla systemu Unix  AWK, ditroff, opracowuje
język AMPL.
Jest, wspólnie z Dennisem Ritchie, współautorem książki The C Programming
Language, która staje się biblią entuzjastów języka C.
Jest autorem książki The UNIX Programming Environment. Aktualnie, jego
zainteresowania koncentrują się na rozwoju języków programowania, metodykach
programowania i budowaniu interfejsów użytkownika.
Copyright © Roman SimiÅ„ski Strona : 4
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Jak powstawał język C?
Jak powstawał język C?
Prehistoria
Początki języka C są związane z wczesną fazą rozwoju systemu Unix.
Prace nad protoplastą tego systemu zostały rozpoczęte pod koniec lat sześćdziesiątych
w laboratoriach telekomunikacyjnej firmy Bell  BTL  wspólnie z General Electric
Company oraz MIT. Powstać miał wielodostępny system operacyjny Multics 
Multiplexed Information and Computing Service.
Mimo iż system działa, prace przerwano w 1969 roku, programiści z BTL szukają
innych projektów. Ciągle chcą napisać uniwersalny system operacyjny. Jednak w BTL
nie ma dla takiego projektu dobrej atmosfery.
Jeden z członków zespołu  Ken Thompson  pisze grę Space Travel. Thompson pisze
ją na komputerze GE Honeywell 635, następnie używa asemblera skrośnego i przenosi
kod binarny na komputer PDP-7 używając taśmy papierowej.
Komputer DEC PDP-7 ma w 1968 roku pamięć 8K 18-sto bitowych słów.
Praca nad rozwojem gry Space Travel wymaga napisania systemu operacyjnego dla
PDP-7, Ken Thompson wspólnie z Denisem Ritchie rozpoczynają pracę nad tym
systemem.
Powstaje pierwsza wersja systemu nazwanego Unix  jego nazwa jest kalamburem
nazwy Multics.
Copyright © Roman SimiÅ„ski Strona : 5
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Jak powstawał język C?
Jak powstawał język C?
Prehistoria, cd...
Powstaje wersja systemu obejmujÄ…cej proste jÄ…dro oraz
podstawowe narzędzia (edytor, asembler, powłoka).
Wszystko zostało zaimplementowane w języku
symbolicznym, jednak rozpoczynają się próby
wykorzystania języka programowania wywodzącego się
z języka BCPL.
Komputer PDP-7 jest przestarzały. Zespół podejmuje
próbę zdobycia komputera PDP-11. Kosztuje on wtedy
65 000$.
Ostatecznie zespół otrzymuje komputer w lecie 1970r.,
jednak prace nad przeniesieniem nań systemu Unix
startują dopiero w grudniu, po doposażeniu go w dysk.
Oficjalnie prace poświęcone są opracowaniu systemu dla
wydziału patentowego BTL.
Copyright © Roman SimiÅ„ski Strona : 6
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Jak powstawał język C?
Jak powstawał język C?
Prehistoria, cd...
Ken Thompson potrzebuje nowego języka
programowania do tworzenia oprogra-
mowania systemowego.
Istnieje już jego własny język o nazwie B.
Nazwa ta prawdopodobnie pochodzi od języka
BCPL, alternatywna teoria mówi, iż nazwa
pochodzi od języka Bon.
Język Bon został stworzony przez Thompson'a
wcześniej, a jego nazwa miała pochodzić
ponoć od imienia jego żony  Bonnie.
Język B miał sporo ograniczeń, co
Denis Ritchie i Ken Thompson przenoszÄ…
spowodowało rozpoczęcie przez Ritchie go
system Unix na PDP-11 za pośrednictwem
w roku 1971 prac nad rozszerzeniem tego
terminalu telegraficznego.
języka. Doprowadziło to do powstania
dialektu NB (ang. new B).
Copyright © Roman SimiÅ„ski Strona : 7
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Jak powstawał język C?
Jak powstawał język C?
Czas na C
Nazwa NB nie oddaje w pełni różnicy pomiędzy tym językiem a językiem B.
Nowy język otrzymuje nazwę C, otwartą pozostaje kwestię jego pochodzenia  czy C
pochodzi od następnej litery w alfabecie po B czy też od drugiej litery z protoplasty
języków B i C  czyli języka BCPL.
W roku 1973 powstaje specyfikacja języka C (zawierającego typ strukturalny) oraz
odpowiednie narzędzia  rozpoczynają się prace nad przepisanie jądra Unix a dla
komputera PDP-11.
Również w tym okresie następuje przeniesienia kompilatora języka C na inne platformy
sprzętowe (np. Honeywell 635, IBM 360/370) oraz przygotowania bibliotek
podprogramów  np. podprogramów obsługi standardowego wejścia i wyjścia .
W 1978 roku Dennis Ritchie i Brian Kernighan publikują książkę Język
programowania C (oryginał ang. The C Programming Language).
W latach siedemdziesiątych, w trakcie prac nad implementacją jądra Unix a, okazało
się, że język jest na tyle elastyczny i efektywny, że rozpoczęto proces przepisywania
narzędzi systemowych. Aby wspomóc programistów Steve Johnson tworzy narzędzie
lint analizujące zawartość plików zródłowych i sygnalizujące niebezpieczne
konstrukcje.
Copyright © Roman SimiÅ„ski Strona : 8
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Jak powstawał język C?
Jak powstawał język C?
Czas na standard języka C
Na początku lat osiemdziesiątych stało się jasne, że język C wymaga standaryzacji.
Stało się to konieczne między innymi ze względu na wzrost zainteresowania językiem C
w projektach rzÄ…dowych.
Ostatecznie w lecie 1983 roku ANSI powołało komitet X3J11, którego celem było
opracowanie standardu języka C. Komitet ten opracował raport (ANSI 89) w końcu
roku 1989, standard ten został zaakceptowany przez ISO jako ISO/IEC 9899-1990.
Standaryzacja przyczynia się do poprawy przenośności kodu zródłowego. Kompilatory
języka C dostępne są na każdej, szanującej się platformie sprzętowej. Pośrednio ułatwia
to przenoszenie systemu Unix i powstawanie jego dedykowanych wersji.
Copyright © Roman SimiÅ„ski Strona : 9
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Jak powstawał język C?
Jak powstawał język C?
Co po C?
Najbardziej znane rozwinięcia języka C: Concurrent C, Objective C, C*, C++.
Z pnia języka C wyrosły również: Java oraz dialekt JavaScript, PHP, C#, i wiele
innych.
Po określeniu standardu języka C, jego specyfikacja przez dłuższy czas nie zmienia się.
W tym samym czasie specyfikacja języka C++ ciągle ewoluuje.
Rozwój języka C++ pośrednio wpływa na modyfikację standardu C.
Powstaje standard C99, opublikowany przez ISO w 1999 r. Standard ten zostaje
przyjęty przez ANSI w marcu 2000 r.
Większość zmian standardu C99 zbliża język C do C++. Z tego powodu wielu
producentów kompilatorów nie jest zainteresowanych implementacją C99, preferując
zamiast niego programowania w C++ bez wykorzystania obiektów .
Powstają  specjalizowane i niszowe  języki: C  , D, P.
Copyright © Roman SimiÅ„ski Strona : 10
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Literatura  setki książek na temat programowaniu w C
Literatura  setki książek na temat programowaniu w C
Pewne i sprawdzone
Brian W. Kernigham, Dennis M. Richie, Język ANSI C, Wydawnictwo
Naukowo Techniczne, Warszawa, 2003.
Clovis L. Tondo, Scott E. Gimpel, Język ANSI C, ćwiczenia i rozwiązania,
Wydawnictwo Naukowo Techniczne, Warszawa, 2003.
Adam Sapek, Wgłąb języka C, Helion, Gliwice, 1993.
Copyright © Roman SimiÅ„ski Strona : 11
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Zaczynamy  pierwszy program w języku C
Zaczynamy  pierwszy program w języku C
Problem
Zadaniem programu jest obliczanie, ile średnio litrów paliwa zużywa pojazd na trasie 100
km.
Pierwsza przymiarka  program który robi nic
int main()
{
return 0;
}
`
Każdy program C/C++musi
Nazwa funkcji
posiadać funkcję o nazwie main,
Typ rezultatu Parametry
stanowiącą tzw. punkt wejściowy
programu.
int main()
{
Od niej siÄ™ rozpoczyna wykonanie
return 0;
Ciało funkcji
programu napisanego w języku
}
C/C++.
Instrukcja powrotu Wartość przekazywna
z podprogramu w miejscu wywołania
Copyright © Roman SimiÅ„ski Strona : 12
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Zaczynamy  pierwszy program w języku C
Zaczynamy  pierwszy program w języku C
Kto wywołuje funkcję main?
Typowy scenariusz uruchomienia programu
Pamięć
operacyjna
wykonywalnego :
Użytkownik przekazuje systemowi
operacyjnemu zlecenie uruchomienia
programu.
kod startowy
System ładuje kod programu do pamięci,
call main
przygotowuje jego środowisko,
przekazuje sterowanie do bloku kodu
main
startowego programu (tzw. startup).
System
operacyjny
Kod startowy wykonuje czynności
kod powrotu
inicjalizujące. Na zakończenie wywołuje
reszta
programu
funkcje main.
+
dane
Po zakończeniu działania funkcji main
bieżący proces jest kończony i do
systemu przekazywany jest kod wyjścia.
Plik wykonywalny
np. test.exe
Copyright © Roman SimiÅ„ski Strona : 13
kod programu
test.exe
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Zaczynamy  pierwszy program w języku C
Zaczynamy  pierwszy program w języku C
Po co przekazywać kod zakończenia programu?
Kod zakończenia programu może być wykorzystywany w skryptach systemu operacyjnego
oraz jako środek komunikacji pomiędzy procesami.
Przykłady
Przykładowe skrypty (będący w istocie plikami wsadowymi systemu DOS) testujący kod
wyjścia programu prog.exe:
@echo off
@echo off
echo Testowanie kodu powrotu
echo Testowanie kodu powrotu 1
prog.exe
: petla
if errorlevel 2 goto dwa
prog.exe
if errorlevel 1 goto jeden
if errorlevel 1 goto koniec
if errorlevel 0 goto zero
if errorlevel 0 goto petla
: zero
: koniec
echo Kod powrotu 0
echo Koniec programu
goto koniec
pause
: jeden
echo Kod powrotu 1
goto koniec
: dwa
echo Kod powrotu 2
goto koniec
: koniec
pause
Copyright © Roman SimiÅ„ski Strona : 14
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  wariacje na temat funkcji main
Pierwszy program w języku C  wariacje na temat funkcji main
Cztery formy deklaracji funkcji main  która doba jest, którą wybrać?
int main()
Prawidłowa deklaracja funkcji main zalecana przez normę ANSI.
{
return 0;
To jest (prawie) najlepsza wersja.
}
main()
Prawidłowa deklaracja funkcji main. Przy braku typu rezultatu,
{
kompilator domyślnie przyjmuje, że typem rezultatu jest int.
return 0;
}
Dozwolone, lecz lepsza jest postać nr 1.
void main()
Specyfikacja void oznacza brak wartości. Zatem ta funkcja nie
{
udostępnia rezultatu  brak instrukcji return.
}
Dozwolone, lecz niezgodne ze standardem ANSI.
int main()
Brak instrukcji return nie jest błędem dla kompilatora.
{
Programista otrzyma ostrzeżenie (ang. warning) o braku
}
rezultatu.
Mimo braku błędu kompilacji to jest konstrukcja błędna!
Copyright © Roman SimiÅ„ski Strona : 15
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  wariacje na temat funkcji main
Pierwszy program w języku C  wariacje na temat funkcji main
Po co przekazywać kod zakończenia programu?
Zamiast rezultatu w postaci bezwzględnych wartości można wykorzystać symbole:
EXIT_SUCCESS  oznacza bezbłędne zakończenie programu.
EXIT_FAILURE  zakończenie z informacją o błędzie.
Jednak aby z nich skorzystać, należy uzupełnić program o linię:
#include
Ta dyrektywa informuje, że program będzie korzystał ze standardowej biblioteki języka
C, w niej właśnie zdefiniowane są symbole EXIT_SUCCES oraz EXIT_FAILURE.
Najlepsza wersja programu z punktu widzenia przenośności kodu
#include
int main()
{
return EXIT_SUCCESS;
}
Copyright © Roman SimiÅ„ski Strona : 16
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  komunikacja z użytkownikiem
Pierwszy program w języku C  komunikacja z użytkownikiem
Wyprowadzamy komunikat do strumienia wyjściowego programu
#include
#include
int main()
{
printf( "Obliczam ile Twoj pojazd spala paliwa na 100 km" );
return EXIT_SUCCESS;
}
Obsługa standardowych strumieni programu
#include
Ta dyrektywa informuje, że program będzie korzystał ze standardowych strumieni:
standardowego strumienia wejściowego, wyjściowego, oraz strumienia błędów.
Wykorzystanie funkcji printf
printf to nazwa funkcji wyprowadzającej dane do strumienia wyjściowego. Dane
mogą być przez funkcję odpowiednio formatowane.
 Obliczam ile Twoj pojazd spala paliwa na 100 km to stała łańcu-
chowa, literał w postaci napisu.
Copyright © Roman SimiÅ„ski Strona : 17
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  komunikacja z użytkownikiem
Pierwszy program w języku C  komunikacja z użytkownikiem
Standardowe strumienie programu
standardowy strumień wejściowy programu (ang. stdin), który jest zwykle
skojarzony z klawiaturÄ…;
standardowy strumień wyjściowy programu (ang. stdout), który jest zwykle
skojarzony z ekranem monitora;
standardowy strumień wyjściowy błędów programu (ang. stderr), który jest zwykle
skojarzony również z ekranem monitora.
Pamięć
Strumienie stdin, stdout reprezentujÄ…
operacyjna
normalny kanał komunikacji programu z
użytkownikiem.
stdout
stderr
Strumień stderr zarezerwowany jest do
Program jako
stdin proces
wyświetlania komunikatów diagnostycznych
programu.
Redyrekcja strumieni
C:\>test.exe > wyjscie.txt
C:\>test.exe < wejscie.txt
C:\>test.exe < wejscie.txt > wyjscie.txt
Copyright © Roman SimiÅ„ski Strona : 18
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  komunikacja z użytkownikiem
Pierwszy program w języku C  komunikacja z użytkownikiem
Kosmetyka programu  komunikat zawsze od poczÄ…tku nowego wiersza
#include
#include
int main()
{
printf( "\nObliczam ile Twoj pojazd spala paliwa na 100 km\n" );
return EXIT_SUCCESS;
}
Znaki sterujÄ…ce w napisach
Znak sterujÄ…cy Symbol Znaczenie
\a BELL Sygnał dzwiękowy
\b BS (backspace) Spacja wsteczna
\n LF (newline, linefeed) Nowa linia
\r CR (Carriage return) Powrót  karetki
\t TAB Tabulacja
Copyright © Roman SimiÅ„ski Strona : 19
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  deklarujemy zmienne
Pierwszy program w języku C  deklarujemy zmienne
Wprowadzamy zmienne, symulujemy obliczenia
#include
Zmienne mogą być deklarowane na początku każdego
#include
bloku określonego nawiasami { }.
int main()
{
float dystans, paliwo, spalanie;
printf( "\nObliczam ile Twoj pojazd spala paliwa na 100 km\n" );
/* Dane wpisane na próbę */
dystans = 500;
Wyrażenia wykorzystujące
paliwo = 37.45;
operator przypisania =
spalanie = ( paliwo * 100 ) / dystans;
return EXIT_SUCCESS;
}
Tekst zapisany w /* */ jest komentarzem, zawartość komentarza nie podlega kompilacji.
float to typ zmiennopozycyjny, służący do reprezentowania liczb rzeczywistych
pojedynczej precyzji.
Copyright © Roman SimiÅ„ski Strona : 20
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  deklarujemy zmienne
Pierwszy program w języku C  deklarujemy zmienne
Zmiana stanu pamięci, czyli wartości zmiennych się zmieniają
Pamięć
Pamięć
operacyjna
operacyjna
.
.
Po deklaracji
Przypisanie
.
.
.
.
paliwo ? 37.45
paliwo = ;
paliwo 37.45
dystans ?
dystans 500
dystans = 00 ;
5
spalanie ?
spalanie ?
.
.
.
.
.
.
Pamięć
operacyjna
.
Przypisanie
.
.
paliwo 37.45
spalanie = ;
( paliwo * 100 ) / dystans
dystans 500
spalanie 7.49
.
.
.
Copyright © Roman SimiÅ„ski Strona : 21
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  wyprowadzamy wyniki obliczeń
Pierwszy program w języku C  wyprowadzamy wyniki obliczeń
Wyprowadzenie wyniku do strumienia wyjściowego programu
#include
#include
int main()
{
float dystans, paliwo, spalanie;
printf( "\nObliczam ile Twoj pojazd spala paliwa na 100 km\n" );
/* Dane wpisane na próbę */
dystans = 500;
paliwo = 37.45;
spalanie = ( paliwo * 100 ) / dystans;
printf( "Spalanie %4.2f l na 100 km", spalanie );
return EXIT_SUCCESS;
}
Przyjrzyjmy się temu dokładniej...
Copyright © Roman SimiÅ„ski Strona : 22
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  wyprowadzamy wyniki obliczeń
Pierwszy program w języku C  wyprowadzamy wyniki obliczeń
Koncepcja funkcji formatowanego wyjścia
Funkcja printf wyprowadzane sformatowane dane do stdout. Pierwszy parametr
funkcji, będący łańcuchem znaków, może zawierać specyfikacje przekształceń.
printf( "Spalanie %4.2f l na 100 km", spalanie );
spalanie:
7.49
Sekwencje rozpoczynające się od znaku % stanowią specyfikacje przekształceń
kolejnych parametrów funkcji printf:
%d  wyprowadza liczbę całkowitą dziesiętną,
%f  wyprowadza liczbÄ™ rzeczywistÄ…,
Liczba parametrów musi odpowiadać
liczbie sekwencji formatujÄ…cych.
%c  wyprowadza znak,
Ewentualna niezgodność nie będzie
%s  wyprowadza napis.
wykryta przez kompilator.
Copyright © Roman SimiÅ„ski Strona : 23
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  drobna optymalizacja
Pierwszy program w języku C  drobna optymalizacja
Eliminujemy niepotrzebnÄ… zmiennÄ…
#include
#include
int main()
{
float dystans, paliwo, spalanie;
printf( "\nObliczam ile Twoj pojazd spala paliwa na 100 km\n" );
/* Dane wpisane na próbę */
dystans = 500;
paliwo = 37.45;
spalanie = ( paliwo * 100 ) / dystans;
printf( "Spalanie %4.2f l na 100 km", spalanie );
return EXIT_SUCCESS;
}
printf( "Spalanie %4.2f l na 100 km", ( paliwo * 100 ) / dystans );
Copyright © Roman SimiÅ„ski Strona : 24
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  wczytujemy dane
Pierwszy program w języku C  wczytujemy dane
Wczytujemy dane ze strumienia wejściowego
#include
#include
Deklaracja 20-sto znakowej tablicy
int main()
przeznaczonej do przechowywania napisów
{
char linia[ 20 ];
float dystans, paliwo;
printf( "\nObliczam ile Twoj pojazd spala paliwa na 100 km\n" );
printf( "Dystans : " );
gets( linia );
Wyświetlenie zachęty,
dystans = atof( linia );
wczytanie napisu,
printf( "Paliwo : " );
konwersja do liczby rzeczywistej.
gets( linia );
paliwo = atof( linia );
printf( "Spalanie %4.2f l na 100 km", ( paliwo * 100 ) / dystans );
return EXIT_SUCCESS;
}
Przyjrzyjmy się temu dokładniej...
Copyright © Roman SimiÅ„ski Strona : 25
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  wczytujemy dane
Pierwszy program w języku C  wczytujemy dane
Funkcje gets i atof
Funkcja wczytuje łańcuch znaków ze
strumienia wejściowego programu i zapisuje
Pamięć
go w tablicy będącej parametrem wywołania.
operacyjna
Na końcu łańcucha zapisywany jest znacznik
końca napisu -- znak '\0'.
linia
5
gets( linia ) 0
O 1
2
O
\O 3
4
Funkcja atof przekształca napis
zawarty w tablicy będącej
500 + znak Enter
parametrem wywołania na
17
odpowiadajÄ…cÄ… mu liczbÄ™
rzeczywistÄ….
18
19
dystans = atof( linia )
dystans
500.0
paliwo
Copyright © Roman SimiÅ„ski Strona : 26
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  wczytujemy dane
Pierwszy program w języku C  wczytujemy dane
Funkcja gets jest niebezpieczna  problem przepełnienia bufora
To jest napis zbyt długi aby się zmieścić w 20-sto znakowym buforze + znak Enter
Pamięć
operacyjna
linia
gets( linia ) 0
T
1
o
2
3
j
4
e
s
t
17
n
18
a
19
Nadmiarowe znaki wczytanego
p
napisu niszczą zawartość komórek
dystans pamięci operacyjnej obok zmiennej
i
linia.
paliwo s
.
.
.
Copyright © Roman SimiÅ„ski Strona : 27
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  wczytujemy dane
Pierwszy program w języku C  wczytujemy dane
Funkcja fgets jest bezpieczniejsza
char linia[ 20 ];
. . .
printf( "Dystans : " );
fgets( linia, 20, stdin );
. . .
Funkcja fgets :
Pierwszy parametr określa bufor, do którego mają być zapisane wczytywane dane.
Drugi parametr określa N  maksymalną pojemność bufora, uwzględniającą
miejsce na znacznik końca napisu.
Trzeci parametr określa strumień (plik), z którego funkcja ma odczytywać dane,
może to być również standardowy strumień wejściowy  stdin.
Działąnie funkcji kończy się gdy funkcja odczyta N  1 znaków lub wcześniej
zostanie odczytany znak nowego wiersza (Enter).
Znacznik końca napisu dopisywany jest na jego końcu.
Copyright © Roman SimiÅ„ski Strona : 28
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  wczytujemy dane
Pierwszy program w języku C  wczytujemy dane
Mimo użycia bezpieczniejszej funkcji też można popełnić błąd
char linia[ 20 ];
. . .
printf( "Dystans : " );
fgets( linia, 80, stdin );
. . .
Również w tym przypadku bufor może się przepełnić. Aby tego uniknąć stosuje się
stałe symboliczne.
Taka stała to identyfikator, reprezentujący pewną wartość.
#define MAKS_DL 20
. . .
char linia[ MAKS_DL ];
. . .
printf( "Dystans : " );
fgets( linia, MAKS_DL, stdin );
. . .
Copyright © Roman SimiÅ„ski Strona : 29
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  wczytujemy dane
Pierwszy program w języku C  wczytujemy dane
Program po modyfikacjach
#include
#include
#define MAKS_DL 20
int main()
{
char linia[ MAKS_DL ];
float dystans, paliwo;
printf( "\nObliczam ile Twoj pojazd spala paliwa na 100 km\n" );
printf( "Dystans : " );
fgets( linia, MAKS_DL, stdin );
dystans = atof( linia );
printf( "Paliwo : " );
fgets( linia, MAKS_DL, stdin );
paliwo = atof( linia );
printf( "Spalanie %4.2f l na 100 km", ( paliwo * 100 ) / dystans );
return EXIT_SUCCESS;
}
Copyright © Roman SimiÅ„ski Strona : 30
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  dane nie muszą być poprawne
Pierwszy program w języku C  dane nie muszą być poprawne
Zabezpieczenie przed cwaniaczkami co wpiszą ujemne wartości ;-)
#include
#include
#include
#define MAKS_DL 20
int main()
{
char linia[ MAKS_DL ];
float dystans, paliwo;
printf( "\nObliczam ile Twoj pojazd spala paliwa na 100 km\n" );
printf( "Dystans : " );
fgets( linia, MAKS_DL, stdin );
dystans = fabs( atof( linia ) );
Wyznaczenie modułu liczby
printf( "Paliwo : " );
fgets( linia, MAKS_DL, stdin ); będącej rezultatem funkcji atof.
paliwo = fabs( atof( linia ) );
printf( "Spalanie %4.2f l na 100 km", ( paliwo * 100 ) / dystans );
return EXIT_SUCCESS;
}
Copyright © Roman SimiÅ„ski Strona : 31
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  dane nie muszą być poprawne
Pierwszy program w języku C  dane nie muszą być poprawne
Zabezpieczenie przed dzieleniem przez zero
#include
#include
#include
int main()
{
. . .
printf( "Dystans : " );
fgets( linia, MAKS_DL, stdin );
dystans = fabs( atof( linia ) );
printf( "Paliwo : " );
fgets( linia, MAKS_DL, stdin );
paliwo = fabs( atof( linia ) ); Instrukcja alternatywy
if( dystans != 0 )
printf( "Spalanie %4.2f l na 100 km", ( paliwo * 100 ) / dystans );
else
printf( "Nie dokonam obliczen dla takiego dystansu." );
return EXIT_SUCCESS;
}
Copyright © Roman SimiÅ„ski Strona : 32
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  dane nie muszą być poprawne
Pierwszy program w języku C  dane nie muszą być poprawne
Instrukcja warunkowa Instrukcja alternatywy
if( wyrażenie ) if( wyrażenie )
instrukcja instrukcja_1
else
instrukcja_2
prawda fałsz
prawda
wyrażenie
wyrażenie
fałsz
instrukcja
instrukcja_1 instrukcja_1
Operator != oznacza różne, nierówne
Instrukcja warunkowa czy alternatywy?
if( dystans != 0 )
printf( "Spalanie %4.2f l na 100 km", ( paliwo * 100 ) / dystans );
if( dystans != 0 )
printf( "Spalanie %4.2f l na 100 km", ( paliwo * 100 ) / dystans );
else
printf( "Nie dokonam obliczen dla takiego dystansu." );
Åšrednik!
Copyright © Roman SimiÅ„ski Strona : 33
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  wersja prawie ostateczna
Pierwszy program w języku C  wersja prawie ostateczna
Program po modyfikacjach  czego tu brakuje?
#include
#include
#include
#define MAKS_DL 20
int main()
{
char linia[ MAKS_DL ];
float dystans, paliwo;
printf( "\nObliczam ile Twoj pojazd spala paliwa na 100 km\n" );
printf( "Dystans : " );
fgets( linia, MAKS_DL, stdin );
dystans = fabs( atof( linia ) );
printf( "Paliwo : " );
fgets( linia, MAKS_DL, stdin );
paliwo = fabs( atof( linia ) );
if( dystans != 0 )
printf( "Spalanie %4.2f l na 100 km", ( paliwo * 100 ) / dystans );
else
printf( "Nie dokonam obliczen dla takiego dystansu." );
return EXIT_SUCCESS;
}
Copyright © Roman SimiÅ„ski Strona : 34
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  wersja prawie ostateczna
Pierwszy program w języku C  wersja prawie ostateczna
Program po modyfikacjach  daj szansę użytkownikowi, niech zdąży przeczytać!
#include
#include
#include
#define MAKS_DL 20
int main()
{
. . .
if( dystans != 0 )
printf( "Spalanie %4.2f l na 100 km", ( paliwo * 100 ) / dystans );
else
printf( "Nie dokonam obliczen dla takiego dystansu." );
printf( "\nNacisnij Enter by zakonczyc program..." );
getchar();
return EXIT_SUCCESS;
}
Copyright © Roman SimiÅ„ski Strona : 35
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  zignorowane rezultaty funkcji
Pierwszy program w języku C  zignorowane rezultaty funkcji
Dlaczego wywołując funkcje gets, fgets i getchar ignorujemy ich rezultat?
Jeżeli rezultatem gets i fgets jest wartość NULL, to oznacza, że odczytany został
znacznik końca strumienia lub wystąpił błąd. W przeciwnym wypadku jest OK.
Testowanie rezultatu funkcji fgets (gets)
printf( "Dystans : " );
if( fgets( linia, MAKS_DL, stdin ) != NULL )
dystans = fabs( atof( linia ) );
else
printf( "\nBlad odczytu dystansu." );
Rezultatem funkcji getchar jest znak...
char c;
. . .
c = getchar();
... ale ten znak nie jest przecież nikomu potrzebny!
Tak napisze większość programistów... Tak napisze programista-esteta...
. . . . . .
getchar(); ( void )getchar();
Copyright © Roman SimiÅ„ski Strona : 36
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  wykorzystanie rezultatu funkcji fgets
Pierwszy program w języku C  wykorzystanie rezultatu funkcji fgets
Testowanie rezultatu funkcji fgets  rozwiÄ…zanie naiwne
. . .
int main()
{
. . .
printf( "Dystans : " );
if( fgets( linia, MAKS_DL, stdin ) != NULL )
dystans = fabs( atof( linia ) );
else
printf( "\nBlad odczytu dystansu." );
printf( "Paliwo : " );
if( fgets( linia, MAKS_DL, stdin ) != NULL )
paliwo = fabs( atof( linia ) );
else
printf( "\nBlad odczytu paliwa." );
if( dystans != 0 )
printf( "Spalanie %4.2f l na 100 km", ( paliwo * 100 ) / dystans );
else
printf( "Nie dokonam obliczen dla takiego dystansu." );
printf( "\nNacisnij Enter by zakonczyc program..." );
getchar();
return EXIT_SUCCESS;
}
Copyright © Roman SimiÅ„ski Strona : 37
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  wykorzystanie rezultatu funkcji fgets
Pierwszy program w języku C  wykorzystanie rezultatu funkcji fgets
Testowanie rezultatu funkcji fgets   nadużycie instrukcji return
. . .
int main()
{
. . .
printf( "Dystans : " );
if( fgets( linia, MAKS_DL, stdin ) != NULL )
dystans = fabs( atof( linia ) );
else
{
printf( "\nBlad odczytu dystansu." );
return EXIT_FAILURE;
}
printf( "Paliwo : " );
if( fgets( linia, MAKS_DL, stdin ) != NULL )
paliwo = fabs( atof( linia ) );
else
{
printf( "\nBlad odczytu paliwa." );
return EXIT_FAILURE;
}
. . .
return EXIT_SUCCESS;
}
Copyright © Roman SimiÅ„ski Strona : 38
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  wykorzystanie rezultatu funkcji fgets
Pierwszy program w języku C  wykorzystanie rezultatu funkcji fgets
Testowanie rezultatu funkcji fgets  filtrowanie błędów
. . .
int main()
{
. . .
printf( "Dystans : " );
if( fgets( linia, MAKS_DL, stdin ) != NULL )
{
dystans = fabs( atof( linia ) );
printf( "Paliwo : " );
if( fgets( linia, MAKS_DL, stdin ) != NULL )
{
paliwo = fabs( atof( linia ) );
if( dystans != 0 )
printf( "Spalanie %4.2f l na 100 km", ( paliwo * 100 ) / dystans );
else
printf( "Nie dokonam obliczen dla takiego dystansu." );
}
else
printf( "\nBlad odczytu paliwa." );
}
else
printf( "\nBlad odczytu dystansu." );
printf( "\nNacisnij Enter by zakonczyc program..." );
. . .
}
Copyright © Roman SimiÅ„ski Strona : 39
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  defensywne podejście do wczytywania dystansu
Pierwszy program w języku C  defensywne podejście do wczytywania dystansu
Nie pozwalamy na wprowadzenie 0-ego dystansu
. . .
do
{
printf( "Dystans : " );
fgets( linia, MAKS_DL, stdin );
dystans = atof( linia );
if( dystans <= 0 )
printf( "Prosze wprowadzic prawidlowy dystans\n" );
}
while( dystans <= 0 );
Technika programowania defensywnego
. . .
Instrukcja iteracyjna do-while
do
do {
instrukcja ciÄ…g instrukcji
lub
while( wyrażenie ); }
while( wyrażenie );
Instrukcja do-while wykonuje się dopóty, dopóki wyrażenie jest prawdziwe.
W języku C wyrażenie jest fałszywe jeżeli ma wartość zero, każda wartość niezerowa
traktowana jest jako prawda.
Copyright © Roman SimiÅ„ski Strona : 40
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Pierwszy program w języku C  na zakończenie
Pierwszy program w języku C  na zakończenie
Pozostaje jeszcze jeden nierozwiÄ…zany problem
printf( "Dystans : " );
Co się stanie, gdy użytkownik
fgets( linia, MAKS_DL, stdin );
nie wpisze prawidłowej liczby?
dystans = fabs( atof( linia ) );
Należy sprawdzić, czy wczytany napis zawiera prawidłową liczbę. Ale tym zajmiemy się
pózniej... .
Copyright © Roman SimiÅ„ski Strona : 41
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Podsumowanie programu przykładowego
Podsumowanie programu przykładowego
Należy pamiętać, że:
Każdy program w języku C/C++ musi posiadać funkcję main. Od niej rozpoczyna się
wykonanie programu.
Funkcja main według standardu ANSI C powinna  zwracać wartość całkowitą,
stanowiącą kod zakończenia programu przekazywany systemowi operacyjnemu lub
procesowi  rodzicowi.
Każda funkcja posiada swoje ciało ujęte w nawiasy klamrowe { }.
Zakończenie wykonania funkcji następuje wraz z osiągnięciem klamry zamykającej
ciało funkcji lub po napotkaniu instrukcji powrotu z podprogramu  instrukcji
return. Wartość umieszczona po tej instrukcji stanowi rezultat funkcji.
Instrukcja return może wystąpić w ciele funkcji wielokrotnie, w miejscach
dozwolonych syntaktyką języka.
Zmienne wewnątrz funkcji wolno deklarować na początku każdego bloku. Na etapie
deklaracji zmienne mogą być inicjowane.
Copyright © Roman SimiÅ„ski Strona : 42
Podstawy i języki programowania Język C Aagodny start
Podstawy i języki programowania Język C
Podsumowanie programu przykładowego
Podsumowanie programu przykładowego
Należy pamiętać, że:
W języku C nie ma funkcji standardowych. Wszystkie funkcje pochodzą z bibliotek
lub sÄ… napisane przez programistÄ™.
Aby kompilator mógł sprawdzić poprawność wywołania funkcji bibliotecznych
wykorzystuje się pliki nagłówkowe. Zawierają one informacje o typie rezultatu
funkcji, parametrach i są włączane do kodu zródłowego programu dyrektywą
#include.
Wywołanie funkcji bez włączenia odpowiedniego pliku nagłówkowego nie spowoduje
błędu kompilacji (ang. error) a jedynie ostrzeżenie (ang. warning), a kod wynikowy
zostanie wygenerowany. Jednak, być może, wywołanie funkcji jest nieprawidłowe,
zatem i działanie programu może być niepoprawne.
W instrukcji if-else, przed słowem kluczowym else występuje średnik. W języku
C średnik nie rozdziela instrukcji, a kończy je.
Instrukcja iteracyjna do-while pozornie odpowiada pascalowej instrukcji repeat-
until. Różnica polega na interpretacji warunku  w do-while iteracja jest
przerywana gdy warunek przestanie być prawdziwy, w repeat-until iteracja
przerywana jest, gdy warunek zacznie być prawdziwy.
Copyright © Roman SimiÅ„ski Strona : 43


Wyszukiwarka

Podobne podstrony:
01 Wprowadzenie do programowania w jezyku C
Jezyk C Wprowadzenie do programowania jcwpro
08 wprowadzenie do programowania grafikiidu39
MudoL nr 1 wprowadzenie do programowania
Wstep do programowania w jezyku C wstpcp
WPROWADZENIE DO PROGRAMOWANIA
Wstep do programowania w jezyku C wstpch
Wstep do programowania w jezyku C wstpch

więcej podobnych podstron