Tablice. int rozmiar; cout << Jaki ma być rozmiar tabeli? ; cin >> rozmiar; { int tablica[rozmiar]; /* TU JEST ŹLE */... }

Podobne dokumenty
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:

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

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

Przekazywanie argumentów wskaźniki

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

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

Języki programowania obiektowego Nieobiektowe elementy języka C++

Część 4 życie programu

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

Podstawy programowania

tablica: dane_liczbowe

Tablice, funkcje - wprowadzenie

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

Podstawy programowania w języku C++

Podstawy algorytmiki i programowania - wykład 1 Tablice powtórzenie Tablice znaków Tablice dwuwymiarowe

Inicjacja tablicy jednowymiarowej

Tablice deklaracja, reprezentacja wewnętrzna

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

Podstawy programowania. Wykład: 6. Tablice statyczne. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Podstawy Programowania C++

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Podstawy Programowania

Programowanie - wykład 4

Tablice są typem pochodnym. Poniżej mamy przykłady deklaracji różnych tablic:

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.

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

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

Algorytmika i programowanie. Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie

dr inż. Jarosław Forenc

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

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

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

Wymiar musi być wyrażeniem stałym typu całkowitego, tzn. takim, które może obliczyć kompilator. Przykłady:

Programowanie i struktury danych

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

ZASADY PROGRAMOWANIA KOMPUTERÓW

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

Wstęp do programowania

Wskaźniki. Informatyka

Programowanie w języku C++

I - Microsoft Visual Studio C++

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

Podstawy algorytmiki i programowania - wykład 2 Tablice dwuwymiarowe cd Funkcje rekurencyjne

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

Wstęp do programowania

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Podstawy programowania w języku C++

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

Stałe i zmienne znakowe. Stała znakowa: znak

Podstawy Programowania Podstawowa składnia języka C++

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

Wstęp do informatyki- wykład 11 Funkcje

Wstęp do programowania

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

ŁAŃCUCHY W JĘZYKU C/C++

Wstęp do informatyki- wykład 9 Funkcje

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

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

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Wstęp do programowania

Wstęp do programowania

Wstęp do programowania

Programowanie komputerowe. Zajęcia 1

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

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

Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Zmienne i struktury dynamiczne

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

Język C++ wykład VIII

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Wstęp do programowania

C-struktury wykład. Dorota Pylak

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

C++ wprowadzanie zmiennych

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

Programowanie Obiektowe i C++

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Wstęp do Informatyki

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

XV. Wskaźniki Odczytywanie adresu pamięci istniejących zmiennych Wskaźniki pierwsze spojrzenie.

1 Podstawy c++ w pigułce.

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

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

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

#include <iostream> using namespace std; void ela(int); int main( ); { Funkcja 3. return 0; }

Język C, tablice i funkcje (laboratorium)

Wprowadzenie do programowania w języku C

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

Transkrypt:

Tablice grupa obiektów tego samego typu tablica tablica ciąg obiektów tego samego typu, zajmujący ciągły obszar w pamięci korzyść zamiast wielu definicji poszczególnych obiektów jedna wspólna; odniesienia do n-tego elementu tablicy składnia definicji typ nazwa_tablicy[rozmiar] np. int a[10]; rezerwuje w pamięci miejsce dla 10 liczb typu int rozmiar to musi być stała, znana juŝ w trakcie kompilacji; niedopuszczalne rozwiązanie jak niŝej: int rozmiar; cout << Jaki ma być rozmiar tabeli? ; cin >> rozmiar; int tablica[rozmiar]; /* TU JEST ŹLE */... moŝliwość definicji tablicy o wielkości dopasowanej do potrzeb dynamiczna alokacja tablicy

