Lab 9 Podstawy Programowania

Podobne dokumenty
Wskaźniki. Informatyka

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Języki i metodyka programowania. Wskaźniki i tablice.

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania skrót z wykładów:

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

6 Przygotował: mgr inż. Maciej Lasota

DYNAMICZNE PRZYDZIELANIE PAMIECI

Stałe, tablice dynamiczne i wielowymiarowe

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

Wskaźniki w C. Anna Gogolińska

KURS C/C++ WYKŁAD 6. Wskaźniki

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Język C++ Różnice między C a C++

Język C zajęcia nr 11. Funkcje

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

ZASADY PROGRAMOWANIA KOMPUTERÓW

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Tablice, funkcje, wskaźniki - wprowadzenie

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:

Podstawy programowania w języku C++

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Materiał. Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Funkcje Wskaźniki Referencje Tablice dynamiczne Typ string Przeładowania funkcji

Techniki Programowania wskaźniki

Wstęp do wskaźników w języku ANSI C

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Wykład nr 3. Temat: Wskaźniki i referencje. Edward Morgan Forster

Podstawy programowania komputerów

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Wykład 1: Wskaźniki i zmienne dynamiczne

Wskaźniki. Programowanie Proceduralne 1

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Podstawy programowania w języku C++

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Przykład 1: Funkcja jest obiektem, przypisanie funkcji o nazwie function() do zmiennej o nazwie funkcja1

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

Programowanie w języku C++

Tablice, funkcje - wprowadzenie

Język C++ zajęcia nr 2

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

Podstawy programowania w języku C++

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Język C, tablice i funkcje (laboratorium, EE1-DI)

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Wykład 4: Klasy i Metody

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Wykład 8: klasy cz. 4

Laboratorium nr 10. Temat: Funkcje cz.2.

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Programowanie w C++ Wykład 4. Katarzyna Grzelak. 19 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 37

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Zmienne, stałe i operatory

4. Tablica dwuwymiarowa to jednowymiarowa tablica wskaźników do jednowymiarowych tablic danego typu.

PARADYGMATY PROGRAMOWANIA Wykład 4

Podstawy programowania. Wykład: 7. Funkcje Przekazywanie argumentów do funkcji. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

//zmienne globalne int *pa, *pb; //wskaźniki globalne void main(void) { clrscr(); printf("\n podaj wartosc liczby a\n"); scanf("%d",&a); pa=&a;

Wprowadzenie do programowania w języku C

Podstawy programowania. Wykład: 8. Wskaźniki. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Rekurencja (rekursja)

Podstawy Programowania C++

Część 4 życie programu

Zajęcia 6 wskaźniki i tablice dynamiczne

Szablony klas, zastosowanie szablonów w programach

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Programowanie komputerowe. Zajęcia 3

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

W dowolnym momencie można zmienić typ wskaźnika.

Zajęcia 6 wskaźniki i tablice dynamiczne

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Programowanie - wykład 4

Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Spis treści WSKAŹNIKI. DYNAMICZNY PRZYDZIAŁ PAMIĘCI W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Programowanie obiektowe W3

Referencje do zmiennych i obiektów

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy KONSTRUKTORY

Spis treści JĘZYK C - WSKAŹNIKI, DYNAMICZNY PRZYDZIAŁ PAMIĘCI. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu

Języki i techniki programowania Ćwiczenia 2

Algorytmy i język C++

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Wstęp do programowania 2

Transkrypt:

Lab 9 Podstawy Programowania (Kaja.Gutowska@cs.put.poznan.pl) Wszystkie kody/fragmenty kodów dostępne w osobnym pliku.txt. Materiały pomocnicze: Wskaźnik to specjalny rodzaj zmiennej, w której zapisany jest adres w pamięci komputera. Oznacza to, że wskaźnik wskazuje miejsce, gdzie zapisana jest jakaś informacja (np. zmienna typu liczbowego czy struktura). Adres pamięci to pewna liczba całkowita, jednoznacznie definiująca położenie pewnego obiektu w pamięci komputera. Tymi obiektami mogą być np. zmienne, elementy tablic czy nawet funkcje. Jeżeli str jest obiektem typu char, a pstr ma być wskaźnikiem, który wskazuje na ten obiekt, to taki wskaźnik można zdefiniować następujący sposób: char str; char *pstr; pstr=&str; * - operator dereferencji, czyli operator odwołania się danych wskazywanych przez dany wskaźnik. & - operator pobrania adresu (zmiennej, struktury, tablicy itp.). Deklaracja: typ *wskaznik; typ tablica[rozmiar]; Zarówno wskaźnik jak i tablica są zmiennymi typu wskaźnikowego (przy czym tablica jest zmienną, której nie można przypisać innej wartości). Przypisanie adresu do wskaźnika: wskaznik = inny_wskaznik; wskaznik = &zmienna; Odczyt wartości z adresu/zapis pod adresem: zmienna = *wskaznik; *wskaznik = wartosc; // stała, zmienna, funkcja lub wyrażenie

