podstawy programowania. wykład 2 cia/wyjściabanas/pp/pp_w02_zmienne_inout.pdf · krzysztof banaś...
Post on 28-Feb-2019
229 Views
Preview:
TRANSCRIPT
Krzysztof Banaś Podstawy programowania 1
Podstawy programowania.
Wykład 2
Zmienne i obsługa wejścia/wyjścia
Krzysztof Banaś Podstawy programowania 2
Programowanie
➔ Programowanie – typowe kroki zapis kodu źródłowego w pliku tekstowym kompilacja
• usuwanie błędów składniowych uruchomienie
• testowanie➔ Wsparcie narzędzi, w tym systemu operacyjnego:
edytor tekstu kompilator
• środowiska tworzenia oprogramowania debugger profiler
➔ Konwencje stosowane w różnych środowiskach
Krzysztof Banaś Podstawy programowania 3
Pierwszy program w C
/* korzystanie z biblioteki – komentarze... */#include <stdio.h> // USES
// funkcja - "odpowiednik" algorytmu// funkcja "main" - punkt wejścia, obecny w każdym programie// konkretna funkcja main:// brak danych wejściowych, brak danych wyjściowych, // wszystko jest efektem ubocznymvoid main(void )// nawiasy klamrowe wyróżniają grupy instrukcji - tutaj treść funkcji "main"{ // wcięcie, konwencje zapisu // printf - interakcja z systemem operacyjnym // standardowe wejście, standardowe wyjście, napis, znak nowej linii printf("hello, world\n"); // średnik}
Krzysztof Banaś Podstawy programowania 4
Wejście/wyjście
➔ Obsługa konkretnego urządzenia wejścia/wyjścia jest realizowana przez system operacyjny
➔ Na poziomie języka (C i innych) pojawiają się abstrakcje umożliwiające korzystanie z wejścia/wyjścia bez znajomości szczegółów technicznych urządzeń
➔ Powszechną i użyteczną abstrakcją jest traktowanie interakcji z urządzeniem wejścia/wyjścia jako przesyłania strumieni znaków podstawowy zestaw znaków (ASCII) nie obejmuje polskich
liter rozszerzone zestawy znaków (np. UTF) są obsługiwane przez
nowsze kompilatory pojedynczy znak UTF może zajmować więcej miejsca niż
pojedynczy znak ASCII (jeden bajt)
Krzysztof Banaś Podstawy programowania 5
Wejście/wyjście
➔ Język C posługuje się pojęciami standardowego wejścia i standardowego wyjścia standardowym urządzeniem wejścia jest zazwyczaj klawiatura standardowym urządzeniem wyjścia jest zazwyczaj terminal
• w ramach graficznych interfejsów wykonywany program jest powiązany z konkretnym terminalem
• brak terminala może zaburzać działanie programu podstawowe funkcje obsługi strumieni wejścia i wyjścia
pozwalają odczytać lub zapisać pojedynczy znak:• getchar() uruchamia procedurę systemu operacyjnego
pobierającą pojedynczy znak ze standardowego wejścia• putchar() uruchamia procedurę systemu operacyjnego
wypisującą pojedynczy znak na ekranie (w okienku) terminala
Krzysztof Banaś Podstawy programowania 6
Wejście/wyjście
➔ Oprócz pobierania i wypisywania pojedynczych znaków, standard C udostępnia szereg operacji na napisach (ciągach znaków) i liczbach printf(.....) wypisuje ciąg znaków zgodnie z wzorcem
formatowania przesyłanym jako jeden z argumentów (jedna z danych wejściowych)• nazwa printf pochodzi od określenia (print formatted output)
printf(".....") wypisuje napis zawarty pomiędzy znakami cudzysłowu na ekranie terminala
scanf(....) pobiera (odczytuje) ze standardowego wejścia dane zgodnie z wzorcem formatowania przesyłanym jako jeden z argumentów (jedna z danych wejściowych)
i wiele innych
Krzysztof Banaś Podstawy programowania 7
Wejście/wyjście
➔ Informacje o wykorzystywanych funkcjach bibliotecznych zawarte są w tzw. plikach nagłówkowych plikiem nagłówkowym zawierającym informacje o funkcjach
wejścia/wyjścia jest plik stdio.h➔ Informacje o realizowanych funkcjach zawarte w plikach
nagłówkowych dołączane są do kodu źródłowego (formalnie wklejane) za pomocą dyrektywy #include
➔ Dzięki informacjom z plików nagłówkowych kompilator wie czy funkcje zostały poprawnie wykorzystane w programie
➔ Skompilowany kod źródłowy nie zawiera jeszcze skompilowanego kodu funkcji bibliotecznych
➔ Skompilowany kod funkcji bibliotecznych dołączany jest do ostatecznego programu na etapie linkowania
Krzysztof Banaś Podstawy programowania 8
Proces programowania konsolidacja
● kod źródłowy > [ kod pośredni > ] kod binarny● konsolidacja (linkowanie)
łączenie różnych plików zawierających wstępnie skompilowany kod• m.in. biblioteki, w tym systemowe
możliwe rodzaje konsolidacji• statyczna – tworzony plik wykonywalny zawiera wszystkie
potrzebne funkcje➢ konsolidacja statyczna częściowo uniezależnia od detali
systemu operacyjnego dając kod bardziej przenośny • dynamiczna – plik wykonywalny zawiera informację o
wymaganych funkcjach, które są dołączane w trakcie działania programu
➢ konsolidacja dynamiczna produkuje kod o mniejszym rozmiarze
Krzysztof Banaś Podstawy programowania 9
Tworzenie i wykonanie kodu
Krzysztof Banaś Podstawy programowania 10
Programy = algorytmy + struktury danych
● Przebieg typowego programu: wczytanie danych wejściowych
• program rezerwuje miejsce na dane• wczytanie odbywa się przez wywołanie funkcji, których
działanie zależy od sprzętu i systemu operacyjnego realizacja przetwarzania
• realizacja algorytmu wyrażonego w kodzie źródłowym instrukcjami operującymi na danych
• w kodzie binarnym i języku asemblera instrukcje zamienione są na zestawy rozkazów procesora
zwrócenie wyniku, danych wyjściowych• poprzez wywołanie funkcji, których działanie zależy od
sprzętu i systemu operacyjnego● Istotna rola przechowywania danych (w pamięci
operacyjnej) w trakcie wykonania programu
Krzysztof Banaś Podstawy programowania 11
Programowanie
➔ Jak zapisać dane w pamięci operacyjnej? typy danych (1, 5, 123456789, 2.6, 1/3, 2,34*1012, 1.9*1015)?
➔ Typ danych – ujęcie abstrakcyjne zestaw możliwych wartości, reprezentacja zestaw możliwych operacji do wykonania na obiektach danego typu
➔ Typy danych – ujęcie uproszczone wbudowane typy danych języka programowania, przykład C:
• znaki (char) – jednobajtowe liczby całkowite• liczby całkowite (int) – rozmiar zależny od systemu (16, 32, 64 bity)• liczby rzeczywiste (zmiennoprzecinkowe)
➢ pojedynczej precyzji (float) – 32 bity, 4 bajty➢ podwójnej precyzji (double) – 64 bity, 8 bajtów
• wartości logiczne: true, false (od C99, wymaga stdbool.h)➢ zapisywane jako wartości całkowite (false==0, true==1)
Krzysztof Banaś Podstawy programowania 12
Tablica kodów ASCII (7 bitów)
Krzysztof Banaś Podstawy programowania 13
Zapis binarny
➔ Pozycyjne systemy liczbowe: dziesiętny, dwójkowy, szesnastkowy
➔ Przekształcanie do postaci binarnej i z postaci binarnej➔ Zapis liczb naturalnych
kolejność bajtów (bigendian, littleendian)
➔ Zapis liczb całkowitych – ujemnych i dodatnich ze znakiem (problem podwójnego zera) – zakres (2n1+1, 2n11) z zapisem od podstawy 2n (zakres (2n1, 2n11) – problem 0
(zapis stosowany dla wykładnika liczb zmiennoprzecinkowych) w systemie uzupełnień zakres (2n1, 2n11), 0 jako wszystkie
bity zerowe
Krzysztof Banaś Podstawy programowania 14
Zapis binarny
➔ Zapis liczb rzeczywistych zapis ułamków – rozszerzenie systemu pozycyjnego dwójkowego
• np. liczba 1.38 i jej zapis dwójkowy z czterema bitami po przecinku: 1.0110 (zapis z obcięciem 1.38 = 1.0110 + 0.005)
• problem skończonej dokładności (np. liczba 1.0110 i brak liczb pomiędzy 1.3125, 1.375, 1.4375)
• pojecie cyfr znaczących – przykład powyżej: jedna lub dwie zapis wielkich i małych liczb notacja wykładnicza („naukowa”)
• liczba = znak * mantysa * podstawawykładnik
➢ 2,34*1012, 1.9*1015
• odpowiedniość przesuwania przecinka i zmiany wykładnika• dokładność zależna od liczby bitów mantysy (ok. 10 bitów na
3 cyfry znaczące)
Krzysztof Banaś Podstawy programowania 15
Zapis binarny
➔ Zapis liczb rzeczywistych formaty zmiennoprzecinkowe IEEE 754 pojedyncza precyzja, SP
• 32 bity (znak + 23 bity mantysy + 8 bitów wykładnika) podwójna precyzja, DP
• 64 bity (znak + 52 bity mantysy + 11 bitów wykładnika) mantysa znormalizowana (brak zapisu bitu przed przecinkiem)
• zakres dla liczb dodatnich: ➢ SP: od 1.2x1038 do 3.4x1038, DP: od 2.2x10308 do 1.8x10308
• dokładność w cyfrach znaczących: SP – 6 do 9, DP – 15 do 17 operacje na liczbach zmiennoprzecinkowych IEEE 754
• dodatkowa dokładność w trakcie realizacji operacji• pułapki i wyjątki (nadmiary, niedomiary, błędy operacji)• wartości specjalne (+/0, +/nieskończoność, NaN)
Krzysztof Banaś Podstawy programowania 16
Programowanie
➔ Dane: stałe (z nazwą lub bez) zmienne (na razie tylko z nazwą)
➔ Nazwy zmiennych (i stałych) mogą zawierać litery, cyfry, znak podkreślenia _ nie mogą być słowami kluczowymi języka nie mogą zaczynać się od cyfry duże litery są różne od małych powinny ułatwiać zrozumienie programu:
• np. rok_urodzenia, SredniaOcena itp. konwencje:
• od znaków _ często zaczynają się nazwy zmiennych w bibliotekach• stałe często mają nazwy z samych dużych liter• inne: np. rozróżnienie argumentów i zmiennych lokalnych
Krzysztof Banaś Podstawy programowania 17
Nazwy zmiennych i słowa kluczowe C
➔ słowa kluczowe (keywords): auto break case char const continue defaultdo double else enum extern float for gotoif inline int long register restrict returnshort signed sizeof static struct switchtypedef union unsigned void volatile while+ słowa zaczynające się od _ (np. _Bool)
➔ nazwy w aplikacjach powinny stosować własne konwencje nazwy mogą składać się z różnych składników, z których np.
pierwszy określa program: • mpp_.... (mój pierwszy program itd. np., mpp_liczba_obiektów)
Krzysztof Banaś Podstawy programowania 18
Programowanie
➔ Kod źródłowy zawiera instrukcje➔ Instrukcje mogą być wyrażeniami złożonymi z:
stałych (1, 2.0, 'a', "napis", 037 (==31), 0x1f (==31)) nazw – zmiennych i stałych, ale także funkcji operatorów
➔ Operator związany jest z jednym lub dwoma, rzadko z trzema argumentami produkuje wynik
• dla argumentów określonego typu wynik posiada ściśle określony typ
• zasady użycia operatorów określają możliwe typy argumentów i wyniku
➢ definicje typów określają możliwość stosowania konkretnych operatorów
Krzysztof Banaś Podstawy programowania 19
Operatory
➔ Podstawowe operatory: przypisanie (też jest operatorem i zwraca wynik...:
➢ typ – lewy argument➢ wartość – po przypisaniu
• a = 1; b = a+2; // wyrażenie po lewej stronie i obliczane wyrażenie jednoargumentowe operatory arytmetyczne: +, , ++,
• 3, a, c++, k operatory arytmetyczne: +, , *, /, %
• a+b, c – h*k, 4*n, d/1.0, m%7; // zasady łączności operatory relacji: <, >, <=, >=, ==, != (wynik jako liczba całkowita)
• a<b, c >= d, f==10, wartosc_logiczna != false operatory logiczne: &&, || (wynik jako liczba całkowita)
• a<b && c>=d, d==7 || d <= 4 / /kolejność obliczania złożone operatory przypisania: +=, *=, (także dla innych operatorów)
• a += 2, d *= 4 // wyrażenie po lewej stronie i obliczane wyrażenie jednoargumentowe operatory logiczne: ! (negacja)
Krzysztof Banaś Podstawy programowania 20
Operatory
➔ Zasady języka określają priorytety operatorów
(siłę wiązania z argumentami)
kierunek odczytywania argumentów
➔ Kolejność wykonywania operacji w wyrażeniu wynika z: priorytetów
operatorów użycia nawiasów
Krzysztof Banaś Podstawy programowania 21
Operatory
➔ Konwersje typów: jawna konwersja ma postać: (nowy_typ) wartość:
• int a = (int) 3.5; float f = (float) d; // double d = 0.1; istnieje możliwość dokonywania przez kompilator niejawnej konwersji
przy przypisaniu (a także dla innych operatorów) • int a = 3.5; float f = 0.1; // 0.1 double, 0.1f float
dla operatorów dwuargumentowych niejawna konwersja sprowadza oba do wspólnego typu, tak aby nie utracić precyzji
zapis kodu może oznaczać konieczność konwersji tracącej dokładność • kompilator może zgłosić ostrzeżenie• taka konwersja nie stanowi błędu składni
konwersja może oznaczać utratę dokładności (zaokrąglenia), czasem może także prowadzić do zupełnie błędnych wyników
niejawne konwersje mogą zmniejszać czytelność kodu, ukrywać intencje programisty
Krzysztof Banaś Podstawy programowania 22
Podstawowe typy zmiennych
#include <stdio.h> // USESint main(void) // zwrot kodu błędu lub sukcesu (0){ // definicje (deklaracje – informacje o nazwie i typie + rezerwacja int n; char c; // obszaru w pamięci) // inicjowanie n = 1/3; // instrukcja przypisania c = 'a'; // definicja z inicjowaniem float f = 1.0/3.0; double d = 1.0/3.0; // zapis // d = f; efekt? // możliwe notacje dla liczb zmiennoprzecinkowych printf("liczby i znaki: %c, %7d, %20.15f, %20.15lf\n", c, n, f, d); return(0); // obsługa błędów - temat rzeka}
Krzysztof Banaś Podstawy programowania 23
Operacje na zmiennych
➔ Problemy dla notacji z ograniczoną dokładnością (przykłady dla 4 cyfr znaczących) problemy z dokładnością: ile bitów potrzeba żeby dokładnie zapisać
liczbę 0.1? problemy z arytmetyką
• x * ( 1/x ) ≠ 1 – dla 135 spośród pierwszego tysiąca liczb naturalnych przy zapisie z pojedynczą precyzją
• a + b = a (dla b>0 ale znacznie mniejszego od a) ➢ co z 1/((a+b)a) ?
• 0.005+0.005+10 brak łączności i rozdzielności operacji• przydatność poprawy dokładności w trakcie dokonywania
obliczeń• rozwiązanie niektórych problemów za pomocą zmiany
algorytmu
Krzysztof Banaś Podstawy programowania 24
Problem skończonej precyzji
➔ Przykładowe wskazówki postępowania z liczbami zmiennoprzecinkowymi, dla uniknięcia błędów wynikających ze zbyt małej precyzji:
sumować najpierw małe, potem duże liczby najpierw mnożyć, potem dzielić nie porównywać liczb tylko ich różnicę z małą wartością
double wartosc, wzorzec; // tak samo dla float// obliczanie wartościif( wartosc != wzorzec ) {....}#define TOLERANCJA 1e-9 // tolerancja może być inna dla double i floatif( fabs( wartosc – wzorzec ) <= TOLERANCJA ) {....}
Krzysztof Banaś Podstawy programowania 25
Formatowane wejście/wyjście
➔ Podstawy stosowania funkcji printf: pierwszy argument określa sposób formatowania kolejne argumenty podają dane do wydruku
• mogą to być zmienne lub stałe format to sposób konstruowania napisu
• zadany bezpośrednio – napis (łańcuch znaków)➢ znaki ASCII, znaki sterujące (\t, \n), znaki UTF (uwaga!)➢ jak w programie "hello"
• symbolicznie definiujący reprezentację zmiennych typów liczbowych
➢ %d, %f, %lf, %c, %s➢ %x.ylf – x rozmiar napisu, y – liczba miejsc po
przecinku (np. %20.12lf)
Krzysztof Banaś Podstawy programowania 26
Formatowane wejście/wyjście
➔ Podstawy użycia funkcji scanf argumenty podobne jak dla funkcji printf
• napis będący wzorcem formatowania • lista argumentów pasujących do symboli określających
wstawienie zmiennej określonego typu➢ %d, %f, %lf, %c, %s i inne – podobnie jak dla printf
• argumentami na liście są zawsze adresy, miejsca wstawienia odczytywanych wartości zmiennych
scanf posiada precyzyjne zasady wczytywania wartości zmiennych zgodnie z wzorcem• znaki odstępu, tabulacji, nowej linii są pomijane
najprościej, najwygodniej i najbezpieczniej jest korzystać ze scanf wyłącznie do odczytania jednej wartości zmiennej zgodnie z najprostszym wzorcem:• scanf("%d", &i); scanf("%lf", &a);
top related