ALP

Page 1

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

ALGORITMO E LINGUAGEM DE PROGRAMAÇÃO

Belém-Pará 2008


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

DARLINDO MARIA PEREIRA VELOSO FILHO COORDENADOR DA UAB/CEFET-PA

BRUNO HENRIQUE GARCIA LIMA GERENTE DO NEAD

OTÁVIO FERNANDES LIMA DA ROCHA COORDENADOR DE NIVELAMENTO

Maria de Nazaré Rodrigues Pereira ELABORADORES

Algoritmo e Linguagem de Programação

EDSON ARY DE OLIVEIRA FONTES DIRETOR GERAL


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Semana 1 ................................................................................................ 4 Semana 2 .............................................................................................. 29 Semana 3 .............................................................................................. 59 Semana 4 .............................................................................................. 67 Semana 5 .............................................................................................. 91 Semana 6 ............................................................................................ 105 Semana 7 ............................................................................................ 118 Semana 8 ............................................................................................ 128

Algoritmo e Linguagem de Programação

SUMÁRIO


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

APRESENTAÇÃO

O Centro Federal de Educação Tecnológica do Pará (CEFET-PA) em sua trajetória de quase um século vem consolidando lugar de destaque com a Educação Profissional no Estado do Pará. Desde 1909, com o nome Escola de Aprendizes Artífices do Pará, sendo modificada ao longo dos anos mediante as necessidades sociais. Posteriormente a Instituição passou atuar com a Educação Profissional atendendo cursos de nível técnico, licenciaturas nas áreas das ciências e tecnologias, cursos de tecnólogos e engenharias, e também intensificou a oferta de cursos profissionalizantes de curta duração como forma de ampliar o acesso a Educação Profissional para a comunidade. A partir de 2004 com a implantação do Núcleo de Educação Aberta e a Distância do CEFET-PA (NEAD) que visa ampliar a oferta do ensino sem fronteiras, valorizando o papel da Educação a Distância. As transformações desenvolvidas nos últimos anos, nas diversas áreas de conhecimento, têm aproximado o saber humano cada vez mais dos instrumentos tecnológicos, proporcionando um maior desenvolvimento científico à sociedade. Nesse contexto em que as informações se processam de forma cada vez mais velozes exige-se uma permanente atualização de conhecimentos e ferramentas tecnológicas que proporcionem uma rede de comunicação e interação na sociedade em seus diferentes âmbitos. Esperamos que este material seja de grande valia para você e deverá ser um complemento para o desenvolvimento de suas atividades permitindo um aprendizado contínuo, autônomo e duradouro. Desejamos sucesso a você.

Darlindo Maria Pereira Veloso Filho Coordenador UAB/CEFET-PA

Algoritmo e Linguagem de Programação

Caro Acadêmico,


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Roteiro Nesta primeira semana, será trabalhado: a) Introdução a Construção de Algoritmos; b) Estudo de Sequências. c) Conceitos básicos da Linguagem Java Roteiro de Atividades Passo Passo Passo Passo Passo

1 2 3 4 5

-

Leitura do Texto sobre Introdução a Algorimos e Sequências; Realização dos Exercícios de Fixação; Realização das Tarefas de Algoritmos (Introdução). Leitura do Texto sobre os conceitos básicos da Linguagem Java Realização dos Exercícios de Fixação;

Algoritmo e Linguagem de Programação

Semana 1

4


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

1.1 – Tipos de Dados Primitivos

Algoritmo e Linguagem de Programação

Os dados primitivos a serem manipulados em um computador são representados pelos elementos básicos a serem tratados (processados) que são representados por três tipos de dados (tipos primitivos): dados numéricos (inteiros e reais), dados caracteres e dados lógicos:

5

? Dados primitivos

numéricos inteiros – caracterizam-se por serem representados por valores numéricos inteiros positivos ou negativos, excluindo-se qualquer valor numérico real (fracionário). Exemplos deste tipo de dado: -1, 2, 0, 12, 1000;

? Dados primitivos

numéricos reais – são representados por valores numéricos reais positivos, negativos e valores fracionários. Exemplos deste tipo de dado: -1, -1.3, 2, 1000, 500.98;

? Dados primitivos lógicos – são representados por valores do tipo verdadeiro e falso, sim e não. Este tipo de dado também é conhecido pela identificação tipo booleano. Exemplos: .Falso., .F., .Verdadeiro., .V., .Sim., .S., .Não., .N.;

? Dados primitivos caracteres – caracterizam-se por serem representados por valores delimitados entre parênteses e que contenham letras, números e símbolos especiais. Este tipo de dado também é conhecido pela identificação tipo literal ou tipo string. São exemplos: “-1”, “casa”, “5088-8888”, “@#^&&”. 1.2 – Variáveis e Constantes Conceitua-se como variável aquilo que é sujeito a variações, que é incerto, instável ou inconstante. Os dados manipulados em um computador, sejam eles valores inteiros, valores reais, valores caracteres ou valores lógicos, são na sua maioria também variáveis. Do ponto de vista de programação de computadores, pode-se considerar que variável é a região de memória que será utilizada pelo programa para armazenar um certo tipo de dado por um determinado espaço de tempo. Assim sendo, qualquer valor a ser processado em um computador necessita ser previamente armazenado em uma região de memória, denominada variável. As variáveis definidas na memória de um computador funcionam como as gavetas de um grande arquivo, tendo como característica a peculiaridade que cada gaveta (variável) pode armazenar apenas um valor por vez, seja esse valor um número inteiro, um número real, uma seqüência de caracteres ou um conteúdo lógico. Assim como as gavetas de um arquivo são identificadas por etiquetas, também é necessário identificar as variáveis a serem utilizadas em um computador. Desta forma o valor armazenado pode ser utilizado a qualquer momento, pois pode facilmente ser identificado.


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

O nome de uma variável é utilizado para sua identificação e posterior uso dentro de um programa. Desta forma, é necessário estabelecer algumas regras para a devida utilização de variáveis dentro de um programa:

alguma, um número; sempre deve ser uma letra;

? O nome de

uma variável não pode possuir espaços em branco. Caso necessite separar segmentos, utilize o símbolo “_” (underscore ou underline);

? Não pode ser nome de uma variável uma palavra reservada a uma instrução da linguagem de codificação de um programa; ? Não podem

ser utilizados na formação de nomes de variáveis outros caracteres a não ser letras, números e o símbolo underline (ou undescore). Uma variável pode exercer dois papéis dentro de um programa. Um papel de ação, quando é modificada ao longo do processamento de um programa para apresentar um determinado resultado, ou o papel de controle, quando essa variável pode estar sendo “vigiada” e controlada durante a execução do fluxo de um programa. As constantes serão valores fixos, normalmente encontrados como valores de peso em fórmulas matemáticas para dar equilíbrio ao cálculo. Assim sendo, constante é tudo aquilo que é fixo ou estável. E existirão vários momentos em que este conceito deverá estar em uso. Por exemplo, o valor 1.23 da fórmula seguinte é uma constante: RESULTADO = ENTRADA*1.23. 1.3 – Operadores aritméticos Com certeza uma das exigências de um computador é a execução de cálculos matemáticos. Neste sentido os computadores são excelentes. Assim sendo, tanto variáveis como constantes podem ser utilizadas na execução de cálculos matemáticos. Os cálculos matemáticos são operações comandadas por operadores aritméticos que podem ser classificados em duas categorias, sendo binários ou unários. São binários quando atuam em operações de exponenciação, multiplicação, divisão, adição e subtração. São unárias quando atuam na inversão de um valor, atribuindo a ele o sinal positivo ou negativo. Veja em seguida a tabela de prioridade matemática existente quando da utilização destes operadores:

Algoritmo e Linguagem de Programação

? Nomes de variáveis podem ser atribuídos com um ou mais caracteres; ? O primeiro caractere do nome de uma variável não pode ser, em hipótese

6


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

Algoritmo e Linguagem de Programação

ABERTA DO BRASIL

Operador

Operação

Tipo

+ ? / div * + -

Manutenção de sinal Inversão de sinal Exponenciação Divisão Divisão Multiplicação Adição Subtração

Unário Unário Binário Binário Binário Binário Binário Binário

Prioridade Matemática 1 1 2 3 4 3 4 4

Tipo de retorno de Resultado Positivo Negativo Inteiro ou Real Real Inteiro Inteiro ou real Inteiro ou real Inteiro ou real

1.4 – Expressões Matemáticas É muito comum a necessidade de trabalhar com expressões matemáticas, uma vez que a maior parte do trabalho de processamento computacional está relacionada e envolve a utilização de cálculos matemáticos. Tanto que, toda operação matemática é sempre considerada um processamento computacional do ponto de vista de programação. Porém, nem todo o processamento computacional executado por um computador é uma operação matemática. As expressões matemáticas são definidas pelo relacionamento existente entre variáveis e constantes numéricas com a utilização dos operadores aritméticos. Considere a fórmula: ÁREA = ð . RAIO² para o cálculo da área de uma circunferência, em que estão presentes as variáveis ÁREA e RAIO, a constante ð (pi = 3.14159) e os operadores aritméticos de multiplicação e também a operação de potência, elevando o valor variável RAIO ao quadrado. Assim sendo, a fórmula em questão deveria ser definida como: ÁREA ←3.14159 * RAIO ↑2. As expressões aritméticas em computação são escritas de uma forma um pouco diferente da matemática, por exemplo, a expressão X = {43. [55 : (30 + 2) ] } será escrita na forma computacional como X ←(43 * (55 / (30 + 2))). Perceba que as chaves e colchetes são abolidos, utilizando-se em seu lugar apenas os parênteses. E também foi substituído nos dois exemplos o sinal (=) igual a pelo sinal de (←), o qual é referenciado pela nomenclatura implicado ou atribuído. O sinal implicado ou atribuído (←) é utilizado para indicar que o valor de uma expressão matemática está sendo armazenado em uma variável. Observe ainda a fórmula utilizada para calcular a área de um triângulo,em que é necessário efetuar a multiplicação da base pela altura e em seguida dividir pela constante 2. Como ficaria? Observe a fórmula padrão: BASE.ALTURA ÁREA = ____________________ 2

7

Ela deveria ser escrita como: ÁREA ←(BASE* ALTURA) / 2


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

1.5 – Instruções Básicas: As instruções básicas são representadas pelo conjunto de palavras-Chave (vocabulário) de uma determinada linguagem de programação, que tem por finalidade comandar em um computador o seu funcionamento e a forma como os dados armazenados devem ser tratados.

As instruções básicas em português estruturado utilizadas nesta obra são: Início, fim, var, programa, enquanto fim-enquanto, se, então, senão, fimse, para, fim-para, escreva, leia, faça, repita, até-que, conjunto, inteiro, real, caractere, lógico, tipo, registro, fim-registro, procedimento, função, caso e fim-caso. 1.6 – Considerações Operacionais Para que seja possível efetuar o trabalho de programação e a continuidade do estudo desta obra, é necessário levar em consideração alguns detalhes operacionais, tais como:

? Todo problema computacional a ser resolvido deve ser previamente entendido, passado para a notação gráfica na forma de diagrama de quadros para então ser escrito em código português estruturado; ? Nesta obra

toda referência feita a uma instrução será escrita em letra minúscula em formato negrito;

? As referências feitas a uma variável serão escritas em letra maiúscula em formato itálico; ? Qualquer valor atribuído a uma variável será feito com o símbolo ← (seta para a esquerda) tanto no diagrama de quadros quanto em código português estruturado. Para que seja criado um programa de computador, devem-se levar em consideração três pontos básicos de trabalho:

Algoritmo e Linguagem de Programação

Para a confecção deste livro foi adotado o conceito português estruturado. Assim sendo, será utilizado daqui para a frente um conjunto de palavras reservadas, que não pode ser usado para atribuir nomes de programas e de variáveis.

? Entrada de dados; ? Processamento de dados; ? Saída de informações. Todo programa de computador executa de alguma forma estes três conceitos. Se os dados forem entrados de forma errada, serão processados de forma errada e resultarão em saídas de informações erradas.

8


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

Algoritmo e Linguagem de Programação

ABERTA DO BRASIL

Uma entrada e uma saída podem ocorrer dentro de um computador de diversas formas. Por exemplo, uma entrada pode ser feita via teclado, modem, leitores óticos, disco, entre outros. Uma saída pode ser feita em vídeo, impressora, disco, entre outras formas. Devido a esta grande variedade, os programas deste capítulo foram escritos com as instruções leia e escreva para determinarem, respectivamente as operações de entrada e saída. Quanto ao processamento, está sendo referenciado com o símbolo de atribuição (←) em várias operações de cunho simples. 1.7 – Exercícios de Aprendizagem Com o objetivo de colocar em prática o que foi exposto até este momento e demonstrar o uso do diagrama de quadros e do português estruturado, considere como exemplo os problemas computacionais apresentados em seguida: 1.7.1 – Primeiro Exemplo Elaborar um programa de computador que efetue a leitura de dois valores numéricos inteiros execute a soma dos valores e apresente o resultado obtido. É necessário levar em consideração que o programador sempre estará diante de um problema a ser resolvido. Este problema deve primeiro ser entendido pelo programador para que depois ele consiga colocá-lo dentro de um computador. Desta forma, o segredo de uma boa lógica está na compreensão adequada do problema a ser solucionado. Com relação ao problema proposto, é necessário separá-lo dentro dos conceitos de entrada, processamento e saída. Para tanto, observe a estrutura do algoritmo com relação ao problema da leitura dos dois valores (que não são conhecidos e devem ser representados por variáveis) e sua respectiva soma (conseqüência dos valores informados, a qual também é uma incógnita). Algoritmo Entrada – ler dois valores inteiros, no caso representados pelas variáveis A e B; Processamento – efetuar a soma das variáveis A e B, implicando o seu resultado na variável R; Saída – apresentar o valor da variável R após a operação de som dos dois valores fornecidos.

Perceba que o algoritmo é a transcrição (interpretação) passo a passo de um determinado problema. Um algoritmo pode ser feito de várias formas diferentes. Pode ser escrito, pode ser diagramado, pode ser codificado.

9


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Diagrama de Quadros Completada a fase de interpretação do problema, passa-se para a fase de diagramação do algoritmo, que pode ser feita de duas formas: trabalhando com o estilo de diagrama de blocos tradicional ou com o diagrama de quadros, que é o tema desta obra.

Início Leia A,B R? A+B Escreva R Fim

Observe que a seqüência de comandos é definida em quadros em que são indicadas as ações de cada instrução. Observe que as operações de entrada e saída são indicadas com as instruções leia e escreva. Português Estruturado Após definir o diagrama de quadros, será efetuada a fase de codificação do programa em português estruturado. Esta fase obedece rigidamente (sem nenhuma alteração) ao que está definido no diagrama de quadros, pois é ele a representação gráfica da lógica do programa a ser codificado. O diagrama facilita também a visualização de todas as variáveis que estão em uso. Isto é necessário, pois a maior parte das linguagens estruturadas exige que se reserve espaço de memória para todas as variáveis existentes dentro do programa. Observe que o exemplo faz uso de três variáveis (A, B e R), as quais devem ser primeiro relacionadas antes do início do programa, para depois, utilizá-las no corpo do programa.

Programa SOMA-NÚMEROS Var R, A, B : inteiro

Algoritmo e Linguagem de Programação

Programa Soma-Números

Após relacionar as variáveis que serão utilizadas no programa com a instrução var, passa-se para a fase de montagem do que está estabelecido no diagrama de quadros entre os quadros início e fim. Observe que o bloco de instruções de programa, indicado entre as instruções início e fim, é apresentado em português estruturado deslocado um pouco para a direita. Este estilo de escrita deve ser obedecido, para facilitar a leitura de um bloco de programa, recebendo o nome de indentação.

10


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Início leia A leia B

Algoritmo e Linguagem de Programação

R A+B Escreva R Fim Após a leitura dos valores para as variáveis A e B, eles serão somados e implicados

( ) à variável R, a qual será apresentada com o valor da soma processada. A seguir, é apresentado o programa completo: Programa SOMA_NÚMEROS Var R, A, B : inteiro Início Leia A Leia B

R A+B Escreva R Fim Daqui para a frente o processo de montagem de um programa fica mais fácil, basta que o leitor siga as instruções anteriores. 1.7.2 – Segundo Exemplo Elaborar um programa de computador que efetue a leitura de dois valores numéricos reais e apresente o resultado da soma dos quadrados dos valores lidos. O perfeito entendimento do problema proposto garante o sucesso na operação de programação. Observe que o problema sugere apresentar o resultado da soma dos quadrados dos valores lidos. Isto implica que, ao ler cada um dos valores, eles devem ser elevados ao quadrado separadamente para em seguida serem somados e proporcionarem o resultado esperado. Algoritmo 1.

Entrada – ler dois valores reais, no caso representados pelas variáveis A e B;

2. Processamento – efetuar a soma dos quadrados das variáveis A e B implicando o seu resultado na variável R; 3.

11

Saída – apresentar o valor da variável R.


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Diagrama de Quadros Completada a fase de interpretação do problema, passa-se para a fase de diagramação do algoritmo como apresentada anteriormente, utilizando diagrama de quadros.

Português Estruturado Programa SOMA_QUADRADOS Var R, A, B : real Início Leia A Leia B

← ↑

R A 2+B Escreva R

↑2

Fim

1.7.3 – Terceiro Exemplo Elaborar um programa de computador que efetue e apresente o cálculo da área de um trapézio. Observe que para apresentar o valor da área de um trapézio, torna-se necessário conhecer sua fórmula de cálculo. Neste sentido, a área de um trapézio é calculada pela soma da base maior com a base menor, multiplicada pela altura, tudo isto dividido por dois.

Algoritmo e Linguagem de Programação

Programa Soma_Quadrados Início Leia A,B R? A? 2+B?2 Escreva R Fim

Algoritmo 1. Entrada – ler três valores que representem a base maior (variável BS_MAIOR), a base menor (variável BS_MENOR) e a altura (variável H); 2. Processamento – efetuar a soma das variáveis A e B e multiplicá-las pela variável H. Na seqüência, dividir o cálculo anterior por dois e implicar o seu resultado na variável R; 3.

Saída – apresentar o valor da variável R.

12


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

Diagrama de Quadros

13

P ro g ra m a á rea _ T rap é zio I n íc io L e ia B S _ M a io r L e ia B S _ M e n o r L e ia H R ? ( ( B S _ M a io r + B S _ M e n o r ) * H ) / 2 E s c rev a R F im Português Estruturado Programa ÁREA_TRAPÉZIO Var R, BS_MAIOR, BS_MENOR, H : real Início Leia BS_MAIOR Leia BS_MENOR Leia H

R ((BS_MAIOR + BS_MENOR) * H) / 2 Escreva R Fim Linguagem Java 1.1

História de Linguagem Java

Com a evolução dos microprocessadores uma importante contribuição para a data foi a possibilidade de desenvolvimento de computadores pessoais com alcance mundial de 300 milhões. Computadores pessoais têm um profundo impacto em pessoas e organizações na administração e conduta de seus negócios. Muitas pessoas acreditam que a próxima maior área de microprocessadores terá um profundo impacto no consumo de dispositivos eletrônicos (software para eletrodomésticos). Por causa disto, a Sun Microsystems fundou uma corporação internacional composta de quatro integrantes para a elaboração de um projeto de codinome Green, em 1991. O projeto resultou do desenvolvimento de uma linguagem de programação baseada em C e C++, chamada OAK (carvalho) que era uma árvore que havia em cima da janela da Sun. Mais tarde descobriram que já existia uma linguagem de computador chamada OAK. A origem do nome Java vem de uma homenagem a um café bastante conhecido nos EUA e, também, por ser uma bebida admirada pelos programadores que avançam em suas atividades até altas horas da noite. A Sun anunciou formalmente a linguagem de programação Java em uma conferência em maio de 1995. Ordinariamente, um evento que mereceu muita atenção. Atualmente Java é de interesse imediato para os empresários por causa do fenômeno da World Wide Web. Java é agora usada para criar páginas para Web dinâmicas e com conteúdo interativo, para o desenvolvimento de aplicações em larga escala, para a funcionalidade de servidores Web, para prover aplicações para dispositivos de consumo (telefones celulares, pagers, microondas), etc.


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Em vez de ir de encontro à Sun e seu Java, a Microsoft assinou, em 7 de dezembro de 1995, um acordo de intenções com a Sun em torno de uma licença de fonte da tecnologia Java. Além disso, foi um reconhecimento importante da maior empresa de software do mundo, de que a tecnologia Sun é da maior qualidade e está muito adiantada no sentido de estabelecer o Java como padrão aberto para a programação na Internet.

