Podstawy programowania - PowerPoint PPT Presentation

Podstawy programowania
Download
1 / 26

  • 91 Views
  • Uploaded on
  • Presentation posted in: General

Zachodniopomorska Szkoła Biznesu. Podstawy programowania. Wykład 5: Tablice i wskaźniki. Dane złożone. Często do opisu pewnego obiektu lub grupy obiektów nie wystarcza pojedyncza zmienna konieczne jest wtedy zdefiniowanie zbioru różnych zmiennych, które tworzą pewną całość

I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.

Download Presentation

Podstawy programowania

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Podstawy programowania

Zachodniopomorska Szkoła Biznesu

Podstawy programowania

Wykład 5: Tablice i wskaźniki


Dane z o one

Dane złożone

  • Często do opisu pewnego obiektu lub grupy obiektów nie wystarcza pojedyncza zmienna

  • konieczne jest wtedy zdefiniowanie zbioru różnych zmiennych, które tworzą pewną całość

  • W języku C++ dla opisu takiej sytuacji stosuje się typy złożone, które pozwalają pod jedną nazwą zmiennej pozwalają ukryć wiele prostych wartości

  • Najważniejsze typy złożone:

    • tablica

    • struktura (rekord)

    • klasa (programowanie obiektowe)

Podstawy programowania - Tablice i wskaźniki


Tablice

Tablice

  • Stosowane są gdy chcemy w sposób uporządkowany zapisać zbiór wartości tego samego typu, np.

    • oceny poszczególnych studentów z grupy

    • ceny produktów w ofercie

    • nazwiska znajomych

  • Każdy element tablicy ma swój indeks (numer), który jednoznacznie go identyfikuje

  • Można powiedzieć, że tablica to uporządkowany zbiór zmiennych jednakowego typu

  • Zdefiniowanie tablicy wymaga podania typu elementu oraz liczby elementów

  • Ze względu na sposób uporządkowania elementów można wyróżnić tablice jednowymiarowe, dwuwymiarowe, itd.

  • Rozmiar tablicy (liczba elementów) musi być określona już w trakcie pisania programu

Podstawy programowania - Tablice i wskaźniki


Deklaracja tablicy jednowymiarowej

Deklaracja tablicy jednowymiarowej

  • Składnia:

    typ nazwa[liczba_elementów]; // całkowita>0

  • Przykłady

    float oceny_grupy[30];

    int duzy_lotek[6];

    int a,b[10],c,d[2]; // b,d - tablice

  • Inicjalizacja tablicy:

    float punkt3D[3] = {0, 2, 1.5 };

    int duzy_lotek[3+3]= {2,4,6,7}; // można mniej

    Nie można podać więcej wartości niż zdefiniowano w tablicy.

    b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] b[8] b[9]tablica b:

Podstawy programowania - Tablice i wskaźniki


Korzystanie z tablicy

Korzystanie z tablicy

  • Dostęp do tablicy odbywa się dla każdego elementu osobno, każdy z nich można wykorzystywać jak normalną zmienną, należy w tym celu podać nazwę tablicy oraz wyrażenie określające indeks pomiędzy znakami: ‘[‘ i ‘]‘

  • Indeksy elementów w C++ zaczynają się zawsze od 0 !!!Jeżeli wielkość tablicy to N, indeksy elementów to 0 ... N-1

  • Nie wolno korzystać z elementów o indeksach wykraczających poza zadeklarowany zakres

  • Przykłady:int x,tablica[10];tablica[0]=1;tablica[5]=2;tablica[6]=tablica[5]+2;x=2*tablica[6];tablica[x+1]=10;// obliczenie indeksutablica[10]=0;// błąd: poza tablicą!!!jakie wartości są teraz w tablicy?

Podstawy programowania - Tablice i wskaźniki


Algorytmiczny dost p do tablicy

Algorytmiczny dostęp do tablicy

  • Wykorzystanie zmiennych do określania indeksu umożliwia dostęp do poszczególnych elementów za pomocą pętli, zwykle jest to pętla for

  • Przykładowy fragment programu:float tablica[10];for (int i=0; i<5; i++) // zerowanie elementów 0-4tablica[i]=0;for (i=5; i<10; i++) tablica[i]=i-1; // el. 5-9, wartości 4-8tablica po wykonaniu programu:

Podstawy programowania - Tablice i wskaźniki


Sumowanie element w tablicy

Sumowanie elementów tablicy

#include <iostream.h>

#define N 10

void main()

{

int i, tab[N];// N to nie zmienna!for (i=0; i<N; i++)// pobieranie danych{cout << "Podaj element " << i << ":";cin >> tab[i];}int suma=0; // obowiązkowe wyzerowaniefor (i=0; i<N; i++)suma+= tab[i]; // czyli suma=suma+tab[i]cout << ”Średnia wartość:” << (float)suma/N << endl;

}

