Vous êtes sur la page 1sur 49

Curso tcnico em Informtica Soeducar - PEP

Algoritmo e Programao

Alterada por: Daniel Pereira Ribeiro

Sumrio
Introduo ................................ ................................ ................................ ................................ ................................ .. 4 1. 2. 3. 1. 2. 3. 4. 5. 6. 7. 1. 2. 3. 4. Alguns Conceitos Bsicos................................ ................................ ................................ ............................... 4 Software ................................ ................................ ................................ ................................ ......................... 5 O DESENVOLVIMENTO DE SISTEMAS DE INFORMAO E O PROGRAMADOR ................................ ...... 6 PSEUDO-CDIGO ................................ ................................ ................................ ................................ ......... 7 Portugus Estruturado ................................ ................................ ................................ ................................ .... 8 LINGUAGEM DE PROGRAMAO ................................ ................................ ................................ ............... 8 TIPOS DE LINGUAGENS DE PROGRAMAO ................................ ................................ ............................ 8 PROCESSO DE CRIAO E EXECUO ................................ ................................ ................................ ..... 8 ERROS NUM PROGRAMA ................................ ................................ ................................ .......................... 10 CRITRIOS DE QUALIDADE ................................ ................................ ................................ ....................... 10 IDENTIFICADORES, CONSTANTES, VARIVEIS E TIPOS BSICOS ................................ ........................ 11 DECLARAO DE VARIVEIS ................................ ................................ ................................ .................... 12 PALAVRAS RESERVADAS ................................ ................................ ................................ .......................... 12 OPERADORES ................................ ................................ ................................ ................................ ............ 13 3.1. 3.2. 3.3. 3.4. 3.5. 5. 6. OPERADOR DE ATRIBUIO ................................ ................................ ................................ ............. 13 OPERADORES ARITMTICOS: ................................ ................................ ................................ ........... 13 OPERADORES RELACIONAIS: ................................ ................................ ................................ ........... 13 OPERADORES LGICOS: ................................ ................................ ................................ ................... 14 PRIORIDADE DE OPERADORES: ................................ ................................ ................................ ....... 15

ALGORITMO ................................ ................................ ................................ ................................ ............................. 7

COMANDOS BSICOS ................................ ................................ ................................ ................................ ........... 11

EXERCCIOS INTRODUTRIOS I ................................ ................................ ................................ ............ 15 COMANDOS DE ENTRADA E SADA ................................ ................................ ................................ .......... 16 6.1. 3.6. Comando de Entrada de Dados ................................ ................................ ................................ ............ 16 Comando de Sada de Dados ................................ ................................ ................................ ............... 16

7. 1. 2.

ESTRUTURA DE UM ALGORITMO EM PSEUDO -CDIGO E C ................................ ................................ 16 SEQUNCIA ................................ ................................ ................................ ................................ ................ 17 SELEO ................................ ................................ ................................ ................................ .................... 17 2.1. 2.2. 2.3. SELEO SIMPLES ................................ ................................ ................................ ............................. 18 SELEO COMPOSTA ................................ ................................ ................................ ........................ 18 ANINHAMENTO DE SELEES ................................ ................................ ................................ .......... 18 LAO ENQUANTO(WHILE) ................................ ................................ ................................ .................. 19 CONTROLADOS POR CONTADOR ................................ ................................ ................................ ..... 19 REPETIO COM TESTE NO FINAL ................................ ................................ ................................ ... 20 ESCAPE DO LAO Abandone (break)................................ ................................ ............................... 21 Sinalizador ('Flags') ................................ ................................ ................................ ............................... 21

ESTRUTURAS BSICAS DE CONTROLE ................................ ................................ ................................ ............... 17

3.

ESTRUTURAS DE REPETIO - LAOS(LOOPS) ................................ ................................ ..................... 19 3.1. 3.2. 3.7. 3.8. 3.9.

4. 5. 6. 7. 1.

EXERCCIOS INTRODUTRIOS II................................ ................................ ................................ ............ 21 REGRAS PRTICAS PARA A CONSTRUO DE ALGORITMOS LEGVEIS ................................ .............. 22 UMA REFLEXO ANTES DE RESOLVER OS PROBLEMAS ................................ ................................ ....... 23 EXERCCIOS COMPLEMENTARES - I ................................ ................................ ................................ ........ 23 VETORES E MATRIZES ................................ ................................ ................................ .............................. 25

ALGORTMOS BASEADOS EM ESTRUTURAS DE DADOS HOMOGNEAS: ................................ ........................ 25

2. 3. 4.

REPETIO COM VARIVEL DE CONTROLE PARA (for) ................................ ................................ ....... 25 SELEO DENTRE AS MLTIPLAS ALTERNATIVAS -CASO (CASE)................................ ......................... 26 VETORES ................................ ................................ ................................ ................................ .................... 27 4.1. 3.10. DECLARAO DE VETORES ................................ ................................ ................................ .............. 28 EXERCCIOS SOBRE VETORES ................................ ................................ ................................ ......... 30 Exerccios Resolvidos ................................ ................................ ................................ ........................... 33

5.

MATRIZES ................................ ................................ ................................ ................................ ................... 31 5.1.

MODULARIZAO DE ALGORITMOS ................................ ................................ ................................ .................... 35 1. 2. 3. 4. 5. INTRODUO ................................ ................................ ................................ ................................ ............. 35 PROCEDIMENTOS ................................ ................................ ................................ ................................ ...... 35 FUNES ................................ ................................ ................................ ................................ .................... 36 Prottipos de Funes ................................ ................................ ................................ ................................ .. 39 Escopo de Variveis ................................ ................................ ................................ ................................ ..... 40 5.1. 3.11. 3.12. 6. 7. 8. 1. 2. Variveis locais ................................ ................................ ................................ ................................ ..... 40 Parmetros formais ................................ ................................ ................................ ............................... 41 Variveis globais ................................ ................................ ................................ ................................ ... 41

Passagem de parmetros por valor e passagem por referncia ................................ ................................ .... 42 FUNES RECURSIVAS ................................ ................................ ................................ ............................ 43 ESTRUTURAO DOS MDULOS DE UM ALGORITMO ................................ ................................ ........... 43 INTRODUO ................................ ................................ ................................ ................................ ............. 44 ALGORITMOS DE PESQUISA ................................ ................................ ................................ ..................... 44 2.1. 3.13. 3.14. PESQUISA SEQENCIAL SIMPLES ................................ ................................ ................................ .... 44 PESQUISA SEQENCIAL ORDENADA ................................ ................................ ............................... 45 PESQUISA BINRIA ................................ ................................ ................................ ............................. 46 MTODO DE SELEO DIRETA ................................ ................................ ................................ ......... 47 MTODO DE INSERO DIRETA ................................ ................................ ................................ ....... 48 MTODO DA BOLHA ................................ ................................ ................................ ........................... 48

ALGORITMOS DE PESQUISA E ORDENAO ................................ ................................ ................................ ...... 44

3.

ALGORITMOS DE ORDENAO................................ ................................ ................................ ................. 47 3.1. 3.2. 3.3.

Introduo
Nesta apostila estudaremos Lgica de Programao e, para isso, importante ter uma viso geral do processo de desenvolvimento de programas (software), visto que o objetivo final ter um bom embasamento terico para a prtica da programao de computadores.

1. Alguns Conceitos Bsicos


Dados So elementos brutos que podem ser processados por um computador para se obter alguma concluso ou resultado, ou seja, uma informao. Computador Mquina (Hardware) muito rpida que pode processar dados, realizando clculos e operaes repetitivas, se dotados de programao adequada (software ou firmware), e que fornece resultados corretos e precisos. Informao o resultado do processamento dos dados pelo computador. Uma informao pode ser considerada como um dado para outro processamento e, por isso, muitas v ezes referenciada como dado de sada. Hardware um termo de origem americana que engloba todo o equipamento, principal e perifrico, de um computador. O termo utilizado tambm para equipamentos sem software. O hardware normalmente fixo e difcil de ser modificado. Software outro termo de origem americana que engloba programas, documentao, proce ssamento de dados, utilizados em um computador para resoluo de determinado problema. O software, ao contrrio do hardware, malevel e por isso mais facilmente modificvel pelo programador, para adaptao a novos dados, novos requisitos do problema a ser resolvido, ou novo hardware onde vai funcionar (ser executado). Programa de computador Sequncia de instrues no ambgua e finita em uma linguagem de programao especifica que, quando executada, resolve um problema determinado. Linguagem de mquina a linguagem binria (composta de zeros e uns) utilizada pelos computadores, para representar dados, programas e informaes. tediosa, difcil de compreender e fcil de gerar erros na programao. Linguagens baixo nvel Linguagem de programao que compreende as caractersticas da arquitetura do computador. Assim, utiliza somente instrues do processador, para isso necessrio conhecer os registradores da mquina. Nesse sentido, as linguagens de baixo nvel esto diretamente relacionadas com a arquitetura do computador. Um exemplo a linguagem Assembly que trabalha diretamente com os registradores do processador, manipulando dados. Linguagens alto nvel Englobam todas as linguagens de programao que utilizam compiladores ou interpretadores. Possuem instrues mais poderosas que as linguagens de baixo nvel facilitando ainda mais o , trabalho do programador. Ex. Pascal, Delphi, C, C#, Java, PHP, etc. Linguagens no procedurais de alto nvel So linguagens utilizadas para sistemas de gerenciamento de banco de dados, planilhas, e outros aplicativos que utilizam comandos ainda mais poderosos que as linguagens de alto nvel e, por isso, so ainda mais fceis de programar. Ex. SQL, DBASE, Oracle PL/SQL, XML, etc. Compilador um programa utilizado para traduzir os programas escritos pelo programador nas linguagens de alto nvel (programa fonte) para linguagem de mquina (programa executvel), para que possa ser executado pelo computador. Interpretador um programa que traduz os programas escritos pelo programador para linguagem de mquina no momento da execuo (no existindo assim o programa executvel). IDE (Ambiente de Desenvolvimento Integrado) um programa que reuni algumas ferramentas para o desenvolvimento e software como, editor de texto, compilador, depurador, entre outro, facilitando o trabalho do programador.
4

2. Software
O software de um computador o que determina o seu uso e os resultados que sero produzidos e apresentados. Em um computador digital existem diversos tipos diferentes de software com finalidades e complexidades diferentes. Normalmente, quanto mais relacionado e prximo ao hardware, o software mais difcil e complexo de ser desenvolvido e mantido pelo programador.A Figura abaixo procura ilustrar em camadas o que foi dito. Partindo-se do hardware que est nocentro e normalmente contm um conjunto de instrues operacionais programado diretamente nele (FIRMWARE). O firmware armazenado permanentemente num circuito integrado (chip) de memria do hardware, como uma ROM, PROM, EPROM ou ainda EEPROM e memria flash, no momento da fabricao do componente. Muitos aparelhos simples possuem firmware, entre eles podemos citar controle remoto, calculadora de mo, alguns perifricos do computador como disco rgido, teclado, modem e tambm aparelhos mais complexos como celulares, cmeras digitais, aparelhos de som, geladeiras, entre outros que possuem um firmware para a execuo de suas tarefas. O Sistema Operacional com seus diversos programas a primeira camada de software donosso computador. muito complexo desenvolver-se um sistema operacional como DOS, UNIX, LINUX, WINDOWS, MAC OS, ANDROID e outros que voc j deve ter ouvido falar. Externamente ao sistema operacional vamos encontrar os compiladores e interpretadores das linguagens de programao que, de certa forma, traduzem os programas aplicativos para a linguagem de mquina que o computador entende. Nesta segunda camada encontramos tambm os processadores ou editores de texto, os gerenciadores de bancos de dados (MySQL, Firebird, PostgreSQL, Oracle, MS Access, etc.), as planilhase muitos outros programas utilitrios (Antivrus, Navegadores WEB, Reprodutores de udio e vdeo, editores de imagens, et .). c Na camada mais externa encontramos os programas aplicativos que podem serdesenvolvidos utilizandose os recursos da camada anterior e nas linguagens de programao,utilizando as IDEs, os interpretadores ou os compiladores para poderem ser desenvolvidos executados. Para o desenvolvimento destes programas que se faz uso das tcnicas de construo de algoritmos, de forma a se garantir que os programas sero gerados com um mnimo de e e podero ser mantidos, sem rro dificuldade, por um programador, que no o tenha desenvolvido. Ao contrrio do que muitos pensam, um computador no faz nada sozinho. Ele uma mquina rpida, que resolve problemas bem definidos e repetitivos, mesmo complexos, mas somente se for bem programado. Ou seja: se temos LIXO na entrada (quer na forma de maus programas ou dados ruins), teremos LIXO na sada (nossos resultados).

Figura 1.1 As Camadas de software em um computador.

3. O DESENVOLVIMENTO DE SISTEMAS DE INFORMAO E O PROGRAMADOR


Um sistema de informao pode ser definido como um sistema baseado em computador que auxilia, automatiza e aperfeioa o funcionamento de qualquer atividade atravs da(o): y y y Reduo da participao do homem em atividades rotineiras e repetitivas; Aumento da facilidade na coleta e armazenamento de dados e na rapidez de recuperao e manuseio; Reduo do nmero de erros produzidos em operaes de coleta, arquivamento e recuperao de dados e de informaes; Aumento de facilidade e flexibilidade na gerao de relatrios, entre outros.