Elementy tablicy definicja int a[4]; określa tablicę 4-elementów: a[0], a[1], a[2], a[3] numeracja zaczyna się od zera, kończy na (rozmiar 1) (inaczej niŝ w innych językach!!!) gdy się będziemy odnosili do zakresu 1..rozmiar, to: o zapominamy o a[0] tracimy jeden element o próbujemy zmieniać wartość elementu a[rozmiar] to juŝ nie jest element tablicy o kompilator nie kontroluje dopuszczalnego zakresu indeksu tablicy, nie blokuje próby zmiany wartości a[rozmiar] to na ogół prowadzi do zniszczenia zawartości innej komórki pamięci (zwykle przyległej do tablicy a) Przykład: int a, b[4], c; int k; a=c=0; for (k=0; k<=4; k++) b[k]=2*k+1; cout << a << endl; a=9 Wnioski: tablica n-elementowa: numeracja 0..n-1 element o indeksie n (czyli a[n]) nie istnieje kompilator nie zajmuje się sprawdzaniem poprawności zakresu to jest rola programisty zysk szybszy dostęp do tablicy próba podstawienia elementu o indeksie n zniszczenie wartości innych zmiennych

Obsługa tablic na ogół pętle for; dwie moŝliwe formy lub: for (k=0; k<rozmiar; k++) for (k=0; k<=rozmiar-1; k++) Inicjalizacja tablic podobnie jak dla typów fundamentalnych moŝliwa inicjalizacja w trakcie definicji int a[4] = 15,3,0,-7; int a[4]; a[0]=15; a[1]=3; a[2]=0; a[3]=-7; /*równowaŝne poniŝszemu ciągowi*/ gdy lista krótsza niŝ rozmiar tablicy pozostałe elementy podstawiane zerami int a[4] = 15, 3; // a[0]=15; a[1]=3; a[2]=0; a[3]=0; int a[4] = ; // zerowanie tablicy gdy lista dłuŝsza niŝ rozmiar tablicy błąd kompilacji int a[4] = 15, 3, 0, -7, 8 // błąd kompilacji!!! jeszcze jedna forma definicji i inicjalizacji zbiorczej int a[ ] = 1, 2, 3, 4, 5, 6; o nie podajemy rozmiaru tablicy o kompilator liczy ilość elementów w liście, na tej podstawie ustala rozmiar tablicy, rezerwuje pamięć i ją inicjalizuje

Działania na tablicach w C nie ma globalnych operacji na tablicach musimy określić działanie dla kaŝdej ze składowych int a[4] = 0, 1, 2, 3; int b[4] = 1, 2, 3, 4; int c[4], k; c = a + b; // operacja nielegalna!!!!! for (k=0; k<4; k++) c[k] = a[k] + b[k]; Tablica jako argument funkcji dwa przypadki o funkcja zaleŝy od pojedynczego (skalarnego) argumentu i jest wywoływana z argumentem aktualnym równym jednemu z elementów tablicy o funkcja zaleŝy od tablicy jako całości przypadek pierwszy int kwadrat(int k) return k*k; int main() int w1, w2, m=5; int a[100]=1,2,3,4,5,6; w1=kwadrat(m); w2=kwadrat(a[4]); przekazanie poprzez wartość (jak do tej pory) mechanizm taki sam, jak dla typów fundamentalnych

przypadek drugi Przykłady: funkcja, która oblicza długość wektora reprezentowanego przez tablicę transformacja tablicy zawierającej temp. Fahrenheita na tablicę z temperaturami w skali Celsjusza Problemy: jak przekazać całą tablicę (często duŝo wartości)? jak zwrócić wynik, który jest tablicą? Rozwiązanie przekazanie tablicy przez adres. Jest ono oparte na dwóch zasadach ogólnych: 1. Tablicę przekazujemy do funkcji podając adres jej początku 2. Nazwa tablicy jest jednocześnie adresem jej zerowego elementu #include <cmath> #include <iostream> using namespace std; double dlugosc(double x[ ], int n) int k; double s=0.0; for (k=0; k<n; k++) s+=x[k]*x[k]; return sqrt(s); int main() double a[3]=1.1, -0.7, 1.0; cout << Dlugosc wektora ddd = << dlugosc(a, 3)) << endl;