Podstawy programowania - Tablice i wskaźniki


Warto maksymalna minimalna

Wartość maksymalna / minimalna

float tab[10];...// pomijamy wprowadzaniefloat min=tab[0], max=tab[0];int nrmin=0, nrmax=0;for (int i=0; i<N; i++) // szukamy największegoif (tab[i]>max)

{max=tab[i];nrmax=i;}for (i=0; i<N; i++) // szukamy najmniejszegoif (tab[i]<min){min=tab[i];nrmin=i;}

cout << ”Największy jest element: ” << nrmax;cout << ", wynosi: " << max << endl;cout << ”Najmniejszy jest element: ” << nrmin;cout << ", wynosi: " << min << endl;

Podstawy programowania - Tablice i wskaźniki


Szukanie i zliczanie element w spe niaj cych podane kryterium

Szukanie i zliczanie elementów spełniających podane kryterium

float tab[10];...// pomijamy wprowadzanieint licznik=0;// wyzerowanie licznika

for (int i=0; i<N; i++){cout << "element " << i << ": ";if (tab[i]>0)// szukamy liczb dodatnich

{cout << tab[i] << " jest dodatni\n";licznik++;}}cout << "Dodatnie : " << licznik << endl;cout << "Niedodatnie: " << N-licznik << endl;

Podstawy programowania - Tablice i wskaźniki


Tablica jako parametr funkcji

Tablica jako parametr funkcji

  • Jeżeli funkcja przyjmuje tablicę jako parametr, wyjątkowo nie jest ona przesyłana jako kopia. Przesyłany jest adres tablicy źródłowej. Funkcja może więc zmienić zawartość tej tablicy

  • W nagłówku funkcji można pominąć rozmiar tablicy ponieważ nie jest to deklaracja nowej tablicy (pamięć już przydzielono)

  • Przykład:

    void zeruj(float tab[], int n){for (int i=0; i<n; i++)tab[i]=0.0;}void main(){float tablica[10];zeruj(tablica, 10);}

Podstawy programowania - Tablice i wskaźniki


Deklaracja tablicy dwuwymiarowej

Deklaracja tablicy dwuwymiarowej

  • Można myśleć o takiej tablicy jak o macierzy prostokątnej

  • Zawiera więc ona NxM elementów, które uporządkowane są w N kolumn i M wierszy

  • W składni języka C++ należy ją rozumieć jako tablicę tablic

  • Składnia:

    typ nazwa[M][N]; // tablica M tablic N-element.

  • Przykład:

    float oceny[30][5]; // 30 studentów po 5 ocen

  • Dostęp do elementu (wiersz i, kolumna j):

    nazwa[i][j];np.oceny [1][3];

  • Każdy z indeksów numerowany jest od 0!

5

30

...

Podstawy programowania - Tablice i wskaźniki


Korzystanie z tablicy dwuwymiarowej

Korzystanie z tablicy dwuwymiarowej

  • W celu przetworzenia wszystkich elementów tablicy z reguły używa się dwóch zagnieżdżonych pętli for (pętla w pętli)

  • Przykład: utworzenie i wydruk macierzy jednostkowej 10x10:

    float macierz [10][10];for (int i=0; i<10; i++) // kolejne wierszefor (int j=0; j<10; j++) // kolejne kolumny if (i==j) macierz[i][j]=1; else macierz[i][j]=0;// krócej: macierz[i][j]= (i==j);

    for (i=0; i<10; i++){for (j=0; j<10; j++)cout << macierz[i][j] << " ";cout << endl;}

Podstawy programowania - Tablice i wskaźniki


Tablica dwuwymiarowa jako parametr funkcji

Tablica dwuwymiarowa jako parametr funkcji

void zerujmacierz(float tab[][5], n) // n wierszyfor (int i=0; i<n; i++)// m musimy znać for (int j=0; j<5; j++) tab[i][j]=0.0;}void zerujwiersz(float tab[], m) // m - dł. wiersza{for (int i=0; i<n; i++)tab[i]=0.0;}void main(){float tablica[10][5];zerujmacierz(tablica,30); zerujwiersz(tablica[2], 5); // zerujemy wiersz 2}

Podstawy programowania - Tablice i wskaźniki


Wska niki

Wskaźniki

  • W wielu sytuacjach istnieje potrzeba przechowywania lub przesyłania informacji na temat położenia zmiennej w pamięci.

  • W języku C/C++ służą do tego zmienne o specjalnych typach danych zwanych wskaźnikami (ang. pointer)Zawierają one informacje o:

    • adresie danej w pamięci -

    • typie danej (a więc i o jej rozmiarze w bajtach)

  • Każdemu z typów podstawowych można przypisać typ wskaźnikowy przeznaczony do pokazywania na zmienne tego typu. Typ wskaźnikowy określany jest za pomocą operatora *, jako typ * , np. wskaźnik do zmiennej typu int to int *

  • Pobranie adresu zmiennej odbywa się za pomocą operatora &,a pobranie wartości z adresu, na który pokazuje wskaźnik - za pomocą operatora * stojącego po jego lewej stronie

  • Uwaga! Wskaźnik zawsze na coś pokazuje!

