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

Podobne dokumenty
Podstawy programowania

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

Podstawy programowania w języku C++

Tablice deklaracja, reprezentacja wewnętrzna

Wprowadzenie do programowania w języku C

Podstawy programowania w języku C++

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

Podstawy programowania w języku C++

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

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

1 Przetwarzanie tablic znakowych

Podstawy programowania w języku C++

Podstawy Programowania

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

dr inż. Jarosław Forenc

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

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

Tablice, funkcje - wprowadzenie

Operacje na łańcuchach znaków

Podstawy programowania 1

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

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

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

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

Wstęp do programowania

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 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Łańcuchy znaków. Agnieszka Nowak - Brzezińska

Podstawy programowania

Podstawy programowania w języku C++

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

Programowanie i struktury danych

Podstawy programowania w języku C i C++

Podstawy programowania w języku C++

Inicjacja tablicy jednowymiarowej

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

Wprowadzenie do programowania w języku C

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

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

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

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

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

Spis treści JĘZYK C - ŁAŃCUCHY ZNAKÓW. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF22

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

Programowanie Proceduralne

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

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

Tablice, funkcje, wskaźniki - wprowadzenie

Zajęcia 4 procedury i funkcje

Języki i metodyka programowania. Wprowadzenie do języka C

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

ZASADY PROGRAMOWANIA KOMPUTERÓW

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

Spis treści WSTĘP CZĘŚĆ I. PASCAL WPROWADZENIE DO PROGRAMOWANIA STRUKTURALNEGO. Rozdział 1. Wybór i instalacja kompilatora języka Pascal

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

Języki i metody programowania I

tablica: dane_liczbowe

Programowanie komputerowe. Zajęcia 4

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

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

Programowanie i struktury danych

Podstawy programowania w języku C i C++

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

Wstęp do programowania

Wskaźniki. Informatyka

Wstęp do programowania

Podstawy programowania w języku C++

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 6

Informatyka 1. Plan dzisiejszych zajęć. zajęcia nr 11. Elektrotechnika, semestr II rok akademicki 2008/2009

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

Programowanie komputerowe. Zajęcia 3

Zaawansowane programowanie w języku C++ Biblioteka standardowa

Spis treści JĘZYK C - ŁAŃCUCHY ZNAKÓW. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF10Z

Lab 9 Podstawy Programowania

Programowanie strukturalne i obiektowe : podręcznik do nauki zawodu technik informatyk / Adam Majczak. Gliwice, cop

Podstawy programowania w języku C++

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

Wykład IV PASCAL - łańcuch znaków, - procedury i funkcje, - sortowanie bąbelkowe

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

Programowanie w języku C++

STL: Lekcja 1&2. Filozofia STL

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

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

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

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

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

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

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

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

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

1. Typy zmiennych. 2. Typy podstawowe: char short int int long int float

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

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

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

Programowanie w języku C++

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

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

Transkrypt:

Języki programowania obiektowego Nieobiektowe elementy języka C++ Roman Simiński roman.siminski@us.edu.pl www.programowanie.siminskionline.pl Przetwarzanie tablic znaków

Łańcuchy znakowe jako tablice znaków ze znacznikiem końca Do reprezentacji łańcuchów znakowych w języku C/C++ wykorzystuje się zwykłe tablice znakowe. Tablice takie nie różnią się od innych tablic w języku C/C++, wprowadzono jedynie kilka udogodnień, czyniących łatwiejszym manipulowanie takimi tablicami. W języku C przyjęto koncepcję łańcuchów ze znacznikiem końca (ang. null terminated strings). To jest napis a to jego reprezentacja wewnętrzna: T o j e s t n a p i s \0 Fizyczna długość napisu = liczba znaków + 1 Znacznik końca napisu \0 to znak o kodzie 0 2

