Programação Avançada em C Usando Algoritmos e Estruturas de Dados Fundamentais
The Ualg Informatics Lab Universidade do Algarve http://w3.ualg.pt/~jvo jvo@ualg.pt
! " # $ % & ' *
0 $1 "
1# , 2 , 34 &
" $1 5
367 " - 7 6, 8 &
= & :
" # 7 6, 3@! " 8 , 8 ,
8 " $1 ,
3 6 7 " - < , K > 6 $ 61 "
7 , #1 ,
J , # ,
T U ' . F K A
= # " , 1 6> " P ?
,
= # 6, < % &
$ & 2 8 "
9 :
,
& - $ K
+ , - ( . /
; 67 " - < ,
= # " , 1 6> "
C 2 # , $ D " # 6> , 8 , $
4 1 1 J LM M 7 # " , 1 6 > " 7 & : : = & : :
' ( ' )
' O '
E (F
= & : :
& - $ ? 1 # 62 9 6 < % & @A
G & #19 H , 3 ( G , # ,
> " #
9 :
& - $ (& # H M 3 6 7 " - $ " $ M 2 N @ - 7 @ - 8 M E (F M J 1 M
P " 7 & - 8
P 1 # " " 1 K P 9 61 "
Q . . K P , -
& 9
,
$ &
B
7 I J 6, " - > 6"
9 :
,
R # , - 7 6$ 7 & K = , 36S & # - 6,
(
% & @
Ă?ndice
0. Preâmbulo
1. Introdução
!
"
# $ %
& # ' (
2. Arrays e Ponteiros ) %
*
! %
&
+
,
-
!
# ' (
3. Reserva dinâmica de memória
"
# ' (
4. Primeiras noçþes de complexidade
' # ' (
'
)
' *
*
)
& # ' (
5. Algoritmos elementares de ordenação &
!
& )
)
)
&
*
&
& & # ' (
6. Mergesort +
+
+
+ # ' (
7. Quicksort ,
,
,
,
,
%
,
, &
!
*
, +
! , , # ' (
8. Introdução às listas ligadas -
- -
%
- # ' (
9. Primeiras noçþes de Projecto e de Projecto por Contrato
# '
IR
!
(
&
+ # ' (
10. As listas ligadas revisitadas !
! %
)
&
+
, # ' (
11. Tipos de dados abstractos 12. O tipo de dados abstracto pilha $
!
$
!
!
' %
%
$
$
&
' %
! '
! '
+ # ' (
13. O tipo de dados abstracto fila de espera $
!
!
!
$
$
# ' (
14. As filas revisitadas
!
!
%
# ' (
15. Implementação em C de ADTs com múltiplas instâncias & $
$
!
&
&
!
! %
& # ' (
16. O tipo de dados abstracto polinĂłmio + ! +
+
+ # ' (
17. O ADT matriz esparsa ,
,
! %
!
,
,
,
, *
, & # ' (
18. Primeiras noçþes sobre årvores -
-
-
- # ' (
19. Ă rvores binĂĄrias
%
! %
# ' (
20. Acervos e filas com prioridades
!
!
& # ' (
ReferĂŞncias bibliogrĂĄficas
ReferĂŞncia rĂĄpida sobre C R1. Preliminares R2. Algumas caracterĂsticas do C R3. Exemplo de programa
R4. Elementos de sintaxe
!
%
!
&
! +
! ,
,
,
,
-
) -
)
-
)
-
)
)
)
-
- &
- +
- ,
)
(
- -
R5. Controlo de fluxo do programa &
%
!
%
%
%
%
!
%
&
&
&
& &
& +
'
R6. Funçþes +
+
! %
+
*
R7. Arrays e Matrizes ,
* ,
"
R8. Ponteiros -
-
-
-
- &
! %
R9. SinĂłnimos de tipo R10.
Estruturas
R11.
UniĂľes
R12.
Campos de bits
R13.
Enumeraçþes
R14.
Directivas de PrĂŠ-processador
R15.
Biblioteca de funçþes
&
&
&
! %
(
!
! %
&
!
Ă?ndice Remissivo
0. Preâmbulo ?
$
" $1# 9 19 # , $
" $19 8 6& $ &
B
,
8 , $
$ " H 9 # , :
8 , 8 , $ ( ?
:
" - 1 "
9 "
9 - 1 , #
8 "
, $
"
7 , $ , # :
:
& $
,
9 :
,
" $:
&
- S& #: 5 1 67 ,
6$1 & K
$ 6$1 " :
,
9 "
7 " - 1# , 6$
9 :
9 $ , 8 , $
, 7 19 , 3:
, 7 19 , 3
$ "
9 "
6- 1 6:
J " # :
$
# " S " # "
36- H 9 , H " :
=
:
, 8 " 9 , 8 ,
" - 1 , < % &
:
:
&
39 H , #
, 6$
8 " $1 , 9 " (
8 "
1 " : J &
8 "
7 & : J 9 1 , 8 & # ( B
- > " 3
J # & 6:
8 "
7 , J , 7 68 , 8 " $
" 7 , - 6$:
8 "
9 :
7 & - 8 " - $ , 8 , K " 1# " :
7 & :
, 6& #
$9 , $
1 " :
7 & :
" $ 7 # 61 ,
68 , 8 "
61 ,
& 7 9 J ,
" - 1 "
J " 9 " - , K 8 "
8 "
=
& $
8 "
8 "
8 "
, :
8 , 8 & $ K
7 & :
1 67 ,
, # 61 :
" - 1 "
" 6$1 "
% &
68 , 8 "
, 2 $1# , 7 < % &
" $1# 9 19 # , $
J # & > , $
,
7 & :
$9 S 67 6" - 1 " $
, 3 H & # 61 :
& $ K
, $ (
8 "
8 , 8 & $
8 6$ 7 6J 36- , $
" $1 "
36- H 9 , H " :
- > " 3
9 "
- &
7 & : J " 1 - 7 6, $
8 "
, < % & K ,
36- H 9 , H " :
" 3" > , 8 &
6: J 3" :
- , $
J & #
,
7 & - 9 - 1 &
8 &
, 8 9 6# 6# (
J # & H # , :
- > " 3
" $1# 9 19 # , $
$ " H 9 68 ,
J , #1 "
36- H 9 , H " - $
9 :
" - 1 "
61 6#
61 "
" $J " 7 6, 3:
J " # :
8 "
9 :
, 31 &
J , # ,
" $ 7 & 34 ,
=
" :
8 " > " # 5
8 , $
8 "
?
J # & H # , :
,
J " # :
J & - 1 " 6# & $ (
? &
9 :
36- H 9 , H " :
5 9 6- , K
S ,
36- H 9 , H " - $
36- H 9 , H " :
" S 67 6" - 1 " K
& 9 1# ,
8 , 8 & $
- S& #: 5 1 67 ,
8 "
H , 3" # 6,
8 "
7 & :
8 "
: 9 - 8 &
=
- % &
? 3 H & # 61 :
S & # , K
" $1 , # " :
& $
"
6- 7 39 6- 8 &
& $
,
0 $1# 9 19 # , $
, 3H 9 - $
8 & $
$ " #
8 "
: 9 61 &
D , 8 & $
- & $ $ & $
& # 6H 6- , 6$ (
" :
: 9 61 &
J # I J # 6& $
0 $1 ,
7 9 # $ & $
7 9 # $ & $
8 "
0 - H " - 4 , # 6, (
0 $ $ " - 7 6, 3:
" - 1 "
$ " H 9 68 ,
, J # " $ " - 1 , < % &
9 "
? &
&
- ,
& # 6H 6- , 368 , 8 "
, $ $9 - 1 & K - % &
3& - H &
8 &
$ "
8 " $ 6H - , 8 , :
, J # " $ " - 1 , :
" - 1 "
& $
8 " $ " - > & 3> 6:
9 1 636
J # " $ 7 6- 8 "
8 &
- &
:
8 &
3 6> # &
8 6S 7 63K
, :
& $
# 6H & #
9 "
$ 6$1 " :
$ "
8 "
9 :
9 "
J # & " 7 1 &
8 & $
" $
36- H 9 , H " :
3" > ,
# " 3, 7 6& - , 8 ,
- & $ $ ,
: 9 61 , $ > "
,
# " S " # "
5 1 67 &
" $1 5
, 1 # 6, $ ( ?
1 7 - 67 & @7 6" - 1 S 67 &
- & < " $
" - 1 &
8 , $
$ " - 8 &
3 6> # &
8 " $- " 7 " $ $ 5 # 6&
- % &
,
&
$9 ,
"
" J " # 6 - 7 6,
6- 1 6:
7 3, # , K
, $ $ & 7 6, 8 &
,
8 " $ " - > & 3> 6:
8 "
J # & H # , :
J # & " 7 1 &
:
" - 1 &
8 "
, $
, 2 & # 8 , H " :
$ , 3,
J , # ,
3 " 61 9 # ,
" $1 , $
J & #
,
" :
6 8 , 1 6> &
7 & # # " 7 < % & ( G , # ,
8 "
7 & :
&
8 "
, 1 # 6, $ (
7 & - 1# , 1 &
&
? J " $ , #
, $
" $1 "
9 "
5 1 67 ,
& $1# , @- & $
@7 4 " H , 8 & (
$ " :
J # & H # , :
J # & $ $ " H 9 6#
, 9 3, K :
# " 7 :
S 5 7 63K
J # , H :
8 "
S# " 9 " - 1 "
8 " $1 "
" $1 63&
K
& 2 " 7 1 6> & K
- & $
"
7 " 8 &
, 9 8 , :
$9 2 $ " 9 " - 1 " $ (
- &
B
% &
J # " 1 " - 8 " :
- & $
- , $
6- 7 39 $ 6> , :
- > " 3
8 ,
8 "
S ,
8 & $
" - 8 &
?
,
$9 ,
8 " - 1 6S67 , #
&
"
8 , $
J # & H # , :
5 9 6- , K
:
:
68 " - 1 6S 67 , #
, $ $ 6:
? &
1 % &
2 & , $
J # & 7 " $ $ &
" - 1 "
6#
S9 - 8 , :
9 :
J # 5 1 67 , $
8 "
,
8 "
= (
, 1
R ,
2 & , $
:
= (
" - 1 , 3:
7 & :
&
" - 1 "
$ , 2 " #
, 2 & # 8 , H " :
J # & H # , :
" - $ 6- & M , J # " - 8 6
, #
8 ,
9 "
" :
" :
, $
:
A 1 636
8 "
, 6$
- &
8 ,
, :
9 :
8 "
9 :
, < % & K
,
&
, < % &
" - 1# "
6- ,
8 "
$ 6$1 " :
7 & :
, 8 &
&
7 & :
6- 1 " - $ 6> ,
8 "
8 " $ 8 "
1 6J & $
8 , $
&
8 "
, 1# 6
" $
J & $ $ ,
7 & - 9 - 1 &
9 :
,
& 9
:
3 " 61 & #
"
8 " J & 6$
5 1 67 ,
&
9 "
> 6- 8 &
,
$ " #
6#
8 "
# " 7 & - 4 " 7 68 &
" - $ 6- & M , J # " - 8 6
7 & : 9 - 67 , # (
# " @9 1 636
6- 7 39 6- 8 &
8 6S 67 9 38 , 8 " (
1 " :
J # & H # , :
> 5 # 6, $
1 , : 2 :
, $
- & < % &
G , # ,
8 "
8 "
:
,
,
, $
& @
= (
" " : J 3& $
& $
7 & :
1 " # :
& $
, 9 1 & @7 & - 1 68 & K
S & # :
J # 5 1 67 , (
J # & 7 " $ $ &
$ " #
639 $1# , # :
7 & - 7 " 61 &
7 # " $ 7 " - 1 "
& # 8 " :
J & $ $ ,
8 , 8 & $ ( = & - 7 " - 1# , :
"
, > , - < , 8 & $ K
J # & H # , :
" $
8 "
" - 1 "
& # 8 " :
"
8 "
7 & : J 3" 1 , K $ & 2 # "
7 , J 1 9 3 &
7 , 8 ,
J & #
= & : 9 - 67 , #
, 8 & # " $ (
9 , - 8 &
, H " :
P , 2 " #
3" #
8 ,
7 & :
7 I 8 6H &
,
"
- " 7 " $ $ 5 # 6& K 1 & # - , @ $ "
7 I 8 6H & (
5 1 67 ,
=
> & 39 :
, 6- 8 ,
6- " - 1 " :
" $ 7 # " > " #
, < % &
& $
J # & H # , :
7 & : 9 - 67 , #
J # , H :
, H " :
& @3&
1 I J 67 & $
" S 67 ,
J # & H # , :
C
" $1# 9 19 # , $
8 6$ 7 9 1 6# :
6- 1# & 8 9 < % &
" :
J # 5 1 67 , $
, 6$
J , # ,
639 $1# , 8 & $ (
" - 1 , 6$
, & $
8 , $
# 5 J 68 , K :
8 ,
& # 8 " - , 8 & $
8 "
6: J & #1 , - 1 "
& $
" :
J & #1 , - 1 & K
S , 7 1 & K
7 I 8 6H &
$ " H 9 6# :
8 "
, $
" :
, 9 1 & @, > , 36, < % & K
, 7 1 6> 6 8 , 8 " $
D "
" - 1 , 6$ K
" - 1 "
- > " 3
S9 - 8 , :
K
J # I J # 6,
# " J # & 8 9
, < % & (
, &
, 2 $1# , 7 1 & $ K
" " # 7 7 6 & $ K 1 " - 1 , 1 6> , :
7 & :
& @3&
, 2 & # 8 , H " :
S9 - 8 , :
8 " > 68 , :
" - 1 & $
, J # " $ " - 1 , < % &
# " S " # - 7 6,
" - 1 , < % &
" 3" :
- ,
" - 1 , < % &
,
$ % &
" :
6: J 3" :
8 , 8 & $
" $J , # $ , $ (
S 6- , 3 9 :
" - 1 " ( R ,
6- 1# & 8 9 < % &
1 6J & $
- &
8 , 8 & $
6: J 3" :
7 & - 7 " 61 & $
" 1 " - $ 6> , :
, &
8 "
$9 ,
" - 1 "
& $
" , 9 $ 1 6> & $
$ " #
" $1# 9 19 # , $
, 31 " # - , 1 6> , $
& 8 & $
& $
9 $ , - 8 &
" $J " # , :
6- 1 " - $ 6> ,
& $
" $1 , #
"
" 1 " - $ 6> , :
7 & - 1 # 62 9 6#
J , # ,
" - 1 "
&
" " : J 3& $
$9 7 " $ $ &
8 " $1 "
(
?
J # & H # , :
, J 367 , < " $
"
8 & $
9 "
, < % &
" :
"
> , # 6, 8 $ $ 6:
7 & : J 9 1 , 8 & # " $
> % &
8 " $ 8 "
" $1# 9 19 # ,
& $
" :
$ 6$1 " :
, $
8 "
8 , 8 & $
5 # " , $
8 ,
" :
" - H " - 4 , # 6,
H " # , 3 ( 0 - 7 & - 1# , :
, $
=
& J " # , 1 6> & $ K , & $
& $
9 :
1 " :
6- S & # :
, J 367 , < " $
,
# " 3 , 1 6> , :
5 1 67 , K
8 , $
7 & : J 63, 8 & # " $ K "
8 ,
6- S & # :
" $1# 9 19 # , $
" - 1 "
8 "
6- 1 " 36H - 7 6,
:
, 8 9 # &
5 1 67 ,
8 , 8 & $
8 "
" :
7 & :
H " $1 % &
5 # " , $
, #1 6S 67 6, 3 ( D " $1 "
J & - 1 &
8 "
> 6$1 , K
6- 1 " # " $ $ , - 1 "
8 & 7 " - 1 " $
$ " 9 $
9 :
&
,
$ 6$1 " :
" - 1 & $
9 "
5 1 67 , (
J # & H # , :
, < % &
J # & H # , :
, $ (
:
?
:
8 "
, J # " - 8 " #
,
9 :
,
, 2 & # 8 , H " :
, &
,
& 9 1# & $
J # & H # , :
8 &
7 & - 1 "
3 " 61 & #
J # , H :
" - H " - 4 " 6# & $ K
8 " $ " - > & 3> " #
, < % &
1 , : 2 :
, $
"
1 , : 2 :
, $
& # H , - 6
8 &
, 9 8 6 - 7 6, L
: 2 61 &
- &
9 " #
7 & - 1 "
, : J 3,
9 - 6> " # $ 61 5 # 6 & $ K
7 & - 4 " 7 6:
, $
8 , 8 &
J , # ,
, 9 1 & @8 68 , 7 1 ,
:
"
,
& $
8 &
6- S & # :
, J # " - 8 6
$ " 9 $
J # & H # , :
1 & # - ,
" - > & 3> 6 8 &
, H " :
&
4 5
9 " # " :
, &
, $
: 9 61 &
8 "
- &
" $19 8 , - 1 " $
"
9 :
&
, 7 19 , 36
3& - H &
,
, 7 " $ $ > " 3
3 6> # &
3 6> # &
$ " H 9 68 , K
5 1 67 & $ K
9 "
J # & S 6$ $ 6& - , 6$
8 "
5 1 67 ,
8 ,
S & # :
, &
, #
& $
> 68 , K "
, &
,
$ 6: J 3" $
- & > 6< &
8 " $ " - > & 3> 6:
" :
" - 1 &
8 "
1 " 1 &
C
7 & :
&
8 &
3 6> # &
" $ 7 # 61 &
" :
6:
" $
B
"
& : , - ( C
7 I 8 6H &
=
" $ 7 # 61 &
" :
Arial Narrow
K
" :
#include <stdio.h> /* Primeiro programa. */ int main() { printf(â&#x20AC;&#x153;OlĂĄ mundo!â&#x20AC;?); return 0; } C $
7 & :
1 & 8 & $
G , # ,
& $
" - 1 5 # 6& $
7 I 8 6H &
68 " - 1 6S 67 , 8 & # " $
, 3 :
S 39 & H # , :
" 3" :
, &
" - 1 & $
8 & $
, $ K
8 "
" 3" :
9 1 636
$ 6- 1 , "
8 ,
" $ 7 # 61 &
" :
G & #19 H 9 $ ( G & #
9 :
9 " $1 % &
,
- & : " $ 8 " > , # 6 5 > " 6 $ K S 9 - < " $ K " 1 7 ( $ % &
" - 1 & $
, @ $ "
$ % &
,
H # 5 S 67 & $
7 , 6 ,
36- H 9 , H " :
8 "
8 "
:
& 8 " 3, < % &
1 " 1 &
7 & :
7 & :
36:
&
61 " $
& $
,
8 "
" $ 7 # 61 & $
8 6, H # , :
J # " 1 &
9 - 6S & # :
- H 3 $ (
" :
, $
J , # ,
68 , 8 " K
8 "
" $1# 9 19 # ,
& 9
68 " - 1 6S 67 , #
& $
(
? & $
:
" 9 $
? & $
7 & 3" H , $
= 6 - 7 6, $
, 39 - & $
"
J # 6:
" 6# ,
J " 3,
H & $1 , # 6,
> " # $ % &
" 7 & - 4 " < &
D " J , #1 , :
& - 8 "
" $1 : 9 3&
$ " 9
" 7 - & 3& H 6,
8 6$ 7 6J 36- , $ K
J , #1 67 9 3, #
8 &
J " 3&
, $
:
8 "
" - 1 &
8 ,
A - 6> " # $ 6 8 , 8 "
" - 1 "
8 &
0 - H " - 4 , # 6,
, H & # ,
, H # , 8 " 7 " #
& $
, - " - 1 " (
A - 6> " # $ 6 8 , 8 "
, 1 # 6, $
" 3" 7 1# I - 67 ,
6H 9 , 3:
8 "
J " # :
8 & $
:
? 3H , #> "
"
J " 3&
8 &
G , 9 3,
&
! " - 19 # ,
" - 1 & $
8 ,
, : 2 6" - 1 "
9 , 3H @63, 2 L
- S& #: 5 1 67 ,
"
9 "
? 3H , #> "
, J # " $ " - 1 , 8 , $
, J & - 1 , :
" 6& $
"
0 3" 7 1# I - 67 ,
1 :
> 6- 8 &
J " 3&
$ " 9
8 6$ 7 6J 36- ,
J # & J 7 6&
4 "
A , 3H
7 & :
,
$ " #
, J & 6&
R , 7 9 38 , 8 "
1 :
6H &
G # & H # , :
8 ,
3" 7 7 6& - , 8 &
3" 7 7 6& - , 8 , $ (
- ,
0 :
" 3, 2 & # , < % &
8 ,
(
, < % &
# " S 3" , < % &
8 "
J # & J & # 7 6& - , 8 & $
- S& #: , 1 67 $ ; , 2 (
1. Introdução A :
, 3 H & # 61 :
9 :
, 3 H & # 61 :
8 " 1 " # :
7 & :
&
7 & # # " $J & - 8 "
&
6- , 8 &
9 :
J # & 2 3" :
, (
,
S & # :
S 6- 61 & $
A :
,
# " $ & 3> " #
6- $1# 9 < " $
8 "
, 3 H & # 61 :
8 "
&
9 :
J # & 2 3" :
J # " 7 6$ , $
8 " > "
$ , 1 6$ S ,
S 6- 61 &
8 "
" #
"
, (
, 6$
7 & - 7 # " 1 , :
9 "
& # 8 " - , 8 , $
7 & - 9 - 1 &
9 :
8 "
" - 1 " K
# " $ & 3> "
9 :
J # & J # 6" 8 , 8 " $
& L
,
' (
D " > "
1 " # :
E (
= , 8 ,
J , $ $ &
1 " :
Q (
= , 8 ,
J , $ $ &
8 " > "
U (
D " > "
# " $ & 3> " #
&
$ " #
J # " 7 6$ , :
$9 S 67 6" - 1 " :
J # & 2 3" :
" S67 6 - 7 6, , 6$
" - 1# , 8 , $
/ (
" :
'
& 9
:
, 6$
$ , 8 , $ (
8 , $
8 "
" $1# 9 19 # , $
9 :
" $19 8 &
7 " #1 &
8 "
8 , $
9 $ , :
J # & 2 3" :
$ "
- % &
> "
,
" - 1 "
J , # ,
9 "
,
" S67 5 7 6,
$ 6: J 3" $
1 63
8 " S 6- 61 9 8 "
$ & 39 < % &
J # & 8 9
68 ,
1 " - 4 ,
"
, 3 H & # 61 :
" $ K
" $1 5
, 6$
6- 7 39 " :
, $
8 "
8 " S 6- 68 &
1 " : J &
9 "
:
" $1# 9 19 # , $
" :
& $
8 , 8 & $
9 61 , $
8 , 8 & $
" " : J 3& $
, $
8 "
" S 67 6" - 1 " $ (
" $1# 9 19 # ,
7 9 & $
J # & 2 3" :
,
" - 1 "
S 6- 61 9 8 "
J , $ $ & $
:
J , # ,
B
&
$ " #
& 9
$ & 39 < % &
" :
9 "
.
& $
"
7 & - 9 - 1 &
- 9 :
" :
, 3 H & # 61 :
,
6- , #
F (
# " $ & 39 < % &
: 9 61 &
A :
9 :
7 & - 9 - 1 &
6- 1 " # " $ $ "
B
,
8 , 8 & $
,
9 1 636
,
- ,
8 &
:
, :
- 67 ,
9 1 636
9 "
, 1# 6
- & < % &
(
8 " $ " : J " - 4 &
8 &
, < % &
,
" $ K , $
8 "
S & # :
,
8 "
8 "
& $
& # H , - 6
5 #> & # " $
8 , 8 & $
9 :
J & 8 "
8 " J " - 8 " #
6- 1 " # " $ $ "
1 " # " :
, 3 H & # 61 :
36$1 , $ K , $
1 6J & $
- & $ $ &
9 "
4 6J I 1 " $ "
9 :
8 "
7 9 &
& $
& $
8 "
8 " $ " - > & 3> " #
" - 7 & - 1# , #
9 :
,
" S 67 6" - 1 " $ (
, #
"
> , 3& # " $
& $
,
# " 3, 7 6& - , 8 & $
H # , S & $ (
- & < % &
7 " - 1# , 3 (
"
?
:
:
, 6& #
J , #1 "
- 6: &
8 "
7 & - $1# 9 6#
8 , 8 & $
A :
8 , $
1 6J & $
- & > & $
36- H 9 , H " - $
8 "
8 , 8 & $
1 6J & $ K & 9
8 "
J # 6:
1 6J & $
J # & H # , :
61 6> & $
, < % &
J # @8 " S 6- 68 & $ K
& 9
8 " S 6- 68 & $
J # & J & # 7 6& - , :
J " 3&
9 1 636
, 8 & # (
"
,
J " 3&
, $ $ 6:
, $
:
" - & $
7 & - 9 - 1 &
9 :
7 & :
&
,
7 , J , 7 68 , 8 "
, S 6- , 3
&
9 "
9 :
8 "
1 6J &
8 "
1 6J &
8 "
8 , 8 & $
> , 3& # " $ ( 0 " : J 3& L C
9 :
7 & - 9 - 1 &
8 "
> , 3& # " $
1 6J &
8 "
int
7 & - $ 6$1 "
8 , 8 & $
. K
' K @ ' K E K @ E K (((K
9 :
8 &
7 & 3" 7 < % &
8 "
& J " # , < " $
7 & - 9 - 1 &
$ " H 9 6- 1 "
B
K
INT_MAX INT
8 "
$ & 2 # "
" $ $ " $
> , 3& # " $
& - 8 "
"
INT MAX
& J " # , < " $
8 "
9 "
G & #
& # 8 " - $
# ,
8 "
' (
& $
,
- & < % &
1 6J &
" :
8 "
I # 6,
5 6:
:
& $
"
- 6: & $
:
8 & $
6- 1 " 6# & $ ( ?
$
: 9 61 , $
"
6- 7 39 " :
8 "
1 6J &
8 "
8 "
& $
& J " # , 8 & # " $
, # 61 :
1 67 & $
"
+, -, *, / %
K 1 " $1 "
, 1 # 62 9 6 < % & K " 1 7 (
8 , 8 & $
1 % &
6: J & #1 , - 1 "
0 $ $ " - 7 6, 3:
" - 1 "
1# $
J & #
? 9 8 , :
Q (
G & $ $ 62 6 3 61 , :
$ " 9
8 , 8 & $
J # & J & # 7 6& - ,
9 :
,
6- 1 " # J # " 1 , < % &
J , # ,
& $
> , 3& # " $
H 9 , # 8 , 8 & $
" :
E (
0 $1 " $
> , 3& # " $
" $ (
# ,
8 &
$ % &
int
8 " $ 6H 9 , 38 , 8 " K & J " # , < " $
% &
A :
:
"
& $
$ & 2 # "
6H 9 , 38 , 8 "
# " J # " $ " - 1 , :
INT MIN
,
& # H , - 6
, #
9 "
&
"
,
8 & 7 9 :
" - 1 , #
7 & - 7 " 61 & $
, 9 8 "
7 & : J 63, 8 & #
&
J # & H # , :
, 8 & #
- ,
> " # 6S 67 , < % &
8 ,
7 & # # " 7 < % &
7 I 8 6H & (
, $J " 7 1 & $
$ " # % &
639 $1# , 8 & $
8 "
$ " H 9 68 , (
! , :
& $
J , # ,
,
0 :
= K
J # 6:
0 :
7 & :
61 6> & $
= K
2 61 $
> " #
$ 6: J 3" $:
8 "
9 $ , :
9 "
J & #
, 2 $1# , 7 < " $
- " 7 " $ $ 68 , 8 "
8 "
" < , #
S# " - 1 "
, $
8 , 8 & $ L
& $
9 :
-
6- 1 " 6# & $
9 $ , :
& $
&
" - 1 "
8 &
9 "
,
36- H 9 , H " :
J & #
=
@
: 9 - 8 &
- & $
# " , 3
& S " # " 7 "
$ % & K
K
char int, float, double :
" # &
9 "
J , # ,
S 6 &
> 6> " :
& $
8 "
2 61 $
8 " - 1# &
" :
P
? B
=
J , # ,
31 6:
,
S# " 9 " - 1 " :
& # H , - 6
, #
, - 5 36$ " K
"
" - 1 "
8 , 9 6
# " S " # 68 ,
J # & 7 " $ $ , #
6- S & # :
, < % & (
J " 3& $
1 6J & $
# " J # " $ " - 1 , 8 & $
(
J , # ,
8 "
36:
# " J # " $ " - 1 , #
61 " $
-
:
" $J " 7 S 67 & $
" # & $ ( ?
9 "
$ $ 6:
K
& $
8 " J " - 8 " :
int 8 &
$ % &
-
:
J & #
" # &
# " J # " $ " - 1 , # (
G , # ,
$ % &
S , 7 6 3 61 , #
,
, J # " $ " - 1 , < % & K
# " J # " $ " - 1 , 8 & $
9 $ , - 8 &
> , :
, J " - , $
& $
Q
7 & - $ 68 " # , #
7 & : J 63, 8 & # " $
6- 1 " 6# & $
$ " :
8 "
=
9 $ , :
&
$ 6$1 " :
&
8 , 8 &
E
J & #
-
" :
B
&
7 , $ &
6- 1 " 6# & $
E
C
n
,
> "
8 6S " # " - 1 " $
H , :
8 "
"
" # &
8 "
* ( 0 $ $ " $
> , # 6, < % & K & 9
P "
:
,
Q
H , :
H " # , 3K
9 $ , - 8 &
,
6- 1 " 6# & $
8 "
8 "
J , # ,
n
6- 1 " 6# & $
> , 3& # " $
' ' .
" # , < % &
. . '
'
. ' .
E
. ' '
Q
' . .
U
' . '
F
' ' .
/
' ' '
O
* K
$ " # 6,
8 "
7 & : J 63, 8 & #
" 6$1 6# % &
E
n
.
" < , :
& $
. . .
9 "
" :
.
"
=
" $ $ " $
& - 8 "
& $
Q
$ % & L
2 61 $
6- 1 " 6# & $
' ' '
2 6- 5 # 6&
- , 19 # , 3
J , # ,
# " J # " $ " - 1 , #
8 "
,
n
E
@
'
& $
E
@
$ " :
J & 8 " # 6, :
2 61 $ K
6- 1 " 6# & $
, 1
> % &
6- 1 " 6# & $
" - 1 % &
.
J & 8 " # " :
"
J & $ $ > " 6 $ K J , # ,
1 6> " $ $ " :
9 :
2 61 $ K
- 9 :
8 6S " # " - 1 " $
7 & :
> , 3& # " $
2 61 $
,
8 "
' . ' K
J , # ,
8 "
9 " L
$ 6- , 3K J " 3&
G & #1 , - 1 & K
,
' . . K
7 & : J 63, 8 & #
J & $ $ > " 6 $
2 61 $ ( C $ > , 3 & # " $
. . . K . . ' K . ' . K . ' ' K
C $
9 :
& $
# " J # " $ " - 1 , #
'
O ( 0 $1 " $
$ 6- , 3 8 "
Q
9 $ , - 8 &
$ % &
& $
Q
36:
2 61 $
61 " $
8 "
2 61 $ (
# " J # " $ " - 1 , #
E
E F /
> , 3& # " $
E F F (
(K
J , # ,
8 6S " # " - 1 " $ K
9 :
$ " - 8 &
7 & : J 63, 8 & #
& $
9 "
36:
61 " $
8 "
8 "
6- 1 " 6# & $
# " J # " $ " - 1 "
> , # 6, < % &
.
"
$ 6- , 3
@ ' (
9 "
S " 61 ,
> 6:
& $
9 $ , - 8 &
> 5 368 &
, 9 63&
,
J , # ,
9 "
$ "
6- 1 " 6# & $
7 4 , :
,
$ " :
$ 6- , 3 ( ?
# " J # " $ " - 1 , < % &
# " J # " $ " - 1 , < % &
" :
7 & : J 3" :
" - 1 &
J , # ,
7 & :
E (
! & 31 " :
& $
, &
7 & - 1 6- 9 , :
J , # ,
E K
,
&
&
$ "
" $ $ "
2 61
B
:
:
" # & (
2 61 $
:
:
, 6$
" $ 9 " # 8 ,
:
" # & ( P "
S & #
-
' 1 " # " :
J & $ 61 6> & $
B
8 6S " # " - < ,
8 "
& $
$ 6- , 3 8 &
" # & $
7 & : J 63, 8 & #
$ " #
2 61
6- 8 67 , #
-
- & $ $ &
:
# " $1 , - 1 " $
& $
7 & :
" # & $
" - 1# "
" $:
"
9 :
- &
-
:
2 61 $ (
- " H , 1 6> & $
7 & :
8 "
" :
:
2 61
" # &
J & #
> , 3& #
-
" $ $ "
" < , :
&
Q
S & #
"
& $
" < , :
:
2 6- 5 # 6&
$ $ 6:
K
" : 2 & # ,
> , 3& # " $
P "
&
"
9 :
A :
7 , $ &
,
,
& $
*
2 61 $
H " # , 3K 9 :
H , :
:
6- 1 " 6# &
J & $ $ > " 6 $ K & $
1 6> " # :
B
9 :
,
8 "
, - " 6# ,
7 & : J 63, 8 & #
7 , 2 " < , 34 &
8 "
$ " 9 $
" - 1 % &
=
limits.h.
,
6- 1 " 6# &
> , # 6, < % &
8 "
36:
" $1 , :
$ , 2 " # :
9 "
G , # ,
& $
" $1 , :
& $
2 61
& $
:
- ,
# " $1 , - 1 " $
J & #
" # & $
' K
9 "
2 61 $
$ " - 8 &
$ "
&
- , 19 # , 3 # " J # " $ " - 1 , 8 &
E
. ' '
Q
' . .
@
U @.
U
' . '
@
U @ '
Q
' ' .
@
U @E
E
' ' '
@
U @Q
'
$ 6- , 3K
# " J # " $ " - 1 , 8 &
> , # 6, < % &
> , # 6, < % &
> , 6 8 "
& $
,
E
&
7 & : J 3" :
" - 1 &
-
:
> , 3& #
, 2 $ & 39 1 &
" $ $ " $
9 $ , - 8 &
E
$ % & L @
$ 6- , 3 # " J # " $ " - 1 , 8 &
9 , 6$
2 61 $
9 $ , 8 &
" # &
J , # ,
J & $ 61 6> &
:
" $:
, 2 $ & 39 1 &
8 , 8 &
7 & :
&
-
8 &
J " 3,
:
" # &
& $ 2 61 $ (
9 :
# " J # " $ " - 1 , #
J & #
. ' .
> , 6 8 "
8 "
> , 3& #
7 & - $ " H 9 " :
'
8 "
$ 6 H - 6 S 6 7 , 1 6> &
$ " 9
,
1# $
" $ $ " $
' ' ' ( 0 :
# " J # " $ " - 1 , :
. . '
8 "
"
J # " $ " - < ,
.
61 " $
' ' .
, 6$
H , :
9 "
&
' . ' K
. . .
7 & :
7 & :
' . . K
J , # ,
- " H , 1 6> & (
.
-
.
J & $ $ > " 6 $
> , 3& # " $
& 9
" # &
?
C $
& $ L . . . K . . ' K . ' . K . ' ' K
9 , - 1 68 , 8 "
,
8 "
@U
9 $ , - 8 &
"
E
Q
@ '
@ 'E *
n
2 61 $ K
,
E
1 " - 4 ,
, 6- 8 ,
E
*
Q (
@ '
2 61 $ 1 " # 5
E
'E O (
n
> , 3& # " $
8 6S " # " - 1 " $
E , E @ ' ( $ % &
9 $ , #
6- 1 " 6# & $ K " $ $ " $
& $
36:
61 " $
# " 7 & # # " #
36:
61 " $
$ % &
$
8 "
:
> , # 6, < % &
, 7 # & $
8 , 8 & $
J & # L
J , # ,
8 " S 6- 68 , $
& $
6- 1 " 6# & $
- &
- &
S 67 4 " 6# &
8 "
"
INT MIN INT MAX
(
0 :
=
- " H & 7 6, :
& $
" $J , < &
double ou long double
"
J # " 7 6$ % &
" $ 7 & 34 " - 8 &
" - 1# "
7 4 , #
"
6- 1
*
.
2 61 $
,
' /
' /
2 61 $
.
/ F
Q E
2 61 $
Q E
2 61 $
.
S 3& , 1
Q E
2 61 $
J #" 7 6$% &
O
S & 9 2 3"
/ U
2 61 $
J #" 7 6$% &
' F
8 H 61 & $
3& - H
* .
2 61 $
J #" 7 6$% &
' T
8 H 61 & $
H " # , 3K
7 & 6$ , $
"
! 6:
& $
9 - $ 6H - " 8
6- 1
1 6J & $
" - 1 , #
" :
8 & 9 2 3"
1 & # - ,
G & #
! " , :
J # & H # , :
# " J # " $ " - 1 " :
&
8 "
# " J # " $ " - 1 , < " $
& $
& #H , - 6
,
J & - 1 & $ K
J # & H # , :
" $1 " - 8 " #
,
:
& 9
- " 7 " $ $ 5 # 6&
36- 4 , $
, 6$
:
& $
9 :
"
7 & :
&
& $
,
U
,
Q E
U * Q
E T U
$ 6H - 6S 67 , :
1 6J & $
8 "
O / O
F Q F
'U O
@E
,
K
/ U *
T / O
,
" :
'U O
E
U * Q
/ U O
E T F
8 H 61 & $
8 , 8 & $
8 , 8 & $
# " 3, 7 6& - , - 8 & @& $
" 8 61 & #
H # 5 S 67 &
S 6H 9 # , $
3 " H > " 3 K
, 9 8 , :
- & $
8 6S " # " - 1 " $
,
& # H , - 6
J , # ,
, #
"
,
K
1# 67 , $ ( A : ,
H " & :
:
& # H , - 6
, 6$
S 5 7 63
8 "
7 & :
,
& $
& $
7 & - 7 " 61 & $
$ " 9 $
& # H , - 6
8 , 8 & $
, < % &
7 & : J # " " - 8 " #
"
:
8 "
, 6$
8 "
8 &
J # & 2 3" :
,
9 "
8 " $1 "
1 6J &
S & # :
8 , 8 & $
S 5 7 63
,
8 "
,
:
, - 1 " # K
" 34 & # , # (
& $
7 , 37 9 3, #
,
" " : J 3& K
G & #
" " : J 3& K 7 & - $ 68 " # " :
, J " - , $
, H & # ,
6H 9 , 6$
2 61 $
7 & - 7 " 61 & $ (
# " $ & 39 < % & (
K
9 "
8 6S " # " - 1 " $ (
8 & 7 9 :
A :
3& - H
J & #1 , - 1 &
float,
E F F
O / *
$4 & #1
" - 1# "
@Q E
9 - $ 6H - " 8
#
8 "
2 61 $
3& - H
7 & : J 63, 8 & # " $
' /
9 - $ 6H - " 8
"
(
! , 3& # " $ 1 J 67 & $ J , # , , 3H 9 - $ 1 6J & $ " :
$4 & #1
char, int, long int
9 "
8 6$1
" :
> "
8 "
6: J 3" :
" - 1 , # :
& $
&
" 8 61 & #
H # 5 S 67 &
7 & : J 3" 1 &
- 7 6, $ " 9 7 368 " , - , $ " - 1#" J & - 1& $ 8 & J 3, - & (
&
0
1 2
2
4
-
=
/
+
! ' # $ '%
â&#x2C6;&#x2019;
/
* * ,
+
(
- . +
3 4 2
4 2
5
â&#x2C6;&#x2019;
! " # $ "%
)
*
. * ,
2
3 5
2
6 6
)
int main() { float a, b, c, d; printf("Abssissa do ponto A:"); scanf("%f", &a); /* ... */ printf("dist: %f \n", dist(a, b, c, d)); return 0; }
7 8
dist
2 2
4
7 2
)
double dist(float x, float y, float z, float t) { float dx = x - y; float dy = z - t; return sqrt(dx * dx + dy * dy); }
2
sqrt
(
7 8
9
7
6
math.h
2
2
2
2
7 5
2
7 8
4 2
6
x
y
2
4
7
2
2
6
4 3
2
2
7
7 8
5
dist
2
(
3 6 8
2
2
6 6
(
7 2
2
z
4 2
t
6 6
2
6
2
2
3
9 2
6
3 6 8
!
"# $ "$ # %
* ) , ! '
! #
* ) , ! ' )
4 % , %
# ! 2 ! # 1#
4 ) ' * ) / ! / " !
!
%
@ ) , ! ' )
( ) $
' % / 1* $ 0% , )
% 1/ , %
; / 14 %
4 ? * 1%
% & # ! & % '
% & # $ * % ' +
4 ) ' )
%
4 % , %
$ ' %
, % , )
3 $ !
!
4 ) ' * ) / ! / " !
" > )
! . ! / "$ % 0' ! / " !
$ / 1, % , ! -
1/ , 1. 1 , $ % 0 4 9 % ' % # ! ' )
) * ! # % < = !
-
, ! 2 1/ 1, %
56 7 6 -
4 ) '
1/ , 1. 1 , $ % 0
' ! ' : # )
* % # %
%
, !
!
, !
$ '
$ '
, % , )
"# $ "$ # %
, !
" 1* )
/ ) ' !
4 ! #" )
, 12 ! # ! / " !
4 ) ' $ '
, % , )
-
* ! 0)
-
' %
3 $ !
3 $ !
/ ) ' ! 8
8
> )
)
% 4 !
)
%
' ! ' : # )
% " # 1: $ 1 < > ) 8
$
% #
%
!
"# $ "$ # %
* % # %
, ! 2 1/ 1#
$ '
" 1* )
, !
, % , )
3 $ !
# ! * # !
! / " !
* ) / " )
A
struct point { float x; float y; }; !
!
4 # ! . ! # A
struct point A, B;
-
%
A.x=1.0; A.y=1.0; B.x=4.0; B.y=2.0; ) '
)
%
) * ! # % < > )
, 1# ! 4 " % ' ! / " !
!
, !
"# $ "$ # %
4 ? * 1%
4 ) ' )
!
"
, ! 2 1/ 1, %
% # & $ ' ! / " )
, !
* % # %
2$ / < = !
%
!
8 @ ) #
"# $ "$ # %
-
* ) , ! ' )
* %
% #
! ! ' * 0) A
double dist(struct point p, struct point q) { float dx = p.x - q.x; float dy = p.y - q.y; return sqrt(dx * dx + dy * dy); }; 0" ! # / % " 1. % ' ! / " !
4 ) ' * 10% , ) #
typedef
, !
" ! '
* ) , ! # % ' )
3 $ !
%
3 $ ! # % ' )
! & $ 1/ " !
" ! #
$
4 # 1% #
$ '
% , )
%
/ ) ' !
* % 0% . # % 4 9 % . !
* % # %
)
/ ) . )
typedef
" 1* )
!
%
1'
* % # %
1/ 2 ) # ' % #
2 % 4 1 0 1" % #
%
!
)
4 # 1" % 8
1/ " % ! A
typedef <tipo elementar ou estruturado> <novo identificador> ! ' * 0) A
)
4 %
)
typedef int Number;
, %
!
"# $ "$ # %
point
" ! # 1% ' )
-
typedef struct { float x, y; } point; !
* ) #" % / " )
* ) , ! # % ' )
" ! #
!
4 # 1" )
%
2$ / < > )
% / " ! # 1) #
, %
! & $ 1/ " !
2 ) # ' % A
double dist( point p, point q) { /* â&#x20AC;Ś como antes â&#x20AC;Ś */ };
) " !
!
3 $ !
% : # ! . 1% "$ # % +
4 ) ' * 0! " )
)
, !
typedef $ '
/ > )
" 1* )
1/ "# ) , $
3 $ !
* ) , 1%
$ '
! #
/ ) . )
!
" 1* )
* ! 4 12 14 % , )
% * ! / %
, !
$ '
) $ "# %
1/ ? / 1' )
2 ) # ' % 8
( ) $
$ ' %
* # ) & # % ' %
! # 1%
#include <stdio.h> #include <math.h>
}
typedef struct { float x, y; } point; double dist( point, point);
point.
int main() { point a,b; printf("Primeiro ponto:"); scanf("%f", &a.x); /* ... */ printf("dist: %f \n", dist(a,b)); return 0;
} }
} double dist(point p, point q) { float dx= p.x - q.x; float dy=p.y - q.y; return sqrt(dx * dx + dy * dy);
$
! "
% # $
#
& ' "
};
% "$ # % 0' ! / " !
* # ? * # 1)
!
3 $ !
"# $ "$ # %
/ % , %
/ )
1' * ! , !
, !
% & # $ * % #
' ! ' : # )
, !
, % , )
3 $ !
!
% '
! 0!
8 ! ' * 0) A
typedef struct circle{ point center; float radius; }
/* ou o que ĂŠ a mesma coisa: */
typedef struct{ point center; float radius;
} circle;
!
"
"
#
& '
" "
$
"
"
%
! & %
#
(
circle aCircle, bCircle; aCircle.center.x = 0.0; aCircle.center.y = 0.0; aCircle.radius = 1.0; bCircle = aCircle; )
+
*
! "
+
â&#x20AC;˘
4 5 6
5 7
! "
&
!
$
"
%
! &
$
"
$
&
& %
.
! "
$
!
! "
"
"
& "
&
/
&
*
*
$
"
&
'
0
&
#
1
)
#
'
#
%
3
)
#
5 9
! "
: ;
"
%
%
8
!
2
"
,
â&#x20AC;˘
! *
(
-
#
â&#x20AC;˘
>
/* OK*/
< =
! "
"
"
"
'
& "
"
%
2
"
&
#
3
?
*
*
#
?
!
$
3
$
"
%
&
"
& "
*
*
char
&
-
&
.
&
int
&
#
"
! "
struct s { int i,j; };
>
&
?
&
&
"
%
2
%
i
"
"
&
"
&
& "
j
#
&
*
0
"
%
3
$
'
"
#
?
$
&
$
#
+
"
#
(
union u { char lowbyte; int word; };
#
$
"
*
%
*
$
"
char lowbyte
$
&
$
$
'
*
"
word
&
2 "
#
lowbyte
word
word
$
lowbyte
(
union u aUnion; aUnion.word=0x105; /* 105H = 261D */ printf("%d", aUnion.lowbyte); >
0
+
*
"
*
3
(
'
&
"
"
"
"
*
lowbyte
$
*
highbyte
,
(
typedef struct { unsigned char low, high; } lhbytes;
#
typedef union { lhbytes byte; int
word;
} bytesword;
+
"
(
bytesword bw; bw.word =261; printf("%d %d \n", bw.byte.low, bw.byte.high);
#
+
"
*
"
*
(
bytesword bw; bw.byte.low =5; bw.byte.high =1; printf("%x \n", bw.word);
+
2
(
(
â&#x20AC;˘
â&#x20AC;˘
&
!
"
%
"
&
$
& '
%
2
>
"
&
*
,
"
&
0
- "
*
!
#
"
$
&
"
"
"
"
2
%
"
"
"
&
! & "
&
%
"
& &
0 ! &
$
$
$
*
"
&
&
#
!
&
# $
& "
#
"
"
3
*
. #
! & %
! &
!
*
&
& %
! &
"
5
4 5
&
#
"
"
%
<
:
&
=
"
"
&
"
%
$
&
&
*
&
&
*
"
"
&
& %
#
!
3 &
#
"
"
#
"
&
&
"
#
&
&
+
"
.
.
"
#
+
#
"
*
%
*
0
"
"
$
*
&
(
.
.
"
"
#
"
&
"
& %
"
& .
"
"
"
&
*
"
"
!
"
"
&
! .
*
#
#
#include <stdio.h> #include <string.h> #include <ctype.h> #define COMPMAX 128 typedef struct {int letras, espacos, palavras;} contador; int main() { char dentro=0, texto[COMPMAX]; int i; fgets(texto,COMPMAX,stdin); for (i=0; i<strlen(texto); i++) { if (!dentro && !isspace(texto[i])) { dentro=1; printf("%c",texto[i]); }
else if (dentro && isspace(texto[i])) { dentro=0; } } /* printf("\n%d %d %d \n", c.letras, c.espacos, c.palavras); */ return 0; } .
+
.
& .
*
! &
&
*
!
! 2
#
& "
&
"
"
$
#
!
! *
"
&
-
& "
.
#
!
*
"
!
3
2. Arrays e Ponteiros
&
"
)
*
"
"
"
"
"
d=
"
. #
n
&
&
+
â&#x201E;&#x153;
-
â&#x2C6;&#x2019;
%
2
"
"
"
â&#x201E;&#x153;
&
& %
"
+
&
"
*
&
2
&
*
"
3
3
$
"
"
&
&
"
&
"
&
â&#x201E;&#x153;
"
&
"
"
d
. $
$
"
Y
"
X
(y1, y2, ..., yn)
Y
$
$
"
) "
X
*
+
+
â&#x2C6;&#x2019;
"
0
&
$
=
â&#x2C6;&#x2019;
=
&
2
*
"
!
3
%
%
&
&
â&#x201E;&#x153;
â&#x201E;&#x153;
$
$
$
%
& %
0 &
$
&
"
"
"
%
2
"
3
n
&
$
'
2
"
%
(
3
$
"
)
#
!
"
*
0
*
0
%
%
#
&
&
*
"
&
%
"
%
#
$
*
%
"
"
"
&
"
#
+
$
) "
&
3
&
"
*
&
#
#
&
,
#
"
*
*
&
"
*
*
(x1, x2, ..., xn)
?
"
#
-
&
(
â&#x2C6;&#x2019;
?
&
*
&
&
"
$
"
&
"
ai
3
&
&
"
"
"
â&#x201E;&#x153;
#
"
"
!
"
#
(
int ai[10];
&
"
"
ai
"
!
(
ai[0]
"
&
2
%
#
/* 1ÂŞ VersĂŁo */ #define N 10 int i; int ai[N]; ai[0]=1; for( i=1; i<N; i++) ai[i]=0;
%
#define N 10 int i; for( ai[0]=1, i=1; i<N; ai[i++]=0); >
"
%
>
! 2
%
"
&
"
#
3
$
int ai[]={1,2,3}; int bi[3]; bi=ai;
*
+
for( i=0; i<3; i++)
%
(
b[i]=ai[i];
"
for( i=0; i<3; bi[i]=ai[i++]); ?
*
*
#
+
&
$
(
#define N 10 typedef struct { float x, y;} point; point apoints[N]; apoints[0].x=0.0; apoints[0].y=0.0; /* Programa que calcula a distância entre dois pontos de â&#x201E;&#x153;n */ #include <stdio.h> #include <math.h> #define N 10 double distn(float[], float[], int); void read(float[], int); int main() { float x[N], y[N]; printf(â&#x20AC;&#x153;Ponto X: â&#x20AC;&#x153;); read(x, N); printf(â&#x20AC;&#x153;Ponto Y: â&#x20AC;&#x153;); read(y, N); printf(â&#x20AC;&#x153;d= %fâ&#x20AC;?, distn(x, y, N)); return 0;
} double distn(float p[], float q[], int n) { int i; float sum = 0.0; for (i=0; i<n; i++) sum += (p[i]-q[i])* (p[i]-q[i]); return sqrt(sum); } void read(float a[], int n) { int i; for(i=0; i<n; i++) { printf(â&#x20AC;&#x153;Coordenada %dâ&#x20AC;?, i+1); scanf(â&#x20AC;&#x153;%fâ&#x20AC;?, &a[i]); printf(â&#x20AC;&#x153;\nâ&#x20AC;?); } } >
"
%
+
"
'
"
*
&
"
! & %
& "
#
! & "
) "
&
&
"
"
"
&
"
#
?
"
&
-
%
3
#
?
#
$
3
"
"
.
$
! &
&
"
) "
&
! &
"
#
"
&
%
!
! 2
"
%
! &
"
"
3
*
&
&
"
"
"
*
'
$
&
"
*
&
&
"
&
"
"
&
#
-
.
"
&
ai
$
&
%
#
int ai[10];
"
3
*
&
'
>
&
"
"
2
*
&
"
"
&
*
&
"
#
"
0
&
"
"
,
"
!
7
%
%
+
sizeof
"
- "
sizeof(<tipo>)
"
.
size_t
#
5 4 5
#
$
"
9
< :
-
=
"
.
&
0
*
"
,
"
0
#
0 *
"
&
"
"
"
(
char c=3; char *ptr_c;
/*declaração de ponteiro para um char */
*
"
! 2
ptr_c=&c; "
ptr_c
%
?
*
-
%
&
3
.
$
&
2
!
0
-
%
?
&
void*
&
*
#
&
" ! &
- "
. $
$
. #
*
/*endereço do char c */
! &
"
&
0
"
"
&
*
"
0
"
#
+
void*
"
"
"
3 &
#
ptr_c
$
&
*ptr_c
$
(
printf("%c", *ptr_c);
&
3
&
- *
.
"
,
#
+
"
(
"
"
&
"
#define N 10 int ai[N]; ai[2]== *(a+2); /* Ă&#x2030; sempre verdade */
*
!
&
&
&
*
"
*
3
&
3
"
"
&
0
*
$
"
"
%
#
)
*
++ -- sizeof
$
"
"
int ai[3]; int bi[3]; /* ... */ bi=ai; /*ERRO*/
&
*
"
!
"
*
&
*
*
&
%
"
&
0
&
%
&
$
*
"
"
"
! "
"
%
$
&
!
"
#
"
"
&
$
&
"
%
!
"
%
$
#
?
"
(
int soma( int *, int); int main() { int a[]={1,2,3}; int n = sizeof(a) / sizeof (int); pritnf("%d", soma(a, n)); return 0; }; int soma( int *x, int n) { int i, s=0; for(i=0; i<n; s+=x[i++]); return s;
&
"
sizeof
"
&
3
)
*
3
"
"
#
7
#
5 7
5
?
"
&
<
;
3
"
-
< =
"
9
< :
=
.
"
"
n
-
! "
"
#
0
>
.
$
3
"
"
"
#
int a[3]; int *ptr=&a[1]; ptr+1; ptr-1;
"
&
+
"
?
"
"
&
-
#
"
+
$
&
"
&
"
3
#
"
3
0
*
&
&
"
"
2
#
+
"
3
"
.
2
"
&
*
&
&
-
'
char
%
"
"
.
'
"
*
"
! *
float
ptr
3
"
#
&
#
$
"
! "
0
*
"
&
(
int a[5], *ptr1, *ptr2, i; ptr1=&a[1]; ptr2=&a[2]; i = (int) (ptr2-ptr1); (ptr2-ptr1)
#
?
&
"
-
"
*
"
"
&
&
%
ptr_diff_t
"
*
&
"
$
! "
stddef.h
>, >=, <, <=, ==, !=
2
.
"
#
#
#
<
?
#
#
#
>
#
! &
<
=
"
2
"
"
(void *)
0 /* ou */ NULL
:
:
"
*
(
/
"
"
/
"
int x, *ptr_x, y;
.
ptr_x=&x; *ptr_x=0; y=*ptr_x+3;
void swap( int *, int *);
.
int main() { int i=1, j=2; printf("i:%d, j:%d \n",i,j); swap(&i,&j); printf("i:%d, j:%d \n",i,j); return 0; }; void swap( int *x, int *y) { int tmp; tmp=*x; *x=*y; *y=tmp;
7
5 6
5
+
"
: 9
=
"
'\0'
$
&
3
& '
"
& &
3 &
3
2
$
#
&
?
&
%
"
0
&
& &
"
:
char str[]={'a','b','c','\0'}; >
&
$
3
! 2
&
"
(
char str[]="abc";
"
?
!
"
3
"
&
#
&
1
"
"
&
& "
"
0
&
*
!
"
"
$
"
<string.h>
&
"
"
#
"
%
$
$
#
0
# $
!
"
"
"
"
%
"
string, strlen
& &
!
&
$
*
"
"
"
(
& &
&
"
"
#
+
int strlen1( char s[]) { int len=0; while (s[len]) len++; return len; }; /* 2ÂŞ VersĂŁo : usando ponteiros */ int strlen2( char *s) { char *p=s; while (*p) p++;
*
a while (*p !='\0') p++;
return p-s; }; /*Programa de teste */ int main() { char str[]="abc"; printf(%d",strlen2(str));
/* 1ÂŞ VersĂŁo: usando arrays */
return 0; }
"
"
"
%
"
&
&
"
&
ptr++
0
%
"
/* ponteiro */
! "
#
char *ptr="abc";
/* array */
#
char str[]="abc";
?
#
! &
>
"
str++
"
&
&
! "
"
"
$
(
0
3
*
&
"
& "
"
$
#
# $
$
#
! 2
ptr="zybaz"; &
#
#
"
"
3
3
"
)
3
"
%
&
0
"
&
"
"
"
/
#
& &
#
3
7
5
5
>
"
3
9
*
< :
=
&
9
=
9
< =
#define N 10
)
&
const int n=10;
&
3
$
& "
"
&
"
'
&
n
"
&
& "
"
"
"
#
&
"
"
/
*
#
const int *ppci=&n; /* ppci: ponteiro para constante inteira */ >
0
&
"
"
"
"
%
& "
&
"
"
&
"
#
>
0
"
"
& "
"
"
#
int i=3; ppci=& +
i
7
5
"
&
>
& "
"
5
%
9
< :
=
*
*
#
9
=
&
$
9
"
%
3
ppci
#
< =
"
&
"
"
&
"
$
"
"
"
!
& "
"
"
(
int i =4; int * const pcpi =&i; pcpi = &i; /* ERRO */
%
%
3
)
"
7
5
"
"
9
< :
"
3
=
5
9
&
"
=
$
!
9
"
& "
"
"
"
=
< =
9
"
&
"
"
#
"
"
$
3
)
#
9
&
"
"
< =
"
'
& "
"
"
#
$
"
%
3
&
)
%
(
const int ci=1; const int * const pcpci=&ci;
5
7
0
"
&
"
)
< :
"
'
"
#
"
;
"
!
!
"
&
< =
3
9
&
0
=
$
%
! "
9
&
5
>
"
!
"
%
"
"
$
& '
!
"
%
#
"
"
"
*
$
!
"
&
!
!
"
"
"
%
!
3
#
"
3
#
& ! *
!
"
min
"
max
(
int min(int a, int b) { return (a<b ? a : b);
} int max(int a, int b) { return (a > b ? a : b) ; }
"
!
"
$
#
# $
&
2
"
!
"
(
,
"
int
*
int (*pf)(int, int)=0
*
&
"
&
int
3
&
"
&
)
"
pf = max;
&
%
pf
&
3
-
"
2
.
&
/
int *pf(int, int)
"
"
!
"
"
%
&
*
pf
#
"
+
"
&
"
int.
!
"
! 2
%
"
(
/* equivalente a pf=&max; */
pf = min;
"
!
(
& %
&
!
"
%
3
"
3
!
f() { int a, b; a=min(10,20);
/* Chamada directa à função */
b=pf(10,20);
/* Chamada à função atravÊs do seu ponteiro, */ /* e a abreviação de (*pf) (10,20); */
};
"
%
"
"
!
"
%
"
)
&
"
3
(
0 &
!
"
+
"
&
$
*
"
&
#
& %
&
!
3
"
&
%
$
&
) "
"
$
"
$
*
!
"
%
%
"
*
#
) "
$
"
&
#
+
"
#
>
"
"
$
+
3
2
&
*
%
$
"
"
& "
$
&
#
*
"
) "
&
! "
"
&
&
&
&
&
!
0
"
&
&
&
$
&
"
*
"
*
&
$
*
"
%
&
!
"
%
0
!
0
& '
&
"
"
&
"
#
int max(int, int); int calcula(int (*) (int, int), int*, const int); int main() { int a[]={1, 2, 3}; const int n = sizeof(a) / sizeof(int); int maximo, minimo; maximo = calcula(max, a, n); minimo = calcula(min, a, n); printf("min: %d - max: %d \n", minimo, maximo); return 0; }; int calcula(int (*pf) (int, int), int *a, const int n) { int i, res=a[0]; for (i=1; i<n; i++) res = pf(res, a[i]); return res; };
int min(int, int);
&
include <stdio.h>
-
&
$
"
"
"
.
?
& '
!
"
0
3
7
5
#
$
-
9
2
.
*
%
"
! 0 &
& '
#
!
"
$
"
&
!
%
"
"
%
"
! &
&
) "
$
"
"
%
$
< :
=
&
"
< =
3
"
(
2
point p, *pp; p.x=0.0; pp=&p; pp->y=0.0; "
%
!
*
(
(*pp).y=0.0;
7
5
5
!
<
=
*
9
< :
=
"
3
&
&
(
int ai[5];
3
*
"
"
3
&
int*api[5]; +
"
%
&
0
&
%
!
+
=
typedef struct { float x, y; } point;
#
->
5
&
1
&
?
calcula
%
"
&
"
*
"
0
&
'
"
"
"
api
2
"
"
"
/
"
%
#
â&#x20AC;&#x153;falseâ&#x20AC;?
%
n
!
"
$
&
"
!
"
%
*
â&#x20AC;&#x153;trueâ&#x20AC;?
"
&
#
const char* bool (int n) { static const char * names[]={"false", "true"}; return (n? names[1]: names[0]); }; >
&
"
(
"
! &
"
2
"
%
&
!
) "
"
! & 0
&
"
!
"
)
*
#
&
#
"
0
" "
"
"
$
$
&
"
"
"
#
"
"
%
"
%
#
&
"
"
!
"
%
&
"
%
7
5 4
$
static
0
!
&
" "
! "
*
*
&
&
"
0
#
!
"
&
$
" ) "
"
%
3
&
"
&
) &
$
&
"
static
"
$
$
"
%
-
&
names
0
&
"
&
#
static
%
2
)
"
! "
"
!
"
&
&
"
!
"
0
&
$
!
!
"
%
"
%
5
.
#
3
"
"
< 9
*
#
=
&
9
&
: 9
*
&
"
3
"
"
,
#
"
(
&
*
*
*
&
&
! &
! &
&
$
"
&
! "
"
"
(
> fact 3 6 +
"
&
"
%
*
!
argc
#
- *
3
argv
#
&
$
&
*
*
*
&
&
3
.
&
"
3
&
'
$
&
"
&
"
"
&
"
*
!
"
main
%
#
(
"
. #
$
"
&
3
&
&
argc
#
& 0
& "
"
3
3
"
" 3
main
argv[1]
!
"3"
"
&
'
"
&
$
"
#
-
"
$
*
"
&
"
/
"
&
"
&
"
%
"
& %
*
"
"
argv[0]
&
"
$
"
!
- "
&
"
"
"
"fact"
. #
stdout
$
(
int main(int argc, char *argv[]) { int i; printf(â&#x20AC;&#x153;O meu nome e os argumentos com que foi chamado sĂŁo: \nâ&#x20AC;?); for(int i=0; i < argc; i++) printf(" %s \n",argv[i]); return 0; }; *
! "
*
"
& "
! 2
"
"
"
#
7
5 4
4 5
#
<
&
:
=
"
&
"
"
$
&
"
!
"
%
*
! *
(
.
+
.
#
"
"
"
&
*
&
+
"
"
&
printf
%
*
&
"
& "
*
#
3
#
"
2
"
'
"
$
$
"
&
& "
#
0
2
! *
%
& "
&
"
#
2.1. int *pi=0, i=1;
2.2.
int a[]={1, 2, 3};
int pi=&i; *pi += i; ++i; i
#
2
int *pi = a; pi++; *pi;
,
!
"
%
$
! & "
#
*
& '
! "
"
"
"
0
&
"
&
$
& &
&
(
#
&
"
"
3 &
&
+
#
?
& '
"
$
#
"
!
"
%
&
"
*
%
"
$
"
!
"
%
#
+
"
!
%
"
"
%
!
"
%
"
&
"
&
"
&
"
& &
!
"
*
%
#
*
"
"
!
"
#
%
?
$
&
& '
"
"
0
"
(
$
#
2
! "
"
,
& &
"
!
"
"
! "
*
"
#
?
$
& '
$
"
&
0
"
$
!
)
"
"
"
#
3. Reserva dinâmica de memória
&
â&#x2C6;&#x2019;
â&#x2C6;&#x2019; â&#x2C6;&#x2019;
&
"
0
*
"
#
?
"
$
*
- #
"
#
?
"
0
2
! 2
*
0
"
!
"
$
&
%
! "
.
*
3
!
*
*
*
3
*
! "
"
!
&
%
"
*
%
"
%
*
3
"
*
"
"
! "
'
&
#
%
0
"
*
&
& %
%
&
pi = (int *) malloc(sizeof(int));
%
%
"
"
) &
&
"
%
! "
"
.
/
*
!
"
3
%
"
#
"
%
&
"
"
&
0
&
&
0
3
0
"
&
'
"
"
'
$
"
3
& "
&
&
"
0
!
"
!
*
3
*
&
'
#
/* (int *) ĂŠ uma coerção ou conversĂŁo explĂcita */
-
#
"
2
int *pi;
#
#
%
"
0
# $
&
&
&
-
0 &
#
"
& '
.
$
/
&
0
*
!
& %
>
"
0
&
3
0
*
3
0
3
?
?
0
#
!
0
$
"
"
(
pi = (int *) malloc(sizeof * pi);
'
>
*
&
%
"
'
"
sizeof
"
& '
"
*
"
"
"
"
&
0
"
#
"
2
"
"
"
stdlib
&
"
#
$
!
>
"
"
'
*
"
!
"
3
%
&
"
3
"
&
&
)
'
"
$
#
void *malloc( size_t n); void *calloc( size_t , size_t);
!
"
%
"
%
malloc
malloc n
$
"
NULL
&
void*
"
$
#
"
"
"
pi
!
"
&
'
"
%
"
&
2
#
*
& "
)
&
#
#
?
$
0
*
(
int *pi; pi = (int *) calloc(1, sizeof * pi);
!
"
malloc
&
'
calloc
%
'
3
"
(
"
)
&
NULL
0
! &
'
&
$
"
"
&
!
%
$
'
*
&
*
#
! &
$
3
'
&
$
"
! "
'
"
$
fprintf(stderr, â&#x20AC;&#x153;MemĂłria insuficienteâ&#x20AC;?);
if( pi == 0) {
#
!
2
$
exit(1); }
"
&
"
0
"
*
%
$
$
3
"
&
&
! &
%
& %
&
"
&
'
$
*
! 2
"
(
(
)
$
&
$
$
! &
"
&
)
stdio.h
3
%
$
*
$
*
$
#
%
"
%
& &
$
3
&
$
%
$
&
stderr
#
& '
%
)
stdin
#
stdout
#
"
#
"
)
$
3
"
"
& %
/
%
$
"
%
#
printf("abc");
*
"
fprintf(stdout,"abc");
int i; scanf("%d", &i);
*
"
fscanf(stdin,"%d", &i);
"
!
! &
$
printf
"
#
"
"
,
*
$
*
)
"
$
&
fprintf(stderr, <mensagem>)
& &
"
$
!
&
& & "
0
"
&
"
"
stderr
%
& "
0
&
"
%
& %
#
2
!
*
#
"
%
!
"
free
%
"
"
&
0
'
'
'
!
"
"
&
"
malloc
0
calloc
#
+
(
void free(void *);
$
&
"
&
'
*
&
"
"
*
pi
$
free(pi);
"
&
#
$
"
#
#
1
#
6
5 4 5
1
-
"
&
"
?
"
3
"
"
"
&
&
:
"
!
"
"
&
"
(
0
"
&
free
%
&
*
"
"
0
& ! &
*
$
#
# $
*
#
&
&
"
"
%
!
/
&
/
: 9
*
calloc
"
"
%
< = <
'
malloc
$
<
'
&
0
<
& ! &
3
:
2
&
"
! &
0
!
&
%
"
*
"
"
&
"
"
. #
+
0
/
#
=
"
"
&
+
$
"
$
%
*
"
#
"
"
"
"
$
&
%
*
#
"
$
"
) "
%
*
&
&
"
0
"
"
*
&
"
&
! &
&
$
*
>
"
&
"
"
"
&
"
&
!
"
#
!
"
%
0
"
"
*
!
"
"
"
"
"
&
2
*
0
"
!
"
#
?
&
"
"
'
3
&
#
! "
"
&
#
"
"
%
"
&
(
int n; float *A=0, *B=0; printf("Nยบ coordenadas: "); scanf("%d", &n); /* verificar n aqui */ A = callocf(n); B = callocf(n); printf("Ponto A\n"); ler(A, n); printf("Ponto B\n"); ler(B, n); printf("d: %f", distn(A, B, n)); free(A); free(B); return 0; }
!
int main() {
"
float *callocf(unsigned);
void ler(float*, int);
"
double distn(float*, float*, int);
callocf.
$
*
float *callocf(unsigned n) { float *data; data = ( float *) calloc(n,sizeof(float)); if (!data) { fprintf(stderr, â&#x20AC;&#x153;MemĂłria insuficienteâ&#x20AC;?); exit(1); } return data; }; "
*
"
double distn(float*, float*, int); void ler(float*, int); "
%
!
#
"
2
*
"
&
%
&
"
&
,
+
"
&
6
5 7
"
&
?
"
"
&
%
!
: 9
"
"
:
"
"
"
&
"
$
&
<
&
"
<
$
&
:
2
0
&
&
< = <
&
"
"
$
5
?
%
&
2
*
"
&
2
2
A[i]
"
:
"
"
!
$
! 2
"
"
*
&
"
*(A+i)
#
#
< =
*
"
"
&
2
3
&
!
&
"
"
%
$
&
"
"
"
*
"
$
"
$
$
(
(
#
int *ptrelem = (int *) calloc(l*c, sizeof(int)); +
"
2 %
'
)
(
"
"
!
"
%
0
&
*
calloc2d
0
"
%
&
(
m = calloc2d(l, c); ?
3
$
&
&
"
*(*(m+i) + j).
(
m[i][j] = 3;
ptrelem[i]
&
"
3
!
"
%
*(ptrelem + i)
calloc2d
! "
"
$
"
m[i][j]
%
&
3
&
"
"
&
2
"
#
"
"
"
$
*
&
&
"
!
$
*
!
0
&
! &
(
"
>
& '
*
"
3
"
(
pplinha = (int **) calloc(l , sizeof(int*)); for (i=0; i < l; i++) pplinha[i] = &ptrelem[i*c];
c
&
" %
"
$
&
"
!
3
"
%
*
&
$
3
"
2
l
"
(
int **calloc2d( unsigned r, unsigned c) { int i; int *pe, **pr; pe = (int *) calloc(r*c, sizeof(int)); if (pe == NULL) { fprintf(stderr, "Erro na alocação de memória. \n"); exit(1); }; pr =(int **) calloc(r, sizeof (int *)); if (!pr) { fprintf(stderr, "Erro na alocação de memória. \n"); free(pe); exit(1); };
for(i=0; i<r; i++) pr[i]=&pe[i*c]; return pr; }; +
2 %
(
int main() { int i,j; int **matriz; matriz=calloc2d(2,3); for(i=0; i<2; i++) for(j=0; j<3; j++) printf(â&#x20AC;&#x153;%d \nâ&#x20AC;?, matriz[i][j]); /* ... */ free2d(matriz); return 0; };
"
*
!
"
%
*
'
!
"
%
3
"
(
void free2d(int **pp) { free(pp[0]); /* liberta toda a memória reservada para guardar os elementos da matriz */ free(pp); /* liberta a memória reservada para os endereços das linhas da matriz. */ };
6
5 6
5
#
! *
2
<
$
:
=
*
! "
"
&
"
"
!
"
"
&
'
&
(
#
>
"
#
"
! *
&
#
int main() { int *pi; printf(â&#x20AC;&#x153;No. inteiro: â&#x20AC;&#x153;); scanf(â&#x20AC;&#x153;%dâ&#x20AC;?, pi); printf(â&#x20AC;&#x153;%d \nâ&#x20AC;?, *pi); return 0; }
#
"
"
(
#include <stdio.h> #include <stdlib.h> int main() { int i, n, m; int *a, *p, *e; printf("N: "); scanf("%d", &n); printf("M: "); scanf("%d", &m); a = (int *) malloc (n * sizeof (int)); p = a; e = a+n-1; while (p<=e) *(p++) = p-a+1; do{
for (i=0; i < m; i++) { do { p++; if (p>e) p = a; } while (!*p); } printf("%d ", *p); *p = 0; n--; } while (n>0); free(a); return 0; }
#
?
#
+
&
#
*
&
&
"
"
*
! 2
"
&
"
"
"
)
"
#
$
$
#
#
#
"
&
%
$
*
%
#
+
&
2
#
"
"
#
"
& "
%
&
(
"
&
$
"
"
&
'
& '
&
"
(
"
"
%
"
!
"
"
%
*
&
& %
"
"
"
#
int ***new3i(unsigned, unsigned, unsigned); void free3i(int***); int main() { int i, j, k, ***tensor; unsigned pag = 2, lin=3, col=4;
tensor = new3i(pag, lin, col); for(i=0; i<pag; i++) for(j=0; j<lin; j++) for(k=0; k <col; k++) tensor[i][j][k] = i+j+k; /* mais processamento sobre o tensor */ free3i(tensor); return 0; } &
+
#
"
&
2
"
!
&
"
"
$
&
&
!
"
'
%
"
$
"
main
%
"
'
"
&
&
"
$
&
*
!
"
%
$
#
%
"
(
"
&
2
&
"
#
"
#
)
&
"
*
2
&
#
-
&
$
'
"
"
&
#
?
2
"
2
&
"
$
.
2
"
&
0
&
2
2
#
&
*
>
&
"
"
#
0
$> sam 4 3 2 ! 0
&
&
2
*
"
$
&
/
&
"
2
&
*
2
"
#
"
4. Primeiras Noçþes de Complexidade
&
0
*
"
&
+
%
"
&
! & "
&
&
#
$
"
*
"
"
*
&
"
#
*
$
!
&
"
& (
#
'
3
*
)
'
&
#
&
&
%
&
$
"
0
&
*
&
&
#
"
&
"
& "
$
! & "
"
2
"
0
"
"
#
!
!
!
&
"
"
%
%
"
#
*
(
&
"
&
0
#
&
"
"
*
2
!
?
&
*
#
!
"
*
) &
&
"
! &
-
"
&
&
"
"
! &
"
) &
&
#
#
0
.
*
"
&
2
! &
"
"
&
"
"
&
&
>
-
0
"
"
&
.
"
"
&
%
$
#
#
#
+
*
$
"
&
&
%
"
"
'
0
!
$
"
#
?
3
"
&
!
#
?
*
&
%
"
2
"
"
$
#
3
"
*
$
2
&
0
! "
3
&
%
"
*
!
"
&
%
"
"
>
! "
*
#
2
! &
"
& ! &
!
"
*
"
3
! &
0
3
"
%
"
&
&
#
&
$
*
$
"
"
) &
%
"
"
"
%
$
"
%
%
! &
$
#
&
"
&
"
0
0 &
"
"
& ) &
#
"
"
0
&
"
"
"
! & %
&
,
*
&
>
"
-
"
&
"
2
&
$
"
"
"
"
&
*
"
'
"
"
.
&
*
"
"
"
"
3
&
"
&
"
&
.
& & 2
2
& & 2
%
"
&
"
"
-
"
&
$
&
"
"
"
&
"
2
&
&
*
"
%
*
&
&
#
& %
3
#
%
2
"
&
3
#
#
+
. #
>
"
-
2
&
"
"
"
$
&
&
3
"
"
$
#
"
#
"
& & 2
$
&
$
&
"
"
"
*
$
"
"
"
*
!
"
& "
&
%
*
3
"
& "
"
'
#
0
"
"
#
int getmax(int *a, int N) { int i, mx = a[0]; for (i=1; i<N; i++) if (a[i] > mx) mx = a[i];
return mx;
â&#x2C6;&#x2019;
=
}
â&#x2C6;&#x2019;
â&#x2C6;&#x2019;
"
#
#
%
+
&
!
&
&
#
â&#x2C6;&#x2019;
"
%
+
â&#x2C6;&#x2019;
+
=
&
&
"
"
0
"
#
"
"
&
"
%
$
%
0
mx=a[i]
#
"
! & $
(
"
&
&
"
"
= +
>
!
!
& "
$
&
"
(
%
&
"
&
"
*
"
&
"
'
"
0
"
#
&
$
= =
+
+ â&#x2C6;&#x2019; +
+
â&#x2C6;&#x2019; =
*
#
"
#
?
3
"
+
&
%
"
#
&
#
&
"
"
& "
#
$
*
&
"
"
&
%
#
'
#
$
&
&
&
*
"
0
"
$
&
"
&
"
0
#
"
"
"
:
$
"
%
&
# $
<
"
%
&
"
&
"
"
"
&
3
>
â&#x2C6;&#x2019;
"
"
"
0
0
"
" "
*
&
&
#
"
$
"
# $
&
"
#
*
&
"
&
"
%
*
&
"
#
"
*
"
&
*
"
(
$
#
.
& %
"
"
*
*
! & "
#
:
-
"
3
= = :
#
2
"
$
%
&
*
&
0
#
<
&
&
$
$
"
*
+ + â&#x2C6;&#x2019; + = +
+ â&#x2C6;&#x2019; + + â&#x2C6;&#x2019; +
+
&
&
"
3
"
= = =
5 4 5
$
&
"
"
?
3
"
"
"
! &
&
"
%
&
"
&
"
&
#
"
0
#
! &
*
'
*
&
&
&
"
*
"
' &
0
"
$
&
&
"
&
! & "
"
"
&
&
#
?
' &
3
"
+
*
*
! 2
*
3
5 7
>
"
$
*
0
"
&
!
2
$
$
"
%
&
"
&
"
!
"
&
+
#
!
*
2
*
"
&
-
*
.
(
"
0
"
*
$
"
>
%
&
"
3
0
2
"
#
3
#
' &
>
*
'
"
! & "
&
#
"
&
$
&
& %
#
5
3
"
#
<
3
:
=
&
&
"
"
%
>
"
#
*
"
"
"
&
$
+
&
*
.
+
â&#x2C6;&#x2019;
+
&
3
&
&
!
3
"
& "
' &
-
"
"
3
"
*
- "
"
. #
#
.
"
"
!
"
%
"
"
& "
0
2
&
/
.
"
&
"
'
&
$
"
!
"
%
*
"
#
#
#
?
&
&
.
-
?
.
"
.
"
"
&
%
"
(
(
,
-
?
- # # #
.
-
"
"
.
&
.
.
&
#
.
?
.
"
"
!
"
&
%
"
"
& &
"
"
&
"
#
#
&
"
5 6
5
%
0 &
<
= = < =
>
3
&
"
"
"
! &
<
:
&
<
"
3 &
<
"
"
!
& "
0 &
#
+
"
"
%
"
!
"
#
?
&
! &
"
"
%
>
&
"
!
2
%
#
!
"
%
"
1
!
"
&
%
=
*
>
&
"
"
"
"
%
#
&
>
"
>
2
â&#x2C6;&#x192; > â&#x2C6;&#x192; > â&#x2C6;&#x20AC;
"
â&#x2030;¤
*
!
3
â&#x2030;¤
"
"
>
-
. $
â&#x2C6;&#x2C6;
$
&
3
&
"
&
$
>
$
3
2
*
&
&
3
>
& "
#
"
>
!
"
$
*
#
+
1
â&#x2C6;&#x2019;
"
#
"
"
&
& "
3
*
"
>
>
$
#
>
â&#x2C6;&#x2019;
â&#x2C6;&#x2019;
?
â&#x2C6;&#x2019;
*
â&#x2C6;&#x2019;
&
&
â&#x2C6;&#x2019;
â&#x2C6;&#x2019;
! &
"
&
$
%
"
#
?
$
"
%
$
$
' &
>
$
3
3
>
)
&
"
&
>
%
"
&
$
%
"
&
&
"
"
"
"
"
&
$
/
>
&
$
>
"
0 &
"
"
$
>
&
$
>
)
"
# $
&
" %
*
3
â&#x2C6;&#x2019;
#
&
>
$
>
$
&
& "
&
&
&
$
#
# $
! &
"
&
$
!
"
"
"
$
*
&
#
&
"
&
%
&
&
"
&
2
&
-
"
)
"
%
.
$
&
&
&
&
&
"
&
*
"
)
"
"
"
&
&
#
!
"
"
! &
%
!
#
#
"
#
20
10
15
Crescimento
10
CĂşbico, N3 10
10
QuadrĂĄtico, N2 Pseudo-logarĂtmico, N Log(N)
5
10
Linear, N LogarĂtmico, Log(N) 0
10
1
2
10
3
10
4
10
5
10
6
10
10
N ?
&
&
"
&
&
$
&
"
%
&
$
&
"
"
!
"
"
"
&
"
! &
"
"
#
300
10
250
10
200
Crescimento
10
Factorial, N!
150
10
100
10
Exponencial, 2N
50
10
CĂşbico, N3
0
10
1
2
10 +
"
"
&
#
"
"
$
"
"
3
#
#
"
>
"
"
! "
$
#
3 &
*
&
"
"
$
10
3
!
%
3
%
*
"
&
!
"
2
"
%
"
"
"
0
!
&
#
#
& "
"
$
"
.
%
"
"
"
!
&
!
&
&
&
&
3
10 N
!
!
"
#
?
>
&
#
"
$
#
&
# $
"
&
0
-
3
&
.
&
2
%
$
&
-
&
!
)
*
!
!
-
-
!
-
!
.
!
?
!
"
&
"
0
$
0
2
#
#
2
#
&
"
. #
#
3 &
"
"
*
$
"
"
&
$
&
"
)
?
!
!
"
"
2
&
%
%
3
$
*
0
*
! & "
"
3
#
"
"
*
&
&
-
"
.
"
&
"
3 "
"
&
3 &
"
3 "
$
$
&
"
"
&
2
&
&
'
"
$
!
"
' &
$
"
&
&
%
*
"
"
"
"
&
#
%
#
2
*
$
"
$
.
&
1
"
! &
-
!
!
.
&
&
! &
.
?
$
!
&
-
"
*
&
&
%
"
"
*
*
"
&
"
2
1
"
&
!
"
&
&
5
&
#
"
&
"
"
"
*
&
<
:
"
"
%
&
<
<
%
"
"
&
)
"
"
3
"
%
"
#
+
#
"
"
!
<
<
0 &
&
= :
$
$
&
3 &
& '
:
= :
& &
<
"
5 4 5
! & "
&
5
& "
%
5
&
"
"
$
*
&
"
0
*
*
"
#
>
2
&
0
&
"
"
&
&
"
0
0
#
<
<
3
"
&
%
"
"
%
%
"
3
$
"
&
%
&
#
0 &
$
!
"
%
3
&
2
&
&
"
!
! "
$
'
!
#
"
%
&
&
'
#
"
2
*
"
"
&
"
%
,
>
&
&
2
!
&
&
"
%
!
"
&
"
"
"
&
%
%
$
! "
factorial
#
"
>
2
&
factorial
!
"
&
"
!
"
"
&
n
$
#
0 &
"
!
n!
$
(
#
"
3
=
â&#x2C6;&#x2019;
"
â&#x2030;Ľ =
%
"
!
"
%
3
"
(
,
int factorial (int n) { int i, t=1; for (i=2; i<=n; i++) t*=i; return t; }
"
%
$
&
$
%
*
,
! "
&
3
"
=
(
factorial
â&#x2C6;&#x2019;
â&#x2030;Ľ =
(
int factorial (int n) { if (n==0) return 1; return n*factorial(n-1); };
"
!
%
!
$
%
&
& &
*
%
*
&
3
%
*
)
"
#
& &
+
$
&
"
&
&
%
&
%
#
"
"
&
"
&
!
"
%
! &
(
factorial(3)
$
3 * factorial(2) 2* factorial(1) 1 * factorial(0)
&
!
&
2 %
"
&
%
&
"
3
!
%
"
0
"
! *
"
! &
"
"
"
"
&
#
"
0
&
& $
%
factorial
! & "
$
#
&
"
& ! &
!
&
!
. #
?
"
"
%
&
$
#
&
"
"
%
& "
"
&
"
*
&
*
$
0
%
$
&
&
*
"
"
-
%
"
"
*
&
"
&
&
0
!
"
"
"
"
0
&
"
!
"
&
$
#
&
& %
"
!
"
&
$
%
â&#x20AC;˘
"
â&#x20AC;˘
&
0
&
&
&
5
"
5 7
$
&
&
if (n==0) return 1
*
"
&
"
%
3
(
- & & 2
&
"
%
"
%
&
&
"
&
factorial
&
"
/
5
"
"
"
&
2
#
>
&
&
<
%
<
"
$
&
9
:
#
*
! &
=
!
%
"
*
"
%
&
&
&
3
3
&
&
%
*
%
(
&
=
Î&#x2DC;
&
+Î&#x2DC;
&
= >
*
"
"
"
%
#
!
"
%
"
Î&#x2DC;
2
*
#
!
3
=
-
"
&
"
"
â&#x2C6;&#x192; > â&#x2C6;&#x192; > â&#x2C6;&#x192; > â&#x2C6;&#x20AC;
. $
"
&
>
$
3
!
"
â&#x2030;¤
2
*
â&#x2030;¤
3
â&#x2030;¤
0
&
"
"
#
+
*
$
$
"
#
&
! "
>
*
&
*
/
3
"
"
!
"
%
&
! &
"
&
%
"
&
*
3
"
3
>
"
!
"
%
&
#
#
" %
return
%
3
!
"
&
"
"
"
%
"
!
2
%
&
&
& "
"
"
"
"
&
"
&
*
/
&
#
& "
'
&
0
&
!
"
$
%
3
&
$
if
"
$
& %
0
"
#
?
&
"
&
$
&
"
"
& "
&
*
*
"
*
& & 2
!
!
"
! &
"
%
&
%
"
! &
3
$
"
&
&
&
"
%
"
#
&
&
!
"
+
$
(
2
"
&
"
&
"
,
?
*
*
"
&
"
=
+
#
?
&
"
&
&
)
$
â&#x2C6;&#x2019; + â&#x2C6;&#x2019; + +
â&#x2C6;&#x2019;
+
>
"
Î&#x2DC;
>
$
2
#
!
"
>
"
+Î&#x2DC;
"
&
"
&
&
"
*
&
$
*
"
%
3
"
!
"
&
*
%
#
3
!
"
%
"
&
(
= >
!
%
+
&
%
&
&
"
"
= = = = = = =
"
&
&
(
=
= = = = =
*
"
â&#x2C6;&#x2019;
+
>
*
%
=
"
5
= =
5 6
"
&
*
"
â&#x2C6;&#x2019; +
â&#x2C6;&#x2019; +
&
%
3
&
"
0 &
*
3
%
3 &
&
"
#
(
+
+
&
"
"
"
"
!
"
< =
<
&
&
&
%
%
<
! &
!
"
<
â&#x2C6;&#x2019;
5
&
+
+
â&#x2C6;&#x2019;
&
(
=
+
3 &
3
â&#x2C6;&#x2019; + + â&#x2C6;&#x2019; + + + +
+ + + â&#x2C6;&#x2019; + â&#x2C6;&#x2019; + +
?
â&#x2C6;&#x2019; + â&#x2C6;&#x2019; + â&#x2C6;&#x2019; + â&#x2C6;&#x2019; + â&#x2C6;&#x2019; +
=
?
0
"
-
&
. #
>
3
#
-
%
. $
&
"
& "
$
#
#
#
"
$
=Θ
=Θ
=Θ
*
2
"
&
∃ε >
&
=
&
∃ε >
=Ω
"
=Θ
#
"
$
"
$
$
"
+ε
−ε
∧ ∃ ∀
≥
≤
(
Ω
2
(
!
=
3
-
"
. $
∃ > ∃ > ∀
>
&
≤
$
3
2
≤
*
3
&
"
"
#
?
?
&
"
$
&
! "
>
$
$
*
0
& %
'
>
#
#
"
∧
(
&
&
$
&
>
$
"
#
#
?
3
$
=
=
=Î&#x2DC;
$
*
"
&
"
&
(
&
2
$
*
#
?
3
$
=
=
=Î&#x2DC;
#
,
#
# $
"
%
5
<
=
&
â&#x2C6;&#x2019;ε
=
â&#x2C6;&#x2019;
(
:
=
#
.
.
+
"
"
#
&
&
5
=
&
.
"
&
%
3
&
&
"
3
&
&
& "
!
"
&
' &
-
' &
3
%
"
"
"
*
-
"
"
"
&
$
"
*
"
& ) &
"
#
#
) "
&
. #
%
*
"
&
"
!
.
.
#
"
=
=
Î&#x2DC;
Î&#x2DC;
+Î&#x2DC;
+Î&#x2DC;
= >
< â&#x2030;¥
&
%
"
&
"
&
5. Algoritmos elementares de ordenação +
%
2
?
/
"
&
&
"
<
3
"
%
: 9
*
.
&
:
&
"
3
: 9
"
&
$
&
<
%
$
#
>
"
&
%
*
0
2
"
2
#
<
"
*
& %
#
! & "
"
& %
& & 2
&
"
"
&
&
"
:
"
$
$
"
!
"
%
& 0
%
&
#
&
"
"
!
%
"
"
"
"
#
&
"
*
*
#
! 0 &
<
<
! & "
%
*
"
%
"
"
%
&
"
! )
*
&
$
"
"
- &
"
%
& %
)
"
&
5 4 5
"
*
0
&
&
%
%
"
"
"
&
&
"
*
"
&
!
#
%
<
)
*
-
%
"
"
"
#
&
"
< 9
&
"
&
+
& %
%
%
"
#
.
"
"
#
& %
*
"
*
&
3
#
"
$
& & 2
&
3
"
$
>
*
"
$
$
$
"
$
"
*
-
"
! "
$
2
*
&
"
$
$
"
$
&
%
$
# # # $
&
.
σ
"
"
0
"
&
$
2
$
"
&
*
"
%
#
2
& "
&
&
3
(
%
$
σ
.
%
-
#
%
"
*
2
#
?
*
3
#
σ
%
$
σ
$
$
# # # $
$
*
$
σ
%
&
"
& %
&
%
/
*
& %
*
σ
*
&
"
"
σ
"
*
"
*
$
"
%
3
"
&
#
,
?
2
"
#
0
"
"
$
"
"
"
0
$
"
!
σ
?
σ
"
&
"
%
"
&
$
&
"
(
#
#
?
&
&
$
$
"
%
*
& %
& 0
"
$
"
&
&
"
"
!
& %
"
*
"
%
&
%
"
"
&
&
$
0
"
& %
%
3
#
"
2 0
$
"
,
&
& %
"
"
*
%
#
"
"
*
%
"
#
"
"
%
3
>
0
"
"
& 3
"
!
*
&
"
"
"
#
"
&
& 3
&
& & 2
(
#
>
*
#
&
#
'
& '
#
"
"
&
"
1
%
#
"
& 3
&
"
&
-
*
"
"
"
"
& & 2
&
%
&
. $
"
*
/
%
"
3
&
'
&
0
"
& %
#
3
!
$
"
&
& 3
"
.
!
"
'
*
"
&
&
.
& %
-
$
"
*
$
&
"
"
.
$
&
"
%
n
/
&
"
! &
"
"
&
*
&
"
&
2
#
&
*
& %
"
%
*
!
$
&
$
#
&
&
"
&
"
"
"
%
!
'
"
*
"
"
%
"
&
&
%
%
"
$
2
$
2 0
"
"
!
&
3
"
"
"
&
&
"
"
%
%
0 &
"
"
#
"
"
,
*
"
#
&
"
*
)
&
"
"
*
*
"
#
&
"
$
$
"
"
"
&
"
3
&
*
#
"
'
*
&
&
*
"
"
3
$
"
%
& %
'
"
&
"
"
&
'
"
*
)
%
"
"
"
#
"
! & "
"
%
)
%
&
"
"
)
#
"
"
"
"
"
*
$
$
%
"
"
&
$
"
& %
! "
& %
&
&
"
3
0
%
#
%
2
&
,
#
"
%
&
>
!
& %
"
"
"
"
)
)
0
#
"
"
%
"
"
&
0
%
"
.
&
& %
2
"
"
%
&
"
?
-
$
#
& 0
$
%
&
.
! &
$
.
,
"
&
$
"
"
&
"
%
"
%
"
"
>
"
) &
$
&
*
"
#
%
"
& %
& %
= <
"
& &
"
&
"
) &
. #
"
+
&
'
)
'
"
%
$
3
"
2
"
#
'
0
$
"
3
"
$
&
0
$
#
& &
<
$
&
%
&
"
"
-
'
"
&
< 9
&
5
&
>
"
5 7
& %
$
!
"
& "
&
&
&
&
*
"
&
"
#
0
?
&
"
& &
&
"
%
&
*
!
- "
.
"
0
"
"
"
"
"
&
!
N
*
0
"
%
"
$
"
3
*
&
& %
& %
"
$
&
& %
#
%
#
&
&
"
&
= =
<
) &
&
"
: =
- "
"
.
"
"
%
! "
*
"
%
#
"
&
& %
#
3
void selection( type *a, int N) { int i, j, n=N-1, im;
/* im - indice do min*/
for(i=0; i< n; i++) { im=i; for(j=i+1; j<N; j++) if (less(a[j], a[im])) im=j; swap(a[i], a[im]); } } ?
& '
type,
less
*
swap,
2
*
$
*
$
$
3
&
"
&
&
0
"
&
"
! "
"
/
&
"
"
! &
%
"
"
(
/
$
"
"
,
"
&
"
"
&
"
&
! & "
&
)
"
&
) &
"
"
$
#
#
& &
"
,
& '
&
$
&
$
%
#
?
&
0
2
)
"
!
"
#
"
$
3
*
"
"
&
&
$
"
#include <stdio.h> "
"
*
&
"
%
$
! &
&
& 3
2
&
stdio.h
3
!
"
&
0
&
#
&
%
! &
&
"
&
&
"
& '
!
"
#
! &
?
"
$
&
0
"
&
0
& %
"
&
"
& '
(
)
!
)
$
"
"
*
3
#
)
/* file: type.h */ typedef int type;
#define printfstring
"%d "
#define Key(A)
(A)
#define less(A,B)
(Key(A) < Key(B))
#define swap(A,B)
{ type t=A; A=B; B=t;}
"
!
*
"
(
&
ssort
*
$
$
"
> ssort 0 8 1 5 4 <Enter> 01458 "
%
& '
&
"
!
"
%
selection
(
#include <stdio.h> #include <stdlib.h> #include â&#x20AC;&#x153;type.hâ&#x20AC;? #include â&#x20AC;&#x153;sort.hâ&#x20AC;? int main(int argc, char *argv[]) { int i, N=argc-1; if (argc ==1) { printf(â&#x20AC;&#x153;Utilização: ssort <sequĂŞncia de nĂşmeros separados por espaços>â&#x20AC;?); exit(1); } type *ai= (type *) malloc (N*sizeof *ai); if (!ai) {
fprintf(stderr, â&#x20AC;&#x153;MemĂłria insuficienteâ&#x20AC;?); exit(1); } for(i=0; i<N; i++) ai[i]=(type) atof(argv[i+1]); selection(ai,N); for(i=0; i<N; i++) printf(printfstring, ai[i]); free(ai); return 0; } ?
"
"
!
"
selection
%
&
"
*
"
&
)
*
#
void selection( type *a, int N) { int i, j, n=N-1, im; for(i=0; i<n; i++) { im=I;
for(j=i+1; j<N; j++)
Im=j; swap(a[i], a[im]);
if (less(a[j], a[im]))
â&#x2C6;&#x2019; =
â&#x2C6;&#x2019;
=
â&#x2C6;&#x2019;
=
â&#x2C6;&#x2019;
â&#x2C6;&#x2019;
} }
"
&
$
"
0
'
&
& 0
&
&
"
&
"
! & 0
#
"
%
%
i
0
& &
"
"
"
" %
&
&
&
$
3
& &
&
"
&
#
0
for
3
>
&
"
2
*
& "
! &
&
- "
"
*
2
"
*
"
. #
&
*
"
&
&
%
& %
$
&
&
$
#
&
#
&
"
$
&
%
%
(
$
"
*
*
"
=
$
&
! 2
5 6
#
"
&
â&#x2C6;&#x2019;
=
â&#x2C6;&#x2019;
=
+
+
â&#x2C6;&#x2019;
=
â&#x2C6;&#x2019;
+
â&#x2C6;&#x2019;
=
â&#x2C6;&#x2019;
+
â&#x2C6;&#x2019;
3
+
=
(
â&#x2C6;&#x2019;
â&#x2C6;&#x2019;
0
"
2
+
+
â&#x2C6;&#x2019;
+
+
â&#x2C6;&#x2019;
+
â&#x2C6;&#x2019;
"
3
3
"
! 2
#
"
&
<
$
.
)
&
"
&
"
"
& %
&
&
& %
#
2
$
&
"
&
?
#
$
$
*
*
"
*
"
"
%
3
&
.
-
$
&
"
*
*
! &
&
#
%
&
%
&
%
*
! &
"
0
"
"
&
& %
%
& &
&
"
&
"
&
! "
*
&
& %
"
.
*
#
â&#x2C6;&#x2019;
&
"
*
< 9
! 2
& &
"
&
swap
%
+ +
&
"
3
%
5
&
+
&
+
?
+
.
+
&
â&#x2C6;&#x2019;
â&#x2C6;&#x2019; + + =
=
(
= =
+
+
â&#x2C6;&#x2019;
= "
+
â&#x2C6;&#x2019;
=
*
â&#x2C6;&#x2019; =
=
"
! &
& "
"
&
"
%
&
"
"
$
"
&
$
,
&
"
& %
*
& "
"
3
bubble sort
& "
#
*
+
"
&
"
!
"
#
,
"
%
"
3
"
(
void bubble( type *a, int N) { int i, j;
for(i=1; i< N; i++) for(j=N-1; j>=i; j--) if (less(a[j], a[j-1])) swap(a[j],a[j -1]); } ?
*
"
"
+
&
&
$
"
$
& '
<
2
"
&
"
"
"
(
&
&
-
-
0
"
. $
3
.
&
-
0
"
%
. #
&
=
&
$
& %
#
"
"
&
"
%
"
&
0
bubble sort
)
&
"
"
! & "
*
!
%
& %
*
"
3
"
0
#
&
0
*
*
"
& "
%
&
#
*
&
"
"
"
%
&
"
%
! 2
&
"
#
?
3
"
&
#
"
"
& &
%
%
for
"
0
&
3
#
3
*
-
3
%
&
*
.
"
&
& %
*
0
"
"
"
%
$
#
?
3
3
"
"
*
%
3
*
>
&
5
"
"
& &
5
"
"
&
3
"
"
*
"
3
"
$
&
%
"
&
"
"
"
"
%
!
& "
3
"
&
"
"
"
#
& 3
&
$
%
3
0
&
"
#
%
&
! & "
%
&
0
bubble
&
= <
%
#
: 9
"
&
"
"
%
%
&
!
"
'
"
"
"
%
< 9
& %
& %
>
"
"
"
%
&
&
"
&
$
"
"
&
3
"
$
#
*
"
& &
+
%
#
#
*
*
%
"
"
%
"
%
"
"
"
'
& &
*
$
!
&
2
#
"
(
i "
3
$
*
"
"
%
&
.
&
*
& %
"
$
"
*
&
"
) "
&
"
&
! "
& "
0
%
"
$
0
*
"
& "
i
%
%
"
#
"
?
*
&
%
& "
&
"
"
&
"
$
*
"
&
%
- &
#
?
&
&
& %
"
"
=
%
$
" $
&
! & "
&
"
%
(
-
$
<
"
3
3
.
"
(
,
void insertion( type *a, int N) { int i, j; for(i=1; i< N; i++) for(j=i; j>0; j--) if (less(a[j], a[j-1])) swap(a[j], a[j-1]); } +
%
?
#
#
0
"
0
"
*
*
"
&
#
+
& &
&
"
"
$
*
*
%
! 2
&
"
"
"
&
& "
"
& %
%
(
*
%
&
&
*
&
"
&
"
%
#
&
&
"
*
&
$
+
%
&
&
"
%
'
"
!
&
"
#
"
(
void ainsertion( type *a, int N) { int i, j; type t; for(i=1; i< N; i++) { t=a[i]; for(j=i; j>0 && less(t, a[j -1]); j--) a[j]=a[j -1]; a[j]=t; } }
"
%
*
3
+
"
$
3
*
"
!
"
0
"
*
"
"
& ) &
ainsertion
%
3
"
"
%
&
2
selection
%
& &
!
"
0
3
! &
#
*
*
$
!
"
&
"
&
bubble
%
$
&
'
& &
$
$
#
"
%
*
$
&
"
! &
5
#
"
"
%
"
ainsertion
$
*
"
"
"
#
5
<
:
=
&
& %
& &
+
+
>
$
"
&
&
"
!
*
.
& %
&
.
-
&
& %
*
"
2
"
&
$
%
(
.
& .
#
+
"
%
&
' &
$
"
!
"
"
%
a) insertion
ainsertion
.
bubblesort
& .
#
?
3.
+
#
"
"
"
!
"
"
&
"
*
!
"
&
#
&
"
"
%
*
%
i[0] i[1]
$
$
!
#
>
"
"
ainsertion
selection ainsertion
"
$
&
&
"
0
"
&
"
#
"
%
"
'
#
"
%
(
#
3
i
selection, insertion, bubble
"
! "
"
"
"
"
!
&
&
&
) "
&
a
$
&
N
"
"
#
"
"
!
"
%
"
!
"
%
) "
&
) "
&
"
ainsertion
"
"
"
*
"
a
$
a
(
$
# # #
i[N-1]
#
+
2
"
"
$
) "
"
& "
"
"
'
$
&
"
0 ! &
"
&
#
%
#
?
"
3
!
"
"
"
"
a
"
"
ainsertion
%
#
$
"
$
"
$
"
"
3
& & 2
&
&
"
& %
"
"
$
"
!
"
"
&
#
"
#
%
i. ii. iii.
6. Mergesort
"
"
"
"
&
>
"
+
"
&
"
#
"
"
:
&
$
#
1
"
"
"
*
&
"
"
"
"
&
$
#
&
#
>
"
"
"
"
%
#
>
#
"
&
"
#
.
&
&
"
&
#
" %
&
&
#
"
*
>
&
!
! &
#
(
&
"
& %
& %
"
"
&
&
-
"
?
#
! ) &
"
#
0
*
3
&
&
"
&
"
"
&
"
3
"
&
"
&
$
"
"
%
"
"
3
0
"
#
&
&
&
&
"
:
&
!
5 4 5
>
"
!
"
< =
!
&
"
3
2
0
"
&
/
"
"
!
'
/
%
"
#
& %
0
"
&
"
%
(
+
&
! &
"
!
(
#include "type.h" void mergesort(type *a, int n) { int m=n/2; if (n < 2) return; mergesort(a, m); mergesort(a+m, n-m); merge(a, n, m); } >
&
&
"
&
&
&
&
"
%
3
#
"
&
"
&
$
&
&
"
"
"
&
&
"
&
#
?
*
$
"
"
)
&
"
&
#
?
0
&
&
"
"
"
&
&
!
?
"
3
#
"
&
- &
$
2
#
"
*
"
"
&
%
!
3
"
"
3
&
*
*
!
&
%
&
.
"
$
#
"
"
& %
"
!
&
"
%
"
#
'
"
& %
$
&
"
*
"
! & "
"
"
$
&
2
*
"
&
"
&
"
$
&
& %
"
"
&
"
&
& %
&
&
"
& "
& "
& "
"
#
'
& %
%
"
%
& " &
(
void merge(type *a, int n, int m) { int i; int l2r=0;
/*left to right index */
int r2l=n-1;
/*right to left index */
static type aux[MAXN]; for(i=0; i<m; i++) aux[i] = a[i]; for(i=m; i<n; i++) aux[i] = a[n-1+m-i]; for(i=0; i<n; i++) a[i] = less(aux[r2l], aux[l2r]) ? aux[r2l--] : aux[l2r++] ; }
!
"
%
m=n/2
&
"
.
*
a "
"
n
"
a
*
%
"
"
& &
& &
*
"
- ) "
"
"
-
$
&
"
#
>
"
&
&
&
$
"
!
#
%
?
"
"
"
$
"
&
.
$
&
a
& &
a
#
(
>
- ) "
>
*
&
2
0
*
*
&
"
! 2
3
&
&
$
"
"
"
"
2
"
5 7
"
5
"
?
"
?
&
&
"
%
'
"
&
+Î&#x2DC;
&
"
"
"
aux
&
"
"
0
&
#
$
*
&
- &
&
&
&
-
&
.
"
&
"
&
"
.
$
#
& "
"
"
&
$
3
%
*
"
"
"
"
&
%
"
&
"
"
"
%
$
#
$
(
<
#
#
$
$
0
&
&
3
&
3
2
& %
mergesort "
3
&
mergesort
&
aux
#
.
< 9
"
"
&
&
&
*
*
&
# $
"
&
&
*
&
& "
"
3
#
&
&
merge,
& %
Î&#x2DC;
' &
"
%
%
! "
=
&
!
3
*
< = <
>
,
&
"
%
&
$
"
$
!
"
merge
%
*
3
"
&
"
&
%
#
5 6
5
9
1
"
"
"
$
$
"
$
!
#
# $
"
$
*
&
"
"
"
!
"
%
"
"
*
.
"
"
"
%
ainsertion
%
&
%
!
&
"
"
%
& %
*
"
!
3
#
-
&
&
! &
*
! 2
! "
ainsertion
%
%
merge
%
"
"
"
&
"
!
"
! &
$
! 2
"
&
"
&
%
9
"
& %
& )
*
&
"
"
*
"
$
merge, o 0
0
"
&
#
"
%
&
&
& &
"
&
2
"
"
"
"
&
&
&
#
?
!
"
%
#
&
"
&
"
ainsertion
"
&
%
& %
&
&
"
& ) &
3 &
ainsertion
"
#
$
"
5
)
#
$
&
"
%
! 0 &
#
5
<
&
:
=
& %
& &
+
+
>
"
&
&
&
*
#
"
2
#
&
"
*
"
!
"
%
*
,
"
&
"
"
#
+
#
+
&
"
"
#
+
&
' &
!
"
%
2
#
&
)
!
"
%
#
"
%
"
' &
!
"
%
mergesort
*
(
/* Função de junção no lugar baseada em ainsertion. Args: a â&#x20AC;&#x201C; colecção a ordenar, constituĂda por 2 subcolecçþes garantidamente ordenadas. A subcolecção direita começa em m. n â&#x20AC;&#x201C; nĂşmero de elementos em a m = n/2
*/
void poor_merge_in_place(type* a, int n, int m) { int i, j; type t; for(i=m; i<n; i++) { t=a[i]; for(j=i; j>0 && less(t, a[j-1]); j--) a[j]=a[j-1]; a[j]=t; } }
#
ainsertion
"
mergesort
"
"
"
#
"
!
"
%
"
merge_in_place
!
"
&
#
"
&
%
&
,
! "
n
#
7. Quicksort >
"
%
$
!
"
"
"
! 0 &
"
0
%
! &
"
quicksort
#
#
#
&
#
"
&
"
quicksort
>
%
$
#
"
" %
&
"
)
"
3
"
#
$
&
0
3
!
"
3
"
%
quicksort
&
,
3
"
"
& "
*
quicksort,
! & "
&
>
-
*
#
,
#
"
3
"
"
$
"
"
&
0 &
&
& %
*
"
&
"
,
*
&
5 4 5
+
3
:
#
+
&
#
"
*
#
"
#
%
>
3
= :
>
"
&
#
$
0
"
"
quicksort
"
"
*
&
&
&
"
&
(
#
(
%
"
*
&
/
"
&
&
%
/
#
&
"
2
&
"
"
&
#
,
"
*
*
&
!
$
$
"
$
"
$
3
&
0
&
"
"
"
%
&
! "
"
"
"
"
#
5 7
&
"
&
& 2
$
"
&
5 <
*
=
"
#
?
"
"
! "
:
"
: =
:
&
"
&
-
#
%
*
$
3
&
$
!
&
'
&
&
3
*
&
0
"
$
$
#
#
%
&
- ) "
-
&
$
p
#
.
"
.
.
"
*
0
"
%
-
"
%
.
#
*
"
$
"
&
*
#
'
&
& &
/
/
$
"
& "
"
"
"
*
*
p
0
$
"
&
"
(
&
#
!
& &
$
&
&
"
#
>
"
! &
(
"
?
>
*
&
*
*
*
"
*
$
&
&
"
*
$
"
p
$
$
"
! &
p
"
%
"
&
) "
&
"
&
$
%
" %
"
(
%
! "
$
#
&
3
&
"
#
p
&
& "
0
*
"
#
"
p
"
%
*
*
&
&
" %
0
"
&
"
"
"
#
"
2
#
*
"
&
"
,
%
>
%
& '
-
! "
$
&
"
%
.
"
"
&
! &
"
"
& %
3
$
&
"
$
& %
"
#
(
#include â&#x20AC;&#x153;type.hâ&#x20AC;? void quicksort(type *a, int n) { int i; if (n < 2) return; i = partition(a, n); quicksort(a, i); quicksort(a+i+1, n-i-1); }; int partition(type *a, int n) { int i, last=0; swap(a[0], a[rand() % n]); for(i=1; i < n; i++) if (less(a[i], a[0])) swap(a[i],a[++last]); swap(a[0], a[last]); return last; } +
"
%
! "
"
5 6
*
=
&
= = :
5
%
<
3
"
"
)
*
"
"
*
&
"
&
"
-
) &
$
"
$
& 0
&
$
. #
&
2 "
#
3
#
&
"
"
&
-
.
"
'
"
#
$
"
0
3
"
"
%
,
$
"
"
"
'
$
3
(
+
#
?
&
"
?
&
"
#
&
#
#
2
*
*
a[r2l]
*
p
a[l2r],
*
"
-
a[n-1]
"
%
*
*
!
p
3
)
a[0]
. #
3
"
&
"
"
$
3
"
&
"
"
$
#
*
p
#
$
%
&
#
,
!
$
"
"
"
&
%
'
&
$
>
&
+
"
&
"
"
%
"
2
"
"
&
(
*
"
l2r
*
) "
&
"
l2r
r2l
%
&
2
-
#
%
.
"
$
p
$
3
$
&
&
#
(
+
&
"
"
!
!
"
"
"
0
*
(
int partition(type *a, int n) { int l2r=-1; /*left to right index */ int pp=n-1; /* pivot position */ int r2l=pp; /* right to left index */ for(;;) { do ++l2r; while(less(a[l2r], a[pp])) ;
a[l2r] == a[pp]
"
%
& &
0
*
l2r
"
%
&
do if(--r2l < 0) break; while(less(a[pp], a[r2l])); if(l2r >= r2l) break; swap(a[l2r], a[r2l]); }
swap(a[pp], a[l2r]); return l2r; }
5
5 < = <
"
)
!
*
quicksort
&
"
3
"
a[0] a[1]
.
"
"
a[i+1] a[i+2]
$
"
"
&
"
"
"
.
#
a[i]
"
< 9
.
"
! &
"
!
n
&
"
)
0
"
&
&
%
"
#
! "
)
$
+
n/4
$
$
&
"
%
=
"
i
"
&
#
"
n-1
&
3
&
(
"
*
- &
a[i]
*
&
n/2
+
#
"
#
! *
%
%
"
+
%
&
a[n-1]
+ +
# # # $
&
"
$
a[i-1]
# # # $
!
&
$
$
2*n/2 "
"
%
#
n/2
a[i]
&
#
& %
.
#
"
& &
&
"
&
"
n
! &
$
&
&
"
)
&
%
&
& %
"
!
"
&
&
"
(
&
=
Î&#x2DC;
"
$
n
+Î&#x2DC;
<
"
&
%
"
"
)
"
)
#
*
&
#
?
#
&
$
$
"
3
"
?
n
3
#
#
"
)
"
"
%
#
?
&
n-1
"
&
& %
#
n
#
$
&
n
&
"
"
Î&#x2DC;
*
&
"
*
&
&
%
"
3
"
&
'
n
"
#
1
2
$
$
"
$
"
&
%
$
&
%
&
n
0
"
&
(
<
&
"
"
$
!
&
&
=
!
&
&
"
"
& %
n
$
#
+Î&#x2DC;
"
0
â&#x2C6;&#x2C6;
"
*
. $
$
*
"
$
%
3
n
"
"
2 0
*
&
)
"
#
&
"
&
&
%
"
%
&
"
%
<
"
$
"
-
3
(
1/n!.
"
â&#x2C6;&#x2019;
&
+Î&#x2DC;
"
"
"
%
3
=
'
&
quicksort
%
&
*
$
"
#
!
n
n
"
Î&#x2DC;
?
%
0
0
&
*
&
&
=
#
%
& & 2
"
&
"
&
& %
3
+
*
&
!
n
n
>
n
#
"
!
&
0
- "
'
"
n
"
&
*
"
$
n
%
#
*
$
!
0
&
"
*
?
&
"
#
&
"
"
3
" .
3
&
"
$
$
"
"
"
&
"
"
%
#
<
"
< 9
=
)
<
;
< =
&
<
< 9
*
&
=
%
*
,
)
*
"
"
"
&
)
*
"
! & "
$
&
'
2
#
&
"
0
3
%
! & "
*
"
!
&
&
"
3
"
&
*
*
&
"
3
#
"
%
,
&
"
"
! & "
"
&
&
*
"
#
,
"
!
"
quicksort
%
(
if ( n< 2 ) return;
"
if ( n < C) ainsertion(a,n); "
&
*
!
&
>
&
) &
&
&
"
$
C
"
%
*
3
& ) &
$
%
"
"
! *
"
"
#
&
$
&
&
&
*
"
3
*
(
void quicksort(type *a, int n) { if (n < C) return; /*â&#x20AC;Ś*/
#
};
"
&
&
#
$
+
&
ainsertion
& %
#
+
"
&
$
& %
&
&
"
3
& 2
*
"
quicksort
$
! & "
"
!
! &
"
%
&
$
(
void hsort(type *a, int n) { quicksort(a,n); ainsertion(a,n); };
#
#
#
"
&
! &
"
#
"
>
&
"
"
<
-
&
"
"
"
5
#
+
9
<stdlib>
5
quicksort
=
&
#
0
"
#
&
"
=
"
& %
$
"
$
"
!
=
0 &
'
%
$
3
3
"
"
#
&
mediana{1, 8, 4}=4; mediana{1, 1, 8}=1
<
(
"
6
9
&
:
<
.
<
&
"
&
"
"
:
& %
+
"
&
"
*
! &
%
"
"
p=mediana{a[0], a[n/2],a[n-1]}
"
< 9
$
3
$
#
& ) &
$
*
"
#
"
"
"
!
"
%
qsort
"
"
"
%
#
!
"
"
qsort
%
#
*
*
&
%
)
"
"
&
"
*
void*
"
2
*
*
! "
$
*
!
"
%
"
&
!
"
"
%
%
&
!
"
"
%
#
qsort
%
(
#include <stdlib.h> #include <stdio.h> int intcmp( const void *p1, const void *p2) { int i = * (int *)p1; int j = * (int *)p2; if (i <j) return â&#x20AC;&#x201C;1 ; else if (i==j) return 0; else return 1; } int main() { int i; int a[] = {0, 1, 8, 5, 4}; qsort(a, sizeof(a)/sizeof(int), sizeof(int), intcmp); for(i=0; i <n; i++) printf(â&#x20AC;&#x153;%d â&#x20AC;&#x153;, a[i]); return 0; };
"
!
5
&
5
< 9
"
:
&
=
: 9
: =
*
*
"
%
$
#
?
$
'
5
&
"
"
#
"
<
%
*
"
*
$
%
%
3
"
' &
*
"
*
:
*
"
&
&
$
&
"
%
*
&
&
3
#
?
"
&
& "
0
"
$
'
#
"
#
#
=
"
(
?
#
&
.
.
"
%
#
#
$
"
-
#
-
"
*
"
5
&
0
&
&
*
"
&
*
*
"
&
%
&
0
&
*
&
&
&
"
(
#
&
#
"
"
& %
)
0
& "
&
"
/
& "
&
#
%
! *
"
#
%
) &
*
&
$
#
>
"
"
*
&
&
"
"
"
%
&
& %
#
&
&
3
"
%
"
%
%
$
"
#
!
"
) &
%
"
,
#
#
%
&
0
"
&
*
"
&
!
$
"
"
%
"
%
"
"
&
&
& %
#
,
&
&
"
#
>
*
&
"
&
#
*
&
&
"
"
"
%
"
"
&
$
$
%
&
&
&
0
&
*
"
$
!
"
%
#
#
*
#
#
&
*
&
"
"
"
"
&
*
*
%
p[0] p[1]
"
2 %
"
$
&
"
2
3
$
"
p
&
"
& "
%
"
$
"
a
"
"
"
"
N
"
"
&
&
%
&
0
&
#
%
&
0
&
&
&
#
"
#
"
"
!
"
%
"
!
"
quicksort
%
"
"
"
"
*
"
"
"
a
$
a
(
$
# # #
p[N-1]
#
!
%
"
"
"
"
"
"
"
&
"
"
& %
#
&
a
#
&
*
&
"
$
#
,
8. Introdução às listas ligadas >
"
%
"
%
& 0
!
&
"
#
! &
&
0
&
&
"
&
#
"
%
&
%
?
"
#
& %
-
"
"
$
"
"
$
"
.
&
"
*
"
&
"
$
#
"
*
*
# $
>
#
"
! & "
"
.
0
2
-
"
"
"
*
"
"
!
3
!
"
! & "
"
& 0
"
"
0
$
"
0
%
&
"
"
%
#
?
&
! "
*
& &
*
/
"
#
#
-
#
#
"
%
*
.
$
&
" "
$
"
- "
%
"
#
"
+
#
"
"
"
"
$
0
-
*
"
#
3
"
"
"
.
"
#
"
%
!
"
&
"
)
/
&
"
"
"
%
"
2 "
"
"
&
"
! 2
!
"
0
&
"
0
"
" $
&
&
"
)
&
&
"
!
"
%
"
"
$
"
&
"
0
%
$
" &
'
&
$
#
'
&
0
#
"
*
"
"
&
& "
0
"
"
%
.
&
! &
$
& &
5 4 5
%
: =
=
&
"
= :
< =
"
"
<
< 9
"
$
"
:
$
#
"
3
3
$
3
! "
"
#
=
&
$
&
& %
"
'
*
&
"
'
,
&
1
+
"
3
#
&
&
!
"
"
$
:
$
$
%
%
%
#
?
"
"
'
#
$
$
& &
2
2
3
"
3
!
&
*
"
(
"
'
"
"
$
&
&
"
'
#
$
*
"
"
(
/
"
"
'
3
"
"
"
/
'
/
"
'
#
(
/
"
$
"
.
& "
$
$
: 9
"
2
&
<
-
#
"
&
&
! &
"
&
!
"
"
"
"
'
"
2
"
'
"
/
/
/
/
/
$
/
$
&
& "
0
&
&
!
/
#
"
"
*
&
"
"
*
"
%
&
"
"
"
%
'
"
"
'
5 6
5
?
"
:
$
< :
"
&
=
:
%
<
< 9
< =
! "
;
"
*
!
"
$
&
& & 2
&
"
'
(
,
struct node {
#
int item; struct node *next; }; +
&
! "
&
"
#
"
"
$
& "
"
struct s {
*
3
3
%
'
$
&
"
node
%
"
! "
&
)
+
&
#
>
>
*
&
*
*
"
next
! "
"
&
%
$
&
'
*
"
node
#
>
#
?
s
$
"
%
3
)
s
$
*
(
int i;
struct s ss;
+
};
"
#
node
& '
*
*
2
! "
typedef int type
2
"
&
& '
/
-
! *
*
&
type
"
"
"
. #
&
"
*
! "
! & 0
"
$
*
list_pointer node_pointer
$
"
%
link
$
&
&
%
,
&
"
(
?
#
%
&
"
0
! &
struct node * $
"
struct node
0
$
#
&
"
& 2
$
&
#
(
typedef int type;
typedef struct node* link; struct node {type item; link next; };
!
"
%
*
&
"
*
'
$
"
"
(
"
,
3
& '
#
" %
3
*
0 &
*
&
3
(
#include <stdio.h> #include <sdtlib.h> typedef int type; typedef struct node* link; struct node { type item; link next;} ; void f() { link first, second, ptr; first= (link) malloc(sizeof *first); if ( ! first) { fprintf(stderr, "Memรณria insuficiente"); exit(1); }; second= (link) malloc(sizeof *second); if ( ! second) { fprintf(stderr, "Memรณria insuficiente"); exit(1); };
first->item=3; first->next=second; second->item=1; second->next=NULL; printf("Neste momento a lista contĂŠm:"); for( ptr=first; ptr; ptr=ptr->next) printf("%d \n", ptr->item); free(second); free(first);
/* equivalente a free(first->next); free(first); */
-
}; +
!
"
0
5
%
&
#
!
#
#
<
!
& %
)
$
&
3
"
&
"
#
5
"
.
*
!
"
"
"
#
:
=
f
%
second
"
%
f
&
&
!
first
!
"
%
"
& "
NULL
%
"
"
'
$
#
# $
#
&
"
'
&
"
'
/
"
9. Primeiras noçþes de Projecto e de Projecto por Contrato
&
!
"
&
"
&
f()
"
%
"
"
&
0
)
*
#
"
5 4 5
"
&
,
*
*
&
"
&
"
'
)
&
"
! &
#
*
"
& '
+
"
"
&
%
$
(
#
*
%
$
"
<
"
*
"
&
#
<
& '
&
"
+
"
"
3
%
,
"
"
"
!
"
3 &
%
&
3
3 &
) "
"
0
!
!
"
#
! 0 &
'
&
&
"
"
&
#
#
$
&
&
&
&
"
0
"
0
#
"
&
&
"
&
!
%
"
&
*
! 0 &
#
>
&
"
"
#
0
"
$
+
$
"
!
"
)
!
$
"
!
2
"
&
%
"
2
3
*
.
3
$
"
&
"
"
"
&
?
"
&
1
&
"
$
"
*
&
"
& '
!
"
&
"
"
*
! "
"
#
!
"
0 &
&
$
"
%
%
&
#
!
3
$
#
$
&
0
%
%
!
"
!
"
&
&
" "
$
#
"
&
"
%
"
0
%
&
"
2
"
)
&
%
&
"
-
*
"
2
"
- #
%
.
%
%
& &
0
!
"
/
&
"
. /
/
0
# $
/
/
/
/
%
& %
%
"
%
"
!
"
!
&
& & 2
!
! &
2
&
&
"
"
&
%
2
2
!
*
&
"
$
(
*
"
&
! ) &
! &
"
$
"
"
$
*
&
"
-
0 &
&
>
!
%
"
&
(
3
"
"
&
%
$
"
/
&
"
&
!
"
%
/
&
!
"
"
"
"
%
2
3
"
&
!
&
/
%
)
#
,
"
"
! & %
&
&
&
"
"
#
+
>
&
"
&
%
?
$
$
%
"
!
"
&
5 7
$
5 :
?
"
$
$
"
"
"
&
0 &
"
0
&
&
!
#
"
*
)
"
"
!
! 2
$
&
"
*
%
%
&
%
< =
) &
<
"
&
*
#
$
*
$
"
&
"
$
"
&
"
"
$
"
*
#
"
+
&
'
%
"
*
"
&
"
!
0
'
&
%
$
2
#
&
"
"
2 %
&
& %
%
"
&
"
"
&
!
"
+
!
#
2
%
3
2
&
! &
&
3
&
#
#
&
&
! *
"
"
#
>
,
"
"
&
*
*
2
&
& '
$
2
*
&
"
"
&
'
"
"
! &
%
!
"
$
"
&
"
& "
&
)
"
%
"
*
%
*
"
"
&
"
!
"
'
"
'
)
)
#
?
#
%
#
!
?
"
&
!
&
"
"
"
$
%
"
#
$
&
"
5 4 5
"
5 7
&
&
&
!
"
%
&
$
!
"
"
! "
$
"
"
#
# $
"
%
%
#
?
"
&
<
%
!
"
=
3
! "
%
"
"
3
"
&
&
"
"
&
$
#
3
!
!
%
:
&
!
"
< =
!
< 9
3
"
"
&
9
&
3
"
! "
(
&
#
!
"
$
#
>
!
!
"
"
3
$
"
"
"
!
"
2
"
$
$
#
$
&
&
&
#
>
"
&
"
"
!
#
%
"
"
!
!
&
"
"
$
#
# $
!
#
"
$
!
"
%
&
!
"
%
#
+
$
&
"
(
A() { /* â&#x20AC;¦ */ y = B(x); /* â&#x20AC;¦ */
}
"
&
"
"
,
&
"
(
>
&
"
!
"
"
& "
"
&
& %
"
*
&
"
)
5 6
5
"
&
)
: =
"
%
&
!
"
%
"
&
2
#
<
!
9
:
*
=
<
IR
&
&
"
"
&
& %
"
#
"
â&#x201E;&#x153;
*
"
&
"
#
main A
n
n
callocf
A
d
A, B, n
ler
A
d
distn
printf
free
d
sqrt
calloc
"
!
"
"
*
"
"
%
*
&
?
-
2
!
"
%
&
#
&
.
'
"
*
&
*
&
&
"
"
" %
"
&
"
!
B
"
#
&
$
"
"
)
"
$
"
"
& %
#
&
#
#
5
5
>
! &
2
=
"
<
< =
"
:
"
<
"
! &
$
"
%
$
&
0
"
$
#
2
! &
9
! &
! &
& & %
& ! &
#
2
&
&
"
%
$
"
! &
%
&
"
! &
&
& %
#
)
! &
$
&
!
& %
3
$
*
"
$
"
â&#x2C6;&#x2019;
&
â&#x2C6;&#x2019; â&#x2C6;&#x2019;
"
)
3
"
"
! &
&
"
$
"
&
"
"
*
"
"
! &
& "
&
%
%
-
%
$
0 & .
"
&
"
! &
&
#
! &
3
& %
%
#
&
&
&
2
$
(
2
%
&
0
*
"
%
&
"
&
"
"
!
&
&
"
& "
"
&
&
*
"
"
"
2
$
"
&
"
! 0
"
#
#
! &
"
"
&
&
! *
"
"
)
&
(
,
?
"
+
#
2
! &
#
&
"
&
&
(
&
&
*
&
"
&
/
!
(
&
&
*
"
!
/
â&#x2C6;&#x2019;
+
"
! &
-
*
&
&
"
"
5
$
5 4 5
&
*
&
"
"
>
+
+
&
"
*
2
< 9
"
$
(
&
$
. (
&
&
*
/
! &
"
*
&
%
%
0
"
#
&
&
"
*
"
!
&
$
'
& )
2
&
"
"
"
$
&
$
"
& "
& %
"
&
$
0
2
"
!
&
"
*
#
>
& #
!
"
"
)
!
&
&
&
& ! & %
"
.
*
2
"
*
-
&
&
"
"
&
#
>
*
&
#
%
"
"
(
"
%
&
&
%
%
&
& 0
!
&
/
%
!
"
"
!
/
*
3
#
&
"
&
'
! &
"
%
#
&
"
!
&
$
*
$
3
&
"
#
,
+
"
&
0
&
%
*
"
"
!
"
#
%
?
*
"
"
"
$
!
"
%
"
%
"
*
(
&
&
!
"
%
$
$
$
&
*
"
#
"
&
$
! "
"
"
*
3
"
"
!
"
%
!
"
!
#
"
$
$
3
$
&
"
"
"
"
"
"
!
"
"
(
%
!
"
3
"
&
0
$
! & "
"
"
"
!
"
/
?
!
%
&
#
"
& .
&
0
"
>
!
$
$
"
&
"
*
& "
$
&
$
"
&
&
"
"
"
"
!
"
"
#
+
&
!
$
"
&
&
"
"
$
"
#
+
"
&
-
!
& "
#
&
#
3
$
!
"
"
&
*
&
5
5 7
5
%
!
>
*
&
"
&
&
"
! &
$
"
< =
"
! "
&
&
!
%
"
&
&
"
"
%
(
#
$
&
"
"
"
!
%
)
#
"
2
"
$
$
"
& & "
"
"
&
&
$
%
!
%
"
"
"
"
0
)
"
$
&
& "
"
&
& "
$
"
&
&
"
&
'
! &
"
!
%
!
&
%
"
%
"
&
2
& "
"
$
&
(
!
#
& & 2
"
"
&
#
%
"
"
"
&
&
"
$
%
&
#
?
"
&
5
"
"
&
"
"
9
:
"
"
"
:
"
) &
!
!
<
%
"
"
"
"
&
.
<
=
&
"
*
)
#
%
*
"
"
&
&
%
2
&
"
&
"
"
%
&
&
"
#
!
"
&
#
"
!
!
"
#
$
&
$
&
$
*
0 &
*
&
#
&
"
*
$
<
) &
2
"
"
"
"
#
*
*
"
:
"
0
&
!
2
! "
"
"
"
"
"
&
0
&
0
!
%
"
! "
2
'
&
#
"
&
"
! "
&
%
/
&
: 9
'
:
9
!
&
:
=
:
0
: 9
*
(
:
%
< =
!
9
"
3
)
!
:
&
"
"
?
"
) &
"
5 <
-
%
"
"
<
$
!
:
"
:
:
"
!
$
! "
!
"
&
3
! "
&
"
"
#
!
"
%
#
&
"
$
#
"
%
"
%
<
!
"
"
%
!
$
$
"
&
0
"
&
"
*
#
5
5
&
3 & "
"
&
"
?
& "
<
"
9
&
3 & "
&
&
"
#
&
$
3
"
) &
"
"
-
%
$
& ! #
.
!
%
$
"
"
*
"
"
&
#
+
3 & "
&
"
"
%
#
3
!
%
,
0
&
"
"
!
!
#
&
"
#
#
#
"
$
"
&
$
%
&
"
%
%
"
'
0
! &
&
!
*
3
3 & "
"
%
&
3
3
& "
?
&
'
%
&
3
"
"
%
%
#
$
*
2
#
&
&
*
,
! &
"
"
*
"
"
0
"
&
"
&
*
'
& "
&
"
!
! 2
#
&
. $
y = log(x)
$
"
%
%
3
(
#
&
!
- *
&
&
&
"
&
) ! &
"
$
"
log
%
*
&
*
"
&
"
& "
"
'
"
&
"
&
#
"
%
%
*
!
!
*
) &
(
2
$
"
#
&
"
%
"
%
$
!
0
%
"
?
3
"
"
#
#
"
&
*
%
& '
&
x>0
"
3
3
&
%
3
! &
"
%
0
) &
- *
3
*
. #
#
! &
'
,
&
'
"
#
%
&
#
"
&
$
"
'
$
&
& "
"
%
*
!
"
%
"
! 2
ey==x,
"
e
3
&
&
"
&
"
! "
%
& "
3
"
"
#
*
"
3
"
'
& "
%
#
"
"
'
!
"
&
"
%
&
!
"
"
%
- !
"
*
&
2
! "
. #
>
%
& "
(
"Eu, função fulana de tal, comprometo-me a fornecer um estado final em que a pós-condição estå satisfeita, se e só se for chamada com a prÊ-condição satisfeita"
?
?
&
3
&
$
$
"
$
3
"
&
#
?
"
&
*
!
"
"
!
*
(
$
"
%
!
"
%
! &
"
#
*
%
"
!
"
!
3
2
& "
&
"
&
%
"
&
&
&
"
"
0
&
3
1
!
%
& ! &
"
&
"
"
&
0
"
*
& '
& '
3
*
"
*
! &
'
"
2
& "
#
&
#
(
x = a*a + 1; /* x > 0 jĂĄ que ĂŠ a soma de 1 com uma quantidade positiva ou nula */ y = log(x);
"
&
&
"
3
"
! &
! & %
& '
,
!
"
$
&
"
*
"
&
$
#
2
*
!
"
%
,
"
&
!
*
"
%
*
$
3
& "
%
0
!
$
"
%
0
"
&
#
*
&
3
$
&
&
!
"
"
3
"
"
"
"
#
>
"
?
!
*
"
"
%
(
!
0
"
&
%
0
"
*
&
! 2
&
&
&
- &
"
"
%
& ! &
*
"
. /
&
&
"
. $
!
+
*
#
>
&
$
*
"
"
%
/
%
2
0
$
"
#
&
!
0
%
%
& "
"
3
"
&
*
"
%
&
"
"
& %
"
!
!
"
!
- ! "
%
"
&
2
2
!
"
#
#
!
"
*
"
%
)
$
#
(
%
&
*
%
0
?
&
"
!
"
%
3
0
&
&
"
%
%
3
*
"
3
& "
%
3
"
"
0
&
"
'
!
"
- !
"
/
%
*
/
! 2
. /
%
'
&
"
%
3
"
"
!
"
%
/
,
"
&
*
&
#
>
& '
$
& "
!
"
%
&
$
"
&
"
!
"
%
&
'
&
" 0
*
$
3
(
/*
Retorna o item do primeiro nó do argumento, list. PrÊ-condição: list != NULL
*/
type lsthead(link list) { return list -> item;
}
str
*
$
&
"
>
0
&
*
"
"
"
"
2
&
"
! "
$
*
$
!
$
& "
"
*
"
?
"
assert.
!
&
%
"
*
& "
! &
"
!
"
lst
#
"
$
*
!
%
&
"
"
%
"
"
%
#
&
+
"
$
!
"
"
& "
(
#include <assert.h> type lsthead(link list) { assert(list != NULL); /* ou simplesmente assert(list); */ return list -> item; }
! &
&
%
"
%
&
"
#
'
assert
&
&
&
!
"
& %
$
$
! &
! & %
0
"
%
*
0
0
#define NDEBUG "
5
5
#include <assert.h>.
#
'
<
:
=
"
*
%
*
"
&
&
#
.
"
2
%
&
#
?
*
!
"
%
&
"
%
#
.
?
*
"
%
"
"
#
! *
& "
"
10. As listas ligadas revisitadas
!
"
&
&
"
"
*
$
"
$
NULL
0
"
"
"
! &
$
&
&
"
'
3
"
"
,
"
$
#
!
#
2
"
?
"
*
3
"
!
"
& '
0
)
-
0
.
*
&
"
2
#
! &
"
#
"
%
#
$
,
"
&
sllist.h
! &
â&#x20AC;˘
â&#x20AC;˘
â&#x20AC;˘
â&#x20AC;˘
& '
! &
&
#
& %
+
"
0
"
!
%
"
&
!
#&
$
"
&
! &
)
%
"
"
&
sllist.c
"
$
*
#
!
!
"
!
"
%
"
%
&
"
$
&
"
0
" #
!
"
&
?
"
&
?
3
'
+
>
&
&
& "
"
"
! &
(
/
/
(
'
-
"
$
"
"
.
!
"
%
#
â&#x20AC;˘
+
"
sllist.h
$
$
&
! &
"
"
0
â&#x20AC;˘
sllist.c
&
$
â&#x20AC;˘ â&#x20AC;˘
?
3
'
+
â&#x20AC;˘
+
â&#x20AC;˘
&
"
o
$
& 0
!
"
%
$
3
#
+
! "
%
"
!
$
%
"
&
&
(
!
"
!
"
%
&
"
/
"
! &
(
/
"
"
! &
/
" %
$
"
*
"
%
"
/
"
%
/
?
&
?
<
%
9
5 4 5
"
&
"
0
!
o
! &
"
& %
â&#x20AC;˘
â&#x20AC;˘
4
<
$
! &
0
"
%
$
"
/
0
3
#
< :
=
sllist.h
"
"
/
"
&
0
"
)
sllist.c
typedef int type; typedef struct node* link; struct node {type item; link next;}; /* PRE: plst != NULL POS: Retorna o item do primeiro nĂł da lista argumento, apontada por plst. */ type lsthead(link plst); /* Altera o valor do item do primeiro nĂł da lista identificada
pelo argumento plst, com o valor do segundo argumento t. PRE: plst != NULL POS: plst->item == t */ void lstsethead(link plst, type t);
/* PRE: plst != NULL POS: Retorna a cauda da lista referida por plst. */ link lsttail(link plst);
/* Verifica se uma lista está vazia. POS: Retorna 0 se plst != NULL, retorna 1 caso contrário */ int lstempty(link plst);
/* Retorna o comprimento de uma lista identificada por plst, i.e., retorna o nº de nós da lista. */ int lstlen(link plst);
/* Insere um nó à cabeça dada lista identificada por ptr_link. O item do nó inserido tem o valor t. PRE: ptr_link != NULL POS-CONDIÇÃO fraca: *ptr_link != NULL POS-CONDIÇÃO forte: *ptr_link == newnode, onde newnode é o nó criado para guardar o valor t. Excepção: Se não houver memória suficiente para criar um novo nó, a função escreve uma mensagem de erro e aborta o programa.
void lstinsert(link *ptr_link, type t); /* Retorna um link para um novo nó. O novo nó tem como item o valor do argumento t e como next o valor NULL.
POS (fraca): o valor retornado Ê != NULL. Excepção: Se não houver memória suficiente para criar um novo nó, a função escreve uma mensagem de erro no stderr e aborta o programa. */ link lstnnode(type t);
/*Troca as caudas das duas listas argumento pl1 e pl2 PRE: (pl1!=NULL) && (pl2!=NULL) POS: pl1->next = lsttail(old pl2); pl2->next = lsttail(old pl1); */ void lstswaptail(link pl1, link pl2);
/* Remove o 1Âş nĂł da lista identificada pelo argumento plink, libertando o bloco de memĂłria respectivo. PRE: (plink != NULL) && (*plink != NULL) POS: *plink = (old *plink)->next */ void lstremovehead(link *plink);
/* Remove todos os nĂłs da lista; liberta toda a memĂłria que a lista utilizava. A lista ĂŠ identificada por p_link, um ponteiro para link. PRE: plink != NULL POS: *plink== NULL */ void lstremove(link* plink);
+
,
!
3
"
&
!
%
&
"
3
2
%
&
3
*
&
&
"
"
&
-
"
& "
) "
"
&
&
3
&
&
"
"
'
.
%
&
" 0
*
2
#
&
*
!
"
%
$
%
!
$
"
2
#
*
&
%
$
3
2
$
*
*
"
"
$
"
%
,
&
"
&
%
&
%
3
"
! &
"
&
"
! 2
! "
! &
4
5 7
"
)
! &
"
5
2
<
< 9
0
"
<nome>
"
<
"
9
;
<nome>
!
"
%
&
#
+
#
>
3
"
< =
$
3
:
&
"
"
%
*
%
#
=
#include "sllist.h" #include <stdlib.h> #include <stdio.h> /* Descrição: Retorna o item do primeiro nĂł da lista argumento, referida por plst. Estrutura de dados usadas: NĂŁo se aplica Algoritmos usados: NĂŁo se aplica Argumentos: plst â&#x20AC;&#x201C; ponteiro para o primeiro nĂł da lista; PRĂ&#x2030;-CONDIĂ&#x2021;Ă&#x192;O: plst != NULL Primeira versĂŁo: <nome e email do programador> - <data> Alteraçþes: { <Descrição> - <nome e email do programador> - <data> } */ type lsthead(link plst) { return plst -> item; } /* Altera o valor do item do primeiro nĂł da lista argumento plst, com o valor do segundo argumento t. PRE: plst != NULL POS: plst->item == t */ void lstsethead(link plst, type t) {
#
'
plst -> item = t; } /* POS: Retorna a cauda da lista referida por lst. PRE: plst != NULL */ link lsttail(link plst) { return plst -> next; } /* POS: Verifica se uma lista estĂĄ vazia. Retorna 0 se plst != NULL, retorna 1 caso contrĂĄrio */ int lstempty(link plst){ return !plst; } /* Insere um nĂł Ă cabeça da lista identificada por ptr_link. O item do nĂł inserido tem o valor t. PRE: ptr_link != NULL POS-CONDIĂ&#x2021;Ă&#x192;O fraca: *ptr_link != NULL POS-CONDIĂ&#x2021;Ă&#x192;O forte: *ptr_link == newnode, onde newnode ĂŠ o nĂł criado para guardar o valor t. Excepção: Se nĂŁo houver memĂłria suficiente para criar um novo nĂł, a função escreve uma mensagem de erro e aborta o programa. */ void lstinsert(link *ptr_link, type t) { link tmp = lstnnode(t); tmp->next = *ptr_link; *ptr_link = tmp; }
&
*
*
&
3
"
$
&
&
0
"
0
"
"
%
*
&
" &
0
"
"
!
link
"
$
"
"
'
&
!
link*
#
"
lstinsert
%
&
"
&
#
link lstnnode(type t) { link tmp = (link) malloc (sizeof *tmp); if(!tmp) { fprintf(stderr,"lstnnode: Mem. insuf. \n"); exit(1); } tmp -> item = t; tmp -> next = NULL; return tmp; } /* Remove o 1ยบ nรณ da lista identificada pelo argumento plink, libertando o bloco de memรณria respectivo. PRE: (plink != NULL) && (*plink != NULL) POS: *plink = (old *plink)->next && o 1ยบ nรณ da lista foi libertado */ void lstremovehead(link* plink) { link tmp = *plink; *plink = (*plink) -> next; free(tmp); }
/* Remove todos os nĂłs da lista; liberta toda a memĂłria que a lista utilizava. A lista ĂŠ identificada por ptr_link, um ponteiro para link PRE: ptr_link != NULL POS: *ptr_link == NULL */ void lstremove(link *ptr_link) { while(*ptr_link) lstremovehead(ptr_link); } /*Troca as caudas das duas listas argumento pl1 e pl2. PRE: pl1 != NULL; pl2 !=NULL POS: pl1->next = lsttail(old pl2); pl2->next = lsttail(old pl1); */ void lstswaptail(link pl1, link pl2) { link tmp = pl1 -> next; pl1 -> next = pl2 -> next; pl2 -> next = tmp; }
% #
+ "
$
*
" # % $
! " #
$
%
$
& '
(
)
#
& '
lstswaptail
,
/* Retorna o comprimento de uma lista identificada por plst, i.e., retorna o nÂş de nĂłs da lista. */ int lstlen(link plst) { int n=0; for( ; plst; plst=plst->next) n++; return n; }
#
'
! " #
" % #
" #
# $
$
(
$
$
$ $
+
$
"
"
$
%
% *
$
#
% * ,
Uma lista simplesmente ligada Ê uma ligação nula ou uma ligação para um nó que contÊm um item e uma ligação a uma lista simplesmente ligada.
" #
%
%
$
#
&
%
$
*
$
$
$
#
%
%
&
"
$
"
"
% * (
" #
$
(
" %
#
" % #
$
$
#
% $ (
'
*
& '
$
%
% * (
& '
" #
#
"
%
" #
$
(
/* VersĂŁo recursiva */ int lstlenr(link plst) { if (lstempty(plst)) return 0; else return 1+ lstlenr(lsttail(plst)); } /* Liberta a memĂłria de todos os nĂłs da lista â&#x20AC;&#x201C; versĂŁo recursiva */ void lstremove( link l) {
(
if (!l) return; lstremove(l->next); free(l); }; /* Percorre a lista do princĂpio para o fim aplicando em cada nĂł a função passada como segundo arguemento */ void lsttraverse( link l, void (*visit) (link)) { if (!l) return; visit(l);
ou (*visit)(l);
lsttraverse(l->next, visit); };
%
$
$
%
&
"
& '
"
% '
$
$
#
$ ,
void f( link l ) { printf(printstring, l->item); printf(â&#x20AC;&#x153;\nâ&#x20AC;?); }; % * $
$ "
,
int main() { link l=NULL; /* â&#x20AC;Ś */ lsttraverse(l,f); return 0 ; };
f
&
" $
& '
%
#
"
$ *
! " #
#* $
% "
"
$
(
#
% *
+
*
%
& '
g
(
#include â&#x20AC;&#x153;sllist.hâ&#x20AC;? void g() { link list=NULL; lstinsert(&list,1); /*
*/
lstinsert(&list,3); /*
*/
lstprint(list); lstremove(&list); } "
%
"
$
& '
"
$
*
%
g
%
"
"
$
& '
# *
g
f f
" $
(
#
%
#
% $
%
&
$
#
$
% $
"
$ "
%
$
"
" #
& '
(
!
$
%
" &
&
$
"
#
# (
& '
$
$
*
#
$
*
* $
"
# (
#
#
$
& '
$
#
"
* #
%
$
$
*
#
$
&
$
#
% #
& '
$ (
*
" #
%
#
& '
%
&
#
" #
& '
%
# $
# $
# ,
#
+ "
&
#
" #
& '
,
%
# ,
#
+ "
& '
,
lstinsert(plst,2);
lstinsert(&plst,2);
#
$
#
%
&
"
! " #
" #
& '
*
$ & '
" &
*
% *
$
#
"
$
$ $
" # %
# &
$
#
" %
# $ (
$
#
#
$
# (
% $ (
%
*
" # %
$
%
% #
$
#
" #
#
&
out
$
%
$
$ & '
'
&
$
"
# % & '
,
$ $
#
$
$ $
#
(
l
" %
"
$
% $
max out
$
" #
#
#
l
$
$
max
%
% *
* #
!
$ $
(
$
max
%
&
(
l
*
! " #
%
& '
)
$
%
%
*
$ *
: l!=NULL max
$
#*
,
"
"
max
$
#
#
$
NULL
$
& '
max
(
$
(
*
%
&
$
#
'
& '
link lstfindprevmax( link l) { link prev=NULL, max=l; while (l->next) {
if (less(max->item, l->next->item)) { prev=l; max=l->next; } l=l->next; } return prev; }
%
$
%
"
#
$
%
#
$
$
& '
$ & '
,
,
link lstselection( link l) { link prev, max, out=NULL; while (l) { /* Aqui a prÊ-condição de lstfindprevmax Ê garantidamente satisfeita */ prev=lstfindprevmax(l);
/* Move o nĂł max da lista de entrada â&#x20AC;Ś */ if (prev) { max=prev->next; prev->next=max->next; } else {
/* o max ĂŠ o primeiro da lista */ max=l; l = l -> next;
} /* â&#x20AC;Ś para a lista de saĂda, out */ max->next=out; out=max; } return out; }
$
#
"
$
& '
$
! " #
"
$
*
"
#
%
% % #
%
&
" #
(
$
#
"
$
# $ (
"
"
"
NULL
" $
%
$
(
,
'
*
%
(
"
#
"
(
*
'
% $
%
#
# $
"
" %
"
"
#
*
$
#
$ %
%
#
plist
(
,
"
* & '
"
% % #
"
%
#
* %
"
#
$
# %
!
"
$
%
#
" %
$ $
$
*
"
"
$
*
'
(
" #
" #
& '
$
%
"
%
& '
# $
"
*
#
"
& '
$
#
% % #
,
/* Insere um novo nĂł identificado por pnode numa lista circular simplesmente ligada, imediatamente a seguir ao nĂł identificado por plink_last. plink_last ĂŠ um ponteiro para link, que aponta para o â&#x20AC;&#x153;Ăşltimoâ&#x20AC;? nĂł da lista. PRĂ&#x2030;: (pnode!=NULL) && (plink_last !=NULL) */
void clstinsert( link *plink_last, link pnode) { if (! *plink_last) {
/* lista vazia */
*plink_last=pnode; pnode->next=pnode; } else { pnode->next=( *plink_last)->next; (*plink_last)->next=pnode; } } # *
% $
clstinsert
$ " $
% $
*
$
$
" &
"
"
*
$
& '
$
$
& '
(
void clstinsert( link *plink_last, type t) { link pnode = lstnnode(t); if (! *plink_last) {
#
*
*plink_last = pnode; pnode->next = pnode; } else { pnode->next=( *plink_last)->next; (*plink_last)->next=pnode; } } /* Retorna o comprimento de uma lista circular simplesmente ligada */ int clstlen(link plist) { int n=0;
link tmp=plist; #
if (! plist) return n;
*
do { tmp = tmp-> next; n ++; } while(tmp != plist); return n; }
&
#
#
% % #
'
"
$ ! $
%
! %
%
(
)
$ %
# &
"
% %
" &
"
#
$
"
%
$ " #
"
#
"
"
#
$ $
!
"
$
$ #
*
%
%
& '
"
$
# (
%
#
$
#
! " #
$ $
%
# $ (
$
%
#
"
$
#
" #
% % #
$
$ " #
$
# $ (
,
typedef int type;
type struct node *link; struct node { link prev; type item; link next; }; /* ou struct node { link prev, next; type item; }; */
#
$ " #
# $
% % #
'
%
* %
'
$
"
#
$
% % # (
#
pn
,
pn == pn->prev->next == pn->next->prev.
%
$
"
#
#
"
$ " #
%
# $
"
#
"
$
$
"
"
$ " #
$ $
"
$
#
*
# $
%
"
$ " # %
$ #
%
% # $ $ (
#
$
"
#
#
$
"
(
$ " # %
%
" &
$
" # &
$
"
#
$
"
% $
% (
$
&
$
" & '
$ " #
*
# $ (
"
%
* & '
%
"
"
$
$
&
dllst
&
#
&
$ " #
#
# $
(
/*Remove de uma lista duplamente ligada o nĂł referido por pnode; PRE: pnode != NULL */ void dllstremove(link pnode) { pnode->prev->next = pnode->next; pnode->next->prev = pnode->prev; free(pnode); }
/*Insere o nó referido por pnode à direita do nó referido por *ptr_link de uma lista circular duplamente ligada PRE: (ptr_link != NULL) && (pnode !=NULL) */ void dllstinsertright(link *ptr_link, link pnode) { if(! *ptr_link) { /* lista vazia. Depois da inserção temos a configuração da figura*/ *ptr_link=pnode; pnode->next = pnode; pnode->prev = pnode; } else { /* lista tem pelo menos um nó.Ver figura abaixo. */ pnode->next = (*ptr_link)->next; (*ptr_link)->next = pnode; pnode->prev = *ptr_link; pnode->next->prev=pnode; } }
(
#
% $
$ *
$
% "
&
$
"
& '
$
#
# *
& '
" #
%
#
"
# $
$
$
$ $
(
$
(
(
% *
%
#
"
% *
" #
%
" #
(
# $
#
& '
# $
%
"
* '
%
"
"
% *
%
$ &
#
& '
% $
"
(
"
$
"
#
" #
& '
$
%
%
% $ ( "
(
#
$
"
$ &
%
"
$
"
*
$
!
"
"
$
#
(
% $ (
& '
/* Remove o 1ยบ nรณ da lista identificada pelo argumento plink, libertando o bloco de memรณria respectivo. PRE: (plink != NULL) && (*plink != NULL) POS: *plink = (old *plink)->next && o 1ยบ nรณ da lista foi libertado */ void lstremovehead(link* plink) (
% *
$
" #
"
"
% $
%
& '
$
$ &
(
$ *
$
"
#*
%
*
& '
"
$
%
"
%
$
%
"
( % #
"
%
(
(
$
% $
" #
$
*
/*
(
*
% *
$
& '
,
PRE: plist != NULL POS: mostra no ecrĂŁ todos os valores dos nĂłs da lista plist. */
void lstprint(link plist)
% *
" %
&
#
#
$
% $
" & '
$
% $
& '
%
lstapply
"
"
,
void lstapply (link plist, void (*fn) (link, void*), void *arg) $
%
" # %
plist
#
plist
"
% $
& '
$
"
arg
%
& '
&
$
%
#
$
%
fn
"
"
& '
"
(
lstapply
$
#
"
" #
& '
,
$
#
"
#
int lstlen(link plist)
$
% *
& '
$
$
#
*
"
$
$
"
plist
* #
(
#
$ (
(
" #
(
% *
%
# $ ( % #
& '
$
$ & '
"
#
# $
$
,
& '
%
%
*
"
"
% $
%
$ &
#
$
% % #
& '
" #
(
(
" #
(
#
% *
( " #
(
$
#
% '
$
$
$
$
"
$
"
"
#
% % #
(
# $
& '
$
% *
" # *
%
%
#
"
$
#
$
$ % $
"
# $ (
$ " #
# $ (
*
( % #
%
% $
% * (
"
$
#
+
"
%
!
$
$
$ &
,
+ $
"
$
"
int
"
#
$
"
%
%
"
$
$
$
*
#
"
$
$
$
# (
"
"
"
"
& '
*
(
#
"
"
& '
"
$
"
pf
pf
*
(
"
" #
"
! %
#
$
%
"
"
$ $
%
"
$
#*
#
+ *
$
+ $
* #
$
% % #
&
*
& '
"
$
$ $
$ " #
& '
$ " #
#
"
+ $
%
*
(
$
$ % $
&
" # * (
% % #
"
% % #
$
"
# $
( " # #
& '
& '
#
$
% % # (
" #
#
#
n
$
%
% & '
$
$
(
# $
(
%
$
$
% $
$
$
'
,
l
#
1
$
"
"
c
%
# ( + *
n-1
$ *
$ *
%
%
#
%
% #
$
$
"
$
#
%
#
# $
$
#*
$
$
$
#
% #% #
%
* #
$ *
$
(
%
(
n
"
%
"
(
$ *
"
$
$
* #
"
(
%
$
%
(
%
%
$ "
%
#*
#
$
! " #
"
#
%
"
% % #
(
%
"
"
#
$
$
%
$
&
$
#
"
% $
%
%
"
$
$
% "
% % #
%
"
#
" $
& '
# $
$
(
#
#
#
%
%
$
% $
* $
#
$ &
$ (
(
$
#
(
%
"
% % #
" (
" #
#
#
%
"
"
* *
#
# *
$
$
%
%
%
#
$
" #
#
$
%
%
$
$
%
$
& '
"
% % $
(
# $
*
& '
(
"
%
"
$ % $
#
#
%
% " $
+ *
"
"
*
n l c
"
$ *
$
# & '
$
#
"
& '
*
$
%
%
!
"
$
"
& '
"
(
$
$ (
"
% $
%
"
"
" $
#
"
$
% % %
$
$
(
"
$ *
(
"
$ % $
%
$
+
* '
"
! " #
&
#
$ *
$ (
"
#
(
#
! % & '
$
%
"
%
#
" #
" # & '
"
$ *
"
"
% % #
$
$ *
"
$
%
$
$
*
"
# (
$
$ %
% $
"
$ * $
$
"
* * (
,
"
"
$
"
! %
* * ,
%
"
$ ,
$
"
%
(
%
%
% #
%
$
$
! %
%
( (
11. Tipos de dados abstractos
"
$
%
" & '
+
" &
" &
#
"
$
"
$
* #
*
+
" #
%
"
" #
$
$
%
%
%
*
% % #
#
$
$ *
$
#*
"
$
$ $
"
*
$
" #
$ "
#
(
)
"
$
$ $
$
#
% #
'
"
# $
$
* #
$
%
$
*
$ % # & '
$
"
$
#
! " # %
$
#
$
#
* #
"
%
# % & '
% #
" #
$
"
" &
*
$
+
" &
% (
" $
'
& '
%
$
" & '
$
(
"
% #
*
$
$ $
$
"
# $ (
$ $
$
*
* #
$
$ $
% #
#
&
$ "
%
'
%
%
% #
"
* #
&
$
$
*
$
"
$
$
$
$ $
% #
" #
"
%
" #
% ( +
*
& '
& '
&
" #
$ $
$ "
$
%
#
" &
%
'
" %
$ # (
" #
& '
%
"
% #
(
! " #
%
"
#
"
$
%
"
'
#
# %
% # (
#
'
%
$ $
"
$
$
"
"
#
*
#
#
$
$
* &
$
*
"
* #
%
$ *
#*
(
&
$
'
&
$ % & '
$
$
# $
$
" & '
" #
$ "
#
#
"
+
%
# $
"
% % #
%
'
%
+
%
%
" $
$
#
$ " #
#
"
%
$
'
"
#
$
$
$
%
" #
$
#
#
$
&
%
'
(
%
"
(
$
+
$
" # %
<string.h>
#
%
% $
& '
$ %
$
*
* & '
%
% # (
(
# $
$
"
$
#*
% $
%
" # & '
$ *
" #
" # %
$
%
'
*
+
# *
*
" $
% $
$ %
%
" $ '
"
$
% $
(
" & '
$
% % (
$
! " #
#
# *
$
$
"
(
"
"
"
"
$
*
#
$
"
(
'
# $
! " #
% %
$
$ ! '
"
$
#
$ $
*
$
#
"
$
"
% #
" # & '
# $
" & '
* # *
$
(
*
$
"
$
#
$
%
! % & '
(
" & '
#
$ "
$
"
)
%
*
#
$ $
%
"
" $
" & '
#
%
'
"
$
% # (
% %
%
% #
$
$
% $ #
$
&
"
$
$
$
(
+
%
'
%
*
% $
#
% #
! " #
'
& '
$
'
+
%
% #
#
" & '
$
" & '
(
$ $
(
(
12. O tipo de dados abstracto pilha
" #
#
$
$ $
%
%
pop
%
"
'
$
n
#
%
" & '
$
(
& '
%
#
* #
%
$
%
"
&
$
"
#
n=0
$
" #
(
$
#
&
%
%
"
$
(
"
(
"
%
%
! " #
li 0<= i<n
#
$
! " #
" $
$ $ (
L=(l0,l1, ..., ln-1)
! " #
" #
" & '
$
"
*
" % #
&
$
& '
"
*
) #
%
"
%
%
% #
"
#
#
%
"
" #
)
#
(
!
#
%
nâ&#x2C6;&#x2C6;IN0
$ $
$
" & '
$
#
#
$ $
*
#
"
$ $
! % & '
$
$
$
! "
#
$
" #
$
* # & '
"
L=()
$
#
(
$
push
%
$
(
%
$ $
%
%
%
#
%
! " #
$
(
,
" #
$
"
%
% $
$
"
"
"
"
"
"
$
*
#
$ % $
$
%
%
"
#
% $
$
" #
#
'
!
#
"
$
%
"
"
$
$
(
)
% #
"
"
$
%
"
$
"
%
,
"
+
"
"
"
"
"
"
,
%
%
%
%
$
%
%
& '
" $
(
+ $
#
#
"
$
#
"
(
%
$
"
" #
$
$ &
"
+
(
"
#
s0
#
%
$ #
$
"
$ &
" # (
$
* $
$
si-1 0<i<n %
$
!
(
*
$
$ % & '
sn-1
$ $
(
" %
si
"
" &
$ % & '
+
" % % & '
"
$
% *
$
"
$
S=(s0,s1, ..., sn-1)
#
+
%
" %
%
!
%
% $
+
! " #
(
% %
"
"
$ % & '
$
#
$ % &
" &
% & '
* $ %
$
!
"
"
(
"
* '
" $
%
$
%
$
+
( ) $
" #
%
$ $
* & '
%
stack.h
#
#
"
$
$
#
"
%
&
"
$
&
STACK
(
$
#
# *
& '
$
$
&
% #
$
$ %
" # & '
$
$
+
+
" #
(
/* ficheiro: stack.h */ /* Verifica se o stack estรก vazio; retorna 1 se o stack estiver vazio; retorna 0 caso contrรกrio. */ int STACKempty(void); /* Verifica se o stack estรก cheio; retorna 1 se o stack estiver cheio; retorna 0 caso contrรกrio */ int STACKfull(void);
/*Cria um stack vazio com a capacidade mĂĄxima de n elementos. PRĂ&#x2030;: n>0 POS: (STACKempty()==1) && (STACKfull()==0) */ void STACKinit(int n);
$
%
)
*
'
"
"
$ $
#
*
" #
(
" #
"
* #
% $
% " $
%
%
$
*
$ & '
"
& '
" & '
$ &
'
$
*
%
$ *
%
%
$
%
" & '
"
%
#
"
(
$
%
$
(
$
& '
'
% %
"
"
"
" & '
%
$
(
#
%
$ *
* &
'
(
/*Retira e retorna o Ăşltimo item carregado no topo do stack. PRĂ&#x2030;: STACKempty()==0 POS: STACKfull()==0 */ type STACKpop(); /* Devolve o elemento no topo do stack; NĂŁo altera o conteĂşdo do stack. PRĂ&#x2030;: STACKempty()==0 POS: STACK == old STACK; em que STACK representa o estado do stack. */ type STACKtop(); )
*
" &
$
"
%
* &
* #
*
* #
$
'
( (
%
%
% " $
'
%
'
" #
%
"
( "
*
"
%
% %
$ &
$
* #
$
& '
%
* #
"
$
%
%
(
/*Carrega o item t no topo do stack. PRĂ&#x2030;: STACKfull()==0
(
POS: (STACKempty() == 0) && (t==STACKtop()) && (STACKpop() == old STACK), em que STACK representa o estado do stack. */ void STACKpush(type t);
% *
$ % & '
*
(
"
$
$
+
$
+
$ % *
$ % & '
$
" % % & '
(
#
%
%
*
$
" %
+
" # (
$ " #
"
*
"
+
(
$
$
#
%
" % % & '
( (
$
$ %
%
*
#
,
$ % *
" $
" % % (
(
" &
(
!
(
%
%
(
$
( (
$ % *
$
%
$
$
" &
$
$ % *
$ &
"
$ % *
" $ $
%
$ &
#
$
$
" # % & '
$
" &
% $
" & '
(
,
,
( " & ( (
%
Stack[G] %
+
+
"
%
* #
$
$
%
"
%
" $
G
" % %
%
$
(
,
init
,
IN stack[G] ,
empty stack[G] {0, 1}
( (
full:
( (
push
( (
pop
(
top
$
(
" $ (
#
" &
stack[G]
" & '
%
(
+
* $ $ (
$ $
& '
$ %
G
push
$
G
stack[G]
'
stack[G
"
1
" # *
%
& '
stack[G]
#
%
stack[G] x G
,
! " #
$
,
,
"
0
" % #
stack[G] {0, 1}
%
$ $
"
$
%
$
"
$
$
#
" %
$ & '
" # % & '
$
$
%
$
%
$
& '
$
% $ (
stack[G]
$
stack[G].
$
$ % #
'
'
%
%
$ % # & '
,
" % % $
f: IR IR
& '
& '
!
( ! ( (
f
" %
$ &
,
& '
#
$
* * #
%
#
% %
" &
$
$
(
$
nâ&#x2C6;&#x2C6;IN, xâ&#x2C6;&#x2C6;G sâ&#x2C6;&#x2C6;stack[G]
top(push(s,x))=x "
!
( (
"
( (
"
( (
##
3.5.
empty(push(s,x)) = 0;
3.6.
full(pop(s)) = 0;
"
!
"
# %
$
( %
(
$ %
%
%
! "
X,
$
A,
$
#
!
$
f
(
#
$
A:
& '
" $
# *
#
#
$
%
"
(
full(s)=0;
$ & '
& '
$
empty(s)=0;
%
& '
& '
% $
!
$
%
$
(x) 1
A
*
%
%
xâ&#x2C6;&#x2C6;A 0
%
& '
A %
$
(
"
$
"
#
"
f
% %
X {0, 1}
!
#
& '
& '
" $ $
empty(s)=0;
"
sâ&#x2C6;&#x2C6;stack[G] xâ&#x2C6;&#x2C6;G
" %
$
push(s, x)
%
% %
top(s)
( (
& '
pop(s)
( (
(
,
(
(
& '
" $
! (
! "
%
& '
% (
(
% $
" $
$ $
%
#
% $
"
&
%
#
&
,
!
" $
$
#
%
$
% $
! "
(
" $
(
* #
%
$
%
'
& '
%
%
%
%
$
%
$
!
%
(
#
( (
" #
" $
#
$
"
"
*
%
*
" #
$
%
*
& '
!
& '
,
$
"
" &
$
$
"
" (
"
%
* # %
$
! "
$ $
#
(
* # & '
$
%
%
"
$
" $
%
"
%
$
"
(
$
(
! " '
$
$
$
%
#
& '
% $
" $
" $
" $
%
%
#
!
$
"
%
% "
" & '
%
"
*
" %
#
! " '
$
%
%
%
$
#
%
# $
! " '
$
!
$ *
#*
" $
% #% # $
"
%
" &
$
%
%
$
%
(
& '
%
! " '
%
"
! " #
$
%
%
% #% # $
$ *
"
,
"
,
,
,
" $ $
"
% #% # $
$ *
#* (
,
,
,
,
,
,
%
&
#
$
" #
$
"
"
% $
$
(
%
)
'
'
$
%
#
#
& '
% $
"
$
%
%
& '
# $
+
$
! " #
" "
%
% $
$
$
(
#
#
$ % & '
*
%
$
%
" &
" & '
"
% % #
# $
& '
$
%
"
$
#
%
% #% # $
" $
% %
%
"
" $
$
* # $
$
%
(
"
"
$ %
$
$
$
$
%
" #
*
$
# $
*
"
"
% *
$
(
$
$
(
%
&
$
# $
# $
(
$
$
% #
"
"
"
$
,
calc
str
str
res
res
le
avalia
escreve res
no
op
procNo
$
" $
%
&
%
"
$
$ %
&
#
procNo procOp
$
(
'
$
"
%
$
%
$
& '
*
"
(
escreve
(
$ " $ $
#
* #
%
* #
procOp
#
$
$
" # % & '
(
(
)
& '
" % " #
$ %
* % & '
"
# (
printf
$
$ *
% #
$
"
)
"
$
$
res "
!
%
printf
printf
& '
*
"
"
$
$ %
$
%
calc & '
%
avalia
$ & '
(
"
" #
$
%
le avalia
%
"
%
$
+
%
!
$
procOp
$
$
(
* #
res
procOp
%
$
(
& '
escreve
"
%
avalia
& '
printf
"
printf
% *
& '
" # %
$
'
$
* #
c
#%
&
(
calc
str
str le
avalia
no
op
procNo
%
"
$
(
#
%
"
"
%
$
"
$
$ *
$
%
"
*
# ,
#*
procOp
"
$
"
$
$
"
#
*
$
"
&
% $ $
$
%
%
% *
$
" *
%
"
$ $
% #
#
& '
(
#include "type.h" #include "stack.h" #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define MAXLEN 20 #define MAX_STACK_SIZE 10 #define ENDCHAR 'q' void le(char *, int); void avalia(char *);
void procNo(type); void procOp(char );
int main() { char str[MAXLEN]; printf("Calculadora para expressĂľes aritmĂŠticas em notação sufixa.\n"); printf("CaracterĂsticas: \n"); printf("
- Operandos: inteiros \n");
printf("
- Operadores: +, - *, / \n\n");
STACKinit(MAX_STACK_SIZE); for (;;) { le(str, MAXLEN); if(str[0] == ENDCHAR) break; avalia(str); } return 0; } void le(char *str, int n) { printf(": "); fgets(str, n, stdin); /* Verificar aqui se str estĂĄ num formato vĂĄlido */ } void avalia(char *s) { if(isdigit(s[0])) { type t = (type) atof(s); procNo(t);
} else procOp(s[0]); } void procNo(type no) { if
(STACKfull()) { fprintf(stderr, "Error: STACK overflow. \n"); exit(1);
} else
STACKpush(no);
} void procOp(char op) { type res, o1, o2; if(STACKempty()) { fprintf(stderr, "Error: STACK empty. \n"); exit(1); } else o2 =STACKpop(); if(STACKempty()) { fprintf(stderr, "Error: STACK empty. \n"); exit(1); } else o1 =STACKpop(); switch (op) { case '+': res = o1 + o2; break; case '-': res = o1 - o2; break; case '*': res = o1 * o2; break; case '/': if(o2) res = o1/o2; else { fprintf(stderr, "Error: divide by zero; finished. \n");
exit(1); } break; default: { fprintf(stderr, "Error: unknown command. \n"); exit(1); } } /* Aqui existem pelo menos dois lugares vazios no stack */ STACKpush(res); printf(printfstring, res); printf("\n"); }
%
printfstring
%
$
$
$
"
$
%
'
type
%
"
$
#
$ $
& '
$
%
printf type.h
(
(
*
,
typedef int type; #define printfstring "%d"
"
% #
% #
#
# " # (
%
$
"
type.h $
%
" #
$
*
& '
% #
$
$ % # &
$
%
%
$ *
# " #
$
$
" *
,
#ifndef _TYPE_ #define _TYPE_ typedef int type; #define printfstring "%d" #endif $
#ifndef #define #endif %
$
$ " $
'
$
)
%
#
$
"
'
%
"
% # '
*
"
$
$
*
+
$
" "
#
(
" "
% $
$ % *
% $
#
(
#ifndef <identificador>
$ % *
$
"
#
"
$ % *
%
$
,
#else #elif
%
(
%
%
"
+
%
& '
$
" &
(
$ #
$ *
" #
&
$ *
#*
$
" #
% #% # $
*
*
"
#
#* $
'
& '
$
$
%
"
$
+
%
%
"
*
#
% $
%
$
,
" & '
(
(
%
$
"
" *
$ $
% $
!
"
"
(
" # $
% %
*
$
%
%
"
%
$
"
$
(
<identificador>
#endif
%
%
$ % *
$
%
%
*
#
"
&
$
%
,
%
%
&
% %
&
$
(
"
% $
"
% $
% $
"
$
"
$
&
"
#
$
*
&
%
"
%
$
#
# $
# $
"
&
"
&
$
$ " $
& '
$
%
"
& '
%
&
$
% $ (
$ *
)
#* $
$
#
%
$
%
&
$
% $
)
$
%
%
"
%
$
% $
"
$ &
%
" #
(
&
&
"
%
% $
& '
$ $
%
"
$
%
$
%
! '
$
.c
%
stack.c,
,
#include <stdlib.h> #include "type.h" #include "sllist.h"
/* Funçþes que definimos sobre as listas*/
static link pstack = NULL; static int capacity;
/* capacidade do stack */
static int actsize;
/* tamanho actual do stack */
/* Inicializa um stack, com capacidade para n elementos. PRE: n > = 0 POST: (STACKempty() == 1) && (STACKfull() == 0) */ void STACKinit(int n) { pstack = NULL; capacity = n; actsize = 0;
}; /* Retorna 1 se o stack estĂĄ vazio; retorna 0 caso contrĂĄrio. */ int STACKempty(void) { return !actsize; /* ou return pstack ==NULL */ }; /* Retorna 1 se o stack estiver cheio; retorna 0, caso contrĂĄrio. */ int STACKfull(void) { return (actsize == capacity); }; /* Retorna e retira o Ăşltimo elemento inserido no stack. */ /* PRE: STACKempty()==0 */ /* POS: STACKfull()== 0 */ type STACKpop(void) { type item = lsthead(pstack); lstremovehead(&pstack); actsize--; return item; }; /* Retorna o Ăşltimo elemento inserido no stack; NĂŁo altera o estado do stack. PRE: STACKempty()==0 POS: STACK = old STACK; onde STACK representa o estado do stack. */ type STACKtop(void) { return lsthead(pstack); }; /* Carrega um elemento do tipo t, no stack
PRE: STACKfull() == 0 POS: (STACKempty() == 0) && (t==STACKtop()) && (STACKpop() == old STACK), em que STACK representa o estado do stack. */ void STACKpush(type t) { lstinsert(&pstack, t); actsize++; };
"
*
" *
%
$
$
" # *
* * #
static
%
$
* * #
#
% *
% #
& '
& '
(
$
" # % $
& '
%
static
$
$
* *
#% %
" # %
$
$ $
* * #
$
&
$
$
#
%
$ $
%
$
"
%
$
%
$
!
$ $ (
" & '
"
#
'
"
static
#
static
$ % # $ (
" # * % *
%
!
(
$
* *
" # * % *
$
) %
%
"
%
$
%
% " % $ $
"
#
$
( $
"
&
'
$ (
" #
& '
$
" & '
%
"
$
$ $
"
,
#include <stdlib.h> #include <stdio.h> #include "type.h" static type *pstack = NULL; static int capacity; static int actsize; /* Inicializa um stack, com capacidade para n elementos. PRE: n > = 0 POST: (STACKempty() == 1) && (STACKfull() == 0) */ void STACKinit(int n) { pstack = (type *) malloc (n*sizeof *pstack); if(!pstack) { fprintf(stderr, "Error in STACKinit: not enough memory\n"); exit(1); } capacity = n; actsize = 0; }; /* Retorna 1 se o stack estรก vazio; retorna 0 caso contrรกrio. */ int STACKempty(void) { return !actsize; }; /* Retorna 1 se o stack estiver cheio; retorna 0, caso contrรกrio. */ int STACKfull(void) {
return (actsize == capacity); }; /* Retorna e retira o Ăşltimo elemento inserido no stack. */ /* PRE: STACKempty()==0 */ /* POS: STACKfull()== 0 */ type STACKpop(void) { return pstack[--actsize]; };
/* Retorna o Ăşltimo elemento inserido no stack; NĂŁo altera o estado do stack.
,
) ,
STACKempty()==0 STACK = old STACK;
$
STACK
"
$
$
(
type STACKtop(void) { return pstack[actsize-1]; } /* Carrega um elemento do tipo t, no stack PRE: STACKfull() == 0 POS: (STACKempty() == 0) && (t==STACKtop()) && (STACKpop() == old STACK), em que STACK representa o estado do stack. */ void STACKpush(type t) { pstack[actsize++] = t; }
$
%
&
$
" #
" % $
$
%
$ &
$
"
%
$
(
"
&
"
'
*
#
"
) %
%
% " % $ $
"
#
$
$
$ (
$
" & '
$ % # &
,
static type *pstack = NULL; static int capacity; static int freespace;
! " #
"
freespace=3
" # & '
/* Número actual de posiçþes desocupadas no STACK */
$
$
" #
)
%
$ &
*
% *
%
%
"
'
*
#
*
&
" # % & '
'
! %
" #
&
%
" & '
& '
+
" #
+ !
" #
stack1.c stack2.c % # (
%
(
"
" #
" #
%
%
"
" #
$
% $
%
%
$
" #
%
& '
&
& '
$
&
(
%
"
#
%
(
$
% #
# & '
"
%
"
% #
"
$
% (
*
%
$
$
$ "
# $
push
"
#
*
#
pops
" &
(
*
" $
'
(
+
!
$
#
*
$
"
%
" #
$
(
$
#
#
#
" %
'
%
" &
$
$
"
" #
*
#
$
$
*
'
% # $ $
$
& '
$ *
$
"
#
!
#*
& '
" &
$
"
%
%
& '
#
$ $
NULL
$
$
%
$
$ $
" #
%
#
& '
"
$
*
$
pop push
# '
#
$ "
*
$
" #
"
%
%
malloc
%
(
"
$
"
$
%
% #% # $
& '
% %
# (
& '
*
& '
$
& '
%
!
*
#
"
(
& '
! (
)
(
# $ (
" #
"
#
"
# $
%
in2post
'
$ *
"
%
"
,
> in2post 1 + 2 * 3 <enter> 123*+ > in2post 1 * 2 + 3 <enter>
12*3+
#
$
"
%
%
#
" $
"
" $
#
%
%
$
& '
!
"
%
!
%
%
$
" %
" $
$
*
$
"
# $
%
*
" # &
" $
#
# $
1+2*3
(
! " '
! " '
$
* & '
" %
* '
%
!
! " '
$
! " #
(
$
" #
$
'
%
$
$ " $
$
" %
%
#
%
(
! " #
! " #
# $
# $
%
*
" % $ % (
* '
$ (
%
" #
" %
%
$
"
(
,
$
# ,
$
) %
,
$
)
$
$
$ "
$
"
"
$
"
$
%
$
$
" $
#
! " '
'
%
$
"
$
$ ( )
$
$ $
%
#
#
% $
$
! " '
$
(
%
*
" $
$ #
" $
" $
%
%
#
%
" & '
% $
"
(
%
%
%
$
"
! " #
(
%
"
$
"
$
+ $
" $
" % $ %
#
%
(
" $
$
"
$
%
" % $ %
" % $ %
$
$
$
(
+
$
*
$
" $
! " #
$
%
"
$
+
%
#
% $
%
"
(
,
$
) %
,
$
)
+
%
%
#
$ $
$
$
#
% $
% #
% $
%
% $
%
" $
(
%
$
! " '
* #
(
$
% %
" % $ %
*
" $
#
%
$
$
# $
# *
*
#
%
(
$
!
%
%
$
(
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include "type.h" #include "stack.h" #define N 10 void procOp(char); int precedence(char ); int main( int n, char **argv) { int i; STACKinit(N);
for(i=1; i < n ; i++) if (isdigit(*argv[i]))
printf("%s", argv[i]);
else procOp(*argv[i]); while (!STACKempty()) printf("%c", STACKpop()); return 0; } void procOp(char opt) { if (STACKempty()) { STACKpush(opt); return; } if (precedence(opt) > precedence(STACKtop())) { if (!STACKfull()) STACKpush(opt); else { fprintf(stderr, "ERROR: stack overflow."); exit(1); } } else { while(!STACKempty() && (precedence(opt) <= precedence (STACKtop()))) printf("%c", STACKpop()); STACKpush(opt); } } int precedence(char c) { static enum precs {addsub = 1, mux = 10}; switch(c) { case '+':
case '-': return addsub; case '*': case '/': case '%': return mux; default: fprintf(stderr, â&#x20AC;&#x153;invalid operatorâ&#x20AC;?); exit(1); } }
& '
% %
! " #
" $
$
%
$
& '
%
! $
$
# !
*
# ,
* #
(
& '
$
" &
# *
+ $
#
,
! " #
"
# !
"
"
# $ $
%
$
! " '
*
" #
$
%
& '
"
" &
#
$
!
'
$
*
$
" #
$
$
& '
$
#
$
%
% (
a*b-c+d*e-f/g ĂŠ equivalente Ă expressĂŁo em
notação sufixa ab*c-de*+fg/ $
$
# ,
$ ,
) % *
1 2 3 4 5 6 7 8 9 10 11 12 13 a * b - c + d * e - f
/ g
* (cada linha corresponde a um estado do stack)
estados do
-
stack:
+ + * -/
$
,
a b * c - d e * + f g / -
" $
%
%
$
+
" #
(
+
"
*
%
" $
%
"
#*
"
$
$
+
$
$ ! $
%
$
'
"
%
! " '
&
%
! %
& '
"
%
& '
(
"
! (
& '
$
$
!
#
%
'
"
"
$
" #
%
calc
%
%
$
(
#
%
%
! "
$
in2post
#
% #
"
* #
"
"
" $
& '
" & '
$
"
$
$ *
%
%
,
$
"
! "
$
%
* #
% #% # $
"
%
$
%
# * ,
$ "
%
"
%
'
$
! " #
" %
! '
# &
"
" $
"
" #
$
& '
$
& '
%
char
(
$
(
%
" &
(
%
$ %
" #
& '
%
(
"
#
%
%
$
" & '
#
$
" #
(
&
$
!
#
+
# $
" #
% #
"
" $
"
%
$ &
(
$
(
STACKcount(void); /* retorna o nยบ de elementos no stack; */ STACKchangetop(type t); /* substitui o topo do stack por t; */ STACKwipeout(void); /* remove todos os elementos do stack; */ (
" #
+
#
#
$
(
+ *
#*
+
(
" #
" &
$ *
%
"
#
+ - * / !
$
%
% #% # $
%
$
%
"
" %
$
(
$
$
"
"
&
#
%
$
$ * '
(
*
& '
#
!
(
%
$
$
(
"
$
$ $
" $
(
! " #
$
#
& '
,
>calc 5 ! 2 3 * 4 % + 122 (
% *
!
(
(
! "
& '
*
! " '
%
'
"
%
%
% *
(
%
& '
% *
"
,
( (
(
$
"
!
in2post
"
"
%
! "
%
" (
13. O tipo de dados abstracto fila de espera
$
# %
%
$
'
"
$
$ $
#
$
#
#
%
# %
'
$
'
fn-1
"
$
%
$
put
%
"
"
$
#
$ $
* $
$
%
$
%
&
"
"
"
* $
% %
" #
"
" #
$
$
'
(
#
% " $
+
#
#
$
( (
"
*
"
"
(
$
%
enqueue
&
fi+1
(
'
&
+ $
#
$
$
"
# $
F=(f0, f1, ..., fn-1) f0
fi 0<= i < n-1
get (
(
#
dequeue)
#
(
%
* $
" $
# $
(
"
'
# (
$
"
"
#
*
%
# (
$
$
(
$
(
"
% #
$ $
& '
#
" #
$
! '
*
&
%
$
$
$
$ %
%
$
$
"
% #
& $
) &
$
#
% $
% #
"
! " %
% $ $
"
"
"
%
%
"
#
"
$
$ $
%
,
/* Ficheiro: queue.h */ #include "type.h" /* Inicializa uma fila FIFO, com capacidade para n elementos. PRE: n > = 0 POST: (QUEUEempty() == 1) && (QUEUEfull() == 0) */ void QUEUEinit(int n);
/* Retorna 1 se a fila estรก vazia; retorna 0 caso contrรกrio. */ int QUEUEempty(void); /* Retorna 1 se a fila estรก cheia; retorna 0, caso contrรกrio.*/ int QUEUEfull(void); /* Retorna e retira o primeiro elemento inserido na fila. */ /* PRE: QUEUEempty()==0 */ /* POS: QUEUEfull()== 0 */ type QUEUEget(void); /* Insere um elemento do tipo type, na fila PRE: QUEUEfull() == 0 POS: QUEUEempty() == 0 */ void QUEUEput(type t);
$
"
#
#
$
"
"
$
$
#
# $
$
(
&
$
" &
*
#
put
get
"
$
#
&
"
%
&
%
*
"
plast
"
#
$
# (
/* ficheiro: queue1.c */ #include "sllist.h" #include "type.h" #include <stdlib.h> #include <stdio.h> static link pqueue; static link plast; static int capacity; static int actsize; /* Descrição: Inicializa uma fila FIFO, com capacidade para n elementos Parâmetros: n - inteiro positivo; indica o número max de elementos da fila. PrÊ-condição: n > 0; Pós-condição: (QUEUEempty() == 1) && (QUEUEfull() == 0); */ void QUEUEinit(int n) { capacity = n; actsize = 0; plast=pqueue = NULL; } /* Retorna 1 se a fila estå vazia; retorna 0 caso contrårio. */ int QUEUEempty(void) { return !actsize; }
/* Retorna 1 se a fila estรก cheia; retorna 0, caso contrรกrio.*/ int QUEUEfull(void) { return actsize==capacity; } /* Retorna e retira o primeiro elemento inserido na fila. */ /* PRE: QUEUEempty()==0 */ /* POS: QUEUEfull()== 0 */ type QUEUEget(void) { type tmp = lsthead(pqueue); lstremovehead(&pqueue); actsize--; return tmp; }
/* Insere um elemento do tipo type, na fila PRE: QUEUEfull() == 0 POS: QUEUEempty() == 0 */ void QUEUEput(type t) { link nn = lstnnode(t); actsize++; if(QUEUEempty()) { pqueue = plast = nn; } else { plast -> next = nn; plast = nn; } }
%
lstremovefirst
#
%
pqueue
NULL
'
*
#
# (
#
$ %
$
#
" &
in
#
"
% *
#
%
"
* % &
*
out
$
(
(
%
"
%
#
" #
$
)
#
#
out
" &
#
$ %
%
#
"
"
$
%
"
$
%
*
%
$
"
, "
$ & '
$
#
*
$
"
#
%
"
& '
$ "
(
*
#
#
%
% " % $ $
#
$
$ %
$ %
in
$ ! $
'
%
"
% #
out $
% % # (
$
! " #
$ %
%
" #
#
! % $
#
#
" %
% (
$
*
put
"
#
&
" #
"
(
actsize
%
* %
(
%
$ % (
%
get
,
(
$
%
in
#
'
$
% #
out $
$
"
"
#
* * #
%
(
$
$
% # $
#
$
(
in out
* %
"
* %
"
in==out
*
! " #
(
$
"
n+1
#
# '
% #
"
#
(
$
*
#
#
#
#
%
*
"
*
%
*
in==out
(
" &
! " #
'
"
n
#
,
"
"
"
/* Ficheiro: queue2.c */ #include <stdio.h> #include <stdlib.h> #include "type.h" static type* queuep; static int capacity;
/* capacidade mĂĄxima da fila */
static int capp1;
/* capp1 = capacity + 1 */
static int in;
/* Ăndice da posição disponĂvel para inserção, no fim da fila */
static int out;
/* Ăndice do prĂłximo elemento a sair da fila */
/* Função auxiliar; visĂvel apenas neste ficheiro. Dado um Ăndice, calcula o Ăndice seguinte. Esta função sĂł deverĂĄ ser chamada apĂłs QUEUEinit */ static int nextindex(int i) { return (i+1) % capp1; }
/* Inicializa uma fila FIFO, com capacidade para n elementos. PRE: n > 0 POST: (QUEUEempty() == 1) && (QUEUEfull() == 0) */ void QUEUEinit(int n) { capacity = n; capp1 = capacity + 1; in = out = 0; queuep = (type *) malloc (capp1 * sizeof *queuep); if(!queuep) { fprintf(stderr, "Error in QUEUEinit: not enough mem for queue allocation"); exit(1); } } /* Retorna 1 se a fila estĂĄ vazia; retorna 0 caso contrĂĄrio. */ int QUEUEempty(void) { return in==out; } /* Retorna 1 se a fila estĂĄ cheia; retorna 0, caso contrĂĄrio. Quando a fila estĂĄ cheia, se inserĂssemos outro elemento ficarĂamos com a ilusĂŁo de que a fila estaria vazia */ int QUEUEfull(void) { return nextindex(in) == out; } /* Retorna e retira o primeiro elemento inserido na fila. */ /* PRE: QUEUEempty()==0 */ /* POS: QUEUEfull()== 0 */ type QUEUEget(void) { type tmp = queuep[out] ;
out = nextindex(out); return tmp; } /* Insere um elemento do tipo type, na fila PRE: QUEUEfull() == 0 POS: QUEUEempty() == 0 */ void QUEUEput(type t) { queuep[in]=t ; in = nextindex(in); }
(
(
%
#
$
$
(
(
%
" &
ptr
$
%
$
#
%
(
#
%
"
" & '
%
$
#
(
#
* % & '
$
+
%
$
"
" #
" #
" &
"
$
#
%
(
! %
*
$
"
"
%
(
,
prt out
14. As filas revisitadas
#
# % ,
"
#
#
*
#
"
# $ $
" #
"
%
" #
(
"
$
*
'
# %
"
,
%
$
"
"
$ $
+
"
#
! " #
$
"
"
'
# $ $
$
" #
"
#
%
,
"
"
#
"
# %
(
#
# *
$ % $
% %
"
(
(
# %
"
*
%
(
# %
*
$
+
$
$
& '
#
"
#
%
#
*
(
!
#
(
$
%
% #
'
$
"
# %
$ $
" #
+
'
$ "
$
$ $
*
#
%
$ #
#
$
#
#
#
%
"
#
! " #
$
"
%
(
$
#
$ $ (
#
#
"
#
%
$
$
" & '
(
# $ $
" %
" # &
"
"
!
%
" &
%
$
(
# & '
# & '
$
$
#
$
$
$
%
%
" # % &
# & '
$
#
$
$
%
% #
% &
"
$
$
#
%
$
$
$
$
"
+
#
(
* #
%
%
$
% (
" &
$
(
) $
+
"
%
$
&
#
"
%
$
(
/* Ficheiro: rq.h â&#x20AC;&#x201C; interface fila aleatĂłria (Random queue) */ #include "type.h" /* Inicializa uma fila aleatĂłria, com capacidade para n elementos. PRE: n > 0
POS: (RQempty() == 1) && (RQfull() == 0) */ void RQinit(int n);
/* Retorna 1 se a fila estĂĄ vazia; retorna 0 caso contrĂĄrio. */ int RQempty(void); /* Retorna 1 se a fila estĂĄ cheia; retorna 0, caso contrĂĄrio. */ int RQfull(void); /* Retorna e retira aleatoriamente um elemento da fila. Todos os elementos tĂŞm probabilidades iguais de saĂrem. PRE: RQempty()==0 POS: RQfull()== 0 */ type RQget(void); /* Insere um elemento do tipo type, na fila PRE: RQfull() == 0 POS: (RQempty() == 0) */ void RQput(type t);
*
+
" #
" #
$
%
# $
RQput(type t)
#
$
$
" &
$ %
" & '
#
#
&
$
%
"
*
$
#
" #
& '
$
*
#
#
#
%
" #
%
t
$
& '
$
"
(
!
& '
$
"
# (
$
"
$
%
# $
$
$
*
#
$
$ $ (
%
% $
%
(
" & '
RQget() $
/* Ficheiro: rq.c โ fila aleatรณria (Random queue) */ #include <stdlib.h> #include <stdio.h> #include "rq.h" static type *rq = NULL; static int capacity; static int actsize; /* Inicializa uma fila aleatรณria, com capacidade para n elementos. PRE: n > 0 POS: (RQempty() == 1) && (RQfull() == 0) */ void RQinit(int n) { rq = (type *) malloc (n*sizeof *rq); if(!rq) { fprintf(stderr, "Error in RQinit: not enough memory\n"); exit(1); } capacity = n; actsize = 0; };
/* Retorna 1 se a fila estรก vazia; retorna 0 caso contrรกrio. */ int RQempty(void) { return !actsize; }; /* Retorna 1 se a fila estรก cheia; retorna 0, caso contrรกrio. */ int RQfull(void) { return (actsize == capacity);
};
/* Retorna e retira aleatoriamente um elemento da fila. Todos os elementos tĂŞm probabilidades iguais de saĂrem. PRE: RQempty()==0 POS: RQfull()== 0 */ type RQget(void) { int r = rand() % actsize;
/* NĂşmero aleatĂłrio entre 0 e actsize -1 */
type tmp = rq[r]; rq[r] = rq[--actsize]; return tmp; }
/* Insere um elemento do tipo type, na fila PRE: RQfull() == 0 POS: (RQempty() == 0) */ void RQput(type t) { rq[actsize++] = t; }
!
$
$ $
"
"
& '
#
"
%
%
,
"
$ $
"
%
&
*
"
$
"
'
#
$ & '
$
$
%
!
%
$
# %
$ $
#
$
"
& '
#
$
$
" *
%
$
" &
'
$
%
# &
#
$
$
(
*
$
# %
"
#*
#
$
%
$
(
#
'
$
#
" '
$
(
#
#
"
"
%
*
)
%
"
$
#
$
& '
"
$ $
$
#
%
%
" #
$
"
" #
#
#
"
#
$
$
"
#
%
(
$ $
$
"
& '
$
$
#
'
% %
% "
$
% "
"
& '
&
(
% *
#
$
* #
$
$
% "
%
% "
$
" # % & '
% "
% *
!
$
"
$
% *
#
%
# (
$ " $
( + " $ $
*
$
"
(
% * (
*
$
%
% *
% #
" # % & '
% %
#
! " #
"
$
# % & '
"
# % & '
$
$
#
%
$
$
$
(
$
#
"
$
!
# & '
* #
#
%
"
$
$ $
$
$
!
% *
!
!
"
%
% *
! (
!
$
# & '
$
'
#
$
!
%
"
$
$
(
,
/* Ficheiro: pqueue.h */ #include "type.h" typedef struct priority_queue *PQ; /* Inicializa uma fila com prioridades, com capacidade para n elementos. PRE: n > 0 POS: (PQempty() == 1) && (PQfull() == 0) */ PQinit(int n);
/* Retorna 1 se a fila estรก vazia; retorna 0 caso contrรกrio. */ int PQempty(void); /* Retorna 1 se a fila estรก cheia; retorna 0, caso contrรกrio. */ int PQfull(void); /* Insere um elemento do tipo type, na fila pq PRE: PQfull() == 0 POS: PQempty() == 0 */ void PQput(type t); /* Retorna e retira o elemento da fila com a maior chave PRE: PQempty() ==0 POS: PQfull()== 0 */ type PQdeletemax(void);
#
$
" &
" &
"
% #
'
,
/* Altera a prioridade do elemento t da fila; se t existir, deixa a fila inalterada caso contrรกrio. PRE: PQempty() ==0 */ void PQchangePriority(type t); /* Remove o elemento t da fila; se t existir, deixa a fila inalterada caso contrรกrio. PRE: PQempty() ==0 */ type PQdelete(type t); /* Devolve o elemento com maior chave sem o remover. PRE: PQempty() == 0
POS: nĂŁo altera o estado da fila */ type PQmax(void); /* Troca o elemento com maior chave com o argumento t. PRE: PQempty() == 0 */ PQswapmax(type t);
"
%
'
"
" % #
" #
& '
$ "
(
*
"
$
%
#
$
#
$
%
$
*
!
" #
&
$
!
*
" #
"
$ (
+ "
%
$ $
#
$ $ (
" #
"
" #
% (
%
"
#
% #
#
&
%
#
&
" #
%
%
"
'
$
$ $
#
& '
#
"
$
$
% % $
$ %
$
#
$
$
,
/* Ficheiro: pqueue.c */ #include â&#x20AC;&#x153;pqueue.c" #define less(A,B)
(Key(A) < Key(B))
static
int ta;
/* tamanho actual */
static
int cap;
/* capacidade */
static
type *elems;
/* array de elementos */
/* Retira e retorna o elemento da fila com a maior chave PRE: PQempty() ==0 POS: PQfull()== 0 */ type PQdeletemax(void) { int I, mx = 0; type t; for (i=1; i< ta; i++) if (less(elems[mx], elems[i]) mx = i; t = elems[mx]; elems[mx] = elems[--ta]; return t;
" #
" #
#
%
"
" &
! %
%
& '
%
$
#
%
& '
"
$
"
(
$ ! $
"
"
$
#
! %
% #
#
"
%
%
" #
$
&
%
#
" #
%
" &
&
!
$
$
(
'
& '
(
(
" $
$
" &
%
$
#
"
"
# (
"
% * #
%
%
"
%
$
%
$
& '
" #
&
$
#
$
% *
" #
$ $
(
(
" #
"
#
"
#
$
$
*
$ $
" #
"
%
$
$
$
%
" % #
" #
$
$
$
#
+
$ $ (
$
*
,
(
& '
(
$
& '
$
& '
#
#
# $
& '
$
*
# $
"
"
& '
%
$
#
$
#
$ $
$
" #
& '
(
$
" #
& '
*
(
$
" #
$
%
$
$
$
,
(
& '
(
$
" #
+
"
$ & '
$
"
& '
"
*
#
" %
$
" %
*
"
# $
" %
"
$
" #
& '
*
(
*
'
%
$ %
"
%
(
$
"
$
#
+
$ $ (
"
+
%
&
&
$
(
%
" #
& '
$
+
$ ! $
%
! %
%
(
(
%
#
$
"
( "
%
"
$ $
%
$
#
#
%
%
$
" #
& '
" &
" & '
$
!
(
(
+
" #
% #
%
+
(
(
" #
&
% #
(
$
% *
& '
& '
" #
%
"
%
%
%
#
#
#
$
$
$
*
$ &
$
"
%
%
$ &
$
+
+
#
%
$
% $
%
#
#
$
" #
& '
& '
% $
(
(
$
(
& '
#
# $ (
(
# ,
%
$
%
$
$
#
+
%
"
$
+
& '
"
& '
#
#
%
$
& '
#
"
$
*
$
%
# (
* #
$
"
$ $
"
%
& '
"
(
"
"
$
% #
#
#
(
$ $
%
$
#
"
(
#
%
"
$ $
"
"
$ $
%
"
#
$
"
%
%
% $
#
%
" #
$
#
$
$
(
%
$
" #
"
"
%
" & '
%
%
#
$ $
+
$
&
% *
$ &
"
+
"
$
&
$
" #
+
$
#
" # ! $ $
# $ (
(
$
$
$
(
% #
%
(
%
(
%
# $ $
(
$
" #
$
$
" #
#
$
"
#
#
$
$
" &
" #
$
%
&
$
! %
%
"
%
(
,
/* Inicializa uma fila generalizada (GC â&#x20AC;&#x201C; generalized queue), com capacidade para n elementos. PRE: n > 0 POS: (GQempty() == 1) && (GQfull() == 0) */ void GQinit(int n);
/* Retorna 1 se a fila estĂĄ vazia; retorna 0 caso contrĂĄrio. */ int GQempty(void); /* Retorna 1 se a fila estĂĄ cheia; retorna 0, caso contrĂĄrio. */ int GQfull(void); /* Insere um elemento do tipo type, na fila PRE: GQfull() == 0 POS: (GQempty() == 0) */ void GQenqueue(type t); /* Retira o elemento da fila inserido mais recentemente (o Ăşltimo da fila) e retorna-o. PRE: GQempty()==0 POS: GQfull()== 0 */ type GQlast(void); /* Retira o elemento mais antigo na fila (o primeiro da fila) e retorna-o. PRE: GQempty()==0 POS: GQfull()== 0 */ type GQfirst(void);
15. Implementação em C de ADTs com múltiplas instâncias
" #
* $ $
$ *
'
$
%
"
"
%
#
&
#
"
& '
$
"
$
* #
$
%
%
! "
#
"
$
% #
%
# "
$
$
& '
%
$
! " #
" #
%
%
&
$
$
" %
+
$
"
% #% #
$
$
% #% #
"
(
! " #
$
%
! " #
$
% # $
%
$
"
"
(
*
%
"
"
$
$
$ *
" #
" #
$ *
"
#*
$
#*
/* interface */
,
(
(
% $
%
! %
"
"
#*
"
&
typedef struct { float x, y; } point; double dist(point, point); /* código cliente */ int main() { point A, B; A.x=1.0; A.y=1.0; B.x=4.0; B.y=2.0; printf("Distância: %f \n", dist(A,B)); return 0; }; /*implementação */ double dist(point p1, point p2) { float dx= p2.x-p1.x; float dy= p2.y-p1.y; return sqrt(dx*dx+dy*dy); }; )
$
" #
+
"
# &
$
"
"
% #
%
"
%
"
& '
$ $
'
"
$
"
$
'
"
$ "
" & '
%
$
+
"
$ "
# "
"
#
"
#
$
#
" #
& '
"
& '
% $
+
$
* #
$
"
"
(
#
+
$
$
(
$
%
$ % $
$
,
/* ficheiro: point.h */
#ifndef _POINT_ #define _POINT_ typedef struct point *Point; Point POINTinit(float, float); float POINTx(Point); float POINTy(Point); double POINTdistance(Point, Point); #endif
"
%
$
%
$ $
" &
"
# (
" #
%
'
"
%
" #
% "
"
$
(
& '
"
"
#
"
*
$
* #
$
%
"
'
"
$ $
" & '
"
"
$ $
*
# (
$
$
"
+
" #
" $
( # $
#
'
"
'
# (
% #
" $
% $
% $
%
"
$ $
$
% "
$
$
* #
$
%
,
/* ficheiro: point.c */ #include <stdio.h>
#include <math.h> #include "point.h" struct point { float x, y; }; Point POINTinit(float x, float y){ Point p=(Point) malloc(sizeof *p); if (!p) { fprintf(stderr, "No more memory."); exit(1); } p->x=x; p->y=y; return p; }; float POINTx(Point p) { return p->x; }; float POINTy(Point p) { return p->y; }; double POINTdistance(Point p1, Point p2){ float dx= (p1->x)-(p2->x); float dy= (p1->y)-(p2->y); return sqrt(dx*dx+dy*dy); }
"
% #
%
%
,
#include <stdio.h> #include "point.h"
/* código cliente */ int main() { Point A, B; A=POINTinit(1.0,1.0); B=POINTinit(4.0,3.0); printf("Distância: %f \n", POINTdistance(A,B)); return 0; }
$ "
"
$
" #
* $
#
" & '
"
$
$
&
%
" & '
" #
"
" #
"
$
malloc #
(
& '
" #
%
$
% #
(
#
#
#
+
! " #
,
void POINTfree( Point p) { free(p); }
'
#
%
#
& '
$
$
(
" #
! " #
"
&
$
% #
"
%
" $
% " *
$
,
Point A=POINTinit(1.0,1.0); Point B=POINTinit(4.0,3.0); B=A; " $
"
B
$ &
& '
%
B=A
(
$
$ *
* $
% #
#
$
"
$
% #
"
B
"
* $
,
Point A=POINTinit(1.0,1.0);
Point B=POINTinit(4.0,3.0); Pointfree(B); B=A;
#
%
# *
+
"
& '
$
* '
*
%
$
%
%
$ %
$
%
&
%
"
*
$
+
+
%
% & '
%
# " #
(
# " #
% *
+
$
"
%
"
! %
%
$
%
" # (
# " #
"
%
! " #
$ ! $
$ %
#
"
*
$ %
%
" #
&
$
% $
+
"
#
*
(
/* ficheiro: queue.h */ #ifndef _QUEUE_ #define _QUEUE_ #include "qtype.h" typedef struct point *Q; /* Inicializa uma fila FIFO q, com capacidade para n elementos. PRE: n > = 0 POS: (Qempty(q) == 1) && (Qfull(a) == 0) */ Q Qinit(int n); /* Liberta o espaรงo de memรณria reservado para q */ void Qfree(Q q)
/* Retorna 1 se a fila q está vazia; retorna 0 caso contrário. */ int Qempty(Q q); /* Retorna 1 se a fila q está cheia; retorna 0, caso contrário.*/ int Qfull(Q q); /* Retorna e retira o primeiro elemento inserido na fila q. */ /* PRE: Qempty(q)==0 */ /* POS: Qfull(q)== 0 */ qtype Qget(Q q); /* Retorna, sem retirar o elemento inserido na fila q à mais tempo. */ /* PRE: Qempty(q)==0 */ /* POS: q = old q */ qtype Qfront(Q q); /* Insere um elemento t do tipo qtype, na fila q PRE: Qfull(q) == 0 POS: (Qempty(q) == 0) */ void Qput(Q q, qtype t); #endif
% & '
*
$ & (
#
&
#
$
"
$ &
"
%
$ % & '
"
%
$
%
$
&
$ %
(
$
$
$
%
$
(
$
$ " $
# $
'
"
$
$
$
%
$ %
$
#
$
(
$
& '
$
$ &
"
"
"
% $
%
$
$
$ $
$
! " #
% #
$
" $
"
$
$
(
&
$ &
"
(
$
#
$
"
% # %
%
%
"
$
#
* '
$ $
" $
%
%
"
% & '
"
n/d
!
$
"
n
'
#
%
#
% &
d 0
$ %
%
$
$ & '
" & '
(
$
$
=
+
%
%
+
%
%
(
(
%
$ %
! %
"
,
'
(
$
+
"
%
%
=
=
=
"
$
(
'
"
* '
#
* &
'
"
$
%
$ % (
(
=
%
$
"
,
$
+
" & '
! " #
$ %
"
$
#
#
" $
+
% #% # $
= +
(
=
$
,
%
# "
$
$
+ $
"
! " '
$
$
% #% #
% & '
%
$
$
" $
"
!
%
& '
%
% & '
%
# $
(
"
!
& '
$
"
$ $
" #
&
$ & ,
= â&#x2C6;&#x2019; + â&#x2C6;&#x2019;
=
%
%
$ &
â&#x2C6;&#x2019;
+
â&#x2C6;&#x2019;
&
% ,
$ &
* #
% #% # $
" $
"
% #% #
#
* #
$
"
#
$ &
%
"
"
*
" #
$
'
# *
" $
$
%
"
"
% #% #
$
* #
$
$
(
% (
&
(
"
% #
"
" #
"
%
$ %
%
,
#include <stdio.h> #include <stdlib.h> #include "queue.h" #define ORD 10 int main(int c, char**args) { int signal=1; double r, y, ratio, error; long num, den, a; double x, epsilon=0; Q nk, dk; if (c < 2) { fprintf(stderr, â&#x20AC;&#x153;USAGE: f2f <float> [<epsilon>]â&#x20AC;?); exit(0); } nk = Qinit(ORD); dk = Qinit(ORD) ; Qput(nk, 1); Qput(dk, 0); x = atof(args[1]); epsilon = atof(args[2]); if (x <0) { x = -x; signal = -1; } a = (long) x; Qput(nk, a) Qput(dk, 1); r = x - a;
if (r) y = 1.0 / r; else { printf(â&#x20AC;&#x153;%ld\nâ&#x20AC;?, a*signal); Qfree(nk); Qfree(dk); return 1; } for(;;) { a = (long) y; num = Qget(nk) + a * Qfront(nk);
/* n[k] = n[k-2] + a * n[k-1] */
den = Qget(dk) + a * Qfront(dk);
/* d[k] = d[k-2] + a * d[k-1] */
ratio = (double) num / double (den); error = fabs(x - ratio); if (error <= epsilon) { printf(â&#x20AC;&#x153;%ld/%ld \nâ&#x20AC;?, num*signal, den); break; } Qput(nk, num); Qput(dk, den); r = y - a; /* Aqui r != 0; caso contrĂĄrio o ciclo teria sido interrompido no break anterior. */ y = 1.0 / r; } Qfree(nk); Qfree(dk); return 0; }
! " #
" #
$
#
& '
$
"
(
> f2f 0.333333333 <return>
1/3
(
'
# $
"
$
%
* '
$ * #
" $
!
% *
#
"
$
%
$
* '
(
(
(
$
%
"
" #
& '
# " #
$
( ( (
$
$
& '
& '
( ( (
& '
+
% & '
"
"
+
,
"
*
% & '
%
$
#
$
% *
$
% (
( ( + % # & ( ( (
$
" &
% '
$
" & '
* $
"
$
( ( (
& '
% #
% #
% *
(
(
+
%
" # !
%
$
#
"
"
% & '
"
%
%
"
$
%
%
% & '
"
"
% & '
$ (
( ( " # & ( (
(
&
%
(
$
$
$ % # $
& '
"
% (
*
#
%
"
(
"
$
+
"
" &
,
(
" #
" #
# " #
# " # % & '
#
#
$ % # $
$
&
$ $
"
%
+
%
%
#
$
'
#
(
16. O tipo de dados abstracto polinĂłmio
#
$
$
" # !
%
!
%
*
%
$
"
# $ $
$
%
%
# *
%
$
#
"
%
"
#
% (
%
"
%
$
(
%
$
# " #
$
%
" #
" %
"
#
"
% %
#
" % #
#
#
%
%
& '
*
$
"
+
(
+
$
" #
"
& '
"
$
(
+
"
(
"
#
$
% $
$ ,
! "
%
"
(
#
,
( )=
#*
* * #
%
$
%
"
*
#
" % #
"
#
$
"
! " #
" & '
%
#
"
# $ $
" & '
"
% &
+
+
! " #
"
$
"
# (
%
& '
â&#x2C6;&#x2019;
( )=
+
+
+ $
$
"
'
"
#
=
! "
$
$
=
+
=
( )=
( )=
(
=
( )
#
( )+
#
=
=
=
"
#
( )=
( )=
"
+
â&#x2C6;&#x2019;
â&#x2C6;&#x2019; +
%
%
$
#
! "
%
( )=
$
( )= (
â&#x2C6;&#x2019;
=
"
#
â&#x2C6;&#x2019; +
# " # %
" $ $
)(
$
*
# " # % & '
$
#
#
$
)
â&#x2C6;&#x2019;
"
$
â&#x2C6;&#x2019; +
â&#x2C6;&#x2019; +
â&#x2C6;&#x2019; + â&#x2C6;&#x2019;
"
* ,
,
"
%
#
+
+ â&#x2C6;&#x2019;
$ *
#*
#
%
$
"
(
$
"
#
$ *
"
%
+
$ $
x
$
"
#
%
"
"
#
(
(
"
#
%
$
"
" &
% #% #
%
#
" $
" # *
! %
%
$
* #
$
$ & '
%
$
% & '
#
#
"
P(x)
# " # % & '
+
#*
&
%
, "
$
%
"
+
"
#
,
# (
typedef struct poly *POLY; float POLYeval(POLY, float); POLY POLYadd(POLY, POLY); POLY POLYmult(POLY, POLY); void POLYprint(POLY); void POLYfree(POLY);
&
% "
$
% *
"
%
,
#include "poly.h" void f(POLY a, POLY b, POLY c) { POLY tmp, e; tmp = POLYmult(a, b); e = POLYadd(tmp, c); POLYfree(tmp); POLYprint(e); POLYfree(e); }
$
+
"
%
#
"
$
%
%
$
%
% $ $
" & '
# %
"
%
#
$
$ %
"
$
$
" #
$ %
" #
#
#
& '
&
$
&
$
(
$
%
+
$
%
" % #
" # (
" #
& '
"
#
"
#
%
%
$
&
$ %
#
$
"
%
"
#
%
#
"
#
%
'
$
%
#
'
%
%
"
%
$
#
'
$
%
% %
â&#x2C6;&#x2019;
"
"
$
( )=
$
$
(
$
$ $
% $
! "
$
(
%
,
,
! "
,
$ % & '
%
$
%
%
$ $
"
,
"
$
+
$ $
! " #
"
$
$
%
$
$ % *
"
$
$
/* ficheiro: poly1.c */ #include "poly.h" struct poly{
,
int degree; float *coefs; };
"
" #
#
"
*
+
p
# $
+
"
& '
x
% # %
" &
! " #
!
#
!
"
(
#
!
POLYeval(POLY p, float x)
#
$
% #% #
(
!
#
(((
!
" $ $
$
* & '
% #% #
!
* #
$
$
,
!
,
+
+
=
+
+
+
,
float POLYeval(POLY p, float x) { int i; float re = p->coefs[p->degree]; for(i=(p->degree)-1; i >= 0; i--) re = re*x + p->coefs[i]; return re; }
! % & '
$
& '
* $
# $
" % ,
+
+
+
+
+
+
/* PRE: n >=0 */ /* POS: Instância de polinómio cujo grau Ê n e todos os coeficientes são zero */ static POLY POLYnew(int n) { POLY re = (POLY) malloc(sizeof *re); if(!re) { fprintf(stderr, "Insuficient mem in POLY new \n"); exit(1); } re->degree = n; re->coefs = (float *) calloc(n+1, sizeof(float)); if(!re->coefs) { fprintf(stderr, "Insuficient mem in POLY new \n"); exit(1); } return re; } /* Liberta a memória usada pelo polinómio p */ void POLYfree(POLY p){ free(p->coefs); free(p); } /* Multiplicação dos polinómios p e q */ POLY POLYmult(POLY p, POLY q) { int i, j;
POLY re = POLYnew(p->degree + q->degree); for(i=0; i<=p->degree; i++) for(j=0; j<=q->degree; j++) re->coefs[i+j] += p->coefs[i]*q->coefs[j]; return re; }; /* Adição dos polinómios p e q. */ POLY POLYadd(POLY p, POLY q) { int i; POLY re= POLYnew(max(p->degree, q->degree)); for(i=0; i <= p->degree; i++) re -> coefs[i] = p->coefs[i]; for(i=0; i <= q->degree; i++) re -> coefs[i] += q->coefs[i]; return re; }
" #
& '
$
& '
POLYprint
" #
$ $
( )=
& '
# * $
+
$
+
( (
"
% #
$
$ ! $
%
! %
%
(
#
$
$
$
( )=
$
$
+
#
"
+
$
(
"
+
*
#
%
"
$
%
$ " $ &
%
#
'
! " #
"
" #
& '
$
& '
"
! " #
"
$
% $
$
"
#
A(x)
#
$
"
#
#
# $
# * $
$
!
"
%
# *
$
$
"
" %
$
% $
%
"
" $
$
#
# & '
$
%
"
! "
$
#
$
" #
!
%
"
"
(
%
$
#
( $
%
" $ (
" #
$
%
%
! "
$
(
# * $
%
&
$
#
$
#
"
+
% " &
"
"
*
#
%
%
* '
#
$ $
"
%
*
%
%
$
#
$ % %
'
'
&
$ $
%
$
(
"
$
%
$
! "
(
'
$
(
!
" *
"
*
#
$
#
" #
"
* #
#
# $
#
$
%
$
$
%
#
$ *
%
# & '
#*
"type.h"
"
$
%
$
#
$ % #
(
# $
$ % $
$
type
(
% * ,
/* ficheiro type.h */ typedef struct { int expo; float coef;} type;
%
$
" #
& '
poly2.c
"
$
%
$
,
#include "poly.h" #include "sllist.h" #include "type.h" struct poly { int degree;
/* NĂŁo ĂŠ absolutamente necessĂĄrio */
link head, last; }; /* PRE: n >=0 */ /* POS: Instância de polinómio */ static POLY POLYnew(int n) { POLY re = (POLY) malloc(sizeof *re); if(!re) { fprintf(stderr, "Insuficient mem in POLY new \n"); exit(1); } re->degree = n; re->head=NULL; re->last=NULL; return re; } /* PRE: !p */ void POLYfree(POLY p){ lstremove(&(p->head)); free(p); }
/* PRE: p != NULL */ float POLYeval(POLY p, float x) { int i; link l = p->head; float re = l->item.coef; l = l -> next; for(i=(p->degree)-1; i >= 0; i--) if(l->item.expo == i) { re = re*x + l->item.coef; l = l -> next; } else re *= x; return re; }
&
%
&
$
(
"
"
#
%
" % %
"
$
"
#
" #
"
$
%
"
$
#
$
$
%
%
$
& $
%
$
$
" #
,
"
#
'
$
" % *
# (
( )=
â&#x2C6;&#x2019;
( )=
â&#x2C6;&#x2019; +
( ) = ( )+ ( )
)
%
! "
$
%
#
"
%
(
% %
'
! " #
*
# ( * &
"
"
#
"
# $
!
,
"
#
* &
% #
$
q
'
"
"
"
! " #
!
"
#
$
p
*
% %
,
)
$
p
! "
(
$
p
% # $
q
'
% #
$
"
#
# $
% #
$
# $
(
"
"
$ '
% $
,
!p && !q
$
% % $
"
$
"
" #
#
"
#
$
%
$
# $
"
#
$
(
,
POLY POLYadd(POLY p, POLY q) { float sum; POLY re; link ph = p->head; link qh = q->head; re = POLYnew(max(p->degree, q->degree)); while (ph && qh) { if(ph->item.expo == qh->item.expo) { sum = ph->item.coef + qh->item.coef; if(sum) POLYappend(re, ph->item.expo, sum); ph = ph -> next; qh = qh -> next; } else if(ph->item.expo < qh->item.expo) { POLYappend(re, qh->item.expo, qh->item.coef); qh = qh -> next; } else { POLYappend(re, ph->item.expo, ph->item.coef); ph = ph -> next; } } for(; ph; ph=ph->next) POLYappend(re, ph->item.expo, ph->item.coef); for(; qh; qh=qh->next) POLYappend(re, qh->item.expo, qh->item.coef); return re; }
/* Acrescenta um novo termo à representação do polinómio p; */ /* PRE: (c!=0) && (p != NULL ) && ( p->last==NULL || ( p->last !=NULL && e < p->last->item.expo ))*/ static void POLYappend(POLY p, int e, float c) { type t; link nn; t.coef = c; t.expo = e; nn = lstnnode(t); if(p->head==NULL) p->head = nn; else p->last->next = nn; p->last = nn; }
" #
& '
$
&
$ ! $
%
! %
%
(
(
$
"
+
"
#
%
" #
& '
"
#
$
#
# $ (
,
(a) A(x)=1 (b) B(x)=1-x2 (c) C(x)=x20 (d) D(x)=x16+8x2+1 (e) A(x)+B(x) (f) A(x)+B(x)+C(x)+D(x)
(
$
" #
! (
$
$ $
"
&
"
&
$
* '
# $
#
void POLYshow(POLY p)
$
(
#
" #
$
" #
$
$
%
'
#
# $
$
% #% #
$
* #
"
" &
% # $
#
# $ (
$
"
! " #
#
$
$
"
" # ! $ $
#
"
%
"
$ % (
#
$
#
#
"
#
"
# $
$
& '
" (
(
POLY POLYmult(POLY,POLY) $
#
(
"
& '
& '
%
"
# " # % & '
$
& '
,
POLY POLYfromUser(void) "
%
"
float POLYeval(POLY p, float x) "
+
"
(
$ *
#* $
17. O ADT matriz esparsa
%
"
$
$ $
*
$
" & '
$
"
# $
%
%
" # % &
,
(
,
int mi[Linhas][Colunas];
*
% $
$
"
%
,
int **ppi; ppi=malloc2d(Linhas, Colunas);
ppi[i][j]
*
$
$
%
%
'
#
#
"
#
$ " $ &
$
$
$
$
#
$
i
%
#
j
% * $
mi[i][j]
(
"
%
(
'
'
#
"
$
$ %
$ $
%
$
%
$
"
$ * # $
$
%
#
"
"
!
" (
"
(
$
"
" #
!
% &
& '
$
"
$
"
"
%
$
"
%
$
%
%
+
# *
"
"
#
*
$
+
" (
$
" #
& '
"
"
#
(
#
$
*
# " #
$
$
% (
&
#
/* ficheiro matrix.h */ typedef struct matrix* M; /* Liberta o espaço ocupado pela matriz */ void Mfree(M); /* Calcula a transposta da matriz */ M Mtranspose(M); /* Calcula a soma das matrizes a e b */ M Madd(M a, M b); /* Calcula a multiplicação das matrizes a e b. */ M Mmult(M a, M b);
$
#
$
"
"
$
"
$
% %
" $
"
$
"
" #
<linha, coluna, valor>
$ " #
(
(
! " #
"
"
$
" $
" #
(
(
$
!
$
#
#
,
" #
, !
"
" #
& '
$
$
+
"
"
$
$ $
,
/* ficheiro matrix1.c */ #include "matrix.h" #include "type.h" typedef struct{ int row, col; type value; } triple; struct matrix { int norows, nocols, actsize; triple *triples; };
/* inicializa uma matriz PRE: r >0 && c >0 && s > 0 */ static M Minit(int r, int c, int s) { M m = (M) malloc (sizeof *m); if (!m) { fprintf(stderr, "Minit exception: Not enough mem. for another matrix.\n"); exit(1); } m -> triples = (triple *) malloc(s*sizeof(triple)); if (! m->triples) { fprintf(stderr, "Minit exception: Not enough mem. for triples. \n"); exit(1); } m->actsize = s; m->norows = r; m->nocols = c; return m; } void Mfree(M m) { free(m->triples); free(m); }
"
&
mxn
'
" *
:
6
6
2
6
8
6
6
6
6
6
6
6
6
5 0
2 3
"
!
A
nxm
(
4
2
+ "!
j
71 ; / / /
=
i
4
:
6
6
2
6
8
6
69
6
6
6
6
7
6
6
5 0
2 2 3
A
"
at[i][j] -
#
)
$ %
a[j][i]
#
AT
a[j][i]
" .
' ,
1 / / /
9
!
! "
!
!
for(i=0; i<m; i++)
)
"
m ==
for(j=0; j<n; j++) n ==
+
+ "
+ "!
A
#
+ $
!
.
A
'
" *
'
A
at[i][j]=a[j][i]; !
! "
)
)
!
!
#
+ $
!
+ " + .
/* Versão 1: Sem preocupaçþes de ordenação dos elementos da matriz transposta */ /* PRE: m->actsize > 0 */
Mtranspose(M m) { int i; M t = Minit(m->nocols, m->norows, m->actsize); for (i=0; i < m->actsize; i++) { t -> triples[i].row = m -> triples[i].col; t -> triples[i].col = m -> triples[i].row; t -> triples[i].value = m -> triples[i].value; }; return t;
}; "
-
" .
=
# # #
#
# # # # # #
)
# # #
#
# # # # # #
" *
+ "!
# # # # # # #
#
# #
+
+
+
" *
)
+
" *
"
+
+
+ "! '
"
)
# +
+ "
"
)
"$ !
&
!
'
)
!
+ "+ ! "
!
, +
$ "
+
)
'
)
+
+ " +
+
"
+
$ !
+
$ !
.
$ "#
+
+ "!
!
+
$ "
" *
+
! %
+ $
"
)
!
!
+ "!
-
'
elcol
-
" .
'
elcol[0]=2 elcol[1]=1 elcol[2]=0 elcol[3]=2
+
!
"
" *
!
"
" *
#
#
" *
'
"
$ !
"
" *
# +
+ + #
" *
elcol[0]
#
#
t
# +
t->triples[2]
"
" *
+
spos
t->triples[3] &
+ $
!
+
elcol[0]+elcol[1]
#
'
"
(
'
t->triples[0]
$ !
!
)
Mtranspose
!
'
+
+
.
/* Versão 2: A matriz transposta retornada pela função tem os seus elementos ordenados por valores crescentes de linhas e dentro das linhas por valores crescentes de colunas */ /* PRE: m->actsize > 0 */ M Mtranspose(M m) { int i, j; M t = Minit(m->nocols, m->norows, m->actsize); int *elscol = callocd (m->nocols, sizeof(int));
int *spos = callocd (m->nocols, sizeof(int)); for(i=0; i < m->actsize; i++) elscol[m->triples[i].col]++; for (i=1; i < m->nocols; i++) spos[i] = spos[i-1] + elscol[i-1]; for (i=0; i < m->actsize; i++) { j = spos[ m->triples[i].col]++; t -> triples[j].row = m -> triples[i].col; t -> triples[j].col = m -> triples[i].row; t -> triples[j].value = m -> triples[i].value; }; free(elscol); free(spos); return t; };
!
)
callocd
!
)
!
)
!
! "
'
calloc
+ "
!
<stdlib>
"
" + )
#
"
!
'
/* Calcula a matriz a+b */ /* PRE: (a->nocols == b->nocols) && (b->norows == b->norows) */ M Madd(M a, M b) { int i=0, j=0, n=0, sum=0; int maxsize = max(a->actsize+ b->actsize, a->norows*a->nocols); M c = Minit(a->norows, a->nocols, maxsize); /* Neste momento, podemos dizer que no max, a matriz c = a+b, tera' um no de elementos igual a max( a->actsize + b->actsize, a->linhas*a->colunas); Posteriormente actualizaremos o actsize de c */ while( (i < a->actsize) && (j < b->actsize)) { if (a->triples[i].row < b->triples[j].row) c->triples[n++] = a->triples[i++]; else if (a->triples[i].row > b->triples[j].row)
c->triples[n++] = b->triples[j++]; else { /* a->triple[i].row == b->triples[j].row */ if (a->triples[i].col < b->triples[j].col) c->triples[n++] = a->triples[i++]; else if (a->triples[i].col > b->triples[j].col) c->triples[n++] = b->triples[j++]; else { sum = a->triples[i].value + b->triples[j].value; if (sum) { c->triples[n].value = sum; c->triples[n].row = a->triples[i].row; c->triples[n].col = a->triples[i].col; n++; } i++; j++; } } } for( ; i < a->actsize; i++) c->triples[n++] = a->triples[i]; for( ; j < b->actsize; j++) c->triples[n++] = b->triples[j]; c->actsize = n; return c; }
-
"
!
"
'
"
$ !
.
"*
+
!
$ !
!
+
"
+
"
# !
"
" * #
!
+ "!
"
!
)
"
"
!
"
+
'
)
"
"
)
! "
!
"
&
#
&
!
!
"
$
!
!
!
+
)
"
' ,
&
!
!
'
!
!
"
#
)
) '
!
! !
"
- "
!
+
! +
"
+ "
#
! "
'
-
"
.
)
"
!
"
+ "
)
+
!
! "
+ !
# !
+
!
!
$ !
+ !
'
$
!
+
"
)
+
+
)
! " +
+
!
s0, s1, s2,
s3
+ "
#
+
'
)
! !
'
"
"
+
-
" *
+ "!
(
'
( "
# +
s0, s1, s2 e s3
"
+ + ! "
"
+
"
+ + ! "
'
+ "!
!
" *
!
"
" *
"
!
)
) #
! "
+
"
!
# !
$ !
"
+
!
max(l,c)+n
!
i
' (
" $
' ,
"
!
$ !
+
+
l
!
+
"
" * #
c
!
+ "!
i
'
+ "!
'
$
! )
!
+ .
!
$ !
$
+
.
(
next
rigth
down
!
-
! # !
"
" *
+ "!
$ !
+
$
! )
i
i
'
!
+ .
,
n
.
(
row
%
col
%
value
%
rigth
!
%
down
!
%
"
!
" *
"
"
"
)
" *
-
+ "!
-
! "
right
! "
! "
)
)
+ "!
down
(
"
row
col
'
" '
!
+
"
! !
+
+
+ ! "
+
! !
' +
#
+ !
"
' , !
#
+
+
! !
! "
+
!
)
!
! )
union)
!
+ "!
'
"
#
"
$ !
#
+
+ "
) #
+
*
$ !
matrix2.c
#
.
/* ficheiro matrix2.c */ #include "matrix.h" #include "type.h" typedef struct node* link; typedef struct{
int row, col; type value; } triple; struct node{ link down, right; union { triple data;
/* Para os nรณs de dados */
link next;
/* Para os nรณs sentinela */
} u; }; struct matrix { int norows, nocols; int actsize; link head; };
$
!
! "
"
%
"
!
!
)
+
MfromUser
+
!
#
! !
!
!
'
)
!
!
&
! "
!
!
)
+
!
!
!
! "
'
" *
+ "!
"
#
"
$ !
)
"
! " '
"
"
+
!
"
+ + ! "
&
!
#
)
+
" $ '
!
)
"
$ !
!
! !
+
-
"
+ !
'
!
)
+ ! # "
"
" *
" * '
!
+
$ !
"
)
! "
" $
"
+
!
-
$
!
'
-
%
! !
' (
+
$ !
"
" *
# + "!
'
+ !
" $ &
!
-
#
+
#
,
!
$ !
" + " )
"
"
+
" *
+
+ "! '
)
$ !
"
- $
$ !
' "
&
+ $
!
.
typedef struct { link next; link lastdown; link lastright; } links ; struct node{ link down, right; union { triple data;
links connection; } u; };
+ $
!
)
MfromUser
(
$ !
!
+
+ !
" $ &
.
M MfromUser(void) { /* â&#x20AC;Ś */ m = Minit(l,c); row = m->head; for(i=0; i < l; i ++) { col = m->head; for(j=0; j< c; j++) { printf("(%d, %d): ", i, j); scanf(printfstring, &t); if(t) { pn = Mnnode(); pn->u.data.value = t; pn->u.data.row = i; pn->u.data.col = j; row->u.connection.lastright -> right = pn; row->u.connection.lastright = pn; col->u.connection.lastdown -> down = pn; col->u.connection.lastdown = pn; } /* ... */ }
!
$
!
+ *
" *
#
! !
-
"
'
+ $
"
-
+
+ +
-
(
%
"
#
!
#
'
+
" *
+ "!
! +
!
$
)
!
! "
"
"
+ + ! "
"
Mprint )
!
"
'
+ * %
'
"
" *
+ "!
' (
!
"
)
Mprint )
!
" *
(
" * '
void Mprint(M m) { link row = m ->head; link i = row; do { i = i->right; if (i == row) { i=i->u.connection.next; row=i; } else{
printf("(%d, %d ): ", i->u.data.row, i->u.data.col); printf(printfstring, i->u.data.value); printf("\n"); } } while( i != m->head ); };
"
!
&
"
!
,
# + "!
!
)
'
$ !
'
!
!
+ !
+
)
" '
+
+ $
!
"
!
! +
&
!
!
' '
!
"
)
$ "
!
-
'
!
!
+
"
$ " + " '
+ "
$ !
!
&
.
! )
!
+ "
!
!
+
'
+ "
! )
!
!
!
'
! )
$ !
!
"
$ !
'
$ !
! )
!
+ )
$ !
'
"
!
)
"
!
)
'
+
+
!
$
"
+ )
)
!
+ "
+
! "
'
!
+ "
+
+
&
â&#x2C6;&#x2019;
.
!
"
'
'
"
$ !
%
!
!
!
M MfromUser(void)
&
.
! "
+
"
!
"
'
void Mprint(M m)
!
!
+ )
'
+
type Mvalue(int i,int j) +
"
"
"
+
#
#
'
+
!
)
M Mtranspose (M m)
'
+
! - "
#
! "
)
! "
!
'
" '
+ "!
!
!
"*
+ "+ ! "
' $
)
!
-
+
"
"*
$ !
+
#
+ "+ ! "
+
+
" *
.
' (
load <nome de ficheiro>
$
+
+
!
"*
+ "+ ! "
$
+
*
'
save <nome de ficheiro>
+ *
+
+
"*
+ "+ ! "
-
'
<l> <c> <v> " +
l <i>
c <j>
"
"*
+ "!
<l>
<c>
+ "! "
-
" *
+ "! "
-
+ "!
!
+ ! )
-
-
"
+ ! "
$
+ !
!
"*
+ "+ ! "
'
" *
+
quit
#
clear
<v>
<i>
!
<j>
"*
+
+
$
+ "+ ! " '
18. Primeiras noçþes sobre årvores
"
)
!
-
+ )
"
!
! "
*
!
"!
"
!
+ +
"
'
!
"
$
!
" $ +
# # #
+ '
!
+ '
+
!
!
+
)
"
+
$
(
!
"
!
$
!
"#
'
$ + #
! $ !
'
+
!
"
!
$ $
. !
+ !
!
! ) #
+ )
)
#
#
+ "
!
+ #
+ '
+
+ !
*
#
+
+
*
!
)
$
!
) #
+
!
!
#
.
$ !
%
'
+
)
! )
+
*
+
-
&
" $
"$ + # !
!
$
$
"
'
-
&
!
" $ ! $
"#
)
+
'
-
" #
-
)
"
,
!
+ "
! " " + )
+
+
"
'
"
#
!
+
+
, " $
'
! !
-
" #
+ ! )
-
! +
$
!
,
- " +
+ ! "
!
+
"
!
)
+ +
"!
+ )
'
&
'
)
'
+ )
+ "
!
+
)
+ ! "
!
$
+
!
+
!
#
"
" $
# !
$
!
"
' !
)
+ !
+
+ +
⊆
!
!
+
+ !
# #
)
+ #
!
$ !
+ !
!
)
' (
!
#
!
+
'
*
!
!
"
+ !
+
)
" $
+
+
.
-
' - +
!
+
*
! " !
'
+ !
-
"
#
# # # #
# # # '
-
!
$ !
$ !
.
'
•
"
â&#x20AC;¢
+
â&#x20AC;¢
â&#x20AC;¢
'
!
%
+
'
+
!
!
+ "*
!
'
!
# ! " !
+
!
! %
+
"
-
" '
! "
$
+
!
+
+
'
+
!
+ + ! "
!
!
#
+ + ! "
! "
-
"
+
!
" #
!
.
'
#
- +
#
- +
!
+
#
!
'
+
*
!
n
n
-
i
!
i
+
n
i
'
+
-
n
(
"*
n
)
)
+ *
"*
!
! +
n
'
) '
"*
#
!
+ *
$ !
(
$ !
!
' (
"
-
$ !
'
"*
%
"*
!
"
+
"
"*
!
)
+ *
)
" '
)
!
!
+
)
"
! +
+
'
$
+
!
! +
+
!
*
+
! +
"
!
)
!
' (
$
+
!
)
$ !
*
! "
"*
# ! "
!
'
+
!
!
#
)
!
!
! +
#
M -
)
'
#
"*
'
$
!
$ !
!
# '
-
)
!
'
+ + ! " + '
#
"*
#
!
+
!
#
- +
+
"*
.
-
#
'
!
!
"*
"*
"*
!
'
-
%
)
#
!
+ *
%"*
!
"*
"*
' !
+
#
!
!
"*
)
'
!
!
"*
M
)
-
#
!
"*
+
!
!
'
!
+ !
" $
!
+
%
(
'
!
!
&
+
+ !
!
#
- " +
"
+ !
!
+
&
! "
! !
+ !
'
,
!
#
!
!
" #
!
!
'
)
+ !
" $
! %
!
.
# !
)
+ *
-
!
! %
!
'
$ !
+ +
!
"
)
-
'
"
+ )
! !
#
+ "!
)
"
+
"
!
"
+ "
!
!
"*
)
'
-
'
&
!
!
"*
"
+ "
+ "
#
#
+ !
+
+
)
-
)
$ !
#
)
' -
&
-
+
-
+ + '
)
+ "
)
!
, !
+
" '
#
%
- +
+ *
!
! "
!
+ *
"
'
"
"
+ "
+
!
!
-
+ *
!
" '
" $ &
"
!
+
!
+
"
!
+
' !
)
" '
-
" #
$ !
)
+ *
#
" $
)
+ "
,
'
-
"
+
!
)
# +
'
"
&
+
+
!
-
!
! !
+
" $ &
!
+
links)
"
(
'
links
! "
'
!
+ !
"
)
)
! "
+ +
.
.
+
+
$ ! "
!
+
$ !
! ! .
(
typedef struct node *link; struct node { type item; link left, right; };
+
)
+
!
)
-
"
+
+
" $
!
&
+
!
' ,
+
! !
node
# !
-
+
!
+
!
+
link
'
!
)
!
+ !
+ !
" $
M
!
M
! +
! +
.
+ *
"
%
!
'
M
!
"
-
)
! +
'
"
!
! '
+ *
!
" $
!
! '
)
!
"*
!
M
+
!
!
!
"
+
"*
M
! " !
" $
"*
!
+
!
'
!
! " !
$ !
links
links
#
'
"
$
+
#
$ !
!
+
-
"
.
)
!
"
!
-
'
)
!
"
+ "
!
" $
+
+
!
! +
!
!
#
" $ &
!
!
) '
!
#
,
+
!
)
!
link
#
!
!
n
$ "#
!
!
$
link
#
n
"*
!
$ " '
!
-
#
,
"
#
$
! '
!
%
)
"
)
%
!
"*
)
)
+
%
%
)
'
+
)
!
)
+ !
+ *
"
%
!
" $
)
'
+ !
!
'
!
)
!
!
,
#
)
!
#
!
!
'
$ !
)
!
'
'
!
"* #
-
'
"
)
+
"
" $ '
+
!
!
" '
)
"*
!
)
'
"
$ !
*
!
!
+
'
!
+ !
+ # %
#
% #
%
#
%
%
#
"
'
19. Ă rvores binĂĄrias
!
!
&
! " )
#
+
"
!
&
"
# #
!
"
&
# !
+ ! '
+
"
!
!
+ " + %
$ !
.
!
!
!
#
!
+
+
'
"
+
!
"
" $
$ !
!
link
!
# +
"
.
.
void lsttraverse(link l, void (*visit) (link)) { if (!l) return; visit(l); lsttraverse(l -> next, visit); }
+
visit
!
!
)
!
+
+
!
)
'
#
+
+ !
"
lsttraverse
$ !
'
link
+
+
!
+
+ !
'
'
"
#
"
!
#
"
, #
!
"
+ !
.
! %
!
! %
'
#
#
-
)
$ " % - + .
'
! %
!
#
preorder traversal
! %
#
'
# '
+ !
-
'
'
inorder traversal
! %
!
#
'
# '
!
-
postorder traversal
# +
+
$ !
+ !
'
)
"
.
void ttraverse( link l, void (*visit) (link)) { if (!l) return; visit(l); ttraverse(t->left, visit); visit(l); ttraverse(t->right, visit); visit(l); };
# +
.
typedef struct node *link; struct node { type item; link left, right;
};
+ !
-
!
-
)
$ ! "
( -
&
+
visit(l)
+
#
visit(l)
"*
+ !
$
-
)
$
infixo
'
%
'
+ !
!
+
-
%
+ !
.
prefixo
! +
+ *
!
&
$ !
.
ttraverse(R) visit(R) ttraverse(A) visit(A) ttraverse(C) visit(C) ttraverse(E)
visit(E) ttraverse(NULL) ttraverse(NULL) ttraverse(F)
visit(F) ttraverse(NULL) ttraverse(NULL) ttraverse(NULL) ttraverse(B) visit(B) ttraverse(D) visit(D) ttraverse(NULL) ttraverse(G) visit(G) ttraverse(NULL) ttraverse(NULL) ttraverse(NULL)
!
!
+
!
#
+ !
sufixo
!
prefixo
"*
!
#
+
"
! "
! "
%
)
+ !
infixo
+
+
'
'
!
! +
+
$ !
!
!
+ !
-
+
$ !
)
+ !
!
-
! +
.
!
)
-
)
! +
+
$
!
)
!
-
+
$ !
+
-
!
+ !
-
"
'
-
! "
"
! "
!
+
'
"
$ !
$
+ *
.
+ !
+ *
+ !
" $ !
'
!
)
!
* PRE: l!=NULL
"
$
$ !
.
void tlorder(link l, void (*visit) (link)) { static int MAXN=10; QUEUEinit(MAXN); QUEUEput(l); while (!QUEUEempty()) { l=QUEUEget(); visit(l); if (l->left) QUEUEput(l->left); if (l->right) QUEUEput(l->right);
} } !
+ !
!
)
!
!
!
! !
+
( !
" +
#
+
"
#
!
!
" +
#
(
!
+ !
!
+ "+ ! "
)
)
+ !
#
+
#
!
$ !
'
!
!
! # +
prefixo
+
(
!
)
$ !
(
int tcount (link l) { if (!l) return 0; return 1+ tcount(l->left)+ tcount(l->right); };
)
+
"
!
+
!
)
+
!
)
'
+
-
#
!
)
!
"
+
)
!
+ "+ ! "
$ ! '
+
'
!
! )
,
! )
'
!
!
! )
-
$ !
.
!
#
' (
-
"
!
# ! " !
+
%
,
!
!
!
"
*
! ) #
!
!
!
' ,
-
-
!
-
#
!
"
'
!
"
.
!
+
" $ &
(
+
'
!
"
!
!
"
!
!
(
!
-
" .
'
"$ !
!
#
!
+
!
'
)
+ #
+
!
+
+
" $ &
)
!
"
+
!
!
#
+
+
#
!
'
" !
!
"
-
'
" !
!
" !
!
+
+
!
"* '
" !
!
'
!
)
!
+ "+ ! "
" !
!
.
/*PRE: t != NULL */ int theight (link t) { if (!t) return -1;
return 1+ max(theight(l->left),theight (l->right)); };
max
!
)
!
+ "+ ! "
-
'
-
!
!
!
"
(
! )
'
'
-
!
" !
h
$
)
(
1 + 2 + ... + 2h =
2(h+1)-1.
) #
!
' ,
+
=
â&#x2C6;&#x2019;
â&#x2C6;&#x2019;
=
$
!
!
.
!
$
+
!
)
!
+ !
' -
"
+ !
!
+ "
#
" !
h
#
+
"
"
'
link trand( int h ) { if (h < 0 ) return NULL; link tmp=tnnode(rand()%10); tmp->left=trand(h-1); tmp->right= trand(h-1); return tmp; };
!
!
)
!
+
!
!
.
link tnnode( type t) { link tmp=(link) malloc (sizeof *tmp); if (!tmp) { fprintf(stderr, â&#x20AC;&#x153;Erro na alocação de memĂłriaâ&#x20AC;?); exit(1);} tmp->value=t; tmp->left=NULL; tmp->right=NULL; return tmp; };
+
!
!
)
!
+
"*
!
'
'
+
!
!
)
!
+
!
!
"*
!
'
!
-
'
+
!
!
)
!
!
"*
'
'
+
!
!
)
!
"
+ !
!
'
'
+
!
!
) # )
+ ! # !
+ !
+ )
!
'
!
-
-
+
!
-
+
!
!
+ !
!
)
!
!
" !
' !
" '
$ !
!
'
+
!
!
)
!
+ !
!
+
!
'
# +
" !
" '
'
+
!
!
)
!
+
+
!
!
)
!
"
!
'
+
!
'
"
!
'
!
'
'
+
!
!
)
+
!
+ !
" !
+
+
" '
+
!
!
)
!
!
'
+
+
!
!
)
!
"
!
'
20. Acervos e filas com prioridades !
+
% #
!
+ #
"
"
+
(
*
!
+
!
&
"
$ !
)
)
+ "
-
"
'
+
&
!
"
)
+
"
)
&
'
PQput )
"
PQdeletemax
+
" $
" $
"
# !
+
!
)
!
+ !
"
)
$
!
#
!
+ *
'
! +
!
+
+ "
"
!
#
!
+
$ !
!
!
$ ! "
+ *
+
. !
+ *
+
!
+
#
+
-
!
! "
#
+ *
$ !
!
!
$ ! "
+ *
!
'
!
-
"
!
+
' (
' (
$ !
!
+
!
+
#
!
!
" )
)
! " !
+ )
#
+
!
+
!
!
!
!
+ )
+
+
+
!
!
#
'
+
,
#
'
"
#
!
+ !
+
+
+ *
$
+
+ )
'
!
+
!
!
" )
+
+
'
!
%
!
+
!
!
+ *
!
$ ! "
+ *
!
"*
#
! " !
) # !
!
"*
!
#
)
'
%
!
) '
+
!
+
"!
+ *
%
+
)
( +
"
$ !
.
void fixUp(type *t, int position) { int father; while ( k && less( t [father = (position-1) /2 ], t [position] )) { swap(t[father], t[position]); position = father; } }
!
%
!
#
!
+ "
#
"
(p-1)/2
#
+ $
father
-
!
)
" #
p
-
+ %
" #
)
!
father = (int)
)
, +
!
+ *
#
+
!
+
# !
+ *
+
+ *
+
!
" )
)
"
!
!
#
+
(int) (4-1)/2 ,
!
"
!
,1
! $ !
+
!
+
!
#
"*
#
)
"*
'
+ *
$
+
!
" ) #
"*
+
!
+
!
!
!
'
" )
+
+
+
+ ) '
+
!
+
"!
+ *
%
+
)
(
-
"
$ !
.
void fixDown (type *t, int position, int N) { int child;
while ((child = 2*position+1) < N ) { if (child < N-1 && less (t[child], t[child+1)) child++; if (!less (t[position], t[child])) break; swap(t[position], t[child]); position = child; } }
+ "
!
)
+ *
# !
!
#
-
" #
+
+
"
)
+
"*
!
&
%
!
&
!
+ "
2*p+1 e 2*p+2 )
2*2+1 e 2*2+2
" )
" #
-
,
# )
"*
+
'
#
+ )
+
#
"
+
%
)
+
'
!
"
)
!
" "
+ #
+
.
/* Ficheiro: PQ.h */ #include "type.h" typedef struct priority_queue *PQ; /* Inicializa uma fila com prioridades, com capacidade para n elementos. PRE: n >= 0 POS: (PQempty() == 1) && (PQfull() == 0) */ PQ PQinit(PQ q, int n);
/* Liberta a memรณria usada pela fila pq PRE: pq != NULL */ void PQfree(PQ pq); /* Retorna 1 se a fila estรก vazia; retorna 0 caso contrรกrio. PRE: pq != NULL */ int PQempty(PQ pq); /* Retorna 1 se a fila estรก cheia; retorna 0, caso contrรกrio. PRE: pq !=NULL */ int PQfull(PQ pq);
/* Insere um elemento do tipo type, na fila pq PRE: pq != NULL && PQfull(pq) == 0 POS: pq!= NULL && PQempty(pq) == 0 */ void PQput(PQ pq, type t); /* Retorna e retira o elemento da fila com a maior chave PRE: pq !=NULL && PQempty(pq) ==0 POS: pq != NULL && PQfull(pq)== 0 */ type PQdeletemax(PQ pq); "
!
!
&
"
)
#
)
)
+
)
"
!
&
!
) #
!
"
"
&
$
+ " +
#
)
'
+ $
+
+ )
%
+
'
! %
$ "
)
" &
!
) #
+ )
+ %
+
"
"
!
+
+
%
!
#
"
!
!
"
"
"
!
+
'
$ !
.
/* Ficheiro: PQ.c */ struct priority_queue { int ta;
/* tamanho actual */
int cap;
/* capacidade */
type *elems;
/* array de elementos */
} /* Insere um elemento do tipo type, na fila pq PRE: pq != NULL && PQfull(pq) == 0 POS: pq!= NULL && PQempty(pq) == 0 */ void PQput(PQ pq, type t) { pq-> elems[pq->ta] = t; fixUp(pq->elemes, ta++); } /* Retorna e retira o elemento da fila com a maior chave PRE: pq !=NULL && PQempty(pq) ==0 POS: pq != NULL && PQfull(pq)== 0 */ type PQdeletemax(PQ pq) { swap( pq->elems[0], pq->elems[--(pq->ta)]); fixDown(pq->elems, 0, pq->ta); return pq->elems[pq->ta];
"
)
!
&
-
+
-
+ + '
"
+
)
+ "
!
n log n
!
#
"
+
" $
n
*
+ )
+ "
)
"
+
!
+
%
'
void PQsort(type *a, int n) { int i; PQ pq = PQinit(n); for (i=0; i<n; i++) PQput(pq, a[i]); for(i=n-1; i >= 0; i--) a[i] = PQdeletemax(pq); PQfree(pq); }
#
" $
"
! "
!
-
+ "
-
n
'
'
(
"
"
"
" $
)
-
-
+
+ + '
!
!
+
$ !
# !
) # !
+
'
'
int *a={16, 12, 9, 8, 7, 7, 3, 2 ,4 , 1, 0};
+
'
char *a={â&#x20AC;&#x2DC;xâ&#x20AC;&#x2122;, â&#x20AC;&#x2DC;mâ&#x20AC;&#x2122;, â&#x20AC;&#x2DC;nâ&#x20AC;&#x2122;, â&#x20AC;&#x2DC;aâ&#x20AC;&#x2122;, â&#x20AC;&#x2DC;bâ&#x20AC;&#x2122;, â&#x20AC;&#x2DC;eâ&#x20AC;&#x2122;, â&#x20AC;&#x2DC;câ&#x20AC;&#x2122;}; !
!
+
+
+ )
! +
"
-
" )
!
"
+
"
+
# ! .
+
"
! "
)
+
+ )
'
'
(
int *a={1, 2, 3, 4, 5, 6, 5, 4 ,3, 2, 1}; )
!
+
"
'
)
+
!
a
+
+
!
!
!
)
!
!
!
!
)
!
+
'
'
"
"
)
!
&
+
"
+
'
+
'
'
" $
)
+
!
" $
" $
,
!
)
+
+
-
!
!
"
'
ReferĂŞncias bibliogrĂĄficas
#
#
#
#
#
#
#
'
#
#
'
#
#
'
*
'
#
,
'
ReferĂŞncia completa e formal aos algoritmos e estruturas de dados; NĂŁo usa nenhuma linguagem de programação. Ă&#x2030; uma das referĂŞncias pedagĂłgicas mais usadas em todo mundo para estas matĂŠrias.
$ *
+ *
#
$ *
#
#
'
+ *
#
'
+
%
""#
,
'
Escrito por um dos criadores da linguagem C ĂŠ uma referĂŞncia obrigatĂłria para o estudioso do C.
! * #
'
! * #
#
'
# %
"
#
$ #
#
'
Este volume, juntamento com o Vol 1, Fundamental Algorithms e o Vol 2, Seminumerical Algorithms, formam a biblia dos Algoritmos e das Estruturas de Dados. No Vol. 3, Knuth apresenta e analisa detalhadamente um vasto conjunto de algoritmos ordenação e procura.
#
#
#
+
""#
,
'
ReferĂŞncia fundamental sobre factores de Qualidade em software e referĂŞncia obrigatĂłria para o estudo de Projecto por Contrato, especialmente quando aplicado Ă abordagem orientada por objectos.
$
+
#
"
#
$
+
#
#
%
'
Apresenta um conjunto muito interessante de algoritmos e estruturas de dados em C.
ReferĂŞncia rĂĄpida sobre C
R1. Preliminares â&#x20AC;˘
â&#x20AC;˘
â&#x20AC;˘
" $ ! $
$
! $
" $ ! $
"!
+
+
"
$
"
+
""
"! &
+
#
'
'
!
"$ !
'
R2. Algumas caracterĂsticas do C " +
â&#x20AC;˘
(
â&#x20AC;˘
,
"
+
!
)
! !
"
%
%
+ " ! +
%
"
+ &
$ ! $
â&#x20AC;˘ %
%
"
"
+
)
+
+ "
+ )
#
" $ ! $
! !
+ $
" $ +
+
! ! " +
" "
+
!
+
+
+
"
+
&
&
* + #
$ '
! % ! )
" $ + #
!
&
)
* ! "
.
,
#
, +
+
#
strcpy strcmp $ #
!
)
+
!
&
!
+
'
!
"
+
&
.
(
if (x>=0) { abs = x; } else { abs = -x; }
+
"
.
abs = (x>=0) ? x : -x;
â&#x20AC;˘
!
"
!
?:
+ *
+
+
+ '
+ .
+ +
(
!
%
! &
,
-
" #
!
&
' ,
)
! &
)
)
!
&
"
$
)
)
!
'
'
%
%
+
! " )
"
"
R3. Exemplo de programa
%
+
!
$
+ "+ ! "
! &
#
#
!
, + !
"
$ !
$
+
' ( $
"
'
.
!
(
+ +
! &
' (
#include <stdio.h> #define MFA 9
=
â&#x2C6;&#x2019;
/* MAX factorial Arg. */
unsigned int factorial(unsigned int); int main() { int m, n, d; unsigned int p; printf("m | m > 0 e m < %d: ", MFA); scanf("%d", &m); printf("n | n > 0 e n < m: "); scanf("%d", &n); if ((m>0) && (m < MFA) && (n >0) && (n< m) && ((d=m-n)>0)) { p = factorial (m) / factorial(d); printf("Permutacoes de %d, %d a %d: %u \n", m, n, n, p); } else printf("Dados invålidos ou inconsistentes. \n"); return 0; } /* Versão båsica iterativa do factorial. Argumento: n, inteiro sem sinal. Retorna : inteiro sem sinal dado por: n*(n-1)* ...1 se n>0 1 se n==0 Obs: A função não verifica se o seu valor de retorno excede a gama dos inteiros sem sinal. */ unsigned int factorial (unsigned int n) { unsigned tmp = 1; register int i; for(i=1; i<= n; i=i+1) tmp = tmp * i; return tmp; }
â&#x20AC;˘
% +
+ !
$ !
"
&
+ $ .
( %
! !
%
+
"
%
+
#include<stdio.h>
! !
! !
"
+
+
+ " &
!
!
stdio.h
'
'
"! $ .
â&#x20AC;˘
*
(
â&#x20AC;˘
+
.
+ "
- +
!
&
!
unsigned int factorial(unsigned int);
)
)
main
!
!
!
)
+ "#
!
)
+ "
$
' + ! )
-
$
+
'
â&#x20AC;˘
â&#x20AC;˘
â&#x20AC;˘
.
+ " )
+ )
)
/* */
!
!
â&#x20AC;˘
â&#x20AC;˘
+
&
&
"
.
.
.
int m, n, d;
factorial (m); unsigned int factorial(unsigned int) { /* ... */}
.
if ( /* condição */) { p = factorial (m) / factorial(d); printf("Permutacoes de %d, %d a %d: %u \n", m, n, n, p); } else â&#x20AC;˘
+ "
printf("Dados invĂĄlidos ou inconsistentes. \n");
+ .
for(i=1; i<=n; i++) tmp = tmp * i;
R4. Elementos de sintaxe
!
" $ ! $
" + "
"
#
#
%
!
# ! "
(
" *
! " !
+
$
#
- +
!
$ !
+ .
+
"
'
+ *
'
'
+
% +
+ *
+
+
$
"
+ .
(
+
'
" %+ *
'
+ '
+
+ +
'
'
! )
'
-
"
"
" - + .
if (n<0) return(0);
if
" %+ *
(
"
n
<
0
+
)
"
return
" %+ *
(
"
0
+
)
"
! )
;
"
! )
+
! )
" + "
! )
! )
â&#x20AC;˘
(
â&#x20AC;˘
(
+
)
+
)
!
! +
"
$
#
!
!
&
+
#
+
!
"
!
â&#x20AC;˘
"
! + ! "
+ ! "
(
'
+
-
" #
,
tmp
Tmp
)
'
â&#x20AC;˘
â&#x20AC;˘
+
+
!
â&#x20AC;˘
+
"
+
+ ! "
'
" %+ *
)
+
+
!
!
)
'
auto
double
int
struct
break
else
long
switch
case
enum
register
typedef
char
extern
return
union
const
float
short
unsigned
continue
for
signed
void
default
goto
sizeof
volatile
do
If
static
while
â&#x20AC;˘
-
char
! +
!
.
)
!
+ +
int
)
#
float
"
$ ! "
"!
!
#
+ )
$ ! "
"!
!
#
+ )
! +
'
#
double
! " '
void
â&#x20AC;˘
! "
+
"
"
+
+ +
+ .
(
! "
+
" + %
short
int
)
!
$
)
!
$
int double
,
#
signed unsigned
,
long
+
char int,
"
short long int
"
+
+
!
'
â&#x20AC;˘
$
+
+ " '
â&#x20AC;˘
(
â&#x20AC;˘
(
unsigned signed
! "
! " '
! "
+ "
'
â&#x20AC;˘
+ " )
"#
!
"
+ "
'
!
%
classe
%
qualificador:
%
tipo:
%
nome
â&#x20AC;˘
+ " )
-
. +
+
+
!
! #
# +
!
-
" $ !
$
+
+
+ +
"
+ "! .
" '
static unsigned i, j;
)
"
+
"
$ . +
" .
!
!
"
+
!
+
!
)
'
â&#x20AC;˘
+
"
)
"
-
+ ! )
-
" .
+
-
+ +
'
+
"
+ !
+ '
â&#x20AC;˘
'
â&#x20AC;˘
+
$
"#
+
+
!
+
+
! #
!
+ " ) #
" '
â&#x20AC;˘
!
-
" +
.
u
!
U
l
!
L
â&#x20AC;¢
+
%
+
%
+ .
%
*
+
.
-
.
â&#x20AC;¢
â&#x20AC;¢
(
-
.
-
+
+ +
+
+ "
" + # +
)
+ "!
+ +
#
+ +
+ " '
)
+
\n
! "
\v
! "
\b
+
\r
\f
!
\a
"
$
+
+
+
# +
$ !
.
+ "
$
+ $
* "
! +
" *
\t
â&#x20AC;¢
'
+ +
%
) .
!
\ooo
+ "
*
-
+
"
!
\xhh
+ +
ooo
hh -
)
" .
'
+ +
! " '
â&#x20AC;¢
+
)
"
!
+
!
+ "!
+
#
"
'
!
â&#x20AC;¢
!
'
-
" +
)
!
"
(
!
-
" .
'
"
'
'
'
'
%
double
'
'
double
'
'
Float
'
'
#
long double
'
double
'
â&#x20AC;¢
double
)
!
!
!
' (
!
'
â&#x20AC;¢
"$ !
+ " $ +
.
" +
! )
â&#x20AC;¢
â&#x20AC;¢
!
+
+
'
+
- # !
!
!
$
+
'
â&#x20AC;¢
+
) .
(
+
-
! + )
*
/
)
%
!
! " " + )
!
)
)
)
( $
+
int.
â&#x20AC;¢
-
"
+
+
+
(
'
&
)
+ *
!
$ !
'
!
-
" #
,
#
'
! "
&
%
!
'
!
!
#
+ "
+ !
- +
"
)
'
â&#x20AC;¢
-
"
%
+
% ! &
â&#x20AC;¢
-
"
+
.
.
â&#x20AC;¢
(
â&#x20AC;¢
(
.
.
int i; float f=13.0; i= (int) f % 4;
>=
+
!
>
)
1 + 3.14
)
<=
int i; float x=3.14; i = x;
<
&
+
== "
!=
&&
||
!
'
" $ + # +
% ( %
! " !
$ !
!
" $ +
" +
)
+
.
"
"
#
'
â&#x20AC;¢
"
!
!
-
)
+
" +
-
" .
'
a = -1 + (b==c) * 2
+
"
)
+
"
+ "
'
! +
+
)
-
"
!
+ + "
,
! +
' -
+ ! .
while(x=0) { /* ... */ } â&#x20AC;˘
-
&
i==0 !i
â&#x20AC;˘
! )
a
! "
a=b
'
)
+
!
+ ! #
-
"
+ !
)
"
"
" )
b
+
a
'
"
"
! "
'
i = i + 2;
! )
"
a = b = 1;
! )
" "
a = (b= 1)+ 2; i += 2;
x *= 10;
! % ! ) .
-
+
a = c++;
&
!
x = x <op> y
!
-
! "
+
#
!
<op>
a = c; c = c+1;
'
c--
+,-, *, /,%, &, |, ^, >>, <<. )
x <op>= y
)
!
-
-
' +
a = ++c;
)
! "
'
--c
abs = x >=0 ? x : -x;
! )
+
)
-
c=c + 1; a=c;
+ + "
! "
'
if(x>=0) abs = x; else abs = -x; â&#x20AC;˘
-
"
!
! " )
)
%
!
)
+ " .
unsigned int factorial(int n) { int i; unsigned tmp=1; for(i=1; i<=n; tmp *= i++); return(tmp); }
â&#x20AC;˘
! "
! "
(
) .
' (
&
! )
|
! )
^
! %
<<
" +
>>
" +
â&#x20AC;˘
" $ +
!
- + "!
$ )
~
" .
" $
#
&& ||
!
+ *
+
-
+ ! )
"
! "
!
-
) '
-
a && (c = n / a); /* Se a=0 entĂŁo (c=n/a) nĂŁo ĂŠ executado ! */ i || i++;
/* SĂł incrementa i, se i = 0 */
â&#x20AC;˘
+
+ +
- #
#
!
"
! )
$ !
!
!
'
â&#x20AC;˘
+
- .
'
"
)
+ "+ ! "
!
#
"
! "
"
$ !
+
printf(â&#x20AC;&#x153;%d \nâ&#x20AC;?, (â&#x20AC;&#x153;nadaâ&#x20AC;?, â&#x20AC;&#x153;zeroâ&#x20AC;?, 0, â&#x20AC;&#x2DC;0â&#x20AC;&#x2122;, 1));
â&#x20AC;˘
#
$ !
#
" *
+
" *
)
$
+
+
+
+ '
( ) [ ] -> . ! ~ ++ -- +Ï&#x2020; -Ï&#x2020; *Ï&#x2020; &Ï&#x2020; sizeof * / % + << >> < <= > >= == != & ^ | && || ?: = <op>= ,
-
Ï&#x2020;
R5. Controlo de fluxo de programa â&#x20AC;˘
"
! !
+
+ "
" $ ! $
( ! ! .
!
)
%
! &
%
! &
%
)
"
"
+ ) . "
. + + "
-
+ )
#
!
+
! )
"
+ $
" "
" $ +
)
<instrução> ::= â&#x20AC;&#x153;;â&#x20AC;? | <expressĂŁo> â&#x20AC;&#x153;;â&#x20AC;? | â&#x20AC;&#x153;{â&#x20AC;&#x153; { <instrução> } â&#x20AC;&#x153;}â&#x20AC;? | if â&#x20AC;&#x153;(â&#x20AC;&#x153; <expressĂŁo> â&#x20AC;&#x153;)â&#x20AC;? <instrução> | if â&#x20AC;&#x153;(â&#x20AC;&#x153; <expressĂŁo> â&#x20AC;?)â&#x20AC;? <instrução> else <instrução> | switch â&#x20AC;&#x153;(â&#x20AC;&#x153; <expressĂŁo> â&#x20AC;&#x153;)â&#x20AC;? <instrução> | case <constante> â&#x20AC;&#x153;:â&#x20AC;? <instrução> | default â&#x20AC;&#x153;:â&#x20AC;? <instrução> | break â&#x20AC;&#x153;;â&#x20AC;? | while â&#x20AC;&#x153;(â&#x20AC;&#x153; <expressĂŁo â&#x20AC;&#x153;)â&#x20AC;? <instrução> | do <instrução> while â&#x20AC;&#x153;(â&#x20AC;&#x153; <expressĂŁo> â&#x20AC;&#x153;)â&#x20AC;? â&#x20AC;&#x153;;â&#x20AC;? | for â&#x20AC;&#x153;(â&#x20AC;&#x153; [ <expressĂŁo> ] â&#x20AC;&#x153;;â&#x20AC;? [ <expressĂŁo> ] â&#x20AC;&#x153;;â&#x20AC;? [ <expressĂŁo> ] â&#x20AC;&#x153;)â&#x20AC;? <instrução> | continue â&#x20AC;&#x153;;â&#x20AC;? | return [ <expressĂŁo> ] â&#x20AC;&#x153;;â&#x20AC;? | goto <identificador> â&#x20AC;&#x153;;â&#x20AC;? | <identificador> â&#x20AC;&#x153;:â&#x20AC;? <instrução>
)
! #
"
|
+ "
""
#
-
&
"
{}
)
"
#
+
" $ ! $
!
"
[ ]
+
"
'
(1) (2)
if
if â&#x20AC;&#x153;(â&#x20AC;&#x153; <expressĂŁo> â&#x20AC;?)â&#x20AC;? <instrução> | if â&#x20AC;&#x153;(â&#x20AC;&#x153; <expressĂŁo> â&#x20AC;?)â&#x20AC;? <instrução1> else <instrução2>
"
+ )
"
<expressĂŁo>
'
)
-
+ !
<instrução>
"
+ )
"
'
<expressĂŁo>
)
-
+ ! %
<instrução1>, senão executa <instrução2>
if(a) if(b) printf(â&#x20AC;&#x153;a e b sĂŁo ambos diferentes de zeroâ&#x20AC;?); if(a) if (b) printf(â&#x20AC;&#x153;a e b sĂŁo ambos diferentes de zeroâ&#x20AC;?); else printf(â&#x20AC;&#x153;a ĂŠ diferente de zero, mas b ĂŠ igual a zeroâ&#x20AC;?);
$
"
)
$ !
. (
!
)
*
+
if
-
else
else
+ $
+
+
+
!
#if
#else
+ $
"
+ +
$
#
-
" .
"*
# !
'
#if _PT_ # include "elapc.pt" #else
# include "elapc.usa" #endif
switch
switch â&#x20AC;&#x153;(â&#x20AC;? <expressĂŁo> â&#x20AC;&#x153;)â&#x20AC;? â&#x20AC;&#x153;{â&#x20AC;&#x153; case <constante1> â&#x20AC;&#x153;:â&#x20AC;? <instrução1> [breakâ&#x20AC;?;â&#x20AC;?] ... case <constanteN> â&#x20AC;&#x153;:â&#x20AC;? <instrução N> [break â&#x20AC;&#x153;;â&#x20AC;? ] [default â&#x20AC;&#x153;:â&#x20AC;? <instrução> ] â&#x20AC;&#x153;}â&#x20AC;?
" '
+
<expressĂŁo>
(
+ "+ ! "
+
+
+
!
'
+
$ ! "
#
-
+ !
! &
+
'
'
'
default
! &
-
expressão> instrução>
)
)
-
$ ! "
* !
+
)
+ ! '
switch(n) { case 1: printf(â&#x20AC;&#x153;Um \nâ&#x20AC;?); break; case 2: printf(â&#x20AC;&#x153;Dois \nâ&#x20AC;?); break; case 3: case 4: printf(â&#x20AC;&#x153;TrĂŞs ou quatro: â&#x20AC;?); printf(â&#x20AC;&#x153;Nem mais nem menos. \nâ&#x20AC;?); break; default: printf(â&#x20AC;&#x153;Ou negativo, ou zero, ou muitos \nâ&#x20AC;?); }
while
while â&#x20AC;&#x153;(â&#x20AC;&#x153; <expressĂŁo> â&#x20AC;&#x153;)â&#x20AC;? <instrução>
+ !
! &
<instrução>
(
"
<expressĂŁo>
+ !
!
'
#
-
-
+ !
<instrução>
( + "
+ + "
)
-
# '
<expressĂŁo>
,
+ ! '
while (c=0) printf(â&#x20AC;&#x153; %d \nâ&#x20AC;?, c++);
/* Ciclo nunca executado */
do
do <instrução> while ( <expressão> )
! &
<expressão> <instrução>.
)
<instrução>
'
!
#
+ + "
-
-
+ !
<expressĂŁo> + !
"
!
!
-
+ ! )
'
do { printf (" Escreva um nĂşmero positivo: "); scanf("%d", &n); } while (n <=0);
for
for â&#x20AC;&#x153;(â&#x20AC;&#x153; [<expressĂŁo1>] â&#x20AC;&#x153;;â&#x20AC;? [<expressĂŁo2>] â&#x20AC;&#x153;;â&#x20AC;? [<expressĂŁo3>] â&#x20AC;&#x153;)â&#x20AC;? <instrução>
! "
.
<expressĂŁo1> while â&#x20AC;&#x153;(â&#x20AC;&#x153; <expressĂŁo2> â&#x20AC;&#x153;)â&#x20AC;? â&#x20AC;&#x153;{â&#x20AC;&#x153; <instrução> <expressĂŁo3> â&#x20AC;&#x153;;â&#x20AC;? â&#x20AC;&#x153;}â&#x20AC;?
+ #
<expressĂŁo1>
'
<instrução>
'
+
-
+ !
) #
'
-
+ "
<expressĂŁo3>
&
)
!
+ ! "
+
+
) %
<expressĂŁo2>
'
'
' !
<expressĂŁo2>
#
+ + "
'
for(i=0; i < 2; i++) printf("%d \n", i); for(i=0; i > 2; i++) printf(â&#x20AC;&#x153;%d \nâ&#x20AC;?, i);
/* Nenhuma iteração serå executada */
for(;;)
/* Ciclo infinito */
break
! )
$ !
#
#
switch do while
+
! )
for
!
+
+ "
* '
continue
)
+
+ ! "#
! &
)
#
do while
!
for
'
$ ! '
goto <identificador>
"
! )
+
+
!
-
'
$
+ "
+
+ $
-
!
! " )
"
R6. Funçþes
+ )
+ " )
!
!
#
#
'
+
+ " )
)
!
!
)
)
!
+
! )
" +
!
!
'
+
) '
+ " )
+ "
!
!
)
+ )
+
- " +
'
" + "
!
)
'
"
!
)
+ *
'
â&#x20AC;˘
! " !
â&#x20AC;˘
!
)
!
+ "
! " '
!
)
void
)
!
"
!
)
! " !
)
" #
+ "
+
+ "
+
'
'
!
!
â&#x20AC;˘
int
)
)
)
+ "
+ "
!
+
!
"
+
int
'
!
'
#
+ " )
!
!
)
+
!
!
!
+ + '
int printf(const char *format, ...);
return [ <instrução> ] â&#x20AC;&#x153;;â&#x20AC;? ! )
"
-
! #
void
)
"
!
)
!
#
!
+ !
-
&
+
)
- +
!
'
'
+
"
!
!
)
!
(
"
'
â&#x20AC;˘
"
$ !
)
+ "+ ! "
"
+
, )
+
!
$
)
$ !
"
'
)
"
"
)
"
+
$ !
'
$
"+ +
#
!
!
"
"
"+ +
! "
-
!
+
"
$ !
' "+ +
.
"+ +
" + " .
!
)
+
"+ +
+ "
!
" +
'
" + #
!
"
!
"+ +
!
) '
"+ +
+
*
.
"+ +
+ "
! " !
'
!
) #
+
+ " )
+
+
*
)
+ " '
R7. Arrays e Matrizes
â&#x20AC;˘
-
$ ! #
!
#
!
+ )
+ "
"
$ !
'
)
!
#
"
. #
+
#
+
#
) .
<tipo> <nome>â&#x20AC;&#x153;[â&#x20AC;&#x153;<expressĂŁo constante>â&#x20AC;?]â&#x20AC;?;
.
%
<tipo> ĂŠ o tipo dos elementos individuais do vector; <nome> ĂŠ o nome do vector; <expressĂŁo constante> indica o nĂşmero de elementos que constituem o vector.
%
int a[3];
â&#x20AC;˘
)
a[0]
&
+
a[1]
a[2]
.
( %
%
! )
%
" )
&
+
!
'
â&#x20AC;˘
#
!
+
"
+ +
+ +
-
!
" .
'
!
$
!
+ +
char str[5] = â&#x20AC;&#x153;olĂĄâ&#x20AC;?;
<tipo> <nome> â&#x20AC;&#x153;[â&#x20AC;&#x153;<dim1>â&#x20AC;&#x153;]â&#x20AC;? â&#x20AC;&#x153;[â&#x20AC;&#x153;<dim2>â&#x20AC;&#x153;]â&#x20AC;? ... â&#x20AC;&#x153;[â&#x20AC;&#x153;<dimn>â&#x20AC;&#x153;]â&#x20AC;?
-
" .
int multi[2][3]; /* ou alternativamente */ int (multi[2])[3];
! "
!
+
+
"
"
# ! "
! "
# +
!
!
!
R8. Ponteiros
+
!
+ )
-
"
(
'
+
+ +
)
-
#
)
(
- $
!
! " )
' + ! '
â&#x20AC;˘
!
!
!
"
$ !
!
"
!
'
<tipo> â&#x20AC;&#x153;*â&#x20AC;?<nome do ponteiro>;
â&#x20AC;˘
+ "
+ " )
!
#
'
+
!
+ "
"
)
"
#
#
$ '
â&#x20AC;˘
+ " )
!
!
!
&
'
int a[3], *ptr_a; ptr_a = &a[0]; a[0]
a[1]
a[2]
ptr_a == a â&#x20AC;˘ â&#x20AC;˘
ptr
x
#
)
! !
+ "
*ptr
"
!
x. *&x
!
x).
( "
!
#
#
#
- +
#
& ++ -- sizeof
!
!
!
+
"
! ) '
int x, *ptr_x, y; ptr_x = &x; *ptr_x = 0;
/*coloca x a 0*/
y = *ptr_x + 3;
/* igual a y = x + 3 */
*ptr_x += 2;
/* igual a x += 2; */
y = (*ptr_x)++;
/* igual a x++ */
â&#x20AC;˘
&
+
.
(
!
!
!
!
'
'
! "
!
%
"
!
(
"
$ "
!
$ "
'
"
)
#
!
+
)
"
*
!
+
+
!
'
-
" .
+
char *c
"
)
,
!
!
i +=2
+ *
c
#
+
+
"
&
!
!
*
#
#
!
!
"
+ !
int
&
c += 2
!
'
+ " )
char
"
'
i
int *i
'
+
"
+ !
+
$ !
'
!
'
! "
"
' (
"
$ '
! "
ptrdiff
(
stddef
.
,
* '
int a[5], *a1, *a2, i; a1 = &a[1]; a2 = &a[2]; i = (int) (a2 â&#x20AC;&#x201C; a1); printf(â&#x20AC;&#x153;%d \nâ&#x20AC;?, i);
â&#x20AC;˘
!
&
(
# !
'
!=
#
!
+
"
>, >=, <, <=, ==
'
! &
+ !
!
.
'
(
! "
!
%
(void *)
%
0
$ !
+
.
! "
$
+
,
â&#x20AC;˘
"
!
+
)
"
(
'
â&#x20AC;˘
+
' (
!
+ + '
â&#x20AC;˘
+
"
!
+
!
,
"
$ ! "
+ "
+ "
'
const int ci = 1; const int *pi = &ci; int *pi2 = &ci; /* Erro ! */ int i; pi = &ci; pi = &i; /* OK: Embora i nĂŁo seja constante o seu valor nĂŁo serĂĄ alterado atravĂŠs de pi. */
â&#x20AC;˘ â&#x20AC;˘
)
" "
"
!
+
'
" "
"
"
+ '
int i, ii; int *const icp = &i; icp = &ii; /* Erro */
â&#x20AC;˘
)
"
"
"
"
"
'
const int ci = 1; const int * const cp2ic = &ci;
int (*ptrf) (int, int)=0; /* Declaração de ponteiro para funçþes com 2 argumentos inteiros, e retorno de um inteiro. */ int min(int, int); ptrf = min;
R9. SinĂłnimos de tipo â&#x20AC;˘
" %+ *
"
typedef !
!
+
!
!
! ! '
typedef <tipo elementar ou estruturado> <identificador>
â&#x20AC;˘
(
typedef
!
)
!
!
+
+
#
!
!
!
'
typedef unsigned char byte;
typedef int (*pf) (int, int);
unsigned char byte1; byte byte2;
pf p2f, ap2f[10];
R10. â&#x20AC;˘
Estruturas
! !
$ ! #
*
$
#
!
+ "
+ .
+ )
"
'
struct student { char *name; int number; }; main() { struct student a_student; a_student.name= â&#x20AC;&#x153;JosĂŠâ&#x20AC;?; a_student.number = 27267; /* ... */ }
â&#x20AC;˘
!
! !
+
! ! #
+
! " !
! ! #
"
+ '
â&#x20AC;˘
! !
!
) '
! " )
!
! !
+
"
'
â&#x20AC;˘
#
! !
.
%
+ "
%
!
%
%
+
"
$ !
!
&
!
&
'
â&#x20AC;˘
+
!
! !
!
'
(
+
!
! !
!
'
!
(
%
'
struct student *ps, student = {â&#x20AC;&#x153;Anaâ&#x20AC;?, 12312}; ps = &student; ps -> name; /*ĂŠ igual a (*ps).name */
â&#x20AC;˘
!
! !
+
+
+
!
( + " )
'
R11. â&#x20AC;˘
UniĂľes
! &
+
! !
!
+
'
â&#x20AC;˘
"
"*
!
+
#
"
)
!
! '
R12. â&#x20AC;˘
Campos de bits +
+
+
!
!
(
'
â&#x20AC;˘ â&#x20AC;˘
+
+ "
! !
!
! &
(
)
'
! " )
!
! " )
'
struct x_tremly_low_mem { unsigned int age: 6; unsigned int sex: 1; unsigned : ; /* nĂŁo usado */ .... }
R13. â&#x20AC;˘
Enumeraçþes
&
!
)
!
"
+
+
'
â&#x20AC;˘
(
â&#x20AC;˘
,
#
!
!
) # + *
!
!
)
!
!
"
"
'
â&#x20AC;˘
%
!
!
!
+
+
# )
+
!
const int
!
'
!
,
) '
enum key{ special, home=71, xx }; /* ĂŠ equivalente a const int special =0; const int home=71; const int xx = 80; */
'
R14. â&#x20AC;˘
Directivas de PrĂŠ-processador
% +
#
" *
" * #
+ !
" *
+ +
% +
+ "
' (
â&#x20AC;˘
(
+
'
+ !
#define identificador texto
+
#define MAX 100 #define SQUARED(a) ((a)*(a)) #else, #elif e #endif #if expressĂŁo
ou #endif #ifdef identificador
!
#ifndef identificador
!
#include â&#x20AC;&#x153;nome_ficheiroâ&#x20AC;?
#
#endif
+ $
#
-
)
$ !
)
#else, #elif
'
-
+ !
+
! "
$ !
identificador
+ $
#
expressĂŁo
#endif
+ $
+
#else, #elif
+
#else, #elif
'
$ !
+
identificador
'
+
+ ! "#
)
+
+ !
+
#include
<nome_ficheiro>. #include <nome_ficheiro>
+ !
,
+
+
$
!
'
#undef identificador
+
identificador
% +
#
$
+
'
R15. â&#x20AC;˘
Biblioteca de funçþes
"
+ !
!
!
&
%+ " #
+ *
(
!
&
"
+ '
â&#x20AC;˘
!
"
&
+
#
+
+
+
!
*
+
"*
+
+ " &
+
+ "! #
! '
â&#x20AC;˘
!
!
!
)
"
+
!
$
#
, $
#
+
*
+
"*
+
'
assert.h
+
$ +
' ! &
ctype.h
"
+
+
+ $
)
+ +
&
- .
" * #
'
errno.h float.h
'
" +
+
$ ! "
,
"!
!
+ ) # $
#
+
'
limits.h
$
#
" +
+
#
+ '
locale.h
! &
math.h
! &
+
&
" $ ! $
'
'
setjmp.h
"
+ *
signal.h
stdarg.h
+ &
"
- +
!
&
+ '
+ *
!
&
+
$ !
+ '
stddef.h
string.h time.h
+
!
!
+
*
+
"* '
! &
stdio.h stdlib.h
+
'
"
$
'
! " )
+
+ +
'
+ ,
*
'
! &
+
)
+ +
int isalnum(int c)
" *
+ $ +
int isalpha(int c)
!
+ "
int iscntrl(int c)
+ +
int isdigit(int)
"$
int isgraph(int)
+ +
int islower(int)
"
! + ! "
int isprint(int)
+ +
int ispunct(int)
+ +
+ " #
#
#
-
c
-
"
- +
! ) #
" + "!
"$
#
int isspace(int)
c
'
'
"
+
'
+ +
#
+ $
"
- +
#
!
#
# '
#
"
! #
+ "
int isupper(int)
"
int isxdigit(int)
$
int tolower(int c)
int toupper(int c)
+ ! "
*
c "
c "
-
"
+ ! "
+
"
+ ! "
+
+ '
c
"
+ ! "
# +
c
+
+ ! "
# +
+ '
! &
+
'
int fprintf(FILE *, const char *format, ...)
int printf(const char *format, ...)
int sprintf(char *, const char *format, ...)
format
.
"
% [flags] [width] [.prec] [ h | l ] <type_char>
$
$
+
!
" *
-
+
+ (espaรงo)
"
)
- #
+
!
+ *
+
#
0
+
! "
<type_char>
c
char
d, i
u
unsigned int
o
f
e
double
+
char
+ "
"
unsigned short
'
)
!
unsigned char
- - -
float
float
!
short
int
!
short
!
$
* #
# '
% - - -
'
%
'
E
+
g
double
!
double
+
$ !
int
!
#
-
!
!
!
!
+ )
)
$ ! "
)
+
'
G
$ ! "
s
x
# !
#
+
'
! +
+ +
int
+
*
-
+
"# !
+
# # + # #
#
#
#
#
#
#
#
'
X
$ ! "
!
#
# #
#
#
P
N
#
+
+
'
)
+
+ +
+
!
' (
" '
+ +
%
(
int sscanf(char *, const char *format, ...) int fscanf(FILE*, char *, const char *format, ...) format
.
int scanf(const char *format, ...)
% [*] [width] [h|l|L] <type_char>
<type_char>
$ !
c
char * - width
d
int * -
i
int*
u
+ +
+
"
+ +
"
+
+ "
!
*
-
+
+
"
unsigned int * %
s
char * -
+
x
int* -
o
int* -
p
void* -
n
)
"
+
+ +
" +
*
)
-
+ +
+
"# +
+ "# +
+
$ !
+ "*
!
!
+
)
-
!
printf(â&#x20AC;&#x153;%pâ&#x20AC;?)
!
"
!
+
#
!
+
$
%;
#
'
$
'
"
%[0123456789]
+ .
+ !
' )
+ .
+ !
'
%
)
'
float *
[^ <cp> ]
-
E, f, g
[ <cp> ]
"
!
)
%[^abc]
! )
Ă?ndice remissĂvo
B
A +
+
#
#
+ "
#
! "#
" + #
"
C
#
"+ +
+
#
"
"
" - + #
#
#
#
+ *
+ "
+
)
#
#
#
#
M
#
#
#
#
#
#
#
#
+
) #
+
) #
#
#
+ "
+ "
-
+ "
-
#
#
+ #
# #
+ "
-
+ "
-
+ )
+ #
+
+ ) #
+ "#
+
#
"#
#
#
+
+
"
+
+
!
#
#
"#
#
% "
"#
D
! #
#
#
#
#
#
#
) #
#
#
+
#
$ !
" ) #
#
+ *
+ #
"
assert
#
#
+ " ) #
!
) #
#
$
+
+ #
! ! #
+
L
#
" $ !
#
#
#
#
#
(
E
+
+
) #
) #
- +
+ #
! ! #
- +
! ! #
"
"
! "
"
"
#
" $ #
) #
!
#
$
#
#
#
#
N
+
#
! "
#
#
#
(
"
#
"
"
"
"
"
!
" $ #
M
F
" $ #
'
) #
$
+ + ! "
) #
!
"
#
#
#
+
#
$
" #
+ ! #
)
! #
"
#
#
!
" #
)
-
#
)
!
-
#
) %
#
#
( ) %
#
O
&
+
#
(
H
#
I
+
! )
+
#
#
#
+
)
-
)
)
#
+
#
#
+ #
+ #
#
)
+ ) #
"
Q ! "
P
! "
" %+ *
#
, + ! #
! ) #
"* #
#
"
#
"
+
#
#
#
#
+ + #
!
+
+
+
#
+
#
! ! #
#
! +
#
static
$ #
!
&
%+ ) #
!
!
!
!
+
+
+ ! ) #
#
#
+ #
#
#
#
#
#
+ #
#
#
#
U ! ) #
#
typedef
! ! #
#
#
#
, #
#
"
#
) #
!
T
+ #
%+ ) #
push
#
+ #
#
,
#
S
#
#
+ #
pop
#
R
#
#
quicksort
!
#
#
!
+
#
V
"#
+ #