void konwertuj_t(float t[ ], int n) int k; for (k=0; k<n; k++) t[k]=5.0*(t[k] 32.0)/9.0; int main() int m; float temp[101]; for (m=0; m<101; m++) temp[m]=m; konwertuj_t(temp, 101); UWAGI: wywołanie tablicy jako argumentu funkcji wypisanie nazwy tablicy (bez nawiasów) to określa adres początku tablicy w definicji funkcji (nagłówku) określamy tylko typ tablicy; nie określamy jej rozmiaru. Dlatego funkcja będzie działać dobrze dla kaŝdej tablicy danego typu (bez względu na rozmiar) podanie tylko adresu początku nie określa rozmiaru tablicy zwykle potrzebny drugi parametr określający jej rozmiar przekazany adres słuŝy do zbudowania takiego sposobu obsługi tablicy t[ ] w funkcji, by odniesienie się do t[5] było dokładnie tym, co odniesienie się do temp[5] manipulujemy oryginałem tablicy jeŝeli d[ ] tablica (np. int d[100]; ) to: o d adres zerowego elementu o d stała (nie wolno zmieniać jej wartości) o d nie jest l-wartością int d[100]; *wd; wd=d; /* legalna instrukcja */ d = cokolwiek; /* nielegalna instrukcja; błąd!!! */

Tablice znakowe specjalny, jeden z najczęściej uŝywanych rodzajów tablic; słuŝący do przechowywaniu napisów definicja (deklaracja) char nazwa[rozmiar]; przechowywanie tekstu: o kolejne elementy kody ASCII kolejnych znaków o po umieszczeniu wszystkich znaków kolejnemu elementowy przypisujemy \0 (inaczej NULL) znak końca stringu o pozycja znaku NULL długość stringu o napis w C/C++ - ciąg liter zakończony znakiem NULL C-string Wniosek: tablica tekstowa o rozmiarze NMAX moŝe przechować string o maksymalnej długości NMAX 1 Inicjalizacja tablic tekstowych jak dla wszystkich tablic moŝliwa inicjalizacja przy okazji definicji: moŝliwe róŝne formy inicjalizacji char napis[80] = kot k o t 0... 0 0 0 1 2 3 4 5 78 79 char napis[80] = k, o, t ; k o t 0 0 0... 0 0 0 1 2 3 4 5 78 79

char napis[ ] = kot k o t 0 0 1 2 3 char napis[ ] = k, o, t ; k o t 0 1 2 ostatnia inicjalizacja nie daje C-stringu (brak znaku NULL zaznaczającego koniec napisu) jest to tylko zbiór pojedynczych liter długość C-stringu ilość aktualnie przechowywanych znaków #include <cstring> int k; char s[80]= Ala ma kota ; cout << sizeof: <<sizeof(s) << endl; k=0; while(s[k]) k++; cout << zliczenia: <<k << endl; cout << strlen: << strlen(s); Działania na stringach zbiorcze podstawienie moŝliwe tylko w czasie inicjalizacji; później nie jest moŝliwe: char a[80]; a[80] = kot ; // operacja niedozwolona!!! a = kot ; // operacja niedozwolona!!! aby zmienić juŝ istniejący C-string uŝyj odpowiedniej funkcji

Przykłady: kopiowanie stringu z tablicy wzor[ ] do tablicy kopia[ ] #include <iostream> using namespace std; void strcpy(char kopia[], char wzor[]) int k; for (k=0; ; k++) kopia[k]=wzor[k]; if (kopia[k]==0) break; int main() char tekst[30]= To jest napis 1 ; char a[30]; strcpy(a, tekst); cout << a << \n ; strcpy(a, A to jest napis 2 ); cout << a << endl; To jest napis 1 A to jest napis 2 podawanie rozmiarów tablic niekonieczne kompilator sam je ustali na podstawie połoŝenie znaku NULL istnieje wiele moŝliwości realizacji funkcji strcpy oto przykład: void strcpy(char kopia[ ], char wzor[ ]); int k=0; while (kopia[k]=wzor[k]) k++;