Deklarowanie i inicjowanie zmiennych łańcuchowych Tablice znakowe można inicjować w zwykły sposób, przewidziany dla tablic: const int N = 80; char napis[ N ] = C, /, C, +, + ; // \0??? Czy dobrze? char napis[ N ] = C, /, C, +, +, \0 ; // \0!!! Lepiej Można wykorzystywać wygodniejszą formę: char napis[ N ] = "C/C++"; 0 1 2 3 4 5 Literał łańcuchowy: C / C + + \0 napis: C / C + + \0 3

Łańcuch pusty Deklaracja łańcucha zainicjowanego napisem pustym: char imie[ N ] = \0 ; char imie[ N ] = ""; Reprezentacja wewnętrzna łańcucha pustego: Zmienna imie: \0 0 1 2 3 4 5 78 79 Ustawianie łańcucha pustego po deklaracji: imie[ 0 ] = \0 ; 4

Przypisanie literału na etapie inicjalizacji Uwaga przypisanie literału łańcuchowego do tablicy znaków może wystąpić tylko przy definiowaniu tablicy i oznacza jej inicjalizację. char napis[ N ] = "C/C++"; // OK napis = "C/C++"; // Błąd, niedozwolone przypisanie napis = ""; // Błąd, niedozwolone przypisanie Nie wolno również tak: char napis[ N ] = "C/C++"; // OK char napis1[ N ] = napis; // Błąd, niedozwolona inicjalizacja 5

Ogólny schemat przetwarzania tablic znakowych Przetwarzanie tablic polega zwykle na przemaszerowaniu zmienna indeksową po tablicy, dopóki nie ma końca napisu, oznaczanego znakiem '\0': const int N = 80; int i; char s[ N ]; for( i = 0; s[ i ]!= \0 ; i++ ) < tu jakie ś operacje na każdym znaku s[ i ] > Wyprowadzanie zawartości napisu s do strumienia wyjściowego znak po znaku: for( i = 0; s[ i ]!= \0 ; i++ ) cout << s[ i ]; Lub krócej: for( i = 0; s[ i ]!= \0 ; cout << s[ i++ ] ) ; Każdy znak napisu w osobnej linii: for( i = 0; s[ i ]!= \0 ; cout << endl << s[ i++ ] ) ; 6

Przetwarzanie z wykorzystaniem funkcji bibliotecznych string.h Do manipulowania tablicami znakowymi opracowano szereg funkcji bibliotecznych (plik nagłówkowy string.h),... większość z nich można łatwo napisać samemu! 7

Wyznaczanie długości napisu funkcja strlen Długość napisu to liczba znaków zapisanych w tablicy znakowej, a więc liczba znaków zapisanych przed wystąpieniem znacznika konca napisu. Długość napisu to nie rozmiar tablicy a liczba znaków w niej zapisanych. Rezultatem funkcji strlen jest liczba znaków napisu, przekazanego tej funkcji parametrem. const int N = 80; char napis[ N ] = "Język C++"; cout << "Liczba znaków w łańcuchu: " << napis << " to: " << strlen( napis ); Liczba znaków w łańcuchu: Język C++ to: 9 8

Wyznaczanie długości napisu funkcja strlen, zastosowanie Alternatywny algorytm przetwarzania tablic znaków: int i, dlugosc; char napis[ N ]; dlugosc = strlen( napis ); for( i = 0; i < dlugosc; cout << napis[ i++ ] ) ; Lub: for( i = 0, dlugosc = strlen( napis ); i < dlugosc; cout << napis[ i++ ] ) ; Ale nie tak: for( i = 0; i < strlen( napis ); cout << napis[ i++ ] ) ; Dlaczego nie tak? 9

Wyznaczanie długości napisu funkcja strlen, realizacja Realizacja iteracji while: int strlen( char s[] ) int len = 0; while( s[ len ]!= '\0' ) len++; return len; Realizacja iteracji for: int strlen( char s[] ) int len; for( len = 0; s[ len ]!= '\0'; len++ ) ; return len;? len[ i ] == '\0'? 5 len s: C / C + + \0 5 rezultat Indeks elementu zawierającego znacznik końca łańcucha określa liczbę znaków go poprzedzających. 10

