• Nie Znaleziono Wyników

Przetwarzanie napisów

N/A
N/A
Protected

Academic year: 2021

Share "Przetwarzanie napisów"

Copied!
62
0
0

Pełen tekst

(1)

Podstawy

Podstawy

programowania

programowania

Przetwarzanie tablic znaków

Część siódma

Roman Simiński

Autor Kontakt

(2)

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

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; Podstawy programowania Podstawy programowania

C

/

C

+

+

Literał łańcuchowy:

\0

0 1 2 3 4 5

(4)

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

Podstawy programowania Podstawy programowania

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)

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

Do manipulowania tablicami znakowymi opracowano szereg funkcji bibliotecznych

(plik nagłówkowy string.h),... większość z nich można łatwo napisać samemu!

Podstawy programowania Podstawy programowania

(8)

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

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

Podstawy programowania Podstawy programowania

(10)

Realizacja — iteracji while:

int strlen( char s[] ) { int len = 0; while( s[ len ] != '\0' ) len++; return len; }

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

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 Konwersja elementu tablicy, tolower Podstawy programowania

(12)

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

P r z e t w a r z a n i e t a b l i c z n a k ó w P r z e t w a r z a n i e t a b l i c z n a k ó w Podstawy programowania Podstawy programowania

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)

{ 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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

Podstawy programowania Podstawy programowania

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)

{ 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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

Podstawy programowania Podstawy programowania

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)
(19)

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

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

Podstawy programowania Podstawy programowania

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)

{ 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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

Podstawy programowania Podstawy programowania

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)

{ 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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

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

Podstawy programowania Podstawy programowania

(24)

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 znacznika końca napisu.

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.

(25)

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

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

P r z e t w a r z a n i e t a b l i c z n a k ó w P r z e t w a r z a n i e t a b l i c z n a k ó w void main() { char s1[ 5 ] = "AAAA"; char c1 = 'A'; char c2 = 'B'; char s2[ 5 ] = "BBBB"; strcpy( s2, "XXXXXXXXXXXXXXXXXXXX" ); }

Gdzie oryginalna zawartość tablicy s1?

Co się stało ze zmienną c2?

Dlaczego zmienna c1 jest OK?

printf( "\ns1 : %s\nc1 : %c\nc2 : %c\ns2 : %s", s1, c1, c2, s2 ); Podstawy programowania

(26)

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’! Funkcja strncpy nie zawsze przekopiuje ’\0’!

(27)

Na marginesie...

Na marginesie...

P r z e t w a r z a n i e t a b l i c z n a k ó w P r z e t w a r z a n i e t a b l i c z n a k ó w strncpy( s1, s2, N - 1 ); s1[ N - 1 ] = '\0' Podstawy programowania Podstawy programowania

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)

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

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

Podstawy programowania Podstawy programowania

(30)

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

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

?

Podstawy programowania Podstawy programowania

(32)

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?

P r z e t w a r z a n i e t a b l i c z n a k ó w P r z e t w a r z a n i e t a b l i c z n a k ó w Podstawy programowania Podstawy programowania int a = 5; int b = 10; a = b; b = a;

(34)

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, jak?

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

P r z e t w a r z a n i e t a b l i c z n a k ó w P r z e t w a r z a n i e t a b l i c z n a k ó w Podstawy programowania Podstawy programowania int a = 5; int b = 10; int c; c = a; // 1 a = b; // 2

(36)

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!

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

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 Podstawy programowania Podstawy programowania

(38)

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

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 Podstawy programowania Podstawy programowania

(40)

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

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 Podstawy programowania Podstawy programowania

(42)

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

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 Podstawy programowania Podstawy programowania

(44)

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

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 Podstawy programowania Podstawy programowania

(46)

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

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 Podstawy programowania Podstawy programowania

(48)

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

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 Podstawy programowania Podstawy programowania

(50)

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

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

<

Podstawy programowania Podstawy programowania

(52)

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

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 Podstawy programowania Podstawy programowania

(54)

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

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 Podstawy programowania Podstawy programowania

(56)

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

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 Podstawy programowania Podstawy programowania

(58)

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

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 Podstawy programowania Podstawy programowania

(60)

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

P r z e t w a r z a n i e t a b l i c z n a k ó w

P r z e t w a r z a n i e t a b l i c z n a k ó w

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

<

Podstawy programowania Podstawy programowania

(62)

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

+

+

C

/

C

. . .

s

\0

0 1 2 3 4 5 . . . 78 79

2

end

2

begin

Cytaty

Powiązane dokumenty

Dalej tworzymy 2 przyciski klikając prawym przyciskiem myszy na szarym polu oraz kursorem najeżdżamy na ikonę Buttons i wybieramy PushButton.. Należy zauważyć, że

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

[r]

[r]

O ile o che1nii, w przypadku zacierania się granic między orbi- talami, można jeszcze mówić.. Podobnie w 308 0g zacierają się powłoki neutronowe (lewy środkowy

W zakładce „Translate” z rozwijanego paska „Rule File” należy wybrać skompilowaną tablicę znaków: „polish_g1_new.ibk” i wprowadzić ją do programu WinBraille..

Funkcja moŜe otrzymać przez listę parametrów tablice oraz liczbę elementów, natomiast powinna zwracać przez wynik.. (return) nowa

// utworzono tablicę 10 referencji typu String, naleŜy dla kaŜdego elementu tablicy przydzielić pamięć. • Przydział pamięci na elementy