Java: “Uma linguagem simples orientada para objetos, distribuída, interpretada, potente, segura, de arquitetura neutra, portável, de alto desempenho, multiprocessada e dinâmica.” (Sun Microsystems). Nós acreditamos em Java. A idéia da Sun Microsystems na criação de Java foi brilhante: basear uma nova linguagem nas duas mais utilizadas no mundo C e C++, ”(Dr. Harvey M. Deitel). “Java é certamente a linguagem do próximo milênio para implementações baseadas na Internet e aplicações baseadas em Intranet e muitos outros softwares para comunicação em rede (celulares, pagers, etc.).” (Dr. Harvey M. Deitel). “Como linguagem, o Java pode ser considerado como a grande sensação desenvolvida no final do último milênio. A primeira proposta viável de linguagem universal multiplataforma” (Developers`Magazine). 1.2

Características da Linguagem Java

? Orientada para objetos ? Interpretada ? Neutra em relação à arquitetura e portável ? Dinâmica e distribuída ? Simples ? Concisa ? Robusta ? Segura ? Multithreading

Algoritmo e Linguagem de Programação

Com o Java, a Sun estabeleceu a primeira linguagem de programação que não estava atada a nenhum sistema operacional ou microprocessador em particular. Os aplicativos escritos em Java são executados onde quer que seja, eliminando uma das maiores dores de cabeça do usuário de computador: a incompatibilidade entre os sistemas operacionais e as versões dos sistemas operacionais. Para onde o Java for, agora, depende da Sun, da Microsoft...e de você.

1.2.1 Orientada Para Objetos Java é uma linguagem de programação orientada pata objetos. Do ponto de vista do programador, isso significa que o programa é construído em função dos dados a serem manipulados e dos métodos que manipulam esses dados. Juntos, os dados e os métodos que os manipulam procuram simular o comportamento dos objetos do mundo real. Daí o nome orientação para objetos.

14


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

Em um sistema orientado para objetos, uma classe é uma coleção que contém ou encapsula, os dados e os métodos que operam sobre esses dados. Conjuntamente, os dados e os métodos descrevem o estado e o comportamento de um objeto. Java vem com um extenso conjunto de classes, arranjadas em packages, que podemos usar em nossos programas. Por exemplo, Java oferece classes para criação de componentes com o usuário (o package Java.awt), classes que lidam com entrada de saída (package Java.io). A classe Object (do package Java.lang) funciona como a raiz de toda a hierarquia de classes Java. Ao contrário de C++, Java foi projetado para ser orientado para objetos desde o início. Quase tudo é representado por objetos em Java. As únicas exceções são os tipos primitivos numéricos, de caracteres e booleanos. As strings são representadas por objetos em Java, assim como outras construções importantes da linguagem, como threads (linhas de execução). Uma classe é a unidade básica de compilação e de execução em Java. Até mesmo um programa Java é uma classe. 1.2.2 Interpretada (e Compilada) Um programa feito em Java é compilado gerando então um arquivo em bytecode (código binário). Esse bytecode possui neutralidade de arquitetura (também usamos o termo “independente de plataforma” – o que significa a mesma coisa). Esse bytecode não está completo até ser interpretado por ambiente de run-time Java. Como cada ambiente de run-time Java é designado para uma plataforma específica, o produto final irá funcionar nessa plataforma específica. Essas são boas notícias para os desenvolvedores. Isso significa que o bytecode independe da plataforma que você esteja desenvolvendo. Isso significa que você poderá escrever e compilar um applet em seu sistema Wimdows e instalá-lo em sua página Web. Três pessoas diferentes em três máquinas diferentes – cada uma com seu ambiente, todas poderão dar uma olhada em seu novo applet. Por que essa combinação de compilação e interação é uma característica positiva? Em primeiro lugar, ela facilita a segurança e a estabilidade. O ambiente Java contém um elemento denominado linker, que verifica a entrada de dados na sua máquina para assegurar que ela não contenha nenhum arquivo intencionalmente prejudicial (segurança) nem arquivos que possam danificar o funcionamento do seu computador (consistência). Em segundo lugar e mais importante, essa combinação de compilação e interpretação atenua as preocupações sobre incompatibilidade de versões. O fato de que a parte final da compilação esteja sendo feita por um dispositivo específico de plataforma, que é mantido pelo usuário final, libera o desenvolvido da responsabilidade de manter várias fontes para diversas plataformas. A interpretação também permite que os dados sejam incorporados em run-time, que é fundamento do comportamento dinâmico da linguagem Java. 1.2.3 Neutra em Relação à Arquitetura e Portável

15

Vimos que os programas Java são compilados para o formato de bytecode, que é neutro em relação à arquitetura dos computadores. Por isso, um aplicativo Java pode rodar em qualquer sistema, desde que exista uma implementação da JVM (Java Virtual Machine), a máquina virtual Java, para esse sistema. Isso é particularmente importante para as aplicações distribuídas através da Internet ou de outras redes heterogêneas.


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

A portabilidade de Java tem muito a ver com o fato de a linguagem ser interpretada e definir um formato de bytecode padronizado e neutro em relação a arquiteturas. Mas Java vai ainda mais longe, assegurando que não existem aspectos “dependentes de implementação” na especificação da linguagem. Por exemplo, Java especifica explicitamente o tamanho de cada um dos tipos de dados primitivos, bem como seu comportamento aritmético. Isso é diferente do que acontece em C, por exemplo, onde um tipo int pode ter comprimento 16, 32 ou 64 bits, dependendo da plataforma. Embora seja tecnicamente possível escrever programas não-portáveis em Java, é relativamente fácil evitar dependências de plataforma expostas pela API Java, escrevendo programas verdadeiramente portáveis, ou “Java Puro”. O programa “100% Purê Java” da Sun ajuda os desenvolvedores a ter certeza (e obter certificação) de que seu código é portável. Os cuidados que os programadores precisam tomar para evitar armadilhas que tornam os programas não-portáveis são relativamente simples. Assim, realmente é possível seguir o lema que se tornou uma das marcas registradas de Java: “Escreva um vez, rode em qualquer lugar” (“Write once, run anywhere”). 1.2.3 Dinâmica e Distribuída O Java é uma linguagem mais dinâmica do que o C ou C++. Ao contrário de qualquer dessas linguagens, o Java foi projetado para se adaptar a ambientes de evolução. Um dos principais problemas no desenvolvimento que usa C++ é que você pode, de repente, e sem querer, tornar-se dependente de outras pessoas. Isso se deve às bibliotecas de classe, um conjunto de componentes plug and play. Como o código C++ tem de ser implementado em bibliotecas de classes, se você licenciar e utilizar uma biblioteca de classes de terceiros em seu software, e essa empresa posteriormente alterar ou atualizar a biblioteca, é mais do que provável que você tenha que reagir. Essa reação poderia variar entre quase nada e a recompilação e redestribuição de seu próprio software.

Algoritmo e Linguagem de Programação

Porém esse enfoque de neutralidade em relação à arquitetura também tem utilidade além das aplicações distribuídas via redes. Qualquer desenvolvedor, que esteja no mercado de software de hoje, vai querer, desenvolver versões de seus aplicativos que possam rodar em PCs, Macs e workstations UNIX. Acontece que aplicativos só na plataforma PC rodam atualmente vários tipos de UNIX, além do Windows 95, Windows 98 e Windows NT; existe o Apple Macintosh tradicional e novo Macintosh Powerpc, além de inúmeras outras plataformas de computação. O fato é que está ficando cada vez mais difícil produzir software para todas as plataformas existentes. Se o aplicativo for escrito em Java, porém, ele poderá rodar em todas as plataformas atuais, e em outras que venham a surgir.

O Java, por outro lado, realiza as interconexões entre os módulos posteriormente. Esse é um uso mais eficiente e mais fácil de seguir do paradigma¹ orientado para objetos e também evita muito bem o problema da biblioteca. Como o Java retarda a vinculação de módulos, as bibliotecas podem ser atualizadas e modificadas sempre que necessário. Os métodos e as variáveis de instância podem ser acrescentados ou excluídos sem nenhum impacto negativo sobre os clientes das bibliotecas.

16


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

Uma das razões que tornam a linguagem dinâmica boa para criação de protótipos é que ela não necessita que você tome decisões logo. Embora seja dinâmico, o Java pede que os programadores façam suas escolhas explicitamente, mas há guardas de segurança incorporados no ambiente Java para evitar a mais remota chance de pane do seu sistema. Por exemplo, se você escrever uma chamada para um método e cometer um erro, será alertado para o erro quando tentar compilar a fonte. Outra característica de Java é seu caráter distribuído. Isso significa que Java proporciona considerável suporte de alto nível à utilização em redes. Por exemplo, a classe URL e outras classes relacionadas, contidas no Packagejava.net tornam quase tão fácil ler um arquivo ou outro recurso remoto quanto ler um arquivo local. 1.2.4 Simples Um dos objetivos dos criadores de Java foi criar uma linguagem que qualquer programador pudesse aprender rapidamente. Para conseguir essa simplicidade, o número de construções da linguagem foi mantido relativamente pequeno. Outro objetivo do projeto era fazer com que a linguagem parecesse familiar para muitos programadores, a fim de facilitar a migração. O resultado é que um programador C ou C++ reconhecerá imediatamente em Java muitas construções dessas linguagens Por outro lado, para manter a linguagem familiar, mas, ao mesmo tempo pequena, os projetistas de Java removeram vários recursos disponíveis em C e C++. Um problema enfrentado pelos programadores em C e C++ é o gerenciamento e armazenamento, ou seja, a alocação e liberação de memória. Normalmente, um programador em C precisa estar atento para a quantidade de memória que o programa está usando. Quando um trecho da memória não está mais sendo utilizado, o programador precisa se assegurar de que o programa o liberou para possibilitar sua reutilização. Isso é ainda mais difícil do que parece, especialmente em programas grandes, e é a principal causa de leaks e bugs de memória. Ao programar em Java, você não precisa se preocupar com esses problemas. O sistema Java tem um coletor de lixo automático embutido (garbage collection). O coletor de lixo simplifica a programação em Java. Por causa de sua coleta de lixo automática, o Java não apenas facilita a programação, como também diminui radicalmente o número de bugs e elimina o estorvo do gerenciamento de memória. Alguns recursos existentes em C/C++ inexistentes em Java

? Comando goto

(substituído por break e continue labels e pelo mecanismo de manuseio de exceções)

17

? Arquivos de cabeçalho (header files) ? Pré-processador ? Construções struct e union ? Sobrecarga de operadores ? Herança múltipla ? Ponteiros


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Este último aspecto, a eliminação da possibilidade de manipular ponteiros e sua aritmética, é a simplificação mais importante de Java em relação a C/C++. Os ponteiros são um dos aspectos da programação em C e C++ que mais propiciam o aparecimento de bugs. Como Java não tem structures, e os arrays e strings são representados por objetos, não há necessidade de ponteiros.

1.2.5

Concisa

Um dos recursos do Java que a Sun se esqueceu de mencionar em sua definição é o seu tamanho – ou a falta dele. Como um efeito colateral de ser simples, o Java é muito pequeno. Lembre-se de que um dos objetivos originais do Java era facilitar a construção de softwares que rodassem de forma independente em máquinas pequenas. O módulo *7 original foi desenvolvido para ter apenas 3MB de memória principal. O Java pode rodar muito bem em computadores pessoais com pelo menos 4MB de RAM ou até em videocassetes, telefones. O tamanho de interpretador básico e o suporte de classe é cerca de 40K de RAM; acrescentando as bibliotecas padronizadas básicas e o suporte de thread (essencialmente um microkernel autocontido) adiciona 175K extras. O total combinado de aproximadamente 215K é significativamente menor do que as linguagens de programação e ambientes comparáveis. 1.2.6 Robusta A tecnologia Java foi criada para propiciar a escrita de software altamente confiável e robusto. É claro que Java não elimina a necessidade de procedimentos para assegurar a qualidade do software; como em qualquer outra linguagem, um programador incompetente ainda consegue escrever um software cheio de bugs em Java. Contudo, Java elimina certos tipos de erros de programação, o que torna consideravelmente mais fácil escrever software confiável e de qualidade. Java é uma linguagem com tipagem forte (strong typing). Isso viabiliza uma abrangente checagem em tempo de compilação para evitar problemas em potencial no casamento de tipos. Na verdade, Java tem tipagem ainda mais forte que C++. Isso porque, para manter a compatibilidade com C, C++ implementa uma série de tolerâncias em tempo de compilação, especialmente no que diz respeito a declarações de funções. Java exige declarações explícitas dos métodos, não permitindo as declarações implícitas no estilo permitido em C. Essas rigorosas exigências asseguram que o compilador possa detectar erros nas chamadas aos métodos, o que leva a programas mais confiáveis.

Algoritmo e Linguagem de Programação

Se você está começando a achar que Java é apenas uma versão light de C ou C++, uma espécie de linguagem de scripts, o que posso dizer é: não faça um julgamento precipitado. Familiarize-se antes com as soluções oferecidas por Java, e você verá que se trata de uma linguagem completa, elegante e poderosa.

A ausência de ponteiros e sua aritmética é outra significativa simplificação de Java. Isso aumenta a robustez dos programas Java, abolindo uma infinidade de bugs relacionados com ponteiros. Ademais, todos os acessos a arrays e strings são checados em tempo de execução para assegurar que estejam dentro dos limites, eliminando a possibilidade de sobrescrita de memória e corrupção de dados. As conversões de um tipo de objeto em outro também são checadas em tempo de execução, para assegurar que são legais. 18


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

Finalmente, e muito importante, a coleta de lixo automática de Java retira do programador muitas das tarefas de limpeza normalmente associadas ao gerenciamento de memória, o que ajuda a evitar bugs perniciosos relacionados com a alocação e desalocação de memória. O manuseio de exceções (exception handling) é outra característica importante de Java, que ajuda a tornar os programas mais robustos. Uma exceção é um sinal de que algum tipo de condição inesperada ocorreu, como um erro de “arquivo não encontrado”. Com a ajuda dos comandos try/catch/finally, é possível agrupar todo o código de manipulação de erros em um único local, o que simplifica grandemente a tarefa de manipulação e recuperação de erros. 1.2.7 Segura O Java é seguro. Criado para ambientes de rede, os aplicativos Java evitam a introdução de vírus nos sistemas, pois tem acesso restrito aos recursos locais, ou seja, não são capazes de acessar heaps, stacks ou memória do sistema. A autenticação do usuário é implementada com um método de chave pública de criptografia. Alguns dos outros recursos, como a consistência e o fato de que o Java é interpretado e também compilado, auxiliam a segurança. Por exemplo, o fato de os programas em Java não poderem acessar a memória significa que eles podem ser executados com segurança. Basicamente, o Java é seguro porque foi projetado para ser seguro. Como dissemos, os programas em Java primeiro são compilados em instruções de bytecodes, diferentemente de outros conjuntos de instruções, não têm plataforma específica e contém informações de tipos extras. Essas informações de tipo podem ser usadas para verificar a legalidade do programa e possíveis violações de segurança. O Java usa um método novo e singular de chamar funções. Tradicionalmente, os programas de PC chamam funções por um endereço numérico. Como esse endereço é apenas uma seqüência numérica que pode ser construída de acordo com a vontade do programador, qualquer número pode ser usado para mandar o programa executar uma função. Isso proporciona um nível de anonimato que impossibilita dizer quais funções realmente serão usadas quando o programa for executado. O Java, por outro lado, usa nomes. Os métodos e variáveis podem ser acessados somente por nome, o que significa que é fácil determinar que métodos e funções estão atualmente em uso. Esse processo de verificação é usado pra garantir que o bytecode não tenha sido contaminado ou alterado, e que esteja de acordo com as restrições da linguagem Java. Mesmo que um applet hostil consiga de alguma forma escapar do processo de verificação, o percentual de dano que ele pode causar é extremamente limitado. Isso ocorre porque os applets Java são executados em um ambiente restrito. Dentro desse ambiente, o applet Java não pode executar certas funções perigosas, a menos que o usuário final o permita.

19


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Talvez pelo fato de Java estar fortemente associado à Internet, um dos aspectos mais divulgados da linguagem é sua segurança. Isso é natural: sem a certeza da segurança, provavelmente ninguém iria querer baixar o código de um site desconhecido na Internet e deixar que ele rodasse em seu computador. E no entanto, isso já está sendo feito todos os dias com os applets Java.

No nível mais baixo, a segurança é uma conseqüência da robustez de Java. Como já vimos, os programas Java não podem forjar ponteiros para a memória, nem estourar arrays, nem ler memória que esteja fora das fronteiras de um array ou string. Esses recursos são uma das principais defesas de Java contra código malicioso. Ao impedir totalmente qualquer acesso direto à memória, toda uma enorme classe de ataques à segurança é evitada. A segunda barreira contra um código malicioso é o processo de verificação de bytecode executado pelo interpretador Java sobre qualquer código de origem desconhecida que seja carregado. Essa verificação assegura que o código seja bem formado – isto é, que ele não avance na memória que fica acima ou abaixo dos limites da pilha (stack overflow ou underflow), nem implemente bytecode ilegal. Se esse passo de verificação do bytecode não existisse, código corrompido por incompetência ou má fé poderia tirar partido de pontos fracos na implementação de um interpretador Java. Outra camada de proteção para segurança é comumente chamada de modelo de caixa de areia (sandbox): o código de origem desconhecida pode rodar, mas é mantido isolado dentro de uma caixa de areia, onde pode rodar em segurança sem causar qualquer dano ao “mundo real”, que é o ambiente Java como um todo. Quando um applet, ou outro código de origem desconhecida, está rodando dentro da caixa de areia, ele fica submetido a diversas restrições sobre o que pode fazer. A mais óbvia dessas restrições é que ele não tem acesso de nenhum tipo ao sistema de arquivos local. Existem ainda várias outras restrições à caixa de areia. Na verdade, existe uma classe, chamada Security Manager, especialmente para cuidar da implementação dessas restrições. Para assegurar o funcionamento do modelo de segurança, todas as classes do núcleo Java que executam operações de risco, como acesso ao sistema de arquivos, primeiro pedem permissão ao Security Manager atualmente instalado. Se a chamada estiver sendo feita, direta ou indiretamente, por código de origem desconhecida, o gerenciador de segurança lançará uma exceção, impedindo a operação.

Algoritmo e Linguagem de Programação

Java foi projetado com a segurança em mente. Por isso, oferece várias camadas de controles de segurança que protegem contra código malicioso, permitindo que os usuários rodem tranqüilamente programas de origem desconhecida, como os applets.

A segunda barreira contra um código malicioso é o processo de verificação de bytecode executado pelo interpretador Java sobre qualquer código de origem desconhecida que seja carregado. Essa verificação assegura que o código seja bem formado – isto é, que ele não avance na memória que fica acima ou abaixo dos limites da pilha (stack overflow ou underflow), nem implemente bytecode ilegal. Se esse passo de verificação do bytecode não existisse, código corrompido por incompetência ou má fé poderia tirar partido de pontos fracos na implementação de um interpretador Java. Outra camada de proteção para segurança é comumente chamada de modelo de caixa de areia (sandbox): o código de origem desconhecida pode rodar, mas é mantido isolado dentro de uma caixa de areia, onde pode rodar em segurança sem causar qualquer dano ao “mundo real”, que é o ambiente Java como um todo.

20


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

Algoritmo e Linguagem de Programação

ABERTA DO BRASIL

Quando um applet, ou outro código de origem desconhecida, está rodando dentro da caixa de areia, ele fica submetido a diversas restrições sobre o que pode fazer. A mais óbvia dessas restrições é que ele não tem acesso de nenhum tipo ao sistema de arquivos local. Existem ainda várias outras restrições à caixa de areia. Na verdade, existe uma classe, chamada Security Manager, especialmente para cuidar da implementação dessas restrições. Para assegurar o funcionamento do modelo de segurança, todas as classes do núcleo Java que executam operações de risco, como acesso ao sistema de arquivos, primeiro pedem permissão ao Security Manager atualmente instalado. Se a chamada estiver sendo feita, direta ou indiretamente, por código de origem desconhecida, o gerenciador de segurança lançará uma exceção, impedindo a operação. A partir da versão Java 1.1(JDK 1.1), é implementado um recurso adicional à questão da segurança: a assinatura digital. Anexando uma assinatura digital ao código Java, a origem desse código pode ser estabelecida de uma forma criptograficamente segura e impossível de falsificar. Desta forma, o usuário pode definir que uma determinada pessoa ou organização merece sua confiança. A partir daí, o código que traz a assinatura digital dessa entidade merece confiança mesmo que seja carregado por meio da rede, podendo rodar sem as restrições do modelo de caixa de areia. Porém, quando se trata de segurança, é preciso ser realista. Da mesma forma que nunca se pode garantir que um programa seja 100% livre de bugs, nenhuma linguagem ou ambiente pode ter a garantia de ser 100% seguro. Dentro desses limites, Java com certeza oferece um bom nível de segurança para a maioria das aplicações práticas. Java antecipa e se defende contra a maioria das técnicas que têm sido usadas para fazer com que software tenha comportamento malicioso. A segurança de Java foi intensamente testada por experts em segurança e também por hackers. Desta forma, foi possível sanar alguns furos de segurança encontrados nas primeiras versões de Java. É igualmente razoável esperar que quaisquer furos que venham ser descobertos no futuro sejam sanados com a mesma rapidez. 1.2.8 Multithreading O cérebro humano é multiprocessado. Ele pode facilmente manipular centenas de tarefas simultaneamente. Você pode estar falando no telefone enquanto ouve rádio, enquanto bebe um copo de suco de laranja, enquanto prende o telefone entre o ombro e a orelha, enquanto pensa em seus planos para o fim de semana, enquanto percebe que os pratos precisam ser lavados, enquanto... Um aplicativo de computador poderoso pode lidar com muitas ações simultâneas. O multithreading ou multithread é o modo como eles conseguem fazer isso. Infelizmente, o e o C++ se encaminham para um programa de thread, ou encadeamento, único, o que inibe sua capacidade de desenvolver programas multiprocessados. O Java não poderia estar restrito a uma construção de thread único.

21

O que multithreading significa, para os usuários do Java, é que eles não têm de esperar que o aplicativo finalize uma tarefa para começar outra. Por exemplo, se você estivesse jogando um RPG, ou um thread, poderia estar manipulando a matemática do combate no qual estivesse envolvido, enquanto um outro cuidasse das imagens; para entender isso vamos imaginar um Web browser, como Netscape Navigator ou Microsoft Internet Explorer, no qual várias coisas acontecem ao mesmo tempo.


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Exemplo de Multithread em um Browser O multithreading elimina muito o desperdício de tempo quando comparado à thread única. Em um computador pessoal, isso significa que você verá muito menos a ampulheta ou o ícone do relógio de pulso, que todos nós sabemos ser a forma do computador dizer: “Não me apresse”. Vantagens da Linguagem Java

1.3.1 Redução do Tamanho do Arquivo Executável Os arquivos “executáveis” do Java (classe) são menores que os arquivos.exe de C++. Assim os recursos da rede são economizados, melhorando o tempo de transmissão de arquivos e, conseqüentemente, aprimorando a performance da aplicação. São arquivos menores porque as classes necessárias para o funcionamento de um applet, por exemplo, estão embutidas no seu browser, ao contrário de C++, que precisa incluir todas as bibliotecas necessárias no seu código binário. O Java possui ainda suporte nativo para arquivos compactados, como imagens (gif, jpg) e sons, o que reduz ainda mais o tamanho dos arquivos. Disponibilidade de Bibliotecas Consistentes e Robustas Para a Maioria dos Sistemas Operacionais A linguagem Java contém uma grande quantidade de classes que fazem tudo para os desenvolvedores. Dificilmente vamos precisar implementar uma classe a partir do zero. Uma vantagem é o fato de estas classes estarem disponíveis em uma grande variedade de plataformas, funcionando em todas elas. 1.3.2 Garbage Collector Quando o desenvolvedor cria objetos em C++, precisa tomar um cuidado especial com a desalocação destes objetos na memória. Este processo é um dos maiores responsáveis pelos bugs nos programas em C++, pois em grandes aplicações fica extremamente difícil controlar todos estes objetos. Java implementa o Garbage Collector, um coletor de lixo que varre a memória e desaloca os objetos que não são mais necessários à aplicação. Com isso temos uma melhoria na gerência de memória e também maior facilidade no desenvolvimento. 1.3.3 Multithreads

Algoritmo e Linguagem de Programação

1.3

Java contém implementação de Multithread (programação multilinha) nativa. Podemos fazer com que o processador trabalhe com dois processos simultaneamente (multiprogramação), melhorando com isso a performance da aplicação. Em C++ é complicado trabalhar com multithreads. 1.3.4 Tratamento de Exceções Um dos maiores avanços da linguagem Java em relação às outras linguagens é o tratamento de exceções em tempo de execução. Toda vez que o runtime de Java percebe algum erro (uma divisão por zero ou uma URL que não exista, por exemplo) ele pára a execução daquele fragmento de código e procura por um tratamento especificado pelo desenvolvedor, ou simplesmente trata por si só aquela linha de código. Com este recurso, o desenvolvedor pode facilmente privar sua aplicação de uma variedade de erros e prevenir seu sistema dos comuns “travamentos”.

22


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

1.4

Máquina Virtual Java

Algoritmo e Linguagem de Programação

1.4.1 Como os Programas Java Rodam? A linguagem Java é orientada para objetos, com linhas de execução (threads) dinâmicas e muitos outros recursos. Mas o que faz a diferença é o modo como os programas Java são executados. Eles rodam dentro de máquinas virtuais (virtual machines), que ficam dentro do computador. Por isso, um programa Java não tem contato com o computador real, ele conhece apenas a máquina virtual. Logo os programas Java são independentes de plataforma. Se você já precisou desenvolver programas para vários sistemas operacionais, sabe que isso é uma grande vantagem. Quando você escreve um programa Java e o compila, ele está pronto para ser executado em qualquer PC que contenha a máquina virtual Java. De certa forma, você está escrevendo para apenas uma plataforma: a máquina virtual. A máquina virtual determina o que os programas Java podem ou não fazer. Os programas escritos em linguagens compiladas, como C ou C++, são executados diretamente pelo sistema operacional. Assim sendo, eles têm acesso direto a todos os recursos do sistema, incluindo memória e sistema de arquivos. Como os programas Java são executados de dentro da máquina virtual, as pessoas (programadores e desenvolvedores), que criam a máquina virtual, podem decidir o que um programa pode ou não fazer no computador. O ambiente criado para os programas Java chama-se ambiente de runtime. A máquina virtual age como um firewall (barreira de fogo) entre o computador e o programa Java. Um programa nunca acessa os dispositivos de entrada e saída, o sistema de arquivos ou mesmo a memória do seu computador. Em vez disso, ele pede que a máquina virtual faça isso. Quando rodamos as applets, elas são descarregadas para uma máquina virtual que proíbe o acesso ao sistema de arquivos. Assim, ela só permite acesso indireto aos recursos do sistema. Por ser uma linguagem interpretada, isso explica a independência de plataforma Java. 1.4.2 Por Que Interpretada? Porque o compilador Java gera o bytecode (código especial Java), que será executado por uma máquina virtual implementada em software, chamada de JVM – Java Virtual Machine (Máquina Virtual Java). A diferença entre o Java que é uma linguagem interpretada, comparada com uma linguagem compilada, como o caso do C ou C++, é que, enquanto nessas linguagens tradicionais, para cada plataforma precisamos que o compilador gere um código específico, como, por exemplo, para um PC, se quisermos que o mesmo programa rode em um Macintocsh, precisaremos compilá-lo para rodar em Macintosh e assim por diante. Já com o Java isso não acontece, pois, para rodarmos um programa feito em Java, usamos o interpretador Java (contido na JVM) de forma a executar o bytecode resultante da compilação. Como o bytecode Java é independente de plataforma, os programas Java podem rodar em qualquer plataforma pra a qual a JVM tenha sido portada. A JVM inclui o interpretador mais o sistema de runtime. 23


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Agora, depois dessa explicação, fica claro o que eles quiseram dizer com a frase “Write once, run anywhere” (“Escreva uma vez, rode em qualquer lugar”), frase que se tornou uma das marcas registradas de Java. 1.4.3 Uma Introdução Para a Estrutura Básica e Funcionalidade da JVM Um componente-chave do Java é o JVM (Java Virtual Machine) – um computador virtual, tipicamente implementado em softwares no topo da plataforma de hardware “real” e nos sistemas operacionais, que rodam programas compilados em Java. Agradeça ao JVM, pois programas escritos em Java não precisam ser reescritos para rodar em diferentes computadores. 1.4.4 Que É JVM? Por Que Está Aqui? Compiled Java Programs Java Virtual Machine Hardware Platform and Operating System

O JVM é um computador abstrato que roda programas compilados em Java. O JVM é “virtual” porque é geralmente implementado em softwares no topo da plataforma de hardware “real” e no sistema operacional. Todo programa Java é compilado pela JVM. Entretanto, o JVM precisa ser implementado em uma plataforma particular antes de ser compilado pelo Java para rodar nesta plataforma. 1.4.5 Bytecodes Os programas Java são compilados para um formato chamado bytecodes Java. O JVM executa os bytecodes, então os bytecodes podem ser aceitos como uma linguagem de máquina do JVM. O compilador Java lê o arquivo-fonte da linguagem Java (.java), traduz a fonte pra bytecodes e muda de bytecodes para arquivos-classe (.class). O compilador gera um arquivo-classe por classe na fonte.

Algoritmo e Linguagem de Programação

Em um ambiente interpretado, a fase de linkagem que existe no desenvolvimento de programas tradicionais compilados praticamente desaparece. O equivalente em Java à fase de linkagem consiste apenas no processo de carregar novas classes no ambiente de execução da JVM. Esse é um processo leve e incremental, que ocorre em tempo de execução. Isso é diferente do ciclo compilar-linkar-rodar, mais trabalhoso, comum em linguagens como C e C++. O resultado é uma redução no tempo de desenvolvimento dos programas.

Para o JVM, um fluxo de bytecodes é uma seqüência de instruções. Cada instrução consiste em um bytecode e 0 ou mais operandos. O bytecode diz ao JVM qual ação tomar. Se o JVM requer mais informações para realizar uma ação com o opcode, a informação requerida imediatamente segue o bytecode como operandos. Uma ajuda à memória é definida para cada instrução bytecode. Essa ajuda pode ser imaginada como uma linguagem assembly para JVM. Por exemplo, existe uma instrução que levará o JVM a empurrar um 0 na pilha. A ajuda de memória para essa instrução é iconst_0, e o valor do bytecode é 60 hexadecimal. Esta instrução não toma operandos. Outra instrução causa execução de programa para incondicionalmente avançar ou voltar na memória.

24


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Essa instrução requer um operando, uma assinatura ofsete de 16 bits para a alocação da memória corrente. Adicionando o ofset para a alocação da memória corrente, o JVM pode determinar a alocação de memória a fim de avançar. A ajuda de memória para esta instrução é goto, e o valor do bytecode é a7 hexadecimal.

Algoritmo e Linguagem de Programação

1.4.6 – Partes Virtuais O “hardware virtual” do JVM pode ser dividido em quatro partes básicas: o registrador, a pilha, a desalocação de memória heap e a área de método. Essas partes são abstratas, como a máquina que compõem, mas precisam existir de alguma forma em toda implementação JVM. O tamanho do endereço no JVM são 32 bits. O JVM pode, entretanto, endereçar acima de 4 Gigabytes de memória, com cada alocação de memória contendo 1 Byte. Cada registro no JVM armazena um endereço de 32 bits. A pilha, a desalocação de memória hep e a área de método residem em algum lugar com os 4 Gigabytes de memórias endereçáveis. A alocação exata dessas áreas de memória é uma decisão do implementador de cada JVM. Uma palavra em JVM é de 32 bits. O JVM tem um pequeno número de tipos de dados primitivos: byte (8bits), short (16 bits), int (32 bits), long (64 bits), float (32 bits), doublé (64 bits) e char (16 bits). Com a exceção do char, que é um caractere desmarcado Unicode, todos os tipos numéricos são marcados. Esses tipos convenientemente mapeiam os tipos disponíveis para programadores Java. Um outro tipo primitivo é um objeto manual, que é um endereço de 32 bits. A área de método, porque contém bytecodes, é alinhada no final do byte. A pilha e a desalicação de memória heap são alinhadas no final da palavra (32 bits). 1.1

Classpath e Codebase

Tome-se como exemplo um pequeno pedaço de código para que nossa discussão possa ser iniciada: 1 Import Java.applet.*; 2 Import Java.io.*; 3 Import java.net.*; (...) 4 Host= java.net.InetAddress.getLoca1Host ( ).getHosName ( ); (...) Alinha 3 faz a importação de um conjunto de classes que permite a execução da função existente na linha 4. A chamada a essa função é feita através do endereço completo, isto é, Java.net.InetAddress.getLocalHost().getHostName(); mas também poderia ter sido executada sem o nome de sua classe: getLocalHost ( ).getHostName ( ); Repare que essa função se encontra localizada na classe InetAddress, cujo arquivo possui o mesmo nome só que acrescido da extensão “*.class”. Por essa razão o Java necessita de algum tipo de informação adicional para encontrar a classe Java.net.InetAddress.

25

Para solucionar esse problema deve-se observar mais a fundo toda essa questão e notar que as classes são armazenadas numa estrutura de diretórios como se segue;


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

O nome completo da função, no caso “Java.net.InetAddress.getLocalHost”, oferece o diretório no qual a classe possa ser encontrada. Contudo não foi definido o diretório-raiz a partir do qual o Java deve iniciar essa busca. Por isso, a razão da existência da variável de ambiente CLASSPATH. Assim sendo se essa variável fosse setada com o valor “/classes”, o compilador deveria ser capaz de encontrar a seguinte estrutura dentro do sistema de arquivos.

│/ classes │ │/ Java │ │/net │ │. /InetAddress.class │(...) Isso por si mesmo já explica alguma coisa e agora será possível compreender por que muitas vezes os arquivos contendo as classes estão no formato “zip” ou “jar”. Tais formatos constituem-se em verdadeiros containers que representam o diretório-raiz a partir do qual as classes devem ser procuradas. Portanto zipando-se a estrutura:

│/ Java │ │/ net │ │. / InetAddress.class │(...)

Algoritmo e Linguagem de Programação

│/ raiz │ │/Java │ │/net │ │./ InetAddress.class │(...)

num arquivo chamado “test.zip”, a variável de ambiente deverá ser definida como CLASSPATH=”$CLASSPATH:/(...)/test.zip” export CLASSPATH para que o Java possa encontrar esse arquivo e procurar as classes dentro dele. Pode-se concluir, enfim, que CLASSPATH representa um conjunto de diretórios-raiz nos quais o Java poderá encontrar as classes necessárias. Todavia isso só é possível dentro de um sistema de arquivos local. Obviamente não funciona quando uma applet é utilizada pois, neste caso, o sistema de arquivos passa a ser o da máquina-cliente e não o do servidor. A variável CODEBASE resolve exatamente esse problema uma vez que representa algo semelhante a um CLASSPATH remoto. Por essa razão o tag applet sempredeverá contê-lo a menos que as classes utilizadas estejam no mesmo diretório da applet.

26


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

Deve-se notar que outros tag`s podem existir no tag applet. A diretiva archive=”...” informa que algumas classes utilizadas pela applet estão contidas nos arquivos especificados por ela. Isto é, essa diretiva especifica um container remoto semelhante ao funcionamento do CLASSPATH quando setado com um arquivo do tipo “zip” ou “jar”. Uma questão importante, e com sérias conseqüências para o download de uma applet, consiste n forma como os arquivos do tipo “zip” e do tipo “jar” serão utilizados. A princípio pode-se pensar que compactar um conjunto de classes e passá-lo através da diretiva archive será um método excelente para minimizar o tempo de download de uma applet em virtude do arquivo compactado ser menor. Tal raciocínio, embora correto, nem sempre representa uma realidade. Ao compactar-se um conjunto de classes geralmente agrega-se informação em excesso. Ou seja, termina-se passando uma quantidade excessiva de classes a menos que seja feito um trabalho muito criterioso no sentido de selecionar-se apenas as classes realmente necessárias, o que nem sempre é simples. Mesmo não existindo uma solução teórica para esse impasse, o bom senso diz para que se passe através da diretiva “archive” apenas as classes fundamentais ou as que possam definir um conjunto claro e preciso. As demais deverão estar localizadas no caminho apontado por CODEBASE. Esses procedimentos ainda visam minimizar a quantidade de transações no servidor e, conseqüentemente, diminuir o tempo de download da applet e suas classes. 1.6 Modificadores Os modificadores são utilizados na declaração de classes, métodos e atributos. São classificados como modificadores de acesso e de cunho geral. 1.6.1. Modificadores de Acesso Restringem o acesso a métodos, atributos e classes. Private: É a forma de proteção mais restrita. Permite acesso apenas à mesma classe. Protected: Permite acesso a todas as classes do mesmo pacote e às subclasses de fora do pacote. Public: É a permissão menos restritiva. Permite acesso a todas as classes do pacote corrente ou não. Nenhum (proteção de pacote – package): É a permissão assumida quando não é especificado nenhum outro modificador de acesso. Permite acesso a todas as classes do mesmo pacote. 1.6.2. Modificadores de Cunho Geral static: Indica atributo ou método de classe.

27

Abstract: Indica classe ou método abstrato. Classes abstratas fornecem apenas modelos de comportamento, mas não uma implementação concreta. Esta implementação deve ser fornecida pelas suas subclasses.


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Final: Finaliza a implementação da classe, método ou atributo. Ou seja, um método ou atributo declarado como final não pode ser sobrescrito em classes derivadas e uma classe declarada como final não pode ser derivada. Esta é a maneira pela qual definimos constantes em Java. Exemplo: Public final int meuIntConstante = 5; / / declara a constante / / meuIntConstante com o valor 5 Convenções ao se Programar em Java

? Nomes de classes iniciam-se sempre por letra maiúscula. ? Nomes de

objetos, métodos e pacotes, iniciam-se sempre por letra

minúscula.

? Seguindo a metodologia da POO, devemos procurar sempre encapsular os atributos, permitindo seu acesso somente através de métodos, de forma a dar mais segurança a nossos programas.

? Para nomes de pacotes de classes use a seguinte hierarquia: ? tipoEmpresa.nomeEmpresa.nomePacote[.subPacote[...]];

Algoritmo e Linguagem de Programação

1.7

28


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Roteiro a) b)

