Historia wymaga pasterzy, nie rzeźników.


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

Podstrony