Qual o papel do programador e do analista de sistemas no desenvolvimento de sistemas de informao? Vejamos o Ciclo de Vida de um sistema. Para desenvolvimento de qualquer sistema informatizado de boa qualidade h que se passar pelas seguintes fases: 1 Fase: Estudo de Viabilidade (Estudos Iniciais das necessidades de um sistema) 2 Fase: Anlise detalhada do sistema (Planejamento com o cliente) 3 Fase: Projeto preliminar do sistema (Planejamento com os analistas de sistemas) 4 Fase: Projeto detalhado do sistema (Algoritmos) 5 Fase: Codificao ou implementao (na linguagem escolhida) 6 Fase: Testes 7 Fase: Implementao, operao e manuteno As trs primeiras fases normalmente so de responsabilidade dos Analistas de Sistemas. Nas outras podem trabalhar indistintamente, dependendo da complexidade e da situao, programadores, analistas ou programadores e analistas. A construo dos algoritmos aparece ento na fase do projeto detalhado do sistema. Aps definidos e criados todos os algoritmos temos de codific-los na linguagem escolhida. Para essa tarefa o programador dever conhecer a mquina e o compilador a serem utilizados, e esse assunto ser coberto nos prximos mdulos. No desenvolvimento de um sistema, quanto mais tarde um erro detectado, mais dinheiro etempo se gasta para repar-lo. Assim, a responsabilidade do programador maior na criao dosalgoritmos do que na sua implementao, pois, quando bem projetados, no se perde muito tempo tendo que refaze-los reimplant-los e retest-los, assegurando assim um final feliz e no prazo previstopara o projeto. Entretanto, num projeto, o trabalho de desenvolvimento de algoritmos e programaspoder ter de ser todo refeito se houver problemas nas trsprimeiras fases, mostrando assim aimportncia do trabalho do Analista de Sistemas. Pode-se encontrar na literatura em informtica vrias formas de representao das etapas que compem o ciclo de vida de um sistema. Essas formas de representao podem variar tanto na quantidade de etapas quanto nas atividades a serem realizadas em cada fase. Como pode-se observar, nesse exemplo de ciclo de vida de um sistema (com sete fases) apresentado acima, os algoritmos fazem parte da quarta etapa do desenvolvimento de um programa. Na verdade, os algoritmos esto presentes no nosso dia-a-dia sem que saibamos, pois uma receita culinria, as instrues de uso de um equipamento ou as indicaes de um instrutor sobre como estacionar um carro, por exemplo, nada mais so do qu algoritmos. e

ALGORITMO
Um Algoritmo uma sequncia de instrues ordenadas de forma lgica para a resoluo de uma determinada tarefa ou problema. Algoritmo no computacional cujo objetivo a utilizao de um telefone pblico.

Incio 1. Tirar o fone do gancho; 2. Ouvir o sinal de linha;


S E Q U N C I A

3. Introduzir o carto; 4. Teclar o nmero desejado; 5. Se der o sinal de chamar 5.1 Conversar; 5.2 Desligar; 5.3 Retirar o carto; 6. Seno 6.1 Repetir; Fim.

REPETIO

SELEO

Podemos definir como formas bsicas para definir uma soluo de qualquer problema as etapas de: SEQUNCIA SELEO REPETIO Claro que para criar um algoritmo computacional no ser to simples como esse apresentado. Na informtica, o algoritmo o "projeto do programa", ou seja, antes de se fazer um programa (software) na Linguagem de Programao desejada (Pascal, C, Delphi, Java, PHP, etc.) deve-se fazer o algoritmo do programa. J um programa, um algoritmo escrito numa forma compreensvel pelo computador (atravs de uma Linguagem de Programao), onde todas as aes a serem executadas devem ser especificadas nos mnimos detalhes e de acordo com as regras de sintaxe1 da linguagem escolhida. Um algoritmo no a soluo de um problema, pois, se assim fosse, cada problema teria um nico algoritmo. Um algoritmo um 'caminho' para a soluo de um problema e, em geral, existem muitos caminhos que levam a uma soluo satisfatria, ou seja, para resolver o mesmo problema pode-se obter vrios algoritmos diferentes. Assim podemos definir que um algoritmo precisa: 1. Ter incio e fim; 2. Ser descrito em termos de aes no ambguas e bem definidas; 3. Que as aes sigam uma sequncia ordenada.

1. PSEUDO-CDIGO
Os algoritmos so descritos em uma linguagem chamada pseudo-cdigo. Este nome uma aluso posterior implementao em uma linguagem de programao, ou seja, quando formos programar em uma linguagem, por exemplo, C, estaremos gerando cdigo em C. Por isso os algoritmos so independentes das linguagens de programao. Ao contrrio de uma linguagem de programao no existe um formalismo rgido de como deve ser escrito o algoritmo. O algoritmo deve ser fcil de interpretar e fcil de codificar. Ou seja, ele deve ser o intermedirio entre a linguagem falada e a linguagem de programao. Utilizaremos em nosso curso o PORTUGOL para o estudo dos algoritmos e a Linguagem de Programao C para a criao dos programas. 7

