132
UNIVERSIDADE REGIONAL INTEGRADA DO ALTO URUGUAI E DAS MISSÕES CAMPUS FREDERICO WESTPHALEN DEPARTAMENTO DE ENGENHARIAS E CIÊNCIA DA COMPUTAÇÃO Algoritmos e Estrutura de Dados I Informática I

algoritmos

Embed Size (px)

Citation preview

1. INTRODUO

Universidade Regional Integrada do Alto Uruguai e das Misses

Campus Frederico WestphalenDepartamento de Engenharias e Cincia da ComputaoAlgoritmos e Estrutura de Dados I

Informtica I

Prof. Evandro [email protected]

http://www.uri.br/~preuss1 Semestre/2002

Plano de ensino da disciplina: 30-701Algoritmos e Estrutura de Dados I

Departamento: 03 Engenharias e Cincia da Computao

Carga horria: 90 horas 60 Teor./ 30 Prat.Crditos: 06

EMENTA:

Estudo das formas para representao do pensamento lgico atravs de tcnicas de desenvolvimento de algoritmos. Representao e manipulao de dados. Construes de algoritmos sequenciais, condicionais e com estruturas de repetio. Manipulao de estruturas de dados homogneas e heterogneas e utilizao de sub-rotinas.

OBJETIVOS:

Fornecer elementos e tcnicas que capacitem o aluno a construir algoritmos, atravs da identificao dos passos ou aes necessrios para transformar um conjunto de dados de entrada em informaes de resultado, promovendo dessa forma, um ambiente de prtica da lgica de programao.RELAO DOS CONTEDOS:

Abordagem Contextual

- Noes de lgica e conceito de algoritmos.

- Fatores a serem considerados na construo de algoritmos e importncia da programao estruturada

- Mtodos para construo de algoritmos

- Principais formas de representao de algoritmos (narrativa, pseudo-cdigo e grfica)

Tipos de Informaes

Dados:

- Tipos primitivos de dados, constantes x variveis

- Variveis: uso, nomenclatura, atribuio e armazenamento na memria

- Operadores matemticos e funes matemticas

Instrues bsicas ou comandos bsicos:

- Entrada, atribuio e sada de dados

- Blocos de programas e uso de portugus estruturado

Estruturas de Controle do Fluxo de Execuo

- Algoritmos sequenciais

- Algoritmos com seleo Estruturas de controle:

- Desvio condicional simples, composto e encadeados, mltiplas opes, operadores lgicos

- Estruturas de repetio:

- utilizao de contadores e acumuladores

Estruturas de Dados Homogneas

- Matrizes de Uma Dimenso ou Vetores:

- Operaes Bsicas com Matrizes do Tipo Vetor

- Matrizes com Mais de Uma Dimenso:

- Operaes Bsicas com Matrizes de Duas Dimenses

Estruturas de Dados Heterogneas

- Estrutura de Um Registro

- Atribuio, Leitura e Escrita de Registros

- Estrutura de Um Vetor de Registro

- Atribuio, Leitura e Escrita de Vetor de Registros

Subalgoritmos

- Mecanismo de Funcionamento e Definio de Subalgoritmos

- Funes

- Procedimentos

- Variveis Globais e Locais

- Parmetros

- Mecanismos de Passagem de Parmetros

Obs: para suporte aos algoritmos desenvolvidos, sero trabalhados 2 crditos semanais em um laboratrio, utilizando uma linguagem estruturada, possibilitando dessa forma a prtica da lgica de programao.BIBLIOGRAFIA BSICA (LIVROS TEXTOS):

FORBELLONE, Andr. "Lgica de Programao - A Construo de Algoritmos e Estruturas de Dados". So Paulo: Ed. Makron Books, 1993.

GOTTFRIED, Byron S. Programao em Pascal. Lisboa: Ed. Mc Graw-Hill, 1994.

MANZANO, Jos Augusto N. G. & OLIVEIRA, Jayr Figueiredo. Algoritmos: Lgica Para Desenvolvimento de Programao. So Paulo. Ed. rica, 1996.

T. Cormen, C. Leiserson e R. Rivest. Introduction to Algorithms. MIT Press/McGraw-Hill, 1990. U. Manber.

BIBLIOGRAFIA COMPLEMENTAR (LIVROS REFERENCIADOS):

SALVETTI, Dirceu Douglas e Barbosa, L. M. Algoritmos. So Paulo: Ed. Makron Books, 1998. Introduction to Algorithms: a creative approach . Addison-Wesley, 1988.

G. Brassard e P. Bratley. Fundamentals of Algorithmics. Prentice-Hall, 1995.

COLLINS, Willian J. Programao Estruturada com estudo de casos em Pascal. So Paulo: Ed. Mc Graw-Hill do Brasil, 1988.

FARRER, Harry. Programao Estruturada de Computadores. Rio de Janeiro: Ed. LTC, 1989.

GOTTFRIED, Byron S. Programao em Pascal. Lisboa: Ed. Mc Graw-Hill, 1994.

GUIMARES, Angelo de Moura. Algoritmos e Estruturas de Dados. Rio de Janeiro: Ed. LTC, 1985.

KNUTH, D. E. The Art of Computer Programming. Vol 3. Sort and Searchim. Addison Wesley, Reading, Mass., 1973

MECLER, Ian & MAIA, Luiz Paulo. Programao e Lgica com Turbo Pascal. Rio de Janeiro: Ed. Campus, 1989.

ORTH, Afonso Incio. Algoritmos. Porto Alegre. Ed. Pallotti, 1985.

SALIBA, Walter Lus Caram. Tcnicas de Programao: Uma Abordagem Estrutura. So Paulo: Ed. Makron Booksl, 1992.

TERADA, Routo & SETZER, Valdemar W. Introduo Computao e Construo de Algoritmos. So Paulo: Ed. Makron Books, 1992.SUMRIO

1parte i Introduo

1.Abordagem Contextual21.1Conceito de Algoritmo22.formas de representao de algoritmos42.1Descrio Narrativa42.2Fluxograma Convencional42.3Diagrama de Chapin62.4Pseudocdigo62.4.1Representao de Um Algoritmo na Forma de Pseudocdigo6Parte II - Tcnicas Bsicas de Programao83.Tipos de Dados93.1Tipos Inteiros93.2Tipos Reais93.3Tipos Caracteres93.4Tipos Lgicos94.Variveis e Constantes104.1Armazenamento de Dados na Memria104.2Conceito e Utilidade de Variveis104.3Definio de Variveis em Algoritmos114.4Conceito e Utilidade de Constantes114.5Definio de Constantes em Algoritmos125.Expresses e operadores135.1Operadores135.1.1Operadores de Atribuio135.1.2Operadores Aritmticos135.1.3Operadores Relacionais145.1.4Operadores Lgicos145.1.5Operadores Literais155.2Expresses155.2.1Expresses Aritmticas155.2.2Expresses Lgicas155.2.3Expresses Literais155.2.4Avaliao de Expresses15Exerccios166.Instrues Primitivas176.1Comandos de Atribuio176.2Comandos de Sada de Dados186.3Comandos de Entrada de Dados186.4Funes Matemticas197.Estruturas de Controle do Fluxo de Execuo217.1Comandos Compostos217.2Estrutura Seqencial217.3Estruturas de Deciso217.3.1Estruturas de Deciso Simples ( Se ... ento )227.3.2Estruturas de Deciso Composta ( Se ... ento ... seno )227.3.3Estruturas de Deciso Mltipla do Tipo Escolha ( Escolha ... caso ... seno )257.4Estruturas de Repetio267.4.1Laos Contados ( Para ... faa )277.4.2Laos Condicionais287.4.2.1Laos Condicionais com Teste no Incio ( Enquanto ... faa )287.4.2.2Laos Condicionais com Teste no Final ( Repita ... at que )297.5Estruturas de Controle Encadeadas ou Aninhadas298.Estruturas de Dados Homogneas308.1Matrizes de Uma Dimenso ou Vetores308.1.1Operaes Bsicas com Matrizes do Tipo Vetor308.1.1.1Atribuio de Uma Matriz do Tipo Vetor308.1.1.2Leitura de Dados de Uma Matriz do Tipo Vetor318.1.1.3Escrita de Dados de Uma Matriz do Tipo Vetor318.1.2Exemplos de Aplicao de Vetores328.1.2.1O Mtodo da Bolha de Classificao328.2Matrizes com Mais de Uma Dimenso348.2.1Operaes Bsicas com Matrizes de Duas Dimenses348.2.1.1Atribuio de Uma Matriz de Duas Dimenses358.2.1.2Leitura de Dados de Uma Matriz de Duas Dimenses358.2.1.3Escrita de Dados de Uma Matriz de Duas Dimenses359.Subalgoritmos379.1Mecanismo de Funcionamento379.2Definio de Subalgoritmos389.3Funes389.4Procedimentos409.5Variveis Globais e Locais419.6Parmetros429.7Mecanismos de Passagem de Parmetros429.7.1Passagem de Parmetros por Valor429.7.2Passagem de Parmetros por Referncia439.8Refinamentos Sucessivos43PARTE iii - lINGUAGEM DE PROGRAMAO4510.Introduo4611.Dados4711.1Elementos da Linguagem4711.1.1Elementos definidos pela linguagem:4711.1.1.1Letras (alfanumricas):4711.1.1.2Dgitos (numricos):4711.1.1.3Smbolos Especiais4711.1.1.4Palavras Reservadas ou Palavras Chave4711.1.1.5Delimitadores4811.1.2Elementos definidos pelo Usurio4811.1.2.1Identificadores4811.1.2.2Comentrios4811.1.2.3Endentao4811.2Tipos de Dados4911.2.1Tipos predefinidos pela linguagem4911.2.1.1Tipos Inteiros5011.2.1.2Tipos de Nmeros Reais5011.2.1.3Caracteres e Strings5011.2.1.4Valores Booleanos5211.2.2Tipos definidos pelo usurio5211.2.2.1Tipo enumerado discreto5211.2.2.2Tipo enumerado contnuo5211.3Constantes e Variveis5211.3.1Constantes5311.3.2Variveis5311.4Operadores5311.4.1Operadores aritmticos5311.4.2Operadores de atribuio5411.4.3Operadores relacionais5411.4.4Operadores lgicos5511.4.5Operadores sobre strings5511.4.6Operadores sobre conjuntos5612.Estrutura do Programa5712.1Identificao do programa5712.2Bloco de Declaraes5712.2.1Parte de Declaraes de Rtulos:5712.2.2Parte de Declaraes de Constantes:5712.2.3Parte de Declaraes de Tipos:5712.2.4Parte de Declaraes de Variveis:5712.2.5Parte de Declaraes de Subprogramas:5812.3Bloco de Comandos5813.Comandos5913.1Comandos Simples5913.1.1Comandos de Entrada e Sada5913.1.1.1Read e Readln5913.1.1.1.1AS FUNES EOLN e EOF6013.1.1.2Write e Writeln6013.1.1.3Readkey6113.1.2Comandos de Desvio Incondicional6213.1.2.1GOTO6213.1.2.2EXIT6213.1.2.3BREAK6213.1.2.4CONTINUE6213.1.2.5Runerror6313.1.2.6HALT6313.1.3Outros comandos simples6313.1.3.1Clrscr6313.1.3.2GotoXY6413.1.3.3Delay6413.1.3.4CHR6413.1.3.5ORD6413.1.3.6Upcase6413.2Estruturas de Controle6513.2.1Seqncia6513.2.2Comandos condicionais6513.2.2.1IF6513.2.2.2Comando de Seleo mltipla: CASE6613.2.3Comandos de Repetio6713.2.3.1For6713.2.3.2While e Repeat Until6814.Funes e procedimentos7114.1Procedimentos7114.2Funes7214.3Parmetros7214.3.1Passagem de parmetros7214.3.1.1Passagem de parmetros por valor7214.3.1.2Passagem de parmetros por referncia7314.3.2Argumentos passados a programas7414.4Recursividade7515.Procedimentos e Funes das Unidades Padro7615.1Manipulao de Strings e Converso7615.2Manipulao Numrica7615.3Manipulao de Diretrios7715.4Unit CRT7815.5Funes com Ordinais7915.6Unit DOS7916.Tipos Estruturados8316.1Vetores Unidimensionais e Multidimensionais (Matrizes)8316.2Estruturas8416.3Conjuntos - Set8717.Bibliografia89Apndice A - Exerccios90

