Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Aula 01
Professores: Joao Eduardo Ferreira e Marcelo Finger
Primeiro Semestre de 2012
O que s
ao algoritmos?
Descric
ao de um procedimento formal que recebe um conjunto
de valores de entrada e produz um conjunto de valores de sada.
(Cormen et al.)
Para resolver um problema:
Abstrac
ao da realidade do problema (quais os dados que interessam?).
Representac
ao dos dados, depende tambem das operacoes que vao ser
realizadas sobre eles.
Revis
ao r
apida de C
Problema 1 Dado um n
umero natural n, imprimir todos os n
umeros primos entre 2 e n.
1
2.1
Soluc
ao 1
#i n c l u d e <s t d i o . h>
i n t main ( ) {
int
i , j , / C o n t r o l e de l a c o .
/
n,
/ L i m i t e s u p e r i o r .
/
primo ; / primo v a l e 1 s e o numero e primo /
/ e 0 c . c .
/
p r i n t f ( D i g i t e o v a l o r de n : ) ;
s c a n f (%d,&n ) ;
f o r ( i = 2 ; i <= n ; i ++){
primo = 1 ;
f o r ( j = 2 ; j < i ; j ++)
/ s e i tem um d i v i s o r nao e primo
i f ( i%j == 0 ) primo = 0 ;
i f ( primo == 1 ) p r i n t f (%d , i ) ;
}
p r i n t f (\n ) ;
return 0;
}
2.1.2
C++
cin, cout
A linguagem C++ possui uma biblioteca de classes relacionadas ao controle de entrada e sada de dados. Em particular, a classe cout e utilizada
para exibir valores enquanto que a classe cin e utilizada para armazenar
valores recebidos por meio do teclado em variaveis. Na linguagem C as
func
oes printf e scanf eram utilizadas para executar essas mesmas funcoes.
Entretanto, observe que a denominacao apropriada que usamos para essas
funcionalidades na linguagem C++ foi classe e nao funcao!
As sintaxes utilizadas para cin e cout sao respectivamente:
O operador << indica ao comando cout que um dado deve ser exibido
na tela, alem de identificar automaticamente qual o tipo desse dado e como
ele deve ser formatado para exibicao na tela.
2.1.4
Namespace
namespace Palmeiras {
char func(char);
class String { ... };
}
// alguma biblioteca corintia.h
namespace corintia {
class String { ... };
}
Dessa maneira, os nomes das classes nao irao conflitar, pois eles sao
referenciados respectivamente como: Palmeiras::String e corintia::String.
#i n c l u d e <i o s t r e a m >
u s i n g namespace s t d ;
i n t main ( ) {
int
i , j , / C o n t r o l e de l a c o .
/
n,
/ L i m i t e s u p e r i o r .
/
primo ; / primo v a l e 1 s e o numero e primo /
/ e 0 c . c .
/
c o u t << D i g i t e o v a l o r de n : ;
c i n >> n ;
f o r ( i = 2 ; i <= n ; i ++){
primo = 1 ;
f o r ( j = 2 ; j < i ; j ++)
/ s e i tem um d i v i s o r nao e primo
i f ( i%j == 0 ) primo = 0 ;
i f ( primo == 1 ) c o u t << i << ;
}
c o u t << e n d l ;
return 0;
}
2.2
Soluc
ao 2
Crivo de Erat
ostenes: Vetor contendo os n
umeros de 2 a n. Contador inicia
no 2. Testa os seguintes e os que forem m
ultiplos, transforma em 0.
2.2.1
#d e f i n e TAM 1000
i n t main ( ) {
int
v e t [TAM] , / Vetor que r e p r e s e n t a o c r i v o . /
i, j,
/ Contadores de l a c o .
/
n;
/ L i m i t e s u p e r i o r .
p r i n t f ( D i g i t e o v a l o r de n : ) ;
s c a n f (%d , &n ) ;
/ I n i c i a l i z a c a o do c r i v o
f o r ( i = 2 ; i <= n ; i ++) v e t [ i ] = 1 ;
i = 2;
w h i l e ( i i <= n ) {
/ Marca o s m u l t i p l o s de i .
f o r ( j = i +1; j <= n ; j ++)
i f ( v e t [ j ] != 0 && j%i == 0 )
vet [ j ] = 0;
C++
#i n c l u d e <i o s t r e a m >
u s i n g namespace s t d ;
#d e f i n e TAM 1000
i n t main ( ) {
int
v e t [TAM] , / Vetor que r e p r e s e n t a o c r i v o . /
i, j,
/ Contadores de l a c o .
/
n;
/ L i m i t e s u p e r i o r .
c o u t << D i g i t e o v a l o r de n : ;
c i n >> n ;
/ I n i c i a l i z a c a o do c r i v o
f o r ( i = 2 ; i <= n ; i ++) v e t [ i ] = 1 ;
i = 2;
w h i l e ( i i <= n ) {
/ Marca o s m u l t i p l o s de i .
f o r ( j = i +1; j <= n ; j ++)
i f ( v e t [ j ] != 0 && j%i == 0 )
vet [ j ] = 0;
2.3
Soluc
ao 3
Recurs
ao
1. Fatorial: Definic
ao matematica:
0! = 1
n! = n (n 1)!
Algoritmo recursivo:
int fat ( int n) {
i f ( n == 0 )
return 1;
else
r e t u r n n f a t ( n 1);
}
2. Fibonacci: Definic
ao matematica:
F (0) = 0
F (1) = 1
F (n) = F (n 1) + F (n 2)
Algoritmo recursivo:
i n t Fib ( i n t n ) {
i f ( n == 0 )
return 0;
e l s e i f ( n == 1 )
return 1;
else
r e t u r n Fib ( n1)+Fib ( n 2);
}
Ordena
c
ao de um vetor
4.1
Selec
ao
s e l e c a o r e c ( i +1,n , v ) ;
}
}
4.2
Inserc
ao
4.3
Intercalac
ao (Mergesort)
Enquanto n
ao acabou nenhuma metade:
se (v [ i ] < v [ j ] )
w[ k ] = v [ i ] ;
i = i +1;
sen
ao w[ k ] = v [ j ] ;
j = j +1;
k = k+1;
Copia o pedaco que sobrou de um vetor. Copia tudo de w em v.
Usando intercala, o algoritmo de ordenacao fica:
void mergesort ( i n t p , i n t r , i n t v [ ] ) {
int q ;
i f ( p < r 1) {
q = (p + r )/2;
mergesort (p , q , v ) ;
mergesort (q , r , v ) ;
i n t e r c a l a (p , q , r , v ) ;
}
}
Resolvemos log(n) problemas (dividindo por dois a cada vez), cada rodada leva tempo O(n), a complexidade e O(n log(n))
Exerccio 1 Comparar os tempos de execucao dos algoritmos de ordenacao
vistos em aula. Testar com vetores aleatorios e tambem com os seguintes
casos limite:
vetor j
a est
a ordenado,
vetor ordenado em ordem decrescente e
vetor com todos os elementos iguais.
Para testar o tempo use:
#i n c l u d e <time . h>
...
d o u b l e time1 , time2 , t o t a l ;
time1 = ( d o u b l e ) c l o c k ( ) ;
<Chamada da func
a o>
time2 = ( d o u b l e ) c l o c k ( ) ;
t o t a l = ( d o u b l e ) ( time2time1 ) /CLOCKS PER SEC ;
Para preencher um vetor com valores aleatoriosuse:
#i n c l u d e <s t d l i b . h>
void preenche ( i n t v [ ] , i n t n){
int i ;
srand ( 0 ) ;
f o r ( i = 0 ; i < n ; i ++)
v [ i ] = rand ()%MAX; / MAX deve s e r d e f i n i d o /
}
Bibliografia: Cormen et al. captulos 1 e 2.
Exerccio 2 ((Extra) Torre de Hanoi) Ha um jogo interessante cuja a
soluc
ao e naturalmente recursiva. Ele consiste de 3 varetas e alguns discos.
Uma das varetas contem uma pilha de n discos de modo que os raios diminuem da base para o topo. As outras duas estao vazias. O jogo consiste em
passar os discos da vareta original para uma das outras sempre movendo o
disco do topo e nunca colocando um disco de raio maior sobre um disco de
raio menor.
|
-------------
|
|
|
|
|
|
|
|
|
|
vareta 1
Ex. de configurac
ao original
Escreva um programa de computador que apresente quais movimentos
devem ser feitos. Por exemplo no caso acima com quatro discos a sada
deveria ser algo como:
Mova
Mova
Mova
Mova
Mova
Mova
Mova
Mova
Mova
Mova
Mova
Mova
Mova
Mova
Mova
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
disco
disco
disco
disco
disco
disco
disco
disco
disco
disco
disco
disco
disco
disco
disco
do
do
do
do
do
do
do
do
do
do
do
do
do
do
do
topo
topo
topo
topo
topo
topo
topo
topo
topo
topo
topo
topo
topo
topo
topo
da
da
da
da
da
da
da
da
da
da
da
da
da
da
da
vareta
vareta
vareta
vareta
vareta
vareta
vareta
vareta
vareta
vareta
vareta
vareta
vareta
vareta
vareta
1
1
2
1
3
3
1
1
2
2
3
2
1
1
2
para
para
para
para
para
para
para
para
para
para
para
para
para
para
para
a
a
a
a
a
a
a
a
a
a
a
a
a
a
a
vareta
vareta
vareta
vareta
vareta
vareta
vareta
vareta
vareta
vareta
vareta
vareta
vareta
vareta
vareta
2
3
3
2
1
2
2
3
3
1
1
3
2
3
3