Podstawy programowania - Tablice i wskaźniki


Wska niki przyk ad

Wskaźniki - przykład

void main()

{int a=10,b=20; int *iwsk;// wskaźnik na int iwsk=&a;// iwsk pokazuje teraz na ab= *iwsk+1;// pobranie wartości spod adresuiwsk=&b;// iwsk pokazuje teraz na bfloat x, *fwsk; // fwsk jest typu float*iwsk= &x;// błąd - inny typ wskaźnika!!!fwsk=iwsk;// j.w.fwsk=&x;x=5;cout << *fwsk<< endl;// wypisze 5x=6;cout << *fwsk<< endl;// wypisze 6 !

}

Podstawy programowania - Tablice i wskaźniki


Operacje na wska nikach

Operacje na wskaźnikach

  • Porównywanie (operatory ==, !=, <, >, <=, >=) porównywane są adresy zapisane we wskaźnikach, ale typy bazowe muszą być jednakowe

  • Odejmowanie wskaźnikówmożna odjąć dwa wskaźniki o jednakowych typach bazowych. Wynikiem będzie różnica adresów podzielona przez rozmiar typu bazowego (ile elementów dzieli te adresy)

  • Dodawanie/odejmowanie od wskaźnika wartości całkowitej oznacza przesunięcie zapisanego adresu o podaną liczbę elementów. Liczba bajtów przesunięcia zależy od rozmiaru typu bazowego.Można korzystać również z operatorów ++ i --

  • Wskaźnik zerowy (NULL)wartość 0 jako jedyna traktowana jest jako nie wskazująca na nic. Symbol NULL zdefiniowany jest w stdio.h, stdlib.h, i w iostream.h

Podstawy programowania - Tablice i wskaźniki


Przyk ady operacji na wska nikach

Przykłady operacji na wskaźnikach

int *wsk1, *wsk2=NULL;

*wsk1=5;// uwaga! wskaźnik przypadkowy!!!

*wsk2=5;// tutaj zareaguje system

int a,b,c;

wsk1=&a;

wsk2=&c;

cout << "Adres a: " << wsk1 << end; // można wypisywać

cout << "Następny po a: " << wsk1+1 << endl;

cout << "Różnica c i a to: " << wsk2-wsk1 << endl;

cout << "większy: ((wsk1>wsk2) ? wsk1 : wsk2) << endl;

Podstawy programowania - Tablice i wskaźniki


Typ void

Typ void *

  • Jest to wskaźnik uniwersalny, który może pokazywać na każdy typ danych

  • Nie posiada jednak informacji o typie, a więc i o rozmiarze pokazywanego elementu

  • Nie można jednak stosować wobec niego operatora * (odczytywać danej, na którą pokazuje)

  • Nie można stosować do niego dodawania stałej, ani odejmować takich wskaźników (nieznany jest rozmiar elementu)

  • Można do niego przypisać wartość dowolnego innego wskaźnika(niejawna konwersja typu)

  • Przypisanie wartości wskaźnika void * do innego wskaźnika, a także odczyt pokazywanej danej są możliwe ale wymagają jawnej konwersji

  • Stosuje się go do wskazywania danych o nieokreślonej postaci

Podstawy programowania - Tablice i wskaźniki


Przyk ady u ycia void

Przykłady użycia void *

void *adres;int *iwsk;float *fwsk;

int i=5,j;float f;

adres=&i;// tu nie trzeba konwersjiiwsk=adres;// nie uda sięiwsk=(int *) adres;// konwersja jawna - uda się!fwsk=(float *)adres;// to też się uda!j=*adres;// to się nie udaj=*iwsk;f=*fwsk;// ciekawe co jest w f ???

Podstawy programowania - Tablice i wskaźniki


Wska nik a tablica

Wskaźnik a tablica

  • Nazwa tablicy (bez nawiasów []) jest wskaźnikiem do jej zerowego (początkowego) elementu

  • Jest to wskaźnik, którego wartości nie można zmienić (wskaźnik stały). Można jednak używać go w różnych wyrażeniach

  • Do wskaźnika wolno użyć nawiasów [], tak, jak gdyby był on zadeklarowany jako tablica jednowymiarowa

  • Przykłady:

    int tab[10];int *poczatek=tab;// wskazuje na tab[0]int*koniec=tab+9;// wskazuje na tab[9]int numer2= tab[2]; // tablica normalnienumer2= *(tab+2);// tab. jako wskaźniknumer2= *(poczatek+2);// wskaźnik normalnienumer2= poczatek[2];// wskaźnik jako tab

    tab=&numer2;// błąd! wskaźnik stały

