int - SPOX - Sphere Online Exercises
Transkrypt
int - SPOX - Sphere Online Exercises
Zasady Literatura Dlaczego C? Tworzenie . . . Podstawy Programowania Edycja kodu . . . Kompilacja Debugowanie Łukasz Kuszner http://www.kaims.pl/∼kuszner/ [email protected] Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Wykład, 2012/13 Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 1 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie 1. Zasady Cel Poznać podstawy języka C, zbudować dobre podstawy do dalszej nauki programowania. Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Zaliczenie Strona główna Strona tytułowa • Zaliczenie zajęć praktycznych • Wykład kończy się egzaminem pisemnym JJ II J I Strona 2 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja 2. Literatura Debugowanie Ważne pojęcia: Typy i zmienne Książki Sterowanie Jednostki leksykalne • Język ANSI C, Brian W. Kernighan, Dennis M. Ritchie, WNT. • Język C. Wskaźniki. Vademecum profesjonalisty, Kenneth A. Reek (Pointers on C), Helion. Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa • Inne książki traktujące o języku C lub rozdziały dotyczące programowania proceduaralnego z książek traktujących o prograwmowaniu w C++. JJ II J I Strona 3 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Inne • System pomocy Visual Studio Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie • Pomoc na stronach firmy Micrososft Jednostki leksykalne Ważne pojęcia • strony pomocy HowTo, man i info z dystrybucji Linux’a Typy złożone Funkcje • http://ideone.com/kusziamw/opr11 - programy przykładowe • http://spoj.pl - ogólnodostępny zbiór zadań i sędzia online • https://pl.spoj.pl/ - ogólnodostępny zbiór łatwych zadań na dobry początek w języku polskim Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 4 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Narzędzia Debugowanie Ważne pojęcia: • Visual Studio Typy i zmienne • Sphere Online Judge (spoj.pl) Jednostki leksykalne • Ewentulanie inne środowiska zintegrowane (ang. IDE - Inte- Typy złożone grated development environment): Code::Blocks, . . . ) • Kompilatory usostępnione na licencji GNU (GCC, DJGPP, . . . ), edytory kodu (emacs, vim, notepad++, . . . ), debugger (gdb, . . . ). • Kompilator online (ideone.com). Sterowanie Ważne pojęcia Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 5 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? 3. Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Historia języka C Debugowanie Ważne pojęcia: Język C jest strukturalnym językiem imperatywnym rozwijanym początkowo głównie w ramach systemu UNIX. Poprzednikiem C był interpretowany język B, który Ritchie rozwinął w język C. Pierwszy okres rozwoju języka to lata 1969-1973. W roku 1973 w języku C udało się zaimplementować jądro (kernel) systemu operacyjnego Unix. W 1978 roku Brian Kernighan i Dennis Ritchie opublikowali dokumentację języka p.t. C Programming Language (wydanie polskie: Język ANSI C). C stał się popularny poza Laboratoriami Bella (gdzie powstał) po 1980 roku, i stał się dominującym językiem do programowania systemów operacyjnych i aplikacji. Na bazie języka C w latach osiemdziesiątych Bjarne Stroustrup stworzył język C++, który wprowadza możliwość programowania obiektowego. Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 6 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Standardy C Kompilacja Debugowanie Pierwsze wersje systemu UNIX były rozpowszechniane w szkołach wyższych wraz z pełnym kodem źródłowym napisanym w języku C. Potrzeba stworzenia standardu języka wynikała z jego popularności - coraz więcej osób z niego korzystało (głównie na uniwersytetach). Amerykański standard języka - ANSI C (1983-1988) - stanowił znaczne rozszerzenie w stosunku do wersji Kernighan’a i Ritchie’go. Kolejna wersja standardu języka: ISO 9899:1990 była modyfikacją standardu ANSI. Język zgodny z tą wersją standardu określany jest nieformalnie jako C89. Od tego czasu powstało wiele uaktualnień tej normy na przykład powszechnie obowiązująca C99. Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 7 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Zastosowania Kompilacja Debugowanie • Programowanie niskopoziomowe: sterowniki Ważne pojęcia: • Implementacja fragmentów systemu o zwiększonych wyma- Sterowanie ganiach efektywnościowych Typy i zmienne Jednostki leksykalne Ważne pojęcia Typy złożone Dlaczego jeszcze warto nauczyć się C? • Popularne języki wysokiego poziomu mają składnię opartą na C (C++, Java, C#). Funkcje Stałe i wyliczenia Strona główna Strona tytułowa • Elementy składniowe języka występują w zasadzie we wszystkich językach imperatywnych. • Od czegoś trzeba zacząć. JJ II J I Strona 8 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . 4. Tworzenie oprogramowania Edycja kodu . . . Kompilacja Tworzenie oprogramowania zaczyna się od powstania potrzeby jego istnienia. W naszym wypadku tą potrzebą jest proces kształcenia w którym bierzemy udział. Kolejne fazy, jakie można wyodrębnić to: Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia • analiza problemu i tworzenie zarysu projektu, Typy złożone Funkcje • projektowanie, tworzenie specyfikacji technicznej, • pisanie kodu, Stałe i wyliczenia Strona główna Strona tytułowa • testowanie i debugowanie. • wdrożenie i utrzymanie JJ II J I Strona 9 z 78 Na zajęciach będą nas interesować głównie elementy związane z kodowaniem, testowaniem i debugowaniem. Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Pisanie kodu i kompilacja Kompilacja Debugowanie Ważne pojęcia: Przykład 1. #include<s t d i o . h> int main ( ) { Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone p r i n t f ( ” H e l l o world ! \ n” ) ; return 0 ; } Mówiąc w dużym skrócie powyższy program musi zostać przetłumaczony z kodu źródłowego na język maszyny. Program, który do tego służy nazywamy kompilatorem, a sam proces tłumaczenia kompilacją. Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 10 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Elementy kodu programu Tworzenie . . . Program w języku C musi zawierać funkcję main. Funkcja main, podobnie jak każda inna funkcja w C ma następującą postać: <typ zwracany> <nazwa>(<parametry>) { <kod funkcji> } Kompilacja Edycja kodu . . . Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Nasz program zawiera tylko i wyłącznie funkcję main, która nie ma żadnych parametrów i składa się z dwóch instrukcji: printf("Hello world!\n");, ta wypisuje tekst zawarty w cudzysłowie, oraz return 0;, ta nakazuje zakończenie działania funkcji, a w wypadku funkcji main również i programu oraz przekazanie wartości 0. Typem zwracanym przez main jest int – typ całkowitoliczbowy. Wartość 0 zostaje przekazana do systemu i oznacza poprawne wykonanie programu. Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 11 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Pliki nagłówkowe Jednostki leksykalne Ważne pojęcia W plikach nagłówkowych (zwyczajowo mają one rozszerzenie .h) znajdują się deklaracje funkcji bibliotecznych. Przykładowo funkcja biblioteczna printf znajduje się w domyślnie włączanym nagłówku stdio.h. Do włączenia nagłówka używamy dyrektywy #include: Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 12 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Struktura programu • Kod programu może zostać umieszczony w jednym bądź wielu plikach. • Program składa się z dyrektyw preprocesora, definicji typów, funkcji oraz zmiennych. • Funkcje zbudowane są z instrukcji, z których każda zakończonych średnikiem. Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa • Instrukcje składają się ze słów kluczowych, operatorów, nazw zmiennych oraz znaków grupujących i separujących (nawiasy, przecinki, średniki). JJ II J I Strona 13 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Uruchomienie programu • Program zaczyna działanie od wykonania funkcji main. Pozostałe funkcje mogą być napisane przez programistę lub pochodzić z bibliotek. • Przed uruchomieniem program należy skompilować i scalić (linkowanie, konsolidacja) z funkcjami bibliotecznymi. Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 14 z 78 Powrót Full Screen Zamknij Koniec 5. Edycja kodu źródłowego Zasady Literatura Dlaczego C? Pożądane cechy edytora kodu programu: Tworzenie . . . Edycja kodu . . . • Podświetlanie składni Kompilacja Debugowanie • Wielokrotne cofnij/powtórz Ważne pojęcia: Typy i zmienne • Zaznaczanie blokowe Sterowanie Jednostki leksykalne • Parowanie nawiasów • Autowcięcia • Autouzupełnianie • Ukrywanie części kodu • Ukrywanie części tekstu • Integracja z kompilatorem • Możliwość sprawdzania pisowni (np. w komentarzach) • Łatwość obsługi • Niska cena Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 15 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: 6. Kompilacja Typy i zmienne Sterowanie Jednostki leksykalne Kompilacja to proces automatycznego tłumaczenia kodu napisanego w jednym języku programowania na inny (kod maszynowy lub kod pośredni). Dane wejściowe najczęściej nazywa się kodem źródłowym. Program wykonujący tłumaczenie to kompilator. Przeważnie kompilacja jest częścią większego procesu tłumaczenia, a tworzony w jej trakcie kod wynikowy jest przekazywany do linkera (konsolidatora). Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 16 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Proces przetwarzania kodu źródłowego Sterowanie Jednostki leksykalne • preprocessing - przetworzenie wstępne, na przykład włączenie plików nagłówkowych Ważne pojęcia Typy złożone Funkcje • kompilacja Stałe i wyliczenia Strona główna • konsolidacja - łączenie skompilowanych modułów i utworzeniu pliku wykonywalnego. Strona tytułowa JJ II J I Strona 17 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 18 z 78 Powrót Full Screen Zamknij Koniec Etapy kompilacji • Faza wstępna - odczyt i analiza kodu na podstawie reguł języka, tworzenie reprezentacji pośredniej kodu źródłowego w postać grafu lub drzewa zależności. Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie • Analiza leksykalna - rozdzielenie kodu na elementarne jednostki języka programowania zwane tokenami. Ważne pojęcia: Typy i zmienne Sterowanie • Analiza składniowa - dopasowanie tokenów do gramatyki języka (sprawdzenie, czy kod źródłowy był poprawny składniowo) • Analiza semantyczna - określenie znaczenia poszczególnych tokenów. Przykładem może być sprawdzanie, czy nie występuje niezgodność typów. • Optymalizacja - reprezentacja pośrednia jest upraszczana tak, aby program otrzymany na jej podstawie charakteryzował się pewnymi cechami (np. większą wydajnością lub mniejszą objętością). Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 19 z 78 Powrót Full Screen • Generacja kodu na podstawie reprezentacji pośredniej generowany jest kod wynikowy. Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Dyrektywy preprocesora • #include ... - dyrektywa włączająca tekst innego pliku źródłowego w miejscu jej wystąpienia w pliku podlegającym aktualnie przetwarzaniu, przy czym możliwe jest zagłębione występowanie dyrektywy include Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje • #define i #undef definiowanie symboli dla warunkowej kompilacji • #if, #elif, #else, and #endif - warunkowe włączanie i wyłączanie fragmentów kodu źródłowego • inne: #pragma, #error, #warning, . . . Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 20 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Dyrektywy preprocesora - przykład Zabezpieczenia plików nagłówkowych przed wielokrotnym dołączaniem do tego samego projektu. Jeżeli treść pliku nagłówkowego nazwa.h zawiera instrukcje: #ifndef NAZWA H #define NAZWA H Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia // ... t r e ś ć właściwa . . . Strona główna Strona tytułowa #endif to przy kolejnej próbie włączenia pliku cała treść właściwa zostanie pominięta. JJ II J I Strona 21 z 78 Powrót Full Screen Zamknij Koniec Błędy kompilacji Bezproblemowy przebieg kompilacji programu jest rzadkim zjawiskiem nawet u doświadczonych programistów. Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Przykład 2. Kompilacja int main ( ) Ważne pojęcia: { Typy i zmienne p r i n t f ( ” H e l l o world ! \ n” ) //Brak średnika return 0 ; } Debugowanie Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Powyższy przykład jest błędny. Próba kompilacji takiego programu zakończy się niepowodzeniem. Przykładowe komunikaty wyświetlone przez kompilator mogą mieć następującą postać: Przykład 3. hello.c: In function ‘main’: hello.c:4: error: syntax error before "return" Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 22 z 78 Kompilator uznał, że błąd znajduje się w linii 4 przed słowem return, mimo że średnik zwyczajowo piszemy bezpośrednio po instrukcji. Mimo to sytuacja jest wielce komfortowa; otrzymaliśmy precyzyjny komunikat o błędzie, który łatwo poprawić. Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja 7. Debugowanie Debugowanie Ważne pojęcia: Typy i zmienne Debugowanie (ang. debugging = odpluskwianie) - proces śledzenia działania systemu mikroprocesorowego lub programu komputerowego za pomocą specjalnego programu - debugera w celu wychwycenia i naprawy błędów w działaniu uruchamianego urządzenia lub oprogramowania. Istotą uruchamiania przy pomocy debugera jest możliwość wykonywania programu w trybie pracy krokowej lub z zastawianiem tzw. pułapek (ang. breakpoints), czyli miejsc w programie, po osiągnięciu których dalsze wykonywanie programu jest zatrzymywane, a także podglądania i ew. zmiany zawartości rejestrów, pamięci itd. Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 23 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie 8. Ważne pojęcia: • kod źródłowy, • kompilacja, Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna • pliki nagłówkowe, Strona tytułowa JJ II J I Strona 24 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Zadanie 1. Scharakteryzuj przydatność do tworzenia oprogramowanie następujących edytorów tekstu: Notatnik, Microsoft Word, innego wybranego edytora. Zadanie 2. Napisz, skompiluj i wykonaj swój pierwszy program w C. Zadanie 3. Poznaj i wypróbuj podstawowe opcje kompilatora. Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 25 z 78 Powrót Full Screen Zamknij Koniec Zasady 9. Typy i zmienne Literatura Dlaczego C? Tworzenie . . . Jak wiemy, komputer operuje na danych binarnych, można myśleć, że dane w pamięci komputera to ciągi liczb złożone z 0 i 1. Sposób interpretacji przechowywanych danych zależy od ich typu. Wspomniano już o typie całkowitoliczbowym int. Typ char odnosi się do danych znakowych. Popatrzmy na poniższy przykład: Przykład 4. #include<s t d i o . h> int main ( ) { int a =75; char z ; p r i n t f ( ”a = %d\n” , a ) ; z=a ; p r i n t f ( ” z = %c \n” , z ) ; p r i n t f ( ” z = %d\n” , z ) ; return 0 ; } Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 26 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Komentarz Najpierw została zadeklarowana zmienna a typu liczbowego int z wartością początkową 75. Liczba ta została wypisana instrukcją printf. Następnie wartość ta została podstawiona do zmiennej typu znakowego z i również wartość tej zmiennej została wypisana. Tym razem na ekranie zobaczymy jednak literę K, której kodem ASCII jest 75. Kolejne wypisanie każe traktować zmienną znakową z jako liczbę (specyfikator %d) i znowu na ekranie zobaczymy liczbę 75. Później zobaczymy, że z punktu widzenia kompilatora nie ma różnicy między znakami, a kodami ASCII znaków. Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 27 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Interpretacja i rozmiar Kolejną różnicą między typami danych jest ich rozmiar. Typ char ma jeden bajt, czyli 8 bitów, a typ int ma co najmniej 2 bajty (16 bitów) – to gwarantuje standard, faktycznie w systemie Linux typ ten ma 4 bajty (32 bity). W każdym razie jest to typ szerszy niż char, co pokazuje poniższy przykład. Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 28 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Przykład 5. Edycja kodu . . . Kompilacja #include<s t d i o . h> int main ( ) Debugowanie Ważne pojęcia: Typy i zmienne { int a =322; char z ; Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone p r i n t f ( ”a = %d\n” , a ) ; z=a ; p r i n t f ( ” z = %c \n” , z ) ; p r i n t f ( ” z = %d\n” , z ) ; return 0 ; } Po podstawieniu z=a zmienna z ma wartość B – litery o kodzie 66 (reszta z dzielenie 322 przez 256). Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 29 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Typy zmiennoprzecinkowe i zaokrąglenia Kompilacja W języku C możliwe jest również operowanie na liczbach niecałkowitych. Umożliwiają to typy float i double. Nazywa się je zmiennoprzecinkowymi ze względu na specjalny format zapisu. Ważne pojęcia: Przykład 6. Ważne pojęcia #include<s t d i o . h> int main ( ) { Typy i zmienne Sterowanie Jednostki leksykalne Typy złożone Funkcje Stałe i wyliczenia Strona główna float x = 1 . 5 ; p r i n t f ( ”x=%f \n” , x ) ; return 0 ; } Debugowanie Strona tytułowa JJ II J I Strona 30 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Operatory Kompilacja Dotychczas poznaliśmy jeden operator =. Jest to dwuargumentowy operator przypisania. Wyrażenie a=b oznacza, że lewemu operandowi a przypisuje się wartość b. Inne operatory to np.: Ważne pojęcia: • + – dodawanie, • - – odejmowanie, • * – mnożenie, • > – porównanie: lewy większy od prawego, • < – porównanie: lewy mniejszy od prawego, • == – porównanie: lewy równy prawemu. Debugowanie Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 31 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Proste typy danych Typy i zmienne Sterowanie W języku C występuje tylko kilka podstawowych typów danych: • char jeden bajt, typ znakowy • int typ całkowity, standard ANSI określa rozmiar na co najmniej dwa bajty • float typ zmiennoprzecinkowy pojedynczej precyzji • double typ zmiennoprzecinkowy podwójnej precyzji Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 32 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Kwalifikatory typów Debugowanie Ważne pojęcia: Kwalifikatory rozmiaru typów liczbowych • short int (krótki int, nie dłuższy niż int) • long int (długi int, przynajmniej 4 bajty) • long double typ zmiennoprzecinkowy rozszerzonej precyzji Przykład 7. Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa short int a ; long int b ; long double c ; JJ II J I Strona 33 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kwalifikatory typów c.d. Kwalifikatory: Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne • signed (liczby ze znakiem) Sterowanie • unsigned (liczby bez znaku ) Ważne pojęcia można stosować z typem char lub dowolnym typem całkowitym, Jednostki leksykalne Typy złożone Funkcje Stałe i wyliczenia Strona główna Przykład 8. signed char a ; /∗ −128 <= a <= 127 ∗/ unsigned int b ; /∗ 0 <=b <= 255 ∗/ signed long int l i ; Strona tytułowa JJ II J I Strona 34 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne 10. Sterowanie Sterowanie Jednostki leksykalne Ważne pojęcia • grupowanie instrukcji - nawiasy klamrowe { } Typy złożone Funkcje • wybór wariantowy (if, switch) Stałe i wyliczenia • pętle (iteracje) - powtarzanie instrukcji, bądź grupy instrukcji Strona główna ze sprawdzeniem warunku zatrzymania (for, do, while). Strona tytułowa JJ II J I Strona 35 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Grupowanie instrukcji Kompilacja Debugowanie Każda instrukcja musi być zakończona średnikiem, np: Ważne pojęcia: Typy i zmienne x = 0; pr i nt f (” Hello ” ) ; return 1 ; Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Nawiasy klamrowe służą do grupowania instrukcji w instrukcję złożoną, czyli blok, np.: Stałe i wyliczenia Strona główna { x = 0; pr i nt f (” Hello ” ) ; return 1 ; } Funkcje Strona tytułowa JJ II J I Strona 36 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Instrukcja warunkowa Tworzenie . . . Edycja kodu . . . Instrukcje warunkowe stosujemy wszędzie tam, gdzie dalszy przebieg sterowania ma dwa warianty. Przykład 9. #include<s t d i o . h> int main ( ) { Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone int a ; p r i n t f ( ” Podaj l i c z b ę : ” ) ; s c a n f ( ”%d” ,&a ) ; i f ( a%2==0) p r i n t f ( ” l i c z b a p a r z y s t a \n” ) ; else p r i n t f ( ” l i c z b a n i e p a r z y s t a \n” ) ; return 0 ; } Kompilacja Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 37 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Instrukcja warunkowa (2) if (<CL>) Typy i zmienne Sterowanie Jednostki leksykalne <IN1> Ważne pojęcia Typy złożone else <IN2> Sprawdzana jest wartość wyrażenia <CL>, w przypadku gdy jest różna od zera wykonywana jest instrukcja lub instrukcja złożona <IN1>, w przeciwnym wypadku wykonywane jest <IN2>. Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 38 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Program Warunek Trójkąta Debugowanie Problem: Napisać program sprawdzający czy z podanych trzech długości można zbudować trójkąt. Wejście: liczby całkowite: a, b, c Wyjście: odpowiedź TAK lub NIE Rozwiązanie: Typy i zmienne Ważne pojęcia: Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia • Wczytujemy 3 liczby ze standardowego wejścia. • Należy sprawdzić warunki: a+b > c, a+c > b oraz b+c > a. • Jeżeli wszystkie warunki są spełnione, drukujemy TAK, w przeciwnym razie drukujemy na wyjście NIE. Strona główna Strona tytułowa JJ II J I Strona 39 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Program Warunek Trójkąta (2) #i n c l u d e < s t d i o . h> int main ( ) { int a , b , c ; s c a n f ( ”%d%d%d” , &a , &b , &c ) ; if ( a + b > c ) if ( b + c > a ) if ( a + c > b ) p r i n t f ( ”TAK” ) ; else p r i n t f ( ”NIE” ) ; else p r i n t f ( ”NIE” ) ; else p r i n t f ( ”NIE” ) ; return 0 ; } Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 40 z 78 Powrót Full Screen Zamknij Koniec u s i n g System ; p u b l i c c l a s s Test { p u b l i c static void Main ( ) { int a , b , c ; string s ; try { s = Console . ReadLine ( ) ; a = int . Parse ( s ) ; s = Console . ReadLine ( ) ; b = int . Parse ( s ) ; s = Console . ReadLine ( ) ; c = int . Parse ( s ) ; i f ( a + b > c && b + c > a && a + c > b ) Console . WriteLine ( ”TAK” ) ; else Console . WriteLine ( ”NIE” ) ; } c a t c h ( Exception e ) { Console . WriteLine ( ” Nie podano l i c z b y ” ) ; } } } Zastąpienie kolejnych warunków jednym, spójnik logiczny && (lo- Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 41 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Częste błędy Tworzenie . . . Uwaga na niejednoznaczności: Kompilacja Edycja kodu . . . Debugowanie #include<s t d i o . h> main ( ) { int a =3; i f ( a <2) i f ( a >0) p r i n t f ( ”a=1” ) ; else p r i n t f ( ”a<=0” ) ; } Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Do którego if odnosi się else? Zawsze używaj nawiasów klamrowych, unikniesz wielu niepotrzebnych błędów. Kompilator oznajmia ten fakt programiście w następujący sposób (używając np. opcji -Wall): prb.c: In function ‘main’: prb.c:5: warning: suggest explicit braces to avoid ambiguous ‘else’ Strona tytułowa JJ II J I Strona 42 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Wybór wielowariantowy W sytuacji, gdy wybieramy spośród wielu możliwych wariantów pomocna może się okazać konstrukcja switch. Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 43 z 78 Powrót Full Screen Zamknij Koniec Przykład 10. #include<s t d i o . h> int main ( ) { char c ; p r i n t f ( ” podaj l i t e r ę : ” ) ; s c a n f ( ”%c ” ,& c ) ; switch ( c ) { case ’A ’ : case ’E ’ : case ’ I ’ : case ’O ’ : case ’U ’ : case ’Y ’ : p r i n t f ( ” Wielka l i t e r a \n” ) ; case ’ a ’ : case ’ e ’ : case ’ i ’ : case ’ o ’ : case ’ u ’ : case ’ y ’ : p r i n t f ( ”%c j e s t samogłoską \n” , c ) ; break ; default : i f ( c<=’ z ’ && c>=’A ’ ) p r i n t f ( ”%c j e s t s p ó ł g ł o s k ą \n” , c ) ; else p r i n t f ( ” to n i e l i t e r a \n” ) ; i f ( c<=’Z ’ && c>=’A ’ ) p r i n t f ( ” Wielka l i t e r a \n” ) ; break ; Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 44 z 78 Powrót Full Screen } Zamknij return 0 ; } Koniec Zasady Literatura Dlaczego C? Wybór wielowariantowy 2 switch (<CL>) { case <LAB1>: <IN1> case <LAB2>: <IN2> ........ default <IN3> } Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Wyrażenie <CL> użyte jako selektor wyboru musi przyjmować wartości całkowite, etykiety muszą być stałymi całkowitymi. Wykonanie instrukcji switch-case: Wyrażenie porównywane jest kolejno z etykietami, jeżeli jedna z etykiet ma wartość wyrażenia, to wykonywane są instrukcje po niej następujące. Instrukcje po etykiecie default są wykonywane, jeżeli żadna z etykiet nie ma wartości równej selektorowi wyboru. Aby uniknąć sprawdzania kolejnych przypadków, stosujemy instrukcję break. Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 45 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Pętla while while (<CL>) <IN> Dopóki warunek po słowie while jest spełniony dopóty blok instrukcji ograniczony {} będzie wykonywany. Trzeba zwrócić uwagę, by pętla miała prawidłowy warunek końca i nie mogło zdarzyć się tak, iż będzie się ona wykonywać w nieskończoność. W ogólności problem stwierdzenia, czy program się zatrzyma, czy też nie, jest trudny. Popatrzmy na poniższy przykład. Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 46 z 78 Powrót Full Screen Zamknij Koniec Przykład 11. #include < s t d i o . h> int main ( ) { int a , i =0; p r i n t f ( ” Podaj l i c z b ę c a ł k o w i t ą : ” ) ; s c a n f ( ”%d” ,&a ) ; p r i n t f ( ” \n” ) ; while ( a >1) { i f ( a%2) a=3∗a +1; else a=a / 2 ; i ++; p r i n t f ( ”a=%d\n” , a ) ; } p r i n t f ( ” \n Lic zba i t e r a c j i : %d\n” , i ) ; return 0 ; } Możemy zapytać, czy ta pętla się zawsze kiedyś zatrzyma. Jest to znany problem Collatz’a. Dotychczas nie udało się go rozwiązać. Problem ten jest szczególnym przypadkiem problemu stopu, o którym wiadomo, że jest niealgorytmiczny (wiemy, że nie istnieje algorytm, który go rozwiązuje). Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 47 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Wydruk dla a=7 : 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 liczba iteracji : 16 Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 48 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Pętla for Debugowanie Ważne pojęcia: Pętla for jest szczególnym przypadkiem pętli while. Zapisujemy ją w postaci: for(<IN1>;<IN2>;<IN3>) <IN4> Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia gdzie: <IN1> zwykle inicjuje licznik pętli, <IN2> jest warunkiem końca, <IN3> steruje licznikiem w każdym kroku, <IN4> jest instrukcją lub blokiem instrukcji wykonywanym cyklicznie. Zwrot ten jest równoważny zapisowi: <IN1>; while (<IN2>){ <IN4>; <IN3>; } Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 49 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Pętla for (2) Debugowanie Ważne pojęcia: Pętle for często stosujemy do powtarzania pewnych operacji określoną liczbę razy, tak jak w przykładzie poniżej. Typy i zmienne Sterowanie Jednostki leksykalne Przykład 12. int main ( ) { Typy złożone Funkcje Stałe i wyliczenia int i ; for ( i =0; i < 10; i ++) p r i n t f ( ” H e l l o world ! %d t i m e s \n” , i ) ; return 0 ; } Ważne pojęcia Strona główna Strona tytułowa JJ II J I Strona 50 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Pętla do while do <IN> while (<CL>); Tu najpierw wykonuje się instrukcje, a następnie oblicza wyrażenie <CL> i jeśli jest prawdziwe, to następuje powrót do początku pętli. Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 51 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie 11. Jednostki leksykalne Jednostki leksykalne (leksemy) są to niezależne, oddzielone separatorami (spacja, średnik, przecinek) fragmenty kodu źródłowego, np. int (typ zmiennej), scanf (identyfikator nazwa funkcji bibliotecznej), for, while (słowa kluczowe), "Ala" (literał). Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 52 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Identyfikatory Kompilacja Debugowanie • Identyfikatory są to nazwy zmiennych lub funkcji. Ważne pojęcia: • Identyfikator jest sekwencją liter, cyfr i znaków podkreślenia Sterowanie ( ). Typy i zmienne Jednostki leksykalne Ważne pojęcia • Rozróżniane są małe oraz duże litery (ang. case sensitive). Typy złożone • Pierwszy znak identyfikatora nie może być cyfrą. Stałe i wyliczenia Funkcje Strona główna • Identyfikator nie może być słowem kluczowym (słowem zastrzeżonym dla języka). • Należy unikać stosowania nazw zaczynających się od (zarezerwowane dla bibliotek). Strona tytułowa JJ II J I Strona 53 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Słowa kluczowe Ważne pojęcia: Podane poniżej napisy są w języku C słowami kluczowymi (nie mogą być nazwami zmiennych i funkcji): char, int, float, double, enum, void, long, short, signed, unsigned, const, static, volatile, extern, register, struct, union, for, while, do, switch, case, default, if, else break, continue, return, goto, inline, sizeof, typedef Sterowanie Typy i zmienne Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 54 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Literały Tworzenie . . . Edycja kodu . . . Literał to wartość wpisana bezpośrednio w kod programu. Każdy literał (np. liczba 2 występująca w wyrażeniu: x=2*x) ma określony typ. Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Literały całkowite Jednostki leksykalne Ważne pojęcia • 1234 - typ int Typy złożone • 1234L - typ long int Stałe i wyliczenia Funkcje Strona główna • 1234U - typ unsigned int • 1234UL - typ unsigned long int • 012 - typ int, liczba w systemie ósemkowym (dziesiętnie: 10) • 0x12 - typ int, liczba w sytemie szesnastkowym (dziesiętnie: 18) Strona tytułowa JJ II J I Strona 55 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Literały zmiennoprzecinkowe • -314.15 - typ double (notacja dziesiętna z kropką) • -3.1415e2 (lub -3.1415E2) - typ double (notacja wykładnicza) • użycie literki F lub L zmienia typ na float lub long double odpowiednio. Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Literały znakowe i łańcuchowe • ’a’ - typ char pojedynczy znak ujęty w pojedyncze apostrofy • ”ala ma psa” - typ char * ciągi znaków ujęte w cudzysłowie Strona tytułowa JJ II J I Strona 56 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: 12. Ważne pojęcia • literał, • operator, • pętla Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna • typ, • zmienna, Strona tytułowa JJ II J I Strona 57 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Zadania Edycja kodu . . . Kompilacja Debugowanie Zadanie 4. Proszę przeczytać ze zrozumieniem fragment książki omawiający poruszane zagadnienia bardziej szczegółowo. Mogą to być np. rozdziały 1, 2 i 3 z książki Kernighana i Ritchiego. Zadanie 5. Napisz program, który wyznacza wartość: n! = 1 * 2 * ... * n Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Zadanie 6. Napisz program, który drukuje trójkąt z gwiazdek: * *** ***** ******* Zadanie 7. Napisz program, który wczytuje ze standardowego wejścia kolejne znaki – cyfry i tworzy z nich liczbę dziesiętną. Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 58 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Zadanie 8. Wskaż literały i określ ich typy w następującym programie #include<s t d i o . h> int main ( ) { Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne int a ; p r i n t f ( ” Podaj l i c z b ę : ” ) ; s c a n f ( ”%d” ,&a ) ; i f ( a%2==0) p r i n t f ( ” l i c z b a p a r z y s t a \n” ) ; else p r i n t f ( ” l i c z b a n i e p a r z y s t a \n” ) ; return 0 ; } Kompilacja Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 59 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: 13. Typy złożone Typy i zmienne Sterowanie Jednostki leksykalne Typy złożone są to typy, które tworzy programista używając wbudowanych typów prostych i innych typów złożonych. Ważne pojęcia Typy złożone Funkcje • tablice Stałe i wyliczenia Strona główna • struktury • unie Strona tytułowa JJ II J I Strona 60 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Tablice Tablica jest strukturą danych złożoną z określonej liczby elementów tego samego typu. Przykładowo int T[5] jest deklaracją 5-cio elementowej tablicy (wektora) typu int, wtedy kolejne elementy tablicy to T[0], T[1], T[2], T[3], T[4]. Dostęp do poszczególnych elementów tablicy uzyskuje się poprzez użycie operatora [ ] tak, jak w przykładzie poniżej: Przykład 13. Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna for ( i =0 ; i <5 ; i++ ) T[ i ]= i ∗ i ; Uwaga:W języku C indeks tablicy zawsze zaczyna się od 0. Tak więc w rozważanym przykładzie T[4] jest ostatnim elementem tablicy (a nie T[5]!). Strona tytułowa JJ II J I Strona 61 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Tablice dwuwymiarowe Można też tworzyć tablice dwu- i więcej wymiarowe. Na przykład double A[10][10]; jest deklaracją tablicy dwuwymiarowej o rozmiarze 10x10. Do elementów takiej tablicy odwołujemy się np: A[i][j] Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 62 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Znaki, łańcuchy znaków Dlaczego C? Tworzenie . . . Typ znakowy to char. Łańcuchy w języku C to tablice znaków (tablice typu char ). char z=’a’; char Tekst[]="Abc"; Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Instrukcje te deklarują zmienną znakową z, oraz łańcuch znaków Tekst, oraz inicjują je. Wtedy T[0]=’A’, T[1]=’b’, T[2]=’c’ oraz T[3]=’\0’ (znacznik końca łańcucha). W C i C++ typ znakowy jest typem całkowitym, tzn. zmienne znakowe można traktować tak, jak liczby całkowite równe ich kodom ASCII. Ponadto na zmiennych znakowych można wykonywać działania arytmetyczne. Np. char x=’a’, y=’f’; x++; y=y+’A’-’a’; Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 63 z 78 Powrót Po tych instrukcjach zmienna x jest równa ’b’, zaś y jest równa ’F’ (w zmiennej y litera została zamieniona na dużą). Full Screen Zamknij Koniec Zasady Typowe błędy Literatura Należy pamiętać, że standardowo w C/C++ nie ma kontroli dostępu do tablic. Jeśli odwołujemy się do elementu tablicy który nie istnieje np: Tworzenie . . . const int TAB SIZE=100; Ważne pojęcia: int main ( ) { int T[ TAB SIZE ] ; int n=5000; T[ n ] = 0 ; return 0 ; } To odwołanie do nieistniejącej komórki nie zostanie zasygnalizowane w fazie kompilacji, a w fazie wykonania może przynieść nieoczekiwane efekty. Najprzyjemniejszym jest komunikat systemowy: Naruszenie ochrony pamięci W systemie SPOJ błąd ten jest sygnalizowany przez komunikat: runtime error (SIGSEGV). Dlaczego C? Edycja kodu . . . Kompilacja Debugowanie Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 64 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Struktury Debugowanie Ważne pojęcia: struct Punkt { /∗ typ zmiennej ∗/ int wsp x , wsp y ; char k o l o r ; char znak ; }; Utworzenie zmiennych: struct Punkt a,b; Dostęp do pól struktury: a.wsp_x = 1; a.kolor = 0; a.znak = ’c’; Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 65 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Konwersja typów Debugowanie Ważne pojęcia: Operator konwersji (jawnej) ma postać (nazwa-typu) Operand Typy i zmienne Sterowanie Jednostki leksykalne Konwersja niejawna zachodzi w sytuacji, gdy operandy danego operatora są różnych typów, ogólna zasada mówi, że automatycznie wykonuje się tylko takie przekształcenia, dla których argument zajmujący mniej pamięci jest zamieniany na argument zajmujący więcej pamięci (char na int, int na float) bez utraty informacji, np.: int a=5/2; float b = a/2; float c = (float)a/2; //a=? b=? c=? Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 66 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? 14. Funkcje Tworzenie . . . Edycja kodu . . . Kompilacja Podczas pisania programu (implementacji algorytmu) zachodzi potrzeba wielokrotnego wykonywania tych samych operacji (instrukcji) w różnych sytuacjach (dla różnych danych), np. znalezienie najmniejszego elementu w ciągu liczb (w szczególnym przypadku dwóch), posortowanie ciągu liczb, wyznaczenie rozwiązań równania kwadratowego. W obrębie funkcji można zamknąć operacje wykonywane dla zadanych parametrów wejściowych, np. współczynniki równania kwadratowego. W praktyce każdy (większy) program jest zbudowany z wielu funkcji (dobry styl programowania zaleca, wiele krótkich i czytelnych funkcji), poprawia to przejrzystość i czytelność programu, zwiększa modyfikowalność, zapewnia oszczędność czasu (funkcja raz napisana może być wielokrotnie wykorzystana i jednokrotnie testowana). Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 67 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Proste funkcje - przykłady Typy i zmienne Funkcja obliczająca minimum dwóch liczb: Jednostki leksykalne Sterowanie Ważne pojęcia int min ( int a , int b ) { i f ( a > b ) return b ; else return a ; } Wykorzystanie funkcji w programie np.: x = min(a, b) Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 68 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Potęgowanie w Zp (modulo p) Tworzenie . . . Edycja kodu . . . Kompilacja Przykład 14. int potega ( int b , int w, int p) { // o b l i c z b do p o t e g i w mod p int wynik =1; Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia while (w>0){ i f (w%2) wynik∗=b ; wynik%=p ; b∗=b ; b%=p ; w/=2; } return wynik ; } Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 69 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Funkcje – deklaracja i definicja Edycja kodu . . . Kompilacja Deklaracja funkcji, w odróżnieniu od definicji jest pojęciem logicznym, stanowi informację dla kompilatora, że funkcja o określonej nazwie, typie parametrów może zostać użyta (ale nie musi!) w programie. int min(int a, int b); Definicja funkcji określa natomiast co funkcja robi, stanowi zatem zapis jakiegoś algorytmu, definicja funkcji, w odróżnieniu od deklaracji, powoduje przydzielenie obszaru pamięci, w którym znajduje się kod wynikowy funkcji. int min ( int a , int b ) { i f ( a > b ) return b ; else return a ; } Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 70 z 78 Powrót Full Screen Zamknij Koniec Parametry programu Zasady Literatura Podobnie jak inne funkcje również main może pobierać argumenty. Są to parametry wywołania programu. W pierwszej kolejności jest pobierana ich liczba typu int, a następnie lista argumentów. Poniższy program wypisze wszystkie argumenty wywołania. Przykład 15. Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne int main ( int argc , char∗∗ argv ) { int i =0; for ( i =0; i <a r g c ; i ++) p r i n t f ( ”Argument numer %d : %s \n” , i , argv [ i ] ) ; } Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Na przykład, jeśli program ma domyślną nazwę a.out, to komenda: ./a.out test Strona tytułowa Wypisze: Argument numer 0: ./a.out Argument numer 1: test Strona 71 z 78 Widzimy, że argumentem o numerze 0 jest nazwa pliku wykonywalnego. JJ II J I Powrót Full Screen Zamknij Koniec Zasady Przekaz argumentów Literatura Popatrzmy na prostą funkcję, która zwiększa argument o 1 i wypisuje go: Tworzenie . . . Przykład 16. Debugowanie Dlaczego C? Edycja kodu . . . Kompilacja Ważne pojęcia: void i n c ( int a ) { a++; p r i n t f ( ” i n c : a = %d\n” , a ) ; } Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje int main ( ) { int a ; a =0; inc (a ) ; p r i n t f ( ”main : a = %d\n” , a ) ; return 0 ; } Wynikiem działania programu będzie: inc: a = 1 main: a = 0 Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 72 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Komentarz Kompilacja Debugowanie Może to być zaskoczeniem, ale zobaczmy po kolei co się dzieje. Wartość zmiennej a w programie głównym zostaje ustawiona na 0. Dalej wywoływana jest funkcja inc. Następuje przekazanie wartości parametru do funkcji. Tam wartość ta jest przechowana w zmiennej lokalnej a, ale uwaga nie jest to to samo a, co w main. Lokalna zmienna a zostaje zwiększona o jeden i wypisana jej wartość. Następnie wracamy do main, gdzie cały czas egzystuje zmienna a o wartości 0, ta wartość zostaje wypisana. Podsumowując w naszym przykładzie funkcja nie zmienia wartości innych zmiennych niż jej zmienne lokalne. O takiej funkcji mówimy też, że nie powoduje efektów ubocznych, a taki sposób przekazu argumentów nazywamy przekazywaniem przez wartość. Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 73 z 78 Powrót Full Screen Zamknij Koniec Zasady Funkcje rekurencyjne Literatura Dlaczego C? Funkcjami rekurencyjnymi nazywamy takie funkcje, które wywołują same siebie. Ilustracją może być poniższa funkcja nwd, która oblicza największy wspólny dzielnik dwóch liczb, z których druga jest nie większa od pierwszej. Tworzenie . . . Przykład 17. Typy i zmienne Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Sterowanie int nwdab ( int a , int b ) { i f ( ( a < =0) || (b <=0)) { p r i n t f ( ” t y l k o l i c z b y d o d a t n i e \n” ) ; exit (1);} i f ( a%b==0) return b ; else return nwdab ( b , a%b ) ; } main ( ) { int a ; a=nwdab ( 4 8 , 2 7 ) ; p r i n t f ( ”%d\n” , a ) ; return 0 ; } Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 74 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? 15. Stałe i wyliczenia Deklaracje zmiennych int cyfra = 7; char znak; char znak = ’o’; double a, b = 3.2e-1; Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Deklaracje stałych const double pi = 3.1415; const int liczba = 37; Typy złożone Funkcje Stałe i wyliczenia Strona główna Uwaga! Wartość zmiennych poprzedzonych kwalifikatorem const nie może być zmieniona w trakcie działania programu. Wyliczenia enum dni {pn, wt, sr, czw, pt}; /* domyślnie: 0, 1, 2, 3, 4 */ enum rok {smoka = 1, koguta, malpy}; /* kolejne =2, =3, ... */ Strona tytułowa JJ II J I Strona 75 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Standardowe pliki nagłówkowe Edycja kodu . . . Kompilacja • assert.h – diagnozowanie programów Debugowanie Ważne pojęcia: • ctype.h – klasyfikacja znaków • errno.h – zmienne przechowujące informacje o błędach • math.h – funkcje matematyczne • signal.h – mechanizmy obsługi zdarzeń wyjątkowych • stdio.h – funkcje wejścia oraz wyjścia • stdlib.h – funkcje narzędziowe (przekształcanie liczb, operacje na pamięci) • string.h – operacje na tekstach • time.h – obsługa daty oraz czasu Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 76 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Biblioteka math – przykłady funkcji Typy i zmienne Sterowanie • double sin(double x); Jednostki leksykalne • float sinf(float x); Typy złożone Ważne pojęcia Funkcje • double exp(double x); • double log(double x); • double pow(double x, double y); Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 77 z 78 Powrót Full Screen Zamknij Koniec Zasady Literatura Dlaczego C? Tworzenie . . . Edycja kodu . . . Kompilacja Debugowanie Ważne pojęcia: Typy i zmienne Sterowanie Jednostki leksykalne Ważne pojęcia Zadanie 9. Proszę przeczytać ze zrozumieniem fragment książki omawiający te zagadnienia bardziej szczegółowo. Mogą to być np.: rozdziały 1–4 książki Kernighana i Ritchiego. Typy złożone Funkcje Stałe i wyliczenia Strona główna Strona tytułowa JJ II J I Strona 78 z 78 Powrót Full Screen Zamknij Koniec