parte i Introduo

1. Abordagem Contextual

O uso de algoritmos quase to antigo quanto a matemtica. Com o passar do tempo, entretanto, ele foi bastante esquecido pela matemtica. Com o advento das mquinas de calcular e mais tarde os computadores, o uso de algoritmos ressurgiu com grande vigor, como uma forma de indicar o caminho para a soluo dos mais variados problemas.

Algoritmo no a soluo do problema, pois, se assim fosse, cada problema teria um nico algoritmo. Algoritmo o caminho para a soluo de um problema, e em geral, os caminhos que levam a uma soluo so muitos.

Ao longo dos anos surgiram muitas formas de representar os algoritmos, alguns utilizando linguagens semelhantes s linguagens de programao e outras utilizando formas grficas.

O aprendizado de algoritmos no se consegue a no ser atravs de muitos exerccios.

Algoritmos no se aprendem:

Copiando algoritmos

Estudando algoritmos

Algoritmos s se aprendem:

Construindo algoritmos

Testando algoritmos

1.1 Conceito de Algoritmo

A automao o processo em que uma tarefa deixa de ser desempenhada pelo homem e passa a ser realizada por mquinas, sejam estas dispositivos mecnicos (como as mquinas industriais), eletrnicos (como os computadores), ou de natureza mista (como os robs).

Para que a automao de uma tarefa seja bem-sucedida necessrio que a mquina que passar a realiz-la seja capaz de desempenhar cada uma das etapas constituintes do processo a ser automatizado com eficincia, de modo a garantir a repetibilidade do mesmo. Assim, necessrio que seja especificado com clareza e exatido o que deve ser realizado em cada uma das fases do processo a ser automatizado, bem como a seqncia em que estas fases devem ser realizadas.

especificao da seqncia ordenada de passos que deve ser seguida para a realizao de um tarefa, garantindo a sua repetibilidade, d-se o nome de algoritmo.

Embora esta definio de algoritmo seja correta, podemos definir algoritmo, de maneira informal e completa como:

Algoritmo um conjunto finito de regras, bem definidas, para a soluo de um problema em um tempo finito e com um nmero finito de passos.

Informalmente, um algoritmo qualquer procedimento computacional bem definido que toma algum valor ou conjunto de valores como entrada e produz algum valor ou conjunto de valores como sada.

Um algoritmo deve sempre possuir pelo menos um resultado, normalmente chamado de sada, e satisfazer a propriedade da efetividade, isto , todas as operaes especificadas no algoritmo devem ser suficientemente bsicas para que possam ser executadas de maneira exata e num tempo finito.

Na prtica no importante ter-se apenas um algoritmo, mas sim, um bom algoritmo. O mais importante de um algoritmo a sua correo, isto , se ele resolve realmente o problema proposto e o faz exatamente.

Para se ter um algoritmo, necessrio:

1. Que se tenha um nmero finito de passos

2. Que cada passo esteja precisamente definido, sem possveis ambigidades

3. Que existam zero ou mais entradas tomadas de conjuntos bem definidos

4. Que existam uma ou mais sadas

5. Que exista uma condio de fim sempre atingida para quaisquer entradas e num tempo finito.

Para que um computador possa desempenhar uma tarefa necessrio que esta seja detalhada passo a passo, numa forma compreensvel pela mquina, utilizando aquilo que se chama de programa. Neste sentido, um programa de computador nada mais que um algoritmo escrito numa forma compreensvel pelo computador.

2. formas de representao de algoritmos

Existem diversas formas de representao de algoritmos, mas no h um consenso com relao melhor delas.

Algumas formas de representao de algoritmos tratam dos problemas apenas em nvel lgico, abstraindo-se de detalhes de implementao muitas vezes relacionados com alguma linguagem de programao especfica. Por outro lado, existem formas de representao de algoritmos que possuem uma maior riqueza de detalhes e muitas vezes acabam por obscurescer a idia principal, o algoritmo, dificultando seu entendimento.

Dentre as formas de representao de algoritmos mais conhecidas, sobressaltam:

a Descrio Narrativa o Fluxograma Convencional o Diagrama de Chapin o Pseudocdigo, tambm conhecido como Linguagem Estruturada ou Portugol.

2.1 Descrio Narrativa

Nesta forma de representao os algoritmos so expressos diretamente em linguagem natural. Como por exemplo, tm-se os algoritmos seguintes:

Troca de um pneu furado:

Afrouxar ligeiramente as porcas

Suspender o carro

Retirar as porcas e o pneu

Colocar o pneu reserva

Apertar as porcas

Abaixar o carro

Dar o aperto final nas porcas

Clculo da mdia de um aluno:

Obter as notas da primeira e da segunda prova

Calcular a mdia aritmtica entre as duas

Se a mdia for maior ou igual a 7, o aluno foi aprovado, seno ele foi reprovado

Esta representao pouco usada na prtica porque o uso de linguagem natural muitas vezes d oportunidade a ms interpretaes, ambigidades e imprecises.

Por exemplo, a instruo afrouxar ligeiramente as porcas no algoritmo da troca de pneus est sujeita a interpretaes diferentes por pessoas distintas. Uma instruo mais precisa seria: afrouxar a porca, girando-a de 30 no sentido anti-horrio.

2.2 Fluxograma Convencional

uma representao grfica de algoritmos onde formas geomtricas diferentes implicam aes (instrues, comandos) distintos. Tal propriedade facilita o entendimento das idias contidas nos algoritmos.

Nota-se que os fluxogramas convencionais preocupam-se com detalhes de nvel fsico da implementao do algoritmo. Por exemplo, figuras geomtricas diferentes so adotadas para representar operaes de sada de dados realizadas em dispositivos distintos, como uma unidade de armazenamento de dados ou um monitor de vdeo. A figura 2.1 mostra as principais formas geomtricas usadas em fluxogramas.

De modo geral, o fluxograma se resume a um nico smbolo inicial, por onde a execuo do algoritmo comea, e um ou mais smbolos finais, que so pontos onde a execuo do algoritmo se encerra. Partindo do smbolo inicial, h sempre um nico caminho orientado a ser seguido, representando a existncia de uma nica seqncia de execuo das instrues. Isto pode ser melhor visualizado pelo fato de que, apesar de vrios caminhos poderem convergir para uma mesma figura do diagrama, h sempre um nico caminho saindo desta. Excees a esta regra so os smbolos finais, dos quais no h nenhum fluxo saindo, e os smbolos de deciso, de onde pode haver mais de um caminho de sada (normalmente dois caminhos), representando uma bifurcao no fluxo.

A figura 2.2 mostra a representao do algoritmo de clculo da mdia de um aluno sob a forma de um fluxograma.

2.3 Diagrama de Chapin

O diagrama foi criado por Ned Chapin a partir de trabalhos de Nassi-Shneiderman, os quais resolveram substituir o fluxograma tradicional por um diagrama que apresenta uma viso hierrquica e estruturada da lgica do programa. A grande vantagem de usar este tipo de diagrama a representao das estruturas que tem um ponto de entrada e um ponto de sada e so compostas pelas estruturas bsicas de controle de seqncia, seleo e repartio. Enquanto difcil mostrar o embutimento e a recursividade com o fluxograma tradicional, torna-se mais simples mostr-lo com o diagrama de Chapin, bem como codific-lo futuramente na converso de cdigo portugus estruturado ou pseudocdigos. A figura 2.3 apresenta um exemplo do tipo de diagrama de Chapin para o algoritmo de clculo da mdia de um aluno.

2.4 Pseudocdigo

Esta forma de representao de algoritmos, tambm conhecida como portugus estruturado ou portugol, bastante rica em detalhes e, por assemelhar-se bastante forma em que os programas so escritos, encontra muita aceitao, sendo portanto a forma de representao de algoritmos que ser adotada nesta disciplina.

Na verdade, esta representao suficientemente geral para permitir que a traduo de um algoritmo nela representado para uma linguagem de programao especfica seja praticamente direta.

2.4.1 Representao de Um Algoritmo na Forma de Pseudocdigo

A representao de um algoritmo na forma de pseudocdigo a seguinte:

Algoritmo

Incio

Fim.onde:

Algoritmo uma palavra que indica o incio da definio de um algoritmo em forma de pseudocdigo.

um nome simblico dado ao algoritmo com a finalidade de distingu-lo dos demais.

consiste em uma poro opcional onde so declaradas as variveis globais usadas no algoritmo principal e, eventualmente, nos subalgoritmos.

consiste de uma poro opcional do pseudocdigo onde so definidos os subalgoritmos.

Incio e Fim so respectivamente as palavras que delimitam o incio e o trmino do conjunto de instrues do corpo do algoritmo.

Como exemplo, abaixo mostrado a representao do algoritmo de clculo da mdia de um aluno na forma de um pseudocdigo.

Algoritmo Mdia

Var N1, N2, Mdia

Incio

Leia N1, N2

Mdia := (N1+N2)/2

Se Mdia >= 7 Ento

Escreva Aprovado

Seno

Escreva Reprovado

Fim.Parte II - Tcnicas Bsicas de Programao

3. Tipos de Dados

Todo o trabalho realizado por um computador baseado na manipulao das informaes contidas em sua memria. Estas informaes podem ser classificadas em dois tipos:

As instrues, que comandam o funcionamento da mquina e determinam a maneira como devem ser tratados os dados.

Os dados propriamente ditos, que correspondem poro das informaes a serem processadas pelo computador.

A classificao apresentada a seguir no se aplica a nenhuma linguagem de programao especfica; pelo contrrio, ela sintetiza os padres utilizados na maioria das linguagens.

3.1 Tipos Inteiros

So caracterizados como tipos inteiros, os dados numricos positivos ou negativos. Excluindo-se destes qualquer nmero fracionrio. Como exemplo deste tipo de dado, tem-se os valores: 35, 0, -56, 1024 entre outros.

3.2 Tipos Reais

So caracterizados como tipos reais, os dados numricos positivos e negativos e nmeros fracionrios. Como exemplo deste tipo de dado, tem-se os valores: 35, 0, -56, 1.2, -45.987 entre outros.

3.3 Tipos Caracteres

So caracterizados como tipos caracteres, as seqncias contendo letras, nmeros e smbolos especiais. Uma seqncia de caracteres deve ser indicada entre aspas (). Este tipo de dado tambm conhecido como alfanumrico, string, literal ou cadeia. Como exemplo deste tipo de dado, tem-se os valores: Programao, Rua Alfa, 52 Apto 1, Fone 574-9988, 04387-030, , 7 entre outros.

3.4 Tipos Lgicos