Decisões IDE NETBEANS

Roteiro de Atividades Passo 1 - Leitura do Texto sobre Decisões em Algoritmos; Passo 2 - Realização dos Exercícios de Fixação; Passo 3 - Realização das Tarefas de Algoritmos. Passo 4 – Leitura do texto sobre os conceitos básicos da Linguagem Java. Passo 5 - Leitura do Texto sobre a IDE Netbeans e concomitantemente, fazer a instalação dos aplicativos que serão necessários (a máquina virtual de java e a IDE do Netbeans); Passo 6 - Realização dos Exercícios de Fixação;

Algoritmo e Linguagem de Programação

Semana 2

29


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

1- Tomada de Decisão O conceito de tomada de decisão em um computador é um dos procedimentos mais importantes. Este conceito está baseado na característica que um computador possui de tomar decisões em um nível controlado por condição.

O fato de uma condição ser verdadeira ou falsa permite ao programa executar ações distintas existentes na mesma estrutura lógica. Imagine, por exemplo, um programa que seja usado para calcular a cobrança de um título. Ao verificar a data de vencimento, esse programa pode ou não efetuar a cobrança de juros sobre o valor do título, caso esteja sendo pago após o vencimento (decisão simples), ou mesmo pode também proporcionar a aplicação de um desconto, caso o título esteja sendo pago antes do vencimento (decisão composta). A seguir, apresenta-se o formato de aplicação dos conceitos de decisão simples e composta, além de apresentar também o conceito da utilização de decisão encadeada, quando for este o caso. 1.1 – Decisão Simples A decisão do tipo simples caracteriza-se por prever uma ação lógica quando a condição é verdadeira. Se a condição for falsa, não será executado absolutamente nada. Nesta situação, o português estruturado que representa é: Português Estruturado Se (<condição>) então <instruções para condição verdadeira> fim_se <instruções para condição falsa ou após ser verdadeira>

1.2 Decisão Composta A decisão do tipo composta caracteriza-se por prever uma ação lógica quando a condição é verdadeira ou uma ação lógica quando a condição é falsa.

Algoritmo e Linguagem de Programação

Para que seja necessário tomar uma decisão em um computador, é preciso ter uma condição. Esta condição pode retornar uma de duas respostas: sim ou não, verdadeira ou falsa.

Português Estruturado Se (<condição>) então <instruções para condição verdadeira> senão <instruções para condição falsa> fim_se <instruções comuns para condição falsa ou verdadeira>

30


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

1.3 – Decisão Encadeada A decisão do tipo encadeada caracteriza-se por prever uma ação lógica quando ocorre a necessidade de estabelecer uma verificação lógica em uma seqüência de condições sucessivas. Desta forma, uma determinada ação pode ser executada se um conjunto anterior de instruções ou condições for satisfeito. Este tipo de estrutura pode possuir alguns níveis de condição (aconselha-se no máximo quinze níveis), sendo chamadas de aninhamentos ou encadeamentos. Português Estruturado Se (<condição 1>) então <instruções para condição1 verdadeira> senão se (<condição2>) então <instruções para condição2 verdadeira, porém condição1 falsa> senão <instruções para condição1 e condição2 falsas> fim_se fim_se <instruções comuns após verificação das condições> OBSERVAÇÃO: O exemplo apresentado faz referência a um encadeamento a partir da condição1 como falsa. Este é um mero exemplo, e assim sendo, poderia também ser considerado o encadeamento para a condição verdadeira. 2 – Uso de Condições Como apresentado anteriormente, o conceito de tomada de decisão está moldado no fato de existir pelo menos uma condição que necessita ser avaliada. A condição sob avaliação pode gerar uma de duas respostas (sim ou não, verdadeiro ou falso) Para definir uma condição, é necessária a avaliação de no mínimo dois elementos que podem ser representados por variáveis e/ou valores. Desta forma, podem ser criadas as seguintes relações lógicas: variável com variável e variável com valor. Dificilmente existirão relações lógicas do tipo valor com variável, e não serão utilizadas relações do tipo valor com valor. Uma condição mínima é formada por dois elementos em conjunto com algum operador relacional, ou mesmo com o uso de operadores lógicos. 2.1 – Operadores Relacionais Para que seja definida uma condição, é necessário utilizar os operadores relacionais, além dos elementos descritos anteriormente, para que assim seja possível verificar o estado lógico de uma determinada condição quanto à possibilidade de ser verdadeira ou falsa. Os operadores relacionais válidos em relações lógicas são as seguintes:

31


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Sig nificado Igual a Dif erente de Maior q ue Menor qu e Maior o u ig ual a Menor ou igual a

2.2– Operadores Lógicos Foi comentado anteriormente que para ocorrer a tomada de decisão é necessário uso de no mínimo uma condição. Mas haverá situações em que se torna necessário o uso de mais de uma condição para que uma única decisão seja tomada sem o uso do conceito de decisões encadeadas. Para estes casos é preciso trabalhar com os operadores lógicos, sendo os mais comuns: .e. (operador de conjunção), .ou. (operador de disjunção) e .não. (operador de negação). Em alguns casos, o uso de operadores lógicos evita a utilização de decisões encadeadas. O operador lógico do tipo .e. é utilizado quando duas ou mais condições necessitam ser verdadeiras. Desta forma, cria-se o conceito de conjunção entre as condições, ou seja, apesar de existir mais de uma condição, o resultado lógico somente será verdadeiro quando todas as condições também o forem. Imagine como exemplo a possibilidade de um aluno poder sair da sala de aula somente após concluir o exercício dois e o exercício três. Observe que ambos os exercícios precisam ser realizados para que ele possa sair.

Condição 1 Falsa Verdadeira Falsa Verdadeira

Condição 2 Falsa Falsa Verdadeira Verdadeira

Resultado Falso Falso Falso Verdadeiro

Algoritmo e Linguagem de Programação

Símbolo = <> > < >= <=

Português Estruturado

Se (< condição 1>) .e. (< condição 2>) então <instruções executadas se condição 1 e condição 2 forem verdadeiras> fim_se

O operador do tipo .ou. é utilizado quando pelo menos uma das condições necessita ser verdadeira. Desta forma, cria-se o conceito de disjunção entre as condições, ou seja, apesar de existir mais de uma condição, o resultado lógico somente será verdadeiro quando pelo menos uma das condições for verdadeira.

32


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

Imagine como exemplo a possibilidade de um aluno poder sair da sala de aula somente após concluir o exercício dois ou o exercício três. Observe que basta ao aluno resolver um dos exercícios para que ele possa sair.

Condição 1 Falsa Verdadeira Falsa Verdadeira

Condição 2 Falsa Falsa Verdadeira Verdadeira

Resultado Falso Verdadeiro Verdadeira Verdadeiro

Português Estruturado Se (<condição 1>) .ou. (<condição 2>) então <instruções executadas se condição 1 ou condição 2 forem verdadeiras.> fim_se

O operador do tipo .não. é utilizado para efetuar a inversão do resultado lógico de uma determinada condição, uma vez que este operador nega a condição escrita à sua frente. Se a condição for verdadeira, será tratada como falsa. Se a condição for falsa, será tratada como verdadeira.

Condição Verdadeira Falso

Resultado Falso Verdadeiro

Português Estruturado Se .não. (<condição>) então <instruções executadas se condição não for verdadeira> fim_se

OBSERVAÇÃO: O uso do operador lógico .não. é um pouco mais raro que os demais operadores lógicos. Uma de suas aplicações ocorre quando há necessidade de priorizar a ação de uma condição que seja falsa. 2.3 – Exercícios de Aprendizagem Com o objetivo de mostrar um exemplo prático na utilização dos conceitos de tomada de decisões, apresentam-se em seguida alguns exemplos de aprendizagem, os quais estarão tratando os conceitos de decisão simples, decisão composta, decisão encadeada, operadores relacionais e lógicos. Observe atentamente cada exercício e avalie seu funcionamento lógico antes de efetuar os exercícios de fixação. a) Primeiro exemplo

33

Ler dois valores numéricos, efetuar a adição e apresentar o seu resultado caso o valor somado seja maior que 10.


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo 1 Conhecer dois valores incógnitos (estabelecer variáveis A e B); 2 Efetuar a soma dos valores incógnitos A e B, implicando o valor da soma na variável X; 3 Apresentar o valor da soma contido na variável X, caso o valor de X seja maior que 10.

Programa SOMA_NÚMEROS Var X, A, B : inteiro Início Leia A Leia B X

←A + B

se (X > 10) então escreva X fim_se fim Note que após a definição do tipo inteiro para as variáveis do programa, é solicitada a leitura dos valores para as variáveis A e B, depois esses valores são implicados na variável X, a qual possui o resultado da adição dos dois valores. Neste ponto, a condição do programa é avaliada. Se a condição for verdadeira, ou seja, o resultado da variável X for maior que 10, ele será então apresentado; caso contrário, nada ocorrerá. b) – Segundo Exemplo Ler dois valores numéricos e efetuar a adição. Caso o resultado seja maior ou igual a 10, deve ser acrescido de mais 5; caso contrário, este resultado deve ser diminuído em 7. Ao final apresente o resultado após a avaliação da condição. Algoritmo 1 2

Conhecer dois valores (variáveis A e B); Efetuar a soma dos valores A e B e implicar o valor da soma em X;

3

Verificar se X é maior ou igual 10; caso sim, calcule R

Algoritmo e Linguagem de Programação

Português Estruturado

←X+5, senão calcule R

←X-7 e apresente ao final o valor de R.

34


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Português Estruturado Programa SOMA_NÚMEROS Var X, A, B : inteiro

Algoritmo e Linguagem de Programação

Início Leia A, B X

←A + B Se (X >= 10) então

R X+5 Senão R

←X – 7

Fim_se Escreva R Fim

Note que após a definição do tipo inteiro para as variáveis do programa, é efetuada a leitura dos valores para as variáveis A e B, depois esses valores são implicados na variável X. Perceba que, neste ponto, o programa questiona a condição que permitirá imprimir o resultado com a adição de 5 ou a subtração de 7. c) Terceiro Exemplo Elaborar um programa que efetue o cálculo do reajuste de salário de um funcionário. Considere que o funcionário deve receber um reajuste de 15% caso seu salário seja menor que 500. Se o salário for maior ou igual a 500, mas menor ou igual a 1000, seu reajuste será de 10%; caso seja ainda maior que 1000, o reajuste deve ser de 5%. Ao final o programa deve apresentar o valor do novo salário. Algoritmo Observe que, para resolver o problema apresentado, é necessário utilizar uma de três condições para calcular o reajuste do salário do funcionário, sendo:

? Salário <500, reajuste será de 15% ? Salário >= 500, mas <= 1000, reajuste será de 10% ? Salário > 1000, reajuste será de 5% As condições em questão devem ser encadeadas, pois todas as possibilidades de reajuste devem ser cercadas. Assim sendo, observe os passos do algoritmo em seguida:

35

1. 2. 3. 4. 5. 6.

Definir uma variável para o salário reajustado: NOVO\-SALÁRIO; Ler um valor para a variável SALÁRIO; Verificar se o valor de SALÁRIO < 500, se sim reajustar em 15%; Verificar se o valor de SALÁRIO ,= 1000, se sim reajustar em 10%; Verificar se o valor de SALÁRIO > 1000, se sim reajustar em 5%; Apresentar o valor reajustado, implicado em NOVO_SALÁRIO.


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

OBSERVAÇÃO: A referência utilizada na linha 5 do algoritmo não será utilizada no diagrama de quadros e em português estruturado. Isto ocorre, uma vez que o conceito de avaliação da condição deixa a quinta referência subentendida. Desta forma, qualquer valor que não seja menor que 500 ou que não esteja situado na faixa de 500 a 1000, está acima de 1000.

Programa REAJUSTA_SALÁRIO Var NOVO-SALÁRIO : real SALÀRIO : real Início Leia SALÁRIO Se (SALÁRIO <500) então NOVO_SALÁRIO ← SALÁRIO * 1.15 Senão Se (SALÁRIO <= 1000) então NOVO_SALÁRIO ← SALÁRIO * 1.10 Senão NOVO_SALÁRIO ← SALÁRIO * 1.05 Fim_se Fim_se Escreva NOVO_SALÁRIO Fim

d) Quarto Exemplo Elaborar um programa que efetue a leitura de três valores para os lados de um triângulo, considerando lados como: A, B e C. O programa deve verificar se os lados fornecidos formam um triângulo, e se for esta condição verdadeira, deve ser indicado qual tipo de triângulo foi formado: isósceles, escaleno ou eqüilátero. Algoritmo Para que este programa seja desenvolvido, é necessário saber em primeira estância o que é um triângulo: triângulo é uma forma geométrica (poligno) composta por três lados, e cada lado é menor que a soma dos outros dois lados.

Algoritmo e Linguagem de Programação

Português Estruturado

Observe que a definição de um triângulo impõe algumas regras (condições) as quais precisam ser consideradas para a criação do programa. É um triângulo quando A<B+C e quando C<A+B. Após verificar se os lados fornecidos formam um triângulo, será necessário avaliar os valores dos lados A, B e C para estabelecer qual tipo de triângulo será formado: isósceles, escaleno ou eqüilátero. Um triângulo é isósceles quando possui dois lados iguais e um diferente, sendo A = B ou A = C ou B = C; é escaleno quando possui todos os lados diferentes, sendo A< >B e B< >C; e é eqüilátero quando possui todos os lados iguais, sendo A = B e B = C.

36


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

1. Ler três valores para os lados de um triângulo: A, B e C; 2. Verificar se cada lado é menor que a soma dos outros dois lados. Se sim, saber se A = B e se B = C, sendo verdade o triângulo é équilátero. Se não, verificar A = B ou se A = C ou se B = C, sendo verdade o triângulo é isósceles; caso contrário, o triângulo é escaleno; 3. Caso os lados fornecidos não caracterizem um triângulo, avisar a ocorrência. Português Estruturado Programa TRIÂNGULO Var A, B, C : real Início Leia A, B, C Se (A < B + C) .e. (B < A + C) .e. (C < A + B) então Se (A = B) .e. (B = C) então Escreva “Triângulo Eqüilátero” Senão Se (A = B) .ou. (A = C) .ou. (C = B) então Escreva “Triângulo Isósceles” Senão Escreva “Triângulo Escaleno” Fim_se Fim_se Senão Escreva “As medidas não formam um triângulo” Fim_se Fim e) Quinto Exemplo Elaborar um programa que efetue a leitura de um valor numérico inteiro e apresente-o caso esse valor não seja divisível por 4. Algoritmo Se for lido um valor divisível por quatro (como: 4, 8, 12, 16, etc) o programa deve apresentar a mensagem “valor inválido”. Qualquer outro valor que não seja divisível por quatro deve ser apresentado. Para resolver o problema, é necessário, além do uso do operador lógico .não., verificar se a condição do valor lido é ou não divisível por 4. Para verificar se um valor numérico (dividendo) é divisível por outro valor numérico (divisor), é necessário levar em consideração que o resto da divisão deve ser zero. É necessário também considerar que os valores de dividendo, divisor, quociente e resto são inteiros. Para detectar se um valor numérico inteiro é divisível por outro valor numérico inteiro, deve ser utilizado o operador aritmético de divisão “div”, que proporciona a obtenção do resultado da divisão (quociente) como um valor numérico inteiro.

37

Desta forma, se for efetuada a operação 5 div 2, ter-se á como quociente da divisão o valor 2. Sendo o quociente 2, isto indica que o resto da divisão está como o valor 1. Desta forma, pode-se concluir que o valor numérico 5 (dividendo) não é divisível pelo valor numérico 2 (divisor), pois o resto da divisão não é zero.


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Para efetuar o cálculo do resto de uma divisão de valores inteiros, basta considerar a fórmula: Resto = Dividendo – Divisor . Quociente. Assim sendo, pode-se substituir a fórmula pelos seus respectivos valores, sendo: Resto = 5 – 2 . 2. Em seguida, basta efetuar o cálculo da multiplicação de 2 . 2, para então subtrair o valor 4 do valor 5, e assim obter o valor de resto igual a 1.

Após considerar a explicação anterior, observe os passos do algoritmo proposto: 1. Ler um número inteiro qualquer, no caso o número N; 2. Calcular o resto da divisão de N por 4, usar a variável R; 3. Verificar se a variável R possui valor zero, se sim apresentar a mensagem “valor inválido”, se não apresentar o valor da variável N. Português Estruturado Programa DIVISÍVEL Var N, R : inteiro Início Leia N R ← N – 4 * (N div 4) Se .não. (R = 0) então Escreva N Senão Escreva “Valor inválido” Fim_se Fim

Conceitos Básicos da linguagem Java Blocos de Código

Algoritmo e Linguagem de Programação

A forma exposta no parágrafo anterior é a utilizada em um programa de computador para determinar se um valor numérico é divisível por outro valor numérico. Supondo que um programa deva verificar se um valor, no caso o valor numérico 5, é divisível pelo valor numérico 2, deveria efetuar o cálculo do resto da divisão da seguinte forma: RESTO ←5 – 2 * (5 div 2).

