Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia stacjonarne I stopnia Rok akademicki 2011/2012 Wykład nr 1 (05.10.2011) dr inż. Jarosław Forenc
Rok akademicki 2011/2012, Wykład nr 1 2/60 Dane podstawowe dr inż. Jarosław Forenc Politechnika Białostocka, Wydział Elektryczny, Katedra Elektrotechniki Teoretycznej i Metrologii ul. Wiejska 45D, 15-351 Białystok WE-204 e-mail: j.forenc@pb.edu.pl tel. (0-85) 746-93-97 http://we.pb.edu.pl/~jforenc Dydaktyka - slajdy prezentowane na wykładzie Konsultacje: Poniedziałek, godz. 12:00-13:00, WE-204 Środa, godz. 9:00-10:00, WE-204 Czwartek, godz. 12:00-13:00, WE-204 Piątek, godz. 16:00-16:45, WE-204 (zaoczne) Sobota, godz. 13:15-14:00, WE-204 (zaoczne)
Rok akademicki 2011/2012, Wykład nr 1 3/60 Przedmiot Informatyka 1 i Informatyka 2 Informatyka 1 semestr II wykład: 15 godz. (J. Forenc) pracownia specjalistyczna: 30 godz. (J. Forenc, M. Mirończuk, W. Walendziuk) ECTS: 4 pkt. kod przedmiotu: ES1A200 009 Informatyka 2 semestr III wykład: 15 godz. (J. Forenc) pracownia specjalistyczna: 30 godz. (J. Forenc, P. Myszkowski) ECTS: 4 pkt. kod przedmiotu: ES1A300 016
Rok akademicki 2011/2012, Wykład nr 1 4/60 Program wykładu (1/2) 1. Wskaźniki, operacje na wskaźnikach, wskaźniki i tablice. Dynamiczny przydział pamięci. Dynamiczne struktury danych: stos, kolejka, lista. Przykłady zastosowań. 2. Programowanie obiektowe w języku C++. Operacje wejścia-wyjścia. Klasy i obiekty. Składniki klasy: dane i funkcje. Prawa dostępu do składników klasy. Definiowanie funkcji składowych klasy. Konstruktory i destruktory. Przeładowanie operatorów. Dziedziczenie. Funkcje wirtualne. 3. Operacje na wektorach i macierzach. Mnożenie macierzy, normy wektorów i macierzy, wyznacznik macierzy.
Rok akademicki 2011/2012, Wykład nr 1 5/60 Program wykładu (2/2) 4. Sortowanie. Klasyfikacje algorytmów sortowania. Algorytmy sortowania: przez proste wstawianie, przez proste wybieranie, bąbelkowe, szybkie (Quick-Sort). 5. System operacyjny. Funkcje i zadania systemu operacyjnego. Zarządzanie procesami, pamięcią (stronicowanie, segmentacja, pamięć wirtualna) i dyskami. Struktura i właściwości systemów Windows i Linux. 6. Sieci komputerowe. Technologie, protokoły, urządzenia. Zasada działania sieci Internet. 7. Relacyjne bazy danych. Podstawowe pojęcia, organizacja i zasady wykorzystania.
Rok akademicki 2011/2012, Wykład nr 1 6/60 Literatura (1/4) Programowanie w C/C++: 1. B.W. Kernighan, D.M. Ritchie: Język ANSI C. Programowanie. Wydanie II. Helion, Gliwice, 2010. 2. J. Grębosz: Symfonia C++ standard: programowanie w języku C++ orientowane obiektowo. Tom 1 i 2. Wydawnictwo Edition 2000, Kraków, 2008. 3. B. Stroustrup: Programowanie. Teoria i praktyka z wykorzystaniem C++. Helion, Gliwice, 2010. 4. J. Liberty, S. Rao, B.L. Jones: C++ dla każdego. Wydanie II. Helion, Gliwice, 2010. 5. B. Eckel: Thinking in C++. Edycja polska. Helion, Gliwice, 2002. 6. S. Prata: Język C++. Szkoła programowania. Wydanie V. Helion, Gliwice, 2006.
Rok akademicki 2011/2012, Wykład nr 1 7/60 Literatura (2/4) Metody numeryczne: 1. D. Kincaid, W. Cheney: Analiza numeryczna. WNT, Warszawa, 2006. Algorytmy i struktury danych: 1. T.H. Cormen i in.: Wprowadzenie do algorytmów. WNT, Warszawa, 2007. 2. P. Wróblewski: Algorytmy, struktury danych i techniki programowania. Wydanie IV. Helion, Gliwice, 2009. 3. N. Wirth: Algorytmy + struktury danych = programy. WNT, Warszawa, 2004
Rok akademicki 2011/2012, Wykład nr 1 8/60 Literatura (3/4) Systemy operacyjne: 1. A.S. Tanenbaum: Systemy operacyjne. Wydanie III. Helion, Gliwice, 2010. 2. A. Silberschatz i in.: Podstawy systemów operacyjnych. WNT, Warszawa, 2006. 3. W. Stallings: Systemy operacyjne. Struktura i zasady budowy. Mikom, Warszawa, 2006. Sieci komputerowe: 1. K. Krysiak: Sieci komputerowe. Kompendium. Wydanie II. Helion, Gliwice, 2005
Rok akademicki 2011/2012, Wykład nr 1 9/60 Literatura (4/4) Bazy danych: 1. H. Garcia-Molina i in.: Systemy baz danych. Pełny wykład. WNT, Warszawa, 2006. 2. M. Whitehorn, B. Marklyn: Relacyjne bazy danych. Helion. Gliwice, 2003.
Rok akademicki 2011/2012, Wykład nr 1 10/60 Zaliczenie wykładu Kolokwium pisemne: Termin zaliczenia: 18.01.2012 (przedostatni wykład) Zaliczenie poprawkowe: 01.02.2012 (ostatni wykład) Przykładowe pytania testowe: na stronie www - koniec grudnia 2011 Zaliczenie wykładu a zaliczenie pracowni: zaliczenie pracowni na ocenę 4+ lub 5 uprawnia do przepisania oceny jako zaliczenia wykładu przy przepisywaniu ocena jest obniżana o pół stopnia: tzn. 4+ 4, 5 4+
Rok akademicki 2011/2012, Wykład nr 1 11/60 Terminy zajęć Wykład nr 1-05.10.2011 Wykład nr 2-19.10.2011 Wykład nr 3-09.11.2011 Wykład nr 4-23.11.2011 Wykład nr 5-07.12.2011 Wykład nr 6-21.12.2011 Wykład nr 7-18.01.2012 (zaliczenie) Wykład nr 8-01.02.2012 (zaliczenie poprawkowe)
Rok akademicki 2011/2012, Wykład nr 1 12/60 Plan wykładu nr 1 (Informatyka 1) Algorytmy definicje sposoby opisu rekurencja złożoność obliczeniowa Języki programowania kompilowane i interpretowane języki programowania generacje języków programowania przykłady języków: asembler, Fortran, BASIC, Pascal, Java, C#
Rok akademicki 2011/2012, Wykład nr 1 13/60 Algorytm - definicje Definicja 1 Skończony, uporządkowany ciąg jasno zdefiniowanych czynności, koniecznych do wykonania pewnego zadania Definicja 2 Metoda rozwiązania zadania Definicja 3 Ściśle określona procedura obliczeniowa, która dla właściwych danych wejściowych zwraca żądane dane wyjściowe zwane wynikiem działania algorytmu
Rok akademicki 2011/2012, Wykład nr 1 14/60 Sposoby opisu algorytmów 1. Opis słowny algorytmu (w języku naturalnym) 2. Opis w punktach (lista kroków) 3. Opis w postaci schematu blokowego 4. Z zastosowaniem pseudokodu, czyli niezbyt formalnej odmiany języka programowania 5. W wybranym języku programowania
Rok akademicki 2011/2012, Wykład nr 1 15/60 Rekurencja Rekurencja lub rekursja - jest to odwoływanie się funkcji lub definicji do samej siebie Rozwiązanie danego problemu wyraża się za pomocą rozwiązań tego samego problemu, ale dla danych o mniejszych rozmiarach W matematyce mechanizm rekurencji stosowany jest dość często do definiowania lub opisywania algorytmów Przykład - silnia: 1 n! = n( n 1)! dla dla n = 0 n 1 int silnia(int n) { return n==0? 1 : n*silnia(n-1); }
Rok akademicki 2011/2012, Wykład nr 1 16/60 Rekurencja - przykłady Przykład - ciąg Fibonacciego: 0 dla n = 0 F n = 1 dla n = 1 F F dla > n 1 + n 2 n 1 int F(int n) { if (n==0) return 0; else if (n==1) return 1; else return F(n-1) + F(n-2); }
Rok akademicki 2011/2012, Wykład nr 1 17/60 Rekurencja - przykłady Przykład - algorytm Euklidesa (największy wspólny dzielnik): NWD( a, b) = a NWD( b, a mod b) dla dla b b = 0 1 int NWD(int a, int b) { if (b==0) return a; else return NWD(b,a % b); }
Rok akademicki 2011/2012, Wykład nr 1 18/60 Złożoność obliczeniowa W celu rozwiązania danego problemu obliczeniowego szukamy algorytmu najbardziej efektywnego czyli: najszybszego o możliwie małym zapotrzebowaniu na pamięć Do oceny efektywności programu służy złożoność obliczeniowa (koszt algorytmu) Złożoność obliczeniowa algorytmu: jest ilością zasobów potrzebnych do jego działania (czas, pamięć) jest funkcją rozmiaru danych, na których pracuje algorytm
Rok akademicki 2011/2012, Wykład nr 1 19/60 Złożoność obliczeniowa Złożoność czasowa: Jej miarą jest liczba podstawowych operacji (dominujących) Podstawowe operacje - porównanie, podstawienie, operacja arytmetyczna Złożoność pamięciowa: Jest miarą wykorzystania pamięci (liczba komórek pamięci) Złożoność pesymistyczna: Odpowiada danym najbardziej niesprzyjającym dla algorytmu Złożoność średnia: Złożoność uśredniona po wszystkich możliwych zestawach danych, występująca dla typowych danych wejściowych
Rok akademicki 2011/2012, Wykład nr 1 20/60 Notacja O ( duże O ) Wyraża złożoność matematyczną algorytmu Po literze O występuje wyrażenie w nawiasach zawierające literę n, która oznacza liczbę elementów, na której działa algorytm Do wyznaczenia złożoności bierze się pod uwagę liczbę wykonywanych w algorytmie podstawowych operacji Przykład: O(n) - złożoność algorytmu jest prostą funkcją liczby elementów (jeśli sortowanie 10.000 elementów zajmuje 5 s, to sortowanie 20.000 elementów zajmie 10 s) O(n 2 )- czas konieczny do wykonania algorytmu rośnie wraz z kwadratem liczby elementów (przy podwojeniu liczby elementów ich obsługa będzie trwała cztery razy dłużej)
Rok akademicki 2011/2012, Wykład nr 1 21/60 Notacja O ( duże O ) Porównanie najczęściej występujących złożoności: Elementy O(log n) O(n) O(n logn) O(n 2 ) O(2 n ) 10 3 10 33 100 1024 100 7 100 664 10 000 1,27 10 30 1 000 10 1 000 9 966 1 000 000 1,07 10 301 10 000 13 10 000 132 877 100000000 1,99 10 3010 O(log n) - złożoność logarytmiczna O(n) - złożoność liniowa O(n log n) - złożoność liniowo-logarytmiczna (quasi-liniowa) O(n 2 ) - złożoność kwadratowa O(2 n ) - złożoność wykładnicza
Rok akademicki 2011/2012, Wykład nr 1 22/60 Język programowania Język programowania jest to usystematyzowany sposób przekazywania komputerowi poleceń do wykonania Język programowania pozwala na dokładny zapis algorytmów oraz innych zadań jakie komputer ma wykonać Dane + algorytm Symbole Język programowania Słowa kluczowe Składnia Semantyka Program
Rok akademicki 2011/2012, Wykład nr 1 23/60 Język programowania Składnia języka określa: sposób opisywania struktur sterujących sposób opisywania struktur danych sposób tworzenia poprawnych symboli do nazywania zmiennych i struktur danych sposób stosowania interpunkcji, tj. znaków typu spacje, średniki, kropki, nawiasy sposób budowy poprawnych wyrażeń Semantyka języka określa znaczenie poprawnych składniowo wyrażeń
Rok akademicki 2011/2012, Wykład nr 1 24/60 Język programowania Implementacja języka - konkretna realizacja języka dla maszyn określonego typu Program komputerowy - zbiór (ciąg) instrukcji opisujących zadanie, które ma wykonać komputer Kod źródłowy - postać programu wyrażona w języku programowania Przetwarzanie kodu źródłowego odbywa się na dwa sposoby kompilacja (kompilowane języki programowania) interpretacja (interpretowane języki programowania)
Rok akademicki 2011/2012, Wykład nr 1 25/60 Język programowania Kompilacja: Kod źródłowy jest tłumaczony do postaci kodu maszynowego (sekwencji operacji gotowych do przetworzenia przez procesor) Kompilacja do kodu maszynowego zapewnia najwyższą wydajność Wygenerowany kod jest ściśle powiązany z platformą sprzętową Przykłady kompilowanych języków programowania: C C++ Pascal Fortran
Rok akademicki 2011/2012, Wykład nr 1 26/60 Język programowania Interpretacja: Kod źródłowy jest na bieżąco tłumaczony i wykonywany przez dodatkowy program zwany interpreterem Zapewnia większą przenośność programów, które są często niezależne od platformy i systemu operacyjnego Programy w językach interpretowanych są mniej wydajne niż w językach kompilowanych Przykłady interpretowanych języków programowania: Java C# Perl Python Ruby
Rok akademicki 2011/2012, Wykład nr 1 27/60 Generacje języków programowania Generacje języków opisują zaawansowanie (rozbudowanie) struktury języka, co jest równocześnie związane z łatwością posługiwania się nimi im mniejsza liczba oznaczająca generację języka tym bardziej jest on zbliżony do sprzętu im większa generacja języka tym jest on bardziej intuicyjny i niezależny od sprzętu
Rok akademicki 2011/2012, Wykład nr 1 28/60 Języki programowania Istnieje około 2500 języków programowania http://www.oreilly.com/pub/a/oreilly/news/languageposter_0504.html (do 2004 roku)
Rok akademicki 2011/2012, Wykład nr 1 29/60 Języki programowania http://www.oreilly.com/pub/a/oreilly/news/languageposter_0504.html (do 2004 roku)
Rok akademicki 2011/2012, Wykład nr 1 30/60 TIOBE Programming Community Index (Sep 2011) 1) Position Sep 2011 Position Sep 2010 Programming Language Ratings Sep 2011 Delta Sep 2010 1 1 Java 18.761% +0.85% 2 2 C 18.002% +0.86% 3 3 C++ 8.849% -0.96% 4 6 C# 6.819% +1.80% 5 4 PHP 6.596% -1.77% 6 8 Objective-C 6.158% +2.79% 7 5 (Visual) Basic 4.420% -1.38% 8 7 Python 4.000% -0.58% 9 9 Perl 2.472% +0.03% 10 11 JavaScript 1.469% -0.20% http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
Rok akademicki 2011/2012, Wykład nr 1 31/60 TIOBE Programming Community Index (Oct 2010) Position Sep 2011 Position Sep 2010 Programming Language Ratings Sep 2011 Delta Sep 2010 11 10 Ruby 1.434% -0.47% 12 12 Delphi/Object Pascal 1.313% -0.27% 13 24 Lua 1.154% +0.60% 14 13 Lisp 1.043% -0.04% 15 15 Transact-SQL 0.860% +0.09% 16 14 Pascal 0.845% +0.06% 17 20 PL/SQL 0.720% +0.08% 18 19 Ada 0.682% +0.01% 19 17 RPG (OS/400) 0.666% -0.05% 20 30 D 0.609% +0.20% http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
Rok akademicki 2011/2012, Wykład nr 1 32/60 TIOBE Programming Community Index (Sep 2011) 1)
Rok akademicki 2011/2012, Wykład nr 1 33/60 Asembler (assembly language) Język programowania niskiego poziomu Powstał na bazie języka maszynowego danego procesora poprzez zastąpienie kodów liczbowych instrukcji kodu maszynowego ich mnemonikami Program w asemblerze jest tłumaczony na kod maszynowy Zazwyczaj jedna instrukcja w asemblerze odpowiada jednemu rozkazowi procesora Składnia języka asemblera zależy od architektury procesora oraz używanego asemblera Tworzenie programu jest dość trudne, ale umożliwia programiście pełną kontrolę nad procesorem Programy napisane w asemblerze są bardzo wydajne
Rok akademicki 2011/2012, Wykład nr 1 34/60 Asembler - przykład programu.model SMALL.286.stack 100h.code start: jmp begin handler: pusha push ds pop ds popa iret begin: mov ax,0000h mov ds,ax mov di,0070h lea ax,handler cli mov [di],ax mov [di+2],cs sti mov ax,3100h mov dx,(offset begin - offset handler) inc dx int 21h end start
Rok akademicki 2011/2012, Wykład nr 1 35/60 Fortran (FORmula TRANslator) Stworzony w latach 50-tych, ale nadal stosowany Pierwszy kompilator Fortranu był jednocześnie pierwszym w historii kompilatorem języka wysokiego poziomu Standardy języka: Fortran IV (1960), Fortran 66, Fortran 77, Fortran 90, Fortran 95, Fortran 2003, Fortran 2008 Głównym zastosowaniem języka Fortran są obliczenia naukowoinżynierskie (w szczególności obliczenia numeryczne) Dysponuje ogromną liczbę bibliotek, które pozwalają rozwiązać praktycznie każde zadanie numeryczne
Rok akademicki 2011/2012, Wykład nr 1 36/60 Fortran - przykład programu program oblicz_srednia parameter (MaxX=1000) dimension x(maxx) character*80 plik_danych write (*,'(a,$)') "Podaj nazwe pliku danych... " 10 read (*,'(a)') plik_danych open (1,file=plik_danych,status="old",err=20) goto 30 20 write (*,*) & "Blad - ten plik nie istnieje. Podaj nazwe jeszcze raz." goto 10 30 continue read (1,*) N do i=1,n read (1,*) x(i) enddo suma = 0.0 do i=1,n suma = suma+x(i) enddo srednia = suma/n write (*,*) "Srednia wynosi",srednia stop end
Rok akademicki 2011/2012, Wykład nr 1 37/60 BASIC (Beginner All-purpose Symbolic Instruction Code) Opracowany w 1964 roku przez J.G. Kemeny ego i T.E. Kurtza w Darthmouth Collage w oparciu o języki Fortran i Algol-60 Popularny w komputerach 8-bitowych (Atari, ZX Spectrum, Amstrad, Commodore) i kalkulatorach programowanych Występował w wielu wersjach dla różnych komputerów - dla IBM PC jako: GW BASIC, QB, QuickBasic, Visual Basic Brak typów, w pierwszych wersjach numerowanie instrukcji Przykładowe instrukcje: skoku bezwarunkowego: GOTO wywołania podprogramu: GOSUB RETURN warunkowa: IF THEN (ELSE) iteracyjna: FOR NEXT
Rok akademicki 2011/2012, Wykład nr 1 38/60 BASIC - przykłady programów 10 INPUT "What is your name: ", U$ 20 PRINT "Hello "; U$ 30 INPUT "How many stars: ", N 40 S$ = "" 50 FOR I = 1 TO N 60 S$ = S$ + "*" 70 NEXT I 80 PRINT S$ 90 INPUT More stars? ", A$ 100 IF LEN(A$) = 0 THEN 90 110 A$ = LEFT$(A$, 1) 120 IF A$ = "Y" OR A$ = "y" THEN 30 130 PRINT "Goodbye ";U$ 140 END INPUT "What is your name: ", UserName$ PRINT "Hello "; UserName$ DO INPUT "How many stars: ", NumStars Stars$ = STRING$(NumStars, "*") PRINT Stars$ DO INPUT More stars? ", Answer$ LOOP UNTIL Answer$ <> "" Answer$ = LEFT$(Answer$, 1) LOOP WHILE UCASE$(Answer$) = "Y" PRINT "Goodbye "; UserName$ QuickBasic
Rok akademicki 2011/2012, Wykład nr 1 39/60 Pascal Język wysokiego poziomu, ogólnego zastosowania, oparty na Algolu, opracowany w 1970 r. przez Niklausa Wirtha Szczyt popularności przypadał na lata 80-te i początek lat 90-tych Pierwotnie służył celom edukacyjnym do nauki programowania strukturalnego - z tego powodu jest jednym z najszerzej znanych i popularnych języków, zwłaszcza wśród początkujących programistów Zastosowanie w praktyce jest obecnie ograniczone Zalety: czytelność, zwięzłość kodu, rygorystyczna kontrola typów Jedną z popularniejszych implementacji kompilatorów tego języka był Turbo Pascal firmy Borland International
Rok akademicki 2011/2012, Wykład nr 1 40/60 Turbo Pascal Version 7.0 - Borland Inter. Inc. (1992)
Rok akademicki 2011/2012, Wykład nr 1 41/60 Pascal program funkcja; var delta, x1, x2 : real; var a, b, c : real; begin writeln ('Podaj wspolczynniki a, b, c trojmianu kwadratowego: '); readln (a, b, c); delta := (b * b) - (4 * a * c); writeln ('Delta = ', delta); if delta < 0 then writeln('brak MIEJSC ZEROWYCH FUNKCJI!') else if delta > 0 then begin x1 := ((- b) - sqrt(delta)) / (2 * a); x2 := ((- b) + sqrt(delta)) / (2 * a); writeln('x1 = ', x1); writeln('x2 = ', x2); end else begin x1 := (- b) / (2 * a); writeln('x1 = ', x1); end; end.
Rok akademicki 2011/2012, Wykład nr 1 42/60 Java Obiektowy język programowania stworzony przez grupę roboczą pod kierunkiem Jamesa Goslinga z firmy Sun Microsystems Programy źródłowe kompilowane są do kodu bajtowego, czyli do postaci wykonywanej przez maszynę wirtualną Podstawowe koncepcje przejęte zostały z języka Smalltalk i C++ Java składa się z szeregu klas definiujących obiekty różnego typu; klasy te pogrupowane są w hierarchicznie ułożone pakiety Podstawowy zestaw klas rozprowadzany jako Java występuje w dwóch wersjach - JRE i JDK: JRE (Java Runtime Environment) - udostępnia bytecode wszystkich klas standardowych i wirtualną maszynę do ich uruchamiania JDK (Java Development Kit) - dodatkowo udostępnia źródła klas oraz dodatkowe narzędzia jak kompilator, paker czy debuger
Rok akademicki 2011/2012, Wykład nr 1 43/60 Java - przykład programu class Person { public String firstname, lastname; public int year; public String PESEL; } public class Proba { public static void main(string[] args) { Person p, q, r; p = new Person(); q = new Person(); r = new Person(); p.firstname = "Jan"; p.lastname = "Kowalski"; p.year = 1981; p.pesel = "81111224350"; } } System.out.println( p.firstname + " " + p.lastname + ", " + p.year + ", PESEL: " + p.pesel );
Rok akademicki 2011/2012, Wykład nr 1 44/60 C# Obiektowy język programowania zaprojektowany pod kierunkiem A. Hejlsberga dla firmy Microsoft w 2001 roku Program napisany w C# kompilowany jest do języka CIL (Common Intermediate Language), specjalnego kodu pośredniego wykonywanego w środowisku uruchomieniowym takim jak.net C# ma wiele cech wspólnych z językami C++ i Java Kolejne wersje: C# 2.0 (2005), C# 3.0 (2007), C# 4.0 (2010)
Rok akademicki 2011/2012, Wykład nr 1 45/60 C# - przykład programu using System; public class PrzykladowaKlasa { public static void Main() { string imie; Console.WriteLine("Podaj swoje imie:"); imie=console.readline(); Console.WriteLine("Twoje imie to: " + imie); } } Console.ReadKey();
Rok akademicki 2011/2012, Wykład nr 1 46/60 Plan wykładu nr 1 Wskaźniki co to jest wskaźnik? deklaracja wskaźnika operacje na wskaźnikach
Rok akademicki 2011/2012, Wykład nr 1 47/60 Wskaźniki - gdzie już występowały? Funkcja scanf() - wymaga podania adresów zmiennych pod którymi będą zapamiętane dane odczytane z klawiatury int a, b; float c; char txt[10]; scanf( %d %d %f %s, &a, &b, &c, txt); Struktury - jeśli posługujemy się wskaźnikiem do struktury, to w odwołaniach do pól struktury stosujemy operator pośredniego wyboru pola: -> struct punkt { int x, y; } p1, *p2; p2 = &p1; p1.x = 10; /* operator bezpośredniego wyboru pola */ p2->x = 10; /* operator pośredniego wyboru pola */
Rok akademicki 2011/2012, Wykład nr 1 48/60 Wskaźniki - gdzie już występowały? Przekazywanie parametrów do funkcji przez wskaźnik: przekazywanie parametrów do funkcji przez wskaźnik polega na tym, że do funkcji przekazywane są adresy zmiennych wszystkie operacje w funkcji wykonywane są zatem na zmiennych z funkcji wywołującej (poprzez adres tych zmiennych) #include <stdio.h> void fun(int *a, int *b) { printf("fun1: a =%3d, b =%3d \n",*a,*b); *a = 10; *b = 10; printf("fun2: a =%3d, b =%3d \n",*a,*b); } int main() { int a = 20, b = 20; } printf("main1: a =%3d, b =%3d \n",a,b); fun(&a,&b); printf("main2: a =%3d, b =%3d \n",a,b); return 0; main1: a = 20, b = 20 fun1: a = 20, b = 20 fun2: a = 10, b = 10 main2: a = 10, b = 10
Rok akademicki 2011/2012, Wykład nr 1 49/60 Co to jest wskaźnik? Wskaźnik jest zmienną mogącą zawierać adres obszaru pamięci, a w szczególności adres innej zmiennej (obiektu) int a; float b; char c, d; int tab[4]; int e; double f; wszystkie zmienne przechowywane są w pamięci komputera i zależnie od typu zmiennej zajmują określoną liczbę bajtów każda zmienna oprócz nazwy ma także adres komputer nie posługuje się nazwami zmiennych tylko ich adresami
Rok akademicki 2011/2012, Wykład nr 1 50/60 Co to jest wskaźnik? Wskaźnik jest zmienną mogącą zawierać adres obszaru pamięci, a w szczególności adres innej zmiennej (obiektu) int a; float b; char c, d; int tab[4]; int e; double f; adresy powyższych zmiennych: a 100 (int, 4 bajty) b 104 (float, 4 bajty) c 108 (char, 1 bajt) d 109 (char, 1 bajt) e 126 (int, 4 bajty) f 130 (double, 8 bajtów) tab 110 (tablica, int, 4 4 bajty)
Rok akademicki 2011/2012, Wykład nr 1 51/60 Wskaźniki Deklaracja wskaźnika: adres określa miejsce w pamięci, nie mówi natomiast nic na temat rozmiaru wskazywanego obiektu deklarując wskaźnik (zmienną wskazującą) musimy podać typ obiektu na jaki on wskazuje deklaracja zmiennej wskazującej wygląda tak samo jak deklaracja każdej innej zmiennej, tylko że jej nazwa poprzedzona jest symbolem gwiazdki (*): typ *nazwa_zmiennej; lub typ* nazwa_zmiennej; lub typ * nazwa_zmiennej;
Rok akademicki 2011/2012, Wykład nr 1 52/60 Wskaźniki Przykład: int *ptr; powyższy zapis oznacza deklarację zmiennej wskaźnikowej do typu int mówimy, że zmienna ptr jest typu: wskaźnik do zmiennej typu int zmienna ptr może przechowywać adresy zmiennych a i e typu int z wcześniejszego przykładu double *ptrd; do przechowywania adresu zmiennej typu double trzeba zadeklarować zmienną typu: wskaźnik do zmiennej typu double
Rok akademicki 2011/2012, Wykład nr 1 53/60 Wskaźniki można konstruować wskaźniki do danych dowolnego typu łącznie z typami wskaźnik do... lub wskaźnik do wskaźnika do... char **wsk; w powyższym przykładzie wsk jest typu wskaźnik do wskaźnika do typu char można deklarować tablice wskaźników
Rok akademicki 2011/2012, Wykład nr 1 54/60 Wskaźniki deklarując wskaźniki lepiej jest pisać * przy zmiennej, a nie przy typie: int *ptr1; /* lepiej */ int* ptr2; /* gorzej */ gdyż nie pomylimy się przy deklaracji np. dwóch wskaźników: int *p1, *p2; int* p3, p4; w powyższym przykładzie zmienne p1, p2 i p3 są wskaźnikami do typu int, zaś zmienna p4 jest zwykłą zmienną typu int
Rok akademicki 2011/2012, Wykład nr 1 55/60 Wskaźniki Przypisywanie wskaźnikom adresów innych zmiennych: adresy zmiennych, które można przypisać wskaźnikom, tworzy się za pomocą jednoargumentowego operatora pobierania adresu &: int a = 10; - deklaracja zmiennej typu int i nadanie jej wartości 10 int *ptr; ptr = &a; - deklaracja wskaźnika do zmiennej typu int - przypisanie zmiennej ptr adresu zmiennej a (od tej chwili zmienna ptr wskazuje na zmienną a; a - zmienna typu int, &a - adres zmiennej a) Odwołanie do zmiennej poprzez jej adres: mając adres zmiennej można dostać się do jej wartości używając tzw. operatora wyłuskania (odwołania pośredniego) - gwiazdki (*): *ptr = 20; - jest równoważne z tym, że zmiennej a z powyższego przykładu przypisujemy wartość 20
Rok akademicki 2011/2012, Wykład nr 1 56/60 Przykład - wskaźniki #include <stdio.h> int main() { int a = 10; /* zmienna typu int */ int *ptr; /* wskaznik do zmiennej typu int */ } printf("wartosc zmiennej a a printf("adres zmiennej a &a = %d\n",a); = %d\n",&a); ptr = &a; /* zmiennej ptr przypisujemy adres zmiennej a */ printf("adres zmiennej a ptr = %d\n",ptr); printf("wartosci zmiennej a *ptr = %d\n",*ptr); *ptr = 20; /* zmiana wartosci zmiennej a */ printf("wartosci zmiennej a *ptr = %d\n",*ptr); printf("wartosc zmiennej a a = %d\n",a); return 0;
Rok akademicki 2011/2012, Wykład nr 1 57/60 Przykład - wskaźniki Wartosc zmiennej a a = 10 #include <stdio.h> Adres zmiennej a &a = 2293644 int main() Adres zmiennej a ptr = 2293644 { Wartosci zmiennej a *ptr = 10 int a = 10; /* zmienna typu Wartosci int */ zmiennej a *ptr = 20 int *ptr; /* wskaznik do Wartosc zmiennej zmiennej typu int a */ a = 20 printf("wartosc zmiennej a a = %d\n",a); printf("adres zmiennej a &a = %d\n",&a); } ptr = &a; /* zmiennej ptr przypisujemy adres zmiennej a */ printf("adres zmiennej a ptr = %d\n",ptr); printf("wartosci zmiennej a *ptr = %d\n",*ptr); *ptr = 20; /* zmiana wartosci zmiennej a */ printf("wartosci zmiennej a *ptr = %d\n",*ptr); printf("wartosc zmiennej a a = %d\n",a); return 0;
Rok akademicki 2011/2012, Wykład nr 1 58/60 Wskaźniki Odwołanie do zmiennej poprzez jej adres: jeśli ptr jest wskaźnikiem do jakiegoś obiektu, to *ptr jest obiektem (zawartością pamięci pod adresem zawartym w ptr, interpretowaną zgodnie z typem obiektu, na który wskazuje ptr) Przykład: int a = 10; /* a - zmienna typu int */ int *ptr = &a; /* ptr - wskaźnik do zmiennej typu int */ int **ptr1 = &ptr; /* ptr1 - wskaźnik do wskaźnika do zmiennej typu int */ a = 20; /* przypisanie zmiennej a wartości 20 */ *ptr = 20; /* j.w. */ *(*ptr1) = 20; /* j.w. */ efekt końcowy wykonania trzech ostatnich instrukcji jest taki sam
Rok akademicki 2011/2012, Wykład nr 1 59/60 Wskaźniki Wskaźnik pusty: wskaźnik pusty to specjalna wartość, odróżnialna od wszystkich innych wartości wskaźnikowych, dla której gwarantuje się nierówność ze wskaźnikiem do dowolnego obiektu do zapisu wskaźnika pustego stosuje się wyrażenie całkowite o wartości zero (0) int *ptr = 0; często zamiast wartości 0 stosowana jest makrodefinicja preprocesora NULL, która podczas kompilacji programu zamieniana jest na 0 int *ptr = NULL;
Rok akademicki 2011/2012, Wykład nr 1 60/60 Koniec wykładu nr 1 Dziękuję za uwagę!