So caracterizados como tipos lgicos os dados com valor verdadeiro e falso, sendo que este tipo de dado poder representar apenas um dos dois valores. Ele chamado por alguns de tipo booleano, devido contribuio do filsofo e matemtico ingls George Boole na rea da lgica matemtica.

4. Variveis e Constantes

4.1 Armazenamento de Dados na Memria

Para armazenar os dados na memria, imagine que a memria de um computador um grande arquivo com vrias gavetas, onde cada gaveta pode armazenar apenas um nico valor (seja ele numrico, caractere ou lgico). Se um grande arquivo com vrias gavetas, necessrio identificar com um nome a gaveta que se pretende utilizar. Desta forma o valor armazenado pode ser utilizado a qualquer momento.

4.2 Conceito e Utilidade de Variveis

Tm-se como definio de varivel tudo aquilo que sujeito a variaes, que incerto, instvel ou inconstante. E quando se fala de computadores, temos que ter em mente que o volume de informaes a serem tratadas grande e diversificado. Desta forma, os dados a serem processados sero bastante variveis.

Como visto anteriormente, informaes correspondentes a diversos tipos de dados so armazenadas nas memrias dos computadores. Para acessar individualmente cada uma destas informaes, em princpio, seria necessrio saber o tipo de dado desta informao (ou seja, o nmero de bytes de memria por ela ocupados) e a posio inicial deste conjunto de bytes na memria.

Percebe-se que esta sistemtica de acesso a informaes na memria bastante ilegvel e difcil de se trabalhar. Para contornar esta situao criou-se o conceito de varivel, que uma entidade destinada a guardar uma informao.

Basicamente, uma varivel possui trs atributos: um nome, um tipo de dado associado mesma e a informao por ela guardada.

Toda varivel possui um nome que tem a funo de diferenci-la das demais. Cada linguagem de programao estabelece suas prprias regras de formao de nomes de variveis.

Adotaremos para os algoritmos, as seguintes regras:

um nome de varivel deve necessariamente comear com uma letra;

um nome de varivel no deve conter nenhum smbolo especial, exceto a sublinha ( _ ) e nenhum espao em branco;

um nome de varivel no poder ser uma palavra reservada a uma instruo de programa.

Exemplos de nomes de variveis:

Salrio correto

1ANO errado (no comeou uma letra)

Ano1 correto

a casa errado (contm o caractere branco)

SAL/HORA errado (contm o caractere /)

SAL_HORA correto

_DESCONTO errado (no comeou com uma letra)

Obviamente interessante adotar nomes de variveis relacionados s funes que sero exercidas pela mesmas dentro de um programa.

Outro atributo caracterstico de uma varivel o tipo de dado que ela pode armazenar. Este atributo define a natureza das informaes contidas na varivel. Por ltimo h o atributo informao, que nada mais do que a informao til contida na varivel.

Uma vez definidos, os atributos nome e tipo de dado de uma varivel no podem ser alterados e assim permanecem durante toda a sua existncia, desde que o programa que a utiliza no seja modificado. Por outro lado, o atributo informao est constantemente sujeito a mudanas de acordo com o fluxo de execuo do programa.

Em resumo, o conceito de varivel foi criado para facilitar a vida dos programadores, permitindo acessar informaes na memria dos computadores por meio de um nome, em vez do endereo de uma clula de memria.

4.3 Definio de Variveis em Algoritmos

Todas as variveis utilizadas em algoritmos devem ser definidas antes de serem utilizadas. Isto se faz necessrio para permitir que o compilador reserve um espao na memria para as mesmas.

Mesmo que algumas linguagens de programao (como BASIC e FORTRAN) dispensam esta definio, uma vez que o espao na memria reservado medida que novas variveis so encontradas no decorrer do programa, nos algoritmos usaremos a definio de variveis por assemelhar-se com as principais linguagens de programao como Pascal e C.

Nos algoritmos, todas as variveis utilizadas sero definidas no incio do mesmo, por meio de um comando de uma das seguintes formas:

VAR :

ou

VAR :

a palavra-chave VAR dever estar presente sempre e ser utilizada um nica vez na definio de um conjunto de uma ou mais variveis;

numa mesma linha podero ser definidas uma ou mais variveis do mesmo tipo; Para tal, deve-se separar os nomes das mesmas por vrgulas;

variveis de tipos diferentes devem ser declaradas em linhas diferentes.

Exemplos de definio de variveis:

VAR nome: caracter[30]

idade: inteiro

salrio: real

tem_filhos: lgico

No exemplo acima foram declaradas quatro variveis:

a varivel nome, capaz de armazenar dados caractere de comprimento 35 (35 caracteres);

a varivel idade, capaz de armazenar um nmero inteiro;

a varivel salrio, capaz de armazenar um nmero real;

a varivel tem_filhos, capaz de armazenar uma informao lgica.

4.4 Conceito e Utilidade de Constantes

Tm-se como definio de constante tudo aquilo que fixo ou estvel. Existiro vrios momentos em que este conceito dever estar em uso, quando desenvolvermos programas.

comum definirmos uma constante no incio do programa, e a utilizarmos no decorrer do programa, para facilitar o entendimento, a programao ou ento para poupar tempo no caso de ter que alterar o seu valor, de modo que alterando uma nica vez a declarao da constante, todos os comandos e expresses que a utilizam so automaticamente atualizados.

4.5 Definio de Constantes em Algoritmos

Nos algoritmos, todas as constante utilizadas sero definidas no incio do mesmo, por meio de um comando da seguinte forma:

CONST =

Exemplo de definio de constantes:

CONST pi = 3.14159

nome_da_empresa = Enxuga Gelo SA

5. Expresses e operadores

5.1 Operadores

Operadores so elementos fundamentais que atuam sobre operandos e produzem um determinado resultado. Por exemplo, a expresso 3 + 2 relaciona dois operandos (os nmeros 3 e 2) por meio do operador (+) que representa a operao de adio.

De acordo com o nmero de operandos sobre os quais os operadores atuam, os ltimos podem ser classificados em:

binrios, quando atuam sobre dois operandos. Esta operao chamada didica. Ex.: os operadores das operaes aritmticas bsicas (soma, subtrao, multiplicao e diviso).

unrios, quando atuam sobre um nico operando. Esta operao chamada mondica. Ex.: o sinal de (-) na frente de um nmero, cuja funo inverter seu sinal.

Outra classificao dos operadores feita considerando-se o tipo de dado de seus operandos e do valor resultante de sua avaliao. Segundo esta classificao, os operandos dividem-se em aritmticos, lgicos e literais. Esta diviso est diretamente relacionada com o tipo de expresso onde aparecem os operadores.

Um caso especial o dos operadores relacionais, que permitem comparar pares de operandos de tipos de dados iguais, resultando sempre num valor lgico.

5.1.1 Operadores de Atribuio

Um operador de atribuio serve para atribuir um valor a uma varivel.

Em Algoritmo usamos o operador de atribuio:

:=A sintaxe de um comando de atribuio :

NomedaVarivel := expresso

A expresso localizada no lado direito do sinal de igual avaliada e armazenado o valor resultante na varivel esquerda. O nome da varivel aparece sempre sozinho, no lado esquerdo do sinal de igual deste comando.

5.1.2 Operadores Aritmticos

Os operadores aritmticos se relacionam s operaes aritmticas bsicas, conforme a tabela abaixo:

OperadorTipoOperaoPrioridade

+BinrioAdio4

-BinrioSubtrao4

*BinrioMultiplicao3

/BinrioDiviso3

MODBinrioResto da Diviso3

DIVBinrioDiviso Inteira3

**BinrioExponenciao2

+UnrioManuteno do Sinal1

-UnrioInverso do Sinal1

A prioridade entre operadores define a ordem em que os mesmos devem ser avaliados dentro de uma mesma expresso.

5.1.3 Operadores Relacionais

Os operadores relacionais so operadores binrios que devolvem os valores lgicos verdadeiro e falso.

OperadorComparao

>maior que

=maior ou igual

ALGORITMO

ABC < EFG

Pascal < Pascal compiler

Observe que as letras minsculas tm cdigos ASCII maiores do que os das letras maisculas. Observe tambm que o comprimento da string se torna o fator determinante na comparao de duas strings, quando os caracteres existentes na string menor so os mesmos que os caracteres correspondentes na string maior. Neste caso, a string maior dita maior que a menor.

5.1.4 Operadores Lgicos

Os operadores lgicos ou booleanos so usados para combinar expresses relacionais. Tambm devolvem como resultado valores lgicos verdadeiro ou falso.

OperadorTipoOperaoPrioridade

OUBinrioDisjuno3

EBinrioConjuno2

NOUnrioNegao1

Uma expresso relacional ou lgica retornar falso para o valor lgico falso e verdadeiro para o valor lgico verdade.

Fornecendo dois valores ou expresses lgicas, representadas por expresso1 e expresso2, podemos descrever as quatro operaes lgicas a seguir:

expresso1 E expresso2 verdadeiro somente se ambas, expresso1 e expresso2, forem verdadeiras. Se uma for falsa, ou se ambas forem falsas, a operao E tambm ser falsa.

expresso1 OU expresso2 verdadeiro se tanto a expresso1 como a expresso2 forem verdadeiras. As operaes OU s resultam em valores falsos se ambas, expresso1 e expresso2, forem falsas.

NO expresso1 avalia verdadeiro se expresso1 for falsa; de modo contrrio, a expresso NO resultar em falso, se expresso1 for verdadeira.

5.1.5 Operadores Literais

Os operadores que atuam sobre caracteres variam muito de uma linguagem para outra. O operador mais comum e mais usado o operador que faz a concatenao de strings: toma-se duas strings e acrescenta-se (concatena-se) a segunda ao final da primeira.

O operador que faz esta operao : +Por exemplo, a concatenao das strings ALGO e RITMO representada por:

ALGO + RITMO

e o resultado de sua avaliao : ALGORITMO

5.2 Expresses

O conceito de expresso em termos computacionais est intimamente ligado ao conceito de expresso ou frmula matemtica, onde um conjunto de variveis e constantes numricas relacionam-se por meio de operadores aritmticos compondo uma frmula que, uma vez avaliada, resulta num valor.

5.2.1 Expresses Aritmticas

Expresses aritmticas so aquelas cujo resultado da avaliao do tipo numrico, seja ele inteiro ou real. Somente o uso de operadores aritmticos, variveis numricas e parnteses permitido em expresses deste tipo

5.2.2 Expresses Lgicas

Expresses lgicas so aquelas cujo resultado da avaliao um valor lgico verdadeiro ou falso.

Nestas expresses so usados os operadores relacionais e os operadores lgicos, podendo ainda serem combinados com expresses aritmticas.

Quando forem combinadas duas ou mais expresses que utilizem operadores relacionais e lgicos, os mesmos devem utilizar os parnteses para indicar a ordem de precedncia.

5.2.3 Expresses Literais

Expresses literais so aquelas cujo resultado da avaliao um valor literal (caractere). Neste tipo de expresses s usado o operador de literais (+).

5.2.4 Avaliao de Expresses

Expresses que apresentam apenas um nico operador podem ser avaliadas diretamente. No entanto, medida que as mesmas vo tornando-se mais complexas com o aparecimento de mais de um operando na mesma expresso, necessria a avaliao da mesma passo a passo, tomando um operador por vez. A seqncia destes passos definida de acordo com o formato geral da expresso, considerando-se a prioridade (precedncia) de avaliao de seus operadores e a existncia ou no de parnteses na mesma.

As seguintes regras so essenciais para a correta avaliao de expresses:

