INFORMATYKA Studia Niestacjonarne Elektrotechnika Wydział Elektrotechniki i Informatyki dr inż. Michał Łanczont Wydział Elektrotechniki i Informatyki p. E419 tel. 81-538-42-93 m.lanczont@pollub.pl http://lanczont.pollub.pl Wprowadzenie C imperatywny, strukturalny język programowania wysokiego poziomu stworzony na początku lat siedemdziesiątych XX w. przez Dennisa Ritchiego do programowania systemów operacyjnych i innych zadań niskiego poziomu. imperatywny - paradygmat programowania, który opisuje proces wykonywania jako sekwencję instrukcji zmieniających stan programu, wyraża żądania jakichś czynności do wykonania. 2 1
Wprowadzenie Język C był dominującym narzędziem w którym tworzono systemy operacyjne i aplikacje W 1983 roku ANSI powołało komitet X3J11 w celu ustanowienia standardu języka C. Standard został zatwierdzony w 1989 roku jako ANSI X3.159-1989 "Programming Language C", standardowe C lub C89. 3 Wprowadzenie W 1990 roku standard ANSI C został zaadoptowany przez ISO jako norma ISO/IEC 9899:1990 wersja C90. W 1999 roku ISO opublikowało normę ISO/IEC 9899:1999 wersja C99. Ostatnia norma została opublikowana w 2011 roku pod nazwą ISO/IEC 9899:2011 wersja C11 4 2
Literatura 1. S. G. Kochan, Język C Kompedium wiedzy. Wydanie IV, Helion 2015 2. B. W. Kernighan, D. M. Ritchie, Język ANSI C. Programowanie. Wydanie II, Helion 2010 3. S. Prata, Język C. Szkoła programowania, Wydanie VI, Helion 2016 5 Zakres wykładu Kompilatory Edytory i środowiska dedykowane Systemy liczbowe Zmienne i stałe Procedury We/Wy printf(), puts(), putchar() scanf(), gets(), getchar() Liczby zespolone Działania i funkcje matematyczne Liczby losowe Komentarze 6 3
Kompilatory Podstawowy kompilator dla języka C jest dostępny w GCC, który jest zestawem kompilatorów dla systemów linux owych (C, C++, Objective-C, Fortran, Ada, i Go) Dla systemów Windows można zainstalować kompilator za pomocą narzędzi MinGW lub CygWin Wraz z dedykowanymi środowiskami programistycznymi instalowany jest dedykowany im kompilator (Visual Studio, Borland C++, Dev C++ 7 Kompilator i Środowisko programowania Wykład i laboratorium oparte są o zestaw: 1. Kompilator MinGW http://www.mingw.org 2. Dedykowany edytor Code::Blocks http://www.codeblocks.org/ Edytor zapewnia pełne wsparcie przy programowaniu (system podpowiedzi składni), oraz zapewnia bardzo dobre wsparcie przy analizie kodu w czasie procesu debugowania. 8 4
Code::Bloks http://www.codeblocks.org/ Aktualna wersja 17.12 wraz z MinGW (v 5.1.0, 32 bit) Wieloplatformowe, zintegrowane środowisko programistyczne IDE, na licencji GNU Wspiera programowanie w: C/C++ Fortran Rozszerzanie funkcjonalności poprzez pluginy Wspiera rysowanie schematów blokowych Nassi-Shneiderman a Dobry debuger 9 Alternatywne IDE Dev-C++ - Zintegrowane środowisko programistyczne IDE wpierające programowanie w C i C++, zintegrowane z kompilatorem MinGW (port kompilatora GCC na windows a) Atom Rozbudowany edytor tekstowy wspierający programowanie w większości popularnych języków programowania, możliwość rozszerzania funkcjonalności poprzez pluginy Notatnik też można pisać programy 10 5
Środowisko Code::Blocks 2. 3. 4. 5. 6. 8. 1. 1. Okno edycyjne kodu, schematów 2. Menu 3. Narzędzia plikowe 4. Pasek kompilacji 5. Pasek debugowania 6. Pasek narzędzi schematów NS 7. Okno logów 8. Okno zarządzania projektami 7. 11 Środowisko Code::Blocks Tworzenie nowego pliku (projektu, schematu NS itp.) Zapisywanie projektu Zamykanie projektu Drukowanie 12 6
Środowisko Code::Blocks Menu i pasek narzędzi BUILD 1. Kompilowanie 2. Budowanie pliku wykonywalnego 3. Uruchamianie i zatrzymywanie programu 13 Menu i pasek DEBUGERA 1. Analiza działania kodu 2. Oznaczanie breakpoint ów 3. Okna z danymi wspomagającymi analizę algorytmu 4. Sterowanie analizą A. Wchodzenie do funkcji B. Omijanie funkcji 14 7
Debuger Przy instalacji z dołączonym kompilatorem MinGW konieczne jest ręczne wskazanie pliku debugera. 15 Systemy liczbowe System dwójkowy (system binarny, pozycyjny) liczby zapisywane za pomocą dwóch cyfr 0 i 1. Podstawą systemu jest liczba 2. System dziesiętny system pozycyjny zapisywany za pomocą cyfr od 0 do 9, podstawą systemu jest cyfra 10 System szesnastkowy system hexadecymalny, o podstawie 16, do zapisu wykorzystuje się cyfry 0 do 9 i litery A, B, C, D, E i F 16 8
Binarny na dziesiętny 53 53:2=26 reszty 1 26:2=13 reszty 0 13:2=6 reszty 1 3:2=3 reszty 0 3:2=1 reszty 1 1:2=0 reszty 1 110101 1 1 0 1 0 1 5 4 3 2 1 0 (1*2 5 )+(1*2 4 )+(0*2 3 )+(1*2 2 ) +(0*2 1 )+(1*2 0 )= 32+16+4+1= 110101 53 17 Hexadecymalny na 0 0 0000 12188 101110101101 1 1 0001 12188:16=761 reszty 12 C 1011 1010 1101 2 2 0010 761:16=47 reszty 9 3 3 0011 47:16:2 reszty 15 F B A D 4 4 0100 2:16=0 reszty 2 5 5 0101 BAD 6 6 0110 2F9C 2 1 0 7 7 0111 2 F 9 C 8 8 1000 3 2 1 0 9 9 1001 10 A 1010 11 B 1011 12 C 1100 13 D 1101 14 E 1110 (2*16 3 )+(F*16 2 )+(9*16 1 )+(C*16 0 )= (2*16 3 )+(15*16 2 )+(9*16 1 )+(12*16 0 )= (2*4096)+(15*256)+(9*16)+(12*0)= 8192+3840+144+12= 12188 (11*16 2 )+(10*16 1 ) +(13*16 0 )= (11*256)+(10*16) +(13*1)= 2816+160+13= 2989 15 F 1111 12188 2989 18 9
19 Nazwa pliku Katalog roboczy Nadawane automatycznie Nadawane automatycznie 20 10
Proces tworzenie 1. Tworzenie pisanie kodu źródłowego 2. Kompilacja sprawdzenie poprawności kodu 3. Konsolidacja tworzenie pliku wynikowego 4. Wykonanie i testowanie programu 21 Struktura ogólna kodu w C 1. #include <*****>- włączenia bibliotek 2. #define ****** - stałe, makro 3. Zmienne globalne 4. Prototypy funkcji 5. Funkcja główna - main() 6. Pozostałe funkcje instrukcje 22 11
#include <stdio.h> #include <stdlib.h> int main() { printf("hello world!\n"); return 0; } 23 1. 2. 24 12
Typy danych w C Podstawowe typy danych Typ (dla systemu 32bit) Zawartość Wielkość w bitach Zakres wartości char Znak 8-128 127 int float double bool Liczba całkowita Liczba rzeczywista Liczba rzeczywista Zmienna logiczna 32-2 147 483 648 2 147 483 647 32 ± 1.2 * 10-38 3.4 * 10 38 64 ± 2.2 * 10-308 1.8 * 10 308 8 true (1), false (0) Typ zmiennej logicznej wymaga dodania biblioteki <stdbool.h> 25 Modyfikatory typów danych 1. signed 2. unsigned Ustala czy dany typ danych obejmuje zakres liczb dodatnich i ujemnych czy tylko dodatnich. Domyślnie przyjmowany jest typ signed (±), łączy się ze zmienną typu int i char. 3. short Zmniejsza o połowę rozmiar pamięci przydzielanej dla zmiennej, łączy się ze zmienną int. 4. long Zwiększa rozmiar pamięci przydzielanej dla zmiennej, łączy się z int i double. 26 13
Zmodyfikowane typy danych Lp Typ Wielkość w bit Zakres 1 signed char 8-128 127 2 unsigned char 8 0 255 3 short int 16-32 768 32 767 4 unsigned short int 16 0 65 535 5 signed int 32-2 147 483 648 2 147 483 647 6 unsigned int 32 0 4 294 967 295 7 signed long int 32-2 147 483 648 2 147 483 647 8 unsigned long int 32 0 4 294 967 295 9 long double 80 3.4 * (10-4932 ) 1.2 * (10 4932 ) 27 Deklaracja zmiennych Zmienne w języku C mogą być deklarowane jako globalne lub lokalne Zmienne globalne definiuje się poza obszarem funkcji, na początku kodu Dostęp do zmiennej globalnej jest z poziomu każdej funkcji, można jej używać i zmieniać zawartość 28 14
Deklaracja zmiennych Zmienne lokalne definiuje się wewnątrz funkcji Zmienna lokalna jest widoczna tylko wewnątrz funkcji w której została zdefiniowana Zmienna zadeklarowana bez wartości początkowej w momencie definiowania przyjmuje wartość losową 29 Deklaracja zmiennych Deklaracja zmiennej typ_zmiennej nazwa zmiennej; int x; double y,z; Deklaracja zmiennej z przypisaniem wartości początkowej int x,y=10; char tekst[]= Alfa, T= W,C; Deklaracja stałej conts float PI=3.1415; #DEFINE PI 3.1415 30 15
Słowa kluczowe Nazwy użyte dla słów kluczowych są zastrzeżone i nie mogą być stosowane do nazw zmiennych. auto double inline static break else int struct case enum long switch char extern register typedef complex float restrict union cont for return unsigned continue goto short void default if signed volatile do imaginary sizeof while 31 Operatory w C 1. Operatory arytmetyczne o +, -, *, / - podstawowe działania o % - dzielenie z resztą 2. Operatory przypisania o = - x=2; o += - x+=2; - x=x+2; o -= - x-=2; - x=x-2; o *= - x*=2; - x=x*2; o /= - x/=2; - x=x/2; o %= - x%=2; - x=x%2; 32 16
Operatory w C Operatory inkrementacji i dekrementacji o x++ - inkrementacja zmiennej po wyliczeniu wyrażenia o ++x - inkrementacja zmiennej przed wyliczeniem wyrażenia o x-- - dekrementacja zmiennej po wyliczeniu wyrażenia o --x - dekrementacja zmiennej przed wyliczeniem wyrażenia int x,y=1; a) x=++y; //x=2, y=2 b) x=y++; // x=1, y=2 33 Operatory w C 1. Operatory relacji o == - równe o!= o <, > o <=, >= - różne - mniejsze, większe - mniejsze lub równe, 2. Operatory logiczne o && - koniunkcja (AND) o o! - alternatywa (OR) - negacja (NOT) 34 17
Wyjścia-Wyjścia Program komputerowy komunikuje się z użytkownikiem za pomocą standardowych portów wejścia-wyjścia Wejścia: Klawiatura Dysk (plik) Myszka (inne urządzenie wskazujące) Wyjścia: Ekran monitora Dysk (plik) drukarka 35 Operacje wyjścia - printf Standardowa procedura wyjściowa wysyłająca sformatowane dane w standardowe wyjście Funkcja wymaga biblioteki stdio.h include <stdio.h> printf( tekst, arg_1, arg_2, ); tekst stała łańcuchowa umieszczona w zawierająca: Znaki wysyłane na ekran Kody formatujące sterujące wyświetlaniem kolejnych argumentów Znaki kodowe sterujące przepływem wyświetlanego tekstu Argumenty zmienne i stałe przekazywane do wyświetlanego tekstu 36 18
Operacje wyjścia - printf Tekst wysyłany na port wyjściowy (ekran) jest łańcuchem tekstowym Do funkcji printf() może być wprowadzony jako tekst w lub jako tablica znakowy typu char Umieszczanie zawartości zmiennych w wysyłanym tekście realizowane jest przez kody formatujące 37 Operacje wyjścia - printf Kody formatujące: %c - znak z zmiennej (char) %s - ciąg znakowy (char[]) %i - liczba całkowita (int) %hi - liczba całkowita (short int) %hu - liczba całkowita (unsigned short int) %li - liczba całkowita (long, unsigned long) %u - dodatnia liczba całkowita (unsigned int) %f - liczba rzeczywista (float, double) %Ld - rozszerzona liczba rzeczywista (long double) %e liczba zmiennoprzecinkowa x.xxxxxxe±xxx %g skrócona forma liczby rzeczywistej 38 19
Operacje wyjścia - printf Znaki specjalne o Niektóre znaki nie mogą być wyświetlone w sposób standardowy o \a alarm (dźwięk) o \b cofa kursor o jeden znak o \r kursor na początek wiersza o \n przejście do nowego wiersza o \t tabulacja o Znaki specjalne umożliwiają sterowanie położeniem kursora w konsoli o \, \, \\, \? znaki specjalne 39 Przykład 1 40 20
Operacja wyjścia: puts(), putchar() Język C dostarcza narzędzi umożliwiających wysyłanie tekstu i znaków na ekran alternatywnych do printf puts() wysyła na ekran ciąg tekstowy zakończony domyślne znakiem nowej linii putchar() wysyła na ekran pojedynczy znak 41 Operacje wejścia - scanf Standardową procedurą wejściową, pobierającą dane od użytkownika jest scanf() scanf( kody zmiennych, &zm1,&zm2 ); Lista kodowych znaków formatujących definiująca typy oczekiwanych do wprowadzenia zmiennych Dla każdej zmiennej pobieranej przez scanf musi zostać podany kod formatujący, podobnie jak w procedurze wyjściowej printf 42 21
Operacje wejścia - scanf &zm* - lista zmiennych pobierających wartości z procedury scanf Znak & jest znakiem wymaganym przed nazwą zmiennej, wskaźnika do zmiennej int x; float y; scanf( %i, &x); scanf( %i %f,&x,&y); 43 Przykład 2 44 22
Operacje wejścia: gets(), getchar() Język C dostarcza alternatywne funkcje do scanf() umożliwiające pobranie danych od użytkownika Funkcja getchar() umożliwia pobranie pojedynczego znaku z wejścia i przypisanie go do zmiennej typu int Funkcja getchar() jest wykorzystywany jako zatrzymanie działania programu w oczekiwaniu na naciśnięcie dowolnego klawisza Funkcja gets() pobiera od użytkownika ciąg znaków i przypisuje ją do tablicy znakowej 45 Arytmetyka w C Istotne jest stosowanie właściwych typów danych do stosowanych w programowanej aplikacji kodzie Język C dostarcza dwóch podstawowych typów danych liczbowych: Liczby całkowity int Liczby rzeczywiste float 46 23
Arytmetyka w C Typ całkowity int int a=25; int b=2; int c; c=a/b*b; Wynik działania: 25/2*2=24 Typ rzeczywisty float float a=25; float b=2; float c; c=a/b*d; Wynik działania 25/2*2=25 47 Konwersja między typami Język C dostarcza narzędzi pozwalających na dokonanie konwersji pomiędzy typami int a float Działania takie są czasem konieczne przy wykonywaniu działań arytmetycznych zgodnie z oczekiwaniem programisty lub przy stosowaniu niektórych funkcji i procedur wymagających sprecyzowanego typu danych na wejściu Konwersja realizowana jest poprzez umieszczenie przed wybraną zmienną lub działaniem wybranego typu danych w nawiasie (int) lub (float) 48 24
Konwersja pomiędzy typami Typ całkowity int int a=25; int b=2; int c; c=(float)a/b*b; Wynik działania: 25/2*2=25 Typ rzeczywisty float float a=25; float b=2; float c; c=(int)(a/b)*d; Wynik działania 25/2*2=24 Pokazaną konwersję typów można z powodzeniem stosować wewnątrz funkcji wyjścia printf() 49 Przykład 4 Przykład obliczeń na liczbach rzeczywistych i całkowitych 50 25
printf liczby rzeczywiste Procedura printf() umożliwia sterowanie formą wyświetlania liczb rzeczywistych Pomiędzy znakiem % a kodem formatujący można zamieści definicję wyświetlania liczby rzeczywistej Definiuje się liczbę znaków oraz liczbę znaków po przecieku w postaci %X.Xf printf( Wynik to x=%6.3f\n,x); Wynik to x=123.456 51 Przykład 4 Napisz program przeliczający temperaturę podaną w stopniach Fahrenheita (F) na skalę Celcjusza (C) Przeliczanie realizowane jest zgodnie z równaniem: C=(F-32)/1.8 52 26
Przykład 4 53 Liczby zespolone W najnowszym standardzie C dodano oficjalnie liczby zespolone jako nowy typ zmiennych Ich stosowanie wymaga dodania biblioteki <complex.h> Poza definicją typu dostarcza także szereg funkcji matematycznych operujących na liczbach zespolonych Zmienną typu zespolonego definiuje się dwustopniowo, podaje się wielkość jaką mogą przyjmować elementy liczby zespolonej, a następnie umieszcza się informacje że będzie to liczba zespolona 54 27
Liczby zespolone Definiowanie include <complex.h> float complex x; int complex y; double complex z=23.03-33.12*i; Wysyłanie na ekran printf( z=%f%+fi,creal(z),cimag(z)); Podstawowe działania na liczbach zespolonych wykonuje się analogicznie jak dla liczb rzeczywistych 55 Liczby zespolone: funkcje cabs(), carg() moduł i argument liczby creal(), cimag() część rzeczywista i urojona conj() liczy liczbę sprzężoną cexp(), clog(), csqrt(), cpow() działania potęgowe csin(), ccos(), ctan(), casin(), cacos(), catan() funkcje trygonometryczne csinh(), ccosh(), ctanh(), casinh(), cacosh(), catanh() funkcje hiperboliczne 56 28
Przykład 5 Napisać program testujący działania i funkcje na liczbach zespolonych Podstawowe działania +, -, *, /, ^ Funkcje trygonometryczne 57 Przykład 5 58 29
Obliczenia matematyczne Obliczenia matematyczne realizowane na liczbach całkowitych i rzeczywistych można realizować w oparciu o bogatą bibliotekę funkcji matematycznych zdefiniowanych w bibliotece <math.h> Funkcje potęgowe Funkcje wykładnicze Funkcje trygonometryczne Funkcje hiperboliczne Funkcje testujące Inne funkcje 59 Liczby pseudolosowe Każdy język programowania dostarcza narzędzi umożliwiających generowanie liczb pseudolosowych Funkcje generatora liczb losowych wymagają biblioteki systemowej <stdlib.h> Generator jest inicjowany funkcją srand(x) Losowanie realizowane jest przez funkcję rand() w zakresie (0,RAND_MAX) gdzie RAND_MAX = co najmniej 32767 60 30
Liczby pseudolosowe Wywołanie generatora funkcją srand(x) musi być wywoływane z losową wartością x Realizuje się to najczęściej funkcją time(0) zwracającą czas jaki minął od 1 stycznia 1970 roku Jeżeli ustawiona zostanie stała wartość x to generator za każdym razem wylosuje te same liczby Funkcja time(0) lub time (NULL) wymaga dodania do kodu biblioteki <time.h> 61 Liczby pseudolosowe Funkcja rand() generuje liczby losowe całkowite z przedziału (0, RAND_MAX) Chcąc ograniczyć przedział losowania należy skorzystać z konstrukcji: c=rand()%(wart_ogr+1); Zmianę zakresu od dołu realizujemy dodając wartość dolnej granicy c=x+rand()%(wart_ogr-x+1); 62 31
Przykład 6 Napisać program generujący 10 liczb losowych z zadanego przez użytkownika przedziału liczb 63 Komentarze Podczas pisania kodu programu warto w kluczowych miejscach uzupełniać kod o komentarz Komentarz pozwala samemu zorientować się po czasie w kodzie Dzięki komentarzom inne osoby korzystające z kodu będą mogły łatwiej zorientować się w ewentualnych zawiłościach kodu 64 32
Komentarze Komentarz umieszczony w jednej linii kodu umieszcza się na końcu linii po // int pi=3.1415; //deklaracja liczby pi Komentarz obejmujący kilka linii kodu umieszcza się pomiędzy znacznikami /* */ int pi=3.1415; /*deklaracja liczby pi*/ 65 33