Podstawy programowania w języku C++

Podobne dokumenty
Podstawy programowania

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

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

Wprowadzenie do programowania w języku C

Tablice deklaracja, reprezentacja wewnętrzna

Podstawy programowania w języku C++

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

Podstawy programowania w języku C++

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

Podstawy programowania w języku C i C++

Podstawy programowania w języku C++

Podstawy programowania w języku C++

Podstawy programowania w języku C++

1 Przetwarzanie tablic znakowych

Podstawy programowania

Programowanie w języku C++

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

Podstawy programowania w języku C++

Programowanie w języku C++

Podstawy programowania w języku C++

Podstawy programowania w języku C++

Podstawy Programowania

Tablice, funkcje - wprowadzenie

Wprowadzenie do programowania w języku C

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

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

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

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

dr inż. Jarosław Forenc

Języki programowania. Tablice struktur, pliki struktur. Część ósma. Autorzy Tomasz Xięski Roman Simiński

Podstawy programowania w języku C++

Podstawy programowania 1

Operacje na łańcuchach znaków

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

Podstawy programowania w języku C++

Programowanie Proceduralne

Wprowadzenie do 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

Programowanie i struktury danych

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

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

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

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

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

Wprowadzenie do programowanie obiektowego w języku C++

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

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

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

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

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

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

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

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

Podstawy programowania w języku C i C++

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

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

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

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

Informatyka 1. Przetwarzanie tekstów

Tablice, funkcje, wskaźniki - wprowadzenie

Języki i metody programowania I

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

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

Wstęp do programowania

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

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

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

Zajęcia 4 procedury i funkcje

Programowanie komputerowe. Zajęcia 4

iii. b. Deklaracja zmiennej znakowej poprzez podanie znaku

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

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

Programowanie i struktury danych

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

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

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

Inicjacja tablicy jednowymiarowej

ZASADY PROGRAMOWANIA KOMPUTERÓW

Struktury czyli rekordy w C/C++

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

STL: Lekcja 1&2. Filozofia STL

Systemy ekspertowe Część siódma Realizacja dziedzinowego systemu ekspertowego Roman Simiński

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

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

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

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

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

Programowanie komputerowe. Zajęcia 3

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

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

Wskaźniki w C. Anna Gogolińska

Zaawansowane programowanie w języku C++ Biblioteka standardowa

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:

Wstęp do programowania

Wstęp do programowania

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

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

Systemy ekspertowe Część siódma Realizacja dziedzinowego systemu ekspertowego Roman Simiński

Funkcja (podprogram) void

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

Transkrypt:

Podstawy programowania w języku C++ Część siódma Przetwarzanie tablic znaków Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi uważnego w nim uczestnictwa. Opracowanie to jest chronione prawem autorskim. Wykorzystywanie jakiegokolwiek fragmentu w celach innych niż nauka własna jest nielegalne. Dystrybuowanie tego opracowania lub jakiejkolwiek jego części oraz wykorzystywanie zarobkowe bez zgody autora jest zabronione.

Łańcuchy znakowe jako tablice znaków ze znacznikiem końca Do reprezentacji łańcuchów znakowych w języku C wykorzystuje się zwykłe tablice znakowe. Tablice takie nie różnią się od innych tablic w języku 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 Copyright Roman Simiński Strona : 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 imie[ N ] = A, g, a ; // \0??? char imie[ N ] = A, g, a, \0 ; // \0!!! Można wykorzystywać wygodniejszą formę: char imie[ N ] = "Aga"; Literał łańcuchowy : Zmienna imie : A g a \0 0 1 2 3 A g a \0... 0 1 2 3 4 5 78 79 Uwaga powyższe przypisanie wystąpić może jedynie przy definicji zmiennej! imie = "Aga"; // Błąd, niedozwolone przypisanie Copyright Roman Simiński Strona : 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 ; Uwaga, jednak nigdy tak: imie = ""; // Błąd, niedozwolone przypisanie Copyright Roman Simiński Strona : 4

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++ ] ) ; Copyright Roman Simiński Strona : 5

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! Copyright Roman Simiński Strona : 6

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: 7 Copyright Roman Simiński Strona : 7

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? Copyright Roman Simiński Strona : 8

