Wstęp Programowanie w C dr inż. Stanisław Wszelak
Przeszłość i przyszłość składni programowania w C Ken Thompson Denis Ritchie Bjarne Stoustrup Zespoły programistów B C C++ C# 1969 rok Do SO UNIX 1972 rok C++ 1979 rok Od 2003 roku C# jest językiem skonstruowanym niejako jako konkurencja dla Javy dr inż. Stanisław Wszelak 2
Cech języka C Czytelny posiada łatwy kod do odczytywania (zbliżony do języka angielskiego) Łatwy w obsłudze prosta kompilacja i uruchamianie Przenośny programy są uruchamiane na różnych typach maszynach sprzętowych, pod warunkiem posiadania kompilatora Język wysokiego poziomu wymaga interpretera i kompilatora, np. język maszynowy jest językiem niskiego poziomu. Do zaimplementowania, czyli przetłumaczenia komend na chociażby taki kod: 2001:f523:c91d:001 (kod binarny) wymagany jest kompilator. Interpreter i kompilator tłumaczą instrukcje napisane w języku wysokiego poziomu na polecenia w języku maszynowym, zrozumiałym i wykonalnym dla komputera dr inż. Stanisław Wszelak 3
Kompilacja Kompilator języka C jest programem, który tłumaczy kod źródłowy napisany przez programistę do języka asembler, a następnie do postaci zrozumiałej dla komputera (maszyny cyfrowej) czyli do postaci ciągu zer i jedynek które sterują praca poszczególnych elementów komputera. Asembler to język niskiego poziomu, posługuje się zaledwie dwoma znakami cyfrowymi, 0 i 1, Asembler nie potrzebuje specjalnego środowiska. Programista asemblerowy jest podobny do pierwszoklasisty, który konstruuje słowa, wyrazy, znając pojedyncze literki języka. O ile alfabet języka naturalnego, którym to posługujemy się na co dzień, składa się z kilku dziesiątek znaków, o tyle alfabet języka Asembler ma zaledwie dwa cyfrowe znaki:0 i 1, zero i jedynkę. Do napisania programu asemblerowego wystarczy najzwyklejszy edytor. Cała informatyka opiera się na dwóch znakach 0 i 1. Napisany program asemblerowy w postaci tekstowej, poddawany jest asemblacji (półprodukt) pliki o rozszerzeniu OBJ. Następnie ów półprodukt przetwarza się do postaci wykonywalnej poprzez konsolidację (linkowanie). Po konsolidacji otrzymujemy gotowy do wykonania program typu COM lub EXE. Programy źródłowe napisane w języku C, C++ tłumaczy się do postaci programów wykonywalnych i kompilując się je. dr inż. Stanisław Wszelak 4
Narzędzia programisty w C 1. Komputer z dowolnym systemem operacyjnym (Linux, Windows) 2. Kompilator (firmy Borland, Microsoft Visual C++ R, itd.) 3. Edytor 4. Debugger (program, który umożliwia prześledzenie (określenie wartości poszczególnych zmiennych na kolejnych etapach wykonywania programu) linijka po linijce. Używa się go w celu określenia dlaczego nasz program nie działa po naszej myśli lub czemu program niespodziewanie kończy działanie bez powodu. Przykładowymi debuggerami sa: gdb pod Linuksem, lub debugger firmy Borland pod Windowsa. 5. Linker - program łączy wszystkie skompilowane pliki źródłowe i inne funkcje (np. printf, scanf) które były użyte w programie, a nie były zdefiniowane przez programistę w napisanych plikach ( dyrektywa #include). Linker jest to czasami jednym program, połączenie z kompilatorem. Wywoływany jest on na ogół automatycznie przez kompilator, w wyniku czego dostajemy gotowy program do uruchomienia. dr inż. Stanisław Wszelak 5
Zintegrowane Środowisko Programistyczne IDE Zamiast osobnego kompilatora i edytora, linkier, można wybrać Zintegrowane Środowisko Programistyczne IDE (Integrated Development Environment), IDE jest zestawem wszystkich programów, które potrzebuje programista, - najczęściej z interfejsem graficznym. IDE zawiera kompilator, linker i edytor, z reguły również debugger. Bardzo popularny IDE to płatny Microsoft Visual C++ (Visual Studio 2005, 2010) Typy: IDE free software IDE commercial software dr inż. Stanisław Wszelak 6
Darmowe IDE 1. CODE:BLOCKS 10.05 z MinGW 4.2.1 Code::Blocks to wieloplatformowe IDE dla programistów C/C++. Wspiera wiele kompilatorów (GCC, Borland C++, Microsoft Visual C++ i inne). Posiada wbudowany, zaawansowany i wydajny debugger. Ponadto, umożliwia importowanie projektów z Dev-C++ oraz Microsoft Visual C++. Interfejs: - prosty w obsłudze, - rozbudowana pomoc ułatwia używanie programu, - kolorowana składnia, - automatyczne uzupełnianie w trakcie pisania kodu. Elastyczna budowa pozwala na dodawanie pluginów, sprawiając, że środowisko jest stale rozwijane przez dużą społeczność. dr inż. Stanisław Wszelak 7
2. Open Watcom 1.9 (80 MB) Środowisko programistyczne do tworzenia 16/32 bitowych aplikacji. Obsługa C, C++, Fortran. Posiada rozbudowany zbiór narzędzi co jest jest dużym plusem Open Watcom. 3. Dev-C++ 4.9.9.2 Dev-C++ zintegrowane środowisko programistyczne, obsługujące języki C i C++, na licencji GPL, dla systemów rodziny Windows i Linux. Jest zintegrowany z MinGW, czyli z windowsowym portem kompilatora GCC. Dev-C++ wykorzystuje tzw. DevPaki. Są to rozszerzenia programu, pozwalające mu korzystać z różnych bibliotek, szablonów i narzędzi, np. z DirectX-a, z biblioteki Allegro, OpenAL czy wxwidgets. Dla : Win XP/Windows Vista/Win 2000/Win 98/Win Me/Win 95 Wymagania: Procesor: Pentium 233MHz lub odpowiednik; RAM: 32MB; 45MB wolnego miejsca na dysku Rozmiar pliku: 8.9MB dr inż. Stanisław Wszelak 8
4. C++ Builder Obecnie dostępna jest wersja 2007 tego środowiska w kilku edycjach. 30-dniowa wersja testowa: Trial przeznaczona jest do zastosowań niekomercyjnych (przede wszystkim edukacyjnych), można ją pozyskać bezpłatnie. Obecnie mamy wersję 2010 dr inż. Stanisław Wszelak 9
Laboratorium nr I Kompilacja i konsolidacja programów e-mail:stanislaw@wszelak.com
Kompilator to program, który tłumaczy kod pisany przez programistę na język rozkazów danego komputera. Kompilator czyta tekst z kodem, raportuje błędy i wytwarza plik wynikowy. Kompilatory są częścią składową IDE Pisany program w edytorze zapisywany jest w pliku, któremu nazwę nadaje użytkownik, rozszerzenie nadawane jest automatyczne c w przypadku korzystania z IDE : nazwa_pliku.c 1. Uruchamianie kompilatorów 1.1 Ze zintegrowanego środowiska programistycznego (IDE) Bardzo prosta, przycisk Compile lub Compile & Run (dla Dev C++) 1.2 Z wiersza poleceń: gcc -o nazwa_nowgo_pliku plik_kompilowamy.c dr inż. Stanisław Wszelak 11
Jeśli plikiem wykonalnym będzie stokrotka.exe, a kompilowanym babsztyl.c, to komenda wydana kompilatorowi jest następująca: gcc o stokrotka babsztyl.c (oczywiście znając lokalizację kompilatora) Aby wymusić na GCC nazwę pliku wynikowego (wykonywalnego), podajemy parametr -o <nazwa> dr inż. Stanisław Wszelak 12
2. Lokalizacja kompilatora, bibliotek 2.1 gcc.exe (kompilator), w folderze bin 2.2 Pliki nagłówkowe, w folderze include 2.3 Pliki obiektowe, w folderze lib Utworzono katalog: Moje_pro, w celu składowania plików źródłowych dr inż. Stanisław Wszelak 13
Laboratorium nr I Cechy charakterystyczne programowania w C
3. Plików nagłówkowe (wsadowe) Gotowe dyrektywy jako pliki wsadowe kompilatora lub gotowe procedury wcześniej zdefiniowane przez programistę. Dodawanie plików nagłówkowych odbywa się za pomocą dyrektywy: #include (dołącz). #include<nazwa_pliku> Ta dyrektywa powoduje, ze przed procesem kompilacji danego plikuźródłowego, deklaracje funkcji z pliku nagłówkowego zostają dołączone do naszego kodu celem zweryfikowania poprawności wywoływanych funkcji. dr inż. Stanisław Wszelak 15
4. Lokalizacja domyślnych plików nagłówkowych Domyślne pliki nagłówkowe znajdują się w katalogu z plikami nagłówkowymi kompilatora. Lokalizacja może być różna, w zależności od wybranej lokalizacji podczas instalacji IDE. Zazwyczaj jest to katalog INCLUDE (podobnie jak dyrektywa), np. C:\Borland\BCC55\INCLUDE dr inż. Stanisław Wszelak 16
4.1. Deklaracja standardowych plików nagłówkowych < > #include <studio.h> 4.2. Deklaracja własnych plików nagłówkowych #include my_file_header_1.h #include my_file_header_2.h" Pliki maja rozszerzenie *.h, od słowa nagłówek (header) Uwaga!. Język C jest wrażliwy na wielkość liter: main() i Main() to dwie różne nazwy, różne funkcje dr inż. Stanisław Wszelak 17
5. Funkcja main() - główna Funkcję tę musi zawierać każdy program. W niej zawiera się główny kod programu, przekazywane są do niej argumenty, z którymi wywoływany jest program (jako parametry argc i argv). Można ja wstawić w dowolnym miejscu pisanego kodu, jednak proces rozpoczyna się od wykonania tej funkcji. Można powiedzieć, że jest to tzw. function body. We wnętrzu tej funkcji następuje wywołanie funkcji lub procedury, w tym przypadku zostaje przywołana funkcja biblioteczna printf() wydrukuje zawartość. Jeśli wszystkie instrukcje zawarte w ciele funkcji main() zostały wykonane, to program zostaje zakończony. Jeśli funkcja main() zwraca wartość 0 to oznacza, że program wykonał się prawidłowo, im większa zwrócona wartość tym większy błąd dr inż. Stanisław Wszelak 18
5.1. Anatomia poznanych funkcji w języku C 1. Instrukcja 2. Blok instrukcji (poczatek i koniec) 3. Nazwa funkcji i jej argumenty 4. Cialo funkcji 2pole_kola pole-2kola pole 2kola.pole_2kola pole+2kola _pole_2kola pole_*2kola pole_*2kola -pole_kola2 pole_2kola Prawidłowa nazwa funkcji: 1. Nazwa nie może zaczynać się od: cyfry, znaku + (plus),.(kropki), *(asterisk) 2. Nazwa funkcji nie może zawierać: +, -, (apostrof), $, spacji 3. Nazwę funkcji piszemy małymi literami (printf, close_all_files) Uwaga! Nie używać polskich znaków dr inż. Stanisław Wszelak 19
int main() int oznacza, ze funkcja zwróci wartość typu integer (tzn. przyjmie wartość po zakończeniu). W przypadku main będzie to kod wyjściowy programu. W () określa się parametry programu void main() Void pusto, brak parametrów, słowo kluczowe języka C, może pojawiać się przed nazwą funkcji, to oznacza, że funkcja nie zwraca żadnej wartości int main(void) dr inż. Stanisław Wszelak 20
6. Funkcje: return, exit return (wartość); określa wartość jaką zwróci funkcja (program). Liczba 0 zwracana przez funkcję main() oznacza, że program zakończył się bez błędów; błędne zakończenie często (choć nie zawsze) określane jest przez liczbę jeden. exit(), zamiast return, służy również do zakończenia programu. Aby można było zastosować funkcję exit() należy połączyć plik: stdlib.h Pamiętajmy!!!! kod funkcji umieszcza się e w nawiasach: polecenia kończymy średnikiem ; { }, a wszystkie 7. Funkcja printf( łańcuch znakowy ); Funkcja wyświetla zawartość zadeklarowana w obszarze Obsługiwana jest przez bibliotekę stdio.h dr inż. Stanisław Wszelak 21
8. Znak specjalny sekwencja wyjścia \ W języku C za bacslash em występują: \n przejście do nowego wiersza (LF) \f przejście do nast. strony \r powrót na pocz. bierz. wiersza (CR) \t -tabulacja \a - dźwięk \ - kontynuacja łańcucha \ cudzysłów \ apostrof \? znak zapytania dr inż. Stanisław Wszelak 22
\n przejście do nowego wiersza a) z wielokrotnym wykorzystaniem funkcji printf() b) z jednokrotnym wykorzystaniem funkcji printf() dr inż. Stanisław Wszelak 23
\ Kontynuacja łańcucha dr inż. Stanisław Wszelak 24
Zadanie 1-1. Napisz program, który wyświetli za pomocą czterech funkcji printf(): w pierwszej linii Twoje: imię i nazwisko w drugiej nazwę uczelni: UKSW Warszawa ul. Woycickiego 4 w trzeciej kod pocztowy: 04-815 w czwartej kierunek studiów: Informatyka (cudzysłów) Zastosuj wcięcie z lewej z odstępem jednej tabulacji, przykład rys.1.1 Rys. 1.1. Okno z programu 1-1 dr inż. Stanisław Wszelak 25
Kod zadania 1-1 dr inż. Stanisław Wszelak 26
Zadanie 1-2. Zmodernizuj poprzedni kod, wykorzystaj jedną funkcję printf() do wyświetlenia Twoich danych (rys. 1.2): w pierwszej linii imię i nazwisko, w drugiej UKSW Warszawa ul. Woycickiego 4, w trzeciej 04-815 (kod pocztowy), w czwartej Informatyka Rys. 1.2. Okno z programu 1-2 dr inż. Stanisław Wszelak 27
Kod zadania 1-2 Zadanie 1-3. Napisz program, który po wyświetleniu komunikatu z zadania 1-2 wymusi sygnał dźwiękowy 10 impulsowy, po czym wydrukuje komunikat ze znakiem zapytania: Było słychać? dr inż. Stanisław Wszelak 28
Laboratorium I Pojęcie stałej i zmiennej, operatory arytmetyczne, instrukcja podstawienia
1. Deklaracja zmiennych: typ nazwa_zmiennej; Deklaracja nie przypisuje wartości zmiennej, tylko przydziela jej adres w pamięci (rezerwuje dla niej miejsce) Zmienna to fragment pamięci o ustalonym rozmiarze z własnym identyfikatorem 1.1 Typ integer int nazwa; Zapis liczb typu Integer: a). Dziesiętny int wynik_1; int wynik_2; int wynik_3; lub równoważnie: Int wynik_1, wynik_2, wynik_3; b). Ósemkowy zapis 016, 010 2, 32, 45, 100, 256 itd. c). Szesnastkowy zapis 0x0af, 0x4e dr inż. Stanisław Wszelak 30
W zależności od rejestru procesora a tym samym od kompilatora i systemu operacyjnego długość liczb całkowitych może wynosić 16 32, 64 bity. Dla 32 bitowego rejestru(4 bajty) długość wynosi od 2 31-1 (2147483647) do -2147483648. Samo int bez wskaźnika informuje kompilator, że ma rezerwować nie mniej niż 16 bitów pamięci. Ze wskaźnikiem long int informuje, że rezerwowa pamięć nie krótszą niż 32 bity dotyczy starych kompilatorów. Specyfikatorem konwersji (convrsion specfiers) nakazującym wyświetlenie funkcji printf w typie int (integer) jest %d dr inż. Stanisław Wszelak 31
Zadanie 1-4 Zadeklaruj cztery zmienne typu integer i podstaw dla nich takie wartości: wiek = 21, wzrost = 172, waga = 72, rok_urodzenia = 1989. Wydrukuj poprzez funkcję printf() swoje imię i nazwisko oraz dane zapisane w tych czterech zmiennych (rys. 1.3) Rys. 1.3 Zadeklaruj zmienne z błędem, np. wzrost (172.5) i przeprowadź kompilację, następnie wagę określ powyżej górnej granicy typu int (wybierz taka liczbę). Wydrukuj dane. Na tej podstawie upewnij się co do rozmiaru rejestru. dr inż. Stanisław Wszelak 32
Kod zadania 1-4.c dr inż. Stanisław Wszelak 33
1.2. Typ floating point numer float Pływający przecinek - rzeczywiste długości 4 bajtów, 6 miejsc po przecinku float wynik_1; float wynik_1; float wynik_1; lub float wynik_1, float wynik_1, float wynik_1; np. 3.14, 9.81, 0.45 Często liczby te wyposażone są w przedrostek na końcu deklaracji 3.14f, 9.81f, 0.45F W przeciwieństwie do liczb całkowitych, przy dzieleniu dwóch liczb zmiennoprzecinkowych otrzymujemy trzecią liczbę zmiennoprzecinkową, część ułamkowa pozostaje i nie jest obcinana ani nie jest ignorowana Specyfikatorem konwersji (convrsion specfiers) nakazujacym wyswietlenie funkcji printf w typie float jest %f dr inż. Stanisław Wszelak 34
Zadanie 1-5 Zadeklaruj pięć zmiennych typu float, które zwrócą wyniki dzielenia następujących par liczb: 45.00/2.00, 45/2 3.55/2 6/1.33 1.2/0.25 Wydrukuj poprzez funkcję printf() wyniki działania, trzy pierwsze wyniki zaokrąglij do trzech miejsc po przecinku, kolejne dwa wyniki pozostaw w wydruku domyślnym. dr inż. Stanisław Wszelak 35
1.3. double - liczby zmiennoprzecinkowe podwójnej precyzji Oznacza to, ze liczba taka zajmuje zazwyczaj w pamięci dwa razy więcej miejsca niż float (np. 64 bity wobec 32 dla float) i ma dwa razy lepsza dokładność. Domyślnie ułamki wpisane w kodzie są typu double. 1.5, 33.24, itp. Możemy to zmienić dodając na końcu literę f 1.5f, 33.24f (float) Zadanie-1-6.c Zadeklaruj dwie zmienne a i b, a jako float zaś b jako double. Zmiennym przypisz jednakowe działanie matematyczne np. 1233.33f / -33.3. Wydrukuj wyniki działań z 10-cioma i 6-cioma miejscami po przecinku. dr inż. Stanisław Wszelak 36
Dla typów: float i doble liczby można przedstawiać w systemie wykładniczym Liczba przedstawiana jest w postaci mantysy i wykładnika. Cecha i mantysa rozdzielana są literą e lub E 3e2 to 3 10 2 = 300 25 to 2.5e1 1.5e-2 to 1,5 10-2 = 0,015 1000 to 10e2-4e2 to -4 10 2 = -400-5,2 to -5.2e0 Specyfikatorem konwersji (convrsion specfiers) nakazujacym wyswietlenie funkcji printf w typie double jest %e lub %E dr inż. Stanisław Wszelak 37
2. Deklaracja stałych Stałe podobnie jak zmienne przypisuje się wartości bez możliwości zmiany Stałe deklarujemy: 1. const int nazwa_zmiennej = wartosc - metoda mniej popularna w C 2. #define pi 3.14 - pi to symbol stałej, zaś 3.14 to przypisana wartość stałej Zadeklaruj stałe zamiast zmiennych z zadania 1-6.c i dokonaj kompilacji programu. dr inż. Stanisław Wszelak 38
3. Operatory + -Addition - -Substraction * -Multiplication / -Division % -Modulos Operator dokonuje dzielenia z resztą np. 20%3 = 2, 100%5 = 0, 11%2 = 1 dr inż. Stanisław Wszelak 39
4. Wyrażenie Kombinacja stałych, zmiennych i operatorów w wyrażeniach matematycznych. obwod_kola = 2 * l_pi * r ; Zadanie-1-7. Oblicz pole koła, deklarując liczbęπ jako stałą wartość (poprzez deklarację #define, promień przyjmij dowolny jako float. Podobnie oblicz objętość walca (dla r, h). Zadanie-1-8. Dodaj dwie liczby w formacie hexadecymalnym, wydrukuj liczby jak i ich sumę w systemie dziesiętnym i hexadecymalnym. dr inż. Stanisław Wszelak 40
Kod zadania 1-7.c dr inż. Stanisław Wszelak 41
Przykład : const typ nazwa = wartość dr inż. Stanisław Wszelak 42
Przykład operacji na liczbach innych niż dziesiętne Zadanie-1-8. Wykorzystując operatory arytmetyczne (+, -, *) wykonaj operacje arytmetyczne na dwóch liczbach zapisanych w systemie szesnastkowym. Wyniki działań jak i wartości zmiennych przedstaw w formacie dziesiętnym i szesnastkowym. dr inż. Stanisław Wszelak 43
5. Funkcja scanf() Funkcja scanf() w przeciwieństwie do printf(), nie wyświetla niczego na ekranie. Funkcja scanf() należy do biblioteki stdio.h i jest funkcja wejścia, która czyta informacje z klawiatury a następnie przydziela te informacje odpowiednim zmiennym. Oznaczenia są podobne takie jak przy printf(), czyli: scanf("%i", &liczba); wczytuje liczbę typu int, scanf("%f", &liczba); liczbę typu float, scanf("%s", tablica_znaków); ciąg znaków. W ostatnim przypadku nie ma etki? Otóż, gdy podajemy jako argument do funkcji wyrażenie typu tablicowego zamieniane jest ono automatycznie na adres pierwszego elementu tablicy. Zadanie 1-9 Oblicz objętość walca, wprowadzając promień i wysokość z konsoli. Liczbę pi zadeklaruj jako stałą. Wyprowadź na ekran komunikaty jak na poniższym rzucie ekranu: dr inż. Stanisław Wszelak 44
Kod zadania-1-9 dr inż. Stanisław Wszelak 45
Zadanie1-10 Napisz program, który z danych wejściowych (z konsoli) jakimi są kwota brutto i stawka podatku, wyliczy kwotę netto i naliczony podatek. Dane wejściowe: kwota brutto (float) stawka podatku (float) Dane wyjściowe: kwota netto, podatek dr inż. Stanisław Wszelak 46
Kod zadania 1-10.c dr inż. Stanisław Wszelak 47
6. Funkcja puts() przyjmuje jako swój argument ciąg znaków, który następnie wypisuje na ekran kończąc go znakiem przejścia do nowej linii podobnie jak printf( \n ). Proszę zauważyć, że funkcja ta nie współdziała ze zmiennymi dr inż. Stanisław Wszelak 48
7. Rzutowanie Rzutowanie to konwersja danej jednego typu na daną innego typu, czyli zamiana jednego typu danych na inny typ. Konwersja może być: - niejawna (domyślna konwersja przyjęta przez kompilator), - jawna (podana explicite przez programistę). float a = 6; pewien sposób rzutowania niejawnego Przykład mamy dwie liczby: int a =5; int b=9; Chcemy podzielić jedna przez drugą, w wyniku dzielenia otrzymamy wynik 0 Jeśli dokonamy rzutowania z int na float to operacja powiedzie się Zapiszmy typ jeszcze raz: int a =5; i zrzutujmy ją float a_f = (float)a; W zmiennej a_f została zapisana zmienna typowana jako integer. Podobnie dla drugiej zmiennej: float a_b = (float)b dr inż. Stanisław Wszelak 49
Zadania do samodzielnego rozwiązania: Zadanie1 : Napisać program obliczający temperaturę w stopniach C, gdy dana jest temperatura w stopniach F (Fahrenheita), wiedząc że przelicznik jest: 5 C = ( F 32) 9 Zadanie2 : Napisać program obliczający temperaturę w stopniach F, gdy dana jest temperatura w stopniach C (Celsjusza), korzystając z poprzedniego przelicznika. Temperaturę w stopniach Celsjusza deklarować z konsoli dr inż. Stanisław Wszelak 50
Kod zadania domowe-2 dr inż. Stanisław Wszelak 51
Przykład: forsownie zmiennej typu int na typ float dr inż. Stanisław Wszelak 52
Przykład: dr inż. Stanisław Wszelak 53