Zamiana wielkości liter funkcje strupr i strlwr Konwersja - małe litery na duże: strupr, duże litery na małe: strlwr. char a[ N ] = "ALA"; char b[ N ] = "ala"; strlwr( a ); // Po wywołaniu strlwr zmienna a zawiera napis "ala" strupr( b ); // Po wywołaniu strupr zmienna a zawiera napis "ALA" Realizacja funkcji strupr: void strupr( char s[] ) int i; for( i = 0; s[ i ]!= '\0'; i++ ) s[ i ] = toupper( s[ i ] ); Konwersja elementu tablicy, toupper zamienia znak będący parametrem na literę dużą, o ile był literą małą. Realizacja funkcji strlwr: void strlwr( char s[] ) int i; for( i = 0; s[ i ]!= '\0'; i++ ) s[ i ] = tolower( s[ i ] ); Konwersja elementu tablicy, tolower zamienia znak będący parametrem na literę małą, o ile był literą dużą. 11

Kopiowanie napisów funkcja strcpy, zastosowanie Pamiętamy, że w językach C/C++ nie można kopiować zawartości tablic wykorzystując operator przypisania. char s1[ 80 ] = "C/C++"; char s2[ 20 ]; s2 = s1; // Tak nie wolno!!! Do kopiowania zawartości tablic znakowych używamy funkcji strcpy strcpy( s2, s1 ); Funkcja strcpy kopiuje zawartość tablicy znakowej s1 do tablicy s2. Kopiowaniu podlegają wszystkie znaki łańcucha s1 (aż do \0), zakłada się, że tablica s2 ma rozmiar wystarczający na pomieszczenie kopiowanych znaków. Funkcja strcpy służy również do kopiowania zawartości literałów łańcuchowych: strcpy( s1, "Programowanie " ); strcpy( s2, "w języku C/C++" ); 12

Kopiowanie napisów a parametry tablicowe void strcpy( char d[], char s[] ) ; char s1[ 80 ] = "C/C++"; char s2[ 20 ]; strcpy( s2, s1 ); W C/C++ parametry tablicowe domyślnie przekazywane są przez zmienną (referencję). Gdy parametrem jest tablica, we wnętrzu funkcji nie wiadomo ilu elementowa tablica została przekazana jako parametr aktualny wywołania! Funkcje operujące na napisach poszukują znacznika końca napisu. s == s1: C / C + + \0 d == s2: 20 13

Kopiowanie napisów funkcja strcpy, przykładowa realizacja void strcpy( char d[], char s[] ) int i = 0; while( s[ i ]!= '\0' ) d[ i ] = s[ i ]; i++; d[ i ] = '\0';? s[ i ] == '\0'? 0 i s: C / C + + \0 d: 0 1 2 3 4 5 20 14

Kopiowanie napisów funkcja strcpy, przykładowa realizacja void strcpy( char d[], char s[] ) int i = 0; while( s[ i ]!= '\0' ) d[ i ] = s[ i ]; i++; d[ i ] = '\0'; 0 i s: C / C + + \0 d: C 0 1 2 3 4 5 20 15

Kopiowanie napisów funkcja strcpy, przykładowa realizacja void strcpy( char d[], char s[] ) int i = 0; while( s[ i ]!= '\0' ) d[ i ] = s[ i ]; i++; d[ i ] = '\0';? s[ i ] == '\0'? 1 i s: C / C + + \0 d: C 0 1 2 3 4 5 20 16

Kopiowanie napisów funkcja strcpy, przykładowa realizacja void strcpy( char d[], char s[] ) int i = 0; while( s[ i ]!= '\0' ) d[ i ] = s[ i ]; i++; d[ i ] = '\0'; 1 i s: C / C + + \0 d: C / 0 1 2 3 4 5 20 17

Kopiowanie napisów funkcja strcpy, przykładowa realizacja I tak dalej, aż do przepisania ostatniego znaku... 18

Kopiowanie napisów funkcja strcpy, przykładowa realizacja void strcpy( char d[], char s[] ) int i = 0; while( s[ i ]!= '\0' ) d[ i ] = s[ i ]; i++; d[ i ] = '\0'; 4 i s: C / C + + \0 d: C / C + + 0 1 2 3 4 5 20 19