Działania na wskaźnikach: wskaznik++; wskaznik- -; wskaznik + indeks; wskaznik[indeks]; Uwagi, komentarze: Operator wyłuskania (*zmienna) ma wysoki priorytet, szczególnie z operatorami ++ i -- należy być ostrożnym (czy to dotyczą wskaźnika czy też wartości w pamięci pod adresem wewnątrz wskaźnika). Poniższe działania można łączyć: wskaznik = inny_wskaznik + indeks; zmienna = *(wskaznik + indeks); zmienna = *wskaznik++; Dynamiczna alokacja pamięci: -Czasami z góry nie wiadomo ilu elementowa tablica będzie potrzebna. Deklaruje się wówczas zmienną wskaźnikową pożądanego typu i wywołuje funkcje alokacji pamięci (o żądanym rozmiarze). Funkcja ta zwraca adres pamięci. Należy to wpisać do wskaźnika na którym można później już normalnie działać (np. wskaznik[indeks] = wartosc;). -Kiedy zaalokowana pamięć jest niepotrzebna, należy ją zwolnić. -Uwaga - niezwolnione obszary pamięci, czytanie i zapisywanie pod niedozwolone adresy to częste i poważne błędy programistyczne. -Funkcje alokujące i zwalniające pamięć malloc() i free() w C zostały zastąpione w C++ przez operatory new oraz delete. -Obszar pamięci jaki zostanie przydzielony może zawierać dowolne wartości ("śmieci", poprzednie dane). Nie wolno robić żadnych założeń co do zawartości pamięci. Wskaźniki typu void: W C wskaźniki dowolnego typu mogą być przydzielane do wskaźników typu void i odwrotnie, natomiast w C++ wymagana jest jawna konwersja: void *wsk; char *str = Tekst ; wsk = (char*) str;

Referencja: -W C++ można tworzyć tzw. zmienne referencyjne. Jeśli zadeklarujemy zmienną referencyjną do innej zmiennej, to jakiekolwiek zmiany wartości dowolnej z powiązanych w ten sposób zmiennych będą odnosiły się również do drugiej z nich: int w = 4; int &n = w; //n jest zmienną referencyjną do w n = 12; //w == 12 && n == 12 w = 8; //w == 8 && n == 8 -Referencja jest najczęściej wykorzystywana w funkcjach modyfikujących swoje argumenty. W C konieczne było w tym celu przekazywanie do funkcji wskaźników do zmiennych. void change(int &a, int &b) { } int t; t = a; a = b; b = t; int main() { } int *wsk; int a = 3, b = 5; change(a, b); //a == 5 && b == 3 return 0; Różnice: -W C++ operatory new i delete. -W C malloc, calloc, realloc, free, sizeof, konwersje wskaźników z void*. Przykłady do przetestowania i zrozumienia: P.1.1 wskaźniki (kod w osobnym pliku) P.1.2 - wskaźniki c.d. (kod w osobnym pliku) P.2 - wskaźniki i tablice (kod w osobnym pliku) W języku C wskaźniki i tablice w wielu przypadkach traktowane są tak samo. Elementy tablicy podczas uruchamiania programu przypisywane są do kolejnych adresów w pamięci. Taki sposób alokacji pamięci dla tablic pozwala na odnalezienie danego elementu tablicy za pomocą indeksów lub za pomocą wskaźników.

