CURSO DE VERÃO EM BIOINFORMÁTICA ESTRUTURAL Introdução a Algoritmos e Estruturas de Dados Sandro Carvalho Izidoro [email protected] Apresentação Definição Variáveis Estrutura sequencial Estrutura condicional Estrutura de repetição Procedimentos e funções Vetor e Matriz Sandro Carvalho Izidoro Definição Para resolver um problema através de um computador é necessário encontrar uma maneira de descrevê-lo de uma forma clara e precisa. Assim se faz necessário estabelecer uma sequência de passos que conduzam à sua resolução. Esta sequência de passos é designada por algoritmo. O conceito central de programação e da ciência da computação é o de algoritmo. Programar é basicamente construir algoritmos. Algoritmo é a descrição de um conjunto de comandos que, obedecidos, resultam numa sucessão finita de ações. Sandro Carvalho Izidoro Definição Pseudocódigo é uma forma genérica de escrever um algoritmo, utilizando uma linguagem simples sem necessidade de conhecer a sintaxe de nenhuma linguagem de programação. Os programas de computadores nada mais são do que algoritmos escritos em uma linguagem de programação (Perl, Pascal, C/C++, Fortran, Java, etc.) e que são interpretados e executados por um computador. Sandro Carvalho Izidoro Definição Exemplo A seguir um exemplo de um algoritmo para somar 2 números. O que esse algoritmo faz é: Obter o primeiro número; Obter o segundo número; Somar os 2 números; Escrever o resultado. Sandro Carvalho Izidoro Algoritmo declare a,b,c numerico inicio leia a leia b c←a+b escreva c Fim algoritmo Definição Algoritmo declare a,b,c numerico inicio leia a leia b c←a+b escreva c Fim algoritmo Sandro Carvalho Izidoro {Programa que soma 2 numeros } Program Soma; var A, B, C : integer; begin Readln( A ); Readln( B ); C := A + B; Writeln( C ); end. /*Programa que soma 2 números */ #include <stdio.h> int main(void){ int A, B, C; scanf("%d", &A); scanf("%d", &B); C = A + B; printf("%d", C ); } Definição Algoritmo declare a,b,c numerico inicio leia a leia b c←a+b escreva c Fim algoritmo Sandro Carvalho Izidoro #!/usr/bin/perl # Somando dois numeros. my ($a, $b, $c); print "Digite o valor de A: "; $a = <STDIN>; print "Digite o valor de B: "; $b = <STDIN>; $c = $a + $b; print "Soma: $c\n"; Variáveis Sabe-se da matemática que uma variável é a representação simbólica dos elementos de um certo conjunto. Nos algoritmos, destinados a resolver um problema no computador, cada variável corresponde uma posição de memória cujo conteúdo pode variar ao longo do tempo durante a execução do programa. Embora uma variável possa assumir diferentes valores, ela só pode armazenar um único valor a cada instante. Toda variável é identificada por um nome ou identificador. Assim, por exemplo, em um algoritmo para cálculo das raízes de uma equação de 2º grau (ax2+bx+c = 0), os identificadores A, B, C podem representar as posições de memória que armazenam os coeficientes da equação. Sandro Carvalho Izidoro Variáveis Declaração de Variáveis As variáveis só podem armazenar valores de um mesmo tipo e são classificadas como numéricas, lógicas e literais. A declaração de variáveis tem a seguinte forma: declare lista-de-identificadores nome-do-tipo Exemplo: declare MASSA, CODIGO, X_5 numérico TESTE, SIM lógico NOME_PROTEINA literal Sandro Carvalho Izidoro Variáveis Declaração de Variáveis Um identificador é formado por 1 ou mais caracteres, sendo que o 1º caractere deve, obrigatoriamente, ser uma letra e os caracteres seguintes, letras ou dígitos, não sendo permitido o uso de símbolos especiais. Identificadores permitidos A X_5 NOTA A3_2B MATRICULA 1G3H5 Identificadores NÃO permitidos 5B X-Y Sandro Carvalho Izidoro E(13) NOTA[1] A:B B*D Variáveis Comentários Com a finalidade de simplificar o compreensão de um algoritmo é utilizado um instrumento denominado comentário. Os comentários podem ser colocados em qualquer ponto do algoritmo onde se façam necessários. Exemplo declare MAT, {Nº de matrícula do aluno} NOTA, {Total de pontos no semestre} COD {Código do curso} numérico Sandro Carvalho Izidoro Variáveis Variável Simples declare x, y, n numerico … x ← 100 / n escreva x Variável Composta Homogênea Variáveis compostas homogêneas correspondem a posições de memória, identificadas por um mesmo nome, individualizadas por índices e cujo conteúdo é de mesmo tipo. declare medias[1:50] numerico ... leia medias[13] Sandro Carvalho Izidoro Variáveis Variável Composta Heterogênea Variáveis compostas heterogêneas são conjuntos de dados logicamente relacionados, mas de tipos diferentes (numérico, literal, lógico). São também conhecidos como registros ou estruturas. Cada componente é individualizado pela explicitação de seu identificador. declare Funcionario registro (Nome, Rua, Sexo literal, Numero, CEP, CPF, Salario numerico, Nascimento literal) ... leia Funcionario.Nome, Funcionario.CPF Funcionario.Salario ← Funcionario.Salario + Aumento Sandro Carvalho Izidoro Estrutura Sequencial Estrutura sequencial em algoritmos Comando de atribuição Comandos de entrada e saída Operadores relacionais e lógicos Sandro Carvalho Izidoro Estrutura Sequencial Comando de atribuição Este comando permite que se forneça um valor a uma certa variável, onde a natureza deste valor tem de ser compatível com o tipo da variável na qual está sendo armazenado. O comando de atribuição tem a seguinte forma geral: identificador expressão Exemplos a) K 1 b) MEDIA SOMA / N c) COR "VERDE" d) TESTE F e) A B Sandro Carvalho Izidoro Estrutura Sequencial Comandos de Entrada e Saída As unidades de entrada e saída são dispositivos que possibilitam a comunicação entre o usuário e o computador. Através do teclado o usuário consegue dar entrada ao programa e aos dados na memória do computador. Por sua vez, o computador pode emitir os resultados e outras mensagens para o usuário através do vídeo ou de uma impressora. Um comando de entrada e saída é construído de acordo com a forma geral: leia lista de identificadores escreva lista de identificadores e/ou constantes Sandro Carvalho Izidoro Estrutura Sequencial Expressões Lógicas É comum nos algoritmos surgirem situações em que a execução de uma ação, ou sequência de ações, esteja sujeita a uma certa condição. Esta condição é representada no texto do algoritmo por meio de uma expressão lógica. Denomina-se expressão lógica à expressão cujos operadores são lógicos e cujos operandos são relações e/ou variáveis do tipo lógico. Sandro Carvalho Izidoro Estrutura Sequêncial Operadores Relacionais Relações: Uma expressão relacional, ou relação, é uma comparação realizada entre dois valores de mesmo tipo básico. Estes valores são representados na relação através de constantes, variáveis ou expressões aritméticas. O resultado obtido de uma relação, é sempre um valor lógico. Sandro Carvalho Izidoro Estrutura Sequêncial Operadores Lógicos Dadas as variáveis numéricas X,Y e Z, contendo os valores 2, 5 e 9 respectivamente, a variável literal NOME, contendo a sequência "MARIA" e a variável lógica SIM, contendo o valor lógico F, obter os resultados das expressões lógicas a seguir: a)( b)( c)( ) X + Y > Z e NOME = "MARIA" ) SIM ou Y > X ) NOME = "JORGE" e SIM ou X2 < Z + 10 Sandro Carvalho Izidoro Estrutura Condicional Estrutura Condicional A estrutura condicional permite a escolha do grupo de ações e estruturas a ser executado quando determinadas condições são ou não satisfeitas. A estrutura condicional pode ser apresentada através de uma estrutura simples ou de uma estrutura composta. Formato de uma Estrutura Condicional Simples se condição então sequência de comandos Sandro Carvalho Izidoro Estrutura Condicional Exemplo 01 Algoritmo declare sequencia01, sequencia02 literal sequencia01 ← “GTGGGATC” leia sequencia02 se sequencia01 = sequencia02 então escreva “Sequencia encontrada” Fim_Algoritmo #!/usr/bin/perl # Selecao Simples. my ($sequencia01, $sequencia02); $sequencia01 = "GTGGGATC"; print "Digite a sequencia: "; chomp($sequencia02 = <STDIN>); if($sequencia01 eq $sequencia02){ print "Sequencia encontrada\n"; } Sandro Carvalho Izidoro Estrutura Condicional Estrutura Condicional Composta se condição então sequência 1 de comandos senão sequência 2 de comandos Neste caso, a sequência 1 só será executada se a condição for verdadeira e a sequência 2 de comandos só será executada se a condição for falsa. Sandro Carvalho Izidoro Estrutura Condicional Exemplo 02 Algoritmo declare sequencia01 literal leia sequencia01 se sequencia01 = “GGTCAG” então escreva “Sequencia encontrada” senão escreva “Sequencia não encontrada” Fim_Algoritmo Sandro Carvalho Izidoro #!/usr/bin/perl # Selecao Composta. my ($sequencia); print "Digite a sequencia: "; chomp($sequencia = <STDIN>); if ($sequencia eq "GGTCAG"){ print "Sequencia encontrada\n"; } else { print "Sequencia não encontrada\n"; } Estrutura Condicional Exemplo 03 Algoritmo declare seq01, seq02, seq03 literal seq01 ← “GGTACGTA” seq02 ← “GGTACGAT” leia seq03 se seq03 = seq01 então escreva “Encontrou” senão se seq03 = seq02 então escreva “Encontrou” senão escreva “Não achou!” Fim_Algoritmo Sandro Carvalho Izidoro #!/usr/bin/perl # Selecao Composta. my ($seq01, $seq02, $seq03); $seq01 = "GGTACGTA"; $seq02 = "GGTACGAT"; print "Digite a sequencia: "; chomp($seq03 = <STDIN>); if ($seq03 eq $seq01){ print "Encontrou\n"; } elsif ($seq03 eq $seq02){ print "Encontrou\n"; } else {print "Não achou\n"; } Estrutura Condicional Exemplo 04 Algoritmo declare nota1, nota2, media numerico escreva “digite nota 1:” leia nota1 escreva “digite nota 2:” leia nota2 media ← (nota1+nota2)/2 se media >= 7 então escreva “Media: ”, media, “ - Aprovado” senão se media >= 5 então escreva “Media: ”, media, “ - Exame Final” senão escreva “Media: ”, media, “ - Reprovado” Fim_Algoritmo Sandro Carvalho Izidoro Estrutura Condicional Exemplo 04 #!/usr/bin/perl # Selecao Composta. my ($nota1, $nota2, $media); print "Digite nota 1: "; $nota1 = <STDIN>; print "Digite nota 2: "; $nota2 = <STDIN>; $media = ($nota1 + $nota2)/2; if ($media >= 7){ print "Media: $media - Aprovado\n"; } elsif ($media >= 5){ print "Media: $media - Exame final\n"; } else { print "Media: $media - Reprovado\n"; } Sandro Carvalho Izidoro Estrutura Condicional Exemplo 05 Algoritmo declare media, faltas numerico escreva “digite a media:” leia media escreva “digite o numero de faltas:” leia faltas se media < 5 ou faltas > 25 então escreva “Reprovado” senão se media >= 5 e media < 7 então escreva “Exame Final” senão escreva “Aprovado” Fim_Algoritmo Sandro Carvalho Izidoro Estrutura Condicional Exemplo 05 #!/usr/bin/perl # Selecao Composta. my ($media, $faltas); print "Digite a media: "; $media = <STDIN>; print "Digite o numero de faltas: "; $faltas = <STDIN>; if ($media < 5 || $faltas > 25){ print "Reprovado\n"; } elsif ($media >= 5 && $media < 7){ print "Exame Final\n"; } else { print "Aprovado\n"; } Sandro Carvalho Izidoro Estrutura de Repetição Estrutura de repetição A estrutura de repetição permite que uma sequência de comandos seja executada repetidamente até que uma determinada condição de interrupção seja satisfeita. A condição de interrupção que deve ser satisfeita é representada por uma expressão lógica. As estruturas de repetição são: • Comando Enquanto • Comando Repita • Comando Para Sandro Carvalho Izidoro Estrutura de Repetição Estrutura Enquanto Enquanto o valor da condição for verdadeiro, as ações dos comandos são executadas. Quando for falso, o comando é abandonado. Se já da primeira vez o resultado é falso, os comandos não são executados nenhuma vez. Formato do comando Enquanto enquanto condição faça inicio comandos fim Sandro Carvalho Izidoro Estrutura de repetição Exemplo Algoritmo declare X,Y, L numérico L←0 enquanto L <= 3 faça início leia X,Y se X > Y então escreva X senão escreva Y L←L+1 fim Fim_Algoritmo. Sandro Carvalho Izidoro #!/usr/bin/perl # Repeticao: Enquanto. my ($x, $y, $l); $l = 0; while ($l <= 3){ print "digite x: "; $x = <STDIN>; print "digite y: "; $y = <STDIN>; if ($x > $y){ print "$x \n"; } else { print "$y \n"; } $l = $l + 1; } Estrutura de Repetição Estrutura Repita Os comandos são executados pelo menos uma vez. Quando a condição é encontrada, ela é testada. Se for verdadeira o comando seguinte será executado. Se for falsa, os comandos voltam a ser executados. Em outras palavras os comandos são executados até que a condição se torne verdadeira. Formato do comando Repita repita comandos até condição Sandro Carvalho Izidoro Estrutura de Repetição Exemplo Algoritmo declare X,Y, L numérico L←0 repita leia X,Y se X > Y então escreva X senão escreva Y L←L+1 até L > 3 Fim_Algoritmo. Sandro Carvalho Izidoro #!/usr/bin/perl # Repeticao: Repita. my ($x, $y, $l); $l = 0; do { print "digite x: "; $x = <STDIN>; print "digite y: "; $y = <STDIN>; if ($x > $y){ print "$x \n"; } else { print "$y \n"; } $l = $l + 1; } until $l >= 3 Estrutura de Repetição Estrutura Para O comando para é, na verdade, o comando enquanto utilizando uma variável de controle, escrito numa notação compactada. Neste caso existirá sempre uma inicialização da variável de controle, um teste para verificar se a variável atingiu o limite e um acréscimo na variável de controle. Formato do comando Para para var de val_num_1 até val_num_2 [ passo val_num_3] faça início comandos fim Sandro Carvalho Izidoro Estrutura de repetição Exemplo Algoritmo declare X,Y, L numérico para L de 1 até 3 passo 1 faça início leia X,Y se X > Y então escreva X senão escreva Y fim Fim_Algoritmo. Sandro Carvalho Izidoro #!/usr/bin/perl # Repeticao: Para. my ($x, $y, $l); for ($l=0;$l<=3;$l++){ print "digite x: "; $x = <STDIN>; print "digite y: "; $y = <STDIN>; if ($x > $y){ print "$x \n"; } else { print "$y \n"; } } Procedimentos e Funções Um módulo é um grupo de comandos, constituindo um trecho de algoritmo, com uma função bem definida e o mais independente possível em relação ao resto do algoritmo. Todo módulo é constituído por uma sequência de comandos que operam sobre um conjunto de objetos, que podem ser globais ou locais. Objetos globais são entidades que podem ser usadas em módulos internos a outro módulo do algoritmo onde foram declaradas. Objetos locais são entidades que só podem ser usadas no módulo do algoritmo onde foram declaradas. A comunicação entre módulos deverá ser feita através de vínculos, utilizando-se objetos globais ou transferência de parâmetros. Sandro Carvalho Izidoro Procedimentos e Funções A divisão do algoritmo em módulos traz os seguintes benefícios: Manutenção simples (módulos independentes); Elaboração e testes em separado; Reutilização do módulo em outros programas. Ferramentas para modularização Como ferramentas de modularização podemos destacar as sub-rotinas e as funções. Os módulos de programação servem basicamente a três objetivos: Repetição de código; Dividir e estruturar melhor um algoritmo; Aumentar a legibilidade de um algoritmo. Sandro Carvalho Izidoro Procedimentos e Funções Sub-rotinas e funções são módulos hierarquicamente subordinados a um algoritmo, comumente chamado de módulo principal. Da mesma forma, uma sub-rotina ou uma função pode conter outras sub-rotinas e funções aninhadas. A sub-rotina e a função são criadas através das suas declarações em um algoritmo. Para serem executadas, necessitam de ativação provocada por um comando de chamada. Sandro Carvalho Izidoro Procedimentos e Funções Sub-rotinas Sintaxe Subrotina NOME (lista_de_parâmetros_formais) declarações dos objetos locais à sub-rotina comandos da sub-rotina Fim_sub_rotina NOME A chamada de uma sub-rotina é feita com uma referência a seu nome e a indicação dos parâmetros atuais no local do algoritmo onde a sub-rotina deve ser ativada, ou seja, onde a sua execução deve ser iniciada. A forma geral para a ativação de uma sub-rotina é a seguinte: NOME (lista_de_parâmetros_atuais) Sandro Carvalho Izidoro Procedimentos e Funções Funções Sintaxe Função tipo NOME (lista_de_parâmetros_formais) declarações dos objetos locais à função comandos da função retorne valor Fim_função NOME A chamada de uma função é feita com uma referência a seu nome e a indicação dos parâmetros atuais no local do algoritmo onde a função deve ser ativada. Pode-se chamar uma função de várias formas: valor ← NOME (lista_de_parâmetros_atuais) escreva NOME (lista_de_parâmetros_atuais) Sandro Carvalho Izidoro Procedimentos e Funções Exemplo Algoritmo declare numero numerico função literal ph (valor numerico) escreva “forneça o ph da solução:” leia numero escreva “A solução é “, ph (numero) Fim_Algoritmo. função literal ph (numero numerico) se numero > 7 então retorne “base” senão se numero < 7 então retorne “ácida” senão retorne “neutra” fim função ph Sandro Carvalho Izidoro Procedimentos e Funções Exemplo #!/usr/bin/perl # Função exemplo my ($ph); print "Forneça o ph da solução: "; $ph = <STDIN>; print "A solução é ", &retorna_ph($ph) , "\n"; sub retorna_ph { my $parametro01 = $_[0]; if ($parametro01 > 7) { return "base"; } elsif ($parametro01 < 7) { return "ácida"; }else { return "neutra";} } Sandro Carvalho Izidoro Vetor e Matriz Exemplo Vetor Algoritmo declare vetor1[1:3], vetor2[1:3] literal flag, i numérico escreva “Digite o primeiro vetor” para i de 1 até 3 passo 1 faça inicio leia (vetor1[ i ]) fim para escreva “Digite o segundo vetor” para i de 1 até 3 passo 1 faça inicio leia (vetor2[ i ]) fim para flag ← 1 Sandro Carvalho Izidoro para i de 1 até 3 passo 1 faça inicio se (vetor1[ i ] <> vetor2[ i ] ) então flag ← 0 fim para se (flag = 1) então escreva “Iguais” senão escreva “diferentes” fim algoritmo. Vetor e Matriz Exemplo Vetor #!/usr/bin/perl # Vetor my (@vetor1, @vetor2, $flag); $flag = 1; print "Digite o primeiro vetor:\n"; for($i=0;$i<3;$i++){ $vetor1[$i] = <STDIN>; } print "Digite o segundo vetor:\n"; for($i=0;$i<3;$i++){ $vetor2[$i] = <STDIN>; } Sandro Carvalho Izidoro for($i=0;$i<3;$i++){ if($vetor1[$i] ne $vetor2[$i]){ $flag = 0; } } if($flag == 1){ print "Vetores iguais\n";} else { print "Vetores diferentes\n"; } Vetor e Matriz Exemplo Matriz Algoritmo declare matriz[1:3,1:2], seq literal i, j numérico escreva “Digite os valores para a matriz” para i de 1 até 3 passo 1 faça inicio para j de 1 até 2 passo 1 faça inicio leia (matriz[ i, j ]) fim para fim para escreva “Digite uma sequência:” leia seq Sandro Carvalho Izidoro para j de 1 até 3 passo 1 faça inicio se (matriz[ i, 1 ] = seq) então escreva matriz[i , 2] fim para fim algoritmo.