1. Deve-se observar a prioridade dos operadores, conforme mostrado nas tabelas de operadores: operadores de maior prioridade devem ser avaliados primeiro. Se houver empate com relao precedncia, ento a avaliao se faz da esquerda para a direita.

2. Os parnteses usado em expresses tem o poder de roubar prioridade dos demais operadores, forando a avaliao da subexpresso em seu interior.

3. Entre os quatro grupos de operadores existentes, a saber, aritmtico, lgico, literal e relacional, h uma certa prioridade de avaliao: os aritmticos e literais devem ser avaliados primeiro; a seguir, so avaliadas as subexpresses com operadores relacionais e, por ltimo os operadores lgicos so avaliados.

Exerccios

1. Dados as variveis e operaes:v1 := 32v2 := 5 + v1 v1 := v2 * 2Como fazer para segurar e mostrar o valor inicial da varivel v1 no final das operaes?

2. Como fazer para passar o valor de uma varivel para outra e vice-versa?

3. Quais as operaes necessrias para intercambiar os valores de 3 variveis a, b e c de modo que a fique com o valor de b; b fique com o valor de c e c fique com o valor de a?

4. Se x possui o valor 15 e foram executadas as seguintes instrues:

x := X + 3

X := X - 6

X := X / 2

X := 3 * XQual ser o valor armazenado em x?

6. Instrues Primitivas

Como o prprio nome diz, instrues primitivas so os comandos bsicos que efetuam tarefas essenciais para a operao dos computadores, como entrada e sada de dados (comunicao com o usurio e com dispositivos perifricos), e movimentao dos mesmos na memria. Estes tipos de instruo esto presentes na absoluta maioria das linguagens de programao.

Antes de passar descrio das instrues primitiva, necessria a definio de alguns termos que sero utilizados:

dispositivo de entrada o meio pelo qual as informaes (mais especificamente os dados) so transferidos pelo usurio ou pelos nveis secundrios de memria ao computador. Os exemplos mais comuns so o teclado, o mouse, leitora tica, leitora de cdigo de barras, as fitas e discos magnticos.

dispositivo de sada o meio pelo qual as informaes (geralmente os resultados da execuo de um programa) so transferidos pelo computador ao usurio ou aos nveis secundrios de memria. Os exemplos mais comuns so o monitor de vdeo, impressora, fitas e discos magnticos.

sintaxe a forma como os comandos devem ser escritos, a fim de que possam ser entendidos pelo tradutor de programas. A violao das regras sintticas considerada um erro sujeito pena do no reconhecimento por parte do tradutor

semntica o significado, ou seja, o conjunto de aes que sero exercidas pelo computador durante a execuo do referido comando.

Daqui em diante, todos os comando novos sero apresentados por meio de sua sintaxe e sua semntica, isto , a forma como devem ser escritos e a(s) ao(es) que executam.

6.1 Comandos de Atribuio

O comando de atribuio ou simplesmente atribuio, a principal maneira de armazenar uma informao numa varivel. Sua sintaxe :

:=

Ex: Nome := Jenoveva

preco := 15.85

quant := 5

total : preco * quant

imposto := total * 17 / 100O modo de funcionamento (semntica) de uma atribuio consiste:

1) na avaliao da expresso

2) no armazenamento do valor resultante na varivel que aparece esquerda do comando.

A seguir temos um exemplo de um algoritmo utilizando o comando de atribuio:

Algoritmo exemplo_comando_de_atriuio

Var preo_unit, preo_tot : real

quant : inteiroIncio

preco_unit := 5.0

quant := 10

preo_tot := preo_unit * quant

Fim.6.2 Comandos de Sada de Dados

Os comandos de sada de dados so o meio pelo qual informaes contidas na memria dos computadores so colocadas nos dispositivos de sada, para que os usurios possam apreci-las.

H quatro sintaxes possveis para esta instruo:

ESCREVA

Ex: Escreva X

ESCREVA

Ex: Escreva nome, endereco, cidade

ESCREVA

Ex: Escreva Algoritmo o mximo!

ESCREVA , , ... ,,

Ex: Escreva Meu nome :, nome, e meu endereo :, endereco

Daqui por diante, ESCREVA ser considerada uma palavra reservada e no mais poder ser utilizada como nome de varivel, de modo que toda a vez que for encontrada em algoritmos, ser identificada como um comando de sada de dados.

Uma lista_de_variveis um conjunto de nomes de variveis separados por vrgulas. Um literal simplesmente um dado do tipo literal (string ou cadeia de caracteres) delimitado por aspas.

A semntica da instruo primitiva de sada de dados muito simples: os argumentos do comando so enviados para o dispositivo de sada. No caso de uma lista de variveis, o contedo de cada uma delas pesquisado na memria e enviado para o dispositivo de sada. No caso de argumentos do tipo literal ou string, estes so enviados diretamente ao referido dispositivo.

H ainda a possibilidade de se misturar nomes de variveis com literais na lista de um mesmo comando. O efeito obtido bastante til e interessante: a lista lida da esquerda para a direita e cada elemento da mesma tratado separadamente; se um nome de varivel for encontrado, ento a informao da mesma colocada no dispositivo de sada; no caso de um literal, o mesmo escrito diretamente no dispositivo de sada.

A seguir temos um exemplo de um algoritmo utilizando o comando de sada de dados:

Algoritmo exemplo_comando_de_sada_de_dados

Var preo_unit, preo_tot : real

quant : inteiroIncio

preco_unit := 5.0

quant := 10

preo_tot := preo_unit * quant

Escreva preo_tot

Fim.6.3 Comandos de Entrada de Dados

Os comandos de entrada de dados so o meio pelo qual as informaes dos usurios so transferidas para a memria dos computadores, para que possam ser usadas nos programas.

H duas sintaxes possveis para esta instruo:

LEIA

Ex: Leia X

LEIA

Ex: Leia nome, endereco, cidade

Da mesma forma que Escreva, daqui por diante Leia ser tratada como uma palavra-reservada e no mais poder ser usada como nome varivel em algoritmos. A lista_de_variveis um conjunto de um ou mais nomes de variveis separados por vrgulas.

A semntica da instruo de entrada (ou leitura) de dados , de certa forma, inversa da instruo de escrita: os dados so fornecidos ao computador por meio de um dispositivo de entrada e armazenados nas posies de memria das variveis cujos nomes aparecem na lista_de_variveis.

A seguir temos um exemplo de um algoritmo utilizando o comando de entrada de dados:

Algoritmo exemplo_comando_de_entrada_de_dados

Var preo_unit, preo_tot : real

quant : inteiroIncio

Leia preco_unit, quant

preo_tot := preo_unit * quant

Escreva preo_tot

Fim.Uma preocupao constante de um bom programador deve ser a de conceber um programa amigo do usurio. Esta preocupao traduzida no planejamento de uma interface com o usurio (meio pelo qual um programa e o usurio conversam) bastante amigvel. Em termos prticos, isto se resume aplicao de duas regras bsicas:

toda vez que um programa estiver esperando que o usurio fornea a ele um determinado dado (operao de leitura), ele deve antes enviar uma mensagem dizendo ao usurio o que ele deve digitar, por meio de uma instruo de sada de dados;

antes de enviar qualquer resultado ao usurio, um programa deve escrever uma mensagem explicando o significado do mesmo.

Estas medidas tornam o dilogo entre o usurio e o programador muito mais fcil.

A seguir temos um exemplo do algoritmo anterior, utilizando as regras de construo de uma interface amigvel:

Algoritmo exemplo_interface_amigavel

Var preo_unit, preo_tot : real

quant : inteiroIncio

Escreva Digite o preo unitrio:

Leia preco_unit

Escreva Digite a quantidade:

Leia quant

preo_tot := preo_unit * quant

Escreva Preo total: , preo_tot

Fim.6.4 Funes Matemticas

ABS (x)

Retorna o valor absoluto de uma expressoARCTAN (x)Retorna o arco de tangente do argumento utilizadoCOS (r)

Retorna o valor do co-senoEXP (r)

Retorna o valor exponencialFRAC (r)

Retorna a parte fracionriaLN (r)

Retorna o logaritmo naturalPI

Retorna o valor de PISIN (r)

Retorna o valor do senoSQR (r)

Retorna o parmetro elevado ao quadrado.SQRT (r)

Retorna a raiz quadrada

Nem todas as funes que necessitamos esto prontas e s vezes necessrio utilizar uma frmula equivalente:

YX= EXP ( LN ( Y ) * X )

= EXP ( LN ( Y ) * ( 1 / X ))

LOG (x)= LN ( X ) / LN ( 10 )

7. Estruturas de Controle do Fluxo de Execuo

At o momento os algoritmos estudados utilizam apenas instrues primitivas de atribuio, e de entrada e sada de dados. Qualquer conjunto de dados fornecido a um algoritmo destes ser submetido ao mesmo conjunto de instrues, executadas sempre na mesma seqncia.

No entanto, na prtica muitas vezes necessrio executar aes diversas em funo dos dados fornecidos ao algoritmo. Em outras palavras, dependendo do conjunto de dados de entrada do algoritmo, deve-se executar um conjunto diferente de instrues. Alm disso, pode ser necessrio executar um mesmo conjunto de instrues um nmero repetido de vezes. Em resumo necessrio controlar o fluxo de execuo das instrues (a seqncia em que as instrues so executadas num algoritmo) em funo dos dados fornecidos como entrada do mesmo.

De acordo com o modo como o controle do fluxo de instrues de um algoritmo feito, as estruturas bsicas de controle so classificadas em:

Estruturas seqenciais

Estruturas de deciso

Estruturas de repetio

7.1 Comandos Compostos

Um comando composto um conjunto de zero ou mais comandos (ou instrues) simples, como atribuies e instrues primitivas de entrada ou sada de dados, ou alguma das construes apresentadas neste captulo.

Este conceito bastante simples e ser til e conveniente nos itens seguintes, na definio das estruturas bsicas de controle de execuo.

7.2 Estrutura Seqencial

Na estrutura seqencial os comandos de um algoritmo so executados numa seqncia pr-estabelecida. Cada comando executado somente aps o trmino do comando anterior.

Uma estrutura seqencial delimitada pelas palavras-reservadas Incio e Fim e contm basicamente comandos de atribuio, comandos de entrada e comandos de sada. Os algoritmos do captulo anterior so algoritmos que utilizam uma nica estrutura seqencial.

Um algoritmo puramente seqencial aquele cuja execuo efetuada em ordem ascendente dos nmeros que identificam cada passo. A passagem de um passo ao seguinte natural e automtica, e cada passo executado uma nica vez.

7.3 Estruturas de Deciso

Neste tipo de estrutura o fluxo de instrues a ser seguido escolhido em funo do resultado da avaliao de uma ou mais condies. Uma condio uma expresso lgica.

A classificao das estruturas de deciso feita de acordo com o nmero de condies que devem ser testadas para que se decida qual o caminho a ser seguido. Segundo esta classificao, tm-se 3 tipos de estruturas de deciso:

Estrutura de Deciso Simples (Se ... ento)

Estrutura de Deciso Composta (Se ... ento ... seno)

Estrutura de Deciso Mltipla do Tipo Escolha (Escolha ... Caso ... Seno)

Os algoritmos puramente seqenciais podem ser usados na soluo de um grande nmero de problemas, porm existem problemas que exigem o uso de alternativas de acordo com as entradas do mesmo.

Nestes algoritmos, as situaes so resolvidas atravs de passos cuja execuo subordinada a uma condio. Assim, o algoritmo conter passos que so executados somente se determinadas condies forem observadas.