2. Portugus Estruturado
O Portugus Estruturado uma forma especial de linguagem bem mais restrita que a Lngua Portuguesa e com significados bem definidos para todos os termos utilizados nas instrues (comandos). Essa linguagem tambm conhecida como Portugol (juno de Portugus com Algol, Pseudocdigo ou Pseudolinguagem. O Portugus Estruturado na verdade uma simplificao extrema da lngua portuguesa, limitada a pouqussimas palavras e estruturas que tm significado pr-definido, pois deve-se seguir um padro. Emprega uma linguagem intermediria entre a linguagem natural e uma linguagem de programao, para descrever os algoritmos. A sintaxe do Portugus Estruturado no precisa ser seguida to rigorosamente quanto a sin taxe de uma linguagem de programao, j que o algoritmo no ser executado como um programa. Embora o Portugus Estruturado seja uma linguagem bastante simplificada, ela possui todos os elementos bsicos e uma estrutura semelhante de uma linguagem de pr gramao de computadores. Portanto, resolver o problemas com portugus estruturado pode ser uma tarefa to complexa quanto a de escrever um programa em uma linguagem de programao qualquer, s no to rgida quanto a sua sintaxe, ou seja, o algoritmo no d eixa de funcionar porque esquecemos de colocar um ';' (ponto evrgula)por exemplo, j um programa no funcionaria. A Figura a seguir apresenta um exemplo de algoritmona forma de representao de portugus estruturado.

Figura 2.1: Exemplo de Portugus Estruturado

3. LINGUAGEM DE PROGRAMAO
Uma linguagem de programao uma notao formal para descrio de algoritmos que sero executados por um computador. Como todas as notaes formais, uma linguagem de programao tem dois componentes: Sintaxe e Semntica. A sintaxe consiste em um conjunto de regras formais, que especificam a composio de programas a partir de letras, dgitos, e outros smbolos. Por exemplo, regras de sintaxe podem especificar que cada parnteses aberto em uma expresso aritmtica deve corresponder a um parnteses fechado, e que dois comandos quaisquer devem ser separados por um ponto e vrgula. As regras de semntica especificam o significado de qualquer programa, sintaticamente vlido, escrito na linguagem.

4. TIPOS DE LINGUAGENS DE PROGRAMAO


Existem diversas linguagens de programao, cada uma com suas caractersticas especficas e com nveis de complexidade e objetivos diferentes como j vimos anteriormente: Linguagem de Mquina Linguagens de Baixo Nvel Linguagens de Alto Nvel nica compreendida pelo computador. Especfica para cada tipo de computador (processador). Ex.: Assembly Utiliza instrues prximas da linguagem humana de forma a facilitar o raciocnio. Ex.: Uso Cientfico: Fortran Propsito Geral: Pascal, C, Basic, Delphi, Java Uso Comercial: Cobol, Clipper

y y

5. PROCESSO DE CRIAO E EXECUO


Embora seja teoricamente possvel a construo de computadores especiais, capazes de executar programas escritos em uma linguagem de programao qualquer, os computadores, existentes hoje em dia so capazes de executar somente programas em linguagem de baixo nvel, a Linguagem deMquina. 8

As Linguagens de Mquina so projetadas levando -se em conta os seguintes aspectos: Rapidez de execuo de programas; Custo de sua implementao; Flexibilidade com que permite a construo de programas de nvel mais alto. Por outro lado, lin guagens de programao de alto nvel so projetadas em funo de: Facilidade de construo de programas Confiabilidade dos programas O PROBLEMA : Como a linguagem de nvel mais alto pode ser implementada em um computador, cuja linguagem bastante diferente e de nvel mais baixo? SOLUO: Atravs da traduo de programas escritos em linguagens de alto nvel para alinguagem de baixo nvel do computador. Para isso existem trs tipos de programas tradutores: Montadores, Interpretadores e Compiladores ou simplesmente uma IDE. MONTADOR Efetua a traduo de linguagem de montagem (Assembly) para a linguagem demquina. 1. 2. 3. 4. Obtm prxima instruo do Assembly Traduz para as instrues correspondentes em linguagem de mquina Executa as instrues em linguagem de mquina Repete o passo 1 at o fim do programa

INTERPRETADOR Efetua a traduo de uma linguagem de alto nvel para linguagem demquina da seguinte forma: 1. 2. 3. 4. Obtm prxima instruo do cdigo-fonte em linguagem de alto nvel Traduz para as instrues correspondentes em linguagem de mquina Executa as instrues em linguagem de mquina Repete o passo 1 at o fim do programa

COMPILADOR Efetua a traduo de todo o cdigo-fonte em linguagem de alto nvel para as instrues correspondentes em linguagem de mquina, gerando o cdigo-objeto do programa. Em seguida necessrio o uso de outro programa (Link-Editor) que responsvel pela juno de diversos cdigos -objeto em um nico programa executvel. IDEs Facilitam a tcnica de RAD (de Rapid Application Development, ou "Desenvolvimento Rpido de Aplicativos"), que visa a maior produtividade dos desenvolvedores. As caractersticas e ferramentas mais comuns encontradas nos IDEs so: y y y y y Editor - edita o cdigo-fonte do programa escrito na(s) linguagem(ns) suportada(s) pela IDE; Compilador (compiler) - compila o cdigo-fonte do programa, editado em uma linguagem especfica e a transforma em linguagem de mquina; Linker - liga (linka) os vrios "pedaos" de cdigo-fonte, compilados em linguagem de mquina, em um programa executvel que pode ser executado em um computador ou outro dispositivo computacional. Depurador ( ebugger) - auxilia no processo de encontrar e corrigir defeitos no cdigo-fonte do programa, na tentativa de aprimorar a qualidade de software; Modelagem (modelling) - criao do modelo de classes, objetos, interfaces, associaes e interaes dos artefatos envolvidos no software com o objetivo de solucionar as necessidades -alvo do software final. Gerao de cdigo - caracterstica mais explorada em Ferramentas CASE, a gerao de cdigo tambm encontrada em IDEs, contudo com um escopo mais direcionado a templates de cdigo comumente

y y

utilizados para solucionar problemas rotineiros. Todavia, em conjunto com ferramentas de modelagem, a gerao pode gerar todo ou praticamente todo o cdigo-fonte do programa com base no modelo proposto, tornando muito mais rpido o processo de desenvolvimento e distribuio do software; Distribuio (deploy) - auxilia no processo de criao do instalador do software, ou outra fo rma de distribuio, seja discos ou via internet. Testes Automatizados (automated tests) - realiza testes no software de forma automatizada, com base em scripts ou programas de testes previamente especificados, gerando um relatrio, assim auxiliando na anlise do impacto das alteraes no cdigo-fonte. Ferramentas deste tipo mais comuns no mercado so chamadas robs de testes. Refatorao (refactoring) - consiste na melhoria constante do cdigo-fonte do software, seja na construo de cdigo mais otimizado, mais limpo e/ou com melhor entendimento pelos envolvidos no desenvolvimento do software. A refatorao, em conjunto com os testes automatizados, uma poderosa ferramenta no processo de erradicao de "bugs", tendo em vista que os testes "garantem" o mesm o comportamento externo do software ou da caracterstica sendo reconstruda.

6. ERROS NUM PROGRAMA


Erros de Compilao: Erros de digitao e de uso da sintaxe da linguagem Erros de Link-Edio: Erro no uso de bibliotecas de subprogramas necessrias ao programa principal. Erros de Execuo: Erro na lgica do programa (algoritmo).

7. CRITRIOS DE QUALIDADE
Refere-se preciso das informaes manipuladas pelo programa, ou seja, os resultados gerados pelo processamento do programa devem estar corretos, caso contrrio o programa simplesmente no tem sentido. Clareza: Refere-se facilidade de leitura do programa. Se um programa for escrito com clareza, dever ser possvel a outro programador seguir a lgica do programa sem muito esforo, assim como o prprio a utor do programa entend-lo aps ter estado um longo perodo afastado dele. (Comentrios no cdigo) Simplicidade: A clareza e preciso de um programa so normalmente melhoradas tornando as coisas o mais simples possvel, consistentes com os objetivos do pr ograma. Muitas vezes torna-se necessrio sacrificar alguma eficincia de processamento, de forma a manter a estrutura do programa mais simples. Eficincia: Refere-se velocidade de processamento e a correta utilizao da memria. Um programa deve ter desempenho SUFICIENTE para atender as necessidades do problema e do usurio, bem como deve utilizar os recursos de memria de forma moderada, dentro das limitaes do problema. Modularizao: Durante a fase de projeto, a soluo do problema total vai sendo fatorada emsolues de subproblemas, o que permite, geralmente, dividir o problema de forma natural em mdulos com subfunes claramente delimitadas, que podem ser implementados separadamentepor diversos programadores de uma equipe, ou seja, a modularizao consiste noparticionamento do programa em mdulos menores bem identificveis e com funes especficas,de forma que o conjunto desses mdulos e a interao entre eles permite a resoluo doproblema de forma mais simples e clara. Generalidade: interessante que um programa seja to genrico quanto possvel de forma apermitir a reutilizao de seus componentes em outros projetos. METODOLOGIA DE SOLUO 1. 2. 3. 4. 5. 6. Entender o problema; Formular um esboo da soluo; Fazer uma primeira aproximao das variveis necessrias; Rever os passos originais, detalhando; Se o algoritmo estiver suficientemente detalhado, testar com um conjunto de dados significativos; Implementar numa linguagem de programao.

10

COMANDOS BSICOS
1. IDENTIFICADORES, BSICOS CONSTANTES, VARIVEIS E TIPOS

Identificadores: Representam os nomes escolhidos para rotular as variveis, procedimentos e funes, normalmente, obedecem as seguintes regras:

Letra Letra Dgito

1. O primeiro caractere deve ser uma letra 2. Os nomes devem ser formados por caracteres pertencentes ao seguinte conjunto: {a,b,c,..., z,A,B,C,...Z,0,1,2,...,9,_} 3. Os nomes escolhidos devem explicitar seu contedo. EX: A, B1, BC3D,SOMA, CONTADOR ; Obs.: Um exemplo de identificador invlido seria 2AB ou qualquer outro iniciado por um dgito Constante (constant) Uma constante (Const), como sugere o nome, umidentificador que armazena um valor fixo e imutvel, durante a execuo de um algoritmoou programa. Podemos associ a uma posio de -lo memria (endereo) que tem umcontedo fixo. Este contedo poder ser um nmero (real ou inteiro), uma cadeia decaracteres (texto) ou um valor lgico (ser definido abaixo). Varivel (variable) Uma varivel (Var) um identificador que, como sugere onome, possui o contedo varivel durante a execuo de um algoritmo ou programa.Podemos associar uma varivel a uma posio da memria (endereo) e poderemosarmazenar (guardar) neste endereo qualquer valor do conjunto de valores de um tipobsico associado a ela. Uma varivel pode assumir vrios valores diferentes ao longo daexecuo do programa, mas, em um determinado momento, possui apenas um valor.Unidades bsicas de armazenamento das informaes a nvel de linguagens deprogramao. Os tipos de dados e variveis utilizados dependem da fina lidade dosalgoritmos, mas, podemos definir alguns, pelo fato de serem largamente utilizados eimplementados na maioria das linguagens: Esse tipo bsico poder ser: INTEIRO (int, short int ou long int): qualquer nmero inteiro, negativo, nulo ou positivo. Ex: -2, -1, 0... Operaes: soma(+), subtrao(-), multiplicao(*), diviso inteira(/), resto(%) e comparaes. REAL (float ou double): qualquer nmero real, negativo, nulo ou positivo. Ex: 2.5, 3.1 Operaes: soma(+), subtrao(-), multiplicao(*), diviso exata(/) e comparaes. CARACTER (char): qualquer conjunto de caracteres alfanumricos. Ex: A, B, "ABACATE" Operaes: comparaes TEXTO OU CADEIA DE CARACTERES (string):uma varivel deste tipo poder armazenaruma cadeia de caracteres de qualquer tamanho. Caso seja imprescindvel para o entendimentopode-se acrescentar, entre parnteses, a quantidade mxima de caracteres. (Exemplo: texto (10)). Obs.: Os textos devero ser representados sempre entre apstrofes para que no se confundamcom os valores numricos. Veja que o inteiro 5, diferente do texto 5. 11

LGICO (boolean):tipo especial de varivel que armazena apenas os valores V e F, onde Vrepresenta VERDADEIRO e F FALSO. Ex: e, ou, no Operaes: Verdadeiro ou Falso

2. DECLARAO DE VARIVEIS
Consiste na definio dos nomes e valores das constantes e dos nomes e tipos dasvariveis que sero utilizadas pelos algoritmos, previamente sua utilizao, incluindocomentrio, quando se fizerem necessrios. Na maioria das linguagens de programao, quando o computador est executando umprograma e encontra uma referncia a uma varivel ou a uma constante qualquer, se esta notiver sido previamente definida, ele no saber o que fazer com ela. Da mesma forma, umprogramador que estiver implementando um al oritmo, em alguma g linguagem de programao,ter o seu trabalho simplificado se todas as constantes e variveis referenciadas no algoritmotiverem sido previamente declaradas. As constantes so declaradas antes das variveis. Vejamosos formatos da declarao e alguns exemplos. O significado da declarao de variveis corresponde criao de locais na memria rotuladacom o nome da varivel (identificador) e marcada com o tipo de valores que ela pode conter. Paraque os programas manipulem valores, estes devem ser armazenados em variveis e para isso,devemos declar-las de acordo com a sintaxe:

inteiro real caracter lgico

identificador

Ex: Inteiro X1; obs.: X1 o nome de um local de memria que s pode conter valores do tipo inteiro real SOMA, MDIA; caractere frase, nome; inteiro X1; real A,B; lgico TEM;

3. PALAVRAS RESERVADAS
So palavras que tero uso especfico no nosso pseudo-cdigo e que no devero serusadas como identificadores, para no causar confuso na interpretao. Exemplo: Algoritmo, Programa, Bloco, Procedimento, Inteiro, Real, Texto, Const,Var, Tipo, Incio, Imprima, Se, Ento, Seno, Enquanto, Repita, Variando,Faa, Caso, At, Vetor, Matriz, Registro, Fim, Execute, Procedimento, Funo, etc.... O significado de cada um desses termos ser visto e entendido nos itens e captulos que seseguem. COMANDO SIMPLES uma instruo simples. leia(x); COMANDO COMPOSTO Um grupo de comandos simples que executam alguma tarefa. Incio leia(x); y = 2*x; fim.

12

4. OPERADORES
Na soluo da grande maioria dos problemas necessrio que as variveis tenham seus valores consultados ou alterados, para isto, devemos definir um conjunto de OPERADORES, sendo eles:

3.1. OPERADOR DE ATRIBUIO


Identificador = Expresso aritmtica Expresso lgica Expresso literal Ex: O valor da expresso atribudo ao identificador (varivel). X = 2; y = 5-x; Este comando permite que se fornea ou altere o valor de uma determinada varivel, onde o tipo desse valor seja compatvel ao tipo de varivel na qual est sendo armazenado, de acordo com o especificado na declarao. NUM = 8 {A varivel NUM recebe o valor 8} NOME = Guilherme {A varivel NOME recebe o valor Guilherme} CONT = 0 AUXNOME = NOME {A varivel AUXNOME recebe o contedo da varivel NOME} ACHOU = falso {A varivel ACHOU recebe o valor falso}

3.2. OPERADORES ARITMTICOS:


+ = Adio * = Multiplicao - = Subtrao ou inverso do sinal. % = Resto da diviso de inteiros 5%2=1 b a**b = Exponenciao a SINAL(A) - Fornece o valor -1, +1 ou zero conforme o valor de A seja negativo, positivo ou igual a zero.

/ = Diviso TRUNCA(A) - A parte inteira de um nmero Fracionrio. / = Quociente da diviso de inteiros ARREDONDA(A) - Transforma por arredondamento, 5/2=2 um nmero fracionrio em inteiro. Obs. FUNES PRIMITIVAS: As funes mais comuns de matemtica so tambm definidas e vlidas no PORTUGOL. Exemplos: LOG (X), {d o logaritmo na base 10 de X} SEN (X), {d o seno de X} ABS (X), {d o valor absoluto de X} INT (X), {d a parte inteira de um real X} ARREDONDA (x), {arredonda um real para inteiro} RAIZ (X), {d a raiz quadrada de X} etc.

3.3. OPERADORES RELACIONAIS:


So utilizados para relacionar variveis ou expresses, resultando num valor lgico (Verdadeiro ou Falso), sendo eles: == igual <menor <= menor ou igual != diferente de >maior >= maior ou igual

Exemplo: NUM = 3 NOME = DENISE NUM > 5 falso (0) {3 no maior que 5} NOME < DENIZ verdadeiro (1) {DENISE vem antes de DENIZ} 13

(5 + 3) > = 7 verdadeiro NUM != (4 1) falso {lembre-se que NUM recebeu 3}

3.4. OPERADORES LGICOS:


Os operadores lgicos permitem que mais de uma condio seja testada em uma nica expresso, ouseja, pode-se fazer mais de uma comparao (teste) ao mesmo tempo. Operao Negao Conjuno Disjuno (no exclusiva) Disjuno (exclusiva) Operador no e ou xou (l-se: ou exclusivo)

Note que a tabela acima, apresenta os operadores lgicos j ordenados de acordo com suas prioridades, ou seja, se na mesma expresso tivermos o operador ou e o operador no, por exemplo,primeiro devemos executar o no e depois o ou. De uma forma geral, os resultados possveis para os operadores lgicos podem ser vistos na tabela abaixo, conhecida como Tabela Verdade: A F F V V B F V F V AeB F F F V A ou B F V V V no A V V F F A xou B F V V F

Exemplos de testes utilizando operadores lgicos: Expresso Se chover e relampejar, eu no saio. Se chover ourelampejar, eu no saio. Se chover xourelampejar, eu no saio. Quando eu no saio? Somente quando chover e relampejar ao mesmo tempo (apenas 1 possibilidade). Somente quando chover, somente quandorelampejar ou quando chover e relampejar aomesmo tempo (3 possibilidades). Somente quando chover, ou somente quandorelampejar (2 possibilidades).

1.

Se (salario > 180) e (salrio < 800) Ento Escrever ('Salrio vlido para financiamento') Seno Escrever ('Salrio fora da faixa permitida para financiamento') FimSe. Se (idade < 18) ou (idade > 95) Ento Escrever ('Voc no pode fazer carteira de motorista') Seno Escrever ('Voc pode possuir carteira de motorista') FimSe Se (idade > = 18) e (idade < = 95) e (aprovado_exame = 'sim') Ento Escrever ('Sua carteira de motorista estar pronta em uma semana') Seno Escrever ('Voc no possui idade permitida ou no passou nos testes') FimSe. 14

2.

3.

3.5. PRIORIDADE DE OPERADORES:


Durante a execuo de uma expresso que envolve vrios operadores, necessrio a existncia de prioridades, caso contrrio poderemos obter valores que no representam o resultado esperado. A maioria das linguagens de programao utiliza as seguintes prioridades de operadores: 1 - Efetuar operaes embutidas em parnteses "mais internos" 2 - Efetuar Funes 3 - Efetuar multiplicao e/ou diviso 4 - Efetuar adio e/ou subtrao 5 - Operadores Relacionais 6 - Operadores Lgicos Ou seja, Primeiro: Parnteses e Funes Segundo: Expresses Aritmticas 1) +, - (Unitrios) 2) ** 3) *, / 4) +, - (binrio) Terceiro: Comparaes Quarto: No Quinto: e Sexto: ou OBS: O programador tem plena liberdade para incluir novas variveis, operadores ou funes para adaptar o algoritmo as suas necessidades, lembrando sempre, de que, estes devem ser compatveis com a linguagem de programao a ser utilizada.

5. EXERCCIOS INTRODUTRIOS I
1. O resultado da expresso 3 + 6 * 13 = X? 2. Sendo A,B,C e D variveis do tipo inteiro, cujos contedos so: A=3, B=4, C=13 e D=4. Quais os valores fornecidos por cada uma das expresses aritmticas abaixo? a) 100*(B/A)+C b) A%5 - D/2 c) trunca(0,3+5)*2 3. a) X+Y-Z; c) JOO+JOS/JOEL; 4. 5. d) (C+D)/C**2 e) B%(A+1) f) sinal(D -C) b)A+B/C**2; d) X+Y+B**2+R*3

Qual a primeira operao executada em cada um dos comandos abaixo?

Avalie a seguinte expresso aritmtica: 6+4/2*3. O resultado desta expresso 15; 12; 24? Qual o resultado das seguintes expresses a) 1 + 7 * 2 ** 2 - 1 = X b) 3 * (1 - 2) + 4 * 2 = X

6.

Avalie as expresses abaixo sabendo que X = 2 e Y = 3 a) 3 * y - x ** 2 * (7 - y ** 2) b) 2 * x * (3 - y) / (x ** 2 - y)

7.

Identifique as entradas e sadas das expresses abaixo. Escreva-as em forma computacional a) r=2y+3zb)

15

6.

E E

E S

reci o represent r troca e informaes e ocorrer entre o mundo da mquina e o nosso No l orit o mundo, para isso, devemos utili ar comandos de entrada e sada, sendo que, no nvel de al oritmo esses comandos representam apenas a entrada e a sada da informao, independe do dispositivo utili ado teclado, discos, impressora, monitor,... , mas, sabemos que nas linguagens de programao essa independncia no existe, ou seja, nas linguagens de programao temos comandos especficos para cada tipo de unidade de Entrada/Sada.

6. .


E
   

Para que possamos obter dados do meio exterior para uso do computador memria principal , estes tm de vir atravs dos dispositivos de entrada. a mesma forma, as informaes que so produzidas, tm de ser levadas ao meio externo um arquivo, uma impressora, uma tela etc. atravs de um dispositivo de sada. Para isso, utilizamos dois comandos assim definidos: omando Lei ( no c): l, do meio externo, a prxima informao disponvel para leitura e armazena na(s) varivel(eis) discriminada(s) aps o comando, entre parnteses. ais tarde aprenderemos como especificar a leitura de um dado que est armazenado em um arquivo e de que arquivo est sendo lido o d ado. i , i ,... ;

Ex: leia (v);

valor da varivel (v) dado por um dispositivo de entrada (teclado).

3.6.

m
5 32 4 32 76

Comando Im im ( i no c): Imprime (na tela ou na impressora) o contedo da(s) varivel(eis) especificada(s) aps o comando, entre parnteses. No ser preocupao nossa a formatao de relatrios, mas o comando permite a impresso de texto (entre), se for necessria para c lareza ou especificao do que est sendo impresso. Im

