OBS: Apostila Adaptada ao Interpretador de Linguagem Algorítmica – ILA 1.01, da Universidade do Vale do Rio dos Sinos – UNISINOS, utilizada nesse curso para demonstrar a praticidade das estruturas algorítmicas abordadas na disciplina.
1
1 CONCEITOS PRELIMINARESCONCEITOS PRELIMINARES 1.1
1.1NNOÇÕESOÇÕESDEDELÓGICALÓGICA
"LÓGICA: coerência de raciocínio, de idéia; seqüência coerente, regular e necessária de acontecimentos, de coisas" (AURÉLIO).
"LÓGICA: trata da correção do pensamento; ensina a colocar ordem no pensamento" (FORBELLONE, 1993).
Segundo FORBELLONE (1993), o pensamento e suas representações (palavra escrita, palavra falada) sempre vem acompanhado da lógica ou da ilógica. Assim, a lógica não é somente importante na teoria como também o é na prática, visto que quando alguém deseja expressar seus pensamentos e se fazer entender através da escrita ou através da fala, necessariamente precisa colocar ordem no pensamento, ou seja, usar a lógica.
EXEMPLO 1: a gaveta está fechada. a bala está na gaveta.
preciso primeiro abrir a gaveta, para depois pegar a bala.
EXEMPLO 2: João é mais velho que Pedro. Pedro é mais velho que José. Logo, João é mais velho que José.
"A LÓGICA envolve as declarações, pressupostos e operações que definem o que um
determinado programa fará. A definição da lógica dos programas é, quase sempre, o primeiro passo na resolução de um problema" (XIMENES, 1993) .
C
CONCEITOONCEITODEDEALGORITMOALGORITMO..
A construção de programas de computadores, em alguns casos, pode ser uma tarefa difícil, não porque o programador seja incompetente, mas devido à complexidade dos problemas. Portanto, é importante separar a tarefa de construção de programas em duas fases (FIGURA 1): a fase de resolução do problema e a fase de implementação.
PROBLEMA ALGORITMO PROGRAMA análise implementação
passo difícil
No sentido mais geral, “um algoritmo é qualquer conjunto finito de instruções que possa ser
seguido para a realização de uma tarefa específica ou resolução de um determinado problema”
(XIMENES, 1993).
EXEMPLO 4: Uma receita de culinária: massa folheada
Amassar bem todos os ingredientes Deixar repousar por 30 min.
REPETIR (3 vezes) Abrir a massa Passar margarina Dobrar 3 vezes
Deixar repousar por 15 min. Abrir a massa
Rechear
Levar ao forno quente numa forma untada ENQUANTO (não estiver assado)
Manter no forno quente
EXEMPLO 5: A atividade de um assistente administrativo
Fornecer formulário
Verificar o preenchimento do formulário SE (preenchimento estiver correto) ENTÃO
Arquivar formulário Fornecer protocolo SENÃO
Fornecer novo formulário
Instruir quanto à forma de preenchimento
“Na informática, um algoritmo é definido como uma seqüência ordenada e finita de passos, independente da linguagem de programação a ser utilizada para codificá-lo, que leva à solução de um dado problema” (XIMENES, 1993).
EXEMPLO 6: O cálculo da área de um retângulo
Saber o valor da base Saber o valor da altura Multiplicar a base pela altura
O valor obtido é o resultado esperado
Os algoritmos são utilizados na programação da mesma forma que as receitas de culinária podem ser usadas no preparo das refeições, tanto como solução específica quanto como ponto de partida para experiências.
para que seja possível definir a solução e o que deve ser feito (processamento).
Um ALGORITMO, é um texto (do tipo receita de bolo) onde cada linha contém uma ação primitiva (ação elementar, passível de execução por um humano ou uma máquina). A função do algoritmo, que executado, é a de agir (operar) sobre os dados, transformando-os em informações (algumas vezes denominada de dados ou dados operacionais).
Entrada Saída de ALGORITMO de Dados Informação
FIGURA 2: função do algoritmo
- O texto em si não nos interessa, mas sim, o efeito que sua execução possa gerar no decorrer do tempo, isto é, a execução de um algoritmo é um evento dinâmico, evoluindo no tempo.
- Esta técnica é importante, pois permite a validação da solução do problema antes do programa existir, minimizando o custo (hora máquina).
- Todo algoritmo é composto por um grupo de ações primitivas (ações passíveis de execução por um humano ou por uma máquina).
- As ações primitivas que utilizaremos na construção de algoritmos serão construções linguísticas da nossa linguagem natural (português). Estamos assumindo que exista um computador hipotético capaz de executá-las.
- Uma ação é um evento que ocorre em um período de tempo finito e com um efeito bem definido. Quando colocamos uma determinada ação em um algoritmo, é porque estamos interessados no efeito que ela irá produzir quando for executado.
- Construir um algoritmo é descrever um padrão de comportamento, a partir de ações primitivas, possibilitando a reprodução de um evento (mesmo padrão de comportamento) a cada execução do algoritmo.
2.0 - DESENVOLVIMENTO DE ALGORITMOSDESENVOLVIMENTO DE ALGORITMOS 2.1 – MEMÓRIA E CONCEITO DE VARIÁVEIS
Memória - dispositivo que permite que as instruções a serem executadas e os dados a
serem manipulados sejam armazenados temporariamente.
Variável - Corresponde a uma área de memória, onde o seu conteúdo varia durante a
execução do algoritmo.
Armário Nome da Gaveta Gaveta (rótulo)
Varável Nome da Variável
Memória
FIGURA 3: Memória e Variável
2.2 - TIPOS PRIMITIVOS DE DADOS.
- são os tipos mais comuns.
NUMERICO - pode armazenar qualquer valor pertencente ao conjunto dos números
inteiros e/ou ao conjunto dos números reais.
CARACTER - pode armazenar apenas 1 elemento pertencente a um dos conjuntos
abaixo:
{A, B, C, ... Z} {0, 1, 2, ... 9} { ?, &, =, +, $, _, |, ´, “, /}
LÓGICO - pode armazenar apenas as constantes FALSO ou VERDADEIRO.
2.3 - IDENTIFICADORES.
Os nomes (identificadores) escolhidos para rotular as variáveis devem obedecer às seguintes regras:
a) O primeiro caracter deve ser uma letra;
b) Os nomes devem ser formados por caracteres pertencentes ao seguinte conjunto: {A, B, C, ... X, Y, W, Z, 0, 1, 2, ... 9, _ }
c) Os nomes escolhidos devem explicitar seu conteúdo. Ex.: Total_de_Aunos, Horas_Extras, Total01, etc...
2.4 - DECLARAÇÃO DE VARIÁVEIS E SEUS OPERADORES.
Declarar uma variável significa reservar uma área (gaveta) na memória, dar-lhe um rótulo (nome) e especificar o seu tipo.
Ex.: VARIAVEIS
NUMERICO: Total, Soma, QtdeNotas
Símbolo Função Tipos Disponíveis
+ Adição inteiro, real - Subtração inteiro, real * Multiplicação inteiro, real / Divisão Real inteiro, real ^ Exponenciação inteiro, real
- Operadores Relacionais
Símbolo Função Tipos Disponíveis
> Maior todos < Menor todos = Igual todos <> Diferente todos >= Maior ou igual que todos <= Menor ou igual que todos
- Operadores Lógicos
Símbolo Função Tipos Disponíveis
E Conjunção lógico OU Disjunção lógico NAO Negação lógico
2.5 - FUNÇÕES PRIMITIVAS Função Finalidade
RESTO Resto da divisão inteira SEN(x) Calcula o seno de um número ASEN(x) Calcula o arco seno de um número
COS(x) Calcula o co-seno de um número ACOS(x) Calcula o arco co-seno de um número
TAN(x) Calcula a tangente de um número ATAN(x) Calcula o arco tangente de um número ALEATORIO Devolve um número aleatório entre 0 e 1
INTEIRO(x) Extrai de um número qualquer somente a sua parte inteira. VALOR(x) Converte o conteúdo de uma variável caracter em numérico
LOG(x) Calcula etorna o logaritmo de x na base (2) RAIZ(x) Calcula a raiz qualquer de um número
2.6 - PRIORIDADE DE EXECUÇÃO DOS OPERADORES NAS EXPRESSÕES MISTAS.
Durante a execução de uma expressão que envolve vários operadores, é necessária a existência de prioridades, caso contrário poderemos obter valores que não representam o resultado esperado.
Prioridade O p e r a ç õ e s
1 Efetuar operações embutidas em parênteses “mais internos” 2 Efetuar funções
3 Potenciação
4 Efetuar multiplicação e/ou divisão 5 Efetuar adição e/ou subtração 6 Operadores lógicos
7 Operadores relacionais
2.7 - DECLARAÇÃO DE CONSTANTES
Uma constante é um determinado valor fixo que não se modifica ao longo do tempo, durante a execução do algoritmo (programa).
Exemplo:
VARIAVEIS
NUMERICO Numero_de_Avalicoes, Numero_de_Alunos, Numero_de_Vagas, INICIO
Numero_de_Avalicoes = 4 Numero_de_Alunos = 40 Numero_de_Vagas = 45 FIM
2.8 - COMANDO DE ATRIBUIÇÃO
Comando é a descrição de uma ação a ser executada em um dado momento. Para atribuirmos um valor a uma variável usaremos o seguinte comando:
Total = 100
2.9 - COMANDOS DE ENTRADA E SAÍDA
Não estamos interessados nas formas de entrada e saída de dados, mas sim em como construir algoritmos que transformem dados em informações. Neste caso, iremos nos restringir ao uso de um único comando de entrada (leitura dos dados) e um único comando de saída (escrita das informações).
Entrada de Dados Saída de Informação ALGORITMO
LER ESCREVER
FIGURA 4: Entrada/Saída
2.10 - SINTAXE DOS COMANDOS DE ENTRADA E SAÍDA
LER d1 LER d2 LER dn
onde d1, d2, ..., dn são dados lidos de um dispositivo qualquer.
ESCREVER (i1, i2, ..., in)
onde i1, i2, ..., in são informações que serão escritas em um dispositivo qualquer.
EXEMPLO: Construir um algoritmo que: leia duas notas, calcule a média aritmética e escreva o resultado.
//algoritmo para calcular a média entre duas notas //
VARIAVEIS
NUMERICO QtdeNotas, Nota1, Nota2, Media INICIO
// Entrada de dados LER Nota1
LER Nota2
//Processamento
Media = (Nota1 + Nota2) / QtdeNotas
// Saída de informações
ESCREVER “A média entre as duas notas = “, média)
FIM.
Obs.: Os comentários podem ser introduzidos em qualquer ponto do algoritmo, bastando que estejam após barras //.
- Na saída de informações ESCREVER, o que está entre aspas é um comentário e não afeta o resultado.
]
3.0 - ESTRUTURA DE CONTROLE DE FLUXO
Durante a execução de um programa as ações primitivas (instruções) nem sempre são executadas na mesma ordem em que foram escritas. Isto ocorre porque muitas vezes temos interesse em fazer com que o computador execute um sequência de ações repetidas vezes, neste caso, devemos fazer com que o computador abandone o fluxo natural de execuções (de cima para baixo) e volte a executar a sequência de ações que desejamos. Essas estruturas nos permitirão desenvolver programas claros, compactos e estruturados.
3.1 - BLOCO
É uma sequência de ações primitivas, que como um todo, possui uma função bem definida.
Exemplo:
INICIO
Sequência de ações primitivas ... .
. FIM.
3.2 - SEQUÊNCIA SIMPLES
É um conjunto de ações primitivas que serão executadas numa sequência linear de cima para baixo, isto é, serão executadas na mesma ordem em que foram escritas.
Exemplo:
VARIAVEIS
INICIO ação_primitiva01 ação_primitiva02 . . . ação_primitivaN FIM. 3.3 - ESTRUTURAS ALTERNATIVAS
Podemos fazer com que um bloco seja ou não executado, dependendo do resultado obtido na inspeção de uma condição, que pode ser falso ou verdadeiro.
3.3.1 - ALTERNATIVA SIMPLES
SE (condição_A) ENTAO ação_primitiva
FIM_SE
Observação: Se (condição_A) for satisfeita, então a “ação primitiva” será executada.
(condição_A) é uma expressão lógica que, quando inspecionada, pode gerar um resultado falso ou verdadeiro.
3.3.2 - ALTERNATIVA COMPOSTA SE (condição_A) ENTAO ação_primitiva01; SENAO ação_primitiva02; FIM_SE
Observação: Se (condição_A) for satisfeita, então apenas a “ação_primitiva01”, caso contrário, (SENÃO) apenas a “ação_primitiva02" será executada.
3.3.3 - ALTERNATIVAS ANINHADAS
Podemos agrupar várias alternativas a fim de inspecionar uma ou mais condições.
SE (condição01) ENTAO ação_primitiva01 SENAO SE (condição02) ENTAO ação_primitiva02 SENAO SE (condição03) ENTAO
ação_primitiva03 FIM_SE
FIM_SE FIM_SE
Se “condição01" for satisfeita, então a “ação_primitiva01" será executada, caso contrário, (SENAO) a “condição02" será inspecionada e se for satisfeita, então a “ação_primitiva02" será executada, caso contrário (SENAO) a “condição03" será inspecionada e se for satisfeita, então a “ação_primitiva03" será executada.
3.4 - ALTERNATIVA DE MÚLTIPLA ESCOLHA.
FACA CASO Opcao CASO Opcao=v1 : ação_primitiva01 CASO Opcao=v2 : ação_primitiva02 CASO Opcao=v3 : ação_primitiva03 FIM_CASO
Caso o conteúdo da variável “Opcao” seja igual ao valor “vN” então a “ação_primitivaN” será executada, caso contrário, o próximo caso será inspecionado.
FACA CASO Opcao CASO Opcao=v1 : ação_primitiva01 CASO Opcao=v2 : ação_primitiva02 CASO Opcao=v3 : ação_primitiva03 OUTRO_CASO : ação_primitiva04 FIM_CASO
Caso o conteúdo da variável “Opcao” seja igual ao valor “vN” então a “ação_primitivaN” será executada, caso contrário, a “ação_primitiva04" executada.
3.4 - ESTRUTURAS DE REPETIÇÃO
Muitas vezes temos necessidade de repetir uma sequência de ações primitivas (bloco). O número de repetições pode ser indeterminado, porém finito, caso contrário o algoritmo não teria sentido, pois sua execução gastaria um tempo infinito.
3.4.1 – Estrutura: FACA ENQUANTO
Permite que um bloco ou uma ação primitiva seja repetida, enquanto uma determinada condição for satisfeita.
FACA ENQUANTO (condição_laço) ação_primitiva01
ação_primitiva02 ação_primitiva03 . . ação_primitivaN; FIM_ENQUANTO 3.4.2 – Estrutura: REPITA
Esta estrutura permite que um bloco ou uma ação primitiva seja repetida até que uma determinada condição seja satisfeita.
REPITA ação_primitiva01 ação_primitiva02 ação_primitiva03 . . ação_primitivaN; ATE(condição_laço); FIM_REPITA
OBS: A diferença básica entre as estruturas FACA ENQUANTO e REPITA é que nesta última, o bloco é executado pelo menos uma vez independente da validade da condição, isto ocorre porque a inspeção da condição é feita após a execução do bloco. Essa estrutura não é utilizada no ILA.
3.4.3 – Estrutura: PARA
Nas estruturas de repetição, apresentadas até o momento, é difícil sabermos exatamente quantas vezes o bloco será executado, sabemos apenas que ele será executado enquanto uma condição for satisfeita “FACA ENQUANTO”, ou até que uma condição seja satisfeita “REPITA”. Iremos apresentar uma estrutura capaz de repetir a execução do bloco um número bem definido de vezes. O controle do número de repetições é feito “automaticamente” por uma variável chamada de “variável de controle”, esta variável é atualizada (incrementada) após cada execução do bloco.
PARA variável_de_controle = expressão1 ATE número_de_repetições PASSO expressão2 FACA ação_primitiva01 ação_primitiva02 ação_primitiva03 . . ação_primitivaN PROXIMO
OBS: Ao contrário das estruturas de repetição vistas anteriormente, esta estrutura não permite que sua “variável de controle”, sofra alteração no interior do bloco, pois sua atualização é “automática”.
3.0 - ESTRUTURA DE DADOS (introdução) 3.1 - ESTRUTURAS DE DADOS HOMOGÊNEAS 3.1.1 – VETORES e MATRIZES
Esta estrutura permite a definição de um conjunto limitado de variáveis (todas do mesmo tipo e virtualmente com o mesmo nome) acessíveis por um índice. Por este motivo, algumas vezes, esta estrutura é chamada de “variáveis indexadas”.
Exemplo 1: Supondo que um aluno tenha 04 (quatro) notas, podemos declarar as variáveis necessárias para armazená-las da seguinte forma:
VARIAVEIS
MATRIZ NUMERICO Notas[4]
Exemplo 2: Supondo que tenhas uma turma de 40 (quarenta) alunos e suas 04 (quatro) notas, podemos declarar as variáveis necessárias para armazená-las da seguinte forma:
VARIAVEIS
Bibliografia:
PINTO, Wilson Silva. Introdução ao Desenvolvimento de Algoritmos e Estrutura de dados. 2ª ed. SP. Érica, 1990.
ILA 1.01 – Interpretador de Linguagem Algorítmica. Universidade do Vale do Rio dos Sino - UNISINOS.
ALGORITMOS (Curso de Ciência da Computação). Universidade do Vale do Itajaí – Campus VII – São José. Professora: Joyce Martins.