Algorítimos
- Um algorítimo deve ser escrito de forma IMPERATIVA.
- Uum algoritimo deverá ser escrito de tal forma que qualquer pessoa que leia o execute e seja alcançando o objetivo final, ou seja, um algoritimo não pode conter instruções que possam gerar dúvidas durante sua execução.
O aprendizado de algoritmos não se consegue a não ser através de muitos exercícios.
Algoritmos não se aprende:
- Copiando Algoritmos
- Estudando Algoritmos
Algoritmos só se aprendem:
- Construindo Algoritmos
- Testando Algoritmos
Quando temos um problema e vamos utilizar um computador para resolve-lo inevitavelmente temos que passar pelas seguintes etapas:
a) Definir o problema.
b) Realizar um estudo da situação atual e verificar quais a(s) forma(s) de resolver o problema.
c) Terminada a fase de estudo, utilizar uma linguagem de programação para escrever o programa que deverá a princípio, resolver o problema.
d) Analisar junto aos usuários se o problema foi resolvido. Se a solução não foi encontrada, deverá ser retornado para a fase de estudo para descobrir onde está a falha.
Estas são de forma bem geral, as etapas que um analista passa, desde a apresentação do problema até a sua efetiva solução. Iremos, neste curso, nos ater as etapas de estudo, também chamada de análise, e a etapa de programação. Mas antes vamos definir o seguinte conceito: Programar um computador consiste em elaborar um conjunto finito de instruções, reconhecidas pela máquina, de forma que o computador execute estas instruções. Estas instruções possuem regras e uma Sintaxe própria, como uma linguagem tipo português ou inglês, sendo isto chamadas de linguagem de computador.
No mundo computacional existe uma grande variedade de linguagens Pascal, C, C++, Cobol, Fortran, Clipper , Delphi, Java, Visual Basic, etc….
Antes de utilizarmos uma linguagem de computador, é necessário organizar as ações a serem tomadas pela máquina de forma organizada e lógica, sem nos atermos as regras rígidas da Sintaxe de uma linguagem. Para isto utilizaremos uma forma de escrever tais ações, conhecida como algoritmo, ou pseudo-código.
Em nossos estudos os algoritmos terão a seguinte estrutura:
ALGORITMO <Nome do algoritmo>
<definições>
INÍCIO
<Comandos>
FIM
1º) Exemplo de um algoritimo:
Na disciplina de matemática tivemos três provas e as notas foram as seguintes:
N1 = 5.5
N2 = 7.0
N3 = 4.5
Gostaríamos saber qual foi a média das três notas. Qual seria a seqüência de operações que o computador precisa para fazer este simples cálculo?.
Solução:
Para calcular a média, em primeiro lugar precisamos informar ao computador quais são os valores das notas. Depois, pedimos para ele somar as notas e dividir por 3. O resultado deve ser guardado em algum lugar, para depois mostrar na tela do computador. Esta seqüência podemos escrever em um algoritmo da seguinte forma:
1. Pedir os valores das tres notas; N1 = 5.5 N2 = 7.0 N3 = 4.5
2. Calcular a soma e guardar um algum lugar; S = N1 + N2 + N3
3. Calcular a média dividindo o valor guardado pela quantidade de notas informadas; M = S/3
4. Mostrar o resultado; M
Para fazer os cálculos, o computador precisa guardar os dados em algum lugar de sua memória. Para entender melhor como isso funciona, vamos imaginar que esses lugares sejam caixas vazias. Portanto N1, N2 e N3 são caixas onde vamos guardar o valor das notas. Por exemplo, quando fazemos N1 = 5.5 no algoritmo, estamos informando ao computador que deve guardar o valor 5.5 na caixa N1 . De forma similiar quando escrevemos:
S = N1 + N2 + N3 , o computador deve fazer a soma dos valores que estão nas caixa N1 , N2 e N3 e o resultado deve guardado na caixa S . A caixa M vamos utilizar para guardar o valor de S dividido por 3. Finalmente quando quesirmos ver o resultado do cálculo, pedimos ao computador mostrar o conteúdo da caixa M
Em qualquer momento podemos alterar o conteúdo das caixas utilizando o simbolo = , nesse caso o valor anterior da caixa será apagado e sempre guardará apenas o último valor. Agora imaginemos que temos poucas caixas vazias e para economizar vamos pedir ao computador que guarde o resultado da média no mesmo lugar onde estava a soma, já que a soma não será mais usada. Para isso o comando seria o seguinte:
S = S/3 Neste caso, o computador vai dividir o conteúdo da caixa S por 3 e o resultado vai guardar na mesma caixa S , apagando o resultado anterior. Este tipo de procedimento podemos fazer quando não precisamos guardar os valores anteriores.
Para colocar o nome das caixas nos algoritmos podemos utilizar qualquer letra ou palavra, mas sempre é recomedável usar palavras ou letras associadas ao conteúdo. Por exemplo, para guardar a média nós colocamos a letra M , poderiamos usar também: Media, med, MEDIA , etc.
2º) Exemplo de um algoritimo:
A troca de uma lâmpada queimada.
Solução:
1. Acionar o interruptor;
2. Se a lâmpada não acender, então
3. Pegar uma escada;
4. Posicionar a escada embaixo da lâmpada;
5. Buscar uma lâmpada nova;
6. Subir na escada;
7. Retirar a lâmpada queimada;
8. Colocar a lâmpada nova;
9. Descer da escada;
10. Acionar o interruptor;
11. Enquanto a lâmpada não acender, faça
12. Retirar a lâmpada queimada;
13. Colocar uma lâmpada nova;
14. Acionar o interruptor;
3º) Exemplos de algoritmos em várias linguagens
Origem: Wikipédia, a enciclopédia livre.
Este artigo ilustra alguns exemplos em várias linguagens de programação para ilustrar a sintaxe de cada uma. O algoritmo é a soma entre dois valores.
Exemplo de Linguagens
- 1 C/C++/Java/C#/D
- 2 Visual Basic
- 3 Pascal
- 4 Delphi
- 5 Python
- 6 Ruby
- 7 Scheme
- 8 Haskell
- 9 Logo
- 10 Action Script
- 11 PHP
|
C / C++ / Java / C# / D
int SomaDeDoisValores (int A, int B)
{ return ( A + B ); }
Visual Basic
function SomaDeDoisValoresInteiros(a as integer, b as integer)
as integer SomaDeDoisValores=a+b
end function
Pascal
function SomaDeDoisValoresInteiros( A, B: Integer ): Integer;
var Resultado : Integer;
begin
Resultado := A + B;
SomaDeDoisValoresInteiros := Resultado;
end;
Delphi
function SomaDeDoisValores( A, B: Integer ): Integer;
begin Result := A + B;
end;
Python
def SomaDeDoisValores (a, b):
return a + b
Ruby
def soma_de_dois_valores(a, b)
a + b end
Scheme
(define Soma (lambda (x y) (+ x y)) )
Haskell
soma :: Integer -> Integer -> Integer -- (assinatura) soma a b = a + b
A assinatura da função pode ser dispensada, mas normalmente é colocada no código por motivo de clareza.
Logo
defina "SomaDeDoisValores [[a b]]
[escreva soma :a :b]]
Action Script
function somaDeDoisValores (a, b){ trace(a + b); };
PHP
function SomaDeDoisValores($VlrA, $VlrB)
{ return ($VlrA + $VlrB); }
Seguindo padrões de programação, usa-se a primeira letra maiúscula apenas em classes; em funções usa-se a primeira letra minúscula. (Topo)
Programação
Programação estruturada é uma forma de programação de computadores que preconiza que todos os programas possíveis podem ser reduzidos a apenas três estruturas: sequência , decisão e iteração .
Tendo, na prática, sido transformada na Programação modular , a Programação estruturada orienta os programadores para a criação de estruturas simples em seus programas, usando as subrotinas e as funções . Foi a forma dominante na criação de software entre a programação linear e a programação orientada por objectos .
Apesar de ter sido sucedida pela programação orientada por objectos , pode-se dizer que a programação estruturada ainda é marcantemente influente, uma vez que grande parte das pessoas ainda aprendem programação se fazem através dela. Além disso, por exigir formas de pensar relativamente complexas, a programação orientada ao objeto até hoje ainda não é bem compreendida ou usada.
Orientação a Objeto é um paradigma de análise , projeto e programação de sistemas de software baseado na composição e interação entre diversas unidades de software chamadas objetos.
(Em alguns contextos, prefere-se usar modelagem orientada ao objeto, em vez de projeto .)
A análise e projeto orientados a objetos têm como meta identificar o melhor conjunto de objetos para descrever um sistema de software . O funcionamento deste sistema se dá através do relacionamento e troca de mensagens entre estes objetos.
Hoje existem duas vertentes no projeto de sistemas orientados a objetos. O projeto formal, normalmente utilizando técnicas como a notação UML e processos de desenvolvimento como o RUP ; e a programação extrema , que utiliza pouca documentação, programação em pares e testes unitários.
Na programação orientada a objetos, implementa-se um conjunto de classes que definem os objetos presentes no sistema de software . Cada classe determina o comportamento (definidos nos métodos) e estados possíveis (atributos) de seus objetos, assim como o relacionamento com outros objetos.
Smalltalk , Perl , Python , Ruby , Php , C++ , Java e C# são as linguagens de programação mais importantes com suporte a orientação a objetos.
Conceitos
- Classe representa um conjunto de objetos com características afins. Uma classe define o comportamento dos objetos, através de métodos, e quais estados ele é capaz de manter, através de atributos. Exemplo de classe: Os seres humanos.
- Objeto é uma instância de uma classe . Um objeto é capaz de armazenar estados através de seus atributos e reagir a mensagens enviadas a ele; assim como se relacionar e enviar mensagens a outros objetos. Exemplo de objetos da classe Humanos: João, José, Maria.
- Mensagem é uma chamada a um objeto para invocar um de seus métodos, ativando um comportamento descrito por sua classe.
- Herança é o mecanismo pelo qual uma classe (sub-classe) pode extender outra classe (super-classe), aproveitando seus comportamentos (métodos) e estados possíveis (atributos). Há Herança múltipla quando uma sub-classe possui mais de uma super-classe. Essa relação é normalmente chamada de relação "é um". Um exemplo de herança: Mamífero é superclasse de Humano. Ou seja, um Humano é um mamífero.
- Associação é o mecanismo pelo qual um objeto utiliza os recursos de outro. Pode tratar-se de uma associação simples "usa um" ou de um acoplamento "parte de". Por exemplo: Um humano usa um telefone. A tecla "1" é parte de um telefone.
- Encapsulamento consiste na separação de aspectos internos e externos de um objeto. Este mecanismo é utilizado amplamente para impedir o acesso direto ao estado de um objeto (seus atributos), disponibilizando externamente apenas os métodos que alteram estes estados. Exemplo: Você não precisa conhecer os detalhes circuitais de um telefone para utiliza-lo. A carcaça do telefone encapsula esses detalhes, provendo a você uma interface mais amigável (botões, o monofone e os sinais de tom).
- Abstração é a habilidade de concentrar nos aspectos essenciais de um contexto qualquer, ignorando características menos importantes ou acidentais. Em modelagem orientada a objetos, uma classe é uma abstratação de entidades existentes no domínio do sistema de software.
- Polimorfismo permite que uma referência de um tipo de uma superclasse tenha seu comportamento alterado, de acordo com a instância da classe filha a ela associada. O polimorfismo permite a criação de superclasses abstratas, ou seja, com métodos conterão implementação somente nas subclasses, e não no local onde foram declarados.
Paradigma de programação fornece (e determina) a visão que o programador possui sobre a execução do programa. Por exemplo, em programação orientada a objetos, programadores podem abstrair um programa como uma coleção de objetos que interagem entre si, enquanto em programação funcional programadores abstraem o programa como uma sequência de funções executadas de modo empilhado.
Assim como diferentes grupos em Engenharia de software propõem diferentes metodologias , diferentes linguagens de programação propõem diferentes paradigmas de programação . Algumas linguagens foram desenvolvidas para suportar um paradigma específico ( Smalltalk e Java suportam o paradigma de orientação a objetos enquanto Haskell e Scheme suportam o paradigma funcional), enquanto outras linguagens suportam múltiplos paradigmas (como o LISP , Python e o C++ ).
Muitos paradigmas de programação são conhecidos pelas técnicas que proíbem ou permitem. Por exemplo, programação estruturada não permite o uso de goto . Esse é um dos motivos pelos quais novos paradigmas são considerados mais rígidos do que estilos tradicionais. Apesar disso, evitar certos tipos de técnicas pode facilitar a prova de conceito de um sistema; pode até mesmo facilitar o desenvolvimento.
O relacionamento entre paradigmas de programação e linguagens de programação pode ser complexo pois linguagens de programação podem suportar mais de um paradigma. (Topo)
Compilador / Interpretador
Origem: Wikipédia, a enciclopédia livre.
Um compilador é um programa que transforma um código escrito em uma linguagem, o código fonte (do inglês source code ), em um programa equivalente em outra linguagem, código objeto (do inglês object code ).
Normalmente, o código fonte é escrito em uma linguagem de programação de alto nível, com grande capacidade de abstração, e o código objeto é escrito em uma linguagem de baixo nível, como uma sequência de instruções a ser executada por um sistema computacional .
O processo de compilação é composto de análise e síntese. A análise tem como objetivo entender o código fonte e representá-lo em uma estrutura intermediária. A síntese constrói o código objeto a partir desta respresentação intermediária.
A análise pode ser subdividida ainda em análise léxica , análise sintática e análise semântica . A síntese é mais variada, podendo ser composta pelas etapas de Geração de código intermediário, otimização de código e geração de código final (ou código de máquina), e somente esta última etapa é obrigatória.
Em linguagens de programação híbridas, o compilador tem o papel de converter o código fonte em um código chamado de byte code , que é uma linguagem de baixo nível. Um exemplo deste comportamento é o do compilador da linguagem Java que, em vez de gerar código da máquina hospedeira (onde se está executando o compilador), gera código chamado Java Bytecode .
Temos o pré-processador , antes era um software á parte mas que já faz parte de muitos compiladores. ele basicamente faz algumas substituições e uns "copy paste" ao código fonte.
depois é que ele vai para o compilador que faz a tradução para a linguagem binária .
existe também o linker que a função dele é pegar nos vários objectos e ligá-los.
Interpretadores são programas que lêem um código fonte de uma linguagem de programação e os convertem em código executável. Seu funcionamento pode variar de acordo com a implementação. Em muitos casos o interpretador lê linha-a-linha e converte em código objeto a medida que vai executando o programa . Linguagens interpretadas são mais dinâmicas por não precisarem escrever-compilar-testar-corrigir-compilar-testar-distribuir, e sim escrever-testar-corrigir-escrever-testar-distribuir. Mas existem também linguagens que funcionam como interpretadores e compiladores como: C , Python (somente quando requerido), BASIC , etc.
Na verdade, a principio, para qualquer linguagem de programação pode-se implementar compiladores e interpretadores para ela. Mas para determinadas linguagens é mais fácil "fabricar" interpretadores, e para outras é mais prático um compilador.
Análie Léxica
Análise léxica é o processo de analisar a entrada de linhas de caracteres (tal como o código-fonte de um programa de computador ) e produzir uma seqüência de símbolos chamado "símbolos léxicos" (lexical tokens), ou somente "símbolos" ( tokens ), que podem ser manipulados mais facilmente por um parser (leitor de saída). Ou o significado mais popularmente, a Análise Léxica é a forma de verificar determinado alfabeto . Quando analisamos uma palavra, podemos definir através da análise léxica se existe ou não algum caracter que não faz parte do nosso alfabeto, ou um alfabeto inventado por nós, criamos o alfabeto desejado e através da análise léxica podemos testar se aqueles caracteres definidos fazem parte do nosso alfabeto ou não. O analisador léxico é a primeira etapa de um compilador que depois virá a análise sintática .
O analisador léxico funciona de duas maneiras:
Primeiro estado da análise
A primeira etapa lê a entrada de um caracter, um de cada vez, mudando o estado em que os caracteres se encontram. Quando o analisador encontra um caracter que ele não identifica como correto, ele o chama de "estado morto" então, ele volta a última análise que foi aceita e assim tem o tipo e comprimento do léxico válido.
Um léxico, entretanto, é uma única lista de caracteres conhecidas de ser um tipo correto. Para construir um símbolo, o analisador léxico necessita de um segundo estado.
Segundo estado da análise
Nesta etapa são repassados os caracteres do léxico para produzir um valor. O tipo do léxico combinado com seu valor é o que adequadamente constitui um símbolo, que pode ser dado a um parser. (Alguns símbolos tal como parênteses não têm valores, e então a função da análise não podem retornar nada).
A análise léxica escreve um parser muito mais fácil. Em vez de ter que acumular, renomeia seus caráteres individualmente, o parser não mais se preocuparia com símbolos e passava a preocupa-se só com questões de sintática. Isto leva a eficiência de programação, e não eficiência de execução. Entretanto, desde que o analisador léxico é o subsistema que deve examinar cada caráter único de entrada, podem ser passos intensivos e o desempenhos se torna crítico, pode estar usando um compilador .
Análise léxica do Python
Como a linguagem de programação Python passa por um interpretador , existe a necessidade implícita de analisar o código-fonte colocado dentro do interpretador (entrada: tokens ), para que o código funcione corretamente (saída: parser ).
Python é dividido em linhas lógicas que são separadas pelo token newline . Como Python não há a definição de início e fim de blocos de códigos, e sim por identação , os delimitadores são o Ident e o Dedent . São vários os tipos de tokens que são reconhecidos pela linguagem, como: indentificadores, palavras-chaves, classes reservadas, strings, números inteiros, operadores, delimitadores, sequências, listas, dicionários, funções, classes, etc.
Análie Sintática
Análise sintática é análise das fórmulas bem formadas de uma linguagem de programação. A sintaxe de uma linguagem de programação pode ser descrita por uma gramática independente do contexto e representada gráficamente através da notação BNF.
Esta gramática descreve recursivamente a combinatória de tokens possíveis de uma linguagem.
Em termos práticos, pode também se usada para decompor um texto em unidades estruturais para serem organizadas dentro de um bloco, por exemplo).
O analisador sintático recebe do analisador léxico um grupo de tokens e usa um conjunto de regras para construir uma árvore sintática da estrutura.
A vasta maioria dos analisadores sintáticos implementados em compiladores aceitam alguma linguagem livres de contexto para fazer a análise. Estes analisadores podem ser de vários tipos, como o LL , o LR e o SLR .
Análie Semântica
Análise semântica é a terceira fase da compilação onde se verifica os erros semânticos, (por exemplo, uma multiplicação entre tipos de dados diferentes) no código-fonte e coleta as informações necessárias para a próxima fase da compilação que é a geração de código-fonte . (Topo)