Em Java, tal como em C/C++, duas ou mais linhas podem ser agrupadas formando blocos de código. Isso é feito inserindo-se os comandos entre as chaves {e }. Depois que um bloco de código é criado, ele se torna uma unidade lógica que pode ser usada como se fosse um comando único. Por exemplo, um bloco pode ser o alvo dos comandos if e for de Java. Consideremos o seguinte comando if: I f (a<b) {// Começo do bloco. a=b; b=0; }// Fim de bloco. 38


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

Aqui, se a for menor do que b, as duas linhas contidas dentro do bloco serão executadas. Assim, os dois comandos, que ficam dentro do bloco de código, formam uma unidade lógica, e um comando não pode executado sem que o outro também seja. O importante é saber que quisemos unir logicamente dois ou mais comandos, fazemos isso criando um bloco. Vejamos outro exemplo. O seguinte programa utiliza um bloco de código como alvo para o loop for. A saída gerada por este programa é mostrada aqui: Valor de a: 0 Valor de b: 10 Valor de a: 1 Valor de b: 8 Valor de a: 2 Valor de b: 6 Valor de a: 3 Valor de b: 4 Valor de a: 4 Valor de a: 2 Neste exemplo, o alvo do loop for é um bloco de código e não apenas uma só linha. Assim, cada vez que o loop for executado, os três comandos que ficam dentro do bloco de código serão executados. Esse fato pode ser constatado na saída gerada pelo programa. Os programas fonte Java são formados por espaço em branco, identificadores, comentários, literais, operadores, separadores e palavra-chave. Os operadores serão descritos com detalhes mais adiante neste curso. Os outros elementos são descritos a seguir. Java é uma linguagem de forma livre. Isso significa que não é preciso seguir regras especiais de indentação. Por exemplo, nada impede que um programa seja escrito em uma única linha, ou de qualquer outra forma estranha que o programador queira desde que haja pelo menos um caractere de espaço entre cada dois elementos significativos que já não sejam delimitados por um operador ou separador. Em Java, espaço em branco pode ser um espaço, um caractere de tabulação ou uma quebra de linha. Identificadores Identificadores são palavras usadas como nomes de classes, nomes de métodos e nomes de variáveis. Um identificador pode ser qualquer seqüência descritiva de letra maiúsculas ou minúsculas, números, mais os caracteres de underscore( _ ) e o cifrão ($). Um identificador não pode começar com um número, para evitar ser confundido com um valor literal numérico. Como já dissemos, Java faz distinção entre letras maiúsculas e minúsculas, de modo que VALOR é um identificador diferente de Valor. Alguns exemplos de identificadores válidos são:

39

TempMed Count Yl // Só não pode começar com um algarismo. $tudoBem // Pode começar com $. Isso-funciona // Pode usar o caractere de underscore.


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Alguns contra-exemplos de nomes inválidos são: 2y // Erro ! ! ! Começa com algarismo. Temp-med // Erro ! ! ! Utiliza o caractere -. Não / pode / / Erro ! ! ! Usa a barra / Valores Literais

500 / / Um valor inteiro. 3.14 / / Valor de ponto flutuante. “Y“ / / Constante de caractere. “String de teste” / / Constante de string.

Um valor literal poderá ser usado em qualquer lugar no qual um valor de seu tipo seja permitido. Separadores Java define alguns caracteres como separadores. O mais comum deles é o caractere de ponto-e-vírgula (;). Outros separadores são comentados a seguir: ( ) Parênteses → Usados para conter listas de parâmetros nas definições e invocações de métodos. Também são utilizados para definir precedência de expressões, conter expressões em comandos de controle e envolver tipos em conversões (casts). { }Chaves →Usadas para conter arrays inicializados automaticamente. Também utilizadas para definir blocos de código, em classes, métodos e escopos locais. [ ] Colchetes → Usados para declarar tipos de arrays. Usados também para diferenciar valores de arrays. ; Ponto-e-vírgula →Encerra os comandos. , Vírgula → Separa identificadores consecutivos em declarações de variáveis. Usada também para encadear as declarações dentro de um comando for.

Algoritmo e Linguagem de Programação

Um valor constante em Java é criado usando-se uma representação literal desse valor. Eis alguns exemplos de valores literais:

. Ponto → Usado para separar nomes de packages de subpackages e classes. Utilizado também para separar uma variável ou método de uma referência a variável. Palavras-chave Existem certas seqüências de caracteres que possuem um significado especial no Java; essas seqüências são chamadas de palavras-chave. Algumas delas são verbos, algumas como adjetivos e outras como pronomes. Algumas delas são tokens (termos de linguagem-fonte para computadores) guardadas para versões posteriores da linguagem, e um (goto) é uma blasfêmia de linguagens procedurais antigas que jamais pode ser proferido em um Java de bom gosto. 40


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

A seguir é apresentada uma lista de 56 palavras-chave que podem ser usadas em Java. Quando você souber o significado de todos esses termos, estará bem encaminhado para se tornar um programador em Java. As palavras-chave não podem ser usadas como nomes de variáveis, classes ou métodos. As palavras-chave cast, const, future, generic, goto, inner, operator, outer, rest var são reservadas, mas não têm significado em Java. Os programadores experientes em outras linguagens como C,C++, Pascal ou SQL, devem saber que esses termos podem eventualmente ser utilizados. Por ora, você não os usará, e o Java é muito mais simples e fácil de manter sem eles.

Abstract case class do final future implemensts int new package rest super trhow var

boolean cast const double finally generic impor interface null private return switch throws void

break catch continue else float goto inner long operator protected short sychronized Transient Volatile

byte char default extends for If instanceof native outer public static this try while

Além das palavras-chave, Java reserva as seguintes: true, false, null Elas representam valores definidos por Java e não podem ser usadas como nomes de variáveis, classes ou métodos. Biblioteca de Classes Java O ambiente Java utiliza diversas classes de bibliotecas que contêm muitos métodos embutidos, proporcionando suporte para operações com I/O, manipulação de strings, recursos de rede e gráficos. As classes-padrão fornecem também suporte para saída em janelas. Assim, Java como um todo é uma combinação da própria linguagem, mais as classes-padrão. Veremos que grande parte da funcionalidade de Java é acessível por meio de sua biblioteca de classes. Na verdade, para se tornar programador em Java é preciso aprender a linguagem e conhecer a biblioteca de classes-padrão de Java. Tipos Simples Como acontece com todas as linguagens de programação modernas, Java suporta diversos tipos de dados. Podemos usar esses tipos para declarar variáveis e criar arrays.

41

Desde já, é importante ter em mente que Java é uma linguagem com tipagem forte. Na verdade, parte da robustez e da segurança de Java é conseqüência deste fato


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Mas o que significa isso? Primeiro, toda variável em Java tem um tipo. O mesmo vale para as expressões. Esses tipos são rigorosamente definidos.

Quem tem vivência em C ou C++ perceberá que a tipagem em Java é mais rigorosa do que nessas duas linguagens. Por exemplo, em C/C++ é possível atribuir um valor de ponto flutuante a um inteiro. Em Java, isso não é permitido. Também em C, não existe necessariamente checagem forte de tipos entre um parâmetro e um argumento. Em Java, isso sempre acontece. A forte checagem de tipos de Java pode parecer inicialmente um pouco aborrecida. Mas é preciso ter em mente que em longo prazo isso ajudará a reduzir a possibilidade de erros no código. Java define oito tipos simples (ou elementares) de dados. Eles podem ser divididos em quatro grupos (conforme tabela da página seguinte): Esses tipos podem ser usados no estado original, ou para construir arrays ou criar novos tipos de classes. Assim, eles formam a base de todos os outros tipos de dados que possam ser criados.

Números Inteiros: Todos com Sinal byte int short long

Números Fracionários float double

Letras, Símbolos e Algarismos char

Valor Verdadeiro ou Falso boolean

Os tipos elementares representam valores individuais, e não objetos complexos. Embora sob outros aspectos Java seja uma linguagem totalmente orientada para objetos, os tipos elementares não são objetos. Eles são análogos aos tipos simples encontrados na maioria das outras linguagens não orientadas para objetos. A razão para isso é a eficiência. Se os tipos simples fossem, objetos, o desempenho seria muito prejudicado.

Algoritmo e Linguagem de Programação

Segundo, todas as atribuições, quer sejam explícitas ou via passagem de parâmetros nas chamadas a métodos, são checadas quanto à compatibilidade de tipos. Não existem conversões automáticas, nem conversões de tipos conflitantes, como acontece em algumas linguagens. O compilador Java checa todas as expressões e parâmetros para assegurar-se de que os tipos sejam compatíveis. Qualquer disparidade entre tipos é um erro e deve ser corrigida para que o compilador possa concluir a compilação da classe.

Os tipos simples são definidos explicitamente para ater uma determinada faixa de valores e um comportamento matemático. Linguagens como C e C++ permitem que o tamanho de um inteiro varie conforme o ambiente de execução. Em Java isso não acontece. Por causa dos requisitos de portabilidade de Java, todos os tipos de dados têm uma faixa de valores estritamente definida. Por exemplo, um int é sempre de 32 bits, independentemente da plataforma de execução. Isso garante que os programas rodarão em qualquer arquitetura de máquina. Embora uma rigorosa especificação do tamanho de um inteiro possa causar uma pequena perda de performance em alguns ambientes, isso é necessário para garantir a portabilidade. A seguir, examinaremos cada tipo individualmente.

42


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Tipos Inteiros

Algoritmo e Linguagem de Programação

Existem quatro tipos de inteiros em Java: ? ? byte

? short ? int ? long Todos eles têm sinal, podendo assumir valores positivos e negativos. Ao contrário de C/C++, Java não tem os tipos sem sinal (unsigned) somente positivos. Acontece que o conceito de unsigned é usado principalmente para especificar o comportamento do bit de ordem mais alta, que define o sinal de um int quando expresso como um número. A largura de um tipo inteiro deve ser entendida não como a quantidade de armazenamento que ele consome, mas sim como o comportamento que define para variáveis e expressões desse tipo. O ambiente run-time de Java tem liberdade para usar qualquer tamanho que deseje, desde que os tipos se comportem da forma declarada. Na verdade, pelo menos uma implementação armazena os tipos byte e short em 32 bits, ao invés de 8 e 16 bits, para melhorar a performance, porque esse é o tamanho da palavra usada atualmente pela maioria dos computadores. A largura e o alcance dos tipos inteiros em Java varia amplamente, conforme mostrado na tabela:

Tipo de Inteiro long int short byte

Largura 64 32 16 8

Valor Mínimo -9.223.372.036.854.755.808 -2.147.483.648 -32.768 -128

Valor Máximo 9.223.372.036.854.755.807 2.147.483.647 32.767 127

Tipo Byte O tipo byte representa o menor dos tipos inteiros de Java. Byte é um tipo inteiro de 8 bits com sinal que tem faixa de valores entre – 128 a 127. As variáveis desse tipo são especialmente úteis quando trabalhamos com um fluxo de dados de uma rede ou de um arquivo. Byte também é prático para trabalhar com dados binários brutos que podem não ser diretamente compatíveis com os outros tipos embutidos de Java. As variáveis do tipo byte são declaradas usando-se a palavra reservada byte. Por exemplo, a seguinte linha declara duas variáveis byte, chamadas b1 e b2: byte b1, b2; Tipo short

43

O tipo short é um inteiro de 16 bits com sinal. Sua faixa vai de -32.768 a 32.767. É o tipo menos usado em Java, por cusa de uma particularidade: é definido como tendo o byte mais alto primeiro, o chamado formato big-endian. Esse tipo aplica-se principalmente a computadores de 16 bits, que estão se tornando cada vez mais raros. Eis alguns exemplos de declarações de variáveis short:


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

short s1; short shortVar;

Tipo int

Sempre que temos uma expressão inteira envolvendo bytes, shorts, ints e números literais, a expressão inteira é promovida para int antes que o cálculo seja efetuado. O tipo int é o mais versátil e eficiente e deve ser usado na maioria das vezes quando queremos contar números para contagem ou indexação de arrays, ou para fazer matemática de inteiros. Tipo long O tipo long representa um tipo inteiro de 64 bits com sinal. Ele é útil nas situações em que um tipo não é grande o suficiente para conter o valor desejado. A faixa de valores de long é bastante grande. Isso o torna útil quando há necessidade de lidar com grandes números inteiros. Por exemplo, o programa abaixo computa o número de quilômetros que a luz viaja em um determinado número de dias. 1. import javax.swing.JOptionPane; 2. public class DistLuz 3. { 4. public static void main (String args [ ] ) 5. { 6. int velocLuz=300000; 7. long dis=1000, segundos=0, distancia; 8. distancia=velocLuz*segundos; 9. JOptionPane.showMessageDialog(null,"Em"+ " " +dis); 10. JOptionPane.showMessageDialog(null," "+"dias a luz percorre" + " "); 11. JOptionPane.showMessageDialog(null, distancia + " " + " Km "); 12. }// Fim de main ( ) 13. }// Fim da classe DistLuz.

Algoritmo e Linguagem de Programação

O tipo int representa o tipo inteiro mais utilizado em Java. Trata-se de um inteiro de 32 bits com sinal que tem faixa de valores entre -2.147.483.648 e 2.147.483.647. Entre outros usos, variáveis do tipo int são muito usadas para controlar loops e indexar arrays.

Este programa exibe na tela o seguinte resultado: Em 1.000 dias a luz percorre 25920000000000 km. É perceptível que esse valor não poderia ser contido em uma variável int. Tipos com Ponto Flutuante Os números de ponto flutuante, ou números reais, são usados para avaliar expressões que requerem precisão fracional. Raiz quadrada e funções trigonométricas como seno e co-seno são exemplos de cálculos que resultam em valores cuja precisão requer um tipo com ponto flutuante.

44


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Java implementa o conjunto de tipos e operadores de ponto flutuante do padrão IEEE-754. Existem duas variedades de tipos de ponto flutuante:

? float →ponto flutuante com precisão simples

Algoritmo e Linguagem de Programação

? double →ponto flutuante com precisão dupla Suas larguras e faixas de valores são mostradas a seguir:

Tipo de Ponto Flutuante double float

Largura de Bits 64 32

Faixa de Valores 1.7e-308 a 1.7e+308 3.4e-038 a 3.4e+0,38

Tipo float O tipo float especifica um valor de precisão que utiliza 32 bits de armazenamento. Como tudo na vida, em comparação com o tipo doublé, o float tem um lado positivo e um negativo:

? A precisão simples é mais veloz em alguns processadores e ocupa a metade do espaço da precisão dupla...

? ... mas torna-se imprecisa quando os valores se tornam muito grandes ou muito pequenos. Variáveis do tipo float são úteis quando precisamos de um componente fracional, mas sem ter uma alto grau de precisão. Por exemplo, float pode ser usado para representar reais e centavos. Eis alguns exemplos de declarações de variáveis float:

float entrada, mensalidade;

Tipo double A precisão dupla, representada pela palavra-chave double, utiliza 64 bits para armazenar um valor. Em alguns processadores modernos, otimizados para cálculos matemáticos de alta velocidade, a precisão dupla chega a ser mais veloz que a precisão simples. Em Java, várias funções matemáticas como sin(), cos() e sqrt() retornam valores double. Quando precisamos manter a precisão ao longo de cálculos repetitivos, ao trabalhar com números com elevados valores, double é a melhor opção. Tipo char

45

char é o tipo usado em Java para armazenar caracteres. Porém, apesar de o nome ser o mesmo, os programadores C/C++ precisam ter em mente que um char em Java não é o mesmo que um char em C ou C++. Em C/C++, um char é, na verdade, um tipo inteiro com largura de oito bits. Isso não acontece em Java.


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Java utiliza Unicode para representar os caracteres. O Unicode define um conjunto internacional de caracteres, capaz de representar os caracteres de todas as línguas humanas. Ele reúne dezenas de conjuntos de caracteres, como latino, grego, arábico, cirílico, hebraico, katakana, hangul e muitos outros. Para possibilitar isso, são necessários 16 bits.

O conjunto-padrão de caracteres conhecido com ASCII continua assumindo valores entre 0 a 127, como sempre, e o conjunto estendido de caracteres, o ISSOLatin_1, varia de 0 a 255. Como Java foi criado para permitir que sejam escritos applets para uso em todo o mundo, faz sentido o uso de Unicode para representar os caracteres. É claro que o Unicode é um tanto ineficiente para línguas em inglês, português, espanhol e francês, cujos caracteres podem ser facilmente contidos em 8 bits. Mas esse é um preço que pagamos para ter portabilidade global. Eis um programa que demonstra o uso de variáveis char. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.

import javax.swing.JOptionPane; public class TesteChar { public static void main(String[ ] args) { char charl, char2; charl=77; char2=71; JOptionPane.showMessageDialog(null, "Minhas Iniciais:" ); JOptionPane.showMessageDialog(null, charl + " " + char2) ; } // Fim de main ( ) }// Fim da classe TesteChar.

Este programa exibe n tela a seguinte saída: Minhas Iniciais: M G Observe que nas linhas 9 e 10, char1 e char2 recebem respectivamente os valores 77 e 71, que são valores ASCII (e, neste caso, também Unicode) que correspondem às letras M e G. Lembre-se de que o conjunto de caracteres ASCII ocupa os primeiros 127 valores do conjunto de caracteres Unicode. Por esse motivo, todos os truques que eram usados com caracteres também vão funcionar em Java.

Algoritmo e Linguagem de Programação

É por isso que o tipo char de Java tem 16 bits. O alcance é de 0 a 65.536. char não pode assumir valores negativos.

Embora o tipo char não seja igual a um inteiro, em muitas situações é possível operar com um char como se fosse inteiro. Por exemplo, podemos somar dois chars, ou incrementar o valor de uma variável char. Tipo Boolean O tipo boolean de Java é usado para conter valores lógicos do tipo false/true (falso/verdadeiro). Esse é o tipo retornado por todos os operadores relacionais, como a < b. boolean é também o tipo exigido em todas as expressões condicionais que governam comandos de controle, como if e for. Eis um programa que demonstra o tipo boolean:

46


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

Algoritmo e Linguagem de Programação

ABERTA DO BRASIL

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.

import javax.swing.JOptionPane; public class TesteBoolean { public static void main ( String args [ ] ) { boolean bool; bool=false; JOptionPane.showMessageDialog(null, "bool é " + " " + bool); bool=true; JOptionPane.showMessageDialog(null, "bool é " + " " + bool); if (bool) // Um valor boolean controlando o comando if JOptionPane.showMessageDialog(null, "Isso será exibido." ); bool=false; if (bool) JOptionPane.showMessageDialog(null, "Isso não será exibido" ); // O resultado de um operador // relacional e um valor // boolean JOptionPane.showMessageDialog(null, " 4 > 3 e " + " " + ( 4 > 3 ) ) ; }// Fim de main ( ) }// Fim da classe TesteBoolean.

A saída gerada por este programa é a seguinte: bool é false bool é true Isso será exibido 4>3 é true Vamos examinar TesteBool.java. Nas linhas 8 e 10 podemos ver que, quando um tipo boolean é exibido com ajuda do método showMessageDialog(), o que aparece são as palavras true ou false. Na linha 14 vemos que o valor de uma variável boolean sozinha já é suficiente para controlar o comando if. Não há necessidade de escrever o comando if desta forma: Operações de Cast em Java Para resolver certos problemas em programação, é relativamente comum atribuir um valor de um tipo a uma variável de outro tipo. Se os tipos forem compatíveis, Java fará a conversão automaticamente. Um exemplo: sempre é possível atribuir um valor int a uma variável long. Porém nem todos os tipos são compatíveis, de modo que nem todas as conversões são implicitamente permitidas. Por exemplo, não existe uma conversão de doublé para byte. Para conseguir uma conversão entre tipos compatíveis, usamos o recurso chamado cast Ele executa uma conversão explícita entre tipos incompatíveis. Nesta e nas próximas lições examinaremos os dois tipos de conversão: automática e com o uso de cast.

47

Quando um dado de um tipo é atribuído a uma variável de outro tipo, ocorre uma conversão automática de tipo se as duas condições seguintes forem satisfeitas:


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

? Os dois tipos forem compatíveis. ? Tipo de destino tiver largura maior que o tipo original. Quando essas duas condições forem satisfeitas, ocorrerá uma conversão por alargamento. Por exemplo, o tipo int sempre é grande o suficiente para conter todos os valores do tipo byte, de modo que não há necessidade de uso de um cast explícito.

Conforme mencionado anteriormente, Java também executa uma conversão automática de tipo ao armazenar uma constante literal inteira em uma variável do tipo byte, short ou long. Como usar Cast Entre Tipos Incompatíveis As conversões automáticas ajudam muito, mas não atendem a todas as necessidades de programação. Por exemplo, o que acontece se precisarmos atribuir um valor double a uma variável int ? Essa conversão não é feita automaticamente, porque int é menor que um double. Esse tipo de conversão é conhecido como conversão por estreitamento, já que estamos explicitamente tornando o valor mais estreito, para que ele caiba no tipo-alvo. Para criar uma conversão entre dois tipos incompatíveis, é preciso usar cast. Um cast é simplesmente uma conversão explícita de tipo. Em nosso exemplo anterior, de double para int, o cast teria a seguinte forma: int doubleVar; int intVar; //... intVar= ( int ) doubleVar;

A conversão que ocorre quando um valor de ponto flutuante é atribuído a um tipo inteiro é diferente. Consiste em um truncamento. Como sabemos, valores inteiros não têm o componente fracionário. Assim, quando um valor de ponto flutuante é atribuído a um tipo inteiro, o componente fracionário é perdido.

Algoritmo e Linguagem de Programação

Nas conversões por alargamento, os tipos numéricos, inclusive os tipos inteiros e de ponto flutuante, são compatíveis entre si. Contudo, os tipos numéricos não são compatíveis com char ou boolean. E também, char e boolean não são compatíveis entre si.

Por exemplo, se o valor 3.14.16 for atribuído a um inteiro, o valor resultante será simplesmente 3. A parte fracionária .1416 será truncada. Importante: se o tamanho da parte inteira do número for grande demais para caber no tipo-alvo inteiro, então o valor será reduzido usando a operação módulo pelo alcance do tipo-alvo. Netbeans IDE 5.5 O NetBeans IDE é um ambiente de desenvolvimento integrado, baseado em padrões e em módulos e escrito na linguagem de programação Java. O projeto NetBeans consiste em: · ? Um IDE de código aberto escrito na linguagem de programação Java. ·

48


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

? Uma plataforma de aplicativo, que pode ser utilizada como uma estrutura genérica para construir qualquer tipo de aplicativo.

? Pacotes

Algoritmo e Linguagem de Programação

suplementares, como Mobility e Profiler, que permitem ampliar a funcionalidade do NetBeans IDE. A versão 5.5 do NetBeans, talvez uma das melhores IDE para Java, multi-plataforma, open source e disponível gratuitamente. A ferramenta possibilita a criação de aplicações Java para execução local, em dispositivos portáteis e internet. O arquivo principal, só instala a IDE, mas para aproveitar todas as funcionalidades disponíveis é necessário instalar os pacotes de Add-nos. Porém, nesta versão já está integrado a IDE um construtor de formulários (Swing GUI Builder) o que facilita bastante a construção de aplicações. As principais funcionalidades da IDE são:

? Construtor de formulários ? Controle de versão integrado ? Debugger (depurador que pode ser executado em muitos sistemas) ? Desenvolvimento colaborativo ? Desenvolvimento Java e JSP ? Refactoring avançado ? Editor XML ? Desenvolvimento C/C++ (Necessário Add-on) ? Desenvolvimento web com JSF, JSP e Struts ? Desenvolvimento visual para Web com Ajax, CSS e JSF (Necessário Add-on) ? Desenvolvimento de webservices ? Desenvolvimento para JME (MIDP) (Necessário Add-on) ? Desenvolvimento SOA (Necessário Add-on) ? Modelagem UML (Necessário Add-on) Criando um projeto no NetBeans Antes de Começar Para escrever seu primeiro programa, você precisará ter instalado em seu sistema os seguintes programas:

? The J2SE(TM) Development Kit (JDK), versão 5.0 ou compatível. ? NetBeans IDE 5.5. Criando seu Projeto Para criar um projeto IDE: Passo 1: Inicie o NetBeans IDE. No IDE, escolha "Arquivo > Novo Projeto", mostrado na figura 1. 49


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

No assistente (Wizard) do Novo projeto, expanda a categoria Geral e selecione Aplicação Java como mostrado na figura 2:

Algoritmo e Linguagem de Programação

Figura 1 - Novo Projeto no Netbeans

50

Figura 2 - Criação do Projeto no NetBeans


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

1. Na página "Nome e Localização" da tela, faça o seguinte (como mostrado na figura 3).

Figura 3 - Colocação do Nome do Projeto 1. 2. 3. 4.

No campo "Nome do projeto", coloque "Aula1". No campo "Criar Classe Principal", coloque "aula1.Main". Selecione a opção "Definir como projeto principal". Clique em "Finalizar".

O projeto foi criado e aberto na IDE. Você poderá ver os seguintes componentes (figura 4):

? A janela do

Projeto, que contém a visualização da árvore de componentes do projeto, incluindo os arquivos fonte, bibliotecas que seu código depende e assim por diante.

? A janela para edição de código. ? A janela de navegação, que

você pode usar como navegação rápida entre elementos dentro da classe selecionada.

51


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Adicionando código no Arquivo fonte Gerado Como na Figura 3, como está selecionada a opção "Criar Classe principal" na tela "Novo Projeto", o IDE criou uma classe mestre para você. Antes de continuar o projeto devem ser feitas algumas modificações importantes como:

? Retirar Comentários existentes, como: Comentário em Bloco( /**) e Comentário em Linha( // ). ? Retirar o Método construtor “Public Main”.

Algoritmo e Linguagem de Programação

Figura 4 - Disposição das Janelas no NetBeans

? Identar o inicio e fim de cada código. Após essas modificações você pode adicionar a mensagem Alô Mundo no código mestre, como mostra a figura 5:

52


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

Algoritmo e Linguagem de Programação

ABERTA DO BRASIL

Figura 5 - Primeiro Programa em Java Programa que deverá ser construído: package alomundo; import javax.swing.JOptionPane; public class AloMundo { public static void main(String[] args) { JOptionPane.showMessageDialog(null, “Alô Mundo”); } }

Compilando o Arquivo Fonte Para compilar seu arquivo fonte, escolha "Construir Construir Projeto Principal" no menu do projeto principal. A janela de saída abrirá e mostrará uma saída similar ao que você vê na figura seguinte. 53


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Se a compilação concluir com o estado EXECUTADO COM SUCESSO, parabéns! Você terá compilado seu programa com sucesso! Se a compilação concluir com o estado, EXECUÇÃO FALHOU você provavelmente tem um erro de sintaxe no seu código. Os erros são reportados na janela Output como link. Dê um duplo clique no link para navegar no código com o erro. Você pode então alterar o erro e uma vez modificado escolha "Construir Construir Projeto Principal”. Quando você compilar o projeto, o arquivo de bytecode alomundo é gerado. Você pode visualizá-lo abrindo a janela "Arquivos" e expandir até o nó alomundo / build / classes / alomundo como mostra a figura 7.

Algoritmo e Linguagem de Programação

Figura 6 - Compilando o arquivo-fonte em Java

54


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

Algoritmo e Linguagem de Programação

ABERTA DO BRASIL

Figura 7 –Programa Compilado (Gerado o .class) Agora que você tem o projeto compilado, você pode rodar seu programa. Rodando o Programa Do menu do IDE, escolha "Executar Executar Projeto Principal”. A figura 8 mostra o que será visto agora.

Figura 8 - Compilando o Projeto 55


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Mostrando a mensagem que será gerada (Figura 9)

Parabéns! Seu Programa trabalhando! Agora você sabe como realizar uma das tarefas de programação mais comuns no IDE. Classe JOptionPane A linguagem Java oferece diversas formas de interação com o usuário, a grande maioria em janelas. Para evitar a criação de uma interface completa, pode-se utilizar as chamadas caixas de diálogo. Se olharmos com atenção na documentação da API, observaremos que as classes estão agrupadas em pacotes (packages). Os pacotes servem para reunir um conjunto de classes com função semelhante. Então, se quisermos utilizar uma classe específica, devemos informar ao compilador Java onde (em qual pacote) essa classe deve ser encontrada. A classe que implementa as caixas de diálogo, JOptionPane, se encontra no pacote javax.swing, que contém diversas outras classes para interface com o usuário. Para utilizar essa classe, utiliza-se o comando import: import javax.swing.JOptionPane;

Obs: algumas classes como String, System, Integer e outras são parte de um pacote especial, denominado java.lang. Esse pacote nunca precisa ser importado, pois são as classes primitivas que compõem a linguagem Java.

Algoritmo e Linguagem de Programação

Figura 9 - Mensagem Gerada pelo programa

A classe JOptionPane oferece diversos métodos, para criar diversos tipos de caixas de diálogo. Por exemplo, se quisermos exibir uma caixa de mensagem para informar o usuário, usamos o método showMessageDialog(...):

import javax.swing.JOptionPane; public class TestaDialogo { public static void main(String args[]) { JOptionPane.showMessageDialog(null,"Este é um diálogo simples"); System.exit(0); } }

56


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

O primeiro parâmetro por enquanto deve ser null. Repare que o método showMessageDialog(...) é um método estático (de classe) de JOptionPane.

Algoritmo e Linguagem de Programação

Por esse motivo, não é necessário instanciar objetos a partir de JOptionPane. Observe também a chamada para o método System.exit(0): este método é geralmente utilizado para encerrar um programa que utilize interface gráfica.

Há uma outra forma de chamada para o método showMessageDialog, a qual permite melhorarmos o visual da caixa de mensagem:

JOptionPane.showMessageDialog(null,"Esta JOptionPane.WARNING_MESSAGE);

é

uma

mensagem","Atenção",

O terceiro parâmetro é o título que será exibido na janela (ao invés de "Message") O quarto parâmetro controla o ícone apresentado à esquerda da janela:

? JOptionPane.PLAIN_MESSAGE - nenhum ícone ? JOptionPane.ERROR_MESSAGE - ícone de erro ? JOptionPane.INFORMATION_MESSAGE - ícone de informação ? JOptionPane.WARNING_MESSAGE - ícone de aviso ? JOptionPane.QUESTION_MESSAGE - ícone de interrogação

57

Existe um método para exibir uma caixa de entrada: showInputDialog. Esse método retorna sempre a String que foi digitada pelo usuário. Exemplo:


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Assim como no método showMessageDialog, há uma variação mais completa:

nome = JOptionPane.showInputDialog(null,"Por nome","Atenção",JOptionPane.WARNING_MESSAGE);

favor,

digite

o

seu

Algoritmo e Linguagem de Programação

import javax.swing.JOptionPane; public class TestaDialogo { public static void main(String args[]) { String nome; nome = JOptionPane.showInputDialog("Digite o seu nome"); JOptionPane.showMessageDialog(null,"Seu nome é "+nome); System.exit(0); } }

A interação baseada em diálogos é útil quando queremos informar o usuário de uma situação urgente ou quando se deseja chamar a atenção, mas não deve ser utilizada excessivamente.

58


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Roteiro Estudo da 3ª Semana: a) Laços de Reletição Roteiro de Atividades Passo 1 - Leitura do Texto sobre Laços de Repetição em Algoritmos; Passo 2 - Realização dos Exercícios de Fixação; Passo 3 - Realização das Tarefas de Algoritmos.

Algoritmo e Linguagem de Programação

Semana 3

59


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

1 – Utilização de Laços de Repetição Os laços de repetição são muito úteis e muito utilizados, pois possibilitam a facilidade de repetir um certo trecho de programa por um determinado número de vezes. O número de vezes que um laço pode repetir um trecho de programa pode ser previamente conhecido ou não, vai depender da característica de execução do laço.

Para os laços predeterminados, de forma geral podem ser usados os tipos de laços de repetição: enquanto, repita e para. Para os laços indeterminados, podem ser usados apenas os laços de repetição dos tipos enquanto e repita. Os laços de repetição dos tipos enquanto e repita são controlados pelo uso de condição, logo são laços de repetição condicionais. Já o laço de repetição do tipo para é incondicional, pois não faz uso do conceito de condições. De forma geral, quando há necessidade de trabalhar com um laço de repetição predeterminado, utiliza-se o conceito para, deixando os conceitos de laços de repetição enquanto e repita para situações de laços indeterminados. Apesar desta característica operacional, nesta obra serão utilizados todos os tipos de laço para demonstrar suas aplicações nas mais variadas situações. 2 – Os Laços de Repetição Como exposto anteriormente, os laços de repetição são três, cada qual para uma finalidade específica. Mas, apesar desta característica específica, um laço de repetição pode, em algumas ocasiões, substituir outro laço de repetição, além de executar sua ação específica, desde que um consiga atender à necessidade do outro. Caso contrário, o laço de repetição não pode ser usado em substituição a outro laço. Dos três laços existentes o laço repita é o mais versátil, pois executa sua ação específica e consegue, com alguns cuidados, executar também as ações dos laços de repetição enquanto e para. Já o laço enquanto consegue, além de sua ação específica, executar com alguns cuidados a ação do laço de repetição para. Por sua vez, o laço de repetição para executa apenas sua ação específica. A tabela seguinte demonstra o nível de ação de cada estrutura de repetição.

Laço de repetição Repita Enquanto Para

Repita Executa -

Enquanto Executa Executa -

Algoritmo e Linguagem de Programação

Um laço de repetição em que se conhece o número de vezes que ele será executado é predeterminado, pois sabe-se quando começa e quando termina. Porém, há ainda a possibilidade de desenvolver um laço de repetição indeterminado, ou seja, sabe-se quando ele começa, mas não se sabe quando ele termina, pois apenas o usuário do programa é que determina o final.

Para Executa EXECUTA Executa

Outro detalhe a ser considerado é o fato de ocorrer a necessidade de encadear entre si as estruturas de repetição, segundo alguma necessidade específica. 60


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

2.1 – Laço Enquanto

Algoritmo e Linguagem de Programação

O laço de repetição do tipo enquanto caracteriza-se por efetuar um teste condicional no início do laço. Desta forma, é possível verificar se é permitido executar o trecho de instruções subordinado à condição. Para este tipo de estrutura será utilizado o código em português estruturado enquanto...faça e fim_enquanto. Português estruturado Enquanto (<condição>) faça Instruções executadas enquanto condição for verdadeira Fim_enquanto

2.2 – Laço Repita O laço de repetição do tipo repita caracteriza-se por efetuar um teste condicional no final do laço. Desta forma, as instruções subordinadas ao laço serão executadas no mínimo uma vez. Para este tipo de estrutura será utilizado o código em português estruturado repita e até_que. Português Estruturado Repita Instruções executadas até que condição torne-se verdadeira Até_que (<condição>)

2.3 – Laço Para O laço de repetição do tipo para caracteriza-se por efetuar um laço por um determinado número de vezes previamente definido. Para este tipo de estrutura será utilizado o código em português estruturado para...de...até...passo...faça e fim_para. Português Estruturado Para variável de início até final passo incremento faça Instruções executadas até contador atingir seu final Fim_para

3- Exercícios de Aprendizagem (Laços pré-determinados) Com o objetivo de mostrar um exemplo prático de uso do conceito de laços de repetição predeterminados, são apresentados alguns exemplos de aprendizagem, criados com os conceitos de laços de repetição do tipo enquanto, repita e para. Para os exemplos em questão considere de forma genérica o seguinte problema computacional: Elaborar um programa de computador que efetue e apresente o resultado do cálculo da fatorial do número 5. 61


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Neste sentido, vale lembrar que fatorial é o produto sucessivo dos números naturais iniciados em 1 até o inteiro n, no caso apresentado 5. Desta forma, o cálculo de uma fatorial é conseguido pela multiplicação sucessiva do número de termos. No caso do cálculo de uma fatorial de número 5 (5!), seria então necessário efetuar a multiplicação sucessiva de: 5 . 4 . 3 . 2 . 1 ou 1 . 2 . 3 . 4 . 5, que resultaria no valor 120.

3.1 – Primeiro Exemplo O número de passos deve ser controlado por um contador por intermédio do laço de repetição enquanto. Algoritmo 1. Inicializar as variáveis FATORIAL e CONTADOR com 1; 2. Multiplicar sucessivamente a variável FATORIAL pela variável CONTADOR; 3. Incrementar 1 à variável CONTADOR, efetuando o controle até 5; 4. Apresentar ao final o valor obtido.

Pelo fato de ter que efetuar o cálculo de uma fatorial de 5 (5!), isto implica que o contador deve variar de 1 a 5, e por este motivo deve ser a variável CONTADOR inicializada com valor 1. Pelo fato de a variável FATORIAL possuir ao final o resultado do cálculo da fatorial pretendida, ela deve ser inicializada com valor 1. Se ela for inicializada com zero, não existirá resultado final, pois qualquer valor multiplicado por zero resulta zero. Multiplicar sucessivamente implica em efetuar a multiplicação da variável CONTADOR pelo valor atual da variável FATORIAL a cada passo controlado pelo laço. No caso, por cinco vezes. Veja em seguida a resolução do problema do cálculo de fatorial, utilizando a estrutura de repetição do tipo enquanto. São apresentados também o diagrama de quadros e o código em português estruturado. Note dentro do laço de repetição a indicação de dois contadores. O primeiro funciona como um acumulador, pois ele terá no final o valor do resultado da fatorial, e o segundo é utilizado para controlar a execução do laço de repetição e ser a base para o cálculo do acumulador. Logo no início do diagrama de quadros, as variáveis CONTADOR e FATORIAL são igualadas em 1. Na primeira passagem dentro do laço, a variável FATORIAL é implicada pelo seu valor atual, no caso 1, multiplicado pelo valor da variável CONTADOR também com valor 1 que resulta 1. Em seguida a variável CONTADOR é incrementada por mais 1, tendo agora o valor 2. Como 2 é menor ou igual a 5, ocorre um novo cálculo. Desta vez a variável FATORIAL que possui o valor 1 é multiplicada pela variável CONTADOR que possui o valor 2, resultando 2 para FATORIAL. Daí a variável CONTADOR é incrementada de mais 1, tendo agora o valor 3. Desta forma, serão executados os outros cálculos até que a condição se torne falsa e seja então apresentado o valor 120. Veja em seguida a tabela com os valores das variáveis antes e durante a execução do laço:

Algoritmo e Linguagem de Programação

O programa deve executar as multiplicações sucessivamente e acumulá-las a fim de possuir o valor 120 após cinco passos.

62


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

Algoritmo e Linguagem de Programação

ABERTA DO BRASIL

Contador 1 2

Fatorial 1 1

3

2

4

6

5

24

Fatorial ? Fatorial*Contador Comentários 1 Valor inicial das variáveis e da fatorial 2 Cálculo da fatorial com o contador em 2 6 Cálculo da fatorial com o contador em 3 24 Cálculo da fatorial com o contador em 4 120 Cálculo da fatorial com o contador em 5

Perceba que quando a variável CONTADOR está com valor 5, a variável FATORIAL está com o valor 120. Neste ponto, o laço é encerrado e é apresentado o valor da variável FATORIAL. Português Estruturado Programa FATORIAL1 Var CONTADOR : inteiro FATORIAL : inteiro Início

←1 CONTADOR ← FATORIAL

Enquanto (CONTADOR <= 5) Faça

←FATORIAL * CONTADOR CONTADOR ←CONTADOR + 1

FATORIAL

Fim_enquanto Escreva “Fatorial de 5 é = “, FATORIAL Fim No código anterior, estão sendo apresentadas pela instrução escreva duas informações, sendo uma mensagem e uma variável. Note que isto é feito utilizando uma vírgula para separar as duas informações. 3.2– Segundo Exemplo Com base no mesmo problema do cálculo da fatorial de 5, é apresentada em seguida a solução utilizando o laço de repetição do tipo repita.

63


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Português Estruturado Programa FATORIAL 2 Var CONTADOR : inteiro FATORIAL : inteiro

←1 CONTADOR ←1 FATORIAL

Repita

←FATORIAL * CONTADOR CONTADOR ←CONTADOR + 1 FATORIAL

Até_que (CONTADOR > 5) Escreva “Fatorial de 5 é = “, FATORIAL Fim

3.3 – Terceiro Exemplo Com base no mesmo problema do cálculo da fatorial de 5, é apresentado em seguida a solução utilizando o laço de repetição do tipo para. Português Estruturado Programa FATORIAL 3 Var CONTADOR ; inteiro FATORIAL : inteiro Início

FATORIAL 1 Para CONTADOR de 1 até 5 passo 1 faça

FATORIAL FATORIAL * CONTADOR Fim_para Escreva “FATORIAL de 5 é = ' , FATORIAL

Algoritmo e Linguagem de Programação

Início

Fim

4 – Exercícios de Aprendizagem (Laços Indeterminados) Com o objetivo de mostrar um exemplo prático de uso do conceito de laços de repetição indeterminados, veja em seguida dois exemplos de aprendizagem, criados com os conceitos de laços de repetição do tipo enquanto e repita. Nesta situação em específico não é possível a solução com a utilização do laço de repetição do tipo para. No tópico anterior, foi apresentado um exemplo para a resolução do problema do cálculo da fatorial de 5. Neste sentido, seria melhor possuir a solução aberta para que um programa calcule a fatorial de um número qualquer. Seria também interessante capacitar o programa a calcular outras fatoriais até que o usuário não mais deseje utilizar o programa. Sendo assim, o programa deve pedir ao usuário a sua continuidade ou não.

64


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

4.1 – Primeiro Exemplo O primeiro exemplo apresenta um programa que efetua o cálculo da fatorial de um número qualquer. O programa em questão solicita ao usuário autorização de continuidade de execução e controla esta opção com o laço de repetição do tipo enquanto.

Algoritmo e Linguagem de Programação

Algoritmo 1. 2. limite 3. 4.

Inicializar as variáveis FATORIAL e CONTADOR com 1; Definir as variáveis RESP (resposta) para confirmação e N para receber o de valor para o cálculo da fatorial; Enquanto RESP do usuário for sim, executar os passos 3, 4, 5, 6 e 7; Repetir a execução dos passos 4 e 5 por N vezes;

5. 6. 7. 8.

FATORIAL FATORIAL * CONTADOR; Incrementar 1 à variável CONTADOR; Solicitar autorização de continuidade do programa; Apresentar ao final o valor obtido.

Português estruturado Programa FATORIAL 4 Var CONTADOR, FATORIAL, N : inteiro RESP : caractere Início

RESP “SIM” Enquanto (RESP = “SIM”) faça

FATORIAL 1 Escreva “Fatorial de que número: “ Leia N Para CONTADOR de 1 até N passo 1 faça

FATORIAL FATORIAL * CONTADOR Fim_para Escreva “Fatorial de “ , N , “é = “, FATORIAL Escreva “Deseja continuar?” Leia RESP Fim_enquanto Fim

4.2 – Segundo Exemplo O segundo exemplo apresenta um programa que efetua o cálculo da fatorial de um número qualquer. O programa em questão solicita ao usuário autorização de continuidade de execução e controla esta opção com o laço de repetição do tipo repita.

65


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo

5. 6. 7. 8.

FATORIAL FATORIAL * CONTADOR; Incrementar 1 à variável CONTADOR; Solicitar autorização de continuidade do programa; Apresentar ao final o valor obtido.

Português estruturado programa FATORIAL 5 var CONTADOR, FATORIAL, N : inteiro RESP : caractere Início RESP

←“SIM” Repita

FATORIAL 1 Escreva “Fatorial de que número: “ Leia N Para CONTADOR de 1 até N passo 1 faça

FATORIAL FATORIAL * CONTADOR Fim-para Escreva “Fatorial de “, N , “é = “, FATORIAL Escreva “ Deseja continuar?” Leia RESP Até_que (RESP < > “ SIM ”) Fim

Algoritmo e Linguagem de Programação

1. Inicializar as variáveis FATORIAL r CONTADOR com 1; 2. Definir as variáveis RESP (resposta) para confirmação; 3. Solicitar o valor de N para receber o limite de valor para o cálculo da fatorial; 4. Repetir a execução dos passos 4 e 5 por N vezes;

66


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Roteiro: a) b)

Matrizes Unidimensionais Estrutura da decisão em Java.

Roteiro de Atividades Passo 1 - Leitura do Texto sobre Matrizes Unidimensionais; Passo 2 - Realização dos Exercícios de Fixação; Passo 3 - Realização das Tarefas de Algoritmos.

Algoritmo e Linguagem de Programação

Semana4

67


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

1 – Tabelas em Memória As matrizes (tabelas em memória) de uma dimensão ou matrizes unidimensionais são utilizadas na criação de tabelas que são armazenadas em memória primária. Este tipo de estrutura caracteriza-se por ser formado por uma única variável que será dimensionada com um determinado tamanho.

Para se ter uma idéia de como utilizar matrizes em uma determinada situação, serão apresentados dois programas, um com o uso de variáveis simples e o outro com o uso de uma matriz. Considere para tanto o seguinte problema: Elaborar um programa que efetue a leitura e apresente as médias de uma turma de 8 alunos. A lista seguinte apresenta o número de alunos e suas respectivas médias anuais. Com o conhecimento adquirido até este momento, possivelmente seria elaborado um programa conforme indicado na figura 5.1.

Aluno 1 2 3 4 5 6 7 8

Média 4.5 6.5 8.0 3.5 6.0 7.0 6.5 6.0

Algoritmos 1.

Ler oito valores para a média de cada aluno;

2.

Apresentar o valor da média de cada aluno.

Algoritmo e Linguagem de Programação

A dimensão de uma matriz é constituída de constantes inteiras e positivas. Os nomes dados às matrizes seguem as mesmas regras de nomes utilizados para indicar as variáveis simples.

Português Estruturado Programa MÉDIA Var Md1, MD2, MD3, MD4, MD5, MD6, MD7, MD8 : real Início Leia MD1, MD2, MD3, MD4, MD5, MD6, MD7, MD8 Escreva MÉDIA Fim

68


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Perceba que para receber a média foram utilizadas no exemplo anterior oito variáveis. Com a técnica proposta neste capítulo é possível utilizar apenas uma variável com a capacidade de armazenar os oito valores.

Algoritmo e Linguagem de Programação

2 – Operações Básicas com Matrizes Uma matriz de uma dimensão deve ser representada por um nome e por uma dimensão. Desta forma seria conveniente definir para o problema proposto no tópico anterior a matriz MD (para armazenar os valores das médias) com uma dimensão para oito elementos. Assim sendo, ela deveria ser representada computacionalmente como: MB[1..8]. Isto significa que podem ser armazenados em MD até oito elementos (de 1 a 8). Anteriormente foi definido o conceito de variável como sendo a região de memória que será utilizada pelo programa para armazenar um certo tipo de dado por um determinado espaço de tempo. No caso das matrizes (variáveis indexadas) pode ser armazenado mais de um valor por vez, desde que os valores não estejam nas mesmas posições de memória, pois cada posição armazena apenas um valor por vez. Observe que a matriz MD[1..8] será formada por oito posições: MD[1], MD[2], MD[3], MD[4], MD[5], MD[6], MD[7] e MD[8]. Desta FORM poder-se-á manipular uma quantidade maior de dados ou informações com pouco trabalho de processamento. Deve-se apenas considerar que com relação à manipulação dos elementos de uma matriz, ocorrerá de forma individualizada, pois não é possível efetuar a manipulação de todos os elementos do com junto ao mesmo tempo. Na utilização de matrizes deve ser usada em português estruturado a instrução conjunto que indica a utilização de uma matriz, tendo como sintaxe: VARIÁVEL: conjunto[<dimensão>] de <tipo de dado>, em que <dimensão> será a indicação dos valores inicial e final do tamanho da matriz e <tipo de dado> se o vetor em questão vai utilizar valores reais, inteiros ou caracteres. A leitura dos dados de uma matriz é processada passo a passo, um elemento por vez. A instrução de leitura é leia seguida da variável indexada mais o índice de controle. O processo de escrita é semelhante ao processo de leitura de seus elementos. Para esta ocorrência deve ser utilizada a instrução escreva seguida da indicação da variável indexada e seu índice de controle. Algoritmo 1.

Ler oito valores para a média de cada aluno em uma variável indexada;

2. Apresentar os valores das médias de cada aluno armazenados na variável indexada.

69


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Português Estruturado Programa MÈDIA Var MD : conjunto [ 1..8 ] de real I : inteiro

Para I de 1 até 8 passo 1 faça Leia MD [ I ] Fim_para Para I de 1 até 8 passo 1 faça Escreva MD[ I } Fim_para Fim

Observe que apesar de o programa ficar maior em número de linhas, ficou mais compacto, além de possibilitar uma modalidade maior, pois de houver a necessidade de efetuar o cálculo para um número maior de alunos, basta dimensionar a matriz e mudar o valor da instrução para. Observe que tanto a leitura quanto a escrita são processadas uma linha por vez. Desta forma, a matriz é controlada pelo número do índice que faz com que cada entrada aconteça em uma posição diferente da outra. Assim sendo, a matriz passa a ter todas as médias. A tabela seguinte mostra como ficarão os valores armazenados na matriz.

Matriz: MD Índice 1 2 3 4 5 6 7 8

Elemento 4.5 6.5 8.0 3.5 6.0 7.0 6.5 6.0

Algoritmo e Linguagem de Programação

Início

Tenha cuidado para não confundir o índice com o elemento. Índice é o endereço de alocação de uma unidade da matriz, enquanto elemento é o conteúdo armazenado em um determinado endereço. 3 – Exercícios de Aprendizagem Para demonstrar a utilização mais intensa do conceito de matrizes, considere como problemas os exemplos apresentados em seguida. 3.1 – Primeiro Exemplo Desenvolver um programa que efetue a leitura de dez elementos de uma matriz denominada A de uma dimensão. Construir uma matriz denominada B de mesmo tipo que a matriz A, observando a seguinte lei de formação: se o valor do índice da matriz A for par, o valor (elemento) deve ser existente o valor 5. Ao final mostrar o conteúdo da matriz B.

70


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo

Algoritmo e Linguagem de Programação

Este exemplo de resolução mostra como fazer o tratamento da condição do índice. 1. Iniciar o contador de índice, variável l como 1 em um contador até 10. 2. Ler os 10 valores, um a um; 3. Verificar se o índice é par; se sim, multiplica por 5, se não soma 5. Criar a matriz B; 4. Apresentar os conteúdos das duas matrizes.

Português Estruturado Programa VERIFICA_ÍNDICE Var A, B : conjunto [1..10] de real I, R : inteiro Início Para I de 1 até 10 passo 1 faça Leia A [ I ] Fim_para Para I de 1 até 10 passo 1 faça

R I – 2 * (I div 2) Se (R = 0) então B[I] Senão

←A [ I ] * 5 ←

B[I] A[I]+5 Fim_se Fim_para Para I de 1 até 10 passo 1 faça Escreva B [ I ] Fim_para Fim

3.2 – Segundo Exemplo Desenvolver um programa que efetue a leitura de cinco elementos de uma matriz A de uma dimensão. No final, apresente o total da soma de todos os elementos que sejam ímpares existentes dentro da matriz A. Algoritmo Perceba que em relação ao primeiro exemplo, este apresenta uma diferença: o primeiro pedia para verificar se o índice era par ou ímpar. Neste exemplo está sendo solicitado que se analise a condição do elemento ser impar e não do índice. Foi observado anteriormente para tomar cuidado e não confundir elemento com índice. 1. Iniciar o contador de índice, variável l como 1 em um contador até 5;

71

2. Ler os 5 valores, um a um;


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

3. Verificar se o elemento é ímpar; se sim efetuar a soma dos elementos; 4. Apresentar o total de todos os elementos ímpares da matriz. Português Estruturado Programa CHECA_ELEMENTO

A : conjunto [1..5] de inteiro R, I, SOMA : inteiro Início

SOMA 0 Para I de 1 até 5 passo 1 faça Leia A (I) Fim_para Para I de 1 até 5 passo 1 faça

R A [I] – 2 * (A[ I ] div 2) Se ( R < > 0) então SOMA Fim_se Fim_para Escreva SOMA

←SOMA * (A [I ]

Fim Se desejar, em seguida pode executar a primeira bateria (exercício de fixação 1) apresentada no final do capítulo para treinar a aplicação do conceito de matrizes unidimensionais. Depois continue deste ponto para poder fazer a segunda bateria de exercícios. 4 – Classificação de Elementos O conceito de utilização de matrizes em programação é bastante amplo. Pode ser utilizado para resolver problemas de diversas situações. Uma das situações mais peculiares é a necessidade de efetuar a ordenação de elementos em uma matriz. Quando os elementos forem do tipo numérico, a ordenação pode ser crescente ou decrescente. Quando os elementos forem do tipo caractere, a ordenação pode ser ascendente ou descendente.

Algoritmo e Linguagem de Programação

Var

Existem vários métodos para obter a ordenação de elementos de uma matriz. Nesta obra, será apresentado um método bastante simples de ordenação, que consiste na comparação de cada elemento com todos os elementos subseqüentes. Sendo o elemento comparado menor para ordenação decrescente, ou maior para ordenação crescente que o atual, ele será trocado de posição com o outro elemento. Este método caracteriza-se por usar o conceito de permuta entre os valores (troca) Para demonstrar este tipo de ação, imagine o seguinte programa: Elaborar um programa que efetue a leitura de cinco valores numéricos inteiros em uma matriz A de uma dimensão. Apresentar os valores da matriz em ordem crescente.

72


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo Considere para a solução do problema proposto a explicação dos valores apresentados na tabela seguinte:

Algoritmo e Linguagem de Programação

Matriz: A Índice 1 2 3 4 5

Elemento 9 8 7 5 3

Observe que os valores estão armazenados na ordem: 9, 8, 7, 5 e 3 e deverão ser apresentados na ordem 3, 5, 7, 8 e 9. Para efetuar o processo de ordenação, é adequado fazer o uso do método de propriedade distributiva para que todos os valores sejam combinados entre si, de forma que não falte nenhuma combinação, tampouco ocorra repetição de uma combinação já estabelecida. Desta forma, o elemento que estiver em A[l] deve ser comparado com os elementos que estiverem em a[2], A[3], A[4] e A[5]. Depois o elemento que estiver em A[2] não necessita ser comparado com o elemento que estiver em A[l], pois já foi anteriormente comparado, passando a ser comparado somente com os elementos que estiverem em A[3], A[4] e A[5]. Na seqüência, o elemento que estiver em A[3] é comparado com os elementos que estiverem em A[4] e A[5], e por fim o elemento que estiver em A[4] é comparado com o elemento que estiver em A[5]. Seguindo este raciocínio, basta comparar o valor do elemento armazenado em A[ l ] (valor 9) com o valor do elemento armazenado A[2] (valor 8). Se o primeiro for maior que o segundo, então trocam-se os seus valores. Como a condição de troca é verdadeira, o elemento 9 de A [l ] é maior que o elemento 8 de A[2]. Passa-se para A[ l ] o elemento 9, desta forma os valores dentro da matriz passam a ter a seguinte formação:

Matriz: A Índice 1 2 3 4 5

Elemento 8 9 7 5 3

Em seguida, usando a mesma regra, o valor atual da posição A[ l ] (no caso, valor 8) deve ser comparado com o próximo valor após a sua última comparação, ou seja, deve ser comparado com o elemento A[3]. Assim sendo, verifica-se que o atual valor do elemento de A[ l ] (valor 8) é maior que o valor do elemento de A[3] (valor 7). Efetua-se então a sua troca, ficando A[ l ] com o valor 7 e A[3] com o valor 8. desta forma, os valores da matriz passam a ter a seguinte formação: 73


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Matriz: A Elemento 7 9 8 5 3

Agora devem ser comparados os valores dos elementos armazenados nas posições A[ l ] (valor 7) e A[4] (valor 5). O valor do elemento 7 de A[ l ] é maior que o valor do elemento 5 de A[4]. Eles são trocados, passando A[ l ] a possuir o valor 5 e A[4] a possuir o valor 7. A matriz passa a ter a seguinte formação:

Matriz: A Índice 1 2 3 4 5

Elemento 5 9 8 7 3

Observe que até aqui os elementos comparados foram sendo trocados de posição, estando agora em A[ l ] o elemento de valor 5 e que será mudado mais uma vez por ser maior que o valor do elemento 3 armazenado em A[5]. Desta forma, a matriz passa a ter a seguinte formação:

Matriz: A Índice 1 2 3 4 5

Elemento 3 9 8 7 5

Algoritmo e Linguagem de Programação

Índice 1 2 3 4 5

A partir deste ponto o elemento de valor 3 armazenado em A[ l ] não necessita mais ser comparado. Assim sendo, deve ser pego o atual valor do elemento da posição A[2] e comparado sucessivamente com todos os outros elementos restantes. Desta forma, o valor do elemento armazenado em A[2] deve ser comparado com os elementos armazenados em A[3], A[4] e A[5], segundo a regra da aplicação de propriedade distributiva. Comparando o valor do elemento 9 da posição A[2] com o elemento 8 da posição A[3] e efetuando a troca de forma que 8 esteja em A[2] e 9 esteja em A[3], a matriz passa a ter a seguinte formação:

74


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

Matriz A Índice 1 2 3 4 5

Elemento 3 8 9 7 5

Em seguida, o atual valor do elemento de A[2] (valor 8) deve ser comparado com o valor do elemento de A[4] (valor 7. 8 é maior que 7 e são trocados, ficando A[2] com 7 e A[4] com 8. Desta forma, a matriz passa a ter a seguinte formação:

Matriz: A Índice 1 2 3 4 5

Elemento 3 7 9 8 5

Então continua o processo de comparação e troca. O atual valor do elemento na posição A[2] é 7 e será comparado com o valor do elemento A[5] que é 5. São estes valores trocados, passando A[2] ficar com o elemento 5 e A[5] ficar com o elemento 7, conforme indicado em seguida:

Matriz: A Índice 1 2 3 4 5

Elemento 3 5 9 8 7

Note que até este ponto a posição A[2] foi comparada com todas as suas posições subseqüentes, não tendo mais nenhuma comparação para ela. Agora será efetuada a comparação da próxima posição com o restante. No caso, de A[3] com A[4] e A[5]. Sendo assim, o valor do elemento da posição A[3] (valor 9) será comparado com o valor da posição A[4] (valor 8). Serão estes trocados, ficando A[3] com 8 e A[4] com 9, conforme em seguida:

75


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Matriz: A Elemento 3 5 8 9 7

A seguir, será comparado o valor do elemento da posição A[3] (valor 8) com o valor do elemento da posição A[5] valor 7). Sendo o primeiro maior que o segundo, ocorre a troca. Desta forma A[3] passa a possuir o elemento 7 e A[5] passa a possuir o elemento 8, como indicado em seguida:

Matriz A Índice 1 2 3 4 5

Elemento 3 5 7 9 8

Após efetuar todas as comparações necessárias de A[3] com A[4] e A[5], fica somente a última comparação que é A[4] com A[5], cujos valores são trocados, passando A[4} possuir o elemento de valor 8 e A[5] possuir o elemento de valor 9, como mostrado em seguida:

Matriz: A Índice 1 2 3 4 5

Elemento 3 5 7 8 9

Algoritmo e Linguagem de Programação

Índice 1 2 3 4 5

Desta forma, pode-se notar que a referida ordenação foi executada, apresentando os elementos da matriz em ordem crescente. OBSERVAÇÃO: Para dados do tipo caractere o processo é o mesmo, uma vez que cada letra possui um valor diferente da outra. A letra “A”, por exemplo, tem valor menor que a letra “B”, e assim por diante. Se a letra “A” maiúscula for comparada com a letra “a” minúscula, terão valores diferentes. Cada caractere é guardado na memória de um computador segundo o valor de um código que recebe o nome de ASCII (American Standard Cód for Information Intercgange – Código Americano Padrão para Troca de Informações). E é com base nessa tabela que o processo de ordenação trabalha, pois cada caractere tem um peso, um valor previamente determinado, segundo este padrão.

76


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Diagrama de Quadros

Algoritmo e Linguagem de Programação

A seguir, é apresentado o diagrama de quadros da entrada, processamento de ordenação e apresentação dos valores ordenados. Atente para dois pontos: 1. O primeiro ponto a ser observado é a utilização de uma segunda variável para controlar o índice subseqüente no processo de ordenação, no caso a variável J. Observe que a variável I é iniciada pela instrução para como: 1 de 1, e depois pela instrução para que está sendo encadeada à primeira e iniciando a variável J, como J de I + 1. Isto implica na seguinte seqüência:

Quando I for 1 2 3 4

J será 2,3,4,5 3,4,5 4,5 5

Observe que somente quando a variável J atinge o valor 5 é que este laço de repetição se encerra, retornando ao laço de repetição da variável I, acrescentando mais um em I até que I atinja o seu limite e ambos os laços sejam encerrados. Quando a variável I for 1, a variável J será 2 e contará até 5. Ao final deste ciclo, a variável é acrescentada de mais 1, tornando-se 2; assim sendo, a variável J passa a ser 3. Quando a variável J voltar a ser 5 novamente, a variável I passa a ser 3 e a variável J passa a ser 4. Este ciclo vai ser executado até que por fim a variável I seja 4 e a variável J seja 5, e será comparado o penúltimo elemento com o seu elemento subseqüente, no caso o último. 2. O segundo ponto a ser observado é a utilização do algoritmo de troca, utilizado junto da instrução de decisão se A[/] > A[J] então. Após a verificação desta condição, sendo o primeiro valor maior que o segundo, efetua-se então a sua troca com o algoritmo: X ←A[I] A[I] ←A[J] A[J] ←X Considere o elemento A[I] com o valor 9 (posição 1) e o elemento A[J] com o valor 8 (posição 2). Após a troca, o elemento A[I] deve estar com o valor 8 e o elemento A[J] com o valor 9. Para conseguir este efeito, é necessária a utilização de uma variável de apoio, a qual está sendo denominada X. Para que o elemento A[I] fique livre para receber o valor do elemento A[J], X deve ser implicado pelo valor do elemento A[I]. Assim sendo, X passa a ter o valor 8. Neste momento pode-se implicar o valor de A[J] em A[I]. Desta forma o elemento A[I] passa a possuir o valor 9. Em seguida, o elemento A[J] é implicado pelo valor que está em X. Ao final deste processo, ter-se-á A[I] com o valor 8 e A[j] com valor 9.

77


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Programa ORDENAÇÃO Var A : conjunto [ 1 . . 5 ] de inteiro I, J, : inteiro Início

para I de 1 até 5 passo 1 faça leia A [ I ] fim_para (Rotina de processamento de ordenação) para I de 1 até 4 passo 1 faça para J de I + 1 até 5 passo 1 faça se (A [ I ] > A [ J ] ) então

←A [ I ] A [ I ] ←A [ J ] A [ J ] ←X X

Fim_se Fim_para Fim_para (Rotina de saída com dados ordenados) para I de 1 até 5 passo 1 faça escreva A[ I ] fim_para fim OBSERVAÇÃO: Um detalhe a ser observado neste exemplo é a utilização dos comentários colocados entre as chaves. Comentários deste tipo servem para documentar o programa, facilitando a interpretação de um determinado trecho. 5 – Métodos de Pesquisa

Algoritmo e Linguagem de Programação

(Rotina de entrada de dados)

O trabalho com matrizes envolve muitas vezes o uso de grandes tabelas, dificultando localizar um determinado elemento de forma rápida. Imagine uma matriz possuindo 4000 elementos. Será que você conseguiria encontrar rapidamente um elemento desejado de forma manual, mesmo estando a lista de elementos devidamente ordenada? Certamente que não. Para solucionar este tipo de problema, você pode fazer pesquisas em matrizes com o uso de programação. Serão apresentados dois métodos para efetuar pesquisa em uma matriz, sendo o primeiro o seqüencial e o segundo o método de pesquisa binária. 5.1 – Pesquisa Seqüencial O primeiro método consiste em efetuar a busca da informação desejada a partir do primeiro elemento seqüencialmente até o último. Localizando a informação no caminho, ela é apresentada. Este método de pesquisa é lento, porém eficiente nos casos em que uma matriz possua seus elementos desordenados.

78


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Considerando a necessidade de trabalhar com uma matriz com 10 nomes, veja em seguida o algoritmo, diagrama de quadros e codificação em português estruturado para efetuar uma pesquisa seqüencial na referida matriz.

Algoritmo e Linguagem de Programação

Algoritmo O algoritmo indicado em seguida estabelece a entrada de 10 nomes e a apresentação de nomes que venham a ser solicitados durante a fase de pesquisa. 1. Iniciar um contador e pedir a leitura de 10 nomes; 2. Criar um laço que efetue a pesquisa enquanto o usuário assim o desejar. Durante a fase de pesquisa, deve ser solicitada a informação a ser pesquisada. Essa informação deve ser comparada com o primeiro elemento; sendo igual mostra; caso contrário, avança para o próximo. Se não achar em toda lista, informar que não existe o elemento pesquisado; se existir, deve mostrá-lo; 3. Encerrar a pesquisa quando desejado Português Estruturado Programa PESQUISA-SEQUÊNCIAL Var NOME ; conjunto [ 1 . . 10 ] de caractere I : inteiro PESQ : caractere RESP : caractere ACHA : lógico Início Para I de 1 até 10 passo 1 faça Leia NOME [ I ] Fim_para RESP = “SIM” Enquanto (RESP = “SIM” faça (início da rotina de pesquisa) escreva “Entre o nome a ser pesquisado;” leia PESQ I

←1 ←

ACHA . Falso . Enquanto ( I <= 10) .e. (ACHA = .Falso.) faça se (PESQ = NOME [ I ] ) então ACHA Senão

79

←. Verdadeiro.

I I+1 Fim_se Fim_enquanto Se ( ACHA = .Verdadeiro.) então Escreva PESQ, “ foi localizado na posição “, I Senão Escreva PESQ, “ não foi localizado”


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Fim-se (Fim da rotina de pesquisa) escreva “Deseja continuar? “ leia RESP fim_enquanto fim

1.

leia PESQ

2.

I

3. 4. 5.

ACHA . Falso. enquanto ( I <= 10 ) .e. (ACHA = .Falso. ) faça se (PESQ = NOME [ I ] então

6. 7. 8. 9. 10. 11. 12. 13. 14. 15.

←1 ←

ACHA senão

←.Verdadeiro. )

então

I I + 1 fim_se fim_enquanto se (ACHA = .Verdadeiro.) então escreva PESQ, “foi localizado na posição”, I senão escreva PESQ, “não foi localizado” fim_se

Na linha 1, é solicitado que se informe o nome a ser pesquisado na variável PESQ, em seguida, na linha 2, é setado o valor do contador de índice como 1 e na linha 3, a variável ACHA é setada como tendo um valor falso. A linha 4 apresenta a instrução enquanto, indicando que enquanto o valor da variável I for menor ou igual a 10 e simultaneamente o valor da variável ACHA for falso, deve ser processado o conjunto de instruções situadas nas linhas 5, 6, 7, 8 e 9. Neste ponto, a instrução se da linha 5 verifica se o valor da variável PESQ é igual ao valor da variável indexada NOME [ 1 }, e se for igual, é sinal que o nome foi encontrado. Neste caso, a variável ACHA passa a ser verdadeira, forçando a execução da linha 11, uma vez que uma das condições do laço enquanto da linha 4 se tornou falsa. Na linha 11, é confirmado se a variável ACHA está mesmo com o valor verdadeiro. Sendo esta condição verdadeira, é apresentada a mensagem da linha 12.

Algoritmo e Linguagem de Programação

Anteriormente foi montada a rotina de pesquisa seqüencial empregada em um contexto prático. Observe o trecho seguinte que executa a pesquisa com seus comentários:

Caso na linha 5 seja verificado que o valor de PESQ não é igual a NOME [ 1 ], será então incrementado 1 à variável I. Será executada a próxima verificação de PESQ com NOME [2], e assim por diante. Caso o processamento chegue até o final e não seja encontrado nada, a variável ACHA permanece com valor falso. Quando analisada pela linha 11, será então falsa e apresentará a mensagem da linha 14.

80


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

Observe que a variável ACHA exerce um papel importante dentro da rotina de pesquisa, pois serve como um pivô, estabelecendo um valor verdadeiro quando uma determinada informação é localizada. Este tipo de tratamento de variável é conhecido pelo nome de FLAG (Bandeira). A variável ACHA é o flag, podendo dizer que, ao começar a rotina, a bandeira estava “abaixada” – falsa; quando a informação é encontrada, a bandeira é “levantada” – verdadeira, indicando a localização da informação desejada. 5.2 – Pesquisa Binária O segundo método de pesquisa é em média mais rápido que o primeiro, porém exige que a matriz esteja previamente classificada, pois esse método “divide” a lista em duas partes e “procura” saber se a informação a ser pesquisada está acima ou abaixo da linha de divisão. Se estiver acima, por exemplo, toda a metade abaixo é desprezada. Em seguida, se a informação não foi encontrada, é novamente dividida em duas partes, e pergunta se aquela informação está acima ou abaixo, e assim vai sendo executada até encontrar ou não a informação pesquisada. Pelo fato de ir dividindo sempre em duas partes o volume de dados é que o método recebe a denominação de pesquisa binária. Para exemplificar a utilização deste tipo de pesquisa, imagine a seguinte tabela:

Índice 1 2 3 4 5 6 7

Elemento 10 11 12 15 17 18 20

A tabela está representando uma matriz de uma dimensão com 7 elementos. Deseja-se neste momento efetuar uma pesquisa de um dos seus elementos. No Caso, será escolhido o elemento 20, sendo este o último registro da tabela. O processo binário consiste em pegar o número de registros mais um e dividir por dois. Sendo assim, (7 + 1) div 2 = 4; o que interessa de fato é somente o valor do quociente inteiro. Então a tabela fica dividida em duas partes, como em seguida: Primeira parte após primeira divisão

Índice 1 2 3 4 81

Elementos 10 11 12 15


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Segunda parte após primeira divisão

Elementos 17 18 20

Após dividir a tabela em duas partes, deve ser verificado se a informação 20 está na primeira ou na segunda parte. Detecta-se que 20 está na segunda parte. Desta forma despreza-se a primeira e divide-se em duas partes novamente a segunda parte da tabela. Como são 4 elementos divididos por 2, resultam duas tabelas, cada uma com dois elementos, conforme em seguida: Primeira parte após segunda divisão.

Índice 4 5

Elementos 15 17

Segunda parte após segunda divisão

Índice 6 7

Elementos 18 20

Após esta segunda divisão, verifica-se em qual das partes 20 está situado. Veja que está na segunda parte; despreza-se a primeira e divide-se a segunda parte novamente por dois, sobrando um elemento em cada parte: Primeira parte após terceira divisão

Índice 6

Elementos 18

Algoritmo e Linguagem de Programação

Índice 5 6 7

Segunda parte após terceira divisão

Índice 7

Elementos 20

Após a terceira divisão, 20 é encontrado na segunda parte da tabela. Se estiver sendo pesquisado o elemento 14, ele não será apresentado por não existir. Considerando a necessidade de trabalhar com uma matriz com 7 elementos numéricos, veja em seguida o algoritmo, diagrama de quadros e codificação em português estruturado para efetuar uma pesquisa binária na referida matriz.

82


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo

Algoritmo e Linguagem de Programação

O algoritmo indicado em seguida estabelece a entrada de 7 valores numéricos e respectiva ordenação crescente. Em seguida efetua a apresentação somente dos valores que venham a ser solicitados durante a fase de pesquisa. 1. Iniciar um contador, pedir a leitura dos sete valores numéricos e colocá-los em ordem crescente; 2. Criar um laço que efetue a pesquisa enquanto o usuário assim o desejar. Durante a fase de pesquisa, deve ser solicitada a informação a ser pesquisada. Essa informação deve ser comparada, utilizando o método de pesquisa binária. Sendo igual mostra; caso contrário, avança para o próximo. Se não achar em toda lista, informar que não existe o elemento pesquisado; se existir, deve mostrá-lo; 3. Encerrar a pesquisa quando desejado. Português Estruturado O programa seguinte demonstra a utilização da rotina de pesquisa binária dentro de um contexto prático. Programa PESQUISA_BINÁRIA var A : conjunto [ 1. . 7 ] de inteiro I, X, J, PESQ, COMEÇO, FINAL, MEIO : inteiro RESP : caractere ACHA : lógico Início (Leitura dos elementos) para I de 1 até 7 passo 1 faça leia A [ I ] fim_para (Ordenação) para I de 1 até 6 passo 1 faça para J de I + 1 até 7 passo 1 faça se ( A [ I ] > A [ J ] ) então

←A [ I ] A [ I ] ←A [ J ] A [ J ] ←X X

Fim_se Fim_para Fim_para (trecho de pesquisa) 83

RESP “SIM” Enquanto ( RESP = “SIM” ) faça Escreva “Entre o elemento a ser pesquisado: “


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Leia PESQ

←1 FINAL ←7 ACHA ←. Falso. COMEÇO

MEIO (COMEÇO + FINAL) div 2 Se ( PESQ = A [ MEIO ] ) então

ACHA . Verdadeiro . Senão Se ( PESQ < A [ MEIO ] ) então FINAL Senão

←MEIO – 1 ←

COMEÇO MEIO + 1 Fim_se Fim_se Fim_enquanto Se (ACHA = . Verdadeiro . ) então Escreva PESQ, “ foi localizado na posição “, MEIO Senão Escreva PESQ, “ não foi localizado “ Fim_se Escreva “ Deseja continuar” “ Leia RESP (Fim do trecho de pesquisa) fim_enquanto fim

Anteriormente foi montada a rotina de pesquisa empregada dentro de um contexto. Observe em seguida o trecho que executa a pesquisa com seus comentários: 1.

Leia PESQ

2.

←1 FINAL ←7 ACHA ←. Falso.

3.

Algoritmo e Linguagem de Programação

Enquanto (COMEÇO < = FINAL) .e. (ACHA = . Falso . ) faça

COMEÇO

4. 5.

Enquanto (COMEÇO < = FINAL) .e. (ACHA = . Falso.) faça

6. 7.

MEIO (COMEÇO + FINAL) div 2 Se (PESQ = A [MEIO]) então

8. 9. 10.

ACHA . Verdadeiro . Senão Se (PESQ < A [MEIO]) então

11.

FINAL

←MEIO – 1

84


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

Algoritmo e Linguagem de Programação

ABERTA DO BRASIL

12.

Senão

13. 14. 15. 16. 17. 18. 19. 20. 21.

COMEÇO MEIO + 1 Fim_se Fim-se Fim_enquanto Se (ACHA = .Verdadeiro.) então Escreva PESQ, “foi localizado na posição”, MEIO Senão Escrava PESQ, “não foi localizado” Fim_se

Na linha 1, é solicitado que seja informado o dado a ser pesquisado. As linhas 2 e 3 inicializam as variações de controle COMEÇO com 1 e FINAL com 7. A linha 4 inicializa o flag ACHA. A linha 5 apresenta a instrução que manterá a pesquisa em execução enquanto o COMEÇO for menor ou igual ao FINAL e simultaneamente o flag ACHA seja falso. Assim sendo, o processamento divide a tabela ao meio, conforme instrução na linha 6, em que 1 que é o começo da tabela é somado com 7 que é o fim da tabela, resultando no total 8 que dividido por 2 resulta 4 que é o meio da tabela. Neste ponto, a tabela está dividida em duas partes. A instrução da linha 7 verifica se o valor fornecido para PESQ é igual ao valor armazenado na posição A [ 4 ]. Se for, o flag é setado como verdadeiro sendo em seguida apresentada a mensagem da linha 18. Se condição de busca não for igual, pode ocorrer uma de duas situações. A primeira situação em que a informação pesquisada está numa posição acima da atual no caso A [ 4 ], ou seja, o valor da variável PESQ é menor que o valor de A [ 4 ] (linha 10). Neste caso, a variável FINAL deve ser implicada pelo valor da variável MEIO subtraído de 1 (linha 11), ficando a variável FINAL com valor 3. Se for esta a situação ocorrida, será processada a linha 5 que efetuará novamente o laço pelo fato de o valor 1 da variável COMEÇO ser menor que um, igual ao valor 3 da variável FINAL. A instrução da linha 6 divide a primeira parte da tabela em mais duas partes, desta forma, o COMEÇO (valor 1) da tabela é somado com 3, resultando 4, e dividido por 2 resulta 2 (sendo considerada a parte inteira do resultado da divisão), que é o meio da primeira parte da tabela. A segunda situação pode ocorrer caso a informação pesquisada esteja abaixo do meio da tabela, ou seja, o valor da variável PESQ é maior que o valor de A [ 4 ] (linha 10). Neste caso, a variável COMEÇO deve ser implicada pelo valor da variável MEIO somado com 1 (linha 13), ficando a variável COMEÇO com valor 5. Se for esta a situação ocorrida, será processada a linha 5 que efetuará novamente o laço pelo fato de o valor 5 da variável COMEÇO ser menor que um, igual ao valor 7 da variável FINAL. A instrução da linha 6 divide a segunda parte da tabela em mais duas partes, desta forma, 5 é somado com 7, resultando 12 que dividido por 2 resultará 6, que é o meio da segunda parte da tabela. Seja qual for a situação executada, a rotina efetua o processo de divisão até encontrar uma das extremidades de tabela. Desta forma, se nada for encontrado até este momento, a rotina avisa que o referido elemento não foi localizado. Estrutura de Decisão em Java a) Comando Condicional (if)

85

O comando condicional ajuda a ilustrar um importante conceito de Java: os blocos de códigos. O comando if funciona em Java de forma muito parecida com os de outras linguagens. Na verdade, ele é sintaticamente idêntico ao if de C e C++.


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Sua forma mais simples é a seguinte: if (condição) Comando;

if (var<10) JOptionPane.showMessageDialog(null,“Var é menor que 10.”);

Neste caso, se var contiver um valor inferior a 10, a expressão condicional será verdadeira, e a linha contendo showMessageDialog() será executada. Se var contiver um valor maior ou igual a 10, a linha contendo showMessageDialog() será ignorada. Eis um programa que ilustra o comando if: 1. import javax.swing.JOptionPane; 2. public class Mostraif 3. { 4. public static void main(String[] args) 5. { 6. int i = 50; 7. int j = 100; 8. if (i<j) 9. JOptionPane.showMessageDialog(null, "i e menor que j."); 10. i *= 2; 11. if (i == j) 12. JOptionPane.showMessageDialog(null,"Agora i e igual a j."); 13. i *= 2; 14. if (i>j) 15. JOptionPane.showMessageDialog(null, "Agora i e maior que j."); 16. if (i == j) 17. JOptionPane.showMessageDialog(null,"Isso não será exibido."); /* Esta linha não será exibida. */ 18. } 19.}

Algoritmo e Linguagem de Programação

Neste exemplo, condição é uma expressão booleana. Se for verdadeira a (true), então o comando será executado. Se a condição for falsa (false), o comando será ignorado. Eis um exemplo:

A saída exibida por esse programa é a seguinte: I e menor que j. Agora i é igual a j. Agora i é maior que j. 1. O comando Condicional Composto (if/else) Quando usamos a estrutura if ela só funcionará se a condição for true. A estrutura if/else avalia se a expressão é true retornando um valor e se for false retorna outro – exemplo: 86


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

Algoritmo e Linguagem de Programação

ABERTA DO BRASIL

1. import javax.swing.JOptionPane; 2. public class MostraStatus 3. { 4. public static void main (String args []) 5. { 6. double num; 7. num = Double.parseDouble(JOptionPane.showInputDialog("Entre com um valor real")); 8. if (num == 0) /* se for fornecido um valor nulo, a seguinte mensagem exibida */ 9. { 10. JOptionPane.showMessageDialog(null,"Você deve fornecer um valor não nulo"); 11. } 12. if (num>=6.0) 13. JOptionPane.showMessageDialog(null,"Aprovado"); 14. else 15. JOptionPane.showMessageDialog(null,"Reprovado"); 16. } 17. }

Entrando com o valor de 5.5 para a média, a saída exibida será: Reprovado Perceba que o resultado mudará de acordo com o número digitado, como está definido na linha 7: num = Double.parseDouble(JOptionPane.showInputDialog("Entre com um valor real"));

1. Operador Condicional Ternário ?: O operador ternário nos dá uma maneira compacta de expressar uma simples instrução if-else. Este operador consiste em dois operadores separando a expressão em três diferentes expressões. Forma geral: condição ? expressão_1 : expressão2 A condição consiste em uma expressão lógica avaliada como verdadeira ou falsa. A condição é avaliada e se verdadeira a expressão condicional toda assume o valor da expressão_1, se falsa a expressão assume o valor da expressão_2. Eis um exemplo: max= (num1>num2)?num1:num2

87

Esta operação é equivalente à construção if-else seguinte, mas bem mais compacta.


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

if (num1>num2) Max=num1; else Max=num2;

1. import javax.swing.JOptionPane; 2. public class MostraStatus2 3. { 4. public static void main (String args [ ] ) 5. { 6. double num; 7. num = Double.parseDouble(JOptionPane.showInputDialog("Entre com um valor real")); 8. JOptionPane.showMessageDialog(null,num>=6 ? "Aprovado" : "Reprovado"); 9. } 10. }

Como vemos, o uso do operador ternário nos poupa tempo na execução de condições simples. 3.

Comando switch

O comando switch de Java permite que a execução de um programa escolha uma entre múltiplas ramificações. Ele representa uma forma fácil de dirigir a execução para diferentes partes do código com base no valor de uma expressão. Por isso, muitas vezes é melhor utilizar um switch do que uma longa série de comandos if-else-if. Eis a forma geral de um comando switch: switch (expressão) { case valor 1: / / Seqüência de comandos 1. break; case valor2: / / Seqüência de comandos 2. break; . . . case valorN: / / Seqüência de comandos N. break; default: / / Seqüência de comandos default. }/ / Fim do switch A expressão pode retornar qualquer tipo simples; cada um dos valores especificados nos comandos case deve ser compatível com o tipo de expressão. O valor de cada case deve ser um valor literal único (isto é, deve ser uma constante e não uma variável). Valores case duplicados não são permitidos.

Algoritmo e Linguagem de Programação

Pegamos o exemplo de item 9.2.1, usando o operador ternário ele ficaria da seguinte maneira:

88


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

O comando switch funciona da seguinte maneira: o valor da expressão é comparado com os valores literais de cada um dos comandos case. Se os valores forem iguais, a seqüência de código que se segue ao comando case correspondente é executada. Se nenhuma das constantes for igual ao valor da expressão, o comando default será executado. Contudo, o comando default é opcional. Se nenhum case for igual ao valor da expressão e não houver um comando default, nenhuma ação será executada. O comando break é usado dentro de um switch para terminar uma seqüência de comandos. Quando um comando break for encontrado, a execução saltará para a primeira linha de código que vem depois do comando switch. Ou seja, break tem o efeito de provocar um salto para fora do comando switch. Eis um exemplo de uso do comando switch: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.

import javax.swing.JOptionPane; public class SwitchDemo { public static void main (String[] args) { for (int i=0; i<6; i++) switch (i) { case 0: JOptionPane.showMessageDialog(null, "i=0"); break; case 1: JOptionPane.showMessageDialog(null, "i=1"); break; case 2: JOptionPane.showMessageDialog(null, "i=2"); break; case 3: JOptionPane.showMessageDialog(null, "i=3"); break; default: JOptionPane.showMessageDialog(null, "i=4"); } } }

A saída produzida por este programa é: i=0 i=1 i=2 i=3 i=4 i=4

89


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Cada vez que atravessamos o loop for (linha 6), os comandos associados com o case, cuja constante é igual ao valor de i, são executados (linhas 9 a 20). Todos os outros cases são ignorados. Depois que i assume um valor maior que 3, nenhum case corresponde ao valor de i, de modo que os comandos executados são os que correspondem a default (linha 21).

Algoritmo e Linguagem de Programação 90


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Roteiro: a) Matrizes Bidimensionais Roteiro de Atividades Passo 1 - Leitura do Texto sobre Matrizes Bidimensionais; Passo 2 - Realização dos Exercícios de Fixação; Passo 3 - Realização das Tarefas de Algoritmos.

Algoritmo e Linguagem de Programação

5ª Semana

91


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Matriz de duas dimensões 1– Matrizes com Duas Dimensões

A matriz de duas dimensões, por se relacionar diretamente com a utilização de tabelas, é a estrutura mais comumente utilizada. Matrizes com mais de duas dimensões são também utilizadas, porém com menos freqüência. Sabendo manipular adequadamente uma matriz de duas dimensões, será muito fácil utilizar matrizes que tenham três, quatro ou mais dimensões. Um importante aspecto a ser considerado é que na manipulação de uma matriz de uma dimensão utiliza-se apenas um laço. No caso de matrizes com mais dimensões, deve ser utilizado o número de laços relativo ao tamanho da dimensão atribuída a uma matriz. Desta forma, uma matriz de duas dimensões deve ser controlada com dois laços, uma matriz de três dimensões deve ser controlada com três laços e assim por diante. Em matrizes de mais de uma dimensão os seus elementos são também manipulados de forma individualizada, sendo a referência feita sempre por meio de dois índices: o primeiro para indicar a linha e o segundo para indicar a coluna. Desta forma, TABELA [2,3] indica que está sendo feita uma referência ao elemento armazenado na linha 2 coluna 3. 2 – Operações com Matrizes de Duas Dimensões Uma matriz de duas dimensões está sempre fazendo menção a linhas e colunas e é representada por seu nome e seu tamanho (dimensão) entre colchetes. Desta forma, é uma matriz de duas dimensões a estrutura TABELA [1..8, 1..5], cujo nome é TABELA, possuindo um tamanho de 8 linhas (de 1 a 8) e 5 colunas (de 1 a 5), ou seja, é uma matriz de 8 por 5 (8 x 5). Isto significa que podem ser armazenados na matriz TABELA até 40 elementos. A figura 6.1 apresenta a matriz TABELA com a indicação dos endereços (posições) que podem ser utilizados para armazenar seus elementos. Uma matriz de duas dimensões é atribuída pela instrução conjunto já utilizada para definir o uso de uma matriz de uma dimensão, sendo bastante parecidas em sua referência. A sintaxe é: VARIÀVEL : conjunto [ < dimensão 1:dimensão 2>] de < tipo de dado >, em que <dimensão1> e <dimensão2> são a indicação do tamanho da tabela e <tipo de dado> o tipo da matriz, que pode ser formada por valores reais, inteiros, lógicos ou caracteres.

Algoritmo e Linguagem de Programação

Nas aulas anteriores, foi trabalhado o uso de variáveis indexadas com apenas uma dimensão (uma coluna e várias linhas). A partir deste ponto, serão apresentadas tabelas com mais colunas. Sendo assim, teremos posições indexadas nos sentidos horizontal e vertical. Desta forma, essas tabelas são denominadas matrizes bidimensionais.

As operações de leitura e escrita de uma matriz de duas dimensões, assim como das matrizes de uma dimensão, são processadas passo a passo, um elemento por vez. A seguir, são apresentados o diagrama de quadros e codificação em português estruturado da leitura das 4 notas bimestrais de 8 alunos. Observe que está sendo considerada a leitura das 4 notas de 8 alunos. Assim sendo, a tabela em questão armazena 32 elementos. Um detalhe a ser considerado é a utilização de duas variáveis para controlar os dois índices de posicionamento de dados na tabela. Anteriormente, foi utilizada a variável I para controlar as posições dos elementos dentro da matriz, ou seja, a posição em nível de linha. Neste exemplo, a variável I continua tendo o mesmo efeito e a segunda variável, a J, está controlando a posição da coluna.

92


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

Ao analisar o diagrama de quadros, percebe-se a inicialização das variáveis I e J como 1, ou seja, a leitura será efetuada na primeira linha da primeira coluna. Em seguida é iniciado em primeiro lugar o laço da variável J para controlar a posição em relação às colunas. Veja que, ao serem iniciados os valores para o preenchimento da tabela, eles são colocados na posição NOTAS [1,1}, lembrando que o primeiro valor dentro dos colchetes representa a linha e o segundo representa a coluna. Assim sendo, será então digitada para o primeiro aluno a sua primeira nota. Depois é incrementado mais 1 em relação à coluna, sendo colocada para a entrada a posição NOTAS [1,2}, linha 1 e coluna 2. Desta forma, será digitada para o primeiro aluno a sua segunda nota. Quando o contador de coluna, o laço da variável J, atingir o valor 4, ele será encerrado. Em seguida o contador da variável I será incrementado com mais 1, tornandose 2. Será então inicializado novamente o contador J em 1, permitindo que seja digitado um novo dado na posição NOTAS [2,1]. O mecanismo de preenchimento estender-se-á até que o contador de linhas atinja o seu último valor, no caso 8. Esse laço é o principal, tendo a função de controlar o posicionamento na tabela por aluno. O segundo laço, mais interno, controla o posicionamento das notas. Português Estruturado Programa MATRIZ_BIDIMENSIONAL Var NOTAS : conjunto [ 1. . 8 , 1 . . 4 ] de real I, J : inteiro Início Para I de 1 até 8 passo 1 faça Para J de 1 até 4 passo 1 faça Leia NOTAS [ I , J ] Fim_para Fim_para Para I de 1 até 8 passo 1 faça Para J de 1 até 4 passo 1 faça Escreva NOTAS [ I , J ] Fim_para Fim_para fim

3 – Exercícios de Aprendizagem Para demonstrar a utilização de matrizes de duas dimensões, considere os exemplos apresentados em seguida:

3.1

93

Primeiro Exemplo

Desenvolver um programa de agenda que cadastre o nome, endereço, cep, bairro e telefone de 10 pessoas. Ao final, o programa deve apresentar os seus elementos dispostos em ordem alfabética, independentemente da forma em que foram digitados.


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo Para resolver este problema, você precisa de uma tabela com 10 linhas (pessoas) e 5 colunas (dados pessoais). Assim sendo, imagine essa tabela como sendo:

Nome 1

Endereço2

CEP3

Bairro4

Telefone5

Em cada coluna é indicado o seu número, sendo 5 colunas, uma para cada informação pessoal e o número de linha totalizando um conjunto de 10 informações. Nesta tabela, são utilizados dois elementos numéricos, o CEP e o Telefone, mas como não são executados cálculos com esses números, eles são armazenados como caracteres. Depois de cadastrar todos os elementos, é iniciado o processo de classificação alfabética pelo nome de cada pessoa. Este método já foi anteriormente estudado, bastando aplicá-lo neste contexto. Porém, após a comparação do primeiro nome com o segundo, sendo o primeiro maior que o segundo, devem ser trocados, mas os elementos relacionados ao nome também devem ser trocados no mesmo nível de verificação, ficando para o final o trecho de apresentação de todos os elementos. Diagrama de Quadros Neste exemplo, não estão sendo utilizados para a entrada de dados dois laços para controlar o posicionamento dos elementos na matriz. Note que as referências feitas ao endereço das colunas são citadas como constantes, durante a variação do valor da variável I.

Algoritmo e Linguagem de Programação

1 2 3 4 5 6 7 8 9 10

Com relação à ordenação de elementos de uma matriz de duas dimensões, o processo é o mesmo utilizado para ordenar matrizes de uma dimensão. Se você sabe fazer a ordenação de um estilo de matriz, sabe fazer a ordenação de qualquer estilo, seja ela da dimensão que for. Observe no trecho de ordenação (figura 6.3), a troca de posição de todos os elementos, assim que os nomes são comparados e verificado que estão fora de ordem. Perceba que assim que o nome é trocado de posição, os demais elementos relacionados a ele na mesma linha também o são. Para a apresentação dos dados ordenados estão sendo utilizados os dois laços para controlar linha e coluna.

94


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Português Estruturado

Algoritmo e Linguagem de Programação

Programa AGENDA Var DADO : conjunto [ 1 . . 10 , 1 . . 5 ] de caractere I, J, ATUAL, PRÓXIMO : inteiro X : caractere Início (Rotina de entrada) para I de 1 até 10 passo 1 faça escreva “Nome..........: “ leia DADO escreva “Endereço.....: “ leia DADO escreva “CEP.............: “ leia DADO escreva “Bairro..........: “ leia DADO escreva “Telefone......: “ leia DADO fim_para

[ I, 1 ] [ I, 2 ] [ I, 3 ] [ I, 4 ] [I, 5 ]

(Rotina de ordenação e troca de todos os elementos) para ATUAL de 1 até 9 passo 1 faça para PRÓXIMO de ATUAL + 1 até 10 passo 1 faça se (DADO [ ATUAL, 1 ] > DADO [ PRÓXIMO, 1] ) então (Troca Nome)

←DADO [ ATUAL, 1 ] DADO [ ATUAL, 1 ] ←DADO [ PROXIMO, 1] DADO [ PRÓXIMO, 1 ] ←X X

(Troca Endereço)

←DADO [ ATUAL ,2] DADO [ATUAL, 2 ] ←DADO [ PRÓXIMO, 2 ] DADO [PRÓXIMO, 2 ] ←X X

(Troca CEP)

←DADO [ ATUAL 3 ] DADO [ ATUAL, 3 ] ←DADO [ PRÓXIMO, 3 ] DADO [ PRÓXIMO, 3 ] ←X X

95


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

(Troca de Bairro) X

←DADO

[ ATUAL, 4 ]

←DADO [ PRÓXIMO, 4] DADO [ PRÓXIMO, 4] ←X DADO [ ATUAL, 4 ]

←DADO [ ATUAL, 5 ] DADO [ ATUAL, 5 ] ←DADO [ PRÓXIMO, 5 ] DADO [ PRÓXIMO, 5] ←X X

Fim_se Fim_para Fim-para (Rotina de saída) para I de 1 até 10 passo 1 faça para J de 1 até 5 passo 1 faça escreva DADO [ I, J] fim_para fim_para fim

O trecho de ordenação do programa AGENDA pode ser simplificado com a inserção de um laço para administrar a troca após a verificação da condição: se (DADO [ATUAL,1] > DADO [ PRÓXIMO,1]) então. Diagrama de Quadros Neste segundo exemplo está sendo levado em consideração apenas para o diagrama de quadros o trecho correspondente à ordenação.

Algoritmo e Linguagem de Programação

(Troca Telefone)

Português Estruturado Programa AGENDA Var DADO : conjunto [ 1 . . 10 , 1 . . 5 ] de cracteres I , J , K , ATUAL, PRÓXIMO : inteiro X : caractere Início (Rotina de entrada) 96


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

para I de 1 até 10 passo 1 faça escreva “Nome.......: “ leia DADO [ I , 1 ] escreva “Endereço..: “ leia DADO [ I , 2 ] escreva “CEP.........: “ leia DADO [ I , 3 ] escreva “bairro.......: “ leia DADO [ I , 4 ] escreva “Telefone...: “ leia DADO [ I , 5 ] fim_para (Rotina de ordenação e troca de todos os elementos) (com laço para administrar a troca de elementos) para ATUAL de 1 até 9 passo 1 faça para PRÓXIMO de ATUAL + 1 até 10 passo 1 faça se (DADO [ ATUAL, 1] > DADO [ PRÓXIMO, 1 ] ) então para K de 1 até 5 passo 1 faça

←DADO [ ATUAL, K] DADO [ATUAL, K ] ←DADO[PRÓXIMO,K] DADO [PRÓXIMO, k] ←X X

Fim_para Fim_para Fim_para Fim_para (Rotina de saída) para I de 1 até 10 passo 1 faça para J de 1 até 5 passo 1 faça escreva DADO [ I < J ] fim_para fim_para fim

3.2 – Segundo Exemplo Desenvolver um programa que efetue a leitura dos nomes de 8 alunos e também de suas 4 notas bimestrais. Ao final, o programa deve apresentar o nome de cada aluno classificado em ordem alfabética, bem como suas médias e a média geral dos 8 alunos. Algoritmo Neste exemplo, é apresentado um problema cuja solução será utilizar duas matrizes para a entrada de dados. Já é sabido que uma matriz trabalha somente com dados de mesmo tipo (homogêneos). E neste caso, em particular, será necessário ter uma matriz tipo vetor para armazenar os nomes e a outra tipo tabela para armazenar as notas, uma vez que os tipos de dados a serem manipulados são diferentes. Considere para tanto as duas tabelas seguintes:

97


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Nome

Notas 1

Notas 2

Notas 3

Notas4

1 2 3 4 5 6 7 8 O programa deve pedir o nome do aluno e em seguida as quatro notas, calcular a média e armazená-la numa terceira matriz de uma dimensão, para então apresentar o nome de cada aluno e sua respectiva média, bem como, a média do grupo. Logo no início, a variável SOMA_MD é inicializada com valor zero. Esta variável será utilizada para armazenar a soma das médias de cada aluno durante a entrada de dados. Depois a instrução para/ de 1 até 8 passo 1 faça inicializa o primeiro laço que tem por finalidade controlar o posicionamento dos elementos no sentido linear. Neste ponto, a variável SOMA_NT é inicializada com o valor zero para o primeiro aluno. Esta variável guarda a soma das quatro notas de cada aluno durante a execução do segundo laço. Neste momento, é solicitado antes do segundo laço o nome do aluno.

Algoritmo e Linguagem de Programação

1 2 3 4 5 6 7 8

Toda vez que o segundo laço é encerrado, a matriz MÈDIA é alimentada com o valor da variável SOMA_NT dividido por 4. Deste modo, tem-se o resultado da média do aluno cadastrado. Em seguida é efetuado o cálculo da soma das médias de cada aluno na variável SOMA_MD, que posteriormente servirá para determinar o cálculo da média do grupo. É neste ponto que o primeiro laço repete o seu processo para o próximo aluno, e assim irá transcorrer até o último aluno. Após a disposição dos alunos em ordem alfabética de nome, é iniciada a apresentação dos nomes de cada aluno e suas respectivas médias. Ao final, a variável MÉDIA_GP determina o cálculo da média do grupo (média das médias). Por meio do valor armazenado na variável SOMA_MD dividido por 8 (total de alunos). 98


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

Português Estruturado

99

Programa CAC_MÉDIA Var X : caractere I , J , ATUAL, PRÓXIMO : inteiro Y, SOMA_NT, SOMA_MD, MÉDIA_GP : real NOTA : conjunto [ 1 . . 8, 1 . . 4 ] de real MÉDIA : conjunto [ 1 . . 8 ] de real NOMES : conjunto [ 1. . 8 ] de caractere Início SOMA_MD ←0 Para I de 1 até 8 passo 1 faça SOMA_NT ←0 Escreva “Aluno “ , I Leia NOMES [ I ] Para J de 1 até 4 passo 1 faça Escreva “Nota “ , J Leia NOTA [ I , J] SOMA_NT ←SOMA_NT + NOTA [ I, J ] Fim_para MÉDIA [ I ] ←SOMA_NT / 4 SOMA_MD ←SOMA_MD + MÉDIA [ I ] Fim_para (Rotina de ordenação e troca de elementos) para ATUAL de 1 até 7 passo 1 faça para PRÓXIMO ←ATUAL + 1 até 8 passo 1 faça se ( NOMES [ ATUAL ] > NOMES [ PRÓXIMO ] ) então X ←NOMES [ ATUAL ] NOMES [ ATUAL ] ←NOMES [ PRÓXIMO ] NOMES [ PRÓXIMO ] ←X Y ←MÉDIA [ ATUAL ] MÉDIA [ ATUAL ] ←MÉDIA [ PRÓXIMO ] MÉDIA [ PRÓXIMO] ←Y Fim_se Fim_para Fim_para MÉDIA_GP ←SOMA_MD / 8 Para I de 1 até 8 passo 1 faça Escreva “Aluno .: “ , NOMES [ I ] Escreva “Média .: “ , MÉDIA [ I ] Fim_para Escreva “Média Geral : “ , MÉDIA_GP Fim


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Laços de Repetição em Java Comando for

for ( inicialização; condição; iteração) comando;

Geralmente a porção de inicialização ajusta a variável de controle de loop para um valor inicial. A condição é uma expressão booleana que testa a variável de controle de loop. Se o resultado for verdadeiro (true), o loop for continuará a ser executado. Se for falso (false), o loop será encerrado. A expressão de iteração determina como a variável de controle do loop é alterada cada vez que o loop é executado. Eis um pequeno programa que ilustra o loop for. 1. import javax.swing.JOptionPane; 2. public class TesteFor 3. { 4. public static void main (String[] args) 5. { 6. JOptionPane.showMessageDialog(null,"i \t " + " i * i \t " + " i * i * i \n" ); 7. for (int i=0; i< 10 ; i++) 8. JOptionPane.showMessageDialog(null, i + " \t " + i * i + " \t " + i * i * i + " \n "); 9. } 10. }

Eis a saída deste programa: i 0 1 2 3 4 5 6 7 8 9

i* i i * i * i 00 11 48 9 27 16 64 25 125 36 216 49 343 64 512 81 729

Neste exemplo, i é a variável de controle do loop. Ela é inicializada com o valor zero na porção de inicialização de for. No início de cada iteração (inclusive a primeira), o teste condicional i<10 é executado. Se o resultado do teste for verdadeiro, o comando showMessageDialog() será executado e, depois, a porção de iteração do loop será executada. Esse processo continua até que o teste condicional resulte em false.

Algoritmo e Linguagem de Programação

Os comandos de loop são uma parte importante de todas as linguagens de programação. Java não é uma exceção. Veremos em outro ponto deste curso que Java oferece uma poderosa coleção de construções de loop. A mais versátil delas é o loop for, que apresentaremos resumidamente aqui.. A forma mais simples do loop for é a seguinte:

100


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

Vamos pegar este mesmo exemplo só que desta vez iremos passar o número como parâmetro e ao invés de incrementar nós iremos decrementar, então ficaria assim: 1. import javax.swing.JOptionPane; 2. public class TesteFor2 3. { 4. public static void main (String args [ ] ) 5. { 6. int num; 7. JOptionPane.showMessageDialog(null, "i \t " + " i * i \t " + " i * i * i \n " ) ; 8. for (int i =num; i > 0 ; i--) JOptionPane.showMessageDialog(null, i + " \t " + i * i + " \t " + i * i * i + " \n " ) ; 9. 10.

} }

Como já é sabido, a saída dependerá do parâmetro passado se, por exemplo, nós passarmos como parâmetro o número 5, a saída será a seguinte: i*i i*i*i 5 25 125 4 16 64 3 9 27 2 4 8 1 1 1 Outro exemplo do uso do comando for, é visto logo, a seguir, nesse exemplo o nosso programa calcula a fatorial de um número passado como parâmetro, veja-o em ação: 1. import javax.swing.JOptionPane; 2. public class Fat 3. { 4. public static void main (String args [ ] ) 5. { 6. int num, fatorial=1; 7. num = Integer.parseInt(JOptionPane.showInputDialog("Entre com um valor para encontrar o fatorial")); 8. for(int i = num; i>=1 ;i--) 9. fatorial*=i; 10. JOptionPane.showMessageDialog(null,"A fatorial do número é: \t"+ fatorial); 11. } 12. }

Comando while O comando while é um dos comandos de iteração de Java. Os outros são:

§ For § Do-while 101


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Esses comandos criam aquilo que no jargão da programação é conhecido como loop. Um loop executa repetidas vezes um determinado conjunto de instruções até que ocorra uma condição previamente estabelecida para o término. Esses três tipos de Java são capazes de atender a todas as necessidades de programação. Examinaremos agora o comando while. Ele repete um comando ou um bloco de comandos enquanto a expressão de controle for verdadeira. Eis sua forma geral:

A condição pode ser qualquer expressão booleana. O corpo do loop será executado enquanto a expressão condicional representada por condição for satisfeita. Quando condição se tornar falsa, o controle passa para a próxima linha de código imediatamente após o loop. As chaves { } são desnecessárias se o que estiver sendo repetido for apenas um único comando. Eis um exemplo de simples de loop while: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.

import javax.swing.JOptionPane; public class whiledemo { public static void main (String args [ ] ) { int contador=10; while(contador>0) { JOptionPane.showMessageDialog(null,contador+" ! "); contador--; } JOptionPane.showMessageDialog(null,"Fogo !" ); } }

O loop While (linhas 7 a 11) contam de 10 até 0. A cada passagem pelo loop, um comando usando o método showMessageDialog() exibe na tela o valor da variável contador (linha 9). A variável é então decrementada (linha 10), o que garante que o loop chegue a um final, quando a condição contador > 0 (linha 7) deixar de ser verdadeira. Encerrado o loop, a execução prossegue na linha seguinte ao final do loop (linha 12), fazendo com que seja exibida na tela a string: “Fogo !”.

Algoritmo e Linguagem de Programação

while(condição) { / / Corpo do loop. }/ / Fim do loop while

Ao ser executado, este programa exibe a seguinte saída:

102


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

Algoritmo e Linguagem de Programação

ABERTA DO BRASIL

10 ! 9! 8! 7! 6! 5! 4! 3! 2! 1! Fogo ! Como o loop while avalia sua expressão condicional no início do loop, o corpo do loop não será executado nenhuma vez se a condição for inicialmente falsa. Por exemplo, no fragmento que se segue, a chamada a showMessageDialog() nunca é executada: int x=15, y=16; while(x>y) JOptionPane.showMessageDialog(null, “Mensagem não exibida”); O Comando do ... while Porém em muitas situações é desejável que o corpo do loop seja executado pelo menos uma vez, mesmo que a condição de controle seja inicialmente falsa. Em outras palavras, há ocasiões em que a condição de terminação deve ser testada no final do loop e não no início. Para esses casos, Java oferece um loop que faz exatamente isso: do-while. O loop do-while sempre executa seu corpo pelo menos uma vez, porque a expressão condicional está no final do loop. Sua forma geral é: do { / / Corpo do loop. }while(condição);

Cada iteração do loop do-while executa primeiro o corpo do loop e depois avalia a expressão condicional representada por condição. Se a expressão for verdadeira, o loop será repetido. Caso contrário, o loop termina> Como acontece com todos os loops de Java, a condição deve ser uma expressão booleana. Eis uma versão revisada do programa WhileDemo.java. Esta versão demonstra o loop do-while. Ela gera a mesma saída que a versão anterior. 1. import javax.swing.JOptionPane; 2. public class doWhileDemo 3. { 4. public static void main(String args [ ] ) 5. { 6. int contador=10; 7. do 8. { 9. JOptionPane.showMessageDialog(null,contador+" ! ");

103


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

10. 12. 13. 14. 15.

contador--; }while(contador > 0); JOptionPane.showMessageDialog(null,"Fogo!"); } }

Eis a saída deste programa:

Essa saída mostra que, neste caso, o loop do-while (linhas 7 a 11) tem exatamente o mesmo efeito que o loop while de WhileDemo.java. Embora esteja correto, o loop dowhile de DoWhileDemo.java poderia ser reescrito de forma mais eficiente. Eis como isso poderia ser feito: do { JOptionPane.showMessageDialog(null, contador+”!”); }while (--contador>0);

Aqui, a expressão (--contador)combina o decremento de contador e o teste do loop em uma única expressão. Primeiro, o comando --contador é executado, decrementando contador e retornando seu novo valor. Esse novo valor é então comparado com zero. Se for maior que zero, o loop continuará; caso contrário, ele será encerrado.

Algoritmo e Linguagem de Programação

10 ! 9! 8! 7! 6! 5! 4! 3! 2! 1! Fogo !

104


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Roteiro: a) Sub-Rotinas Roteiro de Atividades Passo 1 - Leitura do Texto sobre Sub-Rotinas; Passo 2 - Realização dos Exercícios de Fixação; Passo 3 - Realização das Tarefas de Algoritmos.

Algoritmo e Linguagem de Programação

6ª Semana

105


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

1– Modularidade Normalmente problemas complexos exigem algoritmos complexos na busca de suas soluções. Todo grande problema computacional pode vir a ser dividido em problemas menores. Desta forma, cada parte menor tem um algoritmo mais simples e de mais fácil compreensão e administração, e esse trecho menor é chamado de sub-rotina (ou mesmo de módulo, subprograma, subalgoritmo.

Ao trabalhar com a técnica de sub-rotinas, às vezes se depara com a necessidade de dividir uma sub-rotina em outras tantas quantas forem necessárias, buscando uma solução mais simples de uma parte do problema maior. O processo de dividir sub-rotinas em outras é denominado Método de Refinamento Sucessivo 2 – Método Top-Down O processo de programar um computador torna-se bastante simples quando aplicado o método de utilização de sub-rotinas (módulos de programas). Porém, a utilização dessa sub-rotinas deve ser feita com aplicação do método top-down. Um método adequado à programação de um computador é a utilização do conceito de programação estruturada, pois as linguagens de programação de terceira geração utilizadas atualmente (como:C, C++, Java, ObjectPascal, Pascal) são baseadas nesta estrutura, o que facilita a aplicação deste processo de trabalho. O método mais utilizado para a programação estruturada de computadores é o top-down (de cima para baixo) o qual se caracteriza basicamente por:

? Antes de iniciar a construção do programa, o programador deve ter em mente as tarefas principais que este deverá executar. Não é necessário saber como funcionarão, somente saber quantas são;

? Conhecidas todas as tarefas a serem executadas, tem-se em mente como deve ser o programa principal, o qual vai controlar todas as outras tarefas distribuídas em suas sub-rotinas;

Algoritmo e Linguagem de Programação

Uma sub-rotina é um programa (trecho de um programa maior), e desta forma pode efetuar diversas operações computacionais (como: entradas, processamentos e saídas) e deve ser tratada com o mesmo cuidado, como foram tratados os programas projetados até este momento.

? Tendo definido o programa principal, é iniciado o processo de detalhamento para cada sub-rotina. Desta forma são definidos vários algoritmos, um para cada rotina em separado, para que se tenha uma visão do que deve ser executado em cada módulo de programa. Existem programadores que estabelecem o número máximo de linhas de programa que uma rotina deverá possuir. Se o número de linhas ultrapassa o limite preestabelecido, a rotina em desenvolvimento é dividida em outra sub-rotina (é neste ponto que se aplica o método de refinamento sucessivo) O método top-down conceitualmente dá a idéia de que um programa tem uma estrutura semelhante à de um organograma. A utilização do método “de cima para baixo” permite que seja efetuado cada módulo de programa em separado. Assim sendo, cada parte do programa pode ser testada separadamente, garantindo que o programa completo esteja sem erro ao seu término. 106


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Outro detalhe a ser considerado é que muitas vezes existem em um programa trechos de código que podem estar repetidos várias vezes. Esses trechos podem ser utilizados como sub-rotinas, proporcionando um programa menor e mais fácil de ser alterado num futuro próximo, quando houver a necessidade de efetuar sua manutenção.

Algoritmo e Linguagem de Programação

3 – Tipos de Sub-Rotina

107

A técnica de modularização de código de programa baseado no conceito de subrotinas disponibiliza para o trabalho de um programador dois modos de tratamento do problema. Um modo denomina-se procedimento e o outro denomina-se função. Uma sub-rotina (seja ela um procedimento ou uma função) é considerada um bloco de programa que possui obrigatoriamente início e fim. Uma sub-rotina é identificada por um nome, por meio do qual serão feitas as devidas referências em qualquer parte do programa principal ou do programa chamador da rotina. Quando uma sub-rotina é chamada por um programa, ela é executada, e ao seu término o controle de processamento retorna automaticamente retorna automaticamente para a primeira linha de instrução após a linha que efetuou a chamada da sub-rotina. A diferença básica existente entre os dois tipos de sub-rotina são:

? As sub-rotinas do tipo procedimento são mecanismos que podem ou não retornar algum tipo de valor ao fim de seu processamento;

? As sub-rotinas do tipo função são mecanismos que sempre retornam algum tipo de valor ao fim de seu processamento. As sub-rotinas (tanto do tipo procedimento, quanto do tipo função) para seu trabalho podem fazer uso de parâmetros (denominados também de argumentos) que serão passados por intermédio do programa principal ou do programa chamador daquela sub-rotina. Este conceito em particular será visto mais adiante com detalhes. 4 – Sub-Rotinas do Tipo Procedimento A seguir, será apresentada a sub-rotina do tipo procedimento em sua forma de concepção mais simples existente. OBSERVAÇÃO: Em sua obra “Engenharia de Software”, página 459, Roger Pressman sugere que o quadro seja desenhado com um círculo no meio para indicar (possível forma) uma referência a uma sub-rotina. Por se tratar de um diagrama baseado em quadros e não havendo uma grande conformidade em definir uma estrutura de subrotina por vários autores, esta obra aborda o conceito de desenhar um quadro dentro de outro quadro para definir uma estrutura de sub-rotina do tipo procedimento, como mostra a figura 8.2.


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Português Estruturado Programa TESTE ( Sub-Rotina)

início <instruções da sub-rotina> fim ( Programa Principal ) programa PRINCIPAL var <variáveis> início rotina [ ( <parâmetros> ) ] fim

Note que primeiramente é definido no programa em português estruturado o código da sub-rotina para que depois seja definido o código do programa principal. Esta característica deve ser mantida, pois existem algumas linguagens de programação que trabalham desta forma. Observe que a chamada efetuada da sub-rotina definida é feita no programa principal com seu código sublinhado. Este detalhe é utilizado para diferenciar o nome da rotina das palavras-chave das linguagens e também das variáveis que venham a ser utilizadas. A indicação (<parâmetro>) entre os colchetes é opcional e será utilizada dependendo apenas da estratégia lógica a ser implementada pelo programador. Quando utilizada a relação de parâmetros, deve obrigatoriamente estar definida entre os símbolos de parênteses. Esta característica será apresentada mais adiante.

Algoritmo e Linguagem de Programação

procedimento ROTINA [ ( < parâmetro > ) ] [ var ] [ < variáveis>]

8.4.1 - Exercícios de Aprendizagem Elaborar um programa do tipo calculadora simples para operar apenas dois valores numéricos, que apresente um menu de seleções no programa principal. Esse menu deve dar ao usuário a possibilidade de escolher uma entre quatro operações aritméticas. Escolhida a opção desejada, deve ser solicitada a entrada de dois números, e processada a operação, deve ser exibido o resultado. Algoritmo Note que esse programa deve ser um conjunto de cinco rotinas, sendo uma principal e quatro sub-rotinas. A rotina principal efetuará o controle das quatro subrotinas que, por sua vez, pedirão a leitura de dois valores numéricos, farão a operação e apresentarão o resultado obtido.

108


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

A partir da idéia da estrutura geral do programa, será escrito em separado cada algoritmo com os seus detalhes de operação. Primeiro o programa principal e depois as outras rotinas, de preferência na mesma ordem em que estão mencionadas no organograma. Programa Principal

Algoritmo e Linguagem de Programação

1. Apresentar um menu de seleção com cinco opções: 1. Adição 2, Subtração 3. Multiplicação 4. Divisão 5. Fim de Programa 2. Ao ser selecionado um valor, a rotina correspondente deve ser executada; 3. Ao escolher o valor 5, o programa deve ser encerrado. Rotina 1 – Adição 1. Ler dois valores, no caso variáveis A e B; 2. Efetuar a soma das variáveis A e B, implicando o seu resultado na variável R; 3. Apresentar o valor da variável R Rotina 2 – Subtração 1. Ler dois valores, no caso variáveis A e B; 2. Efetuar a subtração das variáveis A e B, implicando o seu resultado na variável R; 3. Apresentar o valor da variável R. Rotina 3 – Multiplicação 1. Ler dois valores, no caso variáveis A e B; 2. Efetuar a multiplicação das variáveis A e B, implicando o seu resultado na variável R; 3. Apresentar o valor da variável R. Rotina 4 – Divisão 1. Ler dois valores, no caso variáveis A e B; 2. Efetuar a divisão das variáveis A e B, implicando o seu resultado na variável R;

109

3. Apresentar o valor da variável R.


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Observe que em cada rotina serão utilizadas as mesmas variáveis, mas elas não serão executadas ao mesmo tempo para todas as operações. Serão utilizadas em separado e somente para a rotina escolhida. Português Estruturado

Programa CALCULADORA (Sub-rotinas de cálculos) procedimento ROTSOMA var R, A, B : real Início Escreva “Rotina de Soma” Escreva “Entre um valor para A: “ Leia A Escreva “Entre um valor para B: “ Leia B B R ←A + B Escreva “A soma de A com B é = “ , R Fim Procedimento ROTSUBTRAÇÃO Var R, A, B : real Início Escreva “Rotina de Subtração” Escreva “Entre um valor para A: “ Leia A Escreva “Entre um valor para B: “ Leia B R ←A – B Escreva “A subtração de A com B é = “ , R

Algoritmo e Linguagem de Programação

Na definição do código em português estruturado, serão definidas em primeiro lugar as sub-rotinas e por último, o programa principal. Quando no programa principal ou rotina chamadora for referenciada a chamada de uma sub-rotina, ela será grafada na forma sublinhada para facilitar sua visualização e identificação.

Fim Procedimento ROTMULTIPLICAÇÃO

110


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Var R, A, B : real

Algoritmo e Linguagem de Programação

Início

111

Escreva “Rotina de Multiplicação” Escreva “Entre um valor A: “ Leia A Escreva “Entre um valor para B: “ Leia B R ←A * B Escreva “A multiplicação de A com B é = “ , R Fim Procedimento ROTDIVISÃO Var R, A, B : real Início Escreva “Rotina de Divisão” Escreva “Entre um valor para A: “ Leia A Escreva “Entre um valor para B: “ Leia B Se (B = 0 ) então Escreva “Impossível dividir” Senão R ←A / B Escreva “A divisão de A com B é = “, R Fim_se Fim (Programa Principal) var OPÇÃO : inteiro Início OPÇÃO ←0 Enquanto (OPÇÃO < > 5 ) faça Escreva “1 – Adição” Escreva “2 – Subtração” Escreva “3 – Multiplicação” Escreva “4 – Divisão” Escreva “5 – Finalização” Escreva “Escolha uma opção: “ Leia OPÇÃO Se (OPÇÃO = 1) então Rotsoma Fim-se Se (OPÇÃO = 2) então Rotsubtração Fim_se Se (OPÇÃO = 3) então Rotmultiplicação Fim_se Se (OPÇÃO = 4 ) então Rotdivisão Fim_se Fim_enquanto fim


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

4.2 – Estrutura de Controle com Múltipla Escolha

Quando houver a necessidade de construir um programa no qual seja necessário utilizar uma seqüência grande de instruções do tipo se, sejam estas uma após a outra ou mesmo encadeadas, pode ser simplificada com a utilização da instrução caso...fim_caso, que possui a seguinte sintaxe: Português Estruturado caso <variável> seja <valor1> faça <operação1> seja <valor2> faça <operação2> seja <valorN> faça <operaçãoN> senão <operação padrão> fim_caso

Em que <variável> será a variável a ser controlada, valor será o conteúdo de uma variável sendo verificado e operação pode ser a chamada de uma sub-rotina, a execução de qualquer operação matemática ou de qualquer outra instrução Desta forma, a rotina principal do programa calculadora pode ser escrita fazendo uso da instrução caso...fim_caso no selecionamento de uma opção escolhida pelo operador. Português Estruturado início OPÇÃO ←0 enquanto (OPÇÃO < > 5 ) faça escreva “1 – Adição” escreva “2 – Subtração” escreva “3 – Multiplicação” escreva “4 – Divisão” escreva “5 – Finalização” escreva “Escolha uma opção: “ leia OPÇÃO se (OPÇÃO < > 5 ) então caso OPÇÃO seja 1 faça rotsoma seja 2 faça rotsubtração seja 3 faça rotmultiplicação Seja 4 faça rotdivisão senão escreva “Opção inválida – Tente novamente” fim_caso fim_se fim_enquanto fim

Algoritmo e Linguagem de Programação

O programa calculadora demonstra a aplicação da técnica de programação estruturada (tanto no diagrama de quadros como no código em português estruturado), possibilitando a construção de programas mais elaborados. Porém, no tocante ao selecionamento das sub-rotinas, foi utilizada a instrução se. Observe que se o programa possuir um menu com 15 opções, devem ser definidas 15 instruções do tipo se para verificar a escolha do operador.

112


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Antes do uso da instrução caso...fim_caso, está sendo verificado se o valor da opção informado é realmente diferente de 5. Sendo, será verificado se é 1, 2, 3 ou 4; Não sendo nenhum dos valores válidos, a instrução senão informa que a tentativa foi inválida. O uso desta nova instrução agiliza o processamento das instruções, ou seja, é muito mais rápido utilizar a instrução caso...fim_caso do que aninhar diversas instruções do tipo se.

Algoritmo e Linguagem de Programação

1. Variáveis Globais e Locais No programa anterior foram utilizadas variáveis dentro das sub-rotinas, no caso as variáveis A, B e R, e fora das sub-rotinas, no caso a variável OPÇÃO, sem que houvesse a preocupação de agrupar as variáveis de uma forma coerente segundo o seu tipo. São dois os tipos de variáveis utilizados em um programa: as variáveis Globais e as Locais. Uma variável é considerada Global quando é declarada no início do algoritmo principal de um programa, podendo ser utilizada por qualquer sub-rotina subordinada ao algoritmo principal. Assim sendo, este tipo de variável passa a ser visível a todas as subrotinas hierarquicamente subordinadas à rotina principal, que pode ser o próprio programa principal ou uma outra sub-rotina. No programa anterior, a variável OPÇÃO é global, apesar de não estar sendo utilizada nas demais sub-rotinas. Uma variável é considerada Local quando é declarada dentro de uma sub-rotina e é somente válida dentro da rotina à qual está declarada. Desta forma, as demais sub-rotinas e programa principal não podem fazer uso daquelas variáveis como Global, pois não visualizam a existência delas. No programa anterior, as variáveis A, B e R são locais. Por este motivo estão sendo declaradas repetidas vezes dentro de cada sub-rotina. Dependendo da forma como se trabalha com as variáveis, é possível economizar espaço em memória, tornando o programa mais eficiente. Considere dois exemplos apresentados em seguida em português estruturado, sendo o primeiro sem uso de subrotina e o segundo com sub-rotina, fazendo uso de variável global e local: Programa TROCA_VALORES_EXEMPLO_1 var X : inteiro A : inteiro B : inteiro início Leia A, B X ←A A ←B B ←X Escreva A, B fim

113


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Programa TROCA_VALORES_EXEMPLO_2 var A : inteiro B : inteiro Procedimento TROCA

X : inteiro início X ←A A ←B B ←X fim início Leia A, B troca Escreva A, B fim

Observe que apesar de o segundo exemplo ser um pouco maior que o primeiro, ele possibilita uma economia de espaço em memória bastante interessante, pois o espaço a ser utilizado pela variável X é somente solicitado quando a sub-rotina TROCA é executada. Terminada a execução, a variável X é desconsiderada, ficando em uso somente os espaços reservados para as variáveis globais A e B. 1.1 – Escopo de Variáveis O escopo de uma variável ou sua abrangência está vinculada a sua visibilidade (Global ou Local) em relação às sub-rotinas de um programa, visto que a sua visibilidade está relacionada a sua hierarquia. Mas existe um detalhe importante a ser levado em conta, pois uma variável pode ser considerada global para todas as sub-rotinas inferiores a uma rotina principal, e dentro de uma dessas sub-rotinas a mesma variável pode estar sendo utilizada como local.

Algoritmo e Linguagem de Programação

var

Um cuidado importante a ser considerado com relação ao escopo de uma variável é o fato de uma variável ser declarada antes ou depois de uma seqüência de sub-rotinas. Se declarada antes, ela será global a todas as sub-rotinas existentes após a sua declaração. Porém, se for declarada após uma seqüência de sub-rotinas, ela será global do ponto em que está para baixo e local com relação às sub-rotinas definidas acima dela. Por exemplo, o programa de troca apresentado anteriormente tem as variáveis A e B globais para todo o programa. Mas se as variáveis A e B fossem declaradas após a sub-rotina, seriam locais, conforme é demonstrado em seguida:

114


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Programa TROCA_VALORES (Rotina com erro de declaração de variáveis) Procedimento TROCA

Algoritmo e Linguagem de Programação

var X : inteiro início X ←A A ←B B ←X fim

var A : inteiro B : inteiro início Leia A, B troca Escreva A, B fim

Isto caracteriza um erro, pois as variáveis A e B para a sub-rotina TROCA não são válidas por não estarem definidas. Desta forma, estas variáveis precisam ser declaradas dentro da sub-rotina. 1.2 – Refinamento Sucessivo O refinamento sucessivo é uma técnica de programação que possibilita dividir uma sub-rotina em outras sub-rotinas. Deve ser aplicado com muito critério para que o programa a ser construído não se torne desestruturado e difícil de ser compreendido por você ou por outras pessoas. O programa calculadora apresentado anteriormente permite que seja aplicada esta técnica, pois nas quatro sub-rotinas de cálculo existem instruções que efetuam as mesmas tarefas. Por exemplo: a entrada e a saída são efetuadas com as mesmas variáveis. Observe que as variáveis A, B e R são definidas quatro vezes, uma em cada subrotina. A solução é definir as variáveis A, B e R como globais e construir mais duas subrotinas, uma para entrada e a outra para saída. As quatro sub-rotinas atuais serão diminuídas em número de linhas, pois tudo o que se repete nas sub-rotinas será retirado. Observe a declaração das variáveis A, B e R como globais e a definição e chamada das duas novas sub-rotinas, entrada e saída. Perceba que nas sub-rotinas de cálculos não está sendo declarada nenhuma variável, uma vez que agora estão fazendo uso do conceito de variáveis globais.

115

36


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

A solução é definir as variáveis A, B e R como globais e construir mais duas subrotinas, uma para entrada e a outra para saída. As quatro sub-rotinas atuais serão diminuídas em número de linhas, pois tudo o que se repete nas sub-rotinas será retirado.

Programa CALCULADORA var OPÇÃO : inteiro R, A, B : real (Sub-rotinas de entrada e saída) Procedimento ENTRADA início Escreva “Entre um valor para A: “ Leia A Escreva “Entre um valor para B : “ Leia B fim Procedimento SAÍDA início Escreva “O resultado de A com B é = “, R fim (Sub-rotinas de cálculos) Procedimento ROTSOMA início Escreva “Rotina de Soma” entrada R ←A + B saída fim Procedimento ROTSUBTRAÇÃO início Escreva “Rotina de Subtração” entrada R ←A - B saída fim Procedimento ROTMULTIPLICAÇÃO início Escreva “Rotina de Multiplicação” entrada R ←A * B saída fim

Algoritmo e Linguagem de Programação

Observe a declaração das variáveis A, B e R como globais e a definição e chamada das duas novas sub-rotinas, entrada e saída. Perceba que nas sub-rotinas de cálculos não está sendo declarada nenhuma variável, uma vez que agora estão fazendo uso do conceito de variáveis globais.

116


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

Algoritmo e Linguagem de Programação

ABERTA DO BRASIL

117

Procedimento ROTDIVISÃO início Escreva “Rotina de Divisão” entrada Se (B = 0 ) então Escreva “Impossível dividir” senão R ←A / B Saída Fim_se fim (Programa Principal) início OPÇÃO ←0 Enquanto (OPÇÃO < > “5” ) faça Escreva “ 1 – Adição” Escreva “ 2 – Subtração” Escreva “ 3 – Multiplicação” Escreva “ 4 – Divisão” Escreva “ 5 – Finalização “ Escreva “Escolha uma opção : “ Leia OPÇÃO Se (OPÇÃO < > 5 ) então Caso OPÇÃO Seja 1 faça rotsoma Seja 2 faça rotsubtração Seja 3 faça rotmultiplicação seja 4 faça rotdivisão Senão escreva “Opção inválida – Tente novamente” Fim_caso Fim_se Fim_enquanto fim

36


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Roteiro: a) Sub-Rotinas - Continuação Roteiro de Atividades Passo 1 - Leitura do Texto sobre Sub-Rotinas - Parte II; Passo 2 - Realização dos Exercícios de Fixação; Passo 3 - Realização das Tarefas de Algoritmos.

Algoritmo e Linguagem de Programação

Semana 7

118


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

1 – Uso de Parâmetros

Algoritmo e Linguagem de Programação

O conceito de passagem de parâmetros tem por finalidade servir como um ponto de comunicação bidirecional entre uma sub-rotina e o programa principal ou uma outra sub-rotina hierarquicamente de nível mais alto. Desta forma, é possível passar valores de uma sub-rotina ou rotina chamadora a outra sub-rotina e vice-versa, utilizando a passagem de parâmetros que podem ser formais ou reais. 1.1 – Parâmetros Formais e Reais São parâmetros formais as variáveis declaradas juntamente com a identificação do nome da sub-rotina. Desta forma, um parâmetro é tratado da mesma forma que são tratadas as variáveis globais ou locais. Considere como exemplo de parâmetros formais o código em português estruturado da sub-rotina, apresentado em seguida: Procedimento CALCSOMA (A, B : inteiro ) var Z : inteiro início Z ←A + B Escreva Z fim

Observe que a variável Z é local e está sendo usada para armazenar a soma das variáveis A e B que representam os parâmetros formais da sub-rotina CALCSOMA. São considerados parâmetros reais aqueles que fazem a substituição dos parâmetros formais, quando da utilização da sub-rotina por um programa principal ou por uma rotina chamadora. Considere como exemplo de parâmetros reais o código em português estruturado do programa que faz uso da sub-rotina CALCSOMA, apresentado em seguida: início Leia X Leia Y Calcsoma ( X, Y ) Leia W Leia T Calcsoma ( W, T ) Calcsoma (8, 2 ) fim Neste trecho, toda vez que a sub-rotina CALCSOMA é chamada, faz-se uso de parâmetros reais. Desta forma, são parâmetros reais as variáveis X, Y, W e T, pois seus valores são fornecidos pela instrução leia, e também os valores 8 e 2. 1.2 – Passagem de Parâmetro por Valor e por Referência

119

A passagem de parâmetro é um fenômeno que ocorre quando há a necessidade de efetuar a substituição dos parâmetros formais pelos reais no momento da execução da sub-rotina. Essas passagens de parâmetros ocorrem de duas formas: por valor e por 36 referência.


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

A passagem de parâmetro por valor caracteriza-se pela não alteração do valor do parâmetro real quando o parâmetro formal é manipulado dentro da sub-rotina. Assim sendo, o valor passado pelo parâmetro real é copiado para o parâmetro formal, que no caso assume o papel de variável local da sub-rotina. Desta forma, qualquer modificação que ocorra na variável local da sub-rotina não afetará o valor do parâmetro real correspondente, ou seja, o processamento é executado somente dentro da sub-rotina, ficando o resultado obtido “preso” na sub-rotina.

2 – Exercícios de Aprendizagem A seguir, são apresentados dois exemplos de programa que utilizam o conceito de sub-rotina com passagem de parâmetro por valor e por referência. 2.1 – Primeiro Exemplo Este exemplo faz uso do conceito de passagem de parâmetro por valor. Desta forma, considere o seguinte problema computacional: Elaborar um programa que efetue o cálculo e apresente o resultado de uma fatorial de um número qualquer. Português Estruturado Programa CALC_FATORIAL Procedimento FATORIAL ( N : inteiro ) var I, FAT : inteiro início FAT ←1 Para I de 1 até N passo 1 faça FAT ←* I Fim_para Escreva FAT

Algoritmo e Linguagem de Programação

A passagem de parâmetro por referência caracteriza-se pela ocorrência de alteração do valor do parâmetro real quando o parâmetro formal é manipulado dentro da sub-rotina. Desta forma, qualquer modificação feita no parâmetro formal implica em alteração no parâmetro real correspondente. A alteração efetuada é devolvida para a rotina chamadora.

fim ( Programa Principal ) var LIMITE : inteiro início Escreva “Qual fatorial : “ Leia LIMITE Fatorial (LIMITE) fim

120


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

Algoritmo e Linguagem de Programação

ABERTA DO BRASIL

Neste exemplo, é indicado o uso da passagem de parâmetro por valor. No caso, a variável N é o parâmetro formal, que receberá o valor fornecido à variável LIMITE por meio da sub-rotina FATORIAL. Esse valor estabelece o número de vezes que o laço de repetição deve ser executado. Dentro do procedimento é encontrada a variável FAT que realiza um efeito de acumulador, tendo ao final do laço o resultado da fatorial do valor informado para o parâmetro N. Ao término do laço, a instrução escreva FAT imprime o valor da variável FAT, que somente é válida dentro da sub-rotina e por esta razão ficará “preso” dentro dela. A passagem de parâmetro por valor é utilizada somente para a entrada de um determinado valor. 2.2 – Segundo Exemplo Este exemplo faz uso do conceito de passagem de parâmetro por referência. Desta forma, considere o seguinte problema computacional: Elaborar um programa que efetue o cálculo e apresente o resultado de uma fatorial de um número qualquer. Português Estruturado programa FATORIAL procedimento FATORIAL ( N : inteiro, var FAT : inteiro ) var I : inteiro início FAT ←1 para I de 1 até N passo 1 faça FAT ←FAT * I fim_para fim ( Programa Principal ) var LIMITE, R : inteiro início escreva “Qual fatorial: “ leia LIMITE fatorial (LIMITE, R) escreva R fim

121

Neste exemplo, é indicado o uso da passagem de parâmetro por referência (variável FAT por meio da instrução var na declaração do nome da sub-rotina). A variável N neste exemplo continua sendo do tipo passagem de parâmetro por valor, pois ela receberá o valor fornecido à variável LIMITE por meio da sub-rotina FATORIAL. Esse valor estabelece o número de vezes que o laço deve ser executado. Dentro do procedimento é encontrada a variável FAT que é do tipo passagem de parâmetro por referência e possui no final o valor acumulado do cálculo da fatorial. Ao término do laço, o valor da variável FAT é transferido para fora da rotina, ou seja, é transferido para a variável R do programa principal. Então, a instrução escreva R imprime o valor recebido de dentro da sub-rotina 36 por meio da variável FAT. A passagem de parâmetro por referência é utilizada para que se tenha a saída de um determinado valor de dentro de uma sub-rotina.


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

3 – Sub-Rotina do Tipo Função

Português Estruturado programa TESTE ( Sub-Rotina ) função ROTINA [ ( parâmetros ) ] : < tipo da função > [ var] [ < variáveis > ] início < instruções da sub-rotina > fim ( Programa Principal ) programa PRINCIPAL var < variáveis > início rotina [ ( parâmetros ) ] fim A principal diferença existente entre uma rotina do tipo procedimento e uma subrotina do tipo função é a capacidade que uma função tem de retornar sempre um valor, o qual é sempre retornado no próprio nome da função. Quando se diz valor, devem ser levados em consideração os valores numéricos, lógicos ou literais (caracteres) Uma sub-rotina do tipo procedimento que utilize o conceito de passagem de parâmetro por referência consegue, de certa forma, fazer a mesma ação que uma subrotina do tipo função. Porém, torna-se necessário considerar que o uso de sub-rotinas do tipo função é mais simples e prático.

Algoritmo e Linguagem de Programação

Uma função é um bloco de programa, como também é um bloco de programa do tipo procedimento. Essa estrutura contém início e fim e é identificada por um nome. Uma sub-rotina do tipo função é muito parecida com uma sub-rotina do tipo procedimento. O desenho do diagrama de quadros e a sintaxe em português estruturado também são idênticos ao modelo usado para definir um procedimento. Observe a figura 8.11 com um exemplo básico do diagrama de quadros e a sintaxe do código em português estruturado de uma função.

Como exemplo, considere o procedimento apresentado em seguida usado para calcular a fatorial de um número qualquer. Observe que temos que fornecer dois parâmetros, sendo um N para a entrada do valor a ser calculado e FAT para a saída do resultado obtido. procedimento FATORIAL ( N : inteiro, var FAT : inteiro ) var I : inteiro início FAT ←1 para I de 1 até N passo 1 faça FAT ←FAT * I fim_para fim

122


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Se esta sub-rotina for escrita em forma de função, será necessária apenas a informação de um parâmetro, no caso o valor do parâmetro N do qual deve ser calculada a fatorial. Veja em seguida, como isto é feito:

Algoritmo e Linguagem de Programação

função FATORIAL ( N : inteiro) : inteiro var I, FAT : inteiro início FAT ←1 Para I de 1 até N passo 1 faça FAT ←FAT * I fim_para FATORIAL ←FAT fim Observe que o nome da função, no caso FATORIAL, é também o nome da variável interna que recebe o valor acumulado da variável FAT, caso o número fornecido para o parâmetro N não seja zero, pois se for zero, o valor da função FATORIAL é igualado a 1, que é o valor da fatorial de zero. Desta forma, uma função retorna um valor pelo seu próprio nome, pois esse nome é usado dentro do corpo da função para a recepção do valor calculado. Outro detalhe a ser considerado numa função, além do seu nome ser usado como variável de retorno, é o fato da definição do seu tipo, no caso, função FATORIAL(N : inteiro) : inteiro, em que N está sendo considerado como inteiro dentro dos parênteses. Isto significa que o valor fornecido pelo parâmetro N é inteiro, porém existe uma segunda definição de tipo fora dos parênteses, que é o tipo de retorno da função. Desta forma entra um valor inteiro com o parâmetro N e sai um valor inteiro para FATORIAL. Observe que pode ocorrer o fato de entrar um parâmetro de um tipo e retornálo como outro tipo 3.1 – Exercício de Aprendizagem O exemplo seguinte faz uso do conceito de sub-rotina do tipo função com passagem de parâmetro e retorno com tipo diferente de dados, daqueles que foram entrados na rotina. Desta forma, considere o seguinte problema computacional: Deve ser criado um programa que por intermédio de uma sub-rotina do tipo função efetue a leitura de dois valores reais e apresente como saída uma mensagem informando se os números são iguais ou diferentes. Algoritmo Assim como o primeiro, este problema também é simples, pois a função em questão recebe dois valores, compara-os e retorna se são iguais ou diferentes. Desta forma, o programa principal pedirá os valores e chamará a função para ter o retorno da condição de igualdade. Programa Principal

123

1) 2) 3)