Um algoritmo em que se tem a execuo de determinados passos subordinada a uma condio denominado algoritmo com seleo.

7.3.1 Estruturas de Deciso Simples ( Se ... ento )

Nesta estrutura uma nica condio (expresso lgica) avaliada. Dependendo do resultado desta avaliao, um comando ou conjunto de comandos sero executados (se a avaliao for verdadeira) ou no sero executados (se a avaliao for falsa).

H duas sintaxes possveis para a estrutura de deciso simples:

SE ENTO

Ex: Se X > 10 Ento Escreva X maior que 10

SE ENTO

INCIO

FIM

Ex: Se X > 10 Ento

Incio

cont := cont + 1

soma := soma + x

Escreva X maior que 10

FIM

A semntica desta construo a seguinte: a condio avaliada:

Se o resultado for verdadeiro, ento o comando_nico ou o conjunto de comandos (comando_composto) delimitados pelas palavras-reservadas incio e fim sero executados. Ao trmino de sua execuo o fluxo do algoritmo prossegue pela instruo seguinte construo, ou seja, o primeiro comando aps o comando_nico ou a palavra-reservada fim.

No caso da condio ser falsa, o fluxo do algoritmo prossegue pela instruo seguinte construo, ou seja, o primeiro comando aps o comando_nico ou a palavra-reservada fim, sem executar o comando_nico ou o conjunto de comandos (comando_composto) entre as palavras-reservadas incio e fim.

Exemplo de algoritmo que l um nmero e escreve se o mesmo maior que 10:

Algoritmo exemplo_estrutura_de_deciso_simples

Var X : inteiro

Incio

Leia X

Se X > 10 Ento Escreva X maior que 10

Fim.

7.3.2 Estruturas de Deciso Composta ( Se ... ento ... seno )

Nesta estrutura uma nica condio (expresso lgica) avaliada. Se o resultado desta avaliao for verdadeiro, um comando ou conjunto de comandos sero executados. Caso contrrio, ou seja, quando o resultado da avaliao for falso, um outro comando ou um outro conjunto de comandos sero executados.

H duas sintaxes possveis para a estrutura de deciso composta:

SE ENTO

SENO

Ex: Se X > 100 Ento Escreva X maior que 100

Seno Escreva X no maior que 100

SE ENTO

INCIO

FIM

SENO

INCIO

FIM

Ex: Se X > 100 Ento

Incio

cont_a := cont_a + 1

soma_a := soma_a + x

Escreva X maior que 100

FIM

SENO

Incio

cont_b := cont_b + 1

soma_b := soma_b + x

Escreva X no maior que 100

FIM

A semntica desta construo a seguinte: a condio avaliada:

Se o resultado for verdadeiro, ento o comando_nico_1 ou o conjunto de comandos (comando_composto_1) delimitados pelas palavras-reservadas incio e fim sero executados. Ao trmino de sua execuo o fluxo do algoritmo prossegue pela instruo seguinte construo, ou seja, o primeiro comando aps o comando_nico_2 ou a palavra-reservada fim do comando_composto_2.

Nos casos em que a condio avaliada como falsa, o comando_nico_2 ou o conjunto de comandos (comando_composto_2) delimitados pelas palavras-reservadas incio e fim sero executados. Ao trmino de sua execuo o fluxo do algoritmo prossegue pela instruo seguinte construo, ou seja, o primeiro comando aps o comando_nico_2 ou a palavra-reservada fim do comando_composto_2.

Exemplo de algoritmo que l um nmero e escreve se o mesmo ou no maior que 100:

Algoritmo exemplo_estrutura_de_deciso_composta

Var X : inteiro

Incio

Leia X

Se X > 100 Ento Escreva X maior que 100

Seno Escreva X no maior que 100

Fim.

Nos algoritmos, a correta formulao de condies, isto , expresses lgicas, de fundamental importncia, visto que as estruturas de seleo so baseadas nelas. As diversas formulaes das condies podem levar a algoritmos distintos. Considerando o problema:

Dado um par de valores x, y, que representam as coordenadas de um ponto no plano, determinar o quadrante ao qual pertence o ponto, ou se est sobre um dos eixos cartesianos.A soluo do problema consiste em determinar todas as combinaes de x e y para as classes de valores positivos, negativos e nulos.

Os algoritmos podem ser baseados em estruturas concatenadas uma em seqncia a outra ou em estruturas aninhadas uma dentro da outra, de acordo com a formulao da condio.

O algoritmo a seguir utiliza estruturas concatenadas.

Algoritmo estruturas_concatenadas

Var x, y : inteiro

Incio

Ler x, y

Se x=0 e y=0 Ento Escrever Ponto na origem

Se x=0 e y0 Ento Escrever Ponto sobre o eixo y

Se x0 e y=0 Ento Escrever Ponto sobre o eixo x

Se x>0 e y>0 Ento Escrever Ponto no quandrante 1

Se x0 Ento Escrever Ponto no quandrante 2

Se x0

Ento Escrever Ponto no quandrante 1

Seno Escrever Ponto no quandrante 4

Seno Se y>0

Ento Escrever Ponto no quandrante 2

Seno Escrever Ponto no quandrante 3

Seno Se y=0

Ento Escrever Ponto na origem

Seno Escrever Ponto sobre o eixo y

Fim.As estruturas concatenadas tem a vantagem de tornar o algoritmo mais legvel, facilitando a correo do mesmo em caso de erros. As estruturas aninhadas ou encadeadas tem a vantagem de tornar o algoritmo mais rpido pois so efetuados menos testes e menos comparaes, o que resulta num menor nmero de passos para chegar ao final do mesmo.

Normalmente se usa estruturas concatenadas nos algoritmos devido facilidade de entendimento das mesmas e estruturas aninhadas ou encadeadas somente nos casos em que seu uso fundamental.

7.3.3 Estruturas de Deciso Mltipla do Tipo Escolha ( Escolha ... caso ... seno )

Este tipo de estrutura uma generalizao da construo Se, onde somente uma condio era avaliada e dois caminhos podiam ser seguidos. Na estrutura de deciso do tipo Escolha pode haver uma ou mais condies a serem testadas e um comando diferente associado a cada uma destas.

A sintaxe da construo de Escolha :

ESCOLHA

CASO

CASO

...

CASO

SENO

FIM

Seu funcionamento o seguinte: ao entrar-se numa construo do tipo Escolha, a condio_1 testada: se for verdadeira, o comando_composto_1 executado e aps seu trmino, o fluxo de execuo prossegue pela primeira instruo aps o final da construo (fim); se a condio_1 for falsa, a condio_2 testada: se esta for verdadeira, o comando_composto_2 executado e ao seu trmino, a execuo prossegue normalmente pela instruo seguinte ao final da construo (fim). O mesmo raciocnio estendido a todas as condies da construo. No caso em que todas as condies so avaliadas como falsas, o comando_composto_s (correspondente ao Seno da construo) executado.

Um caso particular desta construo aquele em que o comando_composto_s no contm nenhuma instruo. Isto ocorre nas situaes que no se deseja efetuar nenhuma ao quando todas as condies so falsas. Assim, pode-se dispensar o uso do Seno na construo Escolha.

Um exemplo de aplicao desta construo o algoritmo para reajustar o salrio de acordo com a funo. Se for tcnico, aumentar o salrio 50%, se for gerente, aumentar 30% e se for outro cargo, aumentar 20%.

Algoritmo exemplo_estrutura_do_tipo_escolha

Var salrio, salrio_reaj : real

prof: caracter[20]

Incio Leia salrio, prof

Escolha

Caso prof = Tcnico

salrio_reaj := 1.5 * salrio

Caso prof = Gerente

salrio_reaj := 1.3 * salrio

Seno

salrio_reaj := 1.2 * salrio

Fim

Escreva Salrio Reajustado = , salrio_reaj

Fim.

7.4 Estruturas de Repetio

So muito comuns as situaes em que se deseja repetir um determinado trecho de um programa um certo nmero de vezes. Por exemplo, pode-se citar o caso de um algoritmo que calcula a soma dos nmeros impares entre 500 e 1000 ou ento um algoritmo que escreve os nmeros maiores que 0 enquanto a sua soma no ultrapasse 1000.

As estruturas de repetio so muitas vezes chamadas de Laos ou tambm de Loops.

A classificao das estruturas de repetio feito de acordo com o conhecimento prvio do nmero de vezes que o conjunto de comandos ser executado. Assim os Laos se dividem em:

Laos Contados, quando se conhece previamente quantas vezes o comando composto no interior da construo ser executado;

Laos Condicionais, quando no se conhece de antemo o nmero de vezes que o conjunto de comandos no interior do lao ser repetido, pelo fato do mesmo estar amarrado a uma condio sujeita modificao pelas instrues do interior do lao.

Todo algoritmo que possui um ou mais de seus passos repetidos um determinado nmero de vezes denomina-se algoritmo com repetio.

Com a utilizao de estruturas de repetio para a elaborao de algoritmos, torna-se necessrio o uso de dois tipos de variveis para a resoluo de diversos tipos de problemas: variveis contadoras e variveis acumuladoras.

Uma varivel contadora uma varivel que recebe um valor inicial, geralmente 0 (zero) antes do incio de uma estrutura de repetio, e incrementada no interior da estrutura de um valor constante, geralmente 1, conforme o exemplo abaixo:

...

cont := 0

...

cont := cont + 1

...

...

Uma varivel acumuladora uma varivel que recebe um valor inicial, geralmente 0 (zero) antes do incio de uma estrutura de repetio, e incrementada no interior da estrutura de um valor varivel, geralmente a varivel usada na estrutura de controle, conforme o exemplo abaixo:

...

soma := 0

...

soma := soma + x

...

...

7.4.1 Laos Contados ( Para ... faa )Os laos contados so teis quando se conhece previamente o nmero exato de vezes que se deseja executar um determinado conjunto de comandos. Ento, este tipo de lao nada mais que uma estrutura dotada de mecanismos para contar o nmero de vezes que o corpo do lao (ou seja, o comando composto em seu interior) executado.

H duas sintaxes possveis usadas em algoritmos para os laos contados:

PARA DE AT FAA

Ex.: Para i De 1 At 10 Faa Escrever i, x 7 = , i * 7

PARA DE AT FAA

INCIO

FIM

Ex.:

soma := 0

Para i De 1 At 10 Faa

Incio

soma := soma + i

Escrever i, x 7 = , i * 7

Escrever Soma acumulada = , soma

FimA semntica do lao contado a seguinte: no incio da execuo da construo o valor incio atribudo varivel var. A seguir, o valor da varivel var comparado com o valor final. Se var for maior que final, ento o comando composto no executado e a execuo do algoritmo prossegue pelo primeiro comando seguinte ao comando_nico ou palavra-reservada fim que delimita o final da construo. Por outro lado, se o valor de var for menor ou igual a final, ento o comando composto no interior da construo executado e, ao final do mesmo a varivel var incrementada em 1 unidade. Feito isso, retorna-se comparao entre var e final e repete-se o processo at que var tenha um valor maior que final, quando o lao finalizado e a execuo do algoritmo prossegue pela instruo imediatamente seguinte construo.

Existe uma condio especial em que a contagem deve ser de forma decrescente, onde o valor a varivel decrementado em uma unidade. A sintaxe deste lao a seguinte:

PARA DE AT PASSO -1 FAA

INCIO

FIM

Exemplo de um algoritmo que escreve a tabuada de um nmero especfico:

Algoritmo tabuada