Podstawy programowania - Tablice i wskaźniki


Typ char sta e i zmienne

Typ char - stałe i zmienne

  • Jest to typ znakowy, przydatny do przetwarzania tekstu, obsługi klawiatury i ekranu

  • Pozwala na zapamiętanie jednego znaku w postaci tzw. kodu ASCII (jednobajtowa liczba całkowita)

  • Domyślnie signed/unsigned zależy od kompilatora

  • Wartość typu char można traktować w wyrażeniach jako liczbę całkowitą, konwersje znak - liczba odbywają się automatycznie

  • Stałe znakowe

    • znak pomiędzy parą znaków' i', np. 'A', '0', '@'

    • znak \ i kod ASCII pomiędzy parą znaków' i', np. '\65', '\0'

    • W przypadku przypisania liczby do zmiennej znakowej, następuje automatyczna konwersja na znak o podanym kodzie ASCII

  • Znaki specjalne'\n'(new line),'\t'(tab), '\\', '\'', '\"'

Podstawy programowania - Tablice i wskaźniki


Typy char i char

Typy char[]i char *

  • W celu zapisu tekstu tworzy się tablice znaków.W języku C wprowadzono konwencję, zgodnie z którą tekst kończy się znakiem '\0' (na który trzeba przewidzieć dodatkowy bajt w tablicy) - tzw. null-terminated string

  • Praca z taką tablicą wymaga zwykle przetwarzania każdego znaku z osobna. Stosuje się do tego pętle, najczęściej pętlę for.W całości można jedynie dokonać inicjalizacji tablicy.Operacje na całym tekście można też wykonywać z udziałem wielu funkcji bibliotecznych.

  • Zmienne typu char* wskazują na pojedyncze znaki, opisuje się też w ten sposób również cały tekst (wskazując pierwszy znak)

  • Stałe tekstowe zapisuje się pomiędzy parą znaków " i "Są one typu char*

  • Przydatne funkcje obsługujące teksty (zdefiniowane jako tablice lub wskaźniki) znaleźć można w pliku string.h

Podstawy programowania - Tablice i wskaźniki


Przyk ady pracy z tekstem

Przykłady pracy z tekstem

char nazwisko[31];// max. 30 znaków + '\0'

char logo1[]= "ZPSB"; // wygodna inicjalizacja

char logo2[]={'Z','P','S','B','\0'}; // tak też można

char imie[20]="Michał";// rozmiar jest większy

nazwisko="Kowalski"// Błąd! stały wskaźnik!

nazwisko[7]='a';

char *tekst=imie;

*tekst='A';//wstawimy "ABC" do imie

*(tekst+1)='B';

tekst[2]='C';

tekst[3]=0;// koniec, konwersja z int

cin >> nazwisko;// musi wystarczyć miejsca!

cout << nazwisko<< endl;

Podstawy programowania - Tablice i wskaźniki


Wska nik jako parametr funkcji 1

Wskaźnik jako parametr funkcji (1)

  • Funkcja może jako parametr przyjmować wskaźnik. Wartość wskaźnika jest kopiowana, więc wskazuje on na tę samą zmienną, co wskaźnik wysłany jako parametr

  • Pozwala to funkcji na zmianę wartości tej zmiennej, co nie jest możliwe przy zwykłym przesyłaniu danych przez wartość

  • Przykład:

    void zeruj_ujemne (int *liczba){if (*a<0) a=0;}void main(){int a=-5;// tutaj a=-5int *wsk=&a;zeruj_ujemne(wsk); // a tutaj już a=0zeruj_ujemne(&a);// tak też można}

Podstawy programowania - Tablice i wskaźniki


Wska nik jako parametr funkcji 2

Wskaźnik jako parametr funkcji (2)

  • Wskaźnik służy też zwykle do przekazywania tablicy (także tekstu) jako parametr.

  • Często wykorzystuje się też wskaźniki, jeżeli funkcja generuje kilka różnych wartości wynikowych (zwrócić można tylko jedną)

  • Przykład (zliczanie wartości dodatnich i niedodatnich w tablicy):

    void plusminus(int *tab, int n, int *plus, int *minus){int pl=0, min=0;// zmienne lokalnefor (int i=0; i<n; i++) if (tab[i]>0) pl++;// wskaźnik jako tabl. elsemin++;*plus=pl;// przekazanie wyników*minus=min;} // nie ma return, a funkcja zwraca wynikivoid main(){int tablica[20], ileplus, ileminus;plusminus(tablica, 20, &ileplus, &ileminus);}

Podstawy programowania - Tablice i wskaźniki


To ju jest koniec

To już jest koniec++

Dziękuję za uwagę


  • Login