im

Imprima

Ex: imprima (x);

valor atual da varivel (x) informado para um dispositivo de sada(monitor).

7. ES

As estruturas de controle introduzidas nesta unidade facilitaro a expresso de algoritmos e permitiro que exemplos mais significativos sejam apresentados e propostos, visando o aperfeioamentodo desenvolvimento do processo de aprendizado da construo de algoritmos. escreveremos a seguir os comandos bsicos de controle do P o programa equivalente em linguagem C para uma mel or compreenso. P L

Algoritmo Incio declaraes de variveis>;

SH QPIH R

'

Lei

el

el

; ( identificador ) ;

expresso ,

PSE

. Sero introduzidos paralelamente

"

D B 3@ 4A @98 4 32 EC C

' $& % $ ( $& % $# 

 !   

V`Y WV U X

 G

16

<comandos>; Fim. C #include <stdio.h> main () /* Um Primeiro Programa */ { printf ("Meu primeiro programa\n"); } Comentrio de cdigos: Quando fazemos um programa, uma boa ideia usar comentrios que ajudem a elucidar o funcionamento do mesmo. Os comentrios devem vir entre /* */ Ex: /* Um Primeiro Programa */ O compilador C desconsidera qualquer coisa que esteja comeando com /* e terminando */. DOCUMENTAO Alguns princpios bsicosdevero ser usados desde a criao do primeiro algoritmo: y y y Ao criar as constantes e variveis, utilizar nomes significativos e comentar, se necessrio for; Utilizar identao (trs espaos como sugesto), para mostrar a estrutura lgica e sequncia de comandos, quando usando o PORTUGOL e C. Utilizar parnteses para evitar ambiguidade nas expresses;

ESTRUTURAS BSICAS DE CONTROLE


No captulo anterior, foram apresentados exemplos das trs estruturas necessrias para representao da soluo de qualquer algoritmo: a sequncia, a seleo e a repetio. Em se tratando de algoritmo para computadores, as trs tambm formam a base das estruturas de controle de execuo. Vejamos como formalizaremos a representao e o uso dessas estruturas no PORTUGOL e na Linguagem C.

1. SEQUNCIA
Grupo de comandos que so executados um aps o outro. PORTUGOL Incio comando 1; comando 2; . . comando n; Fim. C #include <stdio.h> main () /* Um Primeiro Programa */ { printf ("Meu primeiro programa\n"); }

2. SELEO
Tambm chamada de estrutura de deciso ou de processamento condicional, a estrutura de seleo utilizada quando a execuo de um comando (ou uma sequncia de comandos) depende de um teste anterior (uma ou mais comparaes). A seleo pode ser simples ou composta. 17

2.1.

SELEO SIMPLES

Quando a execuo de um comando (ou de uma sequncia de comandos) depender de uma condio verdadeira, e no h comandos a executar se a condio for falsa. PORTUGOL Se <condio> Ento (comandos); Fim Se; C if (num==10) //Condio { printf ("O numero e igual a 10."); //Comando } Onde a CONDIO poder ser tambm uma expresso lgica. Exemplo1: leia um nmero inteiro e o imprima se ele for diferente de 0 (ZERO) Exemplo2: Se (a<5) Ento Imprima (o valor de a a); Fim Se;

2.2.

SELEO COMPOSTA

Quando se executa um comando (ou sequncia de comandos) se uma condio verdadeira, e se executa um outro comando (ou sequncia de comandos) se a condio falsa. PORTUGOL Se <condio> Ento (comandos); Seno (comandos); Fim Se; C if (num==10) // Condio { printf ("O numero e igual a 10."); // Comando } else { printf ("O numero e diferente de 10."); // Comando }

2.3.

ANINHAMENTO DE SELEES

A estrutura de Seleo permite o aninhamento, ou seja, o comando a ser executado dentro de uma seleo (por exemplo, no "Seno") pode ser outra seleo. Outro aninhamento poder ocorrer tambm com esta ltima seleo e assim por diante. Nos casos de vrios aninhamentos subsequentes, uma boa identao ser fundamental para o entendimento do algoritmo quando utilizando pseudo-cdigo. PORTUGOL Incio Se CONDIO_A Ento {V} comando1; Seno {F} Se CONDIO_B Ento comando2; Seno comando3; Fim Se; Fim se; Fim. 18

C if (num <= 10) { if (num == 10) printf ("O numero e igual a 10."); else printf (O numero e menor que 10); } else if (num <= 20) { printf ("O numero e maior que 10 e menor que 20."); }

3. ESTRUTURAS DE REPETIO - LAOS(LOOPS) 3.1. LAO ENQUANTO(WHILE)


A estrutura de repetio (enquanto) utilizada quando um conjunto de comandos deve ser executado repetidamente, enquanto uma determinada condio (expresso lgica) permanecer verdadeira. Dependendo do resultado do teste da condio, o conjunto de comandos poder no ser executado nem uma vez (se for falsa no primeiro teste), ou ser executado vrias vezes (enquanto for verdadeira). Chama-se a isso um lao ("loop"). Da mesma forma que a estrutura de seleo, ela permite o aninhamento de rep eties, ou seja, a existncia de uma estrutura de repetio dentro de outra. Podero haver tambm aninhamentos de selees dentro de estruturas repetitivas e vice-versa. Dois cuidados ao criar estruturas de repetio (enquanto): 1. Inicializar a(s) varivel(eis) que controla(m) o lao antes do incio do lao; 2. Inicializar a(s) varivel(eis) que controla(m) o lao dentro do lao (seja por leitura ou por atribuio), pois se isto no for feito cairemos no que chamamos um lao infinito e de l o nosso programa no sair. PORTUGOL Incio Inteiro x; x = 2; Enquanto (x<10) Faa Imprima (x); x=x+1; Fim Enquanto; Imprima(x); Fim. C #include <stdio.h> main () { int X; X = 2; while (X < 10) { printf (%d, &X); X = X + 1; } printf (%d, &X); } Exerccio: faa um trecho de algoritmo para ler e imprimir o nome e a idade de vrias pessoas, at encontrar algum com 65 anos, quando dever ser impresso, alm do nome, uma mensagem informando o fato.

3.2. CONTROLADOS POR CONTADOR


Uma varivel fornecida com o n. de vezes que ser repetido o lao. Algoritmo Abono_por_Contador Incio Leia (Numero_de_Funcionrios); Contador = 0; 19

Enquanto (Contador < Nmero_de_Funcionrios) Faa Leia (Nome); Contador = Contador+1; Fim Enquanto; Fim.

3.7. REPETIO COM TESTE NO FINAL


Quando se deseja executar a srie de comandos uma vez pelo menos, pode se fazer o teste no final. Essa variao tem um uso bastante efetivo na validao de dados de entra da, pelo teclado, mas pode ser sempre substituda por um enquanto. Uma vantagem do repita que no preciso inicializar a(s) varivel(eis) de controle do lao antes de entrar no mesmo. Deve-se, contudo, ter o cuidado de modific-la(s) dentro do lao para que no caiamos em um lao infinito. Executa uma instruo e faz um teste lgico. Dependendo da resposta, fica repetindo o processo enquanto o teste lgico for Verdadeiro. PORTUGOL repita c1; c2; . . cn; enquanto<condio>; C do { c1; c2; . . cn; } while (condio); Os comandos c1, c2,....,cn so executados pelo menos uma vez. Quando a condio encontrada, ela testada, se for falsa o comando seguinte ser executado, se for verdadeira, os comandos c1, c2,...,cn so reexecutados enquanto a condio for verdadeira. O comando repita-enquanto equivalente ao comando enquanto, conforme ser mostrado no exemplo abaixo. - Repita enquanto (do while) Incio Inteiro x; x = 2; Repita Imprima(x); x = x+1; Enquanto (x<=10); Imprima(x); Fim. - Enquanto (while) Incio Inteiro: x; x 2; Enquanto x<10 faa Imprima (x); x x+1; Fim Enquanto; Imprima (x); Fim.

20

Numa estrutura Enquanto, os comandos so executados 0 ou mais vezes. Numa estrutura Repita, os comandos so executados pelo menos uma vez.

3.8. ESCAPE DO LAO Abandone (break)


Comando Abandone: Fora uma sada de um lao de repetio. PORTUGOL abandone C break Exemplo: Enquanto (a>b) faa Leia(a,b); Imprima(a,b); Se b==0 Ento abandone; Seno a=a/b; Fim Enquanto; O comando abandone s tem sentido dentro de um comando de repetio (enquanto, repita, para). Alm disso, estar sempre associado ao teste de uma condio com comando se. Significado do comando abandone : quando o abandone encontrado, o prximo comando a ser executado o primeiro comando logo aps o fim do comando de repetio mais interno onde aparece o abandone.

3.9. Sinalizador ('Flags')


O sinalizador ou 'flag' um valor que, quando lido, sinaliza a sada de um lao, o fim de um programa, o fim de uma lista de dados, ou o fim de um arquivo. Para identific-lo iremos defini-lo como uma constante nos nossos algoritmos. Exemplo: faa um trecho de algoritmo utilizando o PORTUGOL que leia e imprima uma lista de nmeros inteiros terminada pelo nmero 999. Inicio Constante FLAG = 999; Inteiro NUM; Leia (NUM) Enquanto (NUM <> FLAG) faa Imprima (NUM); Leia (NUM); Fim Enquanto; Fim.

4. EXERCCIOS INTRODUTRIOS II
1) Quais valores sero impressos aps a execuo do seguinte trecho de algoritmo I=0; Enquanto I<20 Faa Imprima (I,I**2); I=I+1; Fim Enquanto; Imprima (I=,I); Imprima (UFA! CHEGUEI AQUI); /*CUIDADO*/ 2) Dado o algoritmo abaixo, que calcula o volume de uma esfera de raio R: Incio Real VOLUME, PI, R; 21

Constante PI = 3,1416; R=0; Enquanto R<= 6 Faa VOLUME=4/3*PI*(R**3); Imprima (R,VOLUME); R=R+2; Fim Enquanto; Fim. Completar os demais valores que sero impressos: R VOLUME DA ESFERA

10) Identifique o tipo de cada uma das constantes abaixo: a) 21 d) 0,21*10 b) "BOLA" e) falso c) "VERDADEIRO"

5. REGRAS PRTICAS PARA A CONSTRUO DE ALGORITMOS LEGVEIS


1- Procure incorporar comentrios no algoritmo, pelo menos para descrever o significado das variveis utilizadas. Exemplo: /* Clculo da mdia */ 2- Escolha nomes de variveis que sejam significativos, isto , que traduzam o tipo de informao a ser armazenada na varivel. Exemplo: NOTA MATRCULA 3- Procure alinhar os comandos de acordo com o nvel a que pertenam, isto , destaque a estrutura na qual esto contidos. Exemplo: B=A*C; Enquanto P==1 Faa P=P+1; F=X+NOTA/2; Fim Enquanto; Imprima (F,NOTA); 4- Tenha em mente que seus algoritmos devero ser lidos e entendidos por outras pessoas (e por voc mesmo) de tal forma que possam ser corrigidos, receber manuteno e serem modificados. 5- Escreva comentrios no momento em que estiver escrevendo o algoritmo. Um algoritmo no documentado um dos piores erros que um programador pode cometer. 6- Use comentrios no incio para explicar o que o algoritmo faz. Alguns comentrios seriam; - Uma descrio do que faz o algoritmo - Como utiliz-lo - Explicao do significado das variveis mais importantes - Estrutura de dados utilizada - Os nomes de quaisquer mtodos especiais utilizados - Autor - Data da escrita 7- Utilize espaos em branco para melhorar a legibilidade. Espaos em branco, inclusive linhas em branco so valiosssimos para melhorar a aparncia de um algoritmo. 8- Escolha nomes representativos para suas variveis. 9- Um comando por linha suficiente - O algoritmo fica mais legvel - O algoritmo fica mais fcil de ser depurado. 22

Exemplo: A=14,2;I=1;enquanto I<10 faa X=X+1;K=I*K;I=I+1; fim enquanto O mesmo exemplo com cada comando em uma linha A=14,2; I=1; Enquanto I<10 Faa X=X+1; K=I*K; I=I+1; Fim Enquanto; 10- Utilize parnteses para aumentar a legibilidade e prevenir-se contra erros. Com poucos parnteses A*B*C/(C*D*E) A**B**C A+B<C Com parnteses extras (A*B*C)/(C*D*E) (A**B)**C (A+B)<C

11- Toda vez que uma modificao for feita no algoritmo, os comentrios devem ser alterados.

6. UMA REFLEXO ANTES DE RESOLVER OS PROBLEMAS


Passo1 - Leia cuidadosamente a especificao do problema at o final. Passo 2 - Caso no tenha entendido o problema, pergunte. Passo 3- Levantar e analisar todas as sadas exigidas na especificao do problema (impresses). Passo 4- Levantar e analisar todas as entradas citadas na especificao do problema (leituras). Passo 5- Verificar se necessrio gerar valores internamente ao algoritmo e levantar as variveis necessrias e os valores iniciais de cada uma. Passo 6- Levantar e analisar todas as transformaes necessrias, dadas as entradas e valores gerados internamente, para produzir as sadas especificadas. Passo 7- Testar cada passo do algoritmo. Passo 8 - Avaliao geral, elaborando o algoritmo e revendo comentrios.

7. EXERCCIOS COMPLEMENTARES - I
1. Faa um algoritmo que leia quatro idades e calcule a mdia das mesmas. 2. Altere o algoritmo de media de idade para ler tambm os nomes e ao final mostrar a mensage com os trs m nomes mais a mdia de suas idades. 3. Faa um algoritmo que faa a soma dos nmeros inteiros de 1 a 18. 4. Faa um programa que leia 4 nmeros inteiros e apresente: Mdia dos mpares Maior nmero par Diferena do maior menos o menor nmero 5. Faa um programa que leia o nome e a idade de 3 pessoas e apresente: Maior idade Nome da pessoa mais nova Mdia das idades 7. Faa um programa que leia a medida do lado de um quadrado e calcule e apresente a rea e o permetro desta figura. Obs: Permetro a soma de todos os lados de uma figura geomtrica. 8. Faa um programa que leia o raio de uma circunferncia e calcule e apresente sua a rea e permetro. 23

9. Faa um programa que leia o valor dos lados de um tringulo retngulo e calcule e apresente a sua rea. rea = (base*altura)/2

24

ALGORTMOS BASEADOS DADOS HOMOGNEAS:


1. VETORES E MATRIZES

EM

ESTRUTURAS

DE

Antes de tratarmos das estruturas de dados homogneas, vejamos algumas novas estruturas de controle, que faremos uso quando trabalharmos com vetores e matrizes.

2. REPETIO COM VARIVEL DE CONTROLE PARA (for)


Repete uma instruo um pr-determinado nmero de vezes. para v de i at fpasso p faa onde: v: varivel de controle. i: valor inicial de v. f: valor final de v. p: valor do incremento de v. Sintaxe do comando: PORTUGOL Para v de i at f passo p Faa C1; C2; . . Cn; Fim Para; C for (v = 0; v < 100;v++) /* v = 0; enquanto v for menor que 100 faa; v incremento + 1*/ { printf (%d, &v) } Significado do comando: v, i, f, p so variveis quaisquer e que, de acordo com as regras da programao estruturada, no devem ser modificadas nos comandos C1, C2, . . ., Cn. O comando para , na verdade, o comando enquanto utilizando-se uma varivel de controle, escrito numa notao compactada. Neste caso existir sempre uma inicializao da varivel de controle, um teste para verificar se a varivel atingiu o limite e um acrscimo na varivel. Exemplo para comparao entre Enquanto e Para Incio Inteiro X; X = 1 /*inicializao*/ Enquanto (X <=10) Faa /*teste*/ Leia(v[X]); X = X +1; /*acrscimo*/ Fim Enquanto; Fim. Equivale a: Incio Inteiro X; Para X de 1 at 10 Passo 1 Faa Leia(v[X]); Fim Para Fim. 25

Nota: 1) Assim como no comando enquanto, se o valor inicial (i) j for superior ao limite ( ), os comandos C1, f C2,...,Cn no sero executados. 2) Toda vez que o fim para encontrado, a varivel de controle (i) incrementada pelo passo p e o teste (v<=l) feito. 3) O valor da varivel de controle torna-se indefinido assim que executado o comando para. Neste aspecto o comando para diferente do comando enquanto. Por exemplo, com o trecho de algoritmo seguinte: Para X de 1 at 10 Passo 1 Faa Imprima (X); Fim Para; Imprima (X); sero impressos dentro do comando para: 1,2,3,4,5,6,7,8,9,10 e fora do comando para ser impresso o valor 11. Quando o passo (p) for igual a 1, no ser necessrio escrever esta especificao no comando. No exemplo acima teramos: Para X de 1 at 10 Faa Imprima (X); Fim Para;

3. SELEO DENTRE AS MLTIPLAS ALTERNATIVAS -CASO (CASE)


Em nossos algoritmos, quando uma varivel ou expresso aritmtica puder assumir vriosvalores diferent s, e e a execuo do programa for diferente dependendo do valor obtido ouassumido por esta varivel ou expresso, poderemos utilizar a estrutura que se segue, ao invsde vrios "Se" aninhados. PORTUGOL Incio Conforme Caso IDENTIFICADOR = Valor_1 comando1; Caso IDENTIFICADOR = valor_2 comando2; Caso IDENTIFICADOR = valor_3 comando3; Seno comandoN; Fim Conforme; Fim. C #include <stdio.h> main () { char Ch; do { printf ("\n\nEscolha um:\n\n"); // \n Nova linha printf ("\t(1)...Mamao\n"); // \t Tabulao horizontal ("tab") printf ("\t(2)...Abacaxi\n"); printf ("\t(3)...Laranja\n\n"); fflush(NULL); scanf("%c",&Ch); } while ((Ch!='1')&&|(Ch!='2')&&(Ch!='3')); switch (Ch) // Conforme { case '1': // Caso 26

printf ("\t\tVoce escolheu Mamao.\n"); break; case '2': printf ("\t\tVoce escolheu Abacaxi.\n"); break; case '3': printf ("\t\tVoce escolheu Laranja.\n"); break; } } 1. Aps obter-se um valor verdadeiro para um dos casos, cessam os testes dos casos e o prximo comando a ser executado o que vem a seguir do Fim Conforme. Esta estrutura tambm pode ser utilizada testando-se as condies ao invs de valores, paradeterminar qual o comando a ser executado aps o teste de cada condio (Ver exemplo b). Emprogramao, uma aplicao sempre interessante desta estrutura no tratamento de Menus deOpes, quando para cada seleo feita pelo usurio do programa, haver uma sequncia deaes diferentes a ser executada. Outra aplicao na impresso de diferentes mensagens deerro. Exemplos: a) Incio /*trecho de algoritmo para tratamento de trs possveis erros conhecidos na execuo de um programa*/ Conforme Caso ERRO = 1 Imprima (MSG1); Caso ERRO = 2 Imprima (MSG2); Caso ERRO = 3 Imprima (MSG3); Seno Imprima (ERRO NO CONHECIDO); Fim Conforme; Fim. b) Incio /* trecho de algoritmo para impresso da situao de um aluno a partir da MDIA obtida ao fim do curso */ Conforme Caso MDIA > 7.0 Imprima (APROVADO COM DIPLOMA); Caso MDIA > = 5.0 Imprima (APROVADO COM CERTIFICADO); Seno Imprima (REPROVADO); Fim Conforme; Fim.

4. VETORES
Um vetor ou agregado homogneo, ou ainda varivel composta homognea, uma estrutura de dados que contm elementos de mesmo tipo, que podem ser referenciados como um todo. Ao declararmos um vetor, estamos reservando na memria principal do computador uma srie de clulas para uso da varivel daquele tipo. O nome do vetor aponta para a base das clulas e o seu incio d a posio relativa do elemento referenciado ao primeiro (base). Nem sempre os tipos bsicos (inteiro, real, caractere e lgico) so suficientes para exprimir estruturas de dados em algoritmos. Por exemplo consideremos um problema em que umprofessor com 5 alunos deseja imprimir a nota e a mdia de seus alunos. Nesse caso serianecessrio se considerar cinco variveis reais para contar as notas dos cinco alunos. Imagine queo nmero de alunos da turma seja 80. S a declarao destas variveistornaria impraticvel aredao do algoritmo. Da a necessidade de novos tipos serem criados. Um destes tipos, o vetor,ser estudado.

27

Os vetores podem ser unidimensionais ou multidimensionais (matrizes). Um vetorunidimensional, como uma lista de notas dos 50 alunos de uma turma, tem apenas um ndice. Seexistirem porm vrias turmas poderemos utilizar um vetor com dois ndices (o nmero da turma eo nmero do aluno da turma). Abordaremos este assunto ainda neste captulo.

4.1.

DECLARAO DE VETORES

tipo_da_varivel nome_da_varivel [Pi:Pf]; Pi - Posio Inicial do Vetor Pf - Posio Final do Vetor Quando o C v uma declarao como esta ele reserva um espao na memriasuficientemente grande para armazenar o nmero de clulas especificadas em tamanho. Porexemplo, se declararmos: float exemplo [20]; o C ir reservar 4x20=80 bytes. Estes bytes so reservados de maneira contgua. Nalinguagem C a numerao comea sempre em zero. Isto significa que, no exemplo acima, osdados sero indexados de 0 a 19. Para acess-los vamos escrever: exemplo[0] exemplo[1] . . exemplo[19] Mas ningum o impede de escrever: exemplo[30] exemplo[103] Por qu? Porque o C no verifica se o ndice que voc usou est dentro dos limites vlidos.Este um cuidado que vocdeve tomar. Se o programador no tiver ateno com os limites devalidade para os ndices ele corre o risco de ter variveis sobrescritas ou de ver o computadortravar. Bugs terrveis podem surgir. Vamos ver agora um exemplo de utilizao de vetores: Exemplo: Real Notas[1:80]; O nmero de elementos de um vetor dado por: Pf-Pi+1 Isto significa que as posies do vetor so identificadas a partir de Pi, com incrementos unitrios, at Pf: Pi Pi + 1 ----------Pf

Cada elemento de um vetor tratado como se fosse uma varivel simples. Para referncia a umelemento do vetor, utiliza-se o nome do vetor e a identificao do elemento (ndice) entrecolchetes. Por exemplo, se desejarmos atribuir o valor FMI ao elemento identificado pelo ndice6 do vetor anterior, teremos: NOME[4] FMI que produzir 2 3 FMI 4 5

Ex.: Algoritmo para ler as notas de 3 alunos e imprimir os nomes daqueles cujas notas foremmaior que a mdia. Algoritmo Notas {Sem Vetor} Incio Caracter Nome1, Nome2, Nome3; Real Nota1, Nota2, Nota3; Leia(Nome1, Nota1); Leia (Nome2, Nota2); Leia (Nome3, Nota3); Mdia = (Nota1+Nota2+Nota3)/3.0 ; Se Nota1 > Mdia Ento Imprima (Nome1); Fim Se; Se Nota2 > Mdia Ento Imprima (Nome2); Fim Se; Se Nota3 > Mdia Ento Imprima (Nome3); Algoritmo Notas {Com Vetor} Incio Caracter Nome[0:2] Real Nota[0:2]; Real Soma; Para I de 0 at 2 Faa Leia (Nome[I], Nota[I]); Fim Para; /*Clculo da Mdia*/ Soma = 0.0 ; Para I de 0 at 2 Faa Soma = Soma + Nota [I] ; Fim Para; Mdia = Soma/3.0; Para I de 0 at 2 Faa Se Nota[I] > Mdia Ento 28

Fim Se; Fim.

Imprima (Nome[I]); Fim Se; Fim Para; Fim.

1- Para inicializar um vetor com valores diferentes, utilizamos um comando construtor NOTA ={ 5.7, 9.5, 10.0, ..., 7.5}; que equivale a: NOTA [0] = 5.7, NOTA[2] =10.0;....etc. 1) Dado o vetor CRR de caracteres abaixo, CRR

!
0 1

O
2

T
3

R
4

E
5 6

C
7

Qual ser a sua configurao depois de executados os comandos: Para I de 0 at 3 passo 1 Faa AUX =CRR[I]; CRR[I]=CRR[6-I+1]; CRR[6-I+1] =AUX; Fim Para; 2) Dados dois vetores R[9] e S[19], escreva um algoritmo que: Leia os vetores R e S e Gere ovetor X correspondente unio dos vetores R e S. Incio Inteiro R[0:9],S[0:19],X[0:29]; Inteiro I; Leia (R, S); Para I de 0 at 9 Passo 1 Faa X[I] = R[I]; Fim Para Para I de 0 at 19 Passo 1 Faa X[I+10] = S[I]; Fim Para; Imprima (X); Fim. a) Gere o vetor Y com os elementos comuns de R e S Incio inteiro R[0:9], Y[0:9], S[0:19], I, J, K; leia (R,S); Y=0 para I de 0 at 9 faa K = 1; para J de 0 at 19 faa se R[I] == S[J] ento enquanto K<=I faa se Y[K] != R[I] ento se Y[K]==0 ento Y[K] =R[I]; fim se; seno abandone; fim se; K =K+1; fim enquanto; fim se; se Y[K]==R[I] ento abandone; fim se; fim para; fim para; imprima (Y); Fim.

29

3) Um armazm trabalha com 100 mercadorias diferentes identificadas pelos nmeros inteiros de 1 a 100. O dono do armazm anota a quantidade de cada mercadoria vendida durante o ms. Ele tem uma tabela que indica para cada mercadoria o preo de venda. Escreva o algoritmo para calcular o faturamento mensal de armazm, isto :

FATURAMENTO=

A tabela de preo e quantidade so fornecidas em dois conjuntos, sendo que um conjunto contm a quantidade vendida e o outro o preo de cada mercadoria. Soluo Incio /* calcula o faturamento*/ real QUANTIDADE[0:99], PREO[0:99] /*Tabela de Qtdes vendidas e Preo*/ real FATURAMENTO; inteiro I; /* indexador*/ FATURAMENTO = 0; leia (QUANTIDADE, PREO); para I de 0 at 99 faa FATURAMENTO = FATURAMENTO +QUANTIDA DE[I]*PREO[I]; fim para; imprima (FATURAMENTO); Fim.

3.10. EXERCCIOS SOBRE VETORES


1. Faa um algoritmo que leia 18 nmeros inteiros e calcule e imprima a soma dos mesmos. 2. Faa um algoritmo que leia 18 nmeros inteiros e calcule e imprima a mdia dos mesmos 3. Faa um programa que leia 4 nmeros inteiros e apresente: Mdia dos mpares Maior nmero par Diferena do maior menos o menor nmero 4. Faca um programa que leia um contedo com 100 nmeros inteiros e apresente a media dosnmeros. 5. Faca um programa que leia 2 conjuntos com 50 nmeros inteiros e gere um terceiro conjuntocom a media dos elementos de A e B. Apresente o C. 6. Faca um programa que leia um conjunto A com 30 nmeros inteiros e que armazene em umconjunto B do mesmo tipo os elementos de A multiplicados por 3. apresente o conjunto B. 7. Faa um programa que leia um conjunto A com 100 nmeros inteiros e que gere um conjunto Bcom os elemento de A de acordo com a seguinte regra. Se o elemento de A for par, armazene emB multiplicando por 5. Se o elemento de A for impar, armazene em B somando 5. 8. Faa um programa que leia dois conjuntos A e B com 20 inteiros e troque os valores de A comB. 9. Faa um programa que leia dois conjuntos A e B com 15 nmeros inteiros e gere um conjuntode 30 elementos, onde os 15 primeiros elementos so de A e o resto de B. Apresente oconjunto C.

30

5. MATRIZES
Definio: Conjunto de dados referenciados por um mesmo nome e que necessita de mais deum ndice para ter seus elementos individualizados. Quando temos mais de uma dimenso ento utilizamos as matrizes, que de diferente, nouso e na declarao, s tem estas dimenses a mais explcitas: A sintaxe a seguinte: <Tipo bsico> identificador [Pi1:Pf1, Pi2:Ps2,......, Pin:Pfn]; Esta especificao corresponde apenas criao do modelo, e, para efetivar a estrutura dedados dentro do algoritmo, necessria uma declarao dando um nome varivel que segue omodelo. Ex: Real MAT[1:3,1:4]; ou seja, MAT 1 1 2 3 O nmero de dimenses da matriz ser igual ao nmero de vrgulas ( , ) da declaraomais 1. O nmero de elementos igual ao produto do nmero de elementos de cadadimenso: (Pf1-Pi1+1)*(Pf2-Pi2+1)*...*(Pfn-Pin+1) Exerccios 1) Qual o nmero de elementos e dimenses das matrizes especificadas abaixo: a) real MAT1[0:2,1:5]; b) Caracter MAT2[1:3, 2:4, 3:4] Para referenciar um elemento da matriz so necessrios tantos ndices quantas so as dimensesda matriz. Numa matriz bidimensional (duas dimenses) o primeiro ndice indica a linha e osegundo, a coluna. No exemplo anterior, MAT1[1,3] se refere ao elemento da linha nmero 1(segunda linha no caso) e coluna nmero 3 (terceira coluna) MAT1 1 0 1 2 Para matrizes com trs dimenses, repete-se a estrutura bidimensional tantas vezes quantos soos elementos da terceira dimenso, numerando-as de acordo com os limites especificados nadeclarao de tipo. Exemplo1:O que ser impresso no algoritmo abaixo: Incio inteiro M1[1:3,1:2]; inteiro: I, J; M1[1,1] = 1; M1[1,2] = 2; M1[2,1] = 3; M1[2,2] = 4; M1[3,1] = 5; M1[3,2] = 6; Imprima(M1); 31 2 3 4 5 2 3 4

Para I de 1 at 2 Faa Para J de 1 at 3 Faa Imprima (M1[J,I]); Fim Para; Fim Para; Fim. Exemplo 2: Dada a matriz MAT abaixo 1 1 2 3 O E A 2 Q A * 3 * E * 4 I S S

Qual ser a configurao de MAT depois de executado o algoritmo: Incio Inteiro I, J; Caracter AUX; Caracter M1[1:4,1:4]; Leia (MAT); Para I de 1 at 4 Passo 1 Faa Para J de I+1 at 4 Passo 1 Faa AUX = MAT[I,J]; MAT[I,J] = MAT[J,I]; MAT[J,I] = AUX; Fim Para; Fim Para; AUX=MAT[1,1]; MAT[1,1]=MAT[4,4]; MAT[4,4]= AUX; AUX = MAT[2,2]; MAT[2,2] = MAT[3,3]; MAT[3,3] = AUX Fim. Notas: 1- Para percorrer a matriz linha por linha: Fixar a linha Variar a coluna Inteiro exemplo[1:3,0:4]; I =1; Enquanto I<=3 Faa J=0; Enquanto J<= 4 Faa exemplo[I,J] =I+J; J=J+1; Fim Enquanto; I=I+1; Fim Enquanto; 2- Para percorrer a matriz coluna por coluna Fixar a coluna Variar a linha Inteiro exemplo[1:3,0:4]; J =0; Enquanto J<=4 Faa I=1; 32

Enquanto I<= 3 Faa exemplo[I,J] =I+J; I=I+1; Fim Enquanto; J=J+1; Fim Enquanto; ou ento: Para j de 0 at 4 Passo 1 Faa Para I de 1 at 3 Passo 1 Faa exemplo[I,J] I+J; Fim Para; Fim Para; Como no caso de vetores, tambm para matrizes podemos ter comandos concisosparainicializao, leitura e impresso. Por exemplo, seja MAT definida por: Inteiro MAT[1:10,1:8]; O comando: Leia (MAT); equivalente ao seguinte trecho: Para i de 1 at 10 Passo 1 Faa Para j de 1 at 8 Passo 1 Faa leia (MAT[I,J]; Fim Para; Fim Para; Do mesmo modo, pode-se inicializar uma matriz com todos os seus elementos iguais a umdeterminado valor escrevendo MAT =0;

5.1.

Exerccios Resolvidos

1) Dada uma matriz MAT de 4 x 5 elementos, faa um algoritmo para somar os elementos de cadalinha gerando o vetor SOMALINHA. Em seguida, somar os elementos do vetor SOMALINHA navarivel TOTAL que deve ser impressa no final: Exemplo

1 1 8 1

2 3 5 -2

-1 4 1 3

2 2 3 4

3 0 2 5

7 10 19 11

TOTAL 47
Soluo: Incio Real MAT[1:4, 1:5]; Real SOMALINHA[1:4]; Real: TOTAL; Inteiro: I, J; SOMALINHA=0; TOTAL=0; 33

Leia (MAT); Para I de 1 at 4 Faa Para J de 1 at 5 Faa SOMALINHA[I]= SOMALINHA[I]+MAT[I,J]; Fim Para; TOTAL=TOTAL+SOMALINHA[I]; Fim Para; Imprima (TOTAL=, TOTAL); Fim. 2) Escreva um algoritmo que leia duas matrizes reais de dimenso 3 x 5, calcule e imprima asoma das matrizes. Incio Real A[1:3,1:5], B[1:3,1:5], C[1:3,1:5]; Inteiro: I, J; Leia (A,B); I=1; Enquanto I<=3 faa J=1 Enquanto J<=5 faa C[I,J] =A[I,J]+B[I,J]; J=J+1; Fim Enquanto; I=I+1; Fim Enquanto; Imprima ( C= ,C ); Fim. 3) Escreva um algoritmo para um programa que leia uma matriz quadrada 20 x 20 de elementosreais, divida cada elemento de uma linha da matriz pelo elemento da diagonal principal desta linhae imprima a matriz assim modificada. Obs. Elementos da diagonal principal; M[1,1], M[2,2], M[3,3], M[4,4] Incio real M[1:20,1:20]; Inteiro: I, J; Real: DIAGONAL; Leia (M); Para I de 1 at 20 Faa DIAGONAL =M[I,I]; Para J de 1 at 20 Faa M[I,J] =M[I,J]/DIAGONAL; Fim Para; Fim Para; Imprima (M=,M); Fim.

34

MODULARIZAO DE ALGORITMOS
1. INTRODUO
Vimos que os algoritmos estruturados so desenvolvidos levando-se em conta algumaspremissas bsicas: 1) Desenvolver o algoritmo em diferentes fases de detalhamento crescente, do geral ao particular,por refinamentos sucessivos (desenvolvimento "top-down" ou de cima para baixo). 2) Decompor o algoritmo em mdulos funcionais, organizados de preferncia em um sistemahierrquico. Esses mdulos trazem vantagens adicionais para testes, pois testa-se um mdulo (ouseja, uma parte do programa) de cada vez, independentemente; e para reutilizao de um mduloem outros algoritmos e programas, no futuro. Passaremos agora a formalizar a utilizao de mdulos nos nossos algoritmos e verificar asvantagensque os mesmos trazem para entendimento, construo, codificao, teste e reutilizaodos mesmos. A grande maioria das linguagens de programao que so utilizadas, tem estafacilidade, seja com o nome de Sub -rotinas, Subprogramas, Procedimentos, Funes, Mdulos,Blocos, etc., sempre possvel subdividir-se um programa de modo a facilitar o entendimento,permitir a reutilizao, evitando-se a repetio de blocos dos programas. No nosso pseudo cdigodefiniremos dois tipos de mdulos: Os procedimentos ("procedures") e as funes ("functions"). Os procedimentos e funes so normalmente definidos antes de seremutilizados(chamados) pelo programa principal. Em se tratando de algoritmos, entretanto,poderemos definir nossos procedimentos e funes em qualquer parte do algoritmo principal oudepois dele, adotando os formatos que se seguem e as normas de documentao.

2. PROCEDIMENTOS
Um procedimento uma seqncia de comandos precedida por uma seq uncia dedeclaraes que possui um identificador (nome do procedimento), uma lista de parmetrosopcional e pode realizar qualquer tipo de processamento que o programador ou analista deseje.As variveis, os tipos e as constantes declaradas dentro de um procedimento s so acessveisdentro dos comandos do procedimento. So chamadasvariveis locais. Em um Algoritmo, asvariveis, tipos e constantes declaradas logo aps o identificador do algoritmo, so acessveis evisveis dentro de qualquer procedimento que esteja sendo usado pelo algoritmo. So chamadasvariveis Globais. uma boa tcnica ao se construir um procedimento, no fazer uso no mesmo,de variveis globais e referenciar e utilizar apenas as variveis locais e os parmetros doprocedimento. Isso far com que cada procedimento, ao ser modificado, no afete outras partesdo Algoritmo, e da mesma forma as variveis globais podero ser modificadas sem que hajaefeitos colaterais nos procedimentos. Sintaxe de declarao Procedimento < nome do Procedimento> Incio <declaraes>; C1; C2; . Cn; Fim { nome do procedimento}. Exemplo: O que ser impresso no algoritmo abaixo? Incio Inteiro: X,Y,A,B,C,D; Procedimento troca Incio Inteiro: AUX,X AUX X X Y Y AUX Fim troca. A 5; B 3;

b
35

Imprima(A, B); X A; Y B; Troca; A X; B Y; Imprima(A, B); C 4; D 9; Imprima(C, D); X C; Y D; Troca; C X; D Y; Imprima(C, D); Fim. Os mdulos que estivemos utilizando na apostila, nos captulos anteriores, so procedimentossem parmetros, ou seja, que fazem uso de variveis globais e sua nica importante vantagem facilitar o entendimento e a soluo do algoritmo. Utilizando parmetros e no variveis globais dentro do procedimento, podemos, por assimdizer, isol do -lo meio exterior e obter vantagens adicionais na codificao, pois, uma vez queforam bem definidos os parmetros, um programador poder desenvolver seu procedimento semse preocupar com o algoritmo que o vai chamar. Poderemos tambm test-lo individualmente eisoladamente para verificar sua correo. Isto ser comprovado na disciplina LP. A isto sedenomina Encapsulamento. Uma lista de parmetros consiste em uma lista de variveis e seusrespectivos tipos. Procedimento < nome do Procedimento> (<lista de parmetros>) < especificao de parmetros> Incio <declarao de variveis locais> C1; C2; . . Cn; Fim. { nome do procedimento} Exemplo de Procedimento: Procedimento TROCAINTEIROS (Inteiro NUM1,inteiro NUM2) Incio Inteiro AUXNUM; AUXNUM = NUM1; NUM1 = NUM2; NUM2 = AUXNUM; Fim.

3. FUNES
Funes so as estruturas que permitem ao usurio separar seus programas em blocos. Seno as tivssemos, os programas teriam que ser curtos e de pequena complexidade. Parafazermos programas grandes e complexos temos de constru-los bloco a bloco. Uma funo um mdulo que tem por objetivo calcular e retornar ao algoritmo,procedimento ou funo "chamador" um valor. A chamada de uma funo para execuo feitaapenas citando o seu identificador no meio -se de uma expresso. Vide as funes previamenteexistentes no nosso pseudo -cdigo. Uma funo dita recursiva quando chama a ela prpria. Uma funo no C tem a seguinte forma geral: tipo_de_retorno nome_da_funo (declarao_de_parmetros) Incio 36

corpo_da_funo Fim. Em PORTUGOL utilizaremos a seguinte forma PORTUGOL Tipo-de-retorno<nome da funo>(<declarao dos parmetros>) Incio Corpo da Funo Fim. Onde: A lista de parmetros semelhante dos procedimentos Antes do nome da funo d o tipo do valor que a funo retorna ao algoritmo ouprocedimento chamador. O tipo-de-retorno o tipo de varivel que a funo vai retornar. O default o tipo inteiro(int), ou seja, uma funo para qual no declaramos o tipo de retorno considerada comoretornando um inteiro. A declarao de parmetros uma lista com a seguinte forma geral: tipo nome1, tipo nome2, ... , tipo nomeN Repare que o tipo deve ser especificado para cada uma das N variveis de entrada. nadeclarao de parmetros que informamos ao compilador quais sero as entradas da funo(assim como informamos a sada no tipo-de-retorno). O corpo da funo a sua alma. nele que as entradas so processad sadas sogeradas ou outras as, coisas so feitas. O Comando retorna (return) O comando return tem a seguinte forma geral: retorna valor_de_retorno; ou retorna; Digamos que uma funo est sendo executada. Quando se chega a uma declarao retorna (return) a funo encerrada imediatamente e, se o valor de retorno informado, afuno retorna este valor. importante lembrar que o valor de retorno fornecido tem que sercompatvel com o tipo de retorno declarado para a funo. Uma funo pode ter mais de uma declarao retorna (return). Isto se torna claro quandopensamos que a funo terminada quando o programa chega primeira declarao retorna( return). Abaixo esto dois exemplos de uso do retorna (return): Exemplo de funo: Inteiro VALORABSOLUTO (inteiro X) Incio Se X > = 0 Ento VALORABSOLUTO =X; Seno VALORABSOLUTO = (-X); Fim Se; Fim. Exerccio para casa: Escrever e executar em C o programinha acima - Algoritmo para calcular o quadrado de um nmero PORTUGOL Inteiro Square(inteiro a) Incio retorna (a*a); Fim. Algoritmo Principal Incio inteiro num; imprima ("Entre com um numero: "); 37

leia (num); num=Square(num); imprima ("O seu quadrado vale:", num); Fim. Em C #include <stdio.h> int Square (int a){ return (a*a); } int main (){ int num; printf ("Entre com um numero: "); scanf ("%d",&num); num=Square(num); printf ("\n\nO seu quadrado vale: %d\n",num); return 0; } - Algoritmo para verificar se um nmero a divisvel por 2. PORTUGOL inteiro EPar (inteiro a) incio se (a%2) ento /* Verifica se a e divisivel por dois */ return 0; /* Retorna 0 se nao for divisvel, a%1=1 */ seno return 1; /* Retorna 1 se for divisivel , a%0=0*/ fim se; fim. Algoritmo Principal Incio inteiro num; imprima ("Entre com numero: "); leia (num); se (EPar(num)) ento imprima ("O numero e par."); seno imprima ("O numero e impar."); fim se; Fim. Em C #include <stdio.h> int EPar (int a){ if (a%2) /* Verifica se a e divisivel por dois */ return 0; /* Retorna 0 se nao for divisivel */ else return 1; /* Retorna 1 se for divisivel */ } int main (){ int num; printf ("Entre com numero: "); scanf ("%d",&num); if (EPar(num)) printf ("\n\nO numero e par.\n"); else printf ("\n\nO numero e impar.\n"); return 0; } importante notar que, como as funes retornam valores, podemos aproveit-los parafazer atribuies, ou mesmo para que estes valores participem de expresses. Mas no podemosfazer: 38

func(a,b)=x; /* Errado! */

4. Prottipos de Funes
At agora, nos exemplos apresentados, escrevemos as funes antes de escrevermos afuno principal, main(). Isto , as funes esto fisicamente antes da funo principal main(). Isto foi feito por uma razo. Imagine-se na pele do compilador. Se voc fosse compilar a funomain(), onde so chamadas as funes, voc teria que saber com antecedncia quais so ostipos de retorno e quais so os parmetros das funes para que voc pudesse gerar o cdigocorretamente. Foi por isto que as funes foram colocadas antes da funo main(): quando ocompilador chegasse funo main() ele j teria compilado as funes e j saberia seusformatos. Mas, muitas vezes, no poderemos nos dar ao luxo de escrever nesta ordem. Muitasvezes teremos o nosso programa espalhado por vrios arquivos. Ou seja, estaremos chamandofune em s um arquivo que sero compiladas em outro arquivo. Como manter a coerncia? Asoluo so os prottipos de funes. Prottipos so nada mais, nada menos, que declaraes defunes. Isto , voc declara uma funo que ir usar. O compilador toma ento conhecimento doformato daquela funo antes de compil-la. O cdigo correto ser ento gerado. Um prottipotem o seguinte formato: tipo_de_retorno nome_da_funo (declarao_de_parmetros); onde o tipo-de-retorno, o nome-da-funo e a declarao-de-parmetros so os mesmosque voc pretende usar quando realmente escrever a funo. Repare que os prottipos tm umantida semelhana com as declaraes de variveis. Vamos implementar agora um dos exemplosda seo anterior com algumas altera es e com prottipos: PORTUGOL inteiro Square (inteiro a); Algoritmo Principal incio inteiro num; imprima ("Entre com um numero: "); leia (num); num=Square(num); imprima ("O seu quadrado vale:", num); retorna (0); fim. inteiro Square (inteiro a) incio retorna (a*a); fim. C #include <stdio.h> int Square (int a); int main (){ int num; printf ("Entre com um numero: "); scanf ("%f",&num); num=Square(num); printf ("\n\nO seu quadrado vale: %f\n",num); return 0; } int Square (int a){ return (a*a); } 39

Observe que a funo Square() est colocada depois do algoritmo principal, mas o seuprottipo est antes. Sem isto este programa no funcionaria corretamente. Usando prottipos voc pode construir funes que retornam quaisquer tipos de variveis bom ressaltar . que funes podem tambm retornar ponteiros sem qualquer problema. Osprottipos no s ajudam o compilador. Eles ajudam a voc tambm: usando prottipos, ocompilador evita erros, no deixando que o programador use funes com os parmetros erradose com o tipo de retorno errado, o que uma grande ajuda!

5. Escopo de Variveis
O escopo o conjunto de regras que determinam o uso e a validade de variveis nasdiversas partes do programa.

5.1.

Variveis locais

O primeiro tipo de variveis que veremos so as variveis locais. Estas so aquelas que stm validade dentro do bloco no qual so declaradas. Podemos declarar variveis dentro dequalquer bloco. S para lembrar: um bloco comea quando abrimos uma chave e termina quandofechamos a chave. At agoras tnhamos visto variveis locais para funes completas. Mas umcomando para(for) pode ter variveis locais e que no sero conhecidas fora dali. A declaraode variveis locais a primeira coisa que devemos colocar num bloco. A caracterstica que tornaas variveis locais to importantes justamente a de serem exclusivas do bloco. Podemos terquantos blocos quisermos com uma varivel local chamada x, por exemplo, e elas noapresentaro conflito entre elas. A palavra reservada do C auto serve para dizer que uma varivel local. Mas noprecisaremos us-la pois as variveis declaradas dentro de um bloco j so consideradas locais. Abaixo vemos um exemplo de variveis locais: PORTUGOL funcao1 (...) Incio inteiro abc,x; ... Fim. funcaq (...) Incio inteiro abc; ... Fim. inteiro principal () Incio inteiro a,x,y; para (...) { real a,b,c; ... } ... Fim. C func1 (...) { int abc,x; ... } func (...) { int abc; 40

... } int main () { int a,x,y; for (...) { float a,b,c; ... } ... } No programa acima temos trs funes. As variveis locais de cada uma delas no irointerferir com as variveis locais de outras funes. Assim, a varivel abc de func1() no temnada a ver (e pode ser tratada independentemente) com a varivel abc de func2(). A varivel x defunc1() tambm completamente independente da varivel x da funo principal main(). Asvariveis a, b e c so locais ao bloco para(for). Isto quer dizer que s so conhecidas dentrodeste bloco e so desconhecidas no resto da funo Principal main()). Quando usarmos avarivel ( a dentro do bloco para (for) estaremos usando a varivel a local ao para(for) e no avarivel a da funo main().

3.11. Parmetros formais


O segundo tipo de varivel que veremos so os parmetros formais. Estes so declaradoscomo sendo as entradas de uma funo. No h motivo para se preocupar com o escopo deles. fcil: o parmetro formal uma varivel local da funo. Voc pode tambm alterar o valor de umparmetro formal, pois esta alterao no ter efeito na varivel que foi passada funo. Istotem sentido, pois quando o C passa parmetros para uma funo, so passadas apenas cpiasdas variveis. Isto , os parmetros formais existem independentemente das variveis que forampassadas para a funo. Eles tomam apenas uma cpia dos valores pa ssados para a funo.

3.12. Variveis globais


Variveis globais so declaradas, como j sabemos, fora de todas as funes do programa.Elas so conhecidas e podem ser alteradas por todas as funes do programa. Quando umafuno tem uma varivel local com o mesmo nome de uma varivel global a funo darpreferncia varivel local. Vamos ver um exemplo no nosso pseudo-Cdigo: inteiro z,k; func1 (...) { inteiro x,y; ... } func2 (...) { inteiro x,y,z; ... z=10; ... } principal { inteiro count; ... } No exemplo acima as variveis z e k so globais. Veja que func2() tem uma varivel localchamada z. Quando temos ento, em func2(), o comando z=10 quem recebe o valor de 10 avarivel local, no afetando o valor da varivel global z.Evite ao mximo o uso de variveis globais. Elas ocupam memria o tempo todo (as locaiss ocupam memria enquanto esto sendo usadas) e tornam o programa mais difcil de serentendido e menos geral.

41

6. Passagem de parmetros por valor e passagem por referncia


J vimos que, na linguagem C, quando chamamos uma funo os parmetros formais dafuno copiam os valores dos parmetros que so passados para a funo. Isto quer dizer queno so alterados os valores que os parmetros tm fora da funo. Este tipo de chamada defuno denominado chamada por valor. Isto ocorre porque so passados para a funo apenasos valores dos parmetros e no os prprios parmetros. Veja o exemplo abaixo: Exemplo PORTUGOL real sqr (real num); int main () { real num,sq; imprima ("Entre com um numero: "); leia (num); sq=sqr(num); imprima ("O numero original e:",num); imprima ("O seu quadrado vale:",sq); } real sqr (real num) { num=num*num; retorna num; } Em C #include <stdio.h> float sqr (float num); void main () { float num,sq; printf ("Entre com um numero: "); scanf ("%f",&num); sq=sqr(num); printf ("\n\nO numero original e: %f\n",num); printf ("O seu quadrado vale: %f\n",sq); } float sqr (float num) { num=num*num; return num; } No exemplo acima o parmetro formal num da funo sqr() sofre alteraes dentro dafuno, mas a varivel num da funo principal main() permanece inalterada: uma chamada porvalor. Outro tipo de passagem de parmetros para uma funo ocorre quando alteraes nosparmetros formais, dentro da funo, alteram os valores dos parmetros que foram passadospara a funo. Este tipo de chamada de funo tem o nome de "chamada por referncia". Estenome vem do fato de que, neste tipo de chamada, no se passa para a funo os valores dasvariveis, mas sim suas referncias (a funo usa as referncias para alterar os valores dasvariveis fora da funo). O C s faz chamadas por valor. Isto bom quando queremos usar os parmetros formais vontade dentro da funo, sem termos que nos preocupar em estar alterando os valores dosparm etros que foram passados para a funo. Mas isto tambm pode ser ruim s vezes, porquepodemos querer mudar os valores dos parmetros fora da funo tambm. O C++ tem um recursoque permite ao programador fazer chamadas por referncia. H entretanto, no C, um recurso deprogramao que podemos usar para simular uma chamada por referncia. Quando queremosalterar as variveis que so passadas para uma funo, ns podemos declarar seus parmetrosformais como sendo ponteiros. Os ponteiros so a "referncia" que precisamos para poder alterara varivel fora da funo. O 42

nico inconveniente que, quando usarmos a funo, teremos delembrar de colocar um&na frente das variveis que estivermos passando para a funo. Veja umexemplo: #include <stdio.h> void Swap (int *a,int *b); void main (void) { int num1,num2; num1=100; num2=200; Swap (&num1,&num2); printf ("\n\nEles agora valem %d %d\n",num1,num2); } void Swap (int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; } No muito difcil. O que est acontecendo que passamos para a funo Swap oendereo das variveis num1 e num2. Estes endereos so copiados nos ponteiros a e b. Atravsdo operador * estamos acessando o contedo apontado pelos ponteiros e modificando-o. Mas,quem este contedo? Nada mais que os valores armazenados em num1 e num2, que, portanto,esto sendo modificados!

7. FUNES RECURSIVAS
Existem casos em que um procedimento ou funo chama a si prprio. Diz-se ento que oprocedimento ou funo recursivo. Por exemplo, o fatorial de um nmero n pode ser definidorecursivamente, ou seja:  

 

inteiro fat(inteiro n) Incio Se n==0 Ento fat=1; Seno fat=n*fat(n-1); Fim Se; Fim. Por exemplo, o fatorial de 3 ser calculado a partir da chamada funo pelo comando x =fat(3) que retornar em fat o valor 6.

8. ESTRUTURAO DOS MDULOS DE UM ALGORITMO


Um procedimento nada mais que um algoritmo hierarquicamente subordinado a um outroalgoritmo, comumente chamado de Mdulo principal ou programa principal ou ainda algoritmoprincipal. Da mesma forma, um procedimento poder conter outros procedimentos (e tambm funes)aninhados. Assim, ao definirmos as fases do nosso algoritmo, no processo de refinamentossucessivos, se transformarmos as mesmas em procedimentos e os refinamentos decada procedimento em outros procedimentos, obteremos, ao fim do processo de criao, umalgoritmo estruturado, com mdulos hierarquicamente subordinados e muito menos suscetvel aerros de lgica na fase de codificao do programa.

43

ALGORITMOS DE PESQUISA E ORDENAO


1. INTRODUO
Quando temos um Vetor (ou Matriz) com muitos elementos e precisamos descobrir se umdeterminado elemento que procuramos se encontra no vetor, uma soluo que certamente nosvem mente comparar o elemento que procuramos com cada elemento do vetor, at queencontremos ou at que concluamos que o elemento procurado no est no vetor. Esta a base do raciocnio dos algoritmos de pesquisa ou busca ("Search"), que comosugere o nome, "Pesquisam", em um vetor, a existncia ou no existncia de um elementoprocurado. A diferena entre um e outro algoritmo de busca, fica por conta da rapidez com que"varremos" o vetor para encontrar o elemento ou para concluirmos que ele no existe. Um fator que influencia em muito nessa rapidez a disposio dos elementos no vetor. Seesto desordenados, seguramente teremos que verificar do primeiro ao ltimo elemento paraconcluir, com certeza, que o elemento no existe. J se esto ordenados, ao encontrarmos umelemento maior (ou menor) que o elemento procurado, poderemos concluir pela sua noexistncia. Os algoritmos de ordenao ou classificao ("Sort"), por sua vez, so utilizados paraordenar os elementos de um vetor de forma a facilitar a pesquisa posterior de um elemento, noconjunto de elementos existentes. Existem algoritmos para pesquisa e ordenao para as mais variadas estruturas de dados. Nanossa disciplina, entretanto, trataremos apenas os algoritmos de pesquisa e ordenao emvetores, que tambm podem ser utilizados em matrizes, desde que sofram pequenos ajustes.

2. ALGORITMOS DE PESQUISA
Para fazermos qualquer pesquisa em vetor (ou matriz) precisamos de quatro parmetros: a) O vetor no qual realizaremos a pesquisa b) O nmero de elementos desse vetor que devem ser pesquisados. (Lembre que muitasvezes um vetor -se de 1000 elementos, s tem 700 carregados, e podemos evitar tratamento de 300elementos com "lixo"). c) O elemento procurado d) Um ndice que vai ser preenchido com a posio onde o elemento foi encontrado ou retornarcom 0 (zero) caso o elemento no exista. Como os algoritmos de pesquisa podero ser utilizados muitas vezes na soluo de diferentesproblemas, vamos defini-los como Procedimentos de um Algoritmo Principal hipottico, com osseguintes argumentos: Declaraes: Const MAXELEM = 10000 {Nmero mximo de elementos do vetor, apenas para limitar o tamanho dovetor} <Tipo bsico> Nome do vetor[1:MAXELEM] inteiro TOTELEM {Corresponde ao parmetro b) Total de elementos a ser pesquisado} <Tipo bsico> ELEMPROC {Corresponde ao Parmetro c) Elemento procurado} Inteiro POS {Corresponde ao Parmetro d) Posio em VET onde ELEMPROC foi encontrado, ou0 se no o foi}

2.1.

PESQUISA SEQENCIAL SIMPLES

Na pesquisa seqencial simples, como o vetor a ser pesquisado no est ordenado peloelemento procurado, teremos de comparar um a um o ELEMPROC com cada elemento de VET.Portanto para um elemento inexistente teremos de fazer TOTELEM testes e para um elementoexistente faremos, na mdia, TOTELEM/2 testes. Procedimento PESQSEQ (<tipo bsico>VET); Incio Inteiro TOTELEM, POS, J; <Tipo bsico> ELEMPROC; 44

Leia(ELEMPROC); /*Executa a Pesquisa da primeira ocorrncia de ELEMPROC em VET eretorna em POS o ndice onde foi encontrada ou 0 se no existe*/ Enquanto (Pos==0) e (J<=TOTELEM) Faa Se VET[J]==ELEMPROC Ento POS = J; Seno J = J+1; Fim Se; Fim Enquanto; Fim. Se precisamos determinar todas as ocorrncias de um elemento em um vetor, o problema sesimplifica, pois teremos que, obrigatoriamente, varrer o vetor at o fim (Elimina-se do lao o testePOS = =0), mas teremos de guardar em um vetor todas as posies onde o elemento foiencontrado ou, o que mais usual, processaremos a ocorrncia dentro do procedimento (apsPOS = J). O trecho de procedimento abaixo exemplifica: Pesquisa Sequencial com Repetio Trata todas as ocorrncias de um elemento procurado no vetor Incio POS = 0; /*Indicar ao algoritmo chamador a no ocorrncia*/ J = 1; Enquanto J < = TOTELEM Faa Se VET[J] == ELEMPROC Ento POS = J; /*Imprime, Acumula, etc.*/ Fim Se; J = J + 1; Fim Enquanto; Fim.

3.13. PESQUISA SEQENCIAL ORDENADA


Para se utilizar a Pesquisa Seqencial Ordenada, o vetor de busca tem de estar ordenadopelo campo chave da pesquisa. Com isso, ao se encontrar no vetor, um elemento maior do que oelemento procurado, poderemos abandonar a busca pois, com certeza, no mais oencontraremos. Devido a isso o nmero de testes para elementos existentes ou inexistentes ser,na mdia, de TOTELEM/2, e, por isso, melhor que o anterior para o caso de elemento inexistente. Procedimento PESQORD (<tipo bsico> VET, Inteiro TOTELEM, inteiro POS, <Tipo bsico>ELEMPROC); Incio Inteiro J; /*Executa a Pesquisa da primeira ocorrncia de ELEMPROC em VET eretorna em POS o ndice onde foi encontrada ou 0 se no existe. VETtem de estar ordenado pelo campo chave*/ POS = 0; J = 1; Enquanto J<=TOTELEM e POS==0 Faa Se VET[J]>=ELEMPROC Ento Se VET[J] == ELEMPROC Ento POS=J; Seno Imprima(" O elemento no est na lista"); Abandone; Fim Se; Seno J=J+1; Fim Se; Fim Enquanto; Fim.

45

Exerccio resolvido - Dado um vetor A de 128 elementos, verificar se existe um elemento igual a K(chave) no vetor. Se existir, imprimir a posio onde foi encontrada a chave; se no, imprimir chave K no encontrada . O vetor A e chave K so lidos de cartes. incio inteiro A[1:128] inteiro; inteiro I,K; lgico ACHOU; leia (K); leia (A); ACHOU = falso; para I de 1 at 128 passo 1 faa se A[I]==K ento imprima (K, Est na posio , I); ACHOU = verdadeiro; abandone; fim se; fim para ; se no ACHOU ento imprima (A CHAVE, K,NO EST NO VETOR); fim se; fim. Neste exemplo, a pesquisa a um elemento ficar mais eficiente se utilizarmos a pesquisa binria,desde que o vetor j esteja ordenado. Nesta pesquisa procuramos o elemento K dividindo o vetorem duas partes e testando em qual das duas ele deveria estar. Procedendo da mesma forma paraa parte provvel, e assim sucessivamente: K K k

3.14. PESQUISA BINRIA


A pesquisa binria um mtodo que tambm s se aplica a vetores previamente ordenados.A sua grande vantagem a rapidez e, por isso, ela muito recomendada para vetores grandes.Neste mtodo, a primeira comparao feita com o elemento do meio do vetor, eliminando-seassim metade do mesmo para a busca. Seguemse comparaes sucessivas ao elemento domeio do segmento onde pode estar o elemento procur do. Assim, a cada a comparao feita,metade do vetor eliminada. Procedimento PESQBIN (V: VET, Inteiro: TOTELEM, POS;<Tipo bsico> :ELEMPROC) Incio /*Executa a Pesquisa binria da primeira ocorrncia da ELEMPROC em VETe retorna em POS se o ndice foi encontrado ou 0 se no existe. VETtem de estar ordenado pelo campo chave*/ Inteiro: PRI, ULT, MED {primeiro, ltimo e elemento do meio} POS = 0; PRI = 1; ULT = TOTELEM; Enquanto (PRI < = ULT) e (POS == 0) Faa MED = (PRI + ULT)/2 /*quociente da diviso inteira*/ Se VET[MED] == ELEMPROC Ento POS = MED; Seno Se VET[MED] > ELEMPROC Ento /*O ELEMPROC est na primeira metade*/ ULT = MED - 1; Seno /*O ELEMPROC est na Segunda metade*/ PRI = MED + 1; Fim Se; Fim Se; Fim Enquanto; Fim. 46

Exerccio 1 do item 7.2.2 utilizando-se pesquisa binria. incio /*pesquisa binria*/ inteiro COMEO, /*indicador do primeiro elemento da parte do vetor aconsiderar*/ FIM, /*indicador do ltimo elemento da parte do vetor aconsiderar*/ MEIO, /*indicador do elemento do meio da parte do vetorConsiderada*/ K; /*elemento procurado*/ Inteiro A[1:128]; leia (A,K); COMEO =1; FIM=128; repita MEIO= (COMEO+FIM)/2; se K<A[MEIO] ento FIM=MEIO-1 seno COMEO=MEIO+1; fim se at A[MEIO]==K ou COMEO >FIM; se A[MEIO]!=K ento imprima ( No existe o elemento); seno imprima ( Est na posio: , MEIO); fim se fim.

3. ALGORITMOS DE ORDENAO
Como j foi dito, o propsito dos algoritmos de ordenao o de facilitar e acelerar abusca posterior de um elemento no vetor. Os algoritmos de ordenao so utilizadosnormalmente uma vez em cada execuo do programa, ou poucas vezes, se comparadoscom os de Pesquisa, por isso o uso de mtodos elementares e demorados no toproblemtico como nas pesquisas. Na nossa disciplina, veremos trs algoritmos paraclassificao interna de vetores, que tm tempo de execuo proporcional ao quadrado donmero de elementos a serem ordenados: y Ordenao por seleo (mtodo seleo direta) y Ordenao por insero (mtodo insero direta) y Ordenao por troca (mtodo da bolha) Para fazermos qualquer ordenao em vetor (ou matriz) precisaremos de dois parmetros: a) O vetor que ser ordenado; b) O nmero de elementos desse vetor que devem ser ordenados. (Novamente para evitartratamento de "lixo") Da mesma forma que os algoritmos de pesquisa, os algoritmos de ordenao podero serutilizados muitas vezes na soluo de diferentes problemas e tambm vamos defini-los comoum Procedimento do mesmo Algoritmo Principal, hipottico, com os seguintes argumentos: Declaraes Constante MAXELEM = 1000; /*Nmero mximo de elementos do vetor, apenas limitaro tamanho do vetor*/ <tipo bsico> VET[1: MAXELEM];/*Corresponde ao Parmetro a) o vetor a serordenado*/ Inteiro TOTLEM /*Corresponde ao Parmetro b)*/

3.1. MTODO DE SELEO DIRETA


Este um dos mais simples mtodos existentes. Primeiro descobre-se o menorelemento do vetor e troca-se com o primeiro elemento. A partir da, com os elementosremanescentes, repete-se o processo at que todo o vetor esteja ordenado. Um exemplobastante elucidativo o de algumas cartas de baralho na mesa viradas para cima ( vista).Seleciona-se a menor (ou maior) para coloc-la na primeira posio. Depois, seleciona-se,sucessivamente, a menor carta dentre as remanescentes e se a coloca sobre a primeira. Procedimento SELEO_DIRETA (V: VET, Inteiro: TOTELEM) Incio /*Faz a ordenao crescente de TOTELEM elementos de um vetor VET*/ 47

Inteiro MIN, I, J; /*ndices*/ <Tipo Bsico> AUX; Para K de 1 at (TOTELEM - 1) Faa MIN K; Para J de (K + 1) at TOTELEM Faa Se VET[J] < VET [MIN] Ento MIN = J; Fim Se; Fim Para; AUX = VET[MIN]; VET[MIN] = VET[K]; VET[K] = AUX; Fim Para; Fim.

3.2. MTODO DE INSERO DIRETA


Nesse mtodo, considera-se que um elemento do vetor (o primeiro) est ordenado E"insere-se" os demais considerando os anteriores j ordenados. Voltando-se ao exemplo dobaralho como se agora as cartas sobre a mesa esto com a face para baixo e cada carta arrumada ordenadamente na mo em relao as que j esto na mo.Este mtodo pode ser utilizado, com vantagem, quando se est lendo elementos deum arquivo para serem posteriormente ordenados. Bastam leves modificaes no algoritmo,que leremos o arquivo e j o armazenaremos na memria ordenadamente. Procedimento INSERO_DIRETA (V: VET, Inteiro : TOTELEM) Incio /*Faz a ordenao de TOTELEM elementos de um vetor VET*/ <Tipo bsico> AUX; Inteiro K, J; /*ndice*/ Para K de 2 at TOTELEM Faa AUX = VET[K]; J = K - 1; Enquanto (J > 0) Faa Se AUX < VET[J] Ento VET [J + 1] = VET [J]; J = J - 1; Seno Abandone; Fim Se; Fim Enquanto; VET [J + 1] = AUX; Fim Para; Fim.

3.3. MTODO DA BOLHA


Este mtodo caracteriza-se por efetuar a comparao sucessiva de paressubseq uentes de elementos, trocando-os de posio, se estiverem fora de ordem. Dos trseste o menos eficiente, j que cada troca de elementos exige trs comandos e o nmero detrocas (TOTELEM-1) vezes maior que no mtodo de seleo direta, por exemplo. Almdisso o mtodo mais complicado de entender que o de seleo direta. Segue exemplode uma -se implementao de algoritmo de pesquisa utilizando-se esse mtodo. Procedimento BOLHACRESCENTE (V: VET, Inteiro: TOTELEM) Incio /*Faz o ordenamento de TOTELEM elementos de um valor VET*/ Inteiro P,J; /*contador de passadas e ndice*/ <Tipo bsico> AUX; Para P de 1 at (TOTELEM - 1) Faa Para J de 1 at (TOTELEM - P) Faa Se VET[J + 1]<VET[J] Ento AUX = VET[J]; /*Troca dos elementos*/ VET[J] =VET[J + 1]; VET[J + 1] =AUX; Fim Se; 48

Fim Para; Fim Para; Fim. - Exerccio Resolvido 1) Classificar um vetor numrico VET de 6 elementos em ordem crescente: incio /*mtodo da bolha*/ inteiro VET[1:6] inteiro: AUX, /* auxiliar para troca de elementos*/ BOLHA, /* indicador de mais alto elemento fora de ordem*/ LSUP, /*indicador do tamanho do vetor a ser pesquisado, sendo o valor inicial igual a 6*/ J; /*indicador do elemento do vetor*/ leia (VET); LSUP = 6; enquanto LSUP>1 faa BOLHA = 0; para J de 1 at LSUP-1 faa se VET[J]>VET[J+1] ento /* troca elemento j com j+1*/ AUX = VET[J]; VET[J] = VET[J+1]; VET[J+1] = AUX; BOLHA = J; fim se; fim para LSUP = BOLHA; /*aponta para ltima posio trocada*/ fim enquanto; imprima (VET); fim.

49