Var i, tab, num : inteiro

Incio

Escrever Tabuada:

Ler tab

Escrever At que nmero:

Ler num

Para i de 1 At num Faa

Incio

Escrever i, x , tab, = , i * tab

Fim

Fim.7.4.2 Laos Condicionais

Laos condicionais so aqueles cujo conjunto de comandos em seu interior executado at que uma determinada condio seja satisfeita. Ao contrrio do que acontece nos laos contados, nos laos condicionais no se sabe de antemo quantas vezes o corpo do lao ser executado.

As construes que implementam laos condicionais mais comuns nas linguagens de programao modernas so:

Enquanto - lao condicional com teste no incio

Repita - lao condicional com teste no final

Nos laos condicionais a varivel que testada, tanto no incio quanto no final do lao, dever sempre estar associada a um comando que a atualize no interior do lao. Caso isso no ocorra, o programa ficar repetindo indefinidamente este lao, gerando uma situao conhecida como lao infinito.

7.4.2.1 Laos Condicionais com Teste no Incio ( Enquanto ... faa )Caracteriza-se por uma estrutura que efetua um teste lgico no incio de um lao, verificando se permitido ou no executar o conjunto de comandos no interior do lao.

A sintaxe mostrada a seguir:

ENQUANTO FAA

INCIO

FIM

Sua semntica a seguinte: ao incio da construo Enquanto a condio testada. Se seu resultado for falso, ento o comando composto no seu interior no executado e a execuo prossegue normalmente pela instruo seguinte palavra-reservada fim que identifica o final da construo.

Se a condio for verdadeira o comando composto executado e ao seu trmino retorna-se ao teste da condio. Assim, o processo acima ser repetido enquanto a condio testada for verdadeira. Quando esta for falsa, o fluxo de execuo prossegue normalmente pela instruo seguinte palavra-reservada fim que identifica o final da construo.

Uma vez dentro do corpo do lao, a execuo somente abandonar o mesmo quando a condio for falsa. O usurio deste tipo de construo deve estar atento necessidade de que em algum momento a condio dever ser avaliada como falsa. Caso contrrio, o programa permanecer indefinidamente no interior do lao (lao infinito).

Neste tipo de lao condicional a varivel a ser testada deve possuir um valor associado antes da construo do lao.

O algoritmo que escreve os nmeros maiores que 0 enquanto a sua soma no ultrapasse 1000 um exemplo deste tipo de lao:

Algoritmo exemplo_enquanto

Var soma, num : inteiro

Incio

soma := 0

num := 1

Enquanto soma < 1000 Faa

Incio

Escreva num

num := num + 1

soma := soma + num

Fim

Fim.7.4.2.2 Laos Condicionais com Teste no Final ( Repita ... at que )Caracteriza-se por uma estrutura que efetua um teste lgico no final de um lao, verificando se permitido ou no executar novamente o conjunto de comandos no interior do mesmo.

A sintaxe mostrada a seguir:

REPITA

AT QUE

Seu funcionamento bastante parecido ao da construo Enquanto. O comando executado uma vez. A seguir, a condio testada: se ela for falsa, o comando composto executado novamente e este processo repetido at que a condio seja verdadeira, quando ento a execuo prossegue pelo comando imediatamente seguinte ao final da construo.

Esta construo difere da construo Enquanto pelo fato de o comando composto ser executado uma ou mais vezes (pelo menos uma vez), ao passo que na construo Enquanto o comando composto executado zero ou mais vezes (possivelmente nenhuma). Isto acontece porque na construo Repita o teste feito no final da construo, ao contrrio do que acontece na construo Enquanto, onde o teste da condio efetuado no incio da mesma.

A construo Repita tambm difere da construo Enquanto no que se refere inicializao da varivel, visto que na construo Repita a varivel pode ser inicializada ou lida dentro do lao.

O algoritmo que l um nmero no determinado de vezes um valor do teclado e escreve o valor e o seu quadrado, at que seja digitado um valor par, um exemplo desta estrutura:

Algoritmo exemplo_repita

Var num : inteiro

Incio

Repita

Ler num

Escrever num, - , num * numAt que num mod 2 = 0Fim.

7.5 Estruturas de Controle Encadeadas ou Aninhadas

Um aninhamento ou encadeamento o fato de se ter qualquer um dos tipos de construo apresentados anteriormente dentro do conjunto de comandos (comando composto) de uma outra construo.

Em qualquer tipo de aninhamento necessrio que a construo interna esteja completamente embutida na construo externa.

A figura 7.1 a seguir ilustra aninhamentos vlidos e invlidos.

8. Estruturas de Dados Homogneas

As estruturas de dados homogneas permitem agrupar diversas informaes dentro de uma mesma varivel. Este agrupamento ocorrer obedecendo sempre ao mesmo tipo de dado, e por esta razo que estas estruturas so chamadas homogneas.

A utilizao deste tipo de estrutura de dados recebe diversos nomes, como: variveis indexadas, variveis compostas, variveis subscritas, arranjos, vetores, matrizes, tabelas em memria ou arrays. Os nomes mais usados e que utilizaremos para estruturas homogneas so: matrizes (genrico) e vetores (matriz de uma linha e vrias colunas).

8.1 Matrizes de Uma Dimenso ou Vetores

Este tipo de estrutura em particular tambm denominado por profissionais da rea como matrizes unidimensionais. Sua utilizao mais comum est vinculada criao de tabelas. Caracteriza-se por ser definida uma nica varivel vinculada dimensionada com um determinado tamanho. A dimenso de uma matriz constituda por constantes inteiras e positivas. Os nomes dados s matrizes seguem as mesmas regras de nomes utilizados para indicar as variveis simples.

A sintaxe do comando de definio de vetores a seguinte:

Var

: MATRIZ [ .. ] DE

Ex.: Var

m : Matriz [1 .. 10] De Inteiro

8.1.1 Operaes Bsicas com Matrizes do Tipo Vetor

Do mesmo modo que acontece com variveis simples, tambm possvel operar com variveis indexadas (matrizes). Contudo no possvel operar diretamente com o conjunto completo, mas com cada um de seus componentes isoladamente.

O acesso individual a cada componente de um vetor realizado pela especificao de sua posio na mesma por meio do seu ndice. No exemplo anterior foi definida uma varivel M capaz de armazenar 10 nmero inteiros. Para acessar um elemento deste vetor deve-se fornecer o nome do mesmo e o ndice do componente desejado do vetor (um nmero de 1 a 10, neste caso).

Por exemplo, M[1] indica o primeiro elemento do vetor, M[2] indica o segundo elemento do vetor e M[10] indica o ltimo elemento do vetor.

Portanto, no possvel operar diretamente sobre vetores como um todo, mas apenas sobre seus componentes, um por vez. Por exemplo, para somar dois vetores necessrio somar cada um de seus componentes dois a dois. Da mesma forma as operaes de atribuio, leitura e escrita de vetores devem ser feitas elemento a elemento.

8.1.1.1 Atribuio de Uma Matriz do Tipo Vetor

No captulo sobre as instrues primitivas, o comando de atribuio foi definido como:

:= No caso de vetores (variveis indexadas), alm do nome da varivel deve-se necessariamente fornecer tambm o ndice do componente do vetor onde ser armazenado o resultado da avaliao da expresso.

Ex.: m[1] := 15

m[2] := 150

m[5] := 10

m[10] := 35

8.1.1.2 Leitura de Dados de Uma Matriz do Tipo Vetor

A leitura de um vetor feita passo a passo, um de seus componentes por vez, usando a mesma sintaxe da instruo primitiva da entrada de dados, onde alm do nome da varivel, deve ser explicitada a posio do componente lido:

LEIA [ ]Uma observao importante a ser feita a utilizao da construo Para a fim de efetuar a operao de leitura repetidas vezes, em cada uma delas lendo um determinado componente do vetor. De fato esta construo muito comum quando se opera com vetores, devido necessidade de se realizar uma mesma operao com os diversos componentes dos mesmos. Na verdade, so raras as situaes que se deseja operar isoladamente com um nico componente do vetor.

O algoritmo a seguir exemplifica a operao de leitura de um vetor:

Algoritmo exemplo_leitura_de_vetor

Var

numeros : matriz[1..10] de inteiro

i : inteiro

Incio

Para i de 1 at 10 faa

Incio

Leia numeros[i]

Fim

Fim.

8.1.1.3 Escrita de Dados de Uma Matriz do Tipo Vetor

A escrita de um vetor obedece mesma sintaxe da instruo primitiva de sada de dados e tambm vale lembrar que, alm do nome do vetor, deve-se tambm especificar por meio do ndice o componente a ser escrito:

ESCREVA [ ]O algoritmo a seguir exemplifica a operao de leitura e escrita de um vetor, utilizando a construo Para:

Algoritmo exemplo_escrita_de_vetor

Var

numeros : matriz[1..10] de inteiro

i : inteiro

Incio

Para i de 1 at 10 faa

Incio

Leia numeros[i]

Fim

Para i de 1 at 10 faa

Incio

Escreva numeros[i]

Fim

Fim.

Um exemplo mais interessante mostrado a seguir, onde um vetor de dez nmeros lido e guardado no vetor numeros. Paralelamente, a soma destes nmeros calculada e mantida na varivel soma, que posteriormente escrita.

Algoritmo exemplo_escrita_de_vetor_com_soma

Var

numeros : matriz[1..10] de inteiro

i : inteiro

soma : inteiro

Incio

soma := 0Para i de 1 at 10 faa

Incio

Leia numeros[i]

soma := soma + numeros[i]

Fim

Para i de 1 at 10 faa

Incio

Escreva numeros[i]

Fim

Escrever Soma = , somaFim.

8.1.2 Exemplos de Aplicao de Vetores

O espectro de aplicao de vetores em algoritmos muito extenso, mas normalmente os vetores so usados em duas tarefas muito importantes no processamento de dados: pesquisa e classificao.

A pesquisa consiste na verificao da existncia de um valor dentro de um vetor. Trocando em midos, pesquisar um vetor consiste em procurar dentre seus componentes um determinado valor.

A classificao de um vetor consiste em arranjar seus componentes numa determinada ordem, segundo um critrio especfico. Por exemplo, este critrio pode ser a ordem alfabtica de um vetor de dados caracter, ou ento a ordem crescente ou decrescente para um vetor de dados numricos. H vrios mtodos de classificao, mas o mais conhecido o mtodo da bolha de classificao (Bubble Sort).

8.1.2.1 O Mtodo da Bolha de Classificao

Este mtodo no o mais eficiente, mas um dos mais populares devido sua simplicidade.

A filosofia bsica deste mtodo consiste em varrer o vetor, comparando os elementos vizinhos entre si. Caso estejam fora de ordem, os mesmos trocam de posio entre si. Procede-se assim at o final do vetor. Na primeira varredura verifica-se que o ltimo elemento do vetor j est no seu devido lugar (no caso de ordenao crescente, ele o maior de todos). A segunda varredura anloga primeira e vai at o penltimo elemento. Este processo repetido at que seja feito um nmero de varreduras igual ao nmero de elementos a serem ordenados menos um. Ao final do processo o vetor est classificado segundo o critrio escolhido.

O exemplo a seguir ilustra o algoritmo bubble sort para ordenar 50 nmero inteiros em ordem crescente:

Algoritmo Bubble_Sort

Var

numeros : matriz [1..50] de inteiros

aux, i, j: inteiro

IncioPara i de 1 at 50 faa

Incio

Ler numeros[i]

Fimj := 50

