Podstawy programowania 1

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

Tablice deklaracja, reprezentacja wewnętrzna

Tablice, funkcje - wprowadzenie

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

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

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

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Podstawy programowania w języku C++

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

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

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

Podstawy programowania

Tablice, funkcje, wskaźniki - wprowadzenie

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

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

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 9 - sem.iii. Dr inż. M. Czyżak

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

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

Laboratorium 6: Ciągi znaków. mgr inż. Leszek Ciopiński dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

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

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

Wprowadzenie do programowania w języku C

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

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

Inicjacja tablicy jednowymiarowej

Podstawy programowania w języku C++

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 7- sem.iii. M. Czyżak

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

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

Programowanie Proceduralne

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

Wskaźniki w C. Anna Gogolińska

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

2 Przygotował: mgr inż. Maciej Lasota

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

Podstawy Programowania

Tablice wielowymiarowe. Przykład tablica 2-wymiarowa. Przykład. Przykład 3-wymiarowy. Tak naprawdę nie istnieją w C! Rozważmy tablicę o rozmiarze 3x2

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

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

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:

Lab 9 Podstawy Programowania

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

Wskaźniki. Programowanie Proceduralne 1

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

tablica: dane_liczbowe

DYNAMICZNE PRZYDZIELANIE PAMIECI

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

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

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

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

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

Funkcja (podprogram) void

dr inż. Jarosław Forenc

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

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

Techniki Programowania wskaźniki

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

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

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

Programowanie I C / C++ laboratorium 03 arytmetyka, operatory

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

Biblioteka standardowa - operacje wejścia/wyjścia

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

Wykład 2 Składnia języka C# (cz. 1)

Pliki. Informacje ogólne. Obsługa plików w języku C

Funkcje zawarte w bibliotece < io.h >

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

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

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

Wykład Wskaźniki a tablice jednowymiarowe Arytmetyka wskaźników Dostęp do elementów tablic

Wykład 6. Operacje na łańcuchach znakowych

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

Wprowadzenie do programowania w języku C

Język C, tablice i funkcje (laboratorium)

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

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

PODSTAW PROGRAMOWANIA WYKŁAD 7 ŁAŃCUCHY

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

Techniki Programowania wskaźniki 2

Programowanie w C Typ wskaźnikowy do typu znakowego i operacje na łańcuchach

Podstawy programowania w języku C++

Funkcje zawarte w bibliotece < io.h >

Podstawy programowania w języku C++

Zmienne, stałe i operatory

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Podstawy programowania w języku C++

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

Wstęp do programowania 1

Operacje wejścia/wyjścia odsłona pierwsza

Programowanie w językach wysokiego poziomu

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

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

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

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

Część 4 życie programu

PARADYGMATY PROGRAMOWANIA Wykład 3

Transkrypt:

Podstawy programowania 1 Krzysztof Grudzień kgrudzi@kis.p.lodz.pl Wykład nr 2 1

Plan spotkań Wskaźniki Tablice jednowymiarowe & wska źniki. Programowanie w C. Wikibooks 2

Co to jest wskaźnik?? Wskaźnik (ang. pointer) jest to specjalny rodzaj zmiennej. Zapisuje się w nim adres w pamięci komputera do zmiennej, na którą wskazuje ten wskaźnik. Zmienne wskazywane mogą być pojedynczymi zmiennymi, tablicami, strukturami i funkcjami. 3

Deklaracja wskaźnika int* pint_01 = NULL; oraz int *pint_01 = NULL; są równoważne. wskaźnik należy zawsze zainicjalizować przynajmniej adresem pustym NULL Wskaźnik można następnie zainincjalizować adresem zmiennej odpowiedniego typu, w tym przypadku integer: int izm_01 = 43; pint_01 = &izm; 4

Gdzie wykorzystywane są wskaźniki? Praca z tablicami. Funkcje zmiana wartości przesyłanych argumentów. Dostęp do specjalnych komórek pamięci. Rezerwacja obszarów pamięci. 5

Przykład printf( %d\n, izm_01); printf( %d\n, &izm_01);//%x printf( %d\n, &pint_01); printf( %d\n, pint_01); printf( %d\n, *pint_01); 6

Przykład 7

Przykład 8

Rzeczy ważne Wskaźnik, który pokazuje na obiekt jednego typu, nie może być wykorzystany do pokazywania na obiekt innego typu. int *wi,*wj; int i,j; wi=&i; i=5; *wi=5; j=7; j=*wi; wi=&j; wj=wi; Sama deklaracja wskaźnika nie powoduje, że wskaźnik wskazuje na konkretny obiekt. 9

Wskaźnik typu void wskaźnika bez podania typu obiektu, na jaki wskazuje. Może być użyty do wskazywania na obiekty dowolnego typu. void *pv; 10

