Escolar Documentos
Profissional Documentos
Cultura Documentos
Outubro/Novembro/Dezembro/Janeiro/Fevereiro de 2006/7
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Resumo
2
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Abstract
3
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Conteúdo
Resumo................................................................................................ 2
Abstract ............................................................................................... 3
1 Noção de Algoritmo ....................................................................... 6
2 Fluxogramas .................................................................................. 7
3 Conceito de PseudoCódigo ou PseudoLinguagem .........................11
3.1 Forma geral de um algoritmo em pseudocódigo ............................................ 11
3.2 Entrada de dados............................................................................................. 15
3.3 Saída de dados ................................................................................................ 16
3.4 Estruturas de controlo de fluxo....................................................................... 17
3.5 Estruturas de sequência .................................................................................. 17
3.6 Estruturas de Decisão ..................................................................................... 18
3.7 Estruturas de Decisão Simples ....................................................................... 18
3.8 Estruturas de Decisão Múltipla ...................................................................... 19
3.9 Estruturas de Repetição ou Loop.................................................................... 20
3.10 Ciclos contados............................................................................................... 20
3.11 Ciclos Enquanto.............................................................................................. 21
3.12 Ciclos Repetir … Até que (cond) ................................................................... 22
4 Exemplos de documentação de algoritmos usando pseudocódigo 23
4.1 Primeiro exemplo ........................................................................................... 23
4.2 Outro exemplo de Algoritmo em pseudocódigo ............................................ 24
4.3 Exemplos de implementações em linguagens de programação...................... 24
4.4 O conceito de subprograma ............................................................................ 26
4.5 O Conceito de variavel Local e Global .......................................................... 27
4.6 Procedimentos ................................................................................................ 27
4.7 Funções........................................................................................................... 29
4.8 Passagem de parãmetros por referência.......................................................... 31
4.9 Recursividade ................................................................................................. 32
4.10 Tipos de dados Variaáveis e Expressões ........................................................ 32
4.11 Operadores Aritméticos.................................................................................. 33
4.12 Operadores relacionais ................................................................................... 34
4.13 Operadores Boleanos...................................................................................... 35
4.14 Ficheiros de Texto .......................................................................................... 35
5 Introdução a implementação de algoritmos usando linguagem C .37
5.1 Forma Geral de um programa em C ............................................................... 37
5.2 Declaração e inicialização de variaveis e constantes...................................... 37
5.3 Expressões em C............................................................................................. 37
5.4 Implementação de estruturas de controlo de fluxo......................................... 37
5.5 Leitura(input) e Escrita(output) de dados....................................................... 37
5.6 Funções, argumentos e passagem de parâmetros ........................................... 37
5.7 Exemplos de programas em C ........................................................................ 37
5.8 Arrays, Matrizes e Strings .............................................................................. 47
5.9 Ponteiros ......................................................................................................... 61
4
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
5
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
1 Noção de Algoritmo
6
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
2 Fluxogramas
7
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
8
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Enquanto
9
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
10
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Introdução
11
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
algoritmo "semnome"
// Função :
// Autor :
// Data :
// Secção de Declarações
inicio
// Secção de Comandos
fimalgoritmo
12
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
deseja escrever comentários mais longos, que ocupem várias linhas, cada
uma delas deverá começar por "//".
Tipos de Dados
Os nomes das variáveis devem começar por uma letra e depois conter
letras, números ou underline, até um limite de 30 caracteres. As variáveis
podem ser simples ou estruturadas (na versão actual, os vetores podem ser
de uma ou duas dimensões). Não pode haver duas variáveis com o mesmo
nome, com a natural exceção dos elementos de um mesmo vetor.
<lista-de-variáveis> : <tipo-de-dado>
<lista-de-variáveis> : vetor "["<lista-de-intervalos>"]" de <tipo-de-dado>
13
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Exemplos:
var
a: inteiro
Valor1, Valor2: real
vet: vetor [1..10] de real
matriz: vetor [0..4,8..10] de inteiro
nome_do_aluno: caractere
sinalizador: logico
14
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
a <- 3
Valor1 <- 1.5
Valor2 <- Valor1 + a
vet[1] <- vet[1] + (a * 3)
matriz[3,9] <- a/4 - 5
nome_do_aluno <- "José da Silva"
sinalizador <- FALSO
leia (<lista-de-variáveis>)
15
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
escreva (x)
fimalgoritmo
escreva (<lista-de-expressões>)
escreval (<lista-de-expressões>).
Exemplos:
algoritmo "exemplo"
var x: real
y: inteiro
a: caractere
l: logico
inicio
x <- 2.5
y <- 6
16
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
a <- "teste"
l <- VERDADEIRO
escreval ("x", x:4:1, y+3:4) // Escreve: x 2.5 9
escreval (a, "ok") // Escreve: testeok (e depois pula linha)
escreval (a, " ok") // Escreve: teste ok (e depois pula linha)
escreval (a + " ok") // Escreve: teste ok (e depois pula linha)
escreva (l) // Escreve: VERDADEIRO
fimalgoritmo
Exemplo:
inicio
A<-1+b
Escrevel(a)
Fimalgoritmo
17
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
se <expressão-lógica> entao
<seqüência-de-comandos>
fimse
se <expressão-lógica> entao
<seqüência-de-comandos-1>
senao
<seqüência-de-comandos-2>
fimse
18
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
escolha <expressão-de-seleção>
caso <exp11>, <exp12>, ..., <exp1n>
<seqüência-de-comandos-1>
caso <exp21>, <exp22>, ..., <exp2n>
<seqüência-de-comandos-2>
...
outrocaso
<seqüência-de-comandos-extra>
fimescolha
Veja o exemplo a seguir, que ilustra bem o que faz este comando:
algoritmo "Times"
var time: caractere
inicio
escreva ("Entre com o nome de um time de futebol: ")
leia (time)
escolha time
caso "Flamengo", "Fluminense", "Vasco", "Botafogo"
escreval ("É um time carioca.")
caso "São Paulo", "Palmeiras", "Santos", "Corínthians"
escreval ("É um time paulista.")
outrocaso
escreval ("É de outro estado.")
fimescolha
fimalgoritmo
19
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
20
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
<valor-inicial >, <valor-limite > e <incremento > são avaliados uma única
vez antes da execução da primeira repetição, e não se alteram durante a
execução do ciclo, mesmo que variáveis eventualmente presentes nessas
expressões tenham seus valores alterados.
21
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
22
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
repita
<seqüência-de-comandos>
ate <expressão-lógica>
S <- 0;
C <- 0;
PARA i<- 1 ATÉ 10 FAZ
23
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
LER (a);
SE a >=0 ENTÃO
S <- S+a
C <- C+1
FIM SE;
FIM PARA;
MD <- S/C
ESCREVER ("A média é:", MD)
4.3.2 C/C++/Java/C#/D
public int SomaDeDoisValores (int a, int b) {
return a + b;
}
4.3.3 Cobol
compute c = a + b.
4.3.4 Delphi
function SomaDeDoisValores( A, B: Integer ): Integer;
begin
Result := A + B;
end;
24
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
4.3.5 Haskell
soma :: Integer -> Integer -> Integer -- (assinatura)
soma a b = a + b
4.3.6 JavaScript
function SomaDeDoisValores(val1, val2)
{
return (parseInt(val1) + parseInt(val2));
}
4.3.7 Logo
defina SomaDeDoisValores [[a b]] [escreva soma :a :b]]
4.3.8 Pascal
function SomaDeDoisValoresInteiros( A, B: Integer ): Integer;
begin
Result := A + B;
end;
4.3.9 Perl
sub SomaDeDoisValores {
my ($int1,$int2) = @_;
return $int1 + $int2;
}
4.3.10 PHP
function SomaDeDoisValores($VlrA, $VlrB)
{
return ($VlrA + $VlrB);
}
4.3.11 Prolog
somaDeDoisValores(A,B,Result):- Result is A+B.
4.3.12 Python
def SomaDeDoisValores (a, b):
return a + b
4.3.13 Ruby
def soma_de_dois_valores(a, b)
a+b
25
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
end
4.3.14 Scheme
(define Soma (lambda (x y) (x + y)) )
4.3.15 VBScript
function SomaDeDoisValores (a,b)
SomaDeDoisValores=a+b
end function
26
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
27
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
inicio
// Secção de Comandos
fimprocedimento
<lista-de-variáveis> : <tipo-de-dado>
procedimento soma
var aux: inteiro
inicio
// n, m e res são variáveis globais
aux <- n + m
res <- aux
fimprocedimento
28
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
4.7 Funções
29
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
<lista-de-variáveis> : <tipo-de-dado>
30
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
inicio
// n, m e res são variáveis globais
aux <- n + m
retorne aux
fimfuncao
31
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
4.9 Recursividade
32
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Exemplo:
var x: real
y: inteiro
a: caractere
l: logico
33
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Operadores de Caracteres
34
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Os ficheiros SEQUÊNCIAIS
Esta classificação deriva do facto do acesso nos primeiros ter que ser
feita sequêncialmente, e no segundo poder ser feita de forma aleatória.
Lembro no entanto que para este segundo tipo de organização os registos
do ficheiro são de dimensão fixa.
Comando Arquivo
35
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
A sintaxe do comando é:
arquivo <nome-de-arquivo>
36
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
37
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
algoritmo "Media_notas"
// Data : 08-11-2006
//Versão 1.0
var
i,n:inteiro
soma,media,nota:real
inicio
//inicialização de variaveis
Soma<-0
media<-0
nota<-0
i<-0
n<-0
38
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
leia(n)
escreva("Nota ")
escreval(i)
leia(nota)
soma<-soma+nota
fimpara
media<-soma/n
escreval(media)
fimalgoritmo
Fluxograma (Visio)
Implementação em Linguagem C
Fluxograma (Visio)
Implementação em Linguagem C
Fluxograma (Visio)
39
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Implementação em Linguagem C
algoritmo "Calcular_o_factorial_de_10"
// Função : Calcula o factorial de 10 usando
//uma função generica factorial()
// Autor : Jorge Mota
// Data : 21-11-2006
// VERSÃO 1.0
var
Valor:inteiro
inicio
funcao factorial(n:inteiro):inteiro
var
i,f:inteiro
inicio
f<-1
para i<-n ate 1 passo -1 faca
f<-f*i
fimpara
retorne f
fimfuncao
// Indicar o numero a calcula
valor<-factorial(10)
escreval("O factorial de 10=",valor)
fimalgoritmo
Fluxograma (Visio)
40
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Implementação em Linguagem C
#include "stdio.h"
int factorial(int n);
main()
{
int valor;
valor=factorial(10);
printf("O factorial de 10=%d\n",valor);
}
int factorial(int n)
{
int i,f;
f=1;
for(i=n;i>=1;--i)
{
f=f*i;
}
return f;
}
41
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
// X2R<-((-b+sqrt(Delta))/(2*a))
// X1i<-0 e X2i<-0
// x1r<-(-b)/(2*a)
// x1i<- SQRT(-DELTA)/(2*A)
// x2r<-x1r
// x2i<--x1i
// Data : 28-11-2006
var
A,B,C,Delta,x1r,x2r,x1i,x2i real;
inicio
// Secção de Comandos
// Leitura de A,B,C
repita
escreva("A=")
leia(A)
fimrepita (A<>0)
//ler b
escreva ("B=")
leia(B)
42
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
//Ler C
escreva("C=")
leia(C)
//Calcular o Delta
delta<-b^2-4*a*c
SE (delta>=0) entao
x1r<-((-b)+SRQT(delta))/(2*a)
x2r<-((-b)-SRQT(delta))/(2*a)
x1i<-0
x2i<-0
senao
x1r<-(-b)/(2*a)
x1i<-SQRT(-delta)/(2*a)
x2r<-x1r
x2i<-(-x1i)
fimse
escreva("X1=")
escreva(x1r)
escreva("+i")
escreval(x1i)
escreva("X2=")
escreva(x2r)
escreva("+i")
escreval(x2i)
//Termina
fimalgoritmo
Fluxograma (Visio)
43
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Implementação em Linguagem C
#include <stdio.h>
#include <math.h>
void main(void)
{
/*Calculo das raizes de uma equacao do 2 Grau
Jorge Mota
V1.0
28-11-06
IMPORTANTE: em Pacific C temos de dar uma indicação ao
Compilador para usar a biblioteca de virgula flutuante
ir a Options e ligar a opção Use floating point library
44
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
*/
//Declaracao e inicialização de Variaveis
//Se delta >=0 então tem raizes reais
//Senão tem raizes não reais
float A=0,B=0,C=0,Delta=0,X1R=0,X1I=0,X2R=0,X2I=0;
printf("Calcular as raizes da EQ Ax^2+Bx+C=0\n");
//Ler o coeficiente A
do
{
printf("\nA=");
scanf("%f", &A);
}
while (A==0);
//Ler o coeficiente B
printf("\nB=");
scanf("%f", &B);
//Ler o coeficiente C
printf("\nC=");
scanf("%f",&C);
//Processar as raizes
//Calcular Delta
Delta=(B*B-4*A*C);
//testar se delta >=0
if (Delta>=0)
{
X1R=((-B)+sqrt(Delta))/(2*A);
X2R=((-B)-sqrt(Delta))/(2*A);
X1I=0;
X2I=0;
}
else
{
X1R=(-B)/(2*A);
X1I=sqrt(-Delta)/(2*A);
X2R=X1R;
X2I=(-X1I);
}
//Escrever as raizes em formato numeros complexos a+i|b|
printf("\n-------------------------------------------");
printf("\nRaizes da Equação %fX^2+%fX+%f=0",A,B,C);
printf("X1=%10.2f+i%10.2f\n",X1R,fabs(X1I));
printf("X2=%10.2f+i%10.2f\n",X2R,fabs(X2I));
45
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
46
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Um array é uma colecção de variaveis partilhando um mesmo nome mas que podem ser
acedidas individualmente usando um indice. O indice aprece entre parentises rectos ([
]) depois do nome da variavel do tipo array. Ilustra na figura abaixo um array
unidimensional com nome Notas contendo 4 elementos (numerados de 1 a 4). O que é
mostrado são os nomes dos elementos não os seus valores.
Notas
1 2 3 4
87 93 77 82
O poder dos array nos programas é que nos permite processar inumeros valor com um
simples ciclo contado (loop). O corpo do ciclo processa cada elemento do array através
da indexação dos respecitos elementos.
47
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Start
Numero_max_element
os ← 4
Soma ← 0
Contador ← 1
Loop
Yes
Contador>4
No
"Ler Valor:"
GET Notas[contador]
contador ← contador +
1
Media ← soma /
Numero_max_element
os
PUT "Media
="+Media¶
End
Exercicio 1: Elabore um algoritmo que permita ler 6 notas de alunos de uma turma e os
respectivos numeros, calcule qual a nota maxima e minima e mostre quais os
respectivos numeros dos alunos que as obtiveram.
48
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Start
Maxima ← 0
imax ← 0
Minima ← 21
imin ← 0
i←1
Loop
Yes
i>6
No
"Leia Nota"
GET nota
numeros[i] ← numero
notas[i] ← nota
Yes No
nota>maxima
maxima ← nota
imax ← i
Yes No
nota<minima
minima ← nota
imin ← i
i←i+1
End
49
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
50
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Start
Maxima ← 0
imax ← 0
Minima ← 21
imin ← 0
i←1
Loop
Yes
i>6
No
"Leia Nota"
GET nota
numeros[i] ← numero
notas[i] ← nota
Yes No
nota>maxima
maxima ← nota
imax ← i
Yes No
nota<minima
minima ← nota
imin ← i
i←i+1
End
51
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Resolução em pesudo-código:
52
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
fimalgoritmo
53
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
54
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Start
NA ← 3
ND ← 3
Inicializa_array
i←1
j←1
Loop
Yes
i>NA
No
Loop
Yes
j>ND
No
temp ← notas[i, j] /
ND
notas[ND + 1, j] ←
notas[ND + 1, j] +
temp
PUT temp¶
j←j+1
notas[i, NA + 1] ←
notas[i, NA + 1] / NA
j←1
i←i+1
End
55
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Start
NA ← 3
ND ← 3
Inicializa_array
i←1
j←1
Loop
Yes
i>NA
No
Loop
Yes
j>ND
No
temp ← notas[i, j] / 3
notas[ND + 1, j] ←
notas[ND + 1, j] +
temp
PUT temp¶
j←j+1
notas[i, NA + 1] ←
notas[i, NA + 1] / NA
j←1
i←i+1
End
56
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Pseudo-Código
57
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Start
x←0
y←0
Loop
"X="
GET x
"Y="
GET y
PUT "X="+x+"
Y="+y¶
End
58
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
59
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
60
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
5.9 Ponteiros
No campo da programação, um ponteiro ou apontador é um tipo de dado de uma
linguagem de programação cujo valor se refere diretamente a um outro valor alocado
em outra área da memória, através de seu endereço. Um ponteiro é uma simples
implementação do tipo referência da Ciência da Computação.
5.9.1 Arquitetura
Para fornecer uma interface consistente, algumas arquiteturas fornecem E/S mapeada
em memória, o que permite que enquanto alguns endereços são referenciados como
áreas de memória, outros são referenciados como registradores de dispositivos do
computador, como equipamentos periféricos – muito utilizado em arquitectura de
dispositivos embebidos.
5.9.2 Utilidade
Em outras estruturas de dados, como listas encadeadas, ponteiros são usados como
referências para intercalar cada elemento da estrutura com seus vizinhos (seja anterior
ou próximo).
61
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Linguagens como C e C++ permitem que ponteiros possam ser utilizados para apontar
para funções, de forma que possam ser invocados como uma função qualquer. Essa
abordagem é essencial para a implementação de modelos de callback, muito utilizados
actualmente em bibliotecas de código para manipulação de interfaces gráficas. Tais
ponteiros devem ser do tipo do retorno da função o qual apontam. Ponteiros para função
se assemelham a functores, ainda que o conceito função objeto seja mais abrangente.
Exemplos
struct link {
void *info; /* conteúdo do nó da lista */
struct link *prox; /* endereço do próximo nó da lista; LISTA_VAZIA
se este é o último nó */
};
Um ficheiro é uma colecção de dados que reside num disco ou outro meio(dispositivo)
persistente de armazenamento de dados (ex: pendrive). O mais comum dos tipos de
ficheiros é o designado ficheiro de texto (text file), que é normalmente um conjunto
organizado de linhas de texto que conseguimos ler. Este tipo de ficheiro pode ser criado
com um programa tipo Notepad do Windows. Normalmente a extensão é .txt.
Os ficheiros são usados essencialmente pelos programas para guardar dados entre
execuções. Exemplos o ficheiro com a máxima pontuação obtida num jogo ou o
ficheiro de configuração de um determinado programa(INI). Um ficheiro como este
pode conter um ou milhares de elementos (linhas).
62
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Em raptor a leitura dos dados do ficheiro é feita linha a linha e no caso de não
conhecermos o tamanho do ficheiro podemos usar a função End_Of_Input, que
devolve true nesta situação.
Exemplo de redireccionamento:
Chamamos a função,
Redirect_Input("file.txt")
ou
Exercício:
Resolução em Raptor:
63
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Start
Redirect_Output
("bateria_dados_10000
.txt")
n ← 10
i←1
Loop
Yes
i>10
No
Num ← Floor(random
* 10000)
PUT Num¶
i←i+1
Redirect_Output(no)
PUT "Terminou a
Geração !"¶
End
6 Ordenação e Pesquisa
6.1 Pesquisa
64
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Código em C
/**
* Retorna -1 caso não encontre ou a posição
* caso encontre.
*/
int procura(char vetor[], int tamanho, char elementoProcurado) {
int i;
for (i = 0; i < tamanho; i++) {
if (vetor[i] == elementoProcurado) {
return i;
}
}
return -1;
}
Pesquisa binária
65
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Código em C
int PesquisaBinaria(char chave,char k[],int N)
{
int inf,sup,meio;
inf=0;
sup=N-1;
while (inf<=sup) {
meio=(inf+sup)/2;
if (chave==k[meio])
return meio;
else if (chave<k[meio])
sup=meio-1;
else
inf=meio+1;
}
return -1; /* não encontrado */
}
66
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
67
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
6.1.2 Exercício - Pesquisa Binária em lista ordenada. A lista é lida de ficheiro de texto
com uma sequência ordenada. Implementação feita em Raptor.
68
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
69
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
6.1.3 Exercício - Pesquisa Binária em lista ordenada com inserção na posição correcta
na situação do elemento não constar na sequência. A lista de elementos é lido de
ficheiro de texto exterior. Implementação feita em Raptor.
Start
Redirect_Input
("c:\Dicotomica_
dados.txt")
n ← 10
i←1
Loop
Yes
i>=11
No
""
GET Lista[i]
i←i+1
Redirect_Input(no)
"Qual o Valor a
Procurar?"
GET valor
inf ← 1
sup ← 10
Flag ← 1
Loop
Yes (inf>sup) or
(Flag=0)
No
meio ← floor((inf +
sup) / 2)
Yes No
Valor=Lista[meio]
Yes Valor<=Lista No
Flag ← 0 [meio]
Yes No
(Flag=0)
PUT "Encontrou o
PUT "Não
Valor na Posição
Encontrou ..."¶
"+meio¶
inserir_ordenada
End
70
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
6.2 Ordenação
Existem várias razões para se ordenar uma sequência. Uma delas é a possibilidade se
aceder seus dados de modo mais eficiente.
Todos os algoritmos que vamos estudar são da primeira categoria deixando para
posterior disciplina (unidade curricular) no curso o estudo de algoritmos de ordenação
externa.
7 Bubble sort
No melhor caso, o algoritmo executa (n2) / 2 operações relevantes. No pior caso, são
feitas 2n2operações. No caso médio, são feitas (5n2) / 2 operações. A complexidade
desse algoritmo é de Ordem quadrática. Por isso, ele não é recomendado para
programas que precisam de velocidade e operam com uma quantidade elevada de dados.
BUBBLESORT (V[], n)
1 houveTroca <- verdade # uma variável de controle
2 enquanto houveTroca for verdade faça
3 houveTroca <- falso
4 para i de 1 até n-1 faça
5 se V[i] vem depois de V[i + 1]
6 então troque V[i] e V[i + 1] de lugar e
7 houveTroca <- verdade
71
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Implementação em C
if (!troca) return;
}
}
72
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
73
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Carregar_Lista
Troca ← 1
i←n
Loop
Yes
(i<=1) or (Troca=0)
No
Troca ← 0
j←1
Loop
Yes
(j>i - 1)
No
Yes (Lista[j]>Lista[j + No
1])
Swap
Troca ← 1
j←j+1
i←i-1
PUT "Terminou!"¶
End
74
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Start Start
Redirect_Input
temp ← Lista[j] ("c:\bateria_dados_100
0.txt")
End Loop
Yes
k>n
No
""
GET Lista[k]
k←k+1
Redirect_Input(no)
End
75
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
76
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Código em C
void selectionSort(int vetor[],int tam)
{
int i,j;
int min,aux;
for (i=0;i<tam-1;i++)
{
min=i;
for (j=i+1;j<tam;j++)
{
if (vetor[j]<vetor[min])
min=j;
}
aux=vetor[i];
vetor[i]=vetor[min];
vetor[min]=aux;
}
}
77
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
78
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Start Start
Redirect_Input
temp ← Lista[i] ("c:\bateria_dados_100
0.txt")
Lista[i] ← Lista
n ← 100
[posicao]
End Loop
Yes
k>n
No
""
GET Lista[k]
k←k+1
Redirect_Input(no)
End
79
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Insertion sort
Implementação em C
void insertSort(int a[], size_t length) {
int i, j, value;
80
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Implementação em Raptor:
81
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Start Start
Redirect_Input
Lista[j + 1] ← Lista[j] ("c:\bateria_dados_100
0.txt")
End k←1
Loop
Yes
k>n
No
""
GET Lista[k]
k←k+1
Redirect_Input(no)
End
82
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Shell sort
Criado por Donald Shell em 1959, Shell sort é o mais eficiente algoritmo de
classificação entre os de complexidade quadrática. Basicamente o algoritmo passa
várias vezes pela lista dividindo o grupo maior em grupos menores. Nos grupos
menores é aplicado o método da ordenação por inserção.
Código em C
void shellSort( int * vet, int size ){
int i , j , value;
int gap = 1;
83
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Implementação em Raptor:
84
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
85
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Start
Redirect_Input
("c:\bateria_dados_100
0.txt")
n←4
k←1
Loop
Yes
k>n
No
""
GET Lista[k]
k←k+1
Redirect_Input(no)
End
86
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Quicksort
Complexidade do Quicksort
87
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
início
i <- ini;
j <- fim;
x <- x[(ini + fim) div 2];
repete
enquanto (x[i] < x) faça
i <- i + 1;
fim-enquanto;
enquanto (x[j] > x) faça
j <- j - 1;
fim-enquanto;
se (i <= j) então
aux <- x[i];
x[i] <- x[j];
x[j] <- aux;
i <- i + 1;
j <- j - 1;
fim-se;
até_que (i >= j);
se (j > ini) então
exec quicksort (x, ini, j, n);
fim-se;
se (i < fim) então
exec quicksort (x, i, fim, n);
fim-se;
fim.
88
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Start
Carregar_Lista
inicio ← 1
fim ← n
Quicksort
PUT "Terminou!"¶
End
89
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
90
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Start
i ← inicio
j ← fim
x ← Lista[floor((inicio +
fim) / 2)]
Loop
Loop
Yes
Lista[i]>=x
No
i←i+1
Loop
Yes
Lista[j]<=x
No
j←j-1
Yes No
i<=j
aux ← Lista[i]
Lista[i] ← Lista[j]
Lista[j] ← aux
i←i+1
j←j-1
Yes
i>=j
No
Yes No
j>inicio
fim ← j
Quicksort
Yes No
i<fim
inicio ← i
Quicksort
End
91
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Start
Redirect_Input
("c:\bateria_dados_1000.txt")
n ← 10
k←1
Loop
Yes
k>n
No
""
GET Lista[k]
k←k+1
Redirect_Input(no)
End
92
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Implementação em C
void sort(int array[], int begin, int end) {
if (end - begin > 1) {
int pivot = array[begin];
int l = begin + 1;
int r = end;
while(l < r) {
if (array[l] <= pivot) {
l++;
} else {
r--;
swap(array[l], array[r]);
}
}
l--;
swap(array[begin], array[l]);
sort(array, begin, l);
sort(array, r, end);
}
}
while (i < j) {
if (array[i] < pivot) i++;
else if (array[i] > pivot) {
j--; k--;
t = array[i];
array[i] = array[j];
array[j] = array[k];
array[k] = t; }
else {
j--;
swap(array[i], array[j]);
} }
i--;
swap(array[begin], array[i]);
if (i - begin > 1)
sort(array, begin, i);
if (end - k > 1)
sort(array, k, end);
}
93
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
94
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Integral simples:
xDireita
∫ f ( x) * dx
xEsquerda
95
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Formulas importantes:
∑ ∆X * f ( xEsquerda + i * ∆X − X / 2)
i =1
Representação Visual:
96
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
97
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Start
Start
a←1
nDivs ← n
integrar_rect
End
deltax ← (xDireita -
xEsquerda) / nDivs
midpointx ← xEsquerda +
DeltaX / 2
i←0
Loop
Yes
i>=nDivs
No
x ← midpointx
midpointx ← midpointx +
deltax
i←i+1
End
98
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Start
xDireita ← b
nDivs ← n
area ← 0
deltax ← (xDireita -
xEsquerda) / nDivs
midpointx ← xEsquerda +
DeltaX / 2
i←0
Loop
Yes
i>=nDivs
No
x ← midpointx
midpointx ← midpointx +
deltax
i←i+1
End
99
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Formulas Importantes:
Representação Visual:
100
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Anexo 2
Teste Tipo teórico
Pergunta 1 (2 valor)
Fortran
LISP
BASIC
C#
JAVA
C
C++
Visual Basic
Cobol
Pergunta 2 (2 valores)
Top-Down e a Bottom-up
Pergunta 3 (2 valores)
Pergunta 4 (3 Valores)
algoritmo "FIBO"
// Função :FIBO
// Autor :JORGE MOTA
// Data : 29-01-2007
// Secção de Declarações
var
101
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
n,a,b,nFin: inteiro
inicio
// Secção de Comandos
escreva("Numero de elementos:")
Leia (nFin)
n <- 0
a <- 0
b <- 1
REPITA
escreval(a)
escreval(b)
n <- n + 2
a <- a + b
b <- b + a
ATE (n > (nFin-2))
fimalgoritmo
Pergunta 5 (3 valores)
Exemplo:
Pergunta 6 (3 valores)
102
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Pergunta 7 (2 Valores)
inicio
se v <= 2 entao
retorne v
senao
retorne v * factorial(v-1)
fimse
fimfuncao
Pergunta 8 (3 Valores)
103
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Pergunta 1
Resposta
104
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
n
8.1.4 ∑ ∆X * f ( xEsquerda + i * ∆X − X / 2)
i =1
Implementação em Raptor
Start
a←1
b←2
F_string ← "(3 * x * x - 2 *
x)"
integrar_rect
End
105
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Start
xDireita ← b
nDivs ← n
area ← 0
deltax ← (xDireita -
xEsquerda) / nDivs
midpointx ← xEsquerda +
DeltaX / 2
i←0
Loop
Yes
i>=nDivs
No
x ← midpointx
midpointx ← midpointx +
deltax
i←i+1
End
106
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Implementação em Linguagem C:
/**********************************************************/
/* */
/* Autor: JM */
/* Data: 25 Janeiro, 2007 */
/* Disciplina: Introdução a Ciência dos Computadores */
/* Professor: Jorge Mota */
/* Descrição: Este programa integra uma função, embebida*/
/*No código e representada por F, no intervalo definido */
/*A a B usando a regra de Simpson. */
/* */
/**********************************************************/
#define SEED 5
/* Formula */
#define A 1.0
#define B 3.0
#define FORMULA (3 * x * x - 2 * x)
#define F_STRING "(3 * x * x - 2 * x)"
double f(double x)
{
return FORMULA;
}
107
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
return area;
}
int main(void)
{
int n; /* numero de rectangulos */
double s; /* area estimada pela regra de simpson */
srand(SEED);
printf("\n");
printf("Integrar F(x) = %s de %5.3f to %5.3f\n", F_STRING, A, B);
printf("\n");
s = integrar_rect(A, B, f, n);
printf(" Regra de Simpson: Area com 1024 sub-intervalos
= %9.6f\n", s);
return 0;
}
Se o Nome das variaveis está adequado a sua função e não gera confusão com nomes
reservados 5%
108
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Numero : Nome :
Pergunta 1 (2 valor)
Resposta:
Heap
Stack
Variaveis Globais
Instruções Programa
109
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Pergunta 2 (2 valores)
Resposta:
Para n=100
Temos a seguinte lista:
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97
Em VisulAlg:
algoritmo "Primos"
// Função : Calcular Primos
// Autor : JM
// Data : 23-02-2007
// Secção de Declarações
var
sai,i,j,n:inteiro
inicio
// Secção de Comandos
escreva ("Ler quantos numeros(>4):")
leia (n)
escreval(2)
110
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
escreval(3)
para i<-4 ate n faca
sai<-0
j<-2
enquanto (j<i) e (sai=0) faca
se ((i%j)=0) entao
sai<-1
senao
j<-j+1
fimse
fimenquanto
se sai=0 entao
escreval(i)
fimse
fimpara
fim
Em C:
#include <stdio.h>
void main(void)
{
int sai,i,j,n;
printf("Numeros primos at-->");
scanf("%d",n);
for(i=4;i<n;i++)
{
j=2;
sai=0;
while((j<i) && (sai==0))
{
if (i%j==0)
sai=1;
else
j=j+1;
}
if (sai==0)
printf("\n%d ",i);
}
printf("\nTerminou o calculo");
}
Pergunta 3 (2 valores)
111
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Resposta:
Sintaxe em VisualAlg:
Em C:
112
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Return n
Pergunta 4 (3 Valores)
algoritmo "FIBO_ENQUANTO"
113
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
fimenquanto
fimalgoritmo
Resposta:
a)
n 0 2 4 6 8 10 12
a 0 1 3 8 21 55 144
b 1 2 5 13 34 89 233
N<=nFin-2 V V V V V V F
Escreva a 0 1 3 8 21 55
Escreva b 1 2 5 13 34 89
b)
algoritmo "FIBO_Repetir"
Pergunta 5 (3 valores)
Exemplo:
114
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Resposta:
Start
comprimento ← Length_Of
(Frase)
Frase_P ← ""
caracter ← ""
Flag ← 0
i←1
Loop
Yes
i>comprimento
No
c ← Frase[i]
Yes No
c=32
Yes No
(Flag=1) or (i=1) Flag ← 0
Yes No
(c>=97) and (c<=122)
Flag ← 1 caracter[1] ← c
Frase_P ← Frase_P +
caracter[1] ← c - 32 caracter[1] ← c
caracter
i←i+1
PUT Frase_P¶
End
Pergunta 6 (3 valores)
115
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Resolução:
116
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Pergunta 7 (2 Valores)
inicio
se v <= 2 entao
retorne v
senao
retorne v * factorial(v-1)
fimse
fimfuncao
Resposta:
Implementação em Fluxograma:
117
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Start
n ← 10
factorial
End
f←1
i←n
Loop
Yes
i<1
No
f←f*i
i←i-1
End
118
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Implementação em Linguagem C
#include "stdio.h"
int factorial(int n);
main()
{
int valor;
valor=factorial(10);
printf("O factorial de 10=%d\n",valor);
}
int factorial(int n)
{
int i,f;
f=1;
for(i=n;i>=1;--i)
{
f=f*i;
}
return f;
}
Pergunta 8 (3 Valores)
Resposta:
119
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
120
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Numero : Nome :
Pergunta 1
121
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
A técnica de integração de Monte Carlo baseia-se na estimativa obtida pela teoria das
probabilidades. Dado um intervalo (xEsquerda, xDireita) de uma função, f(x) que está
limitada por uma constante M, o método de Monte Carlo aleatoriamente selecciona pontos
dentro da “caixa” de restrições horizontal (intervalo de integração) e vertical (constante M)
e determina se o ponto fica acima ou a baixo da função. A probabilidade de que o ponto
esteja abaixo de f(x) é igual, na proporção da “caixa” de restrição, à probabilidade de estar
acima de f(x). Quantos mais pontos forem escolhidos mais precisa a estimativa e portanto
mais precisa a área final estimada.
Resposta
8.1.17
8.1.18 1) Especificar quantos numeros vão ser utilizados – n. No nosso caso vamos usar
1024.
2) Qual a função a usar. No nosso caso 3 x − 2 x
2
3) Qual o valor de M, que deve ser maior que o maior valor da função para o intervalo de
integração.No nosso caso vamos usar 21.
8.1.19 4) Gerar numeros aleatórios na caixa de restrições que é imposta por: no eixo dos xx
[ xEsquerda,xDireita] e em y por [0,21]
rx=(xDireita-xEsquerda)* random/(LONG_MAX))+xEsquerda
ry=M*random()/(LONG_MAX)
122
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
(contagem/nPontos)*(M*(xDireita-xEsquerda))
Implementação em Raptor:
Start
LONG_MAX ← 1
M ← 21.0
A←1
B←3
nPontos ← 1024
MC
End
123
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Função que implementa o calculo do integral pela técnica de integraçãode Monte Carlo
(mc):
124
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
125
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
Start
f_y ← 3 * x * x - 2 * x
End
Implementação em Linguagem C:
/**********************************************************/
/* */
/* Autor: JM */
/* Data: 25 Janeiro, 2007 */
/* Disciplina: Introdução a Ciência dos Computadores */
/* Professor: Jorge Mota */
/* Descrição: Este programa integra uma função, embebida*/
/*No código e representada por F, no intervalo definido */
/*A a B usando a Técnica de Integração de Monte Carlo. */
/* */
/**********************************************************/
#define SEED 5
/* Formula */
/*
#define A 1.0
#define B 3.0
#define M 21.0
#define FORMULA (3 * x * x - 2 * x)
#define F_STRING "(3 * x * x - 2 * x)"
*/
double F(double x)
{
return FORMULA;
}
126
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
int main(void)
{
int n; /* numero de pontos */
double mc; /* area estimada pela técnica de Monte Carlo */
srand(SEED);
printf("\n");
printf("Integrar F(x) = %s de %5.3f to %5.3f\n", F_STRING, A, B);
printf("\n");
n=1024;
printf("n = %d\n", n);
127
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
mc = integrar_mc(A, B, F, n,M);
printf("Método Monte Carlo: Area com n pontos = %9.6f\n", mc);
return 0;
}
Se o Nome das variaveis está adequado a sua função e não gera confusão com nomes
reservados 5%
128
Apontamentos de Apoio às aulas de Algoritmia do Professor Jorge Mota 2006
9 Bibliografia
[5] http://www.apoioinformatica.inf.br/
129