Enquanto j > 1 faa Incio Para i de 1 at j-1 faa Incio

Se numeros[i] > numeros[i+1] Ento

Incio aux := numeros[i];

numeros[i] := numeros[j];

numeros[j] := aux;

Fim

Fim

j:=j-1;

Fim

Escreva vetor ordenado:

Para i de 1 at 50 faa

Incio

Escrever numeros[i]

Fim

Fim.Uma outra variao deste algoritmo, com as mesmas caractersticas utiliza duas construes Para, fazendo a comparao iniciando do primeiro elemento at o penltimo, comparando com o imediatamente seguinte at o ltimo elemento:

Algoritmo Variao_do_Bubble_Sort

Var

numeros : matriz [1..50] de inteiros

aux, i, j: inteiro

IncioPara i de 1 at 50 faa

Incio

Ler numeros[i]

FimPara i de 1 at 49 faa

Incio

Para j de i + 1 at 50 faa

Incio

Se numeros[i] > numeros[j] Ento

Incio aux := numeros[i];

numeros[i] := numeros[j];

numeros[j] := aux;

Fim

Fim

Fim

Escreva vetor ordenado:

Para i de 1 at 50 faa

Incio

Escrever numeros[i]

Fim

Fim.Podemos observar tambm que para ordenar o vetor em ordem decrescente basta inverter o sinal de comparao no teste da condio lgica Se numeros[i] > numeros[j], para:

Se numeros[i] < numeros[j]

8.2 Matrizes com Mais de Uma Dimenso

Este tipo de estrutura tambm tem sua principal utilizao vinculada criao de tabelas. Caracteriza-se por ser definida uma nica varivel vinculada dimensionada com um determinado tamanho. A dimenso de uma matriz constituda por constantes inteiras e positivas. Os nomes dados s matrizes seguem as mesmas regras de nomes utilizados para indicar as variveis simples.

A sintaxe do comando de definio de matrizes de duas dimenses a seguinte:

Var

: MATRIZ [ .. , .. ] DE

Ex.: Var

m : Matriz [1 .. 5 , 1 .. 10] De Inteiro

Tambm possvel definir matrizes com vrias dimenses, por exemplo:

Ex.: Var

N: Matriz [1 .. 4] De Inteiro

O: Matriz [1 .. 50 , 1 .. 4] De Inteiro

P: Matriz [1 .. 5, 1 .. 50 , 1 .. 4] De Inteiro

Q: Matriz [1 .. 3 , 1 .. 5, 1 .. 50 , 1 .. 4] De Inteiro

R: Matriz [1 .. 2 , 1 .. 3 , 1 .. 5, 1 .. 50 , 1 .. 4] De Inteiro

S: Matriz [1 .. 2 , 1 .. 2 , 1 .. 3 , 1 .. 5, 1 .. 50 , 1 .. 4] De Inteiro

A utilidade de matrizes desta forma muito grande. No exemplo acima, cada matriz pode ser utilizada para armazenar uma quantidade maior de informaes:

a matriz N pode ser utilizada para armazenar 4 notas de um aluno

a matriz O pode ser utilizada para armazenar 4 notas de 50 alunos.

a matriz P pode ser utilizada para armazenar 4 notas de 50 alunos de 5 disciplinas.

a matriz Q pode ser utilizada para armazenar 4 notas de 50 alunos de 5 disciplinas, de 3 turmas.

a matriz R pode ser utilizada para armazenar 4 notas de 50 alunos de 5 disciplinas, de 3 turmas, de 2 colgios.

a matriz S pode ser utilizada para armazenar 4 notas de 50 alunos de 5 disciplinas, de 3 turmas, de 2 colgios, de 2 cidades

8.2.1 Operaes Bsicas com Matrizes de Duas Dimenses

Do mesmo modo que acontece com os vetores, no possvel operar diretamente com o conjunto completo, mas com cada um de seus componentes isoladamente.

O acesso individual a cada componente de uma matriz realizado pela especificao de sua posio na mesma por meio do seu ndice. No exemplo anterior foi definida uma varivel M capaz de armazenar 10 nmero inteiros em cada uma das 5 linhas. Para acessar um elemento desta matriz deve-se fornecer o nome da mesma e o ndice da linha e da coluna do componente desejado da matriz (um nmero de 1 a 5 para a linha e um nmero de 1 a 10 para a coluna, neste caso).

Por exemplo, M[1,1] indica o primeiro elemento da primeira linha da matriz, M[1,2] indica o segundo elemento da primeira linha da matriz, M[1,10] indica o ltimo elemento da primeira linha da matriz e M[5,10] indica o ltimo elemento da ltima linha da matriz

Da mesma forma como vetores, no possvel operar diretamente sobre matrizes como um todo, mas apenas sobre seus componentes, um por vez. Por exemplo, para somar duas matrizes necessrio somar cada um de seus componentes dois a dois. Da mesma forma as operaes de atribuio, leitura e escrita de matrizes devem ser feitas elemento a elemento.

8.2.1.1 Atribuio de Uma Matriz de Duas Dimenses

Na atribuio de matrizes, da mesma forma que nos vetores, alm do nome da varivel deve-se necessariamente fornecer tambm o ndice do componente da matriz onde ser armazenado o resultado da avaliao da expresso. O ndice referente ao elemento composto por tantas informaes quanto o nmero de dimenses da matriz. No caso de ter duas dimenses, o primeiro nmero se refere linha e o segundo nmero se refere coluna da matriz em que se encontra a informao

Ex.: m[1,1] := 15

m[1,10] := 10

m[3,5] := 20

m[5,10] := 35

8.2.1.2 Leitura de Dados de Uma Matriz de Duas Dimenses

A leitura de uma matriz feita passo a passo, um de seus componentes por vez, usando a mesma sintaxe da instruo primitiva da entrada de dados, onde alm do nome da varivel, deve ser explicitada a posio do componente lido:

LEIA [ , ... , < ndice_n> ]Uma observao importante a ser feita a utilizao de construes Para aninhadas ou encadeada a fim de efetuar a operao de leitura repetidas vezes, em cada uma delas lendo um determinado componente da matriz. Esta construo muito comum quando se opera com matrizes, devido necessidade de se realizar uma mesma operao com os diversos componentes das mesmas.

O algoritmo a seguir exemplifica a operao de leitura de uma matriz:

Algoritmo exemplo_leitura_de_matriz

Var

numeros : matriz[1..5, 1..10] de inteiro

i, j : inteiro

Incio

Para i de 1 at 5 faa

Incio

Para j de 1 at 10 faa

Incio

Leia numeros[i,j]

Fim

Fim

Fim.8.2.1.3 Escrita de Dados de Uma Matriz de Duas Dimenses

A escrita de uma matriz obedece mesma sintaxe da instruo primitiva de sada de dados e tambm vale lembrar que, da mesma forma que com vetores, alm do nome da matriz, deve-se tambm especificar por meio do ndice o componente a ser escrito:

ESCREVA [ , ... , ]O algoritmo a seguir exemplifica a operao de leitura e escrita de uma matriz, utilizando as construes Para aninhadas ou encadeadas:

Algoritmo exemplo_escrita_de_matriz

Var

numeros : matriz[1..5,1..10] de inteiro

i, j : inteiro

Incio

Para i de 1 at 5 faa

Incio

Para i de 1 at 10 faa

Incio

Leia numeros[i,j]

Fim

Fim

Para i de 1 at 5 faa

Incio

Para j de 1 at 10 faa

Incio

Escreva numeros[i,j]

Fim

Fim

Fim.

Um exemplo mais interessante mostrado a seguir, onde uma matriz de 5 linhas por 10 colunas lida e guardada na matriz numeros. A seguir efetuada e escrita a soma dos elementos da 2 linha e tambm a soma dos elementos da 3 coluna

Algoritmo exemplo_escrita_de_matriz_com_soma

Var

numeros : matriz[1..5,1..10] de inteiro

i, j : inteiro

somal2, somac3 : inteiro

Incio

Para i de 1 at 5 faa

Incio

Para i de 1 at 10 faa

Incio

Leia numeros[i,j]

Fim

Fim

Para i de 1 at 5 faa

Incio

Para i de 1 at 10 faa

Incio

Escreva numeros[i,j]

Fim

Fim

somal2 := 0

somac3 := 0

Para j de 1 at 10 faa

Incio

somal2 := somal2 + numeros[2,j]

Fim

Para i de 1 at 5 faa

Incio

somac3 := somac3 + numeros[i,3]

Fim

Escrever Soma Linha 2 = , somal2

Escrever Soma Coluna 3 = , somac3Fim.

9. Subalgoritmos

A complexidade dos algoritmos est intimamente ligada da aplicao a que se destinam. Em geral, problemas complicados exigem algoritmos extensos para sua soluo.

Sempre possvel dividir problemas grandes e complicados em problemas menores e de soluo mais simples. Assim, pode-se solucionar cada um destes pequenos problemas separadamente, criando algoritmos para tal (subalgoritmos). Posteriormente, pela justaposio destes subalgoritmos elabora-se automaticamente um algoritmo mais complexo e que soluciona o problema original. Esta metodologia de trabalho conhecida como Mtodo de Refinamentos Sucessivos, cujo estudo assunto de cursos avanados sobre tcnicas de programao.

Um subalgoritmo um nome dado a um trecho de um algoritmo mais complexo e que, em geral, encerra em si prprio um pedao da soluo de um problema maior o algoritmo a que ele est subordinado. Este conceito essencial numa cincia bastante recente: a Engenharia de Software.

Em resumo, os subalgoritmos so importantes na:

subdiviso de algoritmos complexos, facilitando o seu entendimento;

estruturao de algoritmos, facilitando principalmente a deteco de erros e a documentao de sistemas; e

modularizao de sistemas, que facilita a manuteno de softwares e a reutilizao de subalgoritmos j implementados.

A idia da reutilizao de software tem sido adotada por muitos grupos de desenvolvimento de sistemas de computador, devido economia de tempo e trabalho que proporcionam. Seu princpio o seguinte: um conjunto de algoritmos destinado a solucionar uma srie de tarefas bastante corriqueiras desenvolvido e vai sendo aumentado com o passar do tempo, com o acrscimo de novos algoritmos. A este conjunto d-se o nome de biblioteca. No desenvolvimento de novos sistemas, procura-se ao mximo basear sua concepo em subalgoritmos j existentes na biblioteca, de modo que a quantidade de software realmente novo que deve ser desenvolvido minimizada.

Muitas vezes os subalgoritmos podem ser teis para encerrar em si uma certa seqncia de comandos que repetida vrias vezes num algoritmo. Nestes casos, os subalgoritmos proporcionam uma diminuio do tamanho de algoritmos maiores. Antigamente, esta propriedade era tida como a principal utilidade dos subalgoritmos.

9.1 Mecanismo de Funcionamento

Um algoritmo completo dividido num algoritmo principal e diversos subalgoritmos (tantos quantos forem necessrios e/ou convenientes). O algoritmo principal aquele por onde a execuo do algoritmo sempre se inicia. Este pode eventualmente invocar os demais subalgoritmos.

O corpo do algoritmo principal sempre o ltimo trecho do pseudocdigo de um algoritmo. As definies dos subalgoritmos esto sempre colocadas no trecho aps a definio das variveis globais e antes do corpo do algoritmo principal:

Algoritmo

Var

Inicio

Fim.