Wskaźnikowi typu void można przypisać wskaźnik dowolnego (niestałego) typu. Działanie odwrotne wymaga operatora rzutowania void *wv; int *wi; float *wf; wv=wi; //teraz wskaźnik wv wskazuje na ten //sam obiekt (typu int), //na który wskazuje wskaźnik wi wv=wf; wi=wf //kompilator zasygnalizuje błąd!! wi=(int *)wf; //wykorzystanie rzutowania wf=(float *)wv; //wykorzystanie rzutowania 11

Zastosowanie wskaźników do tablic int *wsk=null; //definicja wskaźnika int tab[10]; //definicja tablicy wsk=&tab[indeks]; //ustawienie //wskaźnika na 0 9 //elemencie tablicy //o indeksie indeks wsk=&tab[0]; wsk=tab; instrukcje równoważne wsk=&tab[indeks]; wsk=wsk+ind; wsk += ind; przesunięcie wskaźnika o ind pozycji 12

Przykład 13

14

15

Dodanie do wskaźnika liczby całkowitej ind powoduje, że wskaźnik pokazuje o ind elementów dalej w tablicy; niezależnie od tego, jakiego typu są elementy tablicy. 16

Nazwa tablicy & wskaźnik Nazwa tablicy jest jednocześnie adresem jej zerowego elementu. Nazwa tablicy jest stałym wskaźnikiem do jej zerowego elementu. float *wsk; float tab[10]; wsk=tab; //wsk=&tab[0]; //możliwe jest //przypisanie wsk++;//ok tab++; //niemożliwa jest instrukcja 17

tab[ind]; odwołanie się do wartości elementu tablicy o nr ind adres *(tab+ind); Ustalenie adresu komórki przesuniętej o ind elementów w stosunku do początku tablicy i podanie wartości tam znajdującego się elementu 18

*(pint++) *(tab++) 19

Wskaźniki w argumentach funkcji void fun(float f) { f /= 3.3; } void main() { float fvar = 13.3; } fun(fvar); printf( %f\n, fvar); //?? 20

