• Nie Znaleziono Wyników

Tablice znaków

N/A
N/A
Protected

Academic year: 2021

Share "Tablice znaków"

Copied!
63
0
0

Pełen tekst

(1)

Języki programowania obiektowego

Języki programowania obiektowego

Nieobiektowe elementy języka C++

Nieobiektowe elementy języka C++

Roman Simiński

roman.siminski@us.edu.pl

www.programowanie.siminskionline.pl

(2)

Łańcuchy znakowe jako tablice znaków ze znacznikiem końca

Ł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).

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:

Fizyczna długość napisu = liczba znaków + 1

Znacznik końca napisu

to znak o kodzie

\0

0

(3)

Deklarowanie i inicjowanie zmiennych łańcuchowych

Deklarowanie i inicjowanie zmiennych łańcuchowych

Tablice znakowe można inicjować w zwykły sposób, przewidziany dla tablic:

char napis[ N ] = { ’C’, ’/’, ’C’, ’+’, ’+’ }; // \0 ??? Czy dobrze?

Można wykorzystywać wygodniejszą formę:

char napis[ N ] = "C/C++";

char napis[ N ] = { ’C’, ’/’, ’C’, ’+’, ’+’, ’\0’ }; // \0 !!! Lepiej const int N = 80;

C

/

C

+

+

Literał łańcuchowy:

\0

(4)

Łańcuch pusty

Łańcuch pusty

Deklaracja łańcucha zainicjowanego napisem pustym:

char imie[ N ] = { ’\0’ };

Reprezentacja wewnętrzna łańcucha pustego:

imie[ 0 ] = ’\0’; char imie[ N ] = ""; Zmienna imie: 0 1 2 3 4 5 78 \0 . . . 79

(5)

Przypisanie literału na etapie inicjalizacji

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ę.

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ą

char napis[ N ] = "C/C++"; // OK

char napis1[ N ] = napis; // Bł d, niedozwolona inicjalizacjaą

(6)

Ogólny schemat przetwarzania tablic znakowych

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++ ] ) ;

(7)

Przetwarzanie z wykorzystaniem funkcji bibliotecznych — string.h

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!

(8)

Wyznaczanie długości napisu — funkcja strlen

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 );

(9)

Wyznaczanie długości napisu — funkcja strlen, zastosowanie

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++ ] ) ;

(10)

Wyznaczanie długości napisu — funkcja strlen, realizacja

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; }

C

/

C

+

+

\0

. . .

0 1 2 3 4 5 . . . 78 79

5

len

5

? len[ i ] == '\0' ? s: rezultat

(11)

Zamiana wielkości liter — funkcje strupr i strlwr

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 ] ); }

Realizacja funkcji strlwr:

void strlwr( char s[] ) {

Konwersja elementu tablicy, toupper zamienia znak będący parametrem na literę dużą, o ile był literą małą.

Konwersja elementu tablicy, toupper zamienia znak będący parametrem na literę dużą, o ile był literą małą.

Konwersja elementu tablicy, tolower

(12)

Kopiowanie napisów — funkcja strcpy, zastosowanie

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

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.

(13)

Kopiowanie napisów a parametry tablicowe

Kopiowanie napisów a parametry tablicowe

C

/

C

+

+

. . .

s == s1:

\0

0 1 2 3 4 5 . . . 78 79

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.

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!

(14)

Kopiowanie napisów — funkcja strcpy, przykładowa realizacja

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'; }

C

/

C

+

+

. . .

s:

\0

0 1 2 3 4 5 . . . 78 79

0

i ? s[ i ] == '\0' ? d: 0 1 2 3 4 5

. . .

20 . . .

(15)

Kopiowanie napisów — funkcja strcpy, przykładowa realizacja

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'; }

C

/

C

+

+

\0

. . .

0 1 2 3 4 5 . . . 78 79

0

i

C

s: d:

. . .

(16)

Kopiowanie napisów — funkcja strcpy, przykładowa realizacja

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'; }

C

/

C

+

+

\0

. . .

0 1 2 3 4 5 . . . 78 79

1

i ? s[ i ] == '\0' ?

C

0 1 2 3 4 5 s: d:

. . .

20 . . .

(17)

Kopiowanie napisów — funkcja strcpy, przykładowa realizacja

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'; }

C

/

C

+

+

\0

. . .

0 1 2 3 4 5 . . . 78 79

1

i

C

/

s: d:

. . .

(18)

Kopiowanie napisów — funkcja strcpy, przykładowa realizacja

Kopiowanie napisów — funkcja strcpy, przykładowa realizacja

(19)

Kopiowanie napisów — funkcja strcpy, przykładowa realizacja

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'; }

C

/

C

+

+

\0

. . .

0 1 2 3 4 5 . . . 78 79

4

i

C

/

C

+

+

s: d:

. . .

(20)

Kopiowanie napisów — funkcja strcpy, przykładowa realizacja

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'; }

C

/

C

+

+

\0

. . .

0 1 2 3 4 5 . . . 78 79

5

i

C

/

C

+

+

0 1 2 3 4 5 s: d:

. . .

20 . . .

(21)

Kopiowanie napisów — funkcja strcpy, przykładowa realizacja

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'; }

C

/

C

+

+

\0

. . .

0 1 2 3 4 5 . . . 78 79

5

i

C

/

C

+

+

? s[ i ] == '\0' ? s: d:

. . .

(22)

Kopiowanie napisów — funkcja strcpy, przykładowa realizacja

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'; }

C

/

C

+

+

\0

. . .

0 1 2 3 4 5 . . . 78 79

5

i

C

/

C

+

+

\0

0 1 2 3 4 5 ? s[ i ] == '\0' ? s: d:

. . .

20 . . .

(23)

Kopiowanie napisów — funkcja strcpy, wersja uproszczona

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'

(24)

Łączenie napisów — funkcja strcat

Łą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;

Jak to działa?

void strcat( char d[], char s[] ) { int i = 0, j = 0;

Programowanie w języku C/C++

while( d[ i ] != ’\0’ ) i++; while( ( d[ i++ ] = s[ j++ ] ) != ’\0’ ) ;

Znajdź znacznik końca napisu docelowego, zapamiętaj jego pozycje w zmiennej i.

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

Przepisz elementy tablicy s do tablicy d. Maszeruj zmienną j od początku tablicy s, zmienną i od pozycji znalezionego wcześniej

(25)

Co się stanie, gdy tablica docelowa jest za krótka?

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

?

(26)

Jak nie dopuszczać do „przepełnienia bufora”?

Jak nie dopuszczać do „przepełnienia bufora”?

const int N = 10; const int M = 80; char s1[ N ];

char s2[ M ] = "J zyk C jest wietny lecz pełen pułapek";ę ś

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.

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.

strncpy( s1, s2, N - 1 ); cout << s1;

strncpy( s1, s2, sizeof( s1 ) - 1 ); cout << s1;

s1[ N - 1 ] = '\0'; s1[ sizeof( s1 ) - 1 ] = '\0';

Funkcja strncpy nie zawsze przekopiuje ’\0’!

(27)

Na marginesie...

Na marginesie...

strncpy( s1, s2, N - 1 );

s1[ N - 1 ] = '\0'

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 ) [ N - 1 ] = '\0';

s1

Skrócona wersja kopiowania i dopisy-wania znacznika końca napisu

Skrócona wersja kopiowania i dopisy-wania znacznika końca napisu

strcpy( s1, "Jezyk C" ); strcat( s1, "i C++" );

strcat( s1, "dla profi!" ); strcpy( s2, s1 );

(28)

Funkcja strncpy — przykładowa, bezpieczniejsza realizacja

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' ) ;

(29)

Odwracanie kolejności znaków w napisie — strrev

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

+

+

. . .

napis

\0

0 1 2 3 4 5 . . . 78 79

C/C++

++C/C

(30)

Odwracanie kolejności znaków w napisie — strrev

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

. . .

napis

\0

0 1 2 3 4 5 . . . 78 79

C/C++

++C/C

(31)

Odwracanie kolejności znaków w napisie — strrev

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

. . .

napis

\0

0 1 2 3 4 5 . . . 78 79

C/C++

++C/C

?

(32)

Odwracanie kolejności znaków w napisie — strrev

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

. . .

napis

\0

0 1 2 3 4 5 . . . 78 79

C/C++

++C/C

(33)

Na marginesie — zamiana wartości w zmiennych, jak?

Na marginesie — zamiana wartości w zmiennych, jak?

int a = 5; int b = 10;

a = b; b = a;

(34)

Na marginesie — zamiana wartości w zmiennych, jak?

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;

(35)

Na marginesie — zamiana wartości w zmiennych, tak...

Na marginesie — zamiana wartości w zmiennych, tak...

int a = 5; int b = 10; int c;

c = a; // 1 a = b; // 2

(36)

Ciekawostka — zamiana dla zmiennych numerycznych

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

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!

(37)

Odwracanie kolejności znaków w napisie — strrev

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++ ) ; // . . . }

C

/

C

+

+

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

0

end begin

(38)

Odwracanie kolejności znaków w napisie — strrev

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++ ) ; // . . . }

C

/

C

+

+

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

0

end begin s[ end ] == 'C'

(39)

Odwracanie kolejności znaków w napisie — strrev

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++ ) ; // . . . }

C

/

C

+

+

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

1

end begin

(40)

Odwracanie kolejności znaków w napisie — strrev

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++ ) ; // . . . }

C

/

C

+

+

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

1

end begin s[ end ] == '/'

(41)

Odwracanie kolejności znaków w napisie — strrev

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++ ) ; // . . . }

C

/

C

+

+

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

2

end begin

(42)