Kopiowanie napisów funkcja strcpy, przykładowa realizacja void strcpy( char d[], char s[] ) int i = 0; while( s[ i ]!= '\0' ) d[ i ] = s[ i ]; i++; d[ i ] = '\0'; 5 i s: C / C + + \0 d: C / C + + 0 1 2 3 4 5 20 20

Kopiowanie napisów funkcja strcpy, przykładowa realizacja void strcpy( char d[], char s[] ) int i = 0; while( s[ i ]!= '\0' ) d[ i ] = s[ i ]; i++; d[ i ] = '\0';? s[ i ] == '\0'? 5 i s: C / C + + \0 d: C / C + + 0 1 2 3 4 5 20 21

Kopiowanie napisów funkcja strcpy, przykładowa realizacja void strcpy( char d[], char s[] )) int i = 0; while( s[ i ]!= '\0' ) d[ i ] = s[ i ]; i++; d[ i ] = '\0';? s[ i ] == '\0'? 5 i s: C / C + + \0 d: C / C + + \0 0 1 2 3 4 5 20 22

Kopiowanie napisów funkcja strcpy, wersja uproszczona W językach C/C++ operator przypisania jest lewostronnie łączny. Pozwala to na pisanie następujących konstrukcji: d[ 0 ] = d[ 1 ] = d[ 2 ] = 0; Alternatywna, uproszczona realizacja kopiowania napisów: void strcpy( char d[], char s[] ) int i = 0; while( ( d[ i ] = s[ i ] )!= '\0' ) i++; Konstrukcja: ( d[ i ] = s[ i ] )!= '\0' Przypisuje i-ty element tablicy s do i-tego elementu tablicy d. Przypisana wartość jest następnie porównywana (operator!=) ze znacznikiem końca napisu '\0'. Ta wersja funkcji strcpy przepisuje znacznik końca napisu z tablicy s do d w iteracji while. 23

Łączenie napisów funkcja strcat Funkcja strcat dołącza zawartość tablicy znakowej s1 do tablicy s2. Kopiowaniu podlegają wszystkie znaki łańcucha s1 (aż do \0), zakłada się, że tablica s2 ma rozmiar wystarczający na pomieszczenie dołączanych znaków. strcpy( s1, "Programowanie " ); strcpy( s2, "w języku C/C++" ); strcat( s1, s2 ); cout << s1; Programowanie w języku C/C++ Jak to działa? void strcat( char d[], char s[] ) int i = 0, j = 0; Znajdź znacznik końca napisu docelowego, zapamiętaj jego pozycje w zmiennej i. i. while( d[ i ]!= \0 ) i++; while( ( d[ i++ ] = s[ j++ ] )!= \0 ) ; Przepisz elementy tablicy s do tablicy d. Maszeruj zmienną j od początku tablicy s, zmienną i od pozycji znalezionego wcześniej znacznika końca napisu. 24

Co się stanie, gdy tablica docelowa jest za krótka? int main() char s1[ 5 ] = "AAAA"; char c1 = 'A'; char c2 = 'B'; char s2[ 5 ] = "BBBB"; strcpy( s2, "XXXXXXXXXXXXXXXXXXXX" ); cout << "\ns1 :" << s1; cout << "\nc1 :" << c1; cout << "\ns2 :" << s2; cout << "\nc2 :" << c2; Gdzie oryginalna zawartość tablicy s1? Co się stało ze zmienną c1, c2? Nigdy nie należy zakładać, że się uda, czyli że tablica docelowa jest wystarczająco długa. Należy szacować, przewidywać, jeszcze raz przewidywać programować defensywnie. 25