Pedir a leitura de dois valores, no caso variáveis (NUM1 e NUM2; Chamar a função de comparação de igualdade, fornecendo os dois valores. 36 Apresentar o resultado retornado


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Sub-rotina para Comparação 1) Receber dois valores fornecidos por meio de parâmetro; 2) Efetuar a comparação entre os valores para determinar se são iguais ou diferentes;

Observe que este tipo de problema já indica a entrada de parâmetros de um tipo e o retorno da resposta da função de outro tipo. Português Estruturado O programa principal efetua a leitura dos valores reais para as variáveis NUM1 e NUM2, transferindo os seus valores para os parâmetros formais A e B do tipo real, que assumem seus respectivos valores, tornando-se parâmetros reais. Em seguida é processada a comparação dos dois valores e implicado à função o retorno da condição, desta forma o retorno desta função deve ser lógico. programa COMPARAÇÃO função COMPARA ( A, B : real ) : lógico início COMPARA ←A = B fim var NUM1 , NUM2 : real início escreva “Informe o 1O . valor : “ leia NUM1 escreva “Informe o 2O . valor : “ leia NUM 2 se (compara (NUM 1, NUM 2 ) ) então escreva “Números iguais” senão escreva “Números diferentes” fim_se fim

Algoritmo e Linguagem de Programação

