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

Podobne dokumenty