niebezpieczeństwo: rozmiar tablicy wzor większy niŝ maksymalny dopuszczalny rozmiar tablicy kopia zagroŝenie brak sprawdzenia dopuszczalnego zakresu indeksu tablicy, zniszczenie zawartości pewnej części pamięci rozwiązanie - modyfikacja: funkcja strncpy kopiowanie maksymalnie n znaków void strncpy(char kopia[ ],char wzor[ ],int n); int k=0; while (k<n && (kopia[k]=wzor[k])) k++; kopia[k]=0; wiele moŝliwych funkcji operujących na stringach wiele juŝ gotowych część biblioteki standardowej uŝycie wymaga włączenia string.h (lub cstring) Przykłady - string.h (lub cstring) char *strcpy(s, ct) kopiuje tekst z ct do s łącznie ze znakiem \0 ; zwraca s char *strncpy(s,ct,n) kopiuje co najwyŝej n znaków z ct do s; zwraca s char *strcat(s, ct) dopisuje znaki z ct na koniec s; zwraca s char *strncat(s,ct,n) dopisuje co najwyŝej n znaków z ct na koniec s; kończy s znakiem \0, zwraca s Int strcmp(cs, ct) porównuje teksty zawarte w cs i ct; zwraca wartość<0 gdy cs<ct; zero gdy cs==ct; >0 gdy cs>ct char *strchr(cs,c) zwraca wskaźnik do pierwszego wystąpienia znaku c w tekście cs lub NULL, jeśli ten znak nie występuje

Stringi podsumowanie: kolejne znaki kolejne miejsca tabeli koniec stringu znak NULL nazwa jednoznaczny adres początku tablicy do funkcji wysyłamy nazwę (adres stringu) nie podajemy długości funkcja moŝe wyznaczyć ją sama Tablice wielowymiarowe tablice moŝna tworzyć z róŝnych obiektów w szczególności z tablic; tablica wielowymiarowa float aaa[4][2]; /* aaa jest tablicą czterech elementów, z których kaŝdy jest tablicą dwuelementową liczb typu float */ obowiązuje zapis: aaa[i][j] a nie aaa[i,j] elementy tablicy aaa[4][2]: aaa[0][0] aaa[0][1] aaa[1][0] aaa[1][1] aaa[2][0] aaa[2][1] aaa[3][0] aaa[3][1] przechowywane są w pamięci tak, by najszybciej zmieniał się skrajny prawy indeks inicjalizacja zbiorcza float aaa[4][2]=1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 jest równowaŝna ciągowi instrukcji: aaa[0][0]=1.0; aaa[0][1]=2.0; aaa[1][0]=3.0;... aaa[4][0]=7.0; aaa[4][1]=8.0;

wyznaczenie względnego adresu elementu tablicy t[n][m] tablica dwuwymiarowa element t[1][0] przesunięty o M pozycji w stosunku do t[0][0] element t[i][j] przesunięty o i*m + j pozycji w stosunku do t[0][0] Wniosek: znajomość M konieczna do wyznaczenia offsetu waŝne gdy przekazujemy tablicę wielowymiarową jako argument funkcji tablice wielowymiarowe jako argumenty funkcji #include <iostream> #define N 4 #define M 3 #define K 2 using namespace std; void mno_mac(int a[ ][M], int b[ ][K], int c[ ][K]) int n,m,k,s; for (n=0; n<n; n++) for (k=0; k<k; k++) for (s=0,m=0; m<m; m++) s+=a[n][m]*b[m][k]; c[n][k]=s; int main() int aa[n][m]=1,2,3, 1,2,3, 1,2,3, 1,2,3; int bb[m][k]=1,2,1,2,1,2; int cc[n][k]; mno_mac(aa, bb, cc); cout << cc[0][0] << cc[0][1]) << eoln;

Musimy przekazać: typ elementów tablicy wymiary tablicy (oprócz lewego skrajnego) bliski związek tablic i wskaźników temat następnego wykładu