Wyznaczanie długości napisu funkcja strlen, realizacja Realizacja w wykorzystaniem iteracji while: int strlen( char s[] ) int len = 0; while( s[ len ]!= '\0' ) len++; return len; Realizacja w wykorzystaniem iteracji for: int strlen( char s[] ) int len; for( len = 0; s[ len ]!= '\0'; len++ ) ; return len; Copyright Roman Simiński Strona : 9

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żą. Copyright Roman Simiński Strona : 10

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 ] = "Język 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" ); Copyright Roman Simiński Strona : 11

Kopiowanie napisów funkcja strcpy, przykładowa realizacja char s1[ 80 ] = "Język C"; char s2[ 20 ];... strcpy( s2, s1 ); s i++ s1... J ę z y k C \0... 0 1 2 3 4 5 6 79 d s2 J ę z y k C \0... 0 1 2 3 4 5 void strcpy( char d[], char s[] ) int i; for( i = 0; s[ i ]!= '\0'; i++ ) d[ i ] = s[ i ]; d[ i ] = '\0'; 6 19 Copyright Roman Simiński Strona : 12

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. Copyright Roman Simiński Strona : 13

Łą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" ); strcat( s1, s2 ); cout << s1; Programowanie w języku C Jak to działa? void strcat( char d[], char s[] ) int i = 0, j = 0; while( d[ i ]!= \0 ) i++; while( ( d[ i++ ] = s[ j++ ] )!= \0 ) ; Znajdź znacznik końca napisu docelowego, zapamiętaj jego pozycje w zmiennej i. 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. Copyright Roman Simiński Strona : 14

Co się stanie, gdy tablica docelowa jest za krótka? void main() char s1[ 5 ] = "AAAA"; char c1 = 'A'; char c2 = 'B'; char s2[ 5 ] = "BBBB"; strcpy( s2, "XXXXXXXXXXXXXXXXXXXX" ); printf( "\ns1 : %s\nc1 : %c\nc2 : %c\ns2 : %s", s1, c1, c2, s2 ); Gdzie oryginalna zawartość tablicy s1? Co się stało ze zmienną c2? Dlaczego zmienna c1 jest OK? 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. Copyright Roman Simiński Strona : 15

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! Copyright Roman Simiński Strona : 16

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' ) ; Copyright Roman Simiński Strona : 17

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... Copyright Roman Simiński Strona : 18

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... Copyright Roman Simiński Strona : 19

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...? Copyright Roman Simiński Strona : 20

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... Copyright Roman Simiński Strona : 21

// Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; //... begin 0 end s C / C + + \0... Copyright Roman Simiński Strona : 22

// Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; //... begin s[ end ] == 'C' 0 end s C / C + + \0... Copyright Roman Simiński Strona : 23

// Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; //... begin 1 end s C / C + + \0... Copyright Roman Simiński Strona : 24

// Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; //... begin s[ end ] == '/' 1 end s C / C + + \0... Copyright Roman Simiński Strona : 25

// Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; //... begin 2 end s C / C + + \0... Copyright Roman Simiński Strona : 26

// Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; //... begin s[ end ] == 'C' 2 end s C / C + + \0... Copyright Roman Simiński Strona : 27

// Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; //... begin 3 end s C / C + + \0... Copyright Roman Simiński Strona : 28

// Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; //... begin s[ end ] == '+' 3 end s C / C + + \0... Copyright Roman Simiński Strona : 29

// Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; //... begin 4 end s C / C + + \0... Copyright Roman Simiński Strona : 30

// Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; //... begin s[ end ] == '+' 4 end s C / C + + \0... Copyright Roman Simiński Strona : 31

// Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; //... begin 5 end s C / C + + \0... Copyright Roman Simiński Strona : 32

// Szukanie konca napisu for( end = 0; s[ end ]!= '\0'; end++ ) ; //... begin s[ end ] == '\0' 5 end s C / C + + \0... Copyright Roman Simiński Strona : 33

... // 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... Copyright Roman Simiński Strona : 34

... // 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... Copyright Roman Simiński Strona : 35

... // 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... Copyright Roman Simiński Strona : 36

... // 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 Copyright Roman Simiński Strona : 37

... // 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 Copyright Roman Simiński Strona : 38

... // 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 Copyright Roman Simiński Strona : 39

... // 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... Copyright Roman Simiński Strona : 40

... // 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... Copyright Roman Simiński Strona : 41

... // 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 / Copyright Roman Simiński Strona : 42

... // 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 / Copyright Roman Simiński Strona : 43

... // 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 / Copyright Roman Simiński Strona : 44

... // 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... Copyright Roman Simiński Strona : 45

... // 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... Copyright Roman Simiński Strona : 46

// 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... Copyright Roman Simiński Strona : 47