Jak nie dopuszczać do przepełnienia bufora? Biblioteka funkcji operujących na tablicach znaków zawiera funkcje wykonujące operacje analogiczne do przedstawionych uprzednio, pozwalające na kontrolę liczby znaków biorących udział np. w kopiowaniu. Są to np. funkcje: strncpy, strncat, itp. const int N = 10; const int M = 80; char s1[ N ]; char s2[ M ] = "Język C jest świetny lecz pełen pułapek"; strncpy( s1, s2, N - 1 ); strncpy( s1, s2, sizeof( s1 ) - 1 ); s1[ N - 1 ] = '\0'; s1[ sizeof( s1 ) - 1 ] = '\0'; cout << s1; cout << s1; Funkcja strncpy nie zawsze przekopiuje \0! 26

Na marginesie... Często rezultatem funkcji operujących na tablicach są one same. Np. rezultatem funkcji strcpy, strcat, strncpy jest tablica będąca pierwszym parametrem wywołania. strncpy( s1, s2, N - 1 ); s1[ N - 1 ] = '\0' strncpy( s1, s2, N - 1 ) [ N - 1 ] = '\0'; s1 Skrócona wersja kopiowania i dopisywania znacznika końca napisu strcpy( s1, "Jezyk C" ); strcat( s1, "i C++" ); strcat( s1, "dla profi!" ); strcpy( s2, s1 ); strcpy( s2, strcat( strcat( strcpy( s1, "Jezyk C" ), "i C++" ), "dla profi!" ) ); strcpy( s2, strcat( strcat( strcpy( s1, "Jezyk C" ), "i C++" ), "dla profi!" ) ); 27

Funkcja strncpy przykładowa, bezpieczniejsza realizacja void strncpy_while( char d[], char s[], int n ) int i = 0; while( ( d[ i ] = s[ i ] )!= '\0' && i < n ) i++; while( i <= n ) d[ i++ ] = '\0'; void strncpy_for( char d[], char s[], int n ) int i = 0; for( ; ( d[ i ] = s[ i ] )!= '\0' && i < n ; i++ ) ; for( ; i <= n ; d[ i++ ] = '\0' ) ; 28

Odwracanie kolejności znaków w napisie strrev const int MAKS_DL = 80; char napis[ MAKS_DL ] = "C/C++"; cout << endl << napis; strrev( napis ); cout << endl << napis; C/C++ ++C/C napis C / C + + \0 29

Odwracanie kolejności znaków w napisie strrev const int MAKS_DL = 80; char napis[ MAKS_DL ] = "C/C++"; cout << endl << napis; strrev( napis ); cout << endl << napis; C/C++ ++C/C napis + / C + C \0 30

Odwracanie kolejności znaków w napisie strrev const int MAKS_DL = 80; char napis[ MAKS_DL ] = "C/C++"; cout << endl << napis; strrev( napis ); cout << endl << napis; C/C++ ++C/C napis + + C / C \0? 31

Odwracanie kolejności znaków w napisie strrev const int MAKS_DL = 80; char napis[ MAKS_DL ] = "C/C++"; cout << endl << napis; strrev( napis ); cout << endl << napis; C/C++ ++C/C napis + + C / C \0 32

Na marginesie zamiana wartości w zmiennych, jak? int a = 5; int b = 10; a = b; b = a; 33

Na marginesie zamiana wartości w zmiennych, jak? int a = 5; int b = 10; a = b; b = a; int a = 5; int b = 10; int c; 34

Na marginesie zamiana wartości w zmiennych, tak... int a = 5; int b = 10; int c; c = a; // 1 a = b; // 2 b = c; // 3 35