Odwracanie kolejności znaków w napisie — strrev

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++ ) ; // . . . }

C

/

C

+

+

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

2

end begin s[ end ] == 'C'

(43)

Odwracanie kolejności znaków w napisie — strrev

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++ ) ; // . . . }

C

/

C

+

+

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

3

end begin

(44)

Odwracanie kolejności znaków w napisie — strrev

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++ ) ; // . . . }

C

/

C

+

+

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

3

end begin s[ end ] == '+'

(45)

Odwracanie kolejności znaków w napisie — strrev

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++ ) ; // . . . }

C

/

C

+

+

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

4

end begin

(46)

Odwracanie kolejności znaków w napisie — strrev

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++ ) ; // . . . }

C

/

C

+

+

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

4

end begin s[ end ] == '+'

(47)

Odwracanie kolejności znaków w napisie — strrev

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++ ) ; // . . . }

C

/

C

+

+

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

5

end begin

(48)

Odwracanie kolejności znaków w napisie — strrev

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++ ) ; // . . . }

C

/

C

+

+

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

5

end begin s[ end ] == '\0'

(49)

Odwracanie kolejności znaków w napisie — strrev

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; } }

C

/

C

+

+

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

5

end

0

begin

(50)

Odwracanie kolejności znaków w napisie — strrev

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; } }

C

/

C

+

+

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

4

end

0

begin

(51)

Odwracanie kolejności znaków w napisie — strrev

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; } }

C

/

C

+

+

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

4

end

0

begin

<

(52)

Odwracanie kolejności znaków w napisie — strrev

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; } }

C

/

C

+

+

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

4

end

0

begin

(53)

Odwracanie kolejności znaków w napisie — strrev

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; } }

+

/

C

+

+

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

4

end

0

begin

(54)

Odwracanie kolejności znaków w napisie — strrev

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; } }

+

/

C

+

C

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

4

end

0

begin

(55)

Odwracanie kolejności znaków w napisie — strrev

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; } }

+

/

C

+

C

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

3

end

1

begin

(56)

Odwracanie kolejności znaków w napisie — strrev

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; } }

+

/

C

+

C

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

3

end

1

begin

<

(57)

Odwracanie kolejności znaków w napisie — strrev

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; } }

+

/

C

+

C

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

3

end

1

begin

(58)

Odwracanie kolejności znaków w napisie — strrev

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; } }

+

+

C

+

C

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

3

end

1

begin

(59)

Odwracanie kolejności znaków w napisie — strrev

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; } }

+

+

C

/

C

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

3

end

1

begin

(60)

Odwracanie kolejności znaków w napisie — strrev

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; } }

+

+

C

/

C

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

2

end

2

begin

(61)

Odwracanie kolejności znaków w napisie — strrev

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; } }

+

+

C

/

C

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

2

end

2

begin

<

(62)

Odwracanie kolejności znaków w napisie — strrev

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; } } 0 1 2 3 4 5 . . . 78 79

2

end

2

begin

(63)

To jeszcze nie koniec z tablicami, one będą

To jeszcze nie koniec z tablicami, one będą

często wracały,

często wracały,

za chwilę powrócą w postaci

za chwilę powrócą w postaci

tablic dynamicznych

tablic dynamicznych

Pytania? Polemiki?

Teraz, albo:

Cytaty

Powiązane dokumenty

sk&#34;adniowych, leksykalnych, ortograficznych (ró%nego stopnia) i interpunkcyjnych. 1 Uwaga: je&amp;li powy#sze kryteria nie zosta%y spe%nione, nie przyznaje si$ punktów. 1.

Metoda najmniejszych kwadrat´ow przy ograniczeniach na parametry: mno˙zniki Lagrange’a. Seber, Linear Regression Analysis, New

na końcu, znając masę chromu w próbce i masę próbki wilgotnej, proszę obliczyć zawartość procentową chromu w próbce wilgotnej (oczywiście chodzi o

na początku należy zwrócić uwagę, że wartość pH %&amp; wskazuje na odczyn kwasowy roztworu; to oznacza, że miareczkowanie zakończono za punktem

Uruchom program, sprawdź efekt podania wartości, która nie występuje w tablicy, wartości występującej w tablicy oraz efekt niepoprawnego podania liczby.. catch z

 Inicjalizacja możliwa jest tylko przy deklaracji Inicjalizacja możliwa jest tylko przy deklaracji..  Przypisanie zmiennej txt wartości &#34;Pies&#34; wymaga zastosowania

 Łańcuch znaków (ciąg znaków, napis, literał (ciąg znaków, napis, literał łańcuchowy, stała łańcuchowa, C-string) - ciąg złożony z zera lub większej liczby.

Udowodnij, ˙ze ka˙zdy z tych idea l´ ow jest g l´ owny i wypisz wszystkie idea ly pierwsze oraz wszystkie idea ly maksymalne tego pier´scienia.