Wskaźniki w argumentach funkcji float fun(float *f) { *f /= 3.3; } void main() { float fvar = 13.3; fun(&fvar); printf( %f\n, fvar); // 4.03 } 21

Jak wygląda wysyłanie argumentów do funkcji przez wartość? void fun(float f) { f /= 3.3; } fun(fvar); 13.3 - kopia kopia zmiennej fvar 13.3 22

Jak wygląda wysyłanie argumentów do funkcji przez wartość? void fun(float *f) { *f /= 3.3; } element spod adresu 127 fun(&fvar); adres 127 - kopia kopia adresy zmiennej fvar 23

24

25

Przesyłanie tablic do funkcji #define ROZMIAR 10 long sumuj(int tab[], int n); int main() { int kulki[rozmiar]={1,44,5,23,22,47,7,6,90,11}; long wynik; wynik=sumuj(kulki,rozmiar); printf("calkowita liczba kulek wynosi: %ld. \n", wynik); printf("rozmiar tablicy kulki wynosi %d bajtow\n", sizeof kulki); system("pause"); return 0; } long sumuj(int tab[], int n) { int i; long suma=0; for(i=0;i<n;i++) suma+=tab[i]; } printf("rozmiar tablicy tab wynosi %d bajtow \n", sizeof tab); return suma; 26

uwagi Język C nie pozwala na przekazywanie tablic jako argumentów funkcji tab[i] i *(tab+i) równoważne Przekazując nazwę tablicy jako argument, przesyłamy do funkcji adres pierwszego elementu tablicy 27

Argumenty wskaźnikowe long sumuj(int *poczatek, int *koniec) { long suma=0; while(poczatek<koniec) { suma+=*poczatek; poczatek++; } return suma; }?? Jak wywołać funkcję?? 28

wynik=sumuj(kulki, kulki+rozmiar); suma+=*poczatek; poczatek++; suma+=*początek++; suma+=*(początek++); 29

void f1(int *pi, int rozm); void f2(int *pi, int rozm); void f3(int t[], int rozm); void main(){ int tab[5]={1,2,3,4,5}; f1(tab,5); f2(tab,5); f3(tab,5); } void f2(int *pi, int rozm){ printf("\nfunkcja f1\t ); for(int i=0;i<rozm;i++) print( %f\t,pi[i]); } void f3(int t[], int rozm){ printf("\nfunkcja f3\t ); for(int i=0;i<rozm;i++) print( %f\t,t[i])); } void f1(int *pi, int rozm) { printf("\nfunkcja f1\t ); for(int i=0;i<rozm;i++) printf( %f\t,*(pi++)); } 30

Istnieje wybór między korzystaniem notacji tablicowej lub wskaźnikowej Tablicowa: widać, że przetwarzamy tablicę podobna notacja do innych języków Wskaźnikowa: Bliższa językowi maszynowemu wydajniejszy kod 31

Działania na wskaźnikach Przypisanie pint=&a; pint=tab; Pobranie wartości *pint; uzyskanie adresu wskaźnika &pint; Zwiększenie/Zmniejszenie wskaźnika pint++; pint--; Odejmowanie a = pint1- pint2; A co z nazwa tablicy?? 32

Wskaźnik do stałych a stały wskaźnik Wskaźniki do stałych mogą zawierać adresy dowolnych zmiennych i mogą być modyfikowane w programie, ale nie można za ich pomocą modyfikować zmiennych wskazywanych. Stały wskaźnik to wskaźnik, który zawsze pokazuje na to samo. Wskaźnik tego typu musi być zainicjowany w miejscu definicji - tak jak każda stała. W programie nie można już modyfikować jego wartości. int zm = 10; int * const w = &zm; Za pomocą wskaźnika stałego można jednak modyfikować zawartość zmiennej wskazywanej, ale tylko tej, której adresem wskaźnik został zainicjowany. const int stala = 10; const int *wsk_st; 33

const int st = 4; int zm = 10; int * const w = &zm; int * const x = &st; const int * const x1 = &st; int i = 7; int * const wi = &i; int * const pz = &zm; *wi +=8; wi = &zm; 34

Łańcuchy znaków tablica jednowymiarowa char tab[20]; char *wsk=null; wsk=tab; 35

int main() { char tabc[20]="test"; char *pchar="test_wsk"; printf("%d - %s\n", sizeof(tabc),tabc); printf("%d - %s\n", sizeof(pchar), pchar); system("pause"); return 0; } 36

Definiowanie łańcucha Użycie stałej łańcuchowej Użycie tablicy typu char Użycie wskaźnika do char Użycie tablicy łańcuchów znaków 37

Stała łańcuchowa Ciąg znaków zakończonych znakiem \0 Stałe łańcuchowe należą do klasy statycznej jedna kopia, istnieją przez cały czas działania programu 38

Tablica znaków char tab[]= test ; char tab[]={ t, e, s, t, \0 }; rozróżnia tablicę znaków od łańcucha znaków tab --> &tab[0] *tab tab[0] *(tab+1) tab[1] 39

Przykład char tab[]= Jestem Jan ; char* pchar[]= Jestem Adam for(i=0;i<6;i++) putchar(tab[i]); putchar(pchar[i]); Jestem while(*pchar!= \0 ) putchar(*(pchar++)); Jestem Adam pchar=tab; tab=pchar; tab[3]= k ; *(tab+3)= k ; 40

41

Wczytywanie łańcuchów - scanf pobiera jedno słowo do napotkania znaku niedrukowanego %5s wczyta określoną liczbę znaków bądź napotka znak niedrukowany 42

funkcja scanf() zwraca liczbę odczytanych pozycji lub EOF dla końca pliku 43

Wczytywanie łańcuchów - gets Pobieranie znaków z wejścia, aż do napotkania \n \0 44

gets() char pchar=null; pchar = gets(imie); łańcuch znaków w tablicy imie wskaźnik na pierwszy element przekazywany do wskaźnika pchar. błąd odczyty pchar == NULL 45

fgets() kontrola przepełnienia tablicy?? char tab[3]; gets(tab) JANEK?? fgets: odczyt MAX 1 znaków fgets(tab, MAX, stdin); pobiera znak nowej linii 46

puts() Wyświetla dane od podane adresu aż do napotkania znaku \0 47

fputs pobiera 2 argumenty fgets(imie,stdin) nie dodaje znaku nowej linii do danych wyjściowych 48

Funkcje do obsługi łańcuchów znaków strlen() zwraca długość łańcucha znaków strlen(imie); Biblioteka: #include <string.h> char tabc[20]="test"; do { i++; 4 } while(i<strlen(tabc)); 49

strcat & strncat Łączenie łańcuchów znaków tabc==tabc+tabd Co z przekroczeniem rozmiaru?? 50

strncat(tabc,tabd,10); Skopiuje max. 10 znaków Kopiuje, aż do napotkania znaku \0 51

strcmp & strncmp Porównanie łańcuchów znaków tabc==tabd strcmp(tabc,tabd); Tylko porównanie adresów wpisów while(strcmp(pytanie, odp)); Porównuje tylko do napotkania znaku \0 strcmp( A, A ); zwraca 0 strcmp( A, B ); zwraca -1 strcmp( B, A ); zwraca 1 52

Jak porównać litery? If( a < b ) zamiana na kody ASCII char ch= m ; If (ch== w ) 53

strncmp strncmp(tabc,tabd,3); Porównuje łańcuchy, do 3 znaku, albo przerywa wcześniej gdy jest niezgodność. 54

Kopiowanie łańcuchów strcpy() & strncpy() char * strcpy ( char * destination, const char * source ); char tab1[]= test1 ; char tab2[]= test2 ; char* p1; char* p2; p1=tab1; p2=tab2; p1=p2; // jaki wynik operacji?? strcpy(p1,p2); 55

http://www.cplusplus.com/reference/cstring/strncpy/ char * strncpy ( char * destination, const char * source, size_t num ); 56

islower() - int islower ( int c ); 57

58