3) Retornar para a função o resultado obtido.

3.2 – Programa Calculadora Em um exemplo anterior, foi demonstrado o uso de sub-rotinas do tipo procedimento no programa calculadora. Naquele momento, as sub-rotinas de cálculo foram simplificadas (por meio do conceito de refinamento sucessivo) com o uso das sub-rotinas de entrada e saída que são operações genéricas de todas as rotinas de cálculo. A proposta seguinte é criar uma sub-rotina de função que efetue o cálculo, segundo o parâmetro de operação fornecido. Assim, essa sub-rotina deve receber três parâmetros, sendo os dois números mais o operador para cálculo. 1)

Se o operador for “ + “ , faz-se a soma dos dois valores;

2)

Se o operador for “ – “, faz-se a subtração dos dois valores;

124


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

Algoritmo e Linguagem de Programação

ABERTA DO BRASIL

3)

Se o operador for “ * “ , faz-se a multiplicação dos dois valores;

4)

Se o operador for “ / “ , faz-se a divisão dos dois valores.

Observe no exemplo do diagrama de quadros (figura 8.13) e do trecho de programa em português estruturado em seguida da rotina CÁLCULO quando da utilização da estrutura de controle com múltipla escolha, a omissão da instrução senão. Isto é possível e pode ser utilizado quando não se deseja estabelecer uma operação ou execução para alguma opção inválida. Perceba que isto, neste exemplo, não é necessário, uma vez que o terceiro parâmetro será indicado dentro de cada sub-rotina de cálculo. Português Estruturado função CÁLCULO ( A, B : real , OPERADOR : caractere) : real início caso OPERADOR seja “ + “ faça CÁLCULO ←A + B seja “ – “ faça CÁLCULO ←A - B seja “ * “ faça CÁLCULO ←A * B seja “ / “ faça CÁLCULO ←A / B fim_caso fim A seguir, é apresentado somente o algoritmo em português estruturado do programa calculadora, aplicando o uso da nova função. programa CALCULADORA var R, A, B : real (Sub-rotinas de entrada e saída) procedimento ENTRADA início escreva “Entre um valor para A: “ leia A escreva “Entre um valor para B: “ leia B fim (Função para o cálculo das operações) função CÁLCULO (A, B : real, OPERADOR : caractere ) : real início caso OPERADOR seja “ + “ faça CÁLCULO ←A + B seja “ – “ faça CÁLCULO ←A - B seja “ * “ faça CÁLCULO ←A * B seja “ / “ faça CÁLCULO ←A / B fim_caso fim

