c cxx w09


Podstawy programowania
Podstawy programowania
w języku C++
w języku C++
Część dziewiąta
Tablice a zmienne wskaznikowe
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.
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Nazwa tablicy jako wskaznik na jej poczÄ…tek
Nazwa tablicy jako wskaznik na jej poczÄ…tek
Nazwa tablicy jest interpretowana jako ustalony wskaznik na jej poczÄ…tek
(pierwszy element).
10 elementów
int tab[ 10 ];
0 1 2 3 4 5 6 7 8 9
tab
Pierwszy element: tab[ 0 ]
Copyright © Roman SimiÅ„ski Strona : 2
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Nazwa tablicy jako wskaznik na jej poczÄ…tek, cd. ...
Nazwa tablicy jako wskaznik na jej poczÄ…tek, cd. ...
int tab[ 10 ];
int * p;
10 elementów
. . .
p = tab;
0 1 2 3 4 5 6 7 8 9
p tab
Pierwszy element: tab[ 0 ]
Przypisanie:
p = tab;
Jest równoznaczne z:
p = &tab[ 0 ];
Copyright © Roman SimiÅ„ski Strona : 3
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Nazwa tablicy jako wskaznik na jej poczÄ…tek, cd. ...
Nazwa tablicy jako wskaznik na jej poczÄ…tek, cd. ...
tab[ 0 ] = 5; *p = 5
tab[ 1 ] = 1; *( p + 1 ) = 1
Odwołania równoważne
tab[ 2 ] = 10; *( p + 2 ) = 10
. . . . . .
tab[ i ] = 22; *( p + i ) = 22
0 1 2 3 i 8 9
p tab
p + 0
p + 1
p + 2
p + 3
p + i
Copyright © Roman SimiÅ„ski Strona : 4
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Nazwa tablicy jako wskaznik na jej poczÄ…tek, cd. ...
Nazwa tablicy jako wskaznik na jej poczÄ…tek, cd. ...
Nazwa tablicy z Wskaznik z
indeksem przesunięciem
Odwołania równoważne
0 1 2 3 i 8 9
p tab
Odwołanie: *( p + i ) Odwołanie: tab[ i ]
Copyright © Roman SimiÅ„ski Strona : 5
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Nazwa tablicy jako wskaznik na jej poczÄ…tek, cd. ...
Nazwa tablicy jako wskaznik na jej poczÄ…tek, cd. ...
Wyrażenie p + i jest wyrażeniem wskaznikowym, wskazuje ono na obiekt oddalony
o i obiektów danego typu od p.
Wartość dodawana do wskaznika jest skalowana rozmiarem typu obiektu
wskazywanego.
tab[ i ]; *( tab + i )
Każde odwołanie: można zapisać tak:
Oraz
*( p + i ) p[ i ];
Każde odwołanie: można zapisać tak:
Copyright © Roman SimiÅ„ski Strona : 6
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Uwaga, wskaznik to nie tablica!
Uwaga, wskaznik to nie tablica!
int tab[ 10 ];
Czy to jest to samo? Nie!
int * p = tab;
int tab[ 10 ] obszar danych + wskaznika na jego poczÄ…tek
Nazwa tablicy 10 elementów
0 1 2 3 4 5 6 7 8 9
tab
p
int * p = tab wskaznik zakotwiczony o poczÄ…tek tablicy
Copyright © Roman SimiÅ„ski Strona : 7
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Nazwa tablicy to ustalony wskaznik na jej poczÄ…tek
Nazwa tablicy to ustalony wskaznik na jej poczÄ…tek
Nazwa tablicy jest ustalonym (niemodyfikowalnym) wskaznikiem na pierwszy jej
element. Nazw tablic nie wolno modyfikować! Zwykłe wskazniki można.
int tab[ 10 ];
int * p = tab;
tab = p;
żðyle
tab++;
p = tab + 8;
þðOK
p++;
Copyright © Roman SimiÅ„ski Strona : 8
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Ciekawostka
Ciekawostka
Wiemy, że odwołanie:
tab[ i ] *( tab + i )
można zapisać tak:
Oraz, że odwołanie
*( tab + i ) tab[ i ]
można zapisać tak:
Wiemy również, że dodawanie jest przemienne, zatem każde odwołanie:
*( tab + i ) *( i + tab )
można zapisać tak:
Czy zatem odwołanie:
*( i + tab ) i[ tab ]
można zapisać tak: ?
Copyright © Roman SimiÅ„ski Strona : 9
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Ciekawostka, cd. ...
Ciekawostka, cd. ...
Tak, można, dla kompilatora nie ma to większego znaczenia.
char napis[] = "język c";
. . .
cout << napis << endl;
0[ napis ] = 'J'; // Zamiast napis[ 0 ] język c
6[ napis ] = 'C'; // Zamiast napis[ 6 ]
Język C
cout << napis << endl;
Copyright © Roman SimiÅ„ski Strona : 10
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Dlaczego nie wolno przypisywać tablic, posługując się ich nazwami?
Dlaczego nie wolno przypisywać tablic, posługując się ich nazwami?
int a[ 10 ];
int b[ 10 ];
b = a; // Nie wolno przypisywać do siebie tablic!
Gdyby przypisywanie było możliwe...
Gdyby przypisywanie było możliwe...
0 1 2 3 4 5 6 7 8 9
a
0 1 2 3 4 5 6 7 8 9
b
To po wykonaniu tej linii:
b = a;
gubimy obszar danych tablicy b!
0 1 2 3 4 5 6 7 8 9
a
0 1 2 3 4 5 6 7 8 9
b
Copyright © Roman SimiÅ„ski Strona : 11
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Arytmetyka na wskaznikach  podsumowanie
Arytmetyka na wskaznikach  podsumowanie
Dozwolone operacje wskaznikowe to:
przypisywanie wskazników do obiektów tego samego typu,
przypisywanie wskazników do obiektów innego typu po konwersji,
dodawanie lub odejmowanie wskaznika i liczby całkowitej,
odejmowanie lub porównanie dwóch wskazników związanych z ta samą tablicą,
przypisanie wskaznikowi wartości zero (lub wskazania puste NULL) lub
porównanie ze wskazaniem pustym.
Copyright © Roman SimiÅ„ski Strona : 12
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Wskazniki w akcji  metamorfoza funkcji put_string
Wskazniki w akcji  metamorfoza funkcji put_string
char napis[] = "Język C i C++";
put_string( napis );
void put_string( char s[] ) Wersja pierwotna
{
int i;
for( i = 0; s[ i ] != '\0'; i++ )
putchar( s[ i ] );
}
Copyright © Roman SimiÅ„ski Strona : 13
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Wskazniki w akcji  metamorfoza funkcji put_string
Wskazniki w akcji  metamorfoza funkcji put_string
char napis[ 80 ] = "C++";
put_string( napis );
void put_string2( char * s ) Eliminujemy zmiennÄ… i
{
for( ; *s != '\0'; s++ )
putchar( *s );
}
Jak to działa... ?
Copyright © Roman SimiÅ„ski Strona : 14
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Wywołanie funkcji put_string
Wywołanie funkcji put_string
char napis[ 80 ] = "C++";
put_string( napis );
void put_string2( char * s )
Kopiowanie parametru aktualnego napis do parametru s
{
for( ; *s != '\0'; s++ )
putchar( *s );
}
napis
C + + \0
s
Copyright © Roman SimiÅ„ski Strona : 15
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Parametr s jest kopiÄ… wskaznika napis
Parametr s jest kopiÄ… wskaznika napis
char napis[ 80 ] = "C++";
put_string( napis );
void put_string2( char * s )
Kopiowanie parametru aktualnego napis do parametru s
{
for( ; *s != '\0'; s++ )
putchar( *s );
}
napis
C + + \0
s
Copyright © Roman SimiÅ„ski Strona : 16
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Czy obiekt wskazywany przez s jest znacznikiem końca napisu?
Czy obiekt wskazywany przez s jest znacznikiem końca napisu?
char napis[ 80 ] = "C++";
put_string( napis );
void put_string2( char * s )
Parametr s wskazuje na pierwszy element tablicy napis
{
for( ; *s != '\0'; s++ )
putchar( *s );
}
napis
C + + \0
s
Copyright © Roman SimiÅ„ski Strona : 17
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Znak wskazywany przez s wyprowadzamy jest do stdout
Znak wskazywany przez s wyprowadzamy jest do stdout
char napis[ 80 ] = "C++";
put_string( napis );
void put_string2( char * s )
Parametr s wskazuje na pierwszy element tablicy napis
{
for( ; *s != '\0'; s++ )
putchar( *s );
}
C
napis
C + + \0
s
Copyright © Roman SimiÅ„ski Strona : 18
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Wskaznik s przesuwamy na następny znak
Wskaznik s przesuwamy na następny znak
char napis[ 80 ] = "C++";
put_string( napis );
void put_string2( char * s )
Parametr s wskazuje na kolejny element tablicy napis
{
for( ; *s != '\0'; s++ )
putchar( *s );
}
C
napis
C + + \0
s
Copyright © Roman SimiÅ„ski Strona : 19
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Czy obiekt wskazywany przez s jest znacznikiem końca napisu?
Czy obiekt wskazywany przez s jest znacznikiem końca napisu?
char napis[ 80 ] = "C++";
put_string( napis );
void put_string2( char * s )
Parametr s wskazuje na kolejny element tablicy napis
{
for( ; *s != '\0'; s++ )
putchar( *s );
}
C
napis
C + + \0
s
Copyright © Roman SimiÅ„ski Strona : 20
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Znak wskazywany przez s wyprowadzamy jest do stdout
Znak wskazywany przez s wyprowadzamy jest do stdout
char napis[ 80 ] = "C++";
put_string( napis );
void put_string2( char * s )
Parametr s wskazuje na kolejny element tablicy napis
{
for( ; *s != '\0'; s++ )
putchar( *s );
}
C+
napis
C + + \0
s
Copyright © Roman SimiÅ„ski Strona : 21
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Wskaznik s przesuwamy na następny znak
Wskaznik s przesuwamy na następny znak
char napis[ 80 ] = "C++";
put_string( napis );
void put_string2( char * s )
Parametr s wskazuje na kolejny element tablicy napis
{
for( ; *s != '\0'; s++ )
putchar( *s );
}
C+
napis
C + + \0
s
Copyright © Roman SimiÅ„ski Strona : 22
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Czy obiekt wskazywany przez s jest znacznikiem końca napisu?
Czy obiekt wskazywany przez s jest znacznikiem końca napisu?
char napis[ 80 ] = "C++";
put_string( napis );
void put_string2( char * s )
Parametr s wskazuje na kolejny element tablicy napis
{
for( ; *s != '\0'; s++ )
putchar( *s );
}
C+
napis
C + + \0
s
Copyright © Roman SimiÅ„ski Strona : 23
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Znak wskazywany przez s wyprowadzamy jest do stdout
Znak wskazywany przez s wyprowadzamy jest do stdout
char napis[ 80 ] = "C++";
put_string( napis );
void put_string2( char * s )
Parametr s wskazuje na kolejny element tablicy napis
{
for( ; *s != '\0'; s++ )
putchar( *s );
}
C++
napis
C + + \0
s
Copyright © Roman SimiÅ„ski Strona : 24
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Wskaznik s przesuwamy na następny znak
Wskaznik s przesuwamy na następny znak
char napis[ 80 ] = "C++";
put_string( napis );
void put_string2( char * s )
Parametr s wskazuje na kolejny element tablicy napis
{
for( ; *s != '\0'; s++ )
putchar( *s );
}
C++
napis
C + + \0
s
Copyright © Roman SimiÅ„ski Strona : 25
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Czy obiekt wskazywany przez s jest znacznikiem końca napisu?
Czy obiekt wskazywany przez s jest znacznikiem końca napisu?
char napis[ 80 ] = "C++";
put_string( napis );
void put_string2( char * s )
Parametr s wskazuje na kolejny element tablicy napis
{
for( ; *s != '\0'; s++ )
putchar( *s );
}
C++
napis
C + + \0
s
Copyright © Roman SimiÅ„ski Strona : 26
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Wskazniki w akcji  metamorfoza funkcji put_string, wersja 3 i 4
Wskazniki w akcji  metamorfoza funkcji put_string, wersja 3 i 4
void put_string3( char * s )  Kompresja iteracji for
{
for( ; *s != '\0' ; putchar( *s++ ) )
;
}
Najpierw pobierz znak
Potem zwiększ o jeden wartość
wskazywany przez s, użyj ++
*s
wskaznika s  będzie on wtedy
go.
wskazywał na następny element tablicy.
void put_string4( char * s ) Iteracja while nie jest taka zła...
{
Znak '\0' to bajt o wartości 0
while( *s )
putchar( *s++ );
}
Copyright © Roman SimiÅ„ski Strona : 27
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Wskazniki pod lupÄ…  metamorfoza funkcji strcpy
Wskazniki pod lupÄ…  metamorfoza funkcji strcpy
Wersja poczÄ…tkowa
char s1[ 80 ] = "Język C";
char s2[ 20 ];
Przypomnienie jak to działa
. . .
strcpy( s2, s1 );
i++
. . .
s 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 6 19
void strcpy( char d[], char s[] )
{
int i;
for( i = 0; s[ i ] != '\0'; i++ )
d[ i ] = s[ i ];
d[ i ] = '\0';
}
Copyright © Roman SimiÅ„ski Strona : 28
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Wskazniki pod lupÄ…  metamorfoza funkcji strcpy
Wskazniki pod lupÄ…  metamorfoza funkcji strcpy
void strcpy1( char * d, char * s )
Odwołania wskaznikowe
{
To właściwie nie wiele zmienia,
while( *s != '\0' )
poza wyeliminowaniem
{
zmiennej i
*d = *s;
d++;
s++;
}
*d = '\0';
}
void strcpy2( char * d, char * s )
 Kompresja  krok pierwszy
{
while( *s != '\0' )
*d++ = *s++;
*d = '\0';
}
Copyright © Roman SimiÅ„ski Strona : 29
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Wskazniki pod lupÄ…  metamorfoza funkcji strcpy
Wskazniki pod lupÄ…  metamorfoza funkcji strcpy
void strcpy3( char * d, char * s )
 Kompresja  krok drugi
{
while( ( *d++ = *s++ ) != '\0' )
;
}
Wartością tego wyrażenia jest znak
(bajt) przepisany z obszaru
( *d++ = *s++ )
!= '\0'
wskazywanego przez s do obszaru
wskazywanego przez d.
Pobierz znak wskazywany, wykorzystaj go,
zwiększ wskaznik tak, by pokazywał na następny
element tablicy.
Copyright © Roman SimiÅ„ski Strona : 30
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Wskazniki pod lupÄ…  metamorfoza funkcji strcpy
Wskazniki pod lupÄ…  metamorfoza funkcji strcpy
void strcpy4( char * d, char * s )
 Kompresja  krok trzeci
{
Znak '\0' to bajt o wartości 0
while( *d++ = *s++ )
;
}
Często spotykaną praktyką w funkcjach bibliotecznych jest udostępnianie wskaznika
do tablicy (jednej z tablic) będącej parametrem:
char * strcpy5( char * d, char * s )
Tablica d jako rezultat funkcji
{
while( *d++ = *s++ )
;
return d;
}
Copyright © Roman SimiÅ„ski Strona : 31
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Wskazniki pod lupÄ…  metamorfoza funkcji strcpy
Wskazniki pod lupÄ…  metamorfoza funkcji strcpy
Pozwala to na skrócenie kodu, załóżmy następujące definicje tablic s1, s2, s3:
char s1[ 80 ] = "C i C++";
char s2[ 80 ];
char s3[ 80 ];
Następujący fragment kodu:
strcpy5( s2, s1 );
strcpy5( s3, s2 );
puts( s3 );
Można zapisać krócej:
puts( strcpy5( s3, strcpy5( s2, s1 ) ) );
Copyright © Roman SimiÅ„ski Strona : 32
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Wskazniki pod lupÄ…  metamorfoza funkcji strcpy
Wskazniki pod lupÄ…  metamorfoza funkcji strcpy
W dotychczasowych realizacjach funkcji strcpyX, funkcja może modyfikować
zawartość tablicy zródłowej:
char * strcpy5( char * d, char * s )
Modyfikacja tablicy zródłowej
{
dozwolona, choć merytorycznie
*s = 'A';
niepoprawna
. . .
}
Aby temu zaradzić, można zadeklarować parametr reprezentujący tablicę zródłową
w specyficzny sposób:
char * strcpy6( char * d, const char * s )
Tablica zródłowa jest chroniona
{
*s = 'A';
. . .
}
Copyright © Roman SimiÅ„ski Strona : 33
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Wskazniki pod lupÄ…  zastosowanie modyfikatora const
Wskazniki pod lupÄ…  zastosowanie modyfikatora const
Aby funkcja nie mogła zmodyfikować parametru przekazanego za pośrednictwem
wskaznika, należy w deklaracji użyć słowa const. Deklaracja:
const char * s;
oznacza, że s jest wskaznikiem na stały (niemodyfikowalny) obiekt typu char.
Można wyróżnić następujące kombinacje definicji wskaznika z/bez const:
const int * const p; // Ustalony wskaznika na niemodyfikowalny obiekt
int * const p; // Ustalony wskaznika na modyfikowalny obiekt
const int * p; // Zwykły wskaznika na niemodyfikowalny obiekt
int * p; // Zwykły wskaznik na zwykły obiekt
Copyright © Roman SimiÅ„ski Strona : 34
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Wskazniki pod lupÄ…  zastosowanie modyfikatora const
Wskazniki pod lupÄ…  zastosowanie modyfikatora const
Wersja najbardziej restrykcyjna pod lupÄ…:
const int * const p; To się nie uda, ustalony wskaznik należy zainicjować!
Posługiwanie się ustalonym wskaznikiem do stałego obiektu:
int i = 10;
const int * const p = &i;
. . .
j = *p + 10;
To jest OK, odwołanie nie modyfikujące obiektu
. . .
*p = 20;
Niedozwolone, odwołanie modyfikujące obiekt
. . .
p = &j; Niedozwolone, odwołanie modyfikujące wskaznik
Copyright © Roman SimiÅ„ski Strona : 35
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Wyznaczanie długości napisu  funkcja strlen klasycznie
Wyznaczanie długości napisu  funkcja strlen klasycznie
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 : 36
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Wyznaczanie długości napisu  funkcja strlen wskaznikowo
Wyznaczanie długości napisu  funkcja strlen wskaznikowo
Realizacja w wykorzystaniem iteracji while:
int strlen( char * s )
{
char * ptr = s;
while( *ptr != '\0' )
ptr++;
return ( int )( ptr  s );
}
Realizacja w wykorzystaniem iteracji for:
int strlen( char * s )
{
char * ptr;
for( ptr = s; *ptr != '\0'; ptr++ )
;
return ( int )( ptr  s );
}
Copyright © Roman SimiÅ„ski Strona : 37
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Odwracanie kolejności znaków w napisie  strrev klasycznie
Odwracanie kolejności znaków w napisie  strrev klasycznie
char * 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;
}
return s;
}
Copyright © Roman SimiÅ„ski Strona : 38
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Odwracanie kolejności znaków w napisie  strrev wskaznikowo
Odwracanie kolejności znaków w napisie  strrev wskaznikowo
char * strrev( char * s )
{
char * begin, * end;
// Szukanie znacznika konca
for( end = s; *end ; end++ )
;
// Zamiana znakow miejscami
for( begin = s, end--; begin < end; begin++, end-- )
{
char c = *begin;
*begin = *end;
*end = c;
}
return s;
}
Copyright © Roman SimiÅ„ski Strona : 39
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Dynamiczna alokacja tablic  konwencja języka C
Dynamiczna alokacja tablic  konwencja języka C
Na tablicach alokowanych dynamicznie na stercie, można wykonywać takie same
operacje, jak na tablicach statycznych. Należy tylko uważnie przydzielać i zwalniać
pamięć.
char * s = NULL;
int n;
/* Tu ustalenie liczby potrzebnych elementów i zapamiętanie w zmiennej n */
s = malloc( n * sizeof( char ) );
if( s != NULL )
{
strcpy( s, "Język C " );
strcat( s, "fajny jest!" );
puts( s );
. . .
free( s );
}
Zobaczmy, jak wyglÄ…dajÄ… kolejne etapy definiowania i wykorzystania takiej tablicy...
Copyright © Roman SimiÅ„ski Strona : 40
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Dynamiczna alokacja tablic  konwencja języka C, etap 1-szy
Dynamiczna alokacja tablic  konwencja języka C, etap 1-szy
Definicja wskaznika  typ obiektu wskazywanego taki, jak typ elementów tablicy
jakich potrzebujemy. Zerowanie wskaznika to dobra praktyka.
char * s = NULL;
int n;
/* Tu ustalenie liczby potrzebnych elementów i zapamiętanie w zmiennej n */
s = malloc( n * sizeof( char ) );
if( s != NULL )
{
strcpy( s, "Język C " );
strcat( s, "fajny jest!" );
puts( s );
. . .
free( s );
}
Pamięć operacyjna
s
Sterta
Copyright © Roman SimiÅ„ski Strona : 41
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Dynamiczna alokacja tablic  konwencja języka C, etap 2-gi
Dynamiczna alokacja tablic  konwencja języka C, etap 2-gi
Zwykle korzystamy ze zmiennej, która pozwoli zapamiętać ilu elementową tablicę
potrzebujemy.
char * s = NULL;
int n;
/* Tu ustalenie liczby potrzebnych elementów i zapamiętanie w zmiennej n */
s = malloc( n * sizeof( char ) );
if( s != NULL )
{
strcpy( s, "Język C " );
strcat( s, "fajny jest!" );
puts( s );
. . .
free( s );
}
Pamięć operacyjna
s
Sterta
Copyright © Roman SimiÅ„ski Strona : 42
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Dynamiczna alokacja tablic  konwencja języka C, etap 3-ci
Dynamiczna alokacja tablic  konwencja języka C, etap 3-ci
Przed utworzeniem tablicy musimy ustalić konkretną liczbę elementów tablicy. Jak
ustalimy tę liczbę zależy od konkretnego zastosowania.
char * s = NULL;
int n;
/* Tu ustalenie liczby potrzebnych elementów i zapamiętanie w zmiennej n */
s = malloc( n * sizeof( char ) );
if( s != NULL )
{
strcpy( s, "Język C " );
strcat( s, "fajny jest!" );
puts( s );
. . .
free( s );
}
Pamięć operacyjna
s
Sterta
Copyright © Roman SimiÅ„ski Strona : 43
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Dynamiczna alokacja tablic  konwencja języka C, etap 4-ty
Dynamiczna alokacja tablic  konwencja języka C, etap 4-ty
Przydział pamięci dla tablicy  funkcja malloc otrzymuje liczbę bajtów potrzebnych
do przechowania ustalonej liczby elementów tablicy.
char * s = NULL;
int n;
/* Tu ustalenie liczby potrzebnych elementów i zapamiętanie w zmiennej n */
s = malloc( n * sizeof( char ) );
if( s != NULL )
{
strcpy( s, "Język C " );
strcat( s, "fajny jest!" );
puts( s );
. . .
free( s );
}
Pamięć operacyjna
s
Sterta
?....................?
Pamięć operacyjna
Copyright © Roman SimiÅ„ski Strona : 44
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Dynamiczna alokacja tablic  konwencja języka C, etap 5-ty
Dynamiczna alokacja tablic  konwencja języka C, etap 5-ty
Kontrola poprawności przydziału pamięci. Uwaga  to koniecznie niezbędny etap!
Przydzielony obszar pamięci ma przypadkową zawartość.
char * s = NULL;
int n;
/* Tu ustalenie liczby potrzebnych elementów i zapamiętanie w zmiennej n */
s = malloc( n * sizeof( char ) );
if( s != NULL )
{
strcpy( s, "Język C " );
strcat( s, "fajny jest!" );
puts( s );
. . .
free( s );
}
Pamięć operacyjna
s
Sterta
???..................?
Pamięć operacyjna
Copyright © Roman SimiÅ„ski Strona : 45
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Dynamiczna alokacja tablic  konwencja języka C, etap 6-ty
Dynamiczna alokacja tablic  konwencja języka C, etap 6-ty
Tak utworzona tablicę można używać tak samo, jak każdą inną tablicę w języku C.
Wszystkie funkcje do manipulowania np. napisami działają bez problemu.
char * s = NULL;
int n;
/* Tu ustalenie liczby potrzebnych elementów i zapamiętanie w zmiennej n */
s = malloc( n * sizeof( char ) );
if( s != NULL )
{
strcpy( s, "Język C " );
strcat( s, "fajny jest!" );
puts( s );
. . .
free( s );
}
Pamięć operacyjna
s
Sterta
Język C fajny jest!
Pamięć operacyjna
Copyright © Roman SimiÅ„ski Strona : 46
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Dynamiczna alokacja tablic  konwencja języka C, etap 6-ty
Dynamiczna alokacja tablic  konwencja języka C, etap 6-ty
Gdy tablica nie jest już potrzebna, zwalniamy przydzieloną pamięć i oddajemy do
puli wolnych bloków. Uwaga, wskaznik pokazuje dalej na zwolniony obszar pamięci!
char * s = NULL;
int n;
/* Tu ustalenie liczby potrzebnych elementów i zapamiętanie w zmiennej n */
s = malloc( n * sizeof( char ) );
if( s != NULL )
{
strcpy( s, "Język C " );
strcat( s, "fajny jest!" );
puts( s );
. . .
free( s );
}
Pamięć operacyjna
s
Sterta
Język C fajny jest!
Pamięć operacyjna
Copyright © Roman SimiÅ„ski Strona : 47
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Dynamiczna alokacja tablic  konwencja języka C, etap 6-ty
Dynamiczna alokacja tablic  konwencja języka C, etap 6-ty
Zerowanie wskaznika po zwolnieniu pamięci jest dobrą praktyką.
char * s = NULL;
int n;
/* Tu ustalenie liczby potrzebnych elementów i zapamiętanie w zmiennej n */
s = malloc( n * sizeof( char ) );
if( s != NULL )
{
strcpy( s, "Język C " );
strcat( s, "fajny jest!" );
puts( s );
. . .
free( s );
s = NULL;
}
Pamięć operacyjna
s
Sterta
Copyright © Roman SimiÅ„ski Strona : 48
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Dynamiczna alokacja tablic  konwencja języka C++
Dynamiczna alokacja tablic  konwencja języka C++
W języku C++ wykorzystujemy operatory new i delete.  Stara wersja, zakładająca,
że operator new oddaje wskaznik zerowy w przypadku braku wolnej pamięci:
char * s = 0;
int n;
// Tu ustalenie liczby potrzebnych elementów i zapamiętanie w zmiennej n
s = new char [ n ];
if( s != 0 )
{
strcpy( s, "Język C " );
strcat( s, "fajny jest!" );
puts( s );
. . .
delete [] s;
}
Copyright © Roman SimiÅ„ski Strona : 49
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Dynamiczna alokacja tablic  konwencja języka C++
Dynamiczna alokacja tablic  konwencja języka C++
 Nowa wersja, zakładająca, że operator new generuje wyjątek w przypadku braku
wolnej pamięci:
char * s = 0;
int n;
// Tu ustalenie liczby potrzebnych elementów i zapamiętanie w zmiennej n
try
{
s = new char [ n ];
strcpy( s, "Język C " );
strcat( s, "fajny jest!" );
puts( s );
. . .
delete [] s;
}
catch( ... )
{
cout << "Brak pamięci dla wykonania tej operacji";
}
Copyright © Roman SimiÅ„ski Strona : 50
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Dynamiczna alokacja tablic  konwencja języka C++
Dynamiczna alokacja tablic  konwencja języka C++
Wykorzystanie operatora new (nothrow) nie generującego wyjątków, obsługa jak w
 starej wersji:
char * s = 0;
int n;
// Tu ustalenie liczby potrzebnych elementów i zapamiętanie w zmiennej n
s = new (nothrow) char [ n ];
if( s != 0 )
{
strcpy( s, "Język C " );
strcat( s, "fajny jest!" );
puts( s );
. . .
delete [] s;
}
Copyright © Roman SimiÅ„ski Strona : 51
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Dynamiczna alokacja tablic  konwencja języka C++
Dynamiczna alokacja tablic  konwencja języka C++
Zerowanie wskaznika po zwolnieniu pamięci jest dobrą praktyką.
char * s = 0;
int n;
// Tu ustalenie liczby potrzebnych elementów i zapamiętanie w zmiennej n
s = new (nothrow) char [ n ];
if( s != 0 )
{
strcpy( s, "Język C " );
strcat( s, "fajny jest!" );
puts( s );
. . .
delete [] s;
s = 0;
}
Copyright © Roman SimiÅ„ski Strona : 52
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Dynamiczna alokacja tablic  konwencja języka C++
Dynamiczna alokacja tablic  konwencja języka C++
Zerowanie wskaznika po zwolnieniu pamięci jest dobrą praktyką.
char * s = 0;
int n;
// Tu ustalenie liczby potrzebnych elementów i zapamiętanie w zmiennej n
try
{
s = new char [ n ];
strcpy( s, "Język C " );
strcat( s, "fajny jest!" );
puts( s );
. . .
delete [] s;
s = 0;
}
catch( ... )
{
cout << "Brak pamięci dla wykonania tej operacji";
}
Copyright © Roman SimiÅ„ski Strona : 53
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Ważna sprawa  ostrożnie z parametrami wskaznikowymi!
Ważna sprawa  ostrożnie z parametrami wskaznikowymi!
W funkcjach bibliotecznych języka C i C++ stałą praktyką jest deklarowanie
parametrów tablicowych z wykorzystaniem wskazników, np:
zamiast
int strlen( char * s ); int strlen( char s[] );
Wymaga to dokładnego przeczytania dokumentacji, bowiem programiści często się
mylą. Rozważmy następujący przykład (fragment systemu pomocy firmy Borland):
Prototype
char *gets(char *s);
Description
Gets a string from stdin.
gets collects a string of characters terminated by a new line from the standard input stream stdin and
puts it into s. The new line is replaced by a null character (\0) in s.
gets allows input strings to contain certain whitespace characters (spaces, tabs). gets returns when it
encounters a new line; everything up to the new line is copied into s.
Copyright © Roman SimiÅ„ski Strona : 54
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Ważna sprawa  ostrożnie z parametrami wskaznikowymi!
Ważna sprawa  ostrożnie z parametrami wskaznikowymi!
Niedokładna lektura dokumentacji może sugerować, że funkcji należy użyć tak:
Pamięć operacyjna
char * imie;
imie
???
Aga
printf( "Podaj imie: " );
Pamięć operacyjna
gets( imie );
gets( imie )
Gdyby wskaznik był wyzerowany, kompilator czasem pomoże:
Pamięć operacyjna
char * imie = NULL;
imie
printf( "Podaj imie: " );
Pamięć operacyjna
gets( imie );
gets( imie )
Null pointer assignment
Stare kompilatory firmy Borland:
Copyright © Roman SimiÅ„ski Strona : 55
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Ważna sprawa  ostrożnie z parametrami wskaznikowymi!
Ważna sprawa  ostrożnie z parametrami wskaznikowymi!
A trzeba np. tak:
Pamięć operacyjna
char imie[ 80 ];
imie
Aga
printf( "Podaj imie: " );
Pamięć operacyjna
gets( imie );
gets( imie )
Lub tak:
Pamięć operacyjna
char * imie = NULL;
imie
Aga
imie = new (nothrow) char[ 80 ];
Pamięć operacyjna
if( imie != 0 )
gets( imie )
{
printf( "Podaj imie: " );
gets( imie );
. . .
delete [] imie;
}
Copyright © Roman SimiÅ„ski Strona : 56
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Można tworzyć dynamicznie tablice dowolnych typów
Można tworzyć dynamicznie tablice dowolnych typów
double * dochody = 0;
int liczbaMiesiecy;
// Tu ustalenie liczby miesiecy okresu rozrachunkowego
dochody = new (nothrow) double [ liczbaMiesiecy ];
if( dochody != 0 )
{
for( int miesiac = 0; miesiac < liczbaMiesiecy; miesiac++ )
dochody[ miesiac ] = 0;
. . .
delete [] dochody;
}
Copyright © Roman SimiÅ„ski Strona : 57
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Można tworzyć dynamicznie tablice dowolnych typów
Można tworzyć dynamicznie tablice dowolnych typów
typedef unsigned char byte;
byte * bitmapa = 0;
int rozmiarRysunku;
// Tu ustalenie liczby bajtów rysunku bitmapowego
bitmapa = new (nothrow) byte [ rozmiarRysunku ];
if( bitmapa != 0 )
{
// Zaladuj bitmape
// Zrob z nia co trzeba
// Gdy juz niepotrzebna
delete [] bitmapa;
}
Copyright © Roman SimiÅ„ski Strona : 58
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Tablice a problem ich poczÄ…tkowego rozmiaru
Tablice a problem ich poczÄ…tkowego rozmiaru
Według standardu C89 i C++:
tablica zawsze składa się z ustalonej, i znanej na etapie kompilacji liczby
elementów,
liczba elementów tablicy nie ulega zmianie w trakcie działania programu 
tablice sÄ… statyczne.
W standardzie C99 istniejÄ… tablice VLA (ang. variable length array):
liczba elementów tablicy może być zdefiniowany w trakcie wykonania
programu  może być określona wartością zmiennej, ta wartość nie musi być
znana na etapie kompilacji,
liczba elementów tablicy nie ulega zmianie w trakcie działania programu  raz
stworzona tablica zachowuje swój rozmiar.
Copyright © Roman SimiÅ„ski Strona : 59
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Tablice a problem ich początkowego rozmiaru  przykład
Tablice a problem ich początkowego rozmiaru  przykład
Problem
Należy napisać program pozwalający na ewidencjonowanie czasów
osiągniętych przez zawodników maratonu.
Liczba zawodników nie jest dokładnie znana, zakłada się jednak, że startowa
pula numerów jest ograniczona do 300.
Należy ewidencjonować dokładnie tyle czasów ile to potrzebne, program będzie
być może uruchamiany na starym komputerze przenośnym.
Copyright © Roman SimiÅ„ski Strona : 60
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
C89 i tablica czasów dla liczby zawodników nie większej niż 300
C89 i tablica czasów dla liczby zawodników nie większej niż 300
int lb_zawodnikow;
Ustalenie liczby zawodników, których
printf( "\nPodaj liczbe zawodnikow (maks. 300): " );
czasy będą ewidencjonowane
scanf( "%d", &lb_zawodnikow );
if( lb_zawodnikow > 0 && lb_zawodnikow <= 300 )
{
float * czasy;
int nr_zawodnika;
if( ( czasy = malloc( lb_zawodnikow * sizeof( float ) ) ) != NULL )
{
printf( "\nPodaj czasy kolejnych zawodnikow:\n" );
for( nr_zawodnika = 0; nr_zawodnika < lb_zawodnikow; nr_zawodnika++ )
{
printf( "%d>", nr_zawodnika + 1 );
scanf( "%f", &czasy[ nr_zawodnika ] );
}
/* Jakies operacje na tablicy czasy */
printf( "\n\nZawodnik Czas" );
for( nr_zawodnika = 0; nr_zawodnika < lb_zawodnikow; nr_zawodnika++ )
printf( "\n%-10d%-.2f", nr_zawodnika + 1, czasy[ nr_zawodnika ] );
free( czasy );
}
else
printf( "\nBrak pamieci!" );
}
else
printf( "Zbyt duza liczba zawodnikow" );
Copyright © Roman SimiÅ„ski Strona : 61
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
C89 i tablica czasów dla liczby zawodników nie większej niż 300
C89 i tablica czasów dla liczby zawodników nie większej niż 300
int lb_zawodnikow;
Czy liczba zawodników nie przekracza
printf( "\nPodaj liczbe zawodnikow (maks. 300): " );
zadanego maksimum?
scanf( "%d", &lb_zawodnikow );
if( lb_zawodnikow > 0 && lb_zawodnikow <= 300 )
{
float * czasy;
int nr_zawodnika;
if( ( czasy = malloc( lb_zawodnikow * sizeof( float ) ) ) != NULL )
{
printf( "\nPodaj czasy kolejnych zawodnikow:\n" );
for( nr_zawodnika = 0; nr_zawodnika < lb_zawodnikow; nr_zawodnika++ )
{
printf( "%d>", nr_zawodnika + 1 );
scanf( "%f", &czasy[ nr_zawodnika ] );
}
/* Jakies operacje na tablicy czasy */
printf( "\n\nZawodnik Czas" );
for( nr_zawodnika = 0; nr_zawodnika < lb_zawodnikow; nr_zawodnika++ )
printf( "\n%-10d%-.2f", nr_zawodnika + 1, czasy[ nr_zawodnika ] );
free( czasy );
}
else
printf( "\nBrak pamieci!" );
}
else
printf( "Zbyt duza liczba zawodnikow" );
Copyright © Roman SimiÅ„ski Strona : 62
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
C89 i tablica czasów dla liczby zawodników nie większej niż 300
C89 i tablica czasów dla liczby zawodników nie większej niż 300
int lb_zawodnikow;
Tablica ewidencjonujÄ…ca czasy
printf( "\nPodaj liczbe zawodnikow (maks. 300): " );
zostanie przydzielona dynamicznie
scanf( "%d", &lb_zawodnikow );
if( lb_zawodnikow > 0 && lb_zawodnikow <= 300 )
{
float * czasy;
int nr_zawodnika;
if( ( czasy = malloc( lb_zawodnikow * sizeof( float ) ) ) != NULL )
{
printf( "\nPodaj czasy kolejnych zawodnikow:\n" );
for( nr_zawodnika = 0; nr_zawodnika < lb_zawodnikow; nr_zawodnika++ )
{
printf( "%d>", nr_zawodnika + 1 );
scanf( "%f", &czasy[ nr_zawodnika ] );
}
/* Jakies operacje na tablicy czasy */
printf( "\n\nZawodnik Czas" );
for( nr_zawodnika = 0; nr_zawodnika < lb_zawodnikow; nr_zawodnika++ )
printf( "\n%-10d%-.2f", nr_zawodnika + 1, czasy[ nr_zawodnika ] );
free( czasy );
}
else
printf( "\nBrak pamieci!" );
}
else
printf( "Zbyt duza liczba zawodnikow" );
Copyright © Roman SimiÅ„ski Strona : 63
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
C89 i tablica czasów dla liczby zawodników nie większej niż 300
C89 i tablica czasów dla liczby zawodników nie większej niż 300
int lb_zawodnikow;
Przydział pamięci dla tablicy czasów i
printf( "\nPodaj liczbe zawodnikow (maks. 300): " );
kontrola poprawności jego wykonania
scanf( "%d", &lb_zawodnikow );
if( lb_zawodnikow > 0 && lb_zawodnikow <= 300 )
{
float * czasy;
int nr_zawodnika;
if( ( czasy = malloc( lb_zawodnikow * sizeof( float ) ) ) != NULL )
{
printf( "\nPodaj czasy kolejnych zawodnikow:\n" );
for( nr_zawodnika = 0; nr_zawodnika < lb_zawodnikow; nr_zawodnika++ )
{
printf( "%d>", nr_zawodnika + 1 );
scanf( "%f", &czasy[ nr_zawodnika ] );
}
/* Jakies operacje na tablicy czasy */
printf( "\n\nZawodnik Czas" );
for( nr_zawodnika = 0; nr_zawodnika < lb_zawodnikow; nr_zawodnika++ )
printf( "\n%-10d%-.2f", nr_zawodnika + 1, czasy[ nr_zawodnika ] );
free( czasy );
}
else
printf( "\nBrak pamieci!" );
}
else
printf( "Zbyt duza liczba zawodnikow" );
Copyright © Roman SimiÅ„ski Strona : 64
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
C89 i tablica czasów dla liczby zawodników nie większej niż 300
C89 i tablica czasów dla liczby zawodników nie większej niż 300
int lb_zawodnikow;
Operacje na tablicy  przetwarzana
printf( "\nPodaj liczbe zawodnikow (maks. 300): " );
jest rzeczywista liczba elementów
scanf( "%d", &lb_zawodnikow );
if( lb_zawodnikow > 0 && lb_zawodnikow <= 300 )
{
float * czasy;
int nr_zawodnika;
if( ( czasy = malloc( lb_zawodnikow * sizeof( float ) ) ) != NULL )
{
printf( "\nPodaj czasy kolejnych zawodnikow:\n" );
for( nr_zawodnika = 0; nr_zawodnika < lb_zawodnikow; nr_zawodnika++ )
{
printf( "%d>", nr_zawodnika + 1 );
scanf( "%f", &czasy[ nr_zawodnika ] );
}
/* Jakies operacje na tablicy czasy */
printf( "\n\nZawodnik Czas" );
for( nr_zawodnika = 0; nr_zawodnika < lb_zawodnikow; nr_zawodnika++ )
printf( "\n%-10d%-.2f", nr_zawodnika + 1, czasy[ nr_zawodnika ] );
free( czasy );
}
else
printf( "\nBrak pamieci!" );
}
else
printf( "Zbyt duza liczba zawodnikow" );
Copyright © Roman SimiÅ„ski Strona : 65
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
C89 i tablica czasów dla liczby zawodników nie większej niż 300
C89 i tablica czasów dla liczby zawodników nie większej niż 300
int lb_zawodnikow;
Tablica nie jest już dłużej potrzebna,
printf( "\nPodaj liczbe zawodnikow (maks. 300): " );
zwolnienie pamięci jej przydzielonej
scanf( "%d", &lb_zawodnikow );
if( lb_zawodnikow > 0 && lb_zawodnikow <= 300 )
{
float * czasy;
int nr_zawodnika;
if( ( czasy = malloc( lb_zawodnikow * sizeof( float ) ) ) != NULL )
{
printf( "\nPodaj czasy kolejnych zawodnikow:\n" );
for( nr_zawodnika = 0; nr_zawodnika < lb_zawodnikow; nr_zawodnika++ )
{
printf( "%d>", nr_zawodnika + 1 );
scanf( "%f", &czasy[ nr_zawodnika ] );
}
/* Jakies operacje na tablicy czasy */
printf( "\n\nZawodnik Czas" );
for( nr_zawodnika = 0; nr_zawodnika < lb_zawodnikow; nr_zawodnika++ )
printf( "\n%-10d%-.2f", nr_zawodnika + 1, czasy[ nr_zawodnika ] );
free( czasy );
}
else
printf( "\nBrak pamieci!" );
}
else
printf( "Zbyt duza liczba zawodnikow" );
Copyright © Roman SimiÅ„ski Strona : 66
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
Podstawy programowania w C++ T a b l i c e a z m i e n n e w s k a z n i k o w e
C99 i tablica czasów dla liczby zawodników nie większej niż 300
C99 i tablica czasów dla liczby zawodników nie większej niż 300
#include
#include
Tablica VLA o rozmiarze poczÄ…tkowym
definiowanym w trakcie działania
int main()
programu
{
int lb_zawodnikow;
printf( "\nPodaj liczbe zawodnikow (maks. 300): " );
scanf( "%d", &lb_zawodnikow );
if( lb_zawodnikow > 0 && lb_zawodnikow <= 300 )
{
float czasy[ lb_zawodnikow ];
int nr_zawodnika;
printf( "\nPodaj czasy kolejnych zawodnikow:\n" );
for( nr_zawodnika = 0; nr_zawodnika < lb_zawodnikow; nr_zawodnika++ )
{
printf( "%d>", nr_zawodnika + 1 );
scanf( "%f", &czasy[ nr_zawodnika ] );
}
/* Jakies operacje na tablicy czasy */
printf( "\n\nZawodnik Czas" );
for( nr_zawodnika = 0; nr_zawodnika < lb_zawodnikow; nr_zawodnika++ )
printf( "\n%-10d%-.2f", nr_zawodnika + 1, czasy[ nr_zawodnika ] );
}
else
printf( "Zbyt duza liczba zawodnikow" );
return EXIT_SUCCESS;
}
Copyright © Roman SimiÅ„ski Strona : 67


Wyszukiwarka

Podobne podstrony:
W09
W09 IL aproksymacja cz 2(1)
w09 b
anl1 w09 lato2009
W09 Interfejsy komunikacji bezprzewodowej irDA, Bluetooth
c cxx w12
PodstawyProgramowania W09
AM23 w09 Całki podwójne
m1 w09
MPiS30 W09 Podstawy statystyki matematycznej
bal w09
W09
c cxx w05a
Multimedia W09
W09 produkcja III
W09 sprzegla

więcej podobnych podstron