Zadanie 1: Początkowo zadeklaruj tablicę kilku elementów, niech rozmiar będzie stałą (np. const int size = 3 ), wyświetl dla każdego elementu: numer indeksu i wartość tablicy. Następnie chcemy mieć tablicę, która może przechowywać wskaźniki dla typu int. Zatem deklarujemy zmienna wskaźnikową ptr jako tablicę wskaźników dla typu int, o rozmiarze size (tak aby każdy element w ptr zawierał wskaźnik do wartości int). Przypisujemy adresy i wyświetlamy dla całej tablicy: numer indeksu i wartość elementu wskazywanego przez wskaźnik. Zadanie 2: Wykorzystaj tablice z poprzedniego zadania, zadeklaruj wskaźnik i przypisz adres na pierwszy element tablicy. Następnie w pętli dla całej tablicy wyświetl adres i wartość elementu wskazywanego przez wskaźnik (wykorzystaj inkrementację wskaźnika ptr++). P.3 - wskaźniki i funkcje (kod w osobnym pliku) W języku C parametry do funkcji przekazywane są zawsze przez wartość. Co znaczy, że wewnątrz funkcji operujemy jedynie na kopiach zmiennych. Przekazując do funkcji zamiast zwykłych zmiennych wskaźniki do tych zmiennych, mamy możliwość modyfikacji oryginalnych wartości przechowywanych przez zmienne w ciele funkcji. Zadanie 3: Napisz funkcję swap, która zamienia element a i b (a na b, b na a). P.4 - Funkcja zwracająca wskaźnik (kod w osobnym pliku) Funkcja zwracająca wskaźnik do funkcji wywołującej. W przypadku takich funkcji należy zachować szczególną ostrożność ponieważ zmienne lokalne funkcji NIE działają poza funkcją. Mają zasięg tylko wewnątrz funkcji. P.5 Wskaźnik na wskaźnik (kod w osobnym pliku) Normalnie wskaźnik zawiera adres zmiennej. Gdy definiujemy wskaźnik na wskaźnik to pierwszy wskaźnik, zawiera adres drugiego wskaźnika, który wskazuje na adres zmiennej: P.6 - malloc() i free() (kod w osobnym pliku) malloc() - bezpośrednie przydzielenie pamięci dla wskaźnika (bez pośrednictwa zwykłej zmiennej). Deklaracja: int *ptr; ptr = (int*)malloc(n * sizeof(int)); lub int * ptr = (int*)malloc(n * sizeof(int)); gdzie: (int *) - rzutowanie na typ wskaźnika dla jakiego przydzielmy pamięć, ponieważ funkcja malloc zwraca zawsze void* (sizeof(int)) argumentem dla funkcji malloc jest wielkość obszaru pamięci jaki chcemy przydzielić. Tu jest to rozmiar jednego inta, dlatego aby poprawnie przydzielić pamięć mnożymy przez n-elementów. Używając takiej definicji można tworzyć tablice dynamicznie wielkość tablicy jest ustalana w trakcie działania programu, np. wartość n podawana przez użytkownika z klawiatury.

Polecam przejrzeć https://pl.wikibooks.org/wiki/c/wska%c5%baniki, w szczególności punkt: Możliwe deklaracje wskaźników Zadania: 1. Napisz program definiujący zmienną typu int oraz wskaźnik do zmiennej typu int. Program powinien wczytać z klawiatury wartość i podstawić ją do zmiennej stosując wskaźnik i operator adresu. 2. Na podstawie fragmentu kodu 2 (kod w osobnym pliku) napisz program, który wyświetli tablicę "jakas_tablica". A następnie poprzez wskaźnik wsk element tablicy o indeksie 7 zostanie zmieniony na 77 i ponownie wyświetli tablicę. 3. Zadeklaruj tablice 10-elementów i wyświetl dla każdego elementu jego adres (ptr) oraz wartość elementu wskazywanego przez wskaźnik (*ptr). Wartości wyświetlaj od największego indeksu do najmniejszego (wykorzystaj dekrementację wskaźnika ptr--). 4. Wskaźniki można porównywać wykorzystując operatory relacyjne. Wykorzystaj zadanie 2 z punktu wskaźniki i tablice i zmodyfikuj je następująco: dopóki adres, na który wskazuje zmienna wskaźnikowa jest mniejszy lub równy ostatniemu elementowi tablicy to: wyświetlaj adres oraz wartość elementu wskazywanego przez wskaźnik a następnie zwiększ zmienną wskaźnikową. 5. Utwórz funkcję, która zwraca średnią arytmetyczną liczb. Funkcja ta jako parametry przyjmuje wskaźnik na tablicę i rozmiar tablicy. 6. Napisz program, który realizuje następujące funkcje dla tablic jednowymiarowych (alokowanych dynamicznie): -Dodaje odpowiadające sobie elementy tablic suma dwóch wektorów, -Mnoży odpowiadające sobie elementy tablic, -Wyznacza różnicę pomiędzy maksymalnym a minimalnym elementem tablicy 7. Napisz program, który prosi użytkownika o podanie n zbiorów składających się z k liczb typu double, a następnie: -Zapisuje te dane w tablicy o wymiarach n x k, -Oblicza średnią dla każdego zbioru z osobna. -Oblicza średnią dla wszystkich wartości, -Znajduje największą spośród wartości. Wyświetla wyniki.