Durante a execuo do algoritmo principal, quando se encontra um comando de invocao de um subalgoritmo, a execuo do mesmo interrompida. A seguir, passa-se execuo dos comandos do corpo do subalgoritmo. Ao seu trmino, retoma-se a execuo do algoritmo que o chamou (no caso, o algoritmo principal) no ponto onde foi interrompida (comando de chamada do subalgoritmo) e prossegue-se pela instruo imediatamente seguinte.

Note, tambm, que possvel que um subalgoritmo chame outro atravs do mesmo mecanismo.

9.2 Definio de Subalgoritmos

A definio de um subalgoritmo consta de:

um cabealho, onde esto definidos o nome e o tipo do subalgoritmo, bem como os seus parmetros e variveis locais;

um corpo, onde se encontram as instrues (comandos) do subalgoritmo.

O nome de um subalgoritmo o nome simblico pelo qual ele chamado por outro algoritmo.

O corpo do subalgoritmo contm as instrues que so executadas cada vez que ele invocado.

Variveis locais so aquelas definidas dentro do prprio subalgoritmo e s podem ser utilizadas pelo mesmo.

Parmetros so canais por onde os dados so transferidos pelo algoritmo chamador a um subalgoritmo, e vice-versa. Para que possa iniciar a execuo das instrues em seu corpo, um subalgoritmo s vezes precisa receber dados do algoritmo que o chamou e, ao terminar sua tarefa, o subalgoritmo deve fornecer ao algoritmo chamador os resultados da mesma. Esta comunicao bidirecional pode ser feita de dois modos que sero estudados mais frente: por meio de variveis globais ou por meio da passagem de parmetros.

O tipo de um subalgoritmo definido em funo do nmero de valores que o subalgoritmo retorna ao algoritmo que o chamou. Segundo esta classificao, os algoritmos podem ser de dois tipos:

funes, que retornam um, e somente um, valor ao algoritmo chamador;

procedimentos, que retornam zero (nenhum) ou mais valores ao algoritmo chamador.

Na realidade, a tarefa desempenhada por um subalgoritmo do tipo funo pode perfeitamente ser feita por outro do tipo procedimento (o primeiro um caso particular deste). Esta diferenciao feita por razes histricas, ou, ento, pelo grande nmero de subalgoritmos que se encaixam na categoria de funes.

9.3 Funes

O conceito de Funo originrio da idia de funo matemtica (por exemplo, raiz quadrada, seno, cosseno, tangente, logaritmo, entre outras), onde um valor calculado a partir de outro(s) fornecido(s) funo.

A sintaxe da definio de uma funo dada a seguir:

Funo ( )

Var

Incio

Fim

Temos que:

o nome simblico pelo qual a funo invocada por outros algoritmos;

so os parmetros da funo;

o tipo de dado da informao retornado pela funo ao algoritmo chamador;

consiste na definio das variveis locais funo. Sua forma anloga da definio de variveis num algoritmo;

o conjunto de instrues do corpo da funo.

Dentro de um algoritmo, o comando de invocao de um subalgoritmo do tipo funo sempre aparece dentro de uma expresso do mesmo tipo que o do valor retornado pela funo.

A invocao de uma funo feita pelo simples aparecimento do nome da mesma, seguido pelos respectivos parmetros entre parnteses, dentro de uma expresso. A funo executada e, ao seu trmino, o trecho do comando que a invocou substitudo pelo valor retornado pela mesma dentro da expresso em que se encontra, e a avaliao desta prossegue normalmente.

Dentro de uma funo, e somente neste caso, o comando Retorne usado para retornar o valor calculado pela mesma. Ao encontrar este comando, a expresso entre parnteses avaliada, a execuo da funo terminada neste ponto e o valor da expresso retornado ao algoritmo chamador. Vale lembrar que uma expresso pode ser uma simples constante, uma varivel ou uma combinao das duas por meio de operadores. Esta expresso deve ser do mesmo tipo que o valor retornado pela funo.

O algoritmo a seguir um exemplo do emprego de funo para calcular o valor de um nmero elevado ao quadrado.

Algoritmo Exemplo_de_funo

Var X, Y : real

Funo Quad(w : real) : real

Var Z : real

Inicio

Z := w * w

Retorne Z

Fim

IncioEscreva "Digite um nmero

Leia X

Y := Quad(X)

Escreva X, " elevado ao quadrado = ", Y

Fim.Do exemplo anterior importante notar que:

a funo Quad toma W como parmetro do tipo real, retorna um valor do tipo real e possui Z como uma varivel local real;

o comando de invocao da funo Quad aparece no meio de uma expresso, no comando de atribuio dentro do algoritmo principal.

9.4 Procedimentos

Um procedimento um subalgoritmo que retorna zero (nenhum) ou mais valores ao (sub)algoritmo chamador. Estes valores so sempre retornados por meio dos parmetros ou de variveis globais, mas nunca explicitamente, como no caso de funes. Portanto, a chamada de um procedimento nunca surge no meio de expresses, como no caso de funes. Pelo contrrio, a chamada de procedimentos s feita em comandos isolados dentro de um algoritmo, como as instrues de entrada (Leia) e sada (Escreva) de dados.

A sintaxe da definio de um procedimento :

Procedimento ( )

Var

Inicio

Fim.

Temos que:

o nome simblico pelo qual o procedimento invocado por outros algoritmos;

so os parmetros do procedimento;

so as definies das variveis locais ao procedimento. Sua forma anloga da definio de variveis num algoritmo;

o conjunto de instrues do corpo do procedimento, que executado toda vez que o mesmo invocado.

O exemplo a seguir um exemplo simples, onde um procedimento usado para escrever o valor das componentes de um vetor.

Algoritmo Exemplo_procedimento

Var vet : matriz[1..10] de real

Procedimento ESC_VETOR()

Var i : inteiro

InicioPara i de 1 at 10 faa

Incio

Escreva vet[i]

FimFimProcedimento LER_VETOR()

Var i : inteiro

InicioPara i de 1 at 10 faa

Incio

Leia vet[i]

FimFimInicioLER_VETOR()

ESC_VETOR()

Fim.No exemplo conveniente observar:

a forma de definio dos procedimentos LER_VETOR( ) e ESC_VETOR( ), que no possuem nenhum parmetro, e usam a varivel local i para varrer os componentes do vetor, lendo e escrevendo um valor por vez; e

a forma de invocao dos procedimentos, por meio do seu nome, seguido de seus eventuais parmetros (no caso, nenhum), num comando isolado dentro do algoritmo principal.

9.5 Variveis Globais e Locais

Variveis globais so aquelas declaradas no incio de um algoritmo. Estas variveis so visveis (isto , podem ser usadas) no algoritmo principal e por todos os demais subalgoritmos.

Variveis locais so aquelas definidas dentro de um subalgoritmo e, portanto, somente visveis (utilizveis) dentro do mesmo. Outros subalgoritmos, ou mesmo o algoritmo principal, no podem utiliz-las.

No exemplo a seguir so aplicados estes conceitos.

Algoritmo Exemplo_variveis_locais_e_globais

Var X : real

I : inteiro

Funo FUNC() : real

Var X : matriz[1..5] de inteiro

Y : caracter[10]

Inicio...

FimProcedimento PROC

Var Y : 1gico

Inicio...

X := 4 * X

I := I + 1

...

FimIncio...

X := 3.5

...

Fim.

importante notar no exemplo anterior que:

as variveis X e I so globais e visveis a todos os subalgoritmos, exceo da funo FUNC, que redefine a varivel X localmente;

as variveis X e Y locais ao procedimento FUNC no so visveis ao algoritmo principal ou ao procedimento PROC. A redefinio local do nome simblico X como uma matriz[5] de inteiro sobrepe (somente dentro da funo FUNC) a definio global de X como uma varivel do tipo real;

a varivel Y dentro do procedimento PROC, que diferente daquela definida dentro da funo FUNC, invisvel fora deste procedimento;

a instruo X := 8.5 no algoritmo principal, bem como as instrues X := 4 * X e I := I + 1 dentro do procedimento PROC, atuam sobre as variveis globais X e I.

9.6 Parmetros

Parmetros so canais pelos quais se estabelece uma comunicao bidirecional entre um subalgoritmo e o algoritmo chamador (o algoritmo principal ou outro subalgoritmo). Dados so passados pelo algoritmo chamador ao subalgoritmo, ou retornados por este ao primeiro por meio de parmetros.

Parmetros formais so os nomes simblicos introduzidos no cabealho de subalgoritmos, usados na definio dos parmetros do mesmo. Dentro de um subalgoritmo trabalha-se com estes nomes da mesma forma como se trabalha com variveis locais ou globais.

Funo Mdia(X, Y : real) : real

InicioRetorne (X + Y) / 2

FimNo exemplo anterior, X e Y so parmetros formais da funo Mdia.

Parmetros reais so aqueles que substituem os parmetros formais quando da chamada de um subalgoritmo. Por exemplo, o trecho seguinte de um algoritmo invoca a funo Mdia com os parmetros reais 8 e 7 substituindo os parmetros formais X e Y.

Z := Mdia(8, 7)

Assim, os parmetros formais so teis somente na definio (formalizao) do subalgoritmo, ao passo que os parmetros reais substituem-nos a cada invocao do subalgoritmo. Note que os parmetros reais podem ser diferentes a cada invocao de um subalgoritmo.

9.7 Mecanismos de Passagem de Parmetros

Como foi visto anteriormente, os parmetros reais substituem os formais no ato da invocao de um subalgoritmo. Esta substituio denominada passagem de parmetros e pode se dar segundo dois mecanismos distintos: passagem por valor (ou por cpia) ou passagem por referncia.

9.7.1 Passagem de Parmetros por Valor

Na passagem de parmetros por valor (ou por cpia) o parmetro real calculado e uma cpia de seu valor fornecida ao parmetro formal, no ato da invocao do subalgoritmo. A execuo do subalgoritmo prossegue normalmente e todas as modificaes feitas no parmetro formal no afetam o parmetro real, pois trabalha-se apenas com uma cpia do mesmo.

Algoritmo Exemplo_parametro_por_valor

Var X : inteiro

Procedimento PROC(Y : inteiro)

IncioY := Y + 1

Escreva "Durante Y = , Y

Fim

IncioX := 1

Escreva "Antes X = , X

PROC(X)

Escreva "Depois X = ", X

Fim.O algoritmo anterior fornece o seguinte resultado:

Antes X = 1

Durante Y = 2

Depois X = 1

Isto certifica que o procedimento no alterou o valor do parmetro real X durante sua execuo.

Este tipo de ao possvel porque, neste mecanismo de passagem de parmetros, feita uma reserva de espao em memria para os parmetros formais, para que neles seja armazenada uma cpia dos parmetros reais.

9.7.2 Passagem de Parmetros por Referncia

Neste mecanismo de passagem de parmetros no feita uma reserva de espao em memria para os parmetros formais. Quando um subalgoritmo com parmetros passados por referncia chamado, o espao de memria ocupado pelos parmetros reais compartilhado pelos parmetros formais correspondentes. Assim, as eventuais modificaes feitas nos parmetros formais tambm afetam os parmetros reais correspondentes.

Um mesmo subalgoritmo pode utilizar diferentes mecanismos de passagem de parmetros, para parmetros distintos. Para diferenciar uns dos outros, convencionou-se colocar o prefixo VAR antes da definio dos parmetros formais passados por referncia. Se por exemplo um procedimento tem o seguinte cabealho:

Procedimento PROC( X, Y : inteiro; Var Z : real; J: real)

Ento:

X e Y so parmetros formais do tipo inteiro e so passados por valor;

Z um parmetro formal do tipo real passado por referncia;

J um parmetro forma