125

36

procedimento SAÍDA início


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

escreva “O resultado de A com B é = “ , R fim (Sub-rotinas de cálculos)

procedimento ROTSUBTRAÇÃO início escreva “Rotina de Subtração” entrada R ←cálculo (A, B, “-“) saída fim procedimento ROTMULTIPLICAÇÃO início escreva “Rotina de Multiplicação” entrada R ←cálculo (A, B, “ * “) saída fim procedimento ROTDIVISÃO início escreva “Rotina de Divisão” entrada se (B = 0) então escreva “Impossível dividir” senão R ←cálculo (A, B, “ / “ ) saída fim_se fim

Algoritmo e Linguagem de Programação

procedimento ROTSOMA início escreva “Rotina de Soma” entrada R ←cálculo (A, B, “ + “ ) saída fim

( Programa Principal ) var OPÇÃO : inteiro início OPÇÃO ←0 enquanto (OPÇÃO < > “5”) faça escreva “1 – Soma” escreva “2 – Subtração” escreva “3 – Multiplicação” escreva “4 – Divisão” escreva “5 – Finalização” escreva “Escolha uma opção: “ leia OPÇÃO se (OPÇÃO < > 5 ) então

126


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

caso OPÇÃO

127

seja 1 faça rotsoma seja 2 faça rotsubtração seja 3 faça rotmultiplicação seja 4 faça rotdivisão senão escreva “Opção inválida – Tente novamente” fim_caso Fim_se fim_enquanto fim.

36


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Roteiro: a) Arrays (Vetores Unidimensionais e Bidimensionais em Java) Roteiro de Atividades Passo 1 - Leitura do Texto sobre Arrays em Java; Passo 2 - Leitura do Texto sobre Arrays Bidimensionais em Java; Passo 3 - Realização das Tarefas de Arrays.

Algoritmo e Linguagem de Programação

Semana 8

128


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Arrays

Algoritmo e Linguagem de Programação

Um array é um grupo de variáveis do mesmo tipo que são referenciadas por um nome comum. Podemos criar arrays de qualquer tipo, e eles podem ter uma ou mais dimensões. Um elemento específico de um array é acessado por seu índice. Os arrays representam uma forma prática de agrupar elementos correlacionados do mesmo tipo. Logo no início, precisamos dar um aviso aos programadores C/C++: Em Java, os arrays funcionam de forma bastante diferente dos arrays de C/C++. Um array unidimensional é essencialmente uma lista de variáveis do mesmo tipo. Para criar um array, primeiro criamos uma variável array do tipo desejado. Por exemplo, a linha a seguir: int vet [ ] ; Cria uma variável array do tipo int chamada vet. Aqui, o tipo int declara o tipo básico do array. O tipo básico determina o tipo de dados de cada elemento que forma o array. Ou seja, o tipo básico do array determina o tipo dos dados que o array conterá. No caso, a linha anterior cria uma variável array de ints. Embora esta declaração estabeleça o fato de que vet é uma variável array, ainda não existe um array de fato neste ponto. Na verdade, o valor de vet é automaticamente ajustado para null, que representa um array sem nenhum valor. Para conectar vet a um array físico e real de inteiros, é preciso alocá-lo, usando new e atribuí-lo a vet (new é um operador especial que aloca memória). Examinaremos new com mais detalhes em uma próxima disciplina do nosso curso, mas precisamos usálo agora para alocar memória para arrays. Eis a forma como new é usado para alocar um array de 10 ints: vet = new int [ 10 ] ; Observe que, nesta linha, o array de ints recém-alocado está sendo atribuído à variável vet. Aqui, int especifica o tipo de dados que estão sendo alocados. O número 10 entre colchetes [ ] especifica o número de elementos contidos no array. E vet é a variável array à qual o array recém-alocado é conectado. Resumindo: quando usamos new para alocar um array, precisamos especificar o tipo e o número de elementos a alocar. Os elementos do array alocado por new serão automaticamente inicializados com o valor zero. Mais uma vez: a obtenção de um array é um processo em duas etapas. Primeiro, é preciso declarar uma variável do tipo array desejado. Segundo, é preciso alocar a memória que conterá o array usando new e atribuí-la à variávvel do array. Assim;em Java;todos os arrays; são alocados dinamicamente. Uma vez que você tenha alocado um array; é possível acessar um elemento específico do array marcando seu índice dentro dos colchetes. Todos os índices de arrays começam em zero. Por exemplo, a linha que se segue atribui o valor 5 ao segundo elemento de vet: vet [ 1 ] = 5 ; 129

36


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

A próxima linha exibe o valor armazenado no índice 3: JOptionPane.showMessageDialog(null, (int) vet[3]); Parar ilustrar esses conceitos, eis um programa que cria um array e logo depois inverte os valores de cada índice dentro do mesmo array: import javax.swing.JOptionPane; public class ArrayUni { public static void main (String args [ ] ) { int vet[] = new int [10] ; int aux ; vet [0] = 2; vet [1] = 5; vet [2] = 9; vet [3] = 6; vet [4] = 8; vet [5] = 10; vet [6] = 1; vet [7] = 11; vet [8] = 4; vet [9] = 12; JOptionPane.showMessageDialog(null, "O vetor original é este : \n") ; for (int i=0; i < 10; i ++ ) JOptionPane.showMessageDialog(null, vet[i] + " \t " ) ; // calcula o vetor invertido for ( int i=0; i<5; i++) { aux=vet [i]; vet [i] = vet [9 - i] ; vet [9 - i] = aux ; } JOptionPane.showMessageDialog(null, "O vetor invertido é este : \n" for (int i=0; i<10; i ++) JOptionPane.showMessageDialog(null, vet [i] + " \t " ); } // fim do método main ( ) }// fim da classe ArrayUni.java

Algoritmo e Linguagem de Programação

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. ); 29. 30. 31. 32.

A saída gerada por este programa é: O vetor original é este: 2 5 9 6 8 10 1 11 4 12 O vetor invertido é este: 12 4 11 1 10 8 6 9 5 2

Os arrays podem ser inicializados no momento da declaração. O processo é muito parecido com aquele usado para inicializar tipos simples. Um inicializador de array é uma lista de expressões separadas por vírgulas contidas entre chaves { }.

130


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Algoritmo e Linguagem de Programação

As vírgulas separam os valores dos elementos do array. O array será automaticamente criado com o tamanho certo para conter o número de elementos especificados no inicializador do array. Não há necessidade de usar new. O p r ó x i m o exemplo é uma nova versão do programa ArrayUni.java: 1. import javax.swing.JOptionPane; 2. public class ArrayUni2 3. { 4. public static void main (String[ ] args ) 5. { 6. int vet[] = {2,5,9,6,8,10,1,11,4,12}; 7. int aux; 8. JOptionPane.showMessageDialog(null, "O vetor original é este : \n") ; 9. for (int i=0; i < 10; i ++ ) 10. JOptionPane.showMessageDialog(null, vet[i] + " \t " ) ; 11. // calcula o vetor invertido 12. for ( int i=0; i<5; i++) 13. { 14. aux=vet [i]; 15. vet [i] = vet [9 - i] ; 16. vet [9 - i] = aux ; 17. } 18. JOptionPane.showMessageDialog(null, "O vetor invertido é este : \n" ) ; 19. for (int i=0; i<10; i ++) 20. JOptionPane.showMessageDialog(null, vet [i] + " \t " ); 21. } // fim do método main ( ) 22. }// fim da classe ArrayUni2.java Ao ser executado, este programa gera a mesma saída da versão anterior. O vetor original é este: 2 5 9 6 8 10 1 11 4 12 O vetor invertido é este: 12 4 11 1 10 8 6 9 5 2 Observe ns linha 6 que, já ao ser criado, o array de inteiros é inicializado com um número. Java faz uma rigorosa checagem para assegurar que o programador não tente armazenar ou referenciar valores fora do alcance do array. O sistema runtime de Java faz a checagem para ter certeza de que todos os índices de array estejam dentro da faixa correta. Neste aspecto, Java é fundamentalmente diferente de C/C++, que não faz limites em tempo de execução. Por exemplo, o sistema runtime faz a checagem do valor de cada índice do array vet para assegurar que todos estejam dentro da faixa 0 a 9, inclusive se tentarmos acessar um elemento fora do alcance do array, usando um número negativo ou um número maior que o comprimento do array, isso causará um erro em tempo de execução. Arrays Multidimensionais

131

Os arrays multidimensionais são implementados em Java na forma de arrays de arrays. Tais arrays de arrays parecem e funcionam exatamente como arrays multidimensionais. Porém existem algumas pequenas diferenças. Para declarar uma variável array bidimensional chamada Mat

36


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

int Mat [ ][ ] =new int [3][2]; Essa declaração aloca um array de ints de 3 por 2 e o atribui a Mat. Internamente, essa matriz é implementada como um array de arrays de int. Observe que o primeiro índice representa a linha e o segundo índice a coluna. O programa a seguir exemplifica um array bidimensional:

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.

import javax.swing.JOptionPane; public class MatrizMat { public static void main (String args [ ] ) { int Mat [][] = {{5,15},{28,82},{4,14}}; int Trans [ ] [ ] = new int [2] [3]; /* como já é de conhecimento, a matriz transporta é obtida trocando-se as linhas pelas colunas*/ for (int i=0; i<3; i++) for (int k=0; k<2; k++) Trans[k][i] =Mat[i][k] ; JOptionPane.showMessageDialog(null, "A matriz original é: \n " ) ; for (int i=0; i<3; i++) for (int k=0; k<2; k++) JOptionPane.showMessageDialog(null, Mat [i][k] + " \t ") ; JOptionPane.showMessageDialog(null, "A matriz transposta é: \n") ; for (int i=0; i<3; i++) for(int k=0; k<3; k++) JOptionPane.showMessageDialog(null, Trans[i][k] + "\t " ); } }

5 28 4

15 82 14

5 15

28 82

A matriz transposta é:

Algoritmo e Linguagem de Programação

Eis a saída desse programa:

4 14

132


UAB

MEC-SEED CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO PARÁ NÚCLEO DE EDUCAÇÃO ABERTA E A DISTÂNCIA

UNIVERSIDADE

ABERTA DO BRASIL

Bibliografia PINTO, Wilson Silva. Introdução. ao desenvolvimento. de algoritmos e estrutura de dados. São Paulo: Érica, 1990. FORBELLONE, A. L. V. e EBERSPÄCHER, H. F. Lógica de Programação – A Construção de Algoritmos e Estruturas de Dados. São Paulo: Makron Books, 2000. GUIMARÃES, Ângelo de Mora, LAGES, Newton Alberto de Castilho. Algoritmos e Estruturas de Dados. Rio de Janeiro: LTC, 1985. DEITEL, H. M. & DEITEL, P. J. Java: Como Programar. Porto Alegre: Bookman, 2002. FURGERI, Sérgio. Java 2 Ensino Didático: Desenvolvendo e Implementando Aplicações. São Paulo: Érica, 2002.

Algoritmo e Linguagem de Programação

]

36


“ É A EDUCAÇÃO UM SEGURO NA VIDA E UM PASSAPORTE PARA A ETERNIDADE ” ANTÔNIO APARISI Y. GUIJARRO

UAB

MINISTÉRIO DA EDUCAÇÃO

UNIVERSIDADE

ABERTA DO BRASIL

Av. Almirante Barroso 1155 - Marco CEP:66093-020 Telefone:(91)3201-1751 / 0800-727-1307 www.cefetpa.br


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.