p
l
e
=
k
o
b
i
e
t
a
;
e
l
s
e
t
a
b
[
i
℄
.
p
l
e
=
m
e
z
z
y
z
n
a
;
p
r
i
n
t
f
(
"
p
o
d
a
j
i
m
i
e
"
)
;
s
a
n
f
(
"
%
s
"
,
t
a
b
[
i
℄
.
i
m
i
e
)
;
p
r
i
n
t
f
(
"
p
o
d
a
j
n
a
z
w
i
s
k
o
"
)
;
s
a
n
f
(
"
%
s
"
,
t
a
b
[
i
℄
.
n
a
z
w
i
s
k
o
)
;
p
r
i
n
t
f
(
"
p
o
d
a
j
s
t
a
n
y
w
i
l
n
y
"
)
;
i
f
(
t
a
b
[
i
℄
.
p
l
e
=
=k
o
b
i
e
t
a
)
−
−
p
r
i
n
t
f
(
"
(
w
o
l
n
a
0
,
m
e
z
a
t
k
a
1
)
"
)
;
10.9. Rozwiązania do zadań z rozdziału 7.2
111
e
l
s
e
−
−
p
r
i
n
t
f
(
"
(
w
o
l
n
y
0
,
z
o
n
a
t
y
1
)
"
)
;
s
a
n
f
(
"
%
d
"
,
&
t
a
b
[
i
℄
.
s
t
a
n
_
y
w
i
l
n
y
.
k
)
;
}
}
Jak widać w powyższym rozwiązaniu, typ wyliczeniowy można wczytywać
jak zmienne typu int. Ponadto niezależnie, czy wczytywane są dane kobie-ty czy mężczyzny, wczytywane są dane do pola k w unii stan_cywilny
typu union człowiek. Można tak zrobić, gdyż pola k i m znajdują się
w tym samym miejscu w pamięci, a więc wczytując dane do jednego pola,
zmienia się jednocześnie wartość drugiego. Ponadto oba wspomniane pola
są typów wyliczeniowych o tej samej liczbie zdefiniowanych wartości.
Funkcja wczytaj w języku C++ może wyglądać następująco:
Listing 10.149. Rozwiązanie zadania 7.2.17 w języku C++
v
o
i
d
w
z
y
t
a
j
(
s
t
r
u
t
d
a
n
e
_
o
s
o
b
o
w
e
t
a
b
[
℄
,
i
n
t
n
)
{
i
n
t
i
,
d
;
f
o
r
(
i
=
0
;
i
<
n
;
i
+
+
) {
o
u
t
<
<
"
C
z
y
t
e
r
a
z
w
z
y
t
u
j
e
m
y
d
a
n
e
k
o
b
i
e
t
y
(
1
)
"
;
o
u
t
<
<
"
z
y
m
e
z
z
y
z
n
y
(
2
)
?
"
<
<
e
n
d
l
;
i
n
>
>
d
;
i
f
(
d =
=
1
)
t
a
b
[
i
℄
.
p
l
e
=
k
o
b
i
e
t
a
;
e
l
s
e
t
a
b
[
i
℄
.
p
l
e
=
m
e
z
z
y
z
n
a
;
o
u
t
<
<
"
P
o
d
a
j
i
m
i
e
"
<
<
e
n
d
l
;
i
n
>
>t
a
b
[
i
℄
.
i
m
i
e
;
o
u
t
<
<
"
P
o
d
a
j
n
a
z
w
i
s
k
o
"
<
<
e
n
d
l
;
i
n
>
>t
a
b
[
i
℄
.
n
a
z
w
i
s
k
o
;
o
u
t
<
<
"
P
o
d
a
j
s
t
a
n
y
w
i
l
n
y
"
<
<
e
n
d
l
;
;
i
f
(
t
a
b
[
i
℄
.
p
l
e
=
=k
o
b
i
e
t
a
)
{
−
−
o
u
t
<
<
"
w
o
l
n
a
0
,
m
e
z
a
t
k
a
1
"
<
<
e
n
d
l
;
i
n
>
>
d
;
i
f
(
d =
=
0
)
t
a
b
[
i
℄
.
s
t
a
n
_
y
w
i
l
n
y
.
k
=
w
o
l
n
a
;
e
l
s
e
t
a
b
[
i
℄
.
s
t
a
n
_
y
w
i
l
n
y
.
k
=
m
e
z
a
t
k
a
;
}
e
l
s
e
{
−
−
o
u
t
<
<
"
w
o
l
n
y
0
,
z
o
n
a
t
y
1
"
<
<
e
n
d
l
;
i
n
>
>
d
;
i
f
(
d =
=
0
)
t
a
b
[
i
℄
.
s
t
a
n
_
y
w
i
l
n
y
.
m
=
w
o
l
n
y
;
112
10. Rozwiązania i wskazówki
e
l
s
e
t
a
b
[
i
℄
.
s
t
a
n
_
y
w
i
l
n
y
.
m
=z
o
n
a
t
y
;
}
}
}
Podstawową różnicą w stosunku do rozwiązania w języku C jest niemożność wczytania wprost wartości do zmiennej typu wyliczeniowego. Aby to zrobić, trzeba by przeciążyć operator „>>”, ale to nie mieści się w zakresie materiału niniejszego zbioru zadań. Innym rozwiązaniem mogłoby być wczytanie wartości typu int i zrzutowanie jej do typu wyliczeniowego.
Podobnie jak w C, w języku C++ typy wyliczeniowe są domyślnie wy-
świetlane jako wartości typu int.
Zadanie 7.2.18
Listing 10.150. Rozwiązanie zadania 7.2.18 w języku C/C++
u
n
i
o
n
s
u
p
_
i
n
t
{
u
n
s
i
g
n
e
d
i
n
t
l
;
u
n
s
i
g
n
e
d
h
a
r
t
[
4
℄
;
}
;
Poprawność powyższego rozwiązania jest zależna od używanego kompilato-
ra, gdyż standard języka C nie określa, z ilu bajtów ma się składać zmienna typu int. Typowy rozmiar typu int w systemach 32-bitowych to 4 bajty,
stąd taki rozmiar tablicy t.
Zadanie 7.2.19
Listing 10.151. Rozwiązanie zadania 7.2.19 w języku C/C++
u
n
s
i
g
n
e
d
i
n
t
f
u
n
k
j
a
(
u
n
s
i
g
n
e
d
i
n
t
a
,
u
n
s
i
g
n
e
d
i
n
t
b
)
{
u
n
i
o
n
s
u
p
_
i
n
t
poma
,
p
o
m
b
,
p
o
m
w
y
n
;
poma
.
l
=
a
;
p
o
m
b
.
l
=
b
;
∗
p
o
m
w
y
n
.
t
[
0
℄
=
poma
.
t
[
0
℄
p
o
m
b
.
t
[
0
℄
;
∗
p
o
m
w
y
n
.
t
[
1
℄
=
poma
.
t
[
1
℄
p
o
m
b
.
t
[
1
℄
;
∗
p
o
m
w
y
n
.
t
[
2
℄
=
poma
.
t
[
2
℄
p
o
m
b
.
t
[
2
℄
;
∗
p
o
m
w
y
n
.
t
[
3
℄
=
poma
.
t
[
3
℄
p
o
m
b
.
t
[
3
℄
;
r
e
t
u
r
n
p
o
m
w
y
n
.
l
;
}
10.10. Rozwiązania do zadań z rozdziału 7.3
113
10.10. Rozwiązania do zadań z rozdziału 7.3
Zadanie 7.3.1
Listing 10.152. Rozwiązanie zadania 7.3.1 w języku C/C++
∗
s
t
r
u
t
e
l
e
m
e
n
t
u
t
w
o
r
z
(
)
{
r
e
t
u
r
n
N
U
L
L
;
}
Zadanie 7.3.2
Listing 10.153. Rozwiązanie zadania 7.3.2 w języku C
∗
v
o
i
d
w
y
z
y
s
(
s
t
r
u
t
e
l
e
m
e
n
t
L
i
s
t
a
)
{
∗
s
t
r
u
t
e
l
e
m
e
n
t
w
s
k
=
L
i
s
t
a
;
w
h
i
l
e
(
L
i
s
t
a
!
=
N
U
L
L )
{
−
L
i
s
t
a
= L
i
s
t
a
>n
e
x
t
;
f
r
e
e
(
w
s
k
)
;
w
s
k
=
L
i
s
t
a
;
}
}
Rozwiązanie w języku C++:
Listing 10.154. Rozwiązanie zadania 7.3.2 w języku C++
∗
v
o
i
d
w
y
z
y
s
(
e
l
e
m
e
n
t
L
i
s
t
a
)
{
∗
e
l
e
m
e
n
t
w
s
k
=
L
i
s
t
a
;
w
h
i
l
e
(
L
i
s
t
a
!
=
N
U
L
L )
{
−
L
i
s
t
a
= L
i
s
t
a
>n
e
x
t
;
d
e
l
e
t
e
w
s
k
)
;
w
s
k
=
L
i
s
t
a
;
}
}
Zadanie 7.3.3
Listing 10.155. Rozwiązanie zadania 7.3.3 w języku C
∗
∗
s
t
r
u
t
e
l
e
m
e
n
t
d
o
d
a
j
(
s
t
r
u
t
e
l
e
m
e
n
t
L
i
s
t
a
,
i
n
t
a
)
{
∗
s
t
r
u
t
e
l
e
m
e
n
t
w
s
k
=
m
a
l
l
o
(
s
i
z
e
o
f
(
s
t
r
u
t
e
l
e
m
e
n
t
)
)
;
−
w
s
k
>
i
=
a
;
−
w
s
k
> n
e
x
t =
L
i
s
t
a
;
r
e
t
u
r
n
w
s
k
;
}
Rozwiązanie w języku C++:
114
10. Rozwiązania i wskazówki
Listing 10.156. Rozwiązanie zadania 7.3.3 w języku C++
∗
∗
e
l
e
m
e
n
t
d
o
d
a
j
(
e
l
e
m
e
n
t
L
i
s
t
a
,
i
n
t
a
)
{
∗
e
l
e
m
e
n
t
w
s
k
=
n
e
w
e
l
e
m
e
n
t
;
−
w
s
k
>
i
=
a
;
−
w
s
k
> n
e
x
t =
L
i
s
t
a
;
r
e
t
u
r
n
w
s
k
;
}
Zadanie 7.3.4
Listing 10.157. Rozwiązanie zadania 7.3.4 w języku C
∗
∗
s
t
r
u
t
e
l
e
m
e
n
t
d
o
d
a
j
k
(
s
t
r
u
t
e
l
e
m
e
n
t
L
i
s
t
a
,
i
n
t
a
)
{
∗
s
t
r
u
t
e
l
e
m
e
n
t
w
s
k
;
i
f
(
L
i
s
t
a
=
=
N
U
L
L )
{
L
i
s
t
a
=
w
s
k
= m
a
l
l
o
(
s
i
z
e
o
f
(
s
t
r
u
t
e
l
e
m
e
n
t
)
)
;
}
e
l
s
e
{
w
s
k
=
L
i
s
t
a
;
−
w
h
i
l
e
(
w
s
k
>n
e
x
t
!
=
N
U
L
L )
−
w
s
k
=
w
s
k
>n
e
x
t
;
−
w
s
k
> n
e
x
t = m
a
l
l
o
(
s
i
z
e
o
f
(
s
t
r
u
t
e
l
e
m
e
n
t
)
)
;
−
w
s
k
=
w
s
k
>n
e
x
t
;
}
−
w
s