terça-feira, 26 de agosto de 2008
Manuscrito ACM'
Através do link abaixo vecês podem baixar o arquivo.
http://rapidshare.com/files/140407491/ACM_3__1_.doc
quarta-feira, 6 de agosto de 2008
Projeto de Algoritmos
O conceito de algoritmo pode ser dito como “um procedimento para resolver um problema matemático (como encontrar o máximo divisor comum, por exemplo) em um número de passos finitos que frequentemente envolve uma repetição de uma operação; ou em termos gerais: um procedimento passo a passo para resolver um problema ou atingir um fim”. Na Computação, o algoritmo pode ser associado ao desenvolvimento de uma estratégia para resolver um desejado problema.
Um projeto de um algoritmo também inicia com idéias e métodos básicos. Depois, um plano é feito. Deve-se provar a corretude desse plano e assegurar que seu custo é efetivo. O último passo é implementar o algoritmo usando-se uma linguagem de programação em particular. Análise, projeto, prova de corretude e implementação. Dificuldades surgem em todas as fases de construção. Estas geralmente requerem modificações do projeto, que por sua vez requer uma outra prova de factibilidade, ajuste de custos, e troca de implementação.
Para projetar um bom algoritmo faz-se necessário, via de regra, o emprego de técnicas de projeto apropriadas ao problema. Existem várias técnicas propostas na literatura dentre elas estão a Indução, Dividir para Conquistar, Programação Dinâmica, Método Guloso e Backtracking. Mostraremos apenas alguns exemplos mais didáticos de algumas técnicas e usaremos uma linguagem de alto nível similar à Pascal.
domingo, 3 de agosto de 2008
terça-feira, 15 de julho de 2008
sábado, 5 de julho de 2008
Algoritmo(portugol)
Algoritmo maoir_dos_numeros
{acima vem o nome do algoritmo}
Var {aqui vão ser declaradas
var todas as variáveis utilizadas
x,m : inteiro no algoritmo}
aux: literal
Início
aux:='sim'
m:=-100
enquanto aux='sim' faça
escreva('Entre com o número:')
readln(x)
se x>m então
m:=x
escreva('Mais algum número?)
readln(aux)
fim do enquanto
fim.
{E finalmente nessa parte é onde vão ser colocados, de forma ordenada, todos os comandos utilizados para resolver o problema dado}
Portugol
Ex: A sintaxe na declaração das variáveis, ou para que um dado saia em algum periférico de saída.
*A semântica(sentido), porém, tem que ser a mesma
Linguagem de descrição de algoritmo
*Essa linguagem pode ser de duas formas:
gráfica ou escrita
*A linguagem gráfica não costuma ser utilizada por apresentar os seguintes problemas:
Dificuldade na escrita, entendimento e alterações
Muito distante da realidade computacional (implementação)
*A LDA largamente utilizada é a escrita chamada: (Portugol)
quinta-feira, 12 de junho de 2008
Operadores relacionais!
domingo, 8 de junho de 2008
"Pilhas"
O principio da pilha é simples, o ultimo elemento colocado em uma pilha é o primeiro a sair da mesma.Imagine uma pilha de pratos que você sempre vai sempre adicionando novos pratos, quando for desfazer essa pilha ira retirar primeiro o ultimo prato que você havia adicionado a fila.
Os comandos "desfazer" utiliza esse principio retirando sempre seu ultimo comando.
Não é simples?!
quarta-feira, 4 de junho de 2008
O que é um processo?!
PROCESSO: é todo calculo capaz de transformar dados.
Ex: A=2
B=3
faça A+B=5
simples assim.
Assim para solucionar problemas necessitaremos colocar, consultar e alterar valores de variáveis, desta
forma, devemos definir um conjunto de OPERADORES, os quais representarão toda a possibilidade e
limitação na manipulação das variáveis e consequentemente na capacidade de resolver problemas através
do uso de computadores.
segunda-feira, 26 de maio de 2008
A “arvore” é composta opor alguns elementos como a “Raiz” que é nosso elemento principal dela partem os galhos ou filhos esses galhos pode possuir outros galho, quando isso não acontece é uma folha ou nó terminal.
Aqui temos uma árvore binária:
Legenda:(se é que da pra ter alguma duvida)
Vermelho: Raiz
Azul: Galhos/Filhos
Verde: Folhas/nó terminal
segunda-feira, 12 de maio de 2008
Variaveis
Variável é toda e qualquer posição definida na memória do computador( a RAM). Toda variável inicia-se por letra podendo ou não estar acompanhada por outras letras ou números.
Ela está dividida em alguns tipo:
-Númerica: que guarda dados numéricos.
-Alfanumérica: que guarda dados alfanuméricos.
-Lógicas: que guarda dados lógicos.
terça-feira, 6 de maio de 2008
Mais alguns conceitos básicos
Unidade de saída: é o dispositivo usado pelo computador para enviar os resultados do processamento das instruções recebidas para o meio exterior. Desde papel até o dvd.
Memória principal(memória cache): é o componente do computador que armazena as instruções e os dados usados em seu processamento. É o tipo de memória de acesso rápido, onde as instruções e os dados residem em tempo de execução, ou seja, no momento em que estão sendo processados.
Memória secundária: é um tipo de memória auxiliar - normalmente disco magnético - utilizado para guardar informações. Tem um acesso mais lento do que o da memória principal, porém, possui mais capacidade de armazenamento.
Unidade lógica e aritmética: é o componente que realiza as operações lógicas de comparação de grandezas e condições, além das operações aritméticas. É onde todas as operações são realizadas.
Unidade de controle: é o componente que controla o fluxo de informação e a execução das instruções, transferindo dados ente as unidades de entrada e saída e a memória. É onde as instruções a serem executadas são interpretadas pelo computador.
Unidade Central de Processamento(UCP): é formada pela unidade lógica e aritmética e a unidade de controle. A velocidade de um computador é medida, em geral, em MegaHertz, referindo-se ao ciclo interno de processamento da UCP. Tipicamente uma instrução já é executada hoje em poucos nanossegundos( 10 elevado a -9)
sábado, 3 de maio de 2008
Artigo ED-02: Listas Lineares Sequenciais (Parte I)
No artigo anterior introduzimos o estudo das estruturas de dados, dando algumas definições básicas. A partir de agora estudaremos uma a uma as estruturas citadas. Iniciemos o nosso estudo com as listas lineares sequenciais.
Uma lista linear é sequencial se, para cada nó da lista, seu sucessor está armazenado na posição seguinte da memória. A principal forma de se implementar uma lista linear sequencial é por meio da utilização de arrays (vetores). Um vetor é uma estrutura de armazenamento caracterizada por um nome, um tipo de dado que é capaz de armazenar e um tamanho, número de dados do mesmo tipo que pode armazenar. Antes de prosseguirmos neste artigo, duas observações devem ser feitas: Primeiro - A partir de agora far-se-á necessário implementarmos os algoritmos para mostrarmos o uso das estruturas de dados. Para tornar as soluções o mais genéricas possíveis, os algoritmos serão implementados em português estruturado e não em uma linguagem qualquer em particular. Segundo - Assumirei aqui que você leitor domina as noções mais elementares sobre algoritmos tais como declaração e uso de variáveis, estruturas de decisão e de repetição, entre outras. Feitas as considerações necessárias, prossigamos. A sintaxe de declaração de um vetor é dada como segue: declare nome_vetor : vetor [1..n] de tipo_vetor. Usaremos como padrão que palavras reservadas serão escritas em negrito. Vejamos agora os algoritmos que nos permitem realizar as operações mais básicas em uma lista linear sequencial. Nesse artigo implementaremos algoritmos de busca e nos demais os de inserção e exclusão.
Consideremos antes de mais nada que as listas podem se encontrar ordenadas ou desordenadas. É importante considerar isso, já que teremos mais de um algoritmo de busca e o emprego de um ou de outro, dependerá do fato de a lista está ou não ordenada.
Para qualquer tipo de lista temos o algoritmo de busca sequencial. Esse algoritmo atua da seguinte forma: ele sai em busca de um elemento vasculhando a lista do inicio até o final. Se chegar ao final e o último elemento não for o procurado, então ele não existe na lista. Percebemos que no pior caso, ou seja, quando o elemento a ser procurado é o último faremos n comparações, sendo n o número de elementos da lista. Por isso, dizemos que o algoritmo de busca sequencial é de ordem n O(n). Implementemos então o algoritmo de busca sequencial:
algoritmo busca_seq
declare
lista : vetor [1..n] de literal
chave : literal
i : numerico
achou : logico
inicio
leia chave
i <- 1 achou <- falso
enquanto (não achou) e (i<=n) faça
se lista[i] = chave então
escreva i
achou <- verdadeiro
senão
i <- i+1
fim se
fim enquanto
se não achou então
escreva "não encontrado"
fim se
fim algoritmo
Façamos uma breve análise do algoritmo acima. Nós definimos duas condições de parada, ou quando ele encontrar o elemento que busca, ou quando chegar ao fim da lista. Caso ele chegue ao final da lista e não tenha encontrado o elemento que busca, é exibida uma mensagem, se pelo contrário, for encontrado o elemento, então é exibida a sua posição na lista. É um algoritmo simples de se entender e de se implementar, podendo ser utilizado em qualquer tipo de lista. Quando porém a lista se apresenta ordenada, e nós queremos executar uma busca mais eficiente, nós podemos utilizar o algoritmo de busca binária. Vejamos no que consiste a busca binária: Estando a lista ordenada, temos que o primeiro elemento é o menor e que o último é o maior (considerando uma ordenação crescente que é a mais comum), desse modo, quando buscamos por um elemento podemos executar os seguintes passos. Procuramos o elemento médio da lista; Comparamos o valor procurado com esse e três situações podem ocorrer. O elemento procurado ser ele, desse modo encerra-se a execução do programa, o elemento procurado ser maior que ele, desse modo só no interessa procurar na metade do meio para o final da lista, ou o elemento ser menor que ele, desse modo, só nos interessa procurarmos na metade do meio para o inicio da lista. Uma vez em alguma dessas metades, repetimos os procedimentos anteriores, achando o meio da lista, comparando o elemento procurado com esse, e buscando em alguma das metades desse pedaço de lista. Para mostrarmos o que descrevemos acima de modo mais concreto, implementemos o algoritmo de busca binária, útil apenas quando a lista se encontra ordenada.
algoritmo buca_bin
declare
lista : vetor [1..n] de literal
chave : literal
ini, meio, fin : numerico
achou : lógico
inicio
leia chave
ini <- 1 fin <- n achou <- falso
enquanto (não achou) e (ini<=fin) faça
meio <- (ini+fin)/2 se chave = lista[meio]então
escreva meio
achou <- verdadeiro
senão
se chave < lista[meio] então
fin <- (meio-1)
senão
ini <- (meio+1) fim se
fim se
fim enquanto
se não achou então
escreva "elemento não encontrado"
fim se
fim algoritmo
Com base no algoritmo de busca binária, temos que a sua ordem é de log2N com N = tamanho da lista, ou seja, a busca binária no pior caso realizará log2N buscas. Para mais claramente vermos a eficiência da busca binária, consideremos uma lista com 10000 registros. A busca binária realizaria no pior caso 14 comparações enquanto que a busca sequencial realizaria em média 5000 comparações.
Bom, por hora ficamos aqui, até o próximo artigo então.
sábado, 26 de abril de 2008
Conceito básico (algoritmo).
Podemos ter dois caminhos para o conceito de algoritmo. Se você for ao dicionário da língua portuguesa você encontrará o seguinte: processo de cálculo em que um certo número de regras formais resolvem, na generalidade e sem exceções, problemas da mesma natureza.
Temos também o conceito dado pela lógica elementar, que é: um conjunto de instruções que devem ser executadas em determinada ordem para atingir seu objetivo. E para que essa ordem possa ser definida, é preciso entender a seqüência lógica pensada para a execução das instruções. No nosso dia a dia temos alguns exemplos dessas seqüência lógica quando queremos executar uma tarefa. Para entrar em casa, por exemplo, precisamos encontrar a chave, colocá-la na fechadura e abrir a porta. Já dentro de casa, devemos fechar a porta atrás de nós e trancá-la novamente. Não conseguiríamos entrar sem antes usamos a chave.
Existem alguns exemplos que servem para ilustração, dentre eles - como colocar um elefante uma geladeira? Essa é fácil, abre-se a geladeira e coloca-se o elefante dentro. E como se coloca uma girafa numa geladeira? Mais fácil ainda, tira-se o elefante e coloca-se a girafa dentro!
O mesmo pensamento lógico nós devemos aplicar na construção de algoritmos que serão executados por computadores. A seqüência das instruções precisa ter um ordenamento cuja lógica é a adequada para realização da tarefa. Mas esse ordenamento pode se tornar mais difícil, à medida que o algoritmo cresce de tamanho (mais instruções) ou em complexidade (prevendo mais situações diferentes).