Ciekawostka zamiana dla zmiennych numerycznych int a = 5; int b = 10; int c; b = b + a; a = b a; b = b a; To pozornie sprytne rozwiązanie ma subtelną wadę dla liczb bliskich wartości granicznych zakresu typu może dojść do obcięć, a dla zmiennych rzeczywistych do zaokrągleń. W efekcie wartości po zamianie mogą nie być identyczne! 36

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; // begin 0 end s C / C + + \0 37

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; // begin s[ end ] == 'C' 0 end s C / C + + \0 38

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; // begin 1 end s C / C + + \0 39

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; // begin s[ end ] == '/' 1 end s C / C + + \0 40

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; // begin 2 end s C / C + + \0 41

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; // begin s[ end ] == 'C' 2 end s C / C + + \0 42

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; // begin 3 end s C / C + + \0 43

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; // begin s[ end ] == '+' 3 end s C / C + + \0 44

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; // begin 4 end s C / C + + \0 45

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; // begin s[ end ] == '+' 4 end s C / C + + \0 46

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; // begin 5 end s C / C + + \0 47

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; // begin s[ end ] == '\0' 5 end s C / C + + \0 48

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Zamiana znakow miejscami for( begin = 0, end--; begin < end; begin++, end-- ) char c = s[ begin ]; s[ begin ] = s[ end ]; s[ end ] = c; begin 0 5 end s C / C + + \0 49

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Zamiana znakow miejscami for( begin = 0, end--; begin < end; begin++, end-- ) char c = s[ begin ]; s[ begin ] = s[ end ]; s[ end ] = c; begin 0 4 end s C / C + + \0 50

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Zamiana znakow miejscami for( begin = 0, end--; begin < end; begin++, end-- ) char c = s[ begin ]; s[ begin ] = s[ end ]; s[ end ] = c; begin 0 < 4 end s C / C + + \0 51

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Zamiana znakow miejscami for( begin = 0, end--; begin < end; begin++, end-- ) char c = s[ begin ]; s[ begin ] = s[ end ]; s[ end ] = c; begin 0 4 end s C / C + + \0 c C 52

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Zamiana znakow miejscami for( begin = 0, end--; begin < end; begin++, end-- ) char c = s[ begin ]; s[ begin ] = s[ end ]; s[ end ] = c; begin 0 4 end s + / C + + \0 c C 53

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Zamiana znakow miejscami for( begin = 0, end--; begin < end; begin++, end-- ) char c = s[ begin ]; s[ begin ] = s[ end ]; s[ end ] = c; begin 0 4 end s + / C + C \0 c C 54

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Zamiana znakow miejscami for( begin = 0, end--; begin < end; begin++, end-- ) char c = s[ begin ]; s[ begin ] = s[ end ]; s[ end ] = c; begin 1 3 end s + / C + C \0 55

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Zamiana znakow miejscami for( begin = 0, end--; begin < end; begin++, end-- ) char c = s[ begin ]; s[ begin ] = s[ end ]; s[ end ] = c; begin 1 < 3 end s + / C + C \0 56

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Zamiana znakow miejscami for( begin = 0, end--; begin < end; begin++, end-- ) char c = s[ begin ]; s[ begin ] = s[ end ]; s[ end ] = c; begin 1 3 end s + / C + C \0 c / 57

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Zamiana znakow miejscami for( begin = 0, end--; begin < end; begin++, end-- ) char c = s[ begin ]; s[ begin ] = s[ end ]; s[ end ] = c; begin 1 3 end s + + C + C \0 c / 58

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Zamiana znakow miejscami for( begin = 0, end--; begin < end; begin++, end-- ) char c = s[ begin ]; s[ begin ] = s[ end ]; s[ end ] = c; begin 1 3 end s + + C / C \0 c / 59

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Zamiana znakow miejscami for( begin = 0, end--; begin < end; begin++, end-- ) char c = s[ begin ]; s[ begin ] = s[ end ]; s[ end ] = c; begin 2 2 end s + + C / C \0 60

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Zamiana znakow miejscami for( begin = 0, end--; begin < end; begin++, end-- ) char c = s[ begin ]; s[ begin ] = s[ end ]; s[ end ] = c; begin 2 < 2 end s + + C / C \0 61

Odwracanie kolejności znaków w napisie strrev void strrev( char s[] ) int begin, end; // Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; // Zamiana znakow miejscami for( begin = 0, end--; begin < end; begin++, end-- ) char c = s[ begin ]; s[ begin ] = s[ end ]; s[ end ] = c; begin 2 2 end s + + C / C \0 62

To jeszcze nie koniec z tablicami, one będą często wracały, za chwilę powrócą w postaci tablic dynamicznych Pytania? Polemiki? Teraz, albo: roman.siminski@us.edu.pl