Algorytmy, struktury danych i
Algorytmy, struktury danych i
techniki programowania.
techniki programowania.
Laboratorium z podstaw programowania w j
Laboratorium z podstaw programowania w j
ę
ę
zyku ANSI C
zyku ANSI C
Ł
Ł
a
a
ń
ń
cuchy znak
cuchy znak
ó
ó
w
w
Jak pami
Jak pami
ę
ę
tamy z poprzednich zaj
tamy z poprzednich zaj
ęć
ęć
ł
ł
a
a
ń
ń
cuch znak
cuch znak
ó
ó
w zapisujemy pomi
w zapisujemy pomi
ę
ę
dzy
dzy
znakami cudzys
znakami cudzys
ł
ł
owu.
owu.
"
"
Lancuch
Lancuch
znakow
znakow
"
"
I u
I u
ż
ż
ywali
ywali
ś
ś
my go wielokrotnie wywo
my go wielokrotnie wywo
ł
ł
uj
uj
ą
ą
c funkcje
c funkcje
prntf
prntf
() lub
() lub
scanf
scanf
().
().
W takiej postaci jak powy
W takiej postaci jak powy
ż
ż
ej
ej
ł
ł
a
a
ń
ń
cuch znak
cuch znak
ó
ó
w to tzw. sta
w to tzw. sta
ł
ł
a
a
ł
ł
a
a
ń
ń
cuchowa (ang.
cuchowa (ang.
string
string
constant
constant
lub kr
lub kr
ó
ó
tko
tko
string
string
), kt
), kt
ó
ó
ra w rzeczywisto
ra w rzeczywisto
ś
ś
ci stanowi tablic
ci stanowi tablic
ę
ę
pojedynczych
pojedynczych
znak
znak
ó
ó
w ASCII (typ
w ASCII (typ
char
char
-
-
ka
ka
ż
ż
dy znak zajmuje jeden bajt pami
dy znak zajmuje jeden bajt pami
ę
ę
ci):
ci):
‘
‘
L
L
’
’
‘
‘
a
a
’
’
‘
‘
n
n
’
’
‘
‘
c
c
’
’
‘
‘
u
u
’
’
‘
‘
c
c
’
’
‘
‘
h
h
’
’
‘
‘
‘
‘
‘
‘
z
z
’
’
‘
‘
n
n
’
’
‘
‘
a
a
’
’
‘
‘
k
k
’
’
‘
‘
o
o
’
’
‘
‘
w
w
’
’
‘
‘
\
\
0
0
’
’
Trzeba zwr
Trzeba zwr
ó
ó
ci
ci
ć
ć
uwag
uwag
ę
ę
,
,
ż
ż
e kompilator na ko
e kompilator na ko
ń
ń
cu ka
cu ka
ż
ż
dego
dego
ł
ł
a
a
ń
ń
cucha dodaje znak
cucha dodaje znak
zerowy
zerowy
‘
‘
\
\
0
0
’
’
ko
ko
ń
ń
cz
cz
ą
ą
cy
cy
ł
ł
a
a
ń
ń
cuch. Jest on niewidoczny, ale s
cuch. Jest on niewidoczny, ale s
ł
ł
u
u
ż
ż
y do informowania
y do informowania
funkcji operuj
funkcji operuj
ą
ą
cych na
cych na
ł
ł
a
a
ń
ń
cuchach, w kt
cuchach, w kt
ó
ó
rym miejscu ko
rym miejscu ko
ń
ń
czy si
czy si
ę
ę
ł
ł
a
a
ń
ń
cuch znak
cuch znak
ó
ó
w.
w.
Tworz
Tworz
ą
ą
c zmienne
c zmienne
ł
ł
a
a
ń
ń
cuchowe w j
cuchowe w j
ę
ę
zyku C trzeba korzysta
zyku C trzeba korzysta
ć
ć
z tablic znakowych
z tablic znakowych
char
char
tab[ROZMIAR
tab[ROZMIAR
];
];
gdy
gdy
ż
ż
nie istnieje w tym j
nie istnieje w tym j
ę
ę
zyku typ bezpo
zyku typ bezpo
ś
ś
rednio reprezentuj
rednio reprezentuj
ą
ą
cy
cy
ł
ł
a
a
ń
ń
cuch znakowy.
cuch znakowy.
Zatem nazwa tablicy znak
Zatem nazwa tablicy znak
ó
ó
w lub sta
w lub sta
ł
ł
a
a
ł
ł
a
a
ń
ń
cuchowa jest wska
cuchowa jest wska
ź
ź
nikiem do pocz
nikiem do pocz
ą
ą
tku
tku
stringu
stringu
.
.
Ł
Ł
a
a
ń
ń
cuchy znak
cuchy znak
ó
ó
w
w
Przyk
Przyk
ł
ł
ady deklaracji
ady deklaracji
ł
ł
a
a
ń
ń
cuch
cuch
ó
ó
w znakowych:
w znakowych:
//przy u
//przy u
ż
ż
yciu tablicy znak
yciu tablicy znak
ó
ó
w
w
char
char
nazwa[] =
nazwa[] =
"
"
Zwykly
Zwykly
napis
napis
”
”
;
;
//przy u
//przy u
ż
ż
yciu wska
yciu wska
ź
ź
nika do pocz
nika do pocz
ą
ą
tku
tku
ł
ł
a
a
ń
ń
cucha znak
cucha znak
ó
ó
w
w
char
char
*napis =
*napis =
"Kolejny napis ale
"Kolejny napis ale
troche
troche
inaczej zadeklarowany
inaczej zadeklarowany
”
”
;
;
//przy u
//przy u
ż
ż
yciu sta
yciu sta
ł
ł
ej symbolicznej
ej symbolicznej
#
#
define
define
POZDROWIENIE
POZDROWIENIE
"Witaj
"Witaj
uzytkowiku
uzytkowiku
!"
!"
W ka
W ka
ż
ż
dym przypadku kompilator automatycznie oblicza d
dym przypadku kompilator automatycznie oblicza d
ł
ł
ugo
ugo
ść
ść
ł
ł
a
a
ń
ń
cucha i dodaje
cucha i dodaje
na ko
na ko
ń
ń
cu znak zerowy
cu znak zerowy
‘
‘
\
\
0
0
’
’
.
.
Przyk
Przyk
ł
ł
ad
ad
#include
<stdio.h>
#define
ROZMIAR 30
#define
STATUS_1
"Kandydat"
// ła
ń
cuchy znaków jako stałe symboliczne
#define
STATUS_2
"Student"
#define
STATUS_3
"Absolwent"
void
main(
void
){
char
imie[ROZMIAR], nazwisko[ROZMIAR];
//tablice znakowe
int
status;
printf(
"Podaj swoje imie i nazwisko: "
);
scanf(
"%s%s"
, imie, nazwisko );
//nazwy tablic to jednocze
ś
nie wska
ź
niki ich pocz
ą
tków
printf(
"Witaj %s podaj swoj status: (1, 2, 3)\n"
, imie);
scanf(
"%d"
, &status);
switch
(status){
case
1:
printf(
"%s %s ststus: %s \n"
, imie, nazwisko, STATUS_1);
break
;
case
2:
printf(
"%s %s ststus: %s \n"
, imie, nazwisko, STATUS_2);
break
;
case
3:
printf(
"%s %s ststus: %s \n"
, imie, nazwisko, STATUS_3);
break
;
default
:
printf(
"Niestety bledny status!\n"
);
break
;
}
}
Ł
Ł
a
a
ń
ń
cuchy znak
cuchy znak
ó
ó
w
w
–
–
funkcja
funkcja
gets
gets
()
()
Funkcja
Funkcja
scanf(
scanf(
"%s
"%s
”
”
, nazwa)
, nazwa)
pobiera ci
pobiera ci
ą
ą
g znak
g znak
ó
ó
w z klawiatury do momentu
w z klawiatury do momentu
napotkania bia
napotkania bia
ł
ł
ego znaku (
ego znaku (
znaku
znaku
odst
odst
ę
ę
pu, tabulacji lub znaku nowego wiersza).
pu, tabulacji lub znaku nowego wiersza).
Do pobierania ca
Do pobierania ca
ł
ł
ych linii tekstu s
ych linii tekstu s
ł
ł
u
u
ż
ż
y funkcja
y funkcja
gets
gets
()
()
z biblioteki
z biblioteki
stdio.h
stdio.h
,
,
kt
kt
ó
ó
ra
ra
jako argument pobiera tablic
jako argument pobiera tablic
ę
ę
znak
znak
ó
ó
w, do kt
w, do kt
ó
ó
rej kopiuje znaki pobrane z
rej kopiuje znaki pobrane z
klawiatury. Funkcja
klawiatury. Funkcja
gets
gets
()
()
pobiera znaki do momentu napotkania znaku nowej
pobiera znaki do momentu napotkania znaku nowej
linii
linii
‘
‘
\
\
n
n
’
’
wpisanego przez wci
wpisanego przez wci
ś
ś
ni
ni
ę
ę
cie klawisza ENTER, lecz bez tego znaku oraz
cie klawisza ENTER, lecz bez tego znaku oraz
dodaje na ko
dodaje na ko
ń
ń
cu
cu
ł
ł
a
a
ń
ń
cucha znak zerowy
cucha znak zerowy
‘
‘
\
\
0
0
’
’
.
.
Funkcja
Funkcja
gets
gets
()
()
zwraca tak
zwraca tak
ż
ż
e wska
e wska
ź
ź
nik do pobranego
nik do pobranego
ł
ł
a
a
ń
ń
cucha znak
cucha znak
ó
ó
w.
w.
W przypadku b
W przypadku b
ł
ę
ł
ę
d
d
ó
ó
w przy pobieraniu znak
w przy pobieraniu znak
ó
ó
w z klawiatury, funkcja
w z klawiatury, funkcja
gets
gets
()
()
zwraca
zwraca
wska
wska
ź
ź
nik zerowy (NULL)
nik zerowy (NULL)
Mo
Mo
ż
ż
na wi
na wi
ę
ę
c sprawdzi
c sprawdzi
ć
ć
czy
czy
ł
ł
a
a
ń
ń
cuch zosta
cuch zosta
ł
ł
pobrany prawid
pobrany prawid
ł
ł
owo:
owo:
if
if
(
(
gets(nazwa
gets(nazwa
) == NULL)
) == NULL)
printf(
printf(
"Blad
"Blad
przy odczycie danych!"
przy odczycie danych!"
);
);
Ł
Ł
a
a
ń
ń
cuchy znak
cuchy znak
ó
ó
w
w
–
–
funkcja
funkcja
puts
puts
()
()
Do wy
Do wy
ś
ś
wietlania
wietlania
ł
ł
a
a
ń
ń
cuch
cuch
ó
ó
w znakowych na ekranie s
w znakowych na ekranie s
ł
ł
u
u
ż
ż
y te
y te
ż
ż
funkcja
funkcja
puts
puts
()
()
, kt
, kt
ó
ó
ra
ra
jako argument przyjmuje
jako argument przyjmuje
ł
ł
a
a
ń
ń
cuch znak
cuch znak
ó
ó
w. Na ko
w. Na ko
ń
ń
cu zawsze dodawany jest znak
cu zawsze dodawany jest znak
nowej linii.
nowej linii.
Przyk
Przyk
ł
ł
ad
ad
#include
<stdio.h>
#define
ROZMIAR 50
#define
STATUS_1
"Kandydat"
// ła
ń
cuchy znaków jako stałe symboliczne
#define
STATUS_2
"Student"
#define
STATUS_3
"Absolwent"
int
main(
void
){
char
nazwa[ROZMIAR];
int
status;
puts(
"Podaj swoje imie i nazwisko :"
);
if
( gets(nazwa) == NULL ){
//cały wiersz znajdzie si
ę
w tablicy nazwa
puts(
"Blad pobierania danych lub koniec pliku!"
);
return
0;
//zako
ń
czenie programu
}
printf(
"Witaj %s podaj swoj status: (1, 2, 3)\n"
, nazwa);
scanf(
"%d"
, &status);
switch
(status){
case
1:
printf(
"%s ststus: %s \n"
, nazwa, STATUS_1);
break
;
case
2:
printf(
"%s ststus: %s \n"
, nazwa, STATUS_2);
break
;
case
3:
printf(
"%s ststus: %s \n"
, nazwa, STATUS_3);
break
;
default
:
printf(
"Niestety bledny status!\n"
);
break
; }
return
0; }
Funkcja
Funkcja
getchar
getchar
() i
() i
putchar
putchar
()
()
Ł
Ł
a
a
ń
ń
cuchy znak
cuchy znak
ó
ó
w mo
w mo
ż
ż
na te
na te
ż
ż
tworzy
tworzy
ć
ć
z pojedynczych znak
z pojedynczych znak
ó
ó
w przy u
w przy u
ż
ż
yciu
yciu
funcji
funcji
getchar
getchar
()
()
i
i
putchar
putchar
()
()
w po
w po
ł
ą
ł
ą
czeniu z instrukcj
czeniu z instrukcj
ą
ą
p
p
ę
ę
tli. Spotkali
tli. Spotkali
ś
ś
my si
my si
ę
ę
ju
ju
ż
ż
wcze
wcze
ś
ś
niej z u
niej z u
ż
ż
yciem tych funkcji.
yciem tych funkcji.
Funkcja
Funkcja
getchar
getchar
()
()
pobiera z klawiatury jeden znak za
pobiera z klawiatury jeden znak za
ś
ś
funkcja
funkcja
putchar
putchar
()
()
wypisuje na ekranie jeden znak. Trzeba jednak zarezerwowa
wypisuje na ekranie jeden znak. Trzeba jednak zarezerwowa
ć
ć
odpowiedni rozmiar
odpowiedni rozmiar
tablicy w kt
tablicy w kt
ó
ó
rej b
rej b
ę
ę
dzie przechowywany tekst aby nie nast
dzie przechowywany tekst aby nie nast
ą
ą
pi
pi
ł
ł
o przepe
o przepe
ł
ł
nienie
nienie
tablicy.
tablicy.
Przyk
Przyk
ł
ł
ad
ad
#
#
include
include
<
<
stdio.h
stdio.h
>
>
#
#
define
define
ROZMIAR 1000
ROZMIAR 1000
//odpowiednio du
//odpowiednio du
ż
ż
a tablica
a tablica
ż
ż
eby pomie
eby pomie
ś
ś
ci
ci
ć
ć
//wszystkie znaki
//wszystkie znaki
int
int
main
main
(
(
void
void
){
){
char
char
nazwa[ROZMIAR
nazwa[ROZMIAR
];
];
int
int
i = 0;
i = 0;
int
int
dlugosc
dlugosc
;
;
puts(
puts(
"Wpisz
"Wpisz
cokolwiek:"
cokolwiek:"
);
);
//pobieranie tekstu z klawiatury
//pobieranie tekstu z klawiatury
while
while
( (
( (
nazwa[i
nazwa[i
] =
] =
getchar
getchar
()) != '
()) != '
\
\
n' )
n' )
i++;
i++;
dlugosc
dlugosc
= i;
= i;
//wy
//wy
ś
ś
wietlanie wpisanego tekstu
wietlanie wpisanego tekstu
for
for
(i = 0; i <
(i = 0; i <
dlugosc
dlugosc
; i++)
; i++)
putchar(nazwa[i
putchar(nazwa[i
]);
]);
putchar(
putchar(
'
'
\
\
n
n
'
'
);
);
getchar
getchar
();
();
return
return
0;
0;
}
}
Ł
Ł
a
a
ń
ń
cuchy znak
cuchy znak
ó
ó
w
w
-
-
biblioteka
biblioteka
string.h
string.h
Do wykonywania operacji na
Do wykonywania operacji na
ł
ł
a
a
ń
ń
cuchach znak
cuchach znak
ó
ó
w s
w s
ł
ł
u
u
ż
ż
y wiele funkcji kt
y wiele funkcji kt
ó
ó
rych
rych
deklaracje znajduj
deklaracje znajduj
ą
ą
si
si
ę
ę
w pliku
w pliku
string.h
string.h
Jedne z najwa
Jedne z najwa
ż
ż
niejszych funkcji to:
niejszych funkcji to:
int
int
strlen(
strlen(
const
const
char
char
* s1)
* s1)
–
–
oblicza d
oblicza d
ł
ł
ugo
ugo
ść
ść
ł
ł
a
a
ń
ń
cucha s1 i zwraca liczb
cucha s1 i zwraca liczb
ę
ę
znak
znak
ó
ó
w
w
(bez znaku zerowego).
(bez znaku zerowego).
char
char
*
*
strcpy(
strcpy(
char
char
*s1,
*s1,
const
const
char
char
*s2 )
*s2 )
–
–
Kopiuje
Kopiuje
ł
ł
a
a
ń
ń
cuch wskazywany
cuch wskazywany
przez s2 wraz ze znakiem zerowym w miejsce wskazywane
przez s2 wraz ze znakiem zerowym w miejsce wskazywane
przez s1 i zwraca wska
przez s1 i zwraca wska
ź
ź
nik s1.
nik s1.
int
int
strcmp(
strcmp(
const
const
char
char
*s1,
*s1,
const
const
char
char
*s2)
*s2)
–
–
por
por
ó
ó
wnuje
wnuje
ł
ł
a
a
ń
ń
cuchy s1 i s2.
cuchy s1 i s2.
Je
Je
ż
ż
eli wszystkie znaki w s1 i s2 s
eli wszystkie znaki w s1 i s2 s
ą
ą
identyczne to
identyczne to
ł
ł
a
a
ń
ń
cuchy s
cuchy s
ą
ą
r
r
ó
ó
wne. Por
wne. Por
ó
ó
wnywane s
wnywane s
ą
ą
warto
warto
ś
ś
ci numeryczne poszczeg
ci numeryczne poszczeg
ó
ó
lnych
lnych
znak
znak
ó
ó
w. Je
w. Je
ż
ż
eli
eli
ł
ł
a
a
ń
ń
cuchy s
cuchy s
ą
ą
r
r
ó
ó
wne to funkcja zwraca 0. Je
wne to funkcja zwraca 0. Je
ż
ż
eli
eli
funkcja napotka r
funkcja napotka r
ó
ó
ż
ż
ne znaki w s1 i s2 to por
ne znaki w s1 i s2 to por
ó
ó
wnuje ich warto
wnuje ich warto
ś
ś
ci
ci
numeryczne i zwraca warto
numeryczne i zwraca warto
ść
ść
ujemn
ujemn
ą
ą
je
je
ż
ż
eli pierwszy
eli pierwszy
ł
ł
a
a
ń
ń
cuch
cuch
jest mniejszy ni
jest mniejszy ni
ż
ż
drugi za
drugi za
ś
ś
dodatni
dodatni
ą
ą
w przeciwnym wypadku.
w przeciwnym wypadku.
Zadanie
Zadanie
Prosz
Prosz
ę
ę
napisa
napisa
ć
ć
program, kt
program, kt
ó
ó
ry pobiera z klawiatury imi
ry pobiera z klawiatury imi
ę
ę
i nazwisko za
i nazwisko za
pomoc
pomoc
ą
ą
funkcji
funkcji
gets
gets
(), nast
(), nast
ę
ę
pnie rozdziela imi
pnie rozdziela imi
ę
ę
od nazwiska i umieszcza
od nazwiska i umieszcza
dwa
dwa
ł
ł
a
a
ń
ń
cuchy w osobnych tablicach. Na koniec nale
cuchy w osobnych tablicach. Na koniec nale
ż
ż
y wy
y wy
ś
ś
wietli
wietli
ć
ć
na
na
ekranie liczb
ekranie liczb
ę
ę
liter w imieniu i nazwisku u
liter w imieniu i nazwisku u
ż
ż
ywaj
ywaj
ą
ą
c funkcji
c funkcji
strlen
strlen
().
().
Rozwi
Rozwi
ą
ą
zanie
zanie
#include
<stdio.h>
#include
<string.h>
#define
ROZMIAR 100
int
main(
void
){
char
napis[ROZMIAR], imie[ROZMIAR], nazwisko[ROZMIAR];
int
i, j;
puts(
"Wpisz imie i nazwisko:"
);
if
(gets(napis) == NULL){
puts(
"Blad pobierania!"
);
return
0;
}
printf(
"%s zawiera %d znakow.\n"
, napis, strlen(napis));
i = 0;
while
(napis[i] !=
' '
){
//kopiowanie do znaku odstępu
imie[i] = napis[i];
i++;
}
imie[i] =
'\0'
;
//dodanie znaku zerowego na końcu
//dalszy ciąg na następnym slajdzie
Rozwi
Rozwi
ą
ą
zanie
zanie
//dokończenie
i++;
//trzeba ominąć znak odstępu
j = 0;
while
(napis[i] !=
'\0'
){
nazwisko[j++] = napis[i++];
}
nazwisko[j] =
'\0'
;
//dodanie znaku zerowego na końcu
printf(
"%s zawiera %d znakow.\n"
, imie, strlen(imie));
printf(
"%s zawiera %d znakow.\n"
, nazwisko, strlen(nazwisko));
putchar(
'\n'
);
getchar();
return
0;
}
Zadanie
Zadanie
Prosz
Prosz
ę
ę
napisa
napisa
ć
ć
program, kt
program, kt
ó
ó
ry pobiera z klawiatury dwa napisy,
ry pobiera z klawiatury dwa napisy,
por
por
ó
ó
wnuje je za pomoc
wnuje je za pomoc
ą
ą
funkcji
funkcji
strcmp
strcmp
() i wy
() i wy
ś
ś
wietla wynik na ekranie.
wietla wynik na ekranie.
Nast
Nast
ę
ę
pnie po
pnie po
ł
ą
ł
ą
czy
czy
ć
ć
dwa napisy w jeden za pomoc
dwa napisy w jeden za pomoc
ą
ą
funkcji
funkcji
strcpy
strcpy
() i
() i
wy
wy
ś
ś
wietli
wietli
ć
ć
go na
go na
ekranie.
ekranie.
Rozwi
Rozwi
ą
ą
zanie
zanie
#include
<stdio.h>
#include
<string.h>
#define
ROZMIAR 100
int
main(
void
){
char
napis_1[ROZMIAR], napis_2[ROZMIAR], calosc[ROZMIAR];
int
wynik;
puts(
"Wpisz pierwszy napis:"
);
if
(gets(napis_1) == NULL){
puts(
"Blad pobierania"
);
return
0;
}
puts(
"Wpisz drugi napis:"
);
if
(gets(napis_2) == NULL){
puts(
"Blad pobierania"
);
return
0;
}
wynik = strcmp(napis_1, napis_2);
//dalszy ciąg na następnym slajdzie
Rozwi
Rozwi
ą
ą
zanie
zanie
//dokończenie
if
(wynik < 0)
printf(
"Napis \"%s\" jest mniejszy od napisu \"%s\"\n"
, napis_1,
napis_2);
else if
(wynik > 0)
printf(
"Napis \"%s\" jest wiekszy od napisu \"%s\"\n"
, napis_1,
napis_2);
else
printf(
"Napisy sa rowne."
);
strcpy(calosc, napis_1);
//kopiowanie napis_1
strcpy( (calosc + strlen(napis_1)), napis_2);
//kopiowanie napis_2
// strcat(calosc, napis_2); //alternatywna funkcja dołączająca jeden łańcuch
//znaków na koniec drugiego łańcucha
printf(
"Polaczone napisy: \"%s\" \n"
, calosc);
putchar(
'\n'
);
getchar();
return
0;
}
Dzi
Dzi
ę
ę
kuje za uwag
kuje za uwag
ę
ę
.
.
Najlepsz
Najlepsz
ą
ą
metod
metod
ą
ą
nauczenia si
nauczenia si
ę
ę
programowania.
programowania.
Jest pisanie program
Jest pisanie program
ó
ó
w.
w.
>>Trening czyni mistrza <<
>>Trening czyni mistrza <<