Your SlideShare is downloading. ×
Apostila - Linguagem de Programação I
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Apostila - Linguagem de Programação I

7,393
views

Published on

Published in: Technology

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
7,393
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
247
Comments
0
Likes
3
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. INSTITUTO FEDERAL DE MATO GROSSO DO SULTecnologia em Sistemas para InternetDisciplina: Linguagem de Programação IProf.º Msc. Sidney Roberto de SousaApostila – Linguagem de Programação I1 - Conteúdo da apostila• Criando um programa em Java• Compilando e executando programas em Java• Imprimindo texto na tela• Trabalhando com números inteiros• Trabalhando com números reais• Operações matemáticas◦ Operações binárias◦ Operações unárias• Trabalhando com booleanos e operações lógicas• Trabalhando com strings• Lendo valores do usuário• Controlando o fluxo do programa• Utilizando laços de repetição• Matrizes2 - Criando um programa em JavaUm programa Java básico precisa ser escrito dentro de uma classe. Em um futuropróximo, aprenderemos mais a respeito sobre classes e objetos. Por enquanto, tudo o queprecisamos saber é que todo o algoritmo do nosso programa Java precisa ser escrito dentro deuma definição de classe, conforme o exemplo abaixo.public class MeuPrograma {public static void main(String[] args) {// O seu algoritmo vai aqui!}}No exemplo, a nossa classe chama-se MeuPrograma. O nome de uma classe Java deveobrigatoriamente começar com uma letra e não pode conter caracteres especiais (como porexemplo $%”&#-+=/(){}[]*@!.?`ªº). É uma convenção que o nome de classes Java sejamescritas no formato Camel Case, ou seja, com cada palavra do nome iniciada por uma letramaiúscula e todos os caracteres restantes em minúsculo. Todas as classes que escreveremosnesta disciplina conterá o método main, exatamente da forma como foi escrito no exemploacima.Dentro do método main, na única linha de código do método, existe um comentárioexplicando que o código do algoritmo do programa deve ser escrito a partir daquele ponto.Comentários não são códigos de programa. Eles servem somente para se comentar algo sobreo código que está sendo escrito. Por exemplo, você pode querer inserir comentários queexpliquem o raciocínio por trás do algoritmo que você desenvolveu, ou mesmo um lembretepara você mesmo a respeito de um trecho de código mais complexo. Abaixo, alguns exemplosde comentários.
  • 2. // Eu sou um comentário de uma linha// Eu sou um comentário de// duas linhas/** Eu também sou um comentário de* duas linhas!*/Outra coisa a ser notada é que tanto o corpo de código da classe MeuProgramaquanto o corpo de código do método main são delimitados por chaves. Esta delimitação éobrigatória e nos ajuda a organizar o nosso código.Uma vez que você escreveu o seu programa dentro de uma classe e de um métodomain, você deve salvar o arquivo de texto que contém o código que você escreveu. Anomenclatura deste arquivo deve seguir obrigatoriamente o padrão abaixo:NOME_DA_CLASSE.javaPor exemplo, a classe MeuPrograma do nosso exemplo deve ser salva no arquivoMeuPrograma.java. Tome muito cuidado para não se esquecer deste procedimento!Exercícioa) Crie a classe MeuPrograma conforme o exemplo anterior e salve a classe em umarquivo apropriado (conforme ensinado nesta seção).3 - Compilando e executando programas em JavaUm programa Java precisa ser compilado para bytecodes antes que a máquina virtualJava possa executá-lo. Para tanto, a plataforma Java oferece um compilador Java, presente noscript javac.Antes que você possa utilizar o script javac, talvez você deseje adicioná-lo às suasvariáveis de ambiente, para que você possa executá-lo em qualquer pasta. No Windows,primeiramente você deve informar ao sistema operacional onde os arquivos da máquina virtualJava estão localizados, criando a variável de ambiente JAVA_HOME:Nome da variável: JAVA_HOMEValor da variável: PASTA_ONDE_O_JAVA_FOI_INSTALADOPor exemplo, se você instalou a última versão do Java1em uma instalação padrão, semdefinir um outro diretório, provavelmente você fará a seguinte configuração:Nome da variável: JAVA_HOMEValor da variável: C:Program FilesJavajdk1.7.0_17Após criar a variável de ambiente JAVA_HOME, você precisa informar ao Windows ondeestão localizados os programas da máquina virtual Java. Para tanto, basta você adicionar ocaminho dos programas na variável de ambiente PATH (ATENÇÃO: Esta variável provavelmentejá existe na sua instalação do Windows. Assim, coloque o caminho dos executáveis Java nofinal da string do valor da variável PATH. NÃO APAGUE o conteúdo já existente da variável!).Caso você tenha instalado a última versão do Java em uma instalação padrão comocitado anteriormente, você deve colocar o valor abaixo no final da string do valor da variávelde ambiente PATH (lembrando que quando uma variável de ambiente possui vários valores,cada valor deve ser separado pelo caractere ;):C:Program FilesJavajdk1.7.0_17binUma vez que você tenha realizado todas estas configurações (caso tenha sido1 Data de 08/04/2013.
  • 3. necessário realizá-las), o seu computador está pronto para compilar e executar os seusprogramas Java. Para compilar um programa Java, entre no PROMPT do DOS, use o comando cdpara entrar na pasta onde o seu arquivo .java está localizado e utilize o comando javac paracompilar o seu programa.Por exemplo, considere o nosso programa escrito na classe MeuPrograma, a qual estádentro do arquivo MeuPrograma.java. Assim, para compilar o seu programa você precisadigitar o comando abaixo:javac MeuPrograma.javaAo fazer isto, caso o seu programa não contenha nenhum erro, o compilador Java criaum arquivo chamado MeuPrograma.class na mesma pasta onde o seu programa estásituado. Este arquivo contém os bytecodes do seu programa para que a máquina virtual Javapossa executá-lo. Assim, para executar o seu programa, você precisa digitar o comando abaixo:java MeuProgramaE pronto! Agora é só testar o seu programa!Exercíciosa) Abra o terminal de linha de comando, encontre a pasta onde o arquivo da classeMeuPrograma se encontra e compile e execute a classe MeuPrograma.4 – Imprimindo texto na telaUma das primeiras coisas úteis que podemos aprender é imprimir texto em linha decomando por meio de um programa Java. No Windows, o shell de linha de comando maisutilizado é o PROMPT do MS-DOS. No Linux, temos vários tipos de shells, como o bash e odash. O programa abaixo imprime a mensagem “Olá! Eu sou um programa escrito em Java!”na tela.public class MeuPrograma {public static void main(String[] args) {System.out.print("Olá! Eu sou um programa escrito em Java!");}}O método print, existente no atributo out da classe System do Java imprimemensagens em linha de comando. Se você compilar e executar este programa, ele irá gerar aseguinte saída no shell:Note que o texto impresso pelo programa provocou uma má formatação no shell delinha de comando, pois o texto impresso e a linha de comando atual ficaram na mesma linha!Para evitar este tipo de problema, podemos utilizar o método println ao invés do métodoprint, conforme o exemplo abaixo:public class MeuPrograma {public static void main(String[] args) {System.out.println("Olá! Eu sou um programa escrito em Java!");}}suesid@suesid­Inspiron­7520:~/workspace/TestesGerais/src/br/edu/ifms/aula$ javac MeuPrograma.java suesid@suesid­Inspiron­7520:~/workspace/TestesGerais/src/br/edu/ifms/aula$ java MeuPrograma Olá! Eu sou um programa escrito em Java!suesid@suesid­Inspiron­7520:~/workspace/TestesGerais/src/br/edu/ifms/aula$
  • 4. O método println imprime a mensagem desejada na tela do shell, porém ele pula umalinha do shell após a impressão. Abaixo, a saída do programa acima:Existem basicamente duas formas de se imprimir múltiplas linhas na tela. A primeiraforma é utilizar um println por frase, conforme abaixo:public class MeuPrograma {public static void main(String[] args) {System.out.println("Olá! Eu sou um programa escrito em Java!");System.out.println("Estou imprimindo duas linhas na tela.");}}A outra forma é utilizar o caractere especial n dentro do método print. Este caracterefaz com que o texto seja quebrado em outra linha. O programa abaixo gera a mesma saída doprograma do exemplo acima:public class MeuPrograma {public static void main(String[] args) {System.out.print("Olá! Eu sou um programa escrito em Java!nEstou imprimindo duas linhas na tela.n");}}Opcionalmente, você pode inserir tabulações nas frases a serem impressas na tela, afim de se obter uma melhor formatação do texto. Para inserir uma tabulação, utilizamos ocaractere especial t. O programa abaixo imprime uma frase na tela, inserindo uma tabulaçãono início da frase:public class MeuPrograma {public static void main(String[] args) {System.out.println("tOlá! A tabulação no início desta frase simula o início de um parágrafo.");}}Exercíciosa) Escreva um programa que imprima na tela o poema a seguir utilizando uma ou maischamadas ao método println, sabendo que cada frase possui uma tabulação em seu início.BILHETE Se tu me amas, ama­me baixinho Não o grites de cima dos telhados Deixa em paz os passarinhos Deixa em paz a mim! Se me queres, enfim, tem de ser bem devagarinho, Amada, que a vida é breve, e o amor mais breve ainda... Mario Quintanab) Escreva um programa que imprima na tela o mesmo poema acima, porém utilizandosomente uma chamada ao método print.suesid@suesid­Inspiron­7520:~/workspace/TestesGerais/src/br/edu/ifms/aula$ javac MeuPrograma.java suesid@suesid­Inspiron­7520:~/workspace/TestesGerais/src/br/edu/ifms/aula$ java MeuPrograma Olá! Eu sou um programa escrito em Java!suesid@suesid­Inspiron­7520:~/workspace/TestesGerais/src/br/edu/ifms/aula$
  • 5. 5 - Trabalhando com números inteirosMuitos dos problemas do mundo real que necessitam de um programa de computadorpara serem resolvidos envolvem números. Considere o seguinte problema: uma pessoa possui53 pacotes de biscoito salgado e 87 pacotes de biscoito doce em seu estoque e ela precisasaber quantos pacotes de biscoito ela possui no total. Note que este problema envolve apenasnúmeros inteiros, ou seja, número que não precisam de casas decimais para representá-los.Vamos escrever um programa para resolver este problema:public class SomaPacotesBiscoito {public static void main(String[] args) {int numeroPacotesBiscoitoSalgado = 53;int numeroPacotesBiscoitoDoce = 87;int totalPacotes = numeroPacotesBiscoitoSalgado + numeroPacotesBiscoitoDoce;System.out.println("Você possui " + totalPacotes + " pacotes de biscoito.");}}Para resolver este problema, precisamos utilizar três variáveis. Uma variável é um localde armazenamento de dados. Você pode pensar em uma variável como uma gaveta capaz dearmazenar itens. Toda variável possui um nome, o qual deve começar com uma letra e nãopode conter caracteres especiais. É uma forte convenção que variáveis em Java iniciem comletras minúsculas.As três variáveis que utilizamos neste programa são do tipo int. Uma variável do tipoint só pode armazenar números inteiros. Existem outros tipos em Java que podem armazenarnúmeros inteiros. Para uma melhor explicação sobre tipos inteiros, veja os slides da aula 3.A primeira variável utilizada no programa acima chama-senumeroPacotesBiscoitoSalgado. Ela guarda o número de pacotes de biscoito salgadocontidos no estoque da pessoa do nosso problema. A segunda variável do nosso programachama-se numeroPacotesBiscoitoDoce. Por sua vez, ela guarda o número de pacotes debiscoito doce existentes no estoque.A soma total de pacotes resulta em um número inteiro, visto que ela é composta pelasoma de dois números inteiros. Assim, a última variável do nosso programa (totalPacotes)armazena a soma do número de pacotes de biscoito salgado com o número de pacotes debiscoito doce. Observe bem a linha de código que executa esta soma. O operador = simbolizaque algum valor será atribuído à variável totalPacotes. O operador + simboliza a soma entreos valores de numeroPacotesBiscoitoSalgado e numeroPacotesBiscoitoDoce. Veremosmais em frente nesta apostila outros tipos de operações matemáticas possíveis em Java.O número total de pacotes é exibido na última linha do programa. A fim de facilitar oentendimento do usuário a respeito do que foi realizado no programa, exibimos a ele uma fraseexplicativa contendo o número total de pacotes calculado. Note que utilizamos o operador +para concatenar a frase que queremos exibir para o usuário com o número total de pacotes.Esta concatenação transforma o número inteiro em texto, podendo assim ser juntado à frase. Oprograma exibe a seguinte saída na tela:Você possui 140 pacotes de biscoito.6 - Trabalhando com números reaisAgora, imagine que a pessoa do exemplo anterior deseje saber qual o peso total dosbiscoitos que ela possui em estoque. Ela sabe que cada pacote de biscoito salgado pesa 0,350kg e cada pacote de biscoito doce pesa 0,414 kg. Note que agora alguns números do nossoproblema não são inteiros – no caso, os pesos dos pacotes. Assim, não podemos armazenartais valores em variáveis inteiras. A seguir, a solução para este problema:
  • 6. public class CalculoPesoPacotesBiscoito {public static void main(String[] args) {int numeroPacotesBiscoitoSalgado = 53;int numeroPacotesBiscoitoDoce = 87;double pesoTotalBiscoitosSalgados = numeroPacotesBiscoitoSalgado * 0.350;double pesoTotalBiscoitosDoces = numeroPacotesBiscoitoDoce * 0.414;double pesoTotalPacotes = pesoTotalBiscoitosSalgados + pesoTotalBiscoitosDoces;System.out.println("O seu estoque de biscoitos pesa " + pesoTotalPacotes + " kg.");}}Além das duas variáveis inteiras para armazenar o número total de pacotes de cadatipo de biscoito, o nosso programa possui mais três variáveis do tipo double para armazenar opeso total de biscoitos salgados, o peso total de biscoitos doces e o peso total de biscoitos emestoque. O tipo double é utilizado para definir que as três variáveis armazenam números reais.Uma variável do tipo double pode armazenar tanto números reais quanto números inteiros. Otipo float também é utilizado para se definir variáveis para armazenar números reais. Paraentender melhor as diferenças entre estes dois tipos, veja os slides da aula 3. O programaacima imprime a seguinte mensagem na tela:O seu estoque de biscoitos pesa 54.568 kg.7 - Operações matemáticasNa linguagem Java é possível compor desde operações matemáticas simples - comosomar ou subtrair dois valores - até operações mais complexas. No exemplo anterior, o nossocódigo realizou duas operações matemáticas básicas: a soma entre dois valores, por meio dooperador + e a multiplicação entre dois valores, por meio do operador *. Podemos agrupar asoperações matemáticas em Java em dois tipos: operações binárias e operações unárias.7.1 Operações bináriasUma operação binária é uma operação matemática que envolve dois valores distintos.Tais valores podem ser constantes ou oriundos de variáveis. A tabela abaixo mostra asoperações matemáticas binárias possíveis em Java.Operação Operador ExpressãoAdição + a = b + c;Subtração - a = b – c;Multiplicação * a = b * c;Divisão / a = b / c;Operações matemáticas do tipo a = a OPERADOR b; podem ser abreviadas. A tabelaabaixo mostra as abreviações possíveis.Expressão Expressão abreviadaa = a + b; a += b;a = a - b; a -= b;a = a * b; a *= b;a = a / b; a /= b;
  • 7. O programa abaixo contém algumas operações matemáticas binárias simples:public class ExemploOperacoesBinarias {public static void main(String[] args) {int valor1 = 45;// Somando o valor de uma variável com um constanteint valor2 = valor1 + 76; // 121// Somando o valor de duas variáveisvalor1 = valor1 + valor2; // 166// Realizando a mesma operação, usando uma abreviaçãovalor1 += valor2; // 287// Subtraindo o valor de duas constantesdouble numeroReal = 687.35 - 790; // −102.65numeroReal -= 100; // −202,65numeroReal *= -1; // 202,65double resultado = numeroReal / valor1; // 0.7060975609756097resultado /= resultado; // 1}}Podemos compor operações matemáticas mais complexas, como fórmulasmatemáticas. A seguir, alguns programas que contém fórmulas conhecidas:public class Bhaskara {public static void main(String[] args) {double a = 5;double b = 6;double c = 4;double delta = b * b - 4 * a * c; // -44System.out.println("Delta = " + delta);}}public class AreaCircunferencia {public static void main(String[] args) {/** Constantes em Java são definidas por meio do prefixo final.* O valor da constante deve ser definido obrigatoriamente* no momento de sua declaração.* O valor de uma constante não é mutável. Isto significa que* após a inicialização da constante, instruções como esta:* PI = 456.87;* Gerariam um erro.*/final double PI = 3.14159;double raio = 5;double areaCircunferencia = PI * raio * raio; // 78.53975System.out.println("Área da circunferência = " + areaCircunferencia);}}public class AreaQuadrado {public static void main(String[] args) {double lado = 4.5;double areaQuadrado = lado * lado; // 20.25System.out.println("Área do quadrado = " + areaQuadrado);}}Vale a pena salientar que as operações de multiplicação e divisão possuem precedênciasobre as operações de adição e subtração. Caso a fórmula precise ser calculada utilizando umaordem de precedência diferente à ordem normal, é preciso utilizar parênteses para se definir ostrechos de precedência. Considere o exemplo abaixo:
  • 8. public class ExemploPrecedencia {public static void main(String[] args) {int valor1 = 7;int valor2 = 9;int resultado = valor1 * (98 - valor2) * 4; // 2492System.out.println(resultado);}}Note que a fórmula do programa acima resultaria no valor 650 caso não houvessem osparênteses, pois primeiramente seriam calculadas as multiplicações para depois ser calculadaa subtração. Porém, o uso dos parênteses faz com que a subtração seja calculada inicialmente,fazendo com que a fórmula resulte no valor 2492.ExercíciosPara cada problema abaixo, escreva um programa para resolvê-lo:a) Uma pessoa viaja em seu veículo de passeio pelo estado de Mato Grosso do Sul. Emum determinado momento, ela chega no município de Guia Lopes da Laguna. Porém, o seuobjetivo é chegar até o município de Bonito, o qual se situa a 45 km de distância do municípiode Guia Lopes da Laguna. Dado que seu veículo viaja sob a velocidade média de 80 km/h,quanto tempo (em minutos) a pessoa demorará para chegar até o município de Bonito?(Recordando que segundo a física mecânica, a fórmula para se encontrar o intervalo de tempoé tempo=distância/velocidade. Não se esqueça de realizar a conversão para minutos nofinal!)b) Um pedreiro utilizou 1000 tijolos para construir 30 metros de muro. Dado que eleainda necessita construir 6 metros de muro, quantos tijolos ele ainda necessitará utilizar? (Nãose preocupe se o número da resposta não for inteiro)c) Um artesão deseja construir uma torre uniforme de 3,5 m de altura utilizando cartasde baralho. Ele já conseguiu construir 1,75 m da torre, utilizando para tanto 557 baralhos.Sabendo que um baralho tradicional possui 52 cartas, quantas cartas ele ainda necessitarápara finalizar a construção da sua torre? (Não se preocupe se o número da resposta não forinteiro)d) Em uma pesquisa eleitoral, identificou-se que 432 pessoas pretendem votar nocandidato José da Silva; 284 pessoas pretendem votar na candidata Ana Alencar; 698 pessoaspretendem votar na candidata Carolina Bezerra; por fim, 173 pessoas se mostraram indecisasquanto a que candidato votar. Qual o percentual de indecisos levantado nesta pesquisaeleitoral?7.2 Operações unáriasUma operação unária envolve apenas uma variável. Em Java, existem duas operaçõesunárias matemáticas, o incremento e o decremento. O operador de incremento faz com que ovalor atual da variável seja incrementado em uma unidade, ou seja, a variável recebe o seuvalor atual somado em uma unidade. Por sua vez, o operador decremento faz com que o valorda variável seja decrementado em uma unidade, ou seja, a variável recebe o seu valor atualsubtraído em uma unidade. A tabela abaixo exibe estas operações.Operação Operador ExpressãoIncremento ++ a++; ou ++a;Decremento -- a--; ou --a;Em alguns casos, o uso do operador unário antes ou depois da variável pode resultarem valores distintos. O programa abaixo exibe alguns exemplos de incremento e decremento,
  • 9. além dos resultados da operação unária com operadores antes e depois da variável:public class ExemploOperacoesUnarias {public static void main(String[] args) {double valor = 2.7;valor++; // 3.7int numero = 58;numero--; // 57int outroNumero = 57;int valorInteiro = ++numero; // valor recebe 58valorInteiro = outroNumero++; // valor recebe 57!}}8 – Trabalhando com booleanos e operações lógicasNa linguagem Java, um valor booleano só pode ter um dentre dois valores: true efalse, respectivamente verdadeiro e falso. Saber trabalhar com valores booleanos éessencial para a criação de programas complexos em Java, conforme veremos a partir destaseção.Em Java, um valor booleano pode ser armazenado em uma variável do tipo boolean.Um operação realizada entre dois valores booleanos é chamada de operação lógica (oubooleana) binária. O resultado de uma operação lógica só pode resultar em um valorbooleano, ou seja, true ou false. Existem basicamente duas operações lógicas binárias, asoperações AND e OR. Em Java, o operador && simboliza uma operação AND. Uma operaçãoAND só resulta o valor true se e somente se os dois valores da operação forem iguais a true;caso contrário, o resultado da operação será false. A tabela abaixo exibe os resultados paracada operação AND possível entre dois valores booleanos:a b a && btrue true truetrue false falsefalse true falsefalse false falseA operação OR em Java é simbolizada pelo operador ||. Uma operação OR só resulta ovalor false se e somente se os dois valores da operação forem iguais a false. A tabela abaixoexibe os resultados para cada operação OR possível entre dois valores booleanos:a b a || btrue true truetrue false truefalse true truefalse false falseExiste apenas uma operação unária sobre valores booleanos, a operação de negação.Em Java, esta operação é simbolizada pelo operador !. Quando um valor booleano é negado, oseu valor é invertido. A tabela abaixo exibe os resultados possíveis para cada negação:a !atrue falsefalse true
  • 10. O programa abaixo mostra alguns exemplos de operações booleanas binárias e unárias:public class ExemploOperacoesBooleanas {public static void main(String[] args) {boolean a = true;boolean b = false;boolean resultado = a && b; // falseresultado = a || b; // trueresultado = !a; // falseresultado = !b; // true/** Operações AND e OR não possuem precedência uma sobre a outra. As* operações são calculadas par a par.*/resultado = false && true || false || true; // true}}É possível criar operações lógicas envolvendo números inteiros ou reais. Existem muitassituações em que precisamos comparar dois ou mais números. As operações AND e OR não seaplicam a números diretamente. As operações lógicas possíveis entre dois valores numéricossão exibidas na tabela abaixo:Operação Operador ExpressãoIgual == a == bDiferente != a != bMaior > a > bMenor < a < bMaior ou igual >= a >= bMenor ou igual <= a <= bO programa abaixo exemplifica as operações da tabela acima:public class ExemploOperacoesLogicasNumericas {public static void main(String[] args) {int numero = 67;double outroNumero = -178.54;boolean saoIguais = numero == outroNumero; // falseboolean saoDiferentes = numero != outroNumero; // trueboolean primeiroEMaior = numero > outroNumero; // trueboolean primeiroEMenor = numero < outroNumero; // falseboolean menorOuIgual = 67 <= numero; // trueboolean maiorOuIgual = -177 >= outroNumero; // true}}Operações lógicas unárias possuem precedência sobre as operações binárias.Operações lógicas binárias de comparação entre números (==, !=, >, <, >=, <=) possuemprecedência sobre as operações AND e OR (&& e ||). Se você deseja forçar a precedência deuma determinada operação lógica binária, tal operação deve ser escrita entre parênteses,como no exemplo abaixo:public class ExemploPrecedenciaOperacoesLogicas {public static void main(String[] args) {boolean resultado = (98 < 89) && (true && false) || true; // true}}
  • 11. 9 - Trabalhando com stringsUma string é uma cadeia de caracteres. Nós já trabalhamos com strings nesta apostila,quando criamos programas para imprimir texto na tela:public class MeuPrograma {public static void main(String[] args) {System.out.print("Olá! Eu sou um programa escrito em Java!");}}Neste exemplo, o programa imprime a string “Olá! Eu sou um programa escrito emJava!” na tela. Em Java, uma string deve ser delimitada por aspas duplas (“”). A string desteexemplo é dita constante, pois em seu ciclo de vida o seu valor não é alterado. Para guardar oseu valor e opcionalmente alterá-lo, podemos armazenar esta string em uma variável. Alinguagem Java utiliza a classe String para armazenar strings. Abaixo, um exemplo simples deuso da classe String:public class ExemploStringSimples {public static void main(String[] args) {String umaString = "Olá! Eu sou um programa escrito em Java!";System.out.println(umaString);}}Uma propriedade importante de uma string é o seu tamanho. O tamanho de uma stringé o número de caracteres imprimíveis ou não imprimíveis (ex.: n e t) que ela possui.Lembre-se sempre que o caractere de espaço em branco também é um caractere válido eimprimível, influenciando assim no tamanho da string. Para se obter o tamanho de uma string,basta utilizar o método length da classe String, conforme o exemplo abaixo:public class ExemploTamanhoString {public static void main(String[] args) {String umaString = "Olá! Eu sou um programa escrito em Java!";int tamanho = umaString.length(); // 40System.out.println("A string " + umaString + " possui tamanho " + tamanho);}}A menor string possível é a string vazia (“”), ou seja, uma string que não possui aomenos um caractere. Existem duas formas básicas de se verificar se uma string é vazia ou não.A primeira é verificar se o seu tamanho é igual a 0, utilizando o método length; a segunda éverificar diretamente se a string é vazia por meio do método isEmpty da classe String. Estemétodo retorna true se a string for vazia ou false caso contrário. Abaixo, um programa queexemplifica estas duas formas de verificação:public class ExemploStringVazia {public static void main(String[] args) {String umaString = "";int tamanho = umaString.length();System.out.println("Tamanho: " + tamanho+ ". Se for zero, então a string é vazia.");boolean estaVazia = umaString.isEmpty();System.out.println("Está vazia? " + estaVazia);}}É possível concatenar duas ou mais strings utilizando o operador +. De fato, nós jáfizemos isto algumas vezes nesta apostila, quando imprimimos texto na tela. Note que emmuitos exemplos, nós acabamos concatenando strings com números ou mesmo com valoresbooleanos. Quando uma operação de concatenação é realizada entre uma string e um outro
  • 12. valor não string, tal operação sempre resulta em uma string. Para entender melhor isto,verifique o exemplo abaixo:public class ExemploConcatenacaoStrings {public static void main(String[] args) {String primeiraParte = "Meu nome é ";String segundaParte = " Sidney.";String fraseCompleta = primeiraParte + segundaParte;// Meu nome é Sidney.System.out.println(fraseCompleta);int numero = 567;String umaString = "Eu escolhi o número " + numero;// Eu escolhi o número 567System.out.println(umaString);double numeroReal = 45.67;umaString = "Eu escolhi o número " + numeroReal;// Eu escolhi o número 45.67System.out.println(umaString);/** É possível abreviar concatenações locais, i.e., concatenação entre* uma string e ela mesma.*/umaString += ". Também escolhi o valor " + true + ".";// Eu escolhi o número 45.67. Também escolhi o valor true.System.out.println(umaString);}}Existem duas formas de verificar se duas strings são iguais. A primeira forma é utilizar ooperador == entre as duas strings. Porém, existem alguns casos em que comparar stringsdesta forma pode levar a resultados inesperados. A forma mais segura de se verificar se duasstrings são iguais é utilizando o método equals da classe String. O programa abaixoexemplifica estas duas formas:public class ExemploStringsIguais {public static void main(String[] args) {String primeiraString = "Copie-me se for capaz!";String segundaString = "Copie-me se for capaz!";boolean saoIguais = primeiraString == segundaString; // truesaoIguais = primeiraString.equals(segundaString); // truesaoIguais = segundaString.equals(primeiraString); // true}}No exemplo acima, as duas strings foram consideradas iguais pois todos os caracteresde cada posição de uma string é igual ao da outra string. Ambos os tipos de comparação sãosensíveis a casos, ou seja, consideram se as letras contidas nas strings são maiúsculas ouminúsculas. Isto significa que, para ambos os tipos de comparação, os caracteres a e A, porexemplo, são distintos. Assim, se alterarmos o programa do exemplo anterior conforme abaixo,os resultados serão diferentes:public class ExemploStringsIguais {public static void main(String[] args) {String primeiraString = "Copie-me Se for Capaz!";String segundaString = "Copie-me se for capaz!";boolean saoIguais = primeiraString == segundaString; // falsesaoIguais = primeiraString.equals(segundaString); // falsesaoIguais = segundaString.equals(primeiraString); // false}}A classe String oferece o método equalsIgnoreCase para se realizar comparações deigualdade entre duas strings ignorando casos, ou seja, maiúsculas e minúsculas. Vamosreescrever a classe ExemploStringsIguais para que ela possa realizar a comparação entre asduas strings ignorando casos:
  • 13. public class ExemploStringsIguais {public static void main(String[] args) {String primeiraString = "Copie-me Se for Capaz!";String segundaString = "Copie-me se for capaz!";boolean saoIguais = primeiraString.equalsIgnoreCase(segundaString); // true}}Uma forma alternativa de se comparar duas strings ignorando casos é convertendoambas as strings para algum caso específico. Por exemplo, podemos converter os caracteresde ambas as strings para minúsculo; assim, ao compararmos as strings com o método equalsele retornará o valor true. A classe String oferece o método toLowerCase para transformartodos os caracteres da string para minúsculo e o método toUpperCase para transformar todosos caracteres da string para maiúsculo. O programa a seguir verifica a igualdade entre duasstrings utilizando duas abordagens distintas:public class ComparacaoAlternativaStrings {public static void main(String[] args) {String primeiraString = "Copie-me Se for Capaz!";String segundaString = "Copie-me se for capaz!";// Converte as strings para minúsculoprimeiraString = primeiraString.toLowerCase();segundaString = segundaString.toLowerCase();boolean saoIguais = primeiraString.equals(segundaString); // trueprimeiraString = "Crie outra String igual a MIM!";segundaString = "crie outra string igual a mim!";// Converte as strings para maiúsculoprimeiraString = primeiraString.toUpperCase();segundaString = segundaString.toUpperCase();saoIguais = primeiraString.equals(segundaString); // true}}Como dito anteriormente, uma string é uma cadeia de caracteres. Um caractere podeser armazenado em uma variável do tipo char. Uma variável do tipo char só pode armazenarum único caractere imprimível ou não imprimível. É possível pegar um determinado caracterede uma string de acordo com a sua posição (índice) na string. O primeiro caractere de umastring é localizado na posição 0; o último caractere de uma string é localizado na posiçãolength() - 1, ou seja, se uma string possui tamanho 10, o seu último caractere é localizado naposição 9. A tabela abaixo ilustra a indexação de caracteres na string “Olá mundo!”. Noexemplo, a posição 4 da string guarda o caractere m, assim como a posição 3 da stringguarda o caractere (espaço em branco).O l á m u n d o !0 1 2 3 4 5 6 7 8 9Para pegar um caractere de uma string situado em uma posição em específico,utilizamos o método charAt da classe String. O programa a seguir mostra o uso do métodocharAt. Note que cada caractere recuperado da string de exemplo é armazenado em umavariável do tipo char:
  • 14. public class PegaCaractereString {public static void main(String[] args) {String umaString = "Uma string é uma cadeia de caracteres.";char caractere = umaString.charAt(5); // t/** Caracteres constantes devem ser delimitados por aspas simples e não* aspas duplas, como fazemos com strings.*/boolean igualT = caractere == t; // true// Pega o primeiro caractere da stringcaractere = umaString.charAt(0); // USystem.out.println("Primeiro caractere: " + caractere);// Pega o último caractere da stringcaractere = umaString.charAt(umaString.length() - 1); // .System.out.println("Último caractere: " + caractere);}}Anteriormente nesta seção vimos como concatenar duas ou mais strings em uma únicastring. Porém, em alguns casos precisamos quebrar uma string de tal forma a resultar umastring menor ou mesmo quebrar a string original em duas ou mais strings, de acordo comalguma necessidade. O método substring da classe String retorna uma parte da stringoriginal, de acordo com as posições delimitadoras desejadas. O programa a seguir pega partesde uma string utilizando o método substring de duas formas distintas:public class ExemploSubstring {public static void main(String[] args) {String umaString = "Olá, mundo! Eu sou uma string!";/** Pega a parte da string que inicia na posição 11 e termina na posição* length() - 1: " Eu sou uma string!"*/String parteDaString = umaString.substring(11);/** Pega a parte da string que inicia na posição 0 e termina na posição* 10: "Olá, mundo!"*/parteDaString = umaString.substring(0, 11);}}Agora, digamos que queremos verificar se uma string contém uma substring, ou seja,uma string de tamanho menor ou igual à string original. Por exemplo, digamos que queremosverificar se uma string contém a substring “animal”. Para resolver este problema, utilizaremoso método contains da classe String:public class ExemploContains {public static void main(String[] args) {String umaString = "Ontem foi visto um animal na praça central.";/** O método contains da classe String verifica a existência de uma* substring na string pesquisada.*/boolean temAnimalNaFrase = umaString.contains("animal"); // true/** Agora, faremos uma verificação ignorando casos*/boolean temPracaNaFrase = umaString.toUpperCase().contains("CENTRAL"); // true}}Uma operação também possível em strings é substituir uma determinada substring poroutra string. Para tanto, a classe String oferece dois métodos. O método replace substituitodas as ocorrências de uma substring por uma outra string desejada. Por sua vez, o métodoreplaceAll substitui todas as substrings que correspondem a uma determinada expressãoregular por uma outra string desejada. A seguir, alguns exemplos de substituições de strings:
  • 15. public class ExemploSubstituicoes {public static void main(String[] args) {String umaString = "A Ana comeu banana... mas que sacana!";// A Ana comeu banana... mas que espertinha!System.out.println(umaString.replace("sacana", "espertinha"));// A Ana comeu bANAna... mas que sacANA!System.out.println(umaString.replace("ana", "ANA"));/** Substitui todas as vogais minúsculas pelo dígito 0:* "A An0 c0m00 b0n0n0... m0s q00 s0c0n0!"*/System.out.println(umaString.replaceAll("[aeiou]", "0"));/** Substitui todas as ocorrências da substring "ana" pela string "eno",* ignorando casos: "A eno comeu benona... mas que saceno!"*/System.out.println(umaString.replaceAll("(?i)ana", "eno"));/** Substitui todas as vogais pela vogal i:* "i ini cimii binini... mis qii sicini!"*/System.out.println(umaString.replaceAll("(?i)[aeiou]", "i"));}}Por fim, uma operação comum a se realizar em strings é remover espaços em branco noinício e no final. Muitas vezes usuários ao preencher formulários acabam deixando espaços embranco indesejados nestas posições. Para resolver este problema, a classe String oferece ométodo trim, cujo exemplo de uso é mostrado a seguir:public class ExemploTrim {public static void main(String[] args) {String umaString = " por gentileza, remova estes espaços em branco ";/** O metodo trim da classe String remove os caracteres em branco no* início e no fim da string.*/umaString = umaString.trim();// “por gentileza, remova estes espaços em branco”System.out.println(umaString);}}Exercícios:a) Escreva um programa que imprima os caracteres inicial, final e o situado exatamenteno meio da frase “Eu sou um aspirante a programador de sucesso!”.b) Escreva um programa que substitua todas as ocorrências da substring “alo” na string“A Salomé escalonou os robalos que nadavam pelos ralos” pela string “ito”.c) Escreva um programa que armazene cada metade da string “Um dia eu fui umastring completa...” em uma variável distinta.d) Escreva um programa que insira o caractere [ no início e o caractere ] no final dastring “Meu Deus, estou entre colchetes!”.e) Escreva um programa que armazene cada palavra da string “Um dia eu fui umastring completa...” em uma variável distinta, utilizando chamadas ao método substring.
  • 16. 10 - Lendo valores do usuárioTodos os programas dos exemplos vistos até então nesta apostila não são interativos.Ou seja, eles não promovem a interação entre o usuário e computador. A partir de agora,vamos aprender a ler números e strings do usuário a fim de alimentar os nossos programas.10.1 – Lendo dados do usuário via linha de comandoPodemos ler números e strings do usuário via linha de comando em Java por meio daclasse Scanner do pacote java.util. Para utilizar a classe Scanner em nossos programas,precisamos importar esta classe por meio da instrução import. O exemplo abaixo, lê umnúmero inteiro do usuário, utilizando o método nextInt da classe Scanner. Note que naprimeira linha de código nós realizamos a importação da classe Scanner:import java.util.Scanner;public class LeitorValorInteiroTeclado {public static void main(String[] args) {Scanner leitor = new Scanner(System.in);// O código abaixo lê um valor inteiro do tecladoSystem.out.println("Digite a sua idade:");int idade = leitor.nextInt();System.out.println("Você tem " + idade + " anos de idade.");}}Para realizar a leitura de números reais do usuário, utilizamos o método nextFloat daclasse Scanner. Lembre-se de utilizar vírgula ao invés de ponto quando for informar o númeroreal na leitura. A seguir, um exemplo de leitura de um número real com o método nextFloat:import java.util.Scanner;public class LeitorValorPontoFlutuanteTeclado {public static void main(String[] args) {Scanner leitor = new Scanner(System.in);// O código abaixo lê um valor inteiro e um valor float do tecladoSystem.out.println("Digite a sua idade:");int idade = leitor.nextInt();System.out.println("Digite o seu peso em kg:");float peso = leitor.nextFloat();System.out.println("Você tem " + idade + " anos e pesa " + peso + " kg.");}}Por fim, para realizar a leitura de strings do usuário via linha de comando, utilizamos ométodo nextLine da classe Scanner. O programa a seguir lê do usuário a sua comidapreferida:import java.util.Scanner;public class LeitorStringTeclado {public static void main(String[] args) {Scanner leitor = new Scanner(System.in);/** O código abaixo lê uma string do teclado.* Ao terminar de digitar a string, o usuário* deve teclar ENTER.*/System.out.println("Qual a sua comida favorita?");String resposta = leitor.nextLine();System.out.println("A sua comida favorita é " + resposta + ".");}}
  • 17. 10.2 – Lendo dados do usuário via janelas de DialogOpcionalmente, você pode realizar a leitura dos dados do usuário via janelas de Dialog,a fim de deixar o seu programa mais amigável ao usuário. Você pode também exibir oresultado do processamento do seu programa em uma janela de Dialog. Para realizar estatarefa, utilizaremos a classe JOptionPane do pacote javax.swing. O métodoshowInputDialog da classe JOptionPane exibe uma janela de Dialog com um campo detexto para a leitura. Por exemplo, considere o exemplo contido na classeLeitorValorInteiroTeclado da seção 10.1. Naquele exemplo, o programa lia a idade dousuário via linha de comando. Utilizando o método showInputDialog podemos criar umajanela de Dialog como a da figura abaixo:Após lermos a idade do usuário, exibiremos uma frase informando a sua idade por meiodo método showMessageDialog da classe JOptionPane, o qual criará uma janela de Dialogsimples de mensagem. A janela de saída ficará como a janela da figura abaixo:Abaixo, o programa correspondente:import javax.swing.JOptionPane;public class LeitorInteiroDialog {public static void main(String[] args) {/** Exibe uma janela para ler a resposta do usuário.* Após, exibe outra janela para exibir a resposta* digitada pelo usuário.*/String resposta = JOptionPane.showInputDialog("Qual a sua idade?");int idade = Integer.parseInt(resposta); // Converte a string em inteiroJOptionPane.showMessageDialog(null, "Você tem " + idade + " anos de idade.");}}O método showInputDialog sempre retorna strings. Assim, para converter a idadeinformada pelo usuário em um valor inteiro, utilizamos o método parseInt da classe Integer.Na última linha utilizamos o método showMessageInputDialog para exibir a janela com amensagem ao usuário. Em um outro momento, veremos como customizar estas janelas deentrada e saída de dados. O programa logo a seguir lê a idade e o peso do usuário,convertendo a string com a informação do peso em um valor do tipo float. O segundoprograma a seguir exibe a simples leitura de strings do usuário:
  • 18. import javax.swing.JOptionPane;public class LeitorFloatDialog {public static void main(String[] args) {String resposta = JOptionPane.showInputDialog("Qual a sua idade?");int idade = Integer.parseInt(resposta); // Converte a string em inteiroresposta = JOptionPane.showInputDialog("Qual o seu peso em kg?");float peso = Float.parseFloat(resposta); // Converte a string em floatJOptionPane.showMessageDialog(null, "Você tem " + idade + " anos de idade" +"e pesa " + peso + " kg.");}}import javax.swing.JOptionPane;public class LeitorStringDialog {public static void main(String[] args) {/** Exibe uma janela para ler a resposta do usuário.* Após, exibe outra janela para exibir a resposta* digitada pelo usuário.*/String resposta = JOptionPane.showInputDialog("Qual a sua comida favorita?");JOptionPane.showMessageDialog(null, "A sua comida favorita é " + resposta);}}Exercíciosa) Escreva um programa que leia do usuário o seu nome completo e informa a elequantos caracteres o seu nome possui (lembre-se de não contar espaços em branco).b) Escreva um programa que leia duas frases do usuário e exibe a na tela a segundafrase concatenada com a primeira frase.c) Escreva um programa que leia do usuário o valor do raio de uma circunferência eexiba na tela o valor da área desta circunferência.d) Escreva um programa que leia do usuário o tamanho dos lados de um retângulo eimprima na tela o valor da área deste retângulo.e) Escreva um programa que leia uma frase do usuário e imprima os caracteres inicial,final e o situado exatamente no meio da frase.11 - Controlando o fluxo do programaCada programa visto nos exemplos desta apostila até então possui um único fluxopossível de execução. Isto significa que todas as linhas de código do programa serãoexecutadas, a menos que ocorra algum tipo de erro durante a execução do programa. Porém,existem muitos problemas em que desejamos poder controlar o fluxo de execução do nossoprograma, ou seja, controlar quais linhas de código serão executadas de acordo com uma oumais condições. Neste caso, o programa terá mais de um fluxo de execução possível.Por exemplo, considere o programa que lê a idade do usuário. Digamos que desejamoscustomizar a mensagem ao usuário de acordo com a sua idade. Se o usuário tiver menos de 18anos, informamos que ele é menor de idade; caso contrário, informamos que ele já é maior deidade.Para resolver este problema, utilizaremos as instruções if e else da linguagem Java. Aseguir, o programa correspondente:
  • 19. import java.util.Scanner;public class ExemploIfElse {public static void main(String[] args) {Scanner leitor = new Scanner(System.in);System.out.println("Digite a sua idade:");int idade = leitor.nextInt();if (idade < 18) { // se idade maior que 18, então:System.out.println("Você é menor de idade.");} else { // senãoSystem.out.println("Você é maior de idade.");}}}A instrução if recebe como argumento um valor booleano. No nosso caso, passamoscomo argumento uma expressão lógica, que por sua vez resultará em um valor booleano. Seeste valor for igual a true, então o código delimitado pelas chaves da instrução if seráexecutado; caso contrário, o código delimitado pelas chaves da instrução else será executado.No exemplo acima, temos apenas duas situações que são mutuamente exclusivas.Porém, existem vários problemas os quais necessitam de múltiplas condições para realizar oroteamento de múltiplos fluxos de execução possíveis. O programa abaixo lê a idade do usuárioe informa em que faixa de idade o usuário se encontra:import java.util.Scanner;public class ExemploCondicoesMultiplas {public static void main(String[] args) {Scanner leitor = new Scanner(System.in);System.out.println("Digite a sua idade:");int idade = leitor.nextInt();if (idade <= 10) {System.out.println("Você tem menos de 11 anos.");} else if (idade <= 20) {System.out.println("Você tem entre 11 e 20 anos.");} else if (idade <= 30) {System.out.println("Você tem entre 21 e 30 anos.");} else if (idade <= 50) {System.out.println("Você tem entre 31 e 50 anos.");} else {System.out.println("Você tem mais de 50 anos.");}}}Agora, considere este problema. Após lermos a idade do usuário, devemos informar seele é menor ou maior de idade. Além disso, se a idade do usuário for ímpar, tambéminformaremos tal fato. O programa a seguir resolve este problema:
  • 20. import java.util.Scanner;public class ExemploIfsNaoExclusivos {public static void main(String[] args) {Scanner leitor = new Scanner(System.in);System.out.println("Digite a sua idade:");int idade = leitor.nextInt();if (idade < 18) { // se idade maior que 18, então:System.out.println("Você é menor de idade.");} else { // senãoSystem.out.println("Você é maior de idade.");}/** Utilizamos o operador MOD (%) para verificar se o número abaixo é* ímpar. O operador MOD retorna o resto da divisão inteira entre o* primeiro número e o segundo.*/if (idade % 2 == 1) {System.out.println("Você possui uma idade ímpar.");}}}Note que neste exemplo temos duas condições não exclusivas, pois a condição dosegundo if é executada de forma independente ao primeiro if. Como você já deve terobservado, o código controlado por toda instrução if e else é delimitado por chaves. Quando ocódigo de uma instrução if ou else possui apenas uma linha, o uso de chaves é opcional, comomostra o exemplo a seguir:import java.util.Scanner;public class ExemploIfSemChaves {public static void main(String[] args) {Scanner leitor = new Scanner(System.in);System.out.println("Qual a sua cor preferida?");String cor = leitor.nextLine();if (cor.equalsIgnoreCase("amarelo"))System.out.println("Legal! Amarelo é uma cor tranquila.");elseSystem.out.println("Hmmm... prefiro amarelo.");}}Agora, imagine que devemos escrever um programa que simule uma calculadorasimples, capaz de efetuar adições, subtrações, multiplicações e divisões. O nosso programafuncionará da seguinte forma. Ele solicitará ao usuário dois números reais. Após isto, eleexibirá ao usuário um menu de operações matemáticas a serem realizadas sobre os númerosque ele informou, conforme abaixo:Escolha a operação desejada:1 – Soma2 – Subtração3 – Multiplicação4 – DivisãoPor exemplo, se o usuário deseja multiplicar os dois números que ele informou, entãoele escolherá a opção 3, digitando assim este número no teclado para que o programa possaenfim realizar a multiplicação dos dois valores. Vamos resolver este problema utilizando asinstruções if e else:
  • 21. import java.util.Scanner;public class Calculadora {public static void main(String[] args) {Scanner leitor = new Scanner(System.in);System.out.println("Digite o primeiro valor:");double primeiroValor = leitor.nextFloat();System.out.println("Digite o segundo valor:");double segundoValor = leitor.nextFloat();System.out.println("Escolha a operação desejada:");System.out.println("1 - Soma");System.out.println("2 - Subtração");System.out.println("3 - Multiplicação");System.out.println("4 - Divisão");int opcao = leitor.nextInt();double resultado = 0;if (opcao == 1) {resultado = primeiroValor + segundoValor;} else if (opcao == 2) {resultado = primeiroValor - segundoValor;} else if (opcao == 3) {resultado = primeiroValor * segundoValor;} else if (opcao == 4) {// Evita a divisão por 0, pois isto causa um erro.if (segundoValor != 0) {resultado = primeiroValor / segundoValor;} else {System.out.println("Não é possível dividir por zero!");}} else {System.out.println("Opção inválida.");}if (opcao <= 4) {System.out.println("Resultado: " + resultado);}}}No programa acima, foi escrita uma instrução if para cada valor de escolha possível nomenu. Problemas de decisão deste tipo podem ser implementados utilizando a instruçãoswitch. Reescreveremos a classe Calculadora, utilizando uma instrução switch para realizaro controle da opção escolhida:
  • 22. import java.util.Scanner;public class Calculadora {public static void main(String[] args) {Scanner leitor = new Scanner(System.in);System.out.println("Digite o primeiro valor:");double primeiroValor = leitor.nextFloat();System.out.println("Digite o segundo valor:");double segundoValor = leitor.nextFloat();System.out.println("Escolha a operação desejada:");System.out.println("1 - Soma");System.out.println("2 - Subtração");System.out.println("3 - Multiplicação");System.out.println("4 - Divisão");int opcao = leitor.nextInt();double resultado = 0;switch (opcao) {case 1:resultado = primeiroValor + segundoValor;break;case 2:resultado = primeiroValor - segundoValor;break;case 3:resultado = primeiroValor * segundoValor;break;case 4:if (segundoValor != 0) {resultado = primeiroValor / segundoValor;} else {System.out.println("Não é possível dividir por zero!");}break;default:System.out.println("Opção inválida.");}if (opcao <= 4) {System.out.println("Resultado: " + resultado);}}}No exemplo acima, a instrução switch escolhe o fluxo correto de acordo com a opçãodigitada pelo usuário. Caso a opção digitada seja 1, 2 3 ou 4, o cálculo correto é realizado comos dois números reais informados pelo usuário. Note que ao final de cada instrução case existeuma instrução break. A instrução break interrompe a execução da instrução switch. Ou seja, oprograma irá executar o código seguinte ao final da instrução switch. A instrução break éopcional. No nosso caso, ela é necessária para garantir que, assim que o cálculo correto forrealizado, o programa sairá da instrução switch.Note também que no final da instrução switch foi colocada uma instrução default. Ocódigo de uma instrução default só é executado caso nenhum dos casos seja satisfeito. Nonosso exemplo, se o usuário digitar uma opção inválida, ou seja, diferente de 1, 2, 3 ou 4,então o código da instrução default é executado, informando que a opção digitada pelousuário é inválida. A instrução break não foi escrita no final da instrução default, pois como ainstrução default simboliza o último caso possível dentro da instrução switch, não existe anecessidade de se interromper a execução da instrução switch neste ponto. Apenas umainstrução default pode ser escrita dentro de uma instrução switch.Condições mutuamente exclusivas do tipo if-else que definem o valor de uma variávelpodem ser escritas utilizando uma operação ternária. Considere o exemplo a seguir:
  • 23. public class VerificaParidade {public static void main(String[] args) {// Sorteia um número entre [0..100]// O tipo long armazena números inteiros de alta precisãolong numeroAleatorio = System.currentTimeMillis() % 101;String resposta = numeroAleatorio + " é ";if (numeroAleatorio % 2 == 0) {resposta += "par";} else {resposta += "ímpar";}System.out.println(resposta);}}Neste exemplo, um valor inteiro é sorteado e então o programa deve informar se onúmero é par ou ímpar. As instrução if e else definem qual a resposta correta a serarmazenada na variável resposta, cujo valor será impresso na tela. Vamos reescrever esteprograma, utilizando uma operação ternária:public class VerificaParidade {public static void main(String[] args) {// Sorteia um número entre [0..100]// O tipo long armazena números inteiros de alta precisãolong numeroAleatorio = System.currentTimeMillis() % 101;String resposta = numeroAleatorio + " é ";resposta += numeroAleatorio % 2 == 0 ? "par" : "impar";System.out.println(resposta);}}Uma operação ternária é escrita da seguinte forma:v = c ? a : b;Na expressão acima, v representa a variável que irá receber o valor da expressão. Osímbolo c representa a condição lógica a ser testada na expressão. O símbolo a representa ovalor a ser atribuído a v caso a condição c seja satisfeita. Por fim, b representa o valor a seratribuído a v caso a condição c não seja satisfeita.Exercícios:a) Escreva um programa que leia um número inteiro do usuário e informe ao usuário seeste número é divisível por 7.b) Escreva um programa leia do usuário sua altura e peso, calcule o seu índice demassa corporal (IMC) e informe na tela o seu grau de obesidade. O IMC é dado pela fórmulaabaixo:IMC = peso / altura²Abaixo, os graus de obesidade referentes a cada faixa de IMC:IMC < 18.5: Abaixo do peso18.5 <= IMC <= 24.9: Peso normal24.9 < IMC <= 29.9: Sobrepeso29.9 < IMC <= 34.9: Obesidade de grau I34.9 < IMC <= 39.9: Obesidade de grauc) Escreva um programa que leia as notas de quatro provas do usuário, calcula a médiadas notas. Se a média for maior ou igual a 7, então informe ao usuário que ele foi aprovado. Sea média for maior que 5 e menor que 7, informe que ele está de recuperação. Por fim, se amédia for inferior a 5, informe que ele foi reprovado.
  • 24. 12 - Utilizando laços de repetiçãoImagine que devemos escrever um programa para imprimir na tela a sequência de 1até 4 em uma mesma linha. Este problema é extremamente simples e é resolvido peloprograma abaixo:public class ProblemaSimplesDemais {public static void main(String[] args) {System.out.println("1 2 3 4");}}Agora, considere que o nosso problema seja criar um programa que leia do usuário umvalor inteiro positivo n e imprima na tela a sequência de 1 até n em uma mesma linha. Vamostentar resolver este problema utilizando a mesma estratégia da solução anterior:public class SolucaoNaoMuitoInteligente {public static void main(String[] args) {System.out.println("Digite um numero inteiro positivo:");Scanner leitor = new Scanner(System.in);int n = leitor.nextInt();// Garantindo que o valor de n seja positivo...if (n < 0) {n = n * -1;} else if (n == 0) {n = 1;}// E lá vamos nós...if (n == 1) {System.out.println("1");} else if (n == 2) {System.out.println("1 2");} else if (n == 3) {System.out.println("1 2 3");} else if (n == 4) {System.out.println("1 2 3 4");} else if (n == 5) {System.out.println("1 2 3 4 5");} else if (n == 6) {System.out.println("1 2 3 4 5 6");}// .. continua... até quando?}}Obviamente, o programa acima não consegue resolver o problema de fato, uma vez queele só informa a resposta correta para valores de n entre [1..6]. O grande problema doprograma acima é que ele não é escalável aos valores de n, ou seja, ele não consegue resolvero problema para qualquer valor de n. A questão é: como saberemos quais os possíveis valoresde n que o usuário poderá digitar? Não há como saber! Ele pode digitar qualquer valor superiora 0. Assim, quantas condições lógicas necessitaríamos para resolver o problema de fato? Narealidade, infinitas condições!Desta forma, precisamos escrever um código que seja capaz de imprimir todos osnúmeros da sequência, porém utilizando um número fixo e mínimo de linhas de código. Paratanto, precisamos de alguma forma escrever um código que repita a impressão dos númerosde forma categórica e estratégica.Para realmente resolver este problema, precisamos utilizar um laço de repetição. Alinguagem Java oferece três laços de repetição distintos: o laço while, o laço do-while e o laçofor. O programa a seguir resolve o nosso problema utilizando um laço while:
  • 25. import java.util.Scanner;public class ExemploWhile {public static void main(String[] args) {System.out.println("Digite um numero inteiro positivo:");Scanner leitor = new Scanner(System.in);int n = leitor.nextInt();// Garantindo que o valor de n seja positivo...if (n < 0) {n = n * -1;} else if (n == 0) {n = 1;}int contador = 1;while (contador <= n) {System.out.print(contador + " ");contador++;}}}O laço while recebe como argumento uma condição lógica, chamada de condição demanutenção do laço. No nosso exemplo, enquanto o valor da variável contador for menorou igual ao valor da variável n, o laço while repetirá a execução do código localizado entre aschaves.Note que agora para qualquer valor de n a mensagem correta será impressa. A variávelcontador é inicializada com o valor 1, que é o primeiro valor que o nosso programa deveimprimir. A cada iteração, o valor da variável contador é impresso. Logo em seguida, o valorda variável é incrementado em uma unidade. Assim, na próxima iteração, o valor a serimpresso é uma unidade maior que o valor atual.O laço while só é executado se e somente se a sua condição lógica de manutenção forsatisfeita. Assim, para que um laço while execute ao menos uma iteração, a sua condiçãológica de manutenção deve ser satisfeita ao menos uma vez.Agora, resolveremos o problema mais uma vez, porém utilizando o laço do-while:import java.util.Scanner;public class ExemploDoWhile {public static void main(String[] args) {System.out.println("Digite um numero inteiro positivo:");Scanner leitor = new Scanner(System.in);int n = leitor.nextInt();// Garantindo que o valor de numero seja positivo...if (n < 0) {n = n * -1;} else if (n == 0) {n = 1;}int contador = 0;do {contador++;System.out.print(contador + " ");} while (contador < n);}}Neste exemplo, o laço do-while repete a execução do trecho de código localizado entreas chaves enquanto o valor da variável contador for menor que o valor da variável n. Avariável contador é inicializada com o valor 0. Este não é o valor correto do primeiro valor aser impresso, porém no início de cada iteração, o valor da variável contador é incrementadoem uma unidade. Logo em seguida, o valor correto é impresso na tela.O laço é executado até que o valor da variável contador seja menor que o valor davariável n. Isto parece um tanto anti-intuitivo no início mas, se você analisar o código acima,você verá que esta condição se deve ao fato de que o incremento do valor da variávelcontador é realizado antes de que este seja impresso na tela.
  • 26. O laço do-while sempre executa ao menos uma iteração. Assim, para que um laçodo-while execute após a primeira iteração, a sua condição lógica de manutenção deve sersatisfeita ao menos uma vez.Por fim, resolveremos novamente o problema, agora utilizando o laço for:import java.util.Scanner;public class ExemploFor {public static void main(String[] args) {System.out.println("Digite um numero inteiro positivo:");Scanner leitor = new Scanner(System.in);int n = leitor.nextInt();// Garantindo que o valor de numero seja positivo...if (n < 0) {n = n * -1;} else if (n == 0) {n = 1;}for(int contador = 1; contador <= n; contador++) {System.out.print(contador + " ");}}}No exemplo acima, o laço for pode ser lido da seguinte forma: para o valor de contadorpartindo de 1 até atingir o valor de n, incrementando o valor de contador em uma unidade acada iteração, repita o trecho de código entre as chaves. O primeiro argumento de um laço forcontém as inicializações desejadas para o laço. No caso, a variável contador é inicializada como valor 1. Esta inicialização é executada somente uma vez, antes mesmo da execução daprimeira iteração do laço.O segundo argumento de um laço for é a condição lógica de manutenção do laço.Ou seja, é o teste lógico realizado antes de cada iteração para avaliar se a iteração deve serexecutada ou se o laço deve parar de executar iterações. No caso, o laço executará enquanto ovalor da variável contador for menor ou igual ao valor da variável n.O terceiro e último argumento de um laço for contém o código a ser executado no finalde cada iteração. No caso, após o valor da variável contador ser exibido, ele é incrementadoem uma unidade.Desta forma, o código contido no primeiro argumento do laço for é executado apenasuma vez e antes do laço começar a sua execução. A condição de manutenção do laço contidano segundo argumento do laço for é executada sempre e antes da execução de cada iteração.Por fim, o código contido no terceiro e último argumento do laço for é executado sempre e nofinal da execução de cada iteração.O uso de qualquer um dos argumentos do laço for é opcional. O programa abaixo ilustraa omissão dos argumentos do laço for:public class ExemploOmissaoArgumentosFor {public static void main(String[] args) {int i = 0;// Omitimos o primeiro argumento, pois ele não é necessário neste casofor (; i < 10; i++) {System.out.println("Linha " + i);}// Omitimos o terceiro argumento, pois ele não é necessário neste casofor (i = 0; i < 10;) {System.out.println("Linha " + i);i++;}// A omissão do segundo argumento pode fazer com que o laço execute// infinitamente. Para terminar a execução do programa, digite CTRL + Cfor (i = 0;; i++) {System.out.println("Linha " + i);}}}
  • 27. Os três argumentos do laço for podem ser combinados para diversas finalidades. Oprograma abaixo exibe na tela uma sequência numérica regressiva:public class SequenciaRegressivaFor {public static void main(String[] args) {int numero = 10;for (int i = numero; i > 0; i--) {System.out.print(i + " ");}}}Abaixo, um exemplo mais complexo do uso do laço for:import java.util.Scanner;public class ExemploComplexoFor {public static void main(String[] args) {System.out.println("Digite um numero inteiro positivo:");Scanner leitor = new Scanner(System.in);int n = leitor.nextInt();// Garantindo que o valor de numero seja positivo...if (n < 0) {n = n * -1;} else if (n == 0) {n = 1;}for (int contador = n, contador2 = n, contador3 = n;contador >= 0 && contador2 >= 0 && contador3 >= 0;contador--, contador2 -= 2, contador3 -= 3) {System.out.print("[" + contador + ", ");System.out.print(contador2 + ", ");System.out.print(contador3 + "] ");}}}Exercícios:a) Escreva um programa que leia do usuário um valor inteiro positivo n e imprima natela a sequência:1 2 3 … n-1 nPor exemplo, se o valor de n for 5, então a seguinte sequência deverá ser impressa:1 2 3 4 5b) Escreva um programa que leia do usuário um valor inteiro positivo n e imprima natela a sequência:n n-1 n-2 … 3 2 1Por exemplo, se o valor de n for 5, então a seguinte sequência deverá ser impressa:5 4 3 2 1c) Escreva um programa que leia do usuário um valor inteiro positivo n e imprima natela a sequência:1, 2, 3, … n-1, n
  • 28. Por exemplo, se o valor de n for 5, então a seguinte sequência deverá ser impressa:1, 2, 3, 4, 5d) Escreva um programa que leia do usuário um valor inteiro positivo n e imprima natela a sequência:n-1, n-2, n-3, … 3, 2, 1Por exemplo, se o valor de n for 5, então a seguinte sequência deverá ser impressa:5, 4, 3, 2, 1e) Escreva um programa que leia do usuário um valor inteiro positivo n e imprima natela a sequência:[1|2|3|...|n-1|n]Por exemplo, se o valor de n for 5, então a seguinte sequência deverá ser impressa:[1|2|3|4|5]f) Escreva um programa que leia do usuário um valor inteiro positivo n e imprima natela a sequência:1, 2, 3, … n, n-1, n-2,..., 3, 2, 1Por exemplo, se o valor de n for 5, então a seguinte sequência deverá ser impressa:1, 2, 3, 4, 5, 4, 3, 2, 1g) Escreva um algoritmo que leia do usuário um valor n entre [1..100] e então imprimana tela a seguinte sequência:1,1, 21, 2, 3...1, 2, 3, …, n - 1, n1, 2, 3, …, n – 1…1, 2, 31, 21Por exemplo, caso o valor n seja 5, a seguinte sequência abaixo deve ser impressa:11, 21, 2, 31, 2, 3, 41, 2, 3, 4, 51, 2, 3, 41, 2, 31, 21Caso o valor de n seja 1, então a sequência abaixo deve ser impressa:1
  • 29. h) Escreva um programa leia do usuário valores inteiros entre [0..100] até que o usuáriodigite o valor -1 e calcule a média aritmética destes valores (P.S.: o valor -1 não deve serincluído no cálculo).i) Escreva um programa que leia do usuário 10 valores inteiros entre [0..100] e calcule oproduto destes valores.j) Escreva um programa que leia do usuário um valor n entre [1..100] e imprima na telaos primeiros n números da sequência de Fibonacci. Em uma sequência de Fibonacci, cada valoré a soma dos dois últimos valores da sequência anteriores a ele. Como exemplo, a linha abaixocontém os oito primeiros números da sequência de Fibonacci:0, 1, 1, 2, 3, 5, 8, 1313 – MatrizesTodas as variáveis que criamos em nossos exemplos até então possuem a capacidadede armazenamento de apenas um valor por vez. Por exemplo, considere o programa abaixo:public class ValorNumero {public static void main(String[] args) {int numero = 1;numero = 2;numero = 4;numero = -9;System.out.println(numero);}}Durante a sua execução, o programa atribui quatro valores distintos à variável numero,porém apenas o valor -9 é impresso, pois este foi o último valor associado à variável. Ou seja,não é possível armazenar mais de um valor simultaneamente na variável numero. O programaabaixo exibe uma possível solução a este problema:public class DiversosValores {public static void main(String[] args) {int numero1 = 1;int numero2 = 2;int numero3 = 4;int numero4 = -9;System.out.println(numero1);System.out.println(numero2);System.out.println(numero3);System.out.println(numero4);}}Neste exemplo, cada valor foi armazenado em uma variável distinta e o valor de cadavariável foi impresso separadamente no final do programa. Note que se tivéssemos quearmazenar mais valores, teríamos que criar mais variáveis, além de mais instruções para exibirtais valores na tela. Desta forma, esta solução deixa de ser prática à medida que o número devalores aumenta.Uma solução mais elegante ao problema anterior é utilizar uma matriz para assim poderarmazenar vários valores em uma única variável. Matrizes são estruturas de dados querepresentam uma coleção de elementos, onde cada elemento é representado por uma únicachave. O programa abaixo apresenta uma possível solução ao problema anterior, utilizandouma matriz para armazenar os valores:
  • 30. public class MatrizValores {public static void main(String[] args) {int[] numeros = new int[4];numeros[0] = 1;numeros[1] = 2;numeros[2] = 4;numeros[3] = -9;for (int i = 0; i < numeros.length; i++) {System.out.println(numeros[i]);}}}Vamos analisar este programa passo-a passo. Na primeira linha do algoritmo doprograma, foi criada uma matriz de inteiros de tamanho quatro, ou seja, capaz de armazenarquatro valores inteiros. Preste atenção na sintaxe de declaração e instanciação desta matriz.No código anterior ao símbolo de atribuição (=) foi declarada uma variável chamada numeros.Note que diferentemente à sintaxe de declaração de uma variável comum do tipo int, foramcolocados colchetes de abertura e encerramento ([]) após a palavra reservada int. Isto denotaque a variável sendo criada é uma matriz e será capaz de armazenar um conjunto de valoresinteiros. Nós dizemos que o código anterior ao símbolo de atribuição representa a declaraçãoda variável numeros.No código posterior ao símbolo de atribuição a variável numeros é instanciada, ou seja,é alocado o espaço de memória a ser ocupado pela variável. Neste exemplo, a variávelnumeros obtém espaço de memória suficiente para armazenar quatro valores do tipo int.Como cada valor do tipo int utiliza 4 bytes de memória de armazenamento, a matriz numerosocupará 16 bytes de memória, ou seja, 4 bytes * 4 espaços. Assim, dizemos que o códigoposterior ao símbolo de atribuição representa a instanciação da variável numeros. Este tipode instanciação é dito instanciação direta, pois o número de elementos da matriz é definidoexplicitamente. Uma outra forma de instanciação é a indireta, como mostra a linha abaixo:int[] numeros = { 1, 2, 4, -9 };Neste exemplo, em uma única linha a matriz numeros foi declarada, instanciada(indiretamente) e inicializada, ou seja, os seus valores já foram determinados. Este tipo deinstanciação é dito indireto pois o número de elementos da matriz é definido implicitamente.No exemplo, ao passarmos quatro valores à matriz numeros, fica-se definido que esta matrizterá capacidade de armazenamento de quatro valores inteiros.Voltando ao exemplo da classe MatrizValores, da segunda à quinta linha do algoritmoé realizada a inicialização da matriz numeros, ou seja, ela recebe os valores os quais devearmazenar. Cada valor é atribuído separadamente e endereçado por meio de um índiceespecífico. Os índices de uma matriz vão de 0 até o tamanho da matriz decrementado de umaunidade. Assim, a matriz numeros possui tamanho 4 e seus índices variam de 0 a 3, sendo 0 oíndice do primeiro elemento e 3 o índice do último elemento. No caso da matriz numeros, osvalores 1, 2, 4 e -9 são armazenados na posição 0, 1, 2 e 3 respectivamente. Abaixo, arepresentação gráfica da matriz numeros:Valores 1 2 4 -9Índices 0 1 2 3No final do programa, foi criado um laço for para auxiliar a exibição de cada valorarmazenado na matriz. Note que a variável inteira i auxilia no acesso aos índices da matriz.Para tanto, durante a execução do laço for o valor de i varia de 0 até numeros.length – 1.Toda matriz em Java possui o atributo constante length, o qual armazena de forma implícita otamanho da matriz. Por ser uma constante, o seu valor nunca deve ser alterado de formaimplícita, mas sim ser utilizado para se obter de forma segura o tamanho da matriz sendoutilizada.Se você prestou atenção ao exemplo da classe MatrizValores e aos últimosparágrafos, você deve ter percebido que para acessar uma posição específica de uma matrizdevemos utilizar o nome da variável da matriz seguido de um colchete de abertura ([), onúmero referente ao índice desejado e um colchete de fechamento. O programa abaixo
  • 31. exemplifica o acesso aos valores de uma matriz por meio de seus índices:public class ExemploAcessoPosicoes {public static void main(String[] args) {int[] matriz = { 23, 98, -173, 1, 99, 50 };int terceiroNumero = matriz[2]; // -173int ultimoNumero = matriz[matriz.length - 1]; // 50int primeiroNumero = matriz[0]; // 23}}Os exemplos anteriores exibiram matrizes de inteiros. É possível criar matrizes de todosos tipos que vimos até então nesta apostila. O programa abaixo ilustra algumas matrizes detipos variados:public class MatrizesVariadas {public static void main(String[] args) {double[] matrizDouble = { -3.4, 5.7, 90D, 187.123 };for (int i = 0; i < matrizDouble.length; i++) {System.out.println(matrizDouble[i]);}String[] diasSemana = { "Segunda", "Terça", "Quarta", "Quinta","Sexta", "Sábado", "Domingo" };for (int i = 0; i < diasSemana.length; i++) {System.out.println(diasSemana[i]);}char[] conceitosNotas = { A, B, C, D, E };for (int i = 0; i < conceitosNotas.length; i++) {System.out.println(conceitosNotas[i]);}boolean[] matrizBooleanos = { true, true, false, true, false, false };for (int i = 0; i < matrizBooleanos.length; i++) {System.out.println(matrizBooleanos[i]);}}}Um laço de repetição que não vimos na seção anterior é o laço for-each, o qual éutilizado para se percorrer matrizes e listas (não importa ainda o que é uma lista!). Este tipo delaço simplifica em muito a forma de se percorrer uma matriz, porém só pode ser utilizado paraa leitura da matriz, ou seja, não é possível alterar qualquer valor da matriz no código interno aum laço for-each. Abaixo, a classe MatrizValores reescrita de tal forma a utilizarinstanciação indireta e um laço for-each para exibir os valores da matriz numeros:public class MatrizValores {public static void main(String[] args) {int[] numeros = { 1, 2, 4, -9 };for (int elemento : numeros) {System.out.println(elemento);}}}Você deve ter reparado que a classe MatrizValores ficou mais “enxuta” nesta versão,graças à instanciação indireta da matriz numeros e do uso do laço for-each para exibir osvalores da matriz. Diferentemente do laço for convencional, o laço for-each (em português,“para cada”) possui apenas dois argumentos ao invés de três. Além disso, estes doisargumentos são obrigatórios e são separados por dois pontos (:) ao invés de ponto e vírgula (;).Para entender o funcionamento deste laço de repetição, devemos entenderprimeiramente o que é o segundo argumento do laço para depois entender o primeiroargumento. O segundo argumento de um laço for-each contém a matriz ou lista quedesejamos percorrer. No nosso exemplo, desejamos percorrer a matriz numeros. O primeiroargumento contém a variável que vai armazenar o valor da matriz a ser visitado em cadaiteração do laço de repetição. No nosso exemplo, a variável elemento guarda o valor atualsendo visitado na iteração. Antes do início da próxima iteração, o valor da variável elemento é
  • 32. atualizado com o valor do próximo elemento da matriz numeros.Dentro do contexto de matrizes, a classe String da linguagem Java oferece o métodosplit, o qual quebra a string original de acordo com a ocorrência de uma substring, retornandoassim uma matriz de strings. Para melhor ilustrar a utilidade do método split, veja o exemploabaixo:public class ExemploSplit {public static void main(String[] args) {String frase = "Isto é uma frase completa";// Quebra a string original em cada ocorrência de um espaço em brancoString[] palavrasDaFrase = frase.split(" ");for (String palavra : palavrasDaFrase) {System.out.println(palavra);}}}Todas as matrizes que vimos nos exemplos desta seção até então são ditas matrizesunidimensionais, ou seja, matrizes de uma dimensão. Estas matrizes são comumentechamadas de matrizes lineares ou vetores. Em uma matriz bidimensional, cada elementoda matriz é endereçado por dois índices simultaneamente, um representando a linha da matrizem que o elemento se situa e o outro representando a coluna da matriz em que o elemento sesitua. Por exemplo, considere a representação gráfica de uma matriz bidimensional abaixo:Linha/coluna 0 1 2 30 -9 0 6 241 7 500 1092 712 12 -128 67 100No exemplo, o valor 7 está situado na linha 1, coluna 0. Desta forma, 1 e 0 são os seusíndices de linha e coluna respectivamente. Da mesma forma, o valor 100 está situado na linha2, coluna 3, sendo assim 2 e 3 os seus índices de linha e coluna. O programa abaixo cria umamatriz bidimensional para armazenar estes valores e depois percorre a matriz resultanteutilizando dois laços for convencionais:public class ExemploMatrizBidimensional {public static void main(String[] args) {int[][] matrizBidimensional = { { -9, 0, 6, 24 }, { 7, 500, 1092, 71 },{ 12, -128, 67, 100 } };/*** Os laços abaixo imprimirão no console:* -9 0 6 24* 7 500 1092 71* 12 -128 67 100*/for (int i = 0; i < matrizBidimensional.length; i++) {for (int j = 0; j < matrizBidimensional[i].length; j++) {System.out.print(matrizBidimensional[i][j] + "t");}System.out.println("");}}}Na primeira linha do algoritmo foi declarada a matriz matrizBidimensional. Note queao invés de somente um par de abertura-fechamento de colchetes, foram utilizados dois pares.A regra é que, para cada dimensão a ser utilizada, um par de abertura-fechamento decolchetes seja utilizado na declaração da variável da matriz. Assim, no exemplo são utilizadosdois pares pois a nossa matriz é bidimensional.Outra diferença ocorre na instanciação da matriz. Você pode entender uma matrizbidimensional como um conjunto de matrizes unidimensionais. Imagine que em cada linha damatriz bidimensional, você tem uma matriz unidimensional. Assim, note que na instanciação
  • 33. da matriz do exemplo acima cada linha está separada por chaves. Desta forma, podemosentender que cada elemento da matriz bidimensional é uma matriz unidimensional (uma linhada matriz) e, em cada linha, temos um conjunto de valores.Como cada valor está armazenado em uma linha, que por sua vez está armazenada namatriz bidimensional, para acessar um valor na matriz necessitamos de dois índices: um parareferenciar a linha correta onde o valor se encontra e outro para referenciar sua posição nalinha. Assim, para percorrer a matriz bidimensional precisamos de dois laços de repetição, umpara percorrer as linhas da matriz e, para cada linha da matriz, outro laço para percorrer osseus valores.Analisando o código do último exemplo, o primeiro laço de repetição (o que percorre aslinhas matriz) não é diferente do laço que percorria as matrizes unidimensionais nos exemplosanteriores. No exemplo, o laço for utiliza um índice i que varia de 0 amatrizBidimensional.length – 1, ou seja, de 0 a 2, os índices das linhas da matriz. A grandediferença está no segundo laço for, o mais interno. Ele utiliza um índice j para percorrer cadavalor da linha i. Assim, j varia de 0 a matrizBidimensional[i].length – 1, isto é, de 0 até otamanho da linha decrementado em uma unidade. Por fim, note que cada valor da matriz éacessado utilizando os índices i e j, respectivamente linha e coluna.Se você prestou atenção a este último exemplo e ao último parágrafo, você pode estarse perguntando: por quê o valor de j vai até matrizBidimensional[i].length – 1 e não até 2,ou seja, uma constante fixa que se utilizada também resolveria o problema? Bem, existem doismotivos para tanto. Primeiramente, a forma na qual os dois laços for foram escritos é escalávelno sentido que não importam as dimensões da matriz, ela será percorrida corretamente. Porfim, não necessariamente os tamanhos das linhas da matriz devem ser iguais! No exemploabaixo, cada linha da matriz possui um tamanho diferente:public class MatrizTamanhosDistintos {public static void main(String[] args) {/*** Declara uma matriz bidimensional de dimensões variáveis.*/int[][] matrizBidimensional = { { 1, 2, 3, 4 }, { 5, 6 }, { 7, 8, 9 } };for (int i = 0; i < matrizBidimensional.length; i++) {for (int j = 0; j < matrizBidimensional[i].length; j++) {System.out.print(matrizBidimensional[i][j] + "t");}System.out.println("");}}}Nos dois últimos exemplos as matrizes bidimensionais foram instanciadasindiretamente. O exemplo abaixo exibe uma matriz sendo instanciada diretamente, tendo seusvalores preenchidos de forma automática por meio de dois laços for e, por fim, sendo exibida:public class MatrizBidimensionalInstDireta {public static void main(String[] args) {// Declara uma matriz bidimensional com dimensões explícitas de 4 x 3int[][] matrizBidimensional = new int[4][3];for (int i = 0; i < matrizBidimensional.length; i++) {for (int j = 0; j < matrizBidimensional[i].length; j++) {matrizBidimensional[i][j] = i + j;}}for (int i = 0; i < matrizBidimensional.length; i++) {for (int j = 0; j < matrizBidimensional[i].length; j++) {System.out.print(matrizBidimensional[i][j] + "t");}System.out.println("");}}}Também é possível percorrer uma matriz bidimensional utilizando laços for-each. Oexemplo abaixo mostra uma matriz de Strings sendo percorrida por dois laços for-each:
  • 34. public class MatrizBidimensionalForEach {public static void main(String[] args) {// Declara uma matriz de strings com dimensões implícitas de 3 x 3String[][] matrizStrings = {{ "linha 0 coluna 0", "linha 0 coluna 1", "linha 0 coluna 2" },{ "linha 1 coluna 0", "linha 1 coluna 1", "linha 1 coluna 2" },{ "linha 2 coluna 0", "linha 2 coluna 1", "linha 2 coluna 2" },};for (String[] linha : matrizStrings) {for (String valor : linha) {System.out.print(valor + "t");}System.out.println("");}}}A matriz matrizStrings é uma matriz bidimensional; assim ela pode ser interpretadacomo um conjunto de linhas. Desta forma, o primeiro laço for-each do exemplo acima percorreas linhas da matriz, armazenando cada linha na matriz unidimensional linha. O laço for-eachmais interno percorre cada valor de cada linha, armazenando cada valor na variável valor.É possível criar matrizes de várias dimensões, porém quanto maior o número dedimensões de uma matriz menor é o número de aplicações práticas para ela. Apenas a títulode curiosidade, analise a matriz tridimensional do exemplo abaixo e tente entender o código doexemplo:public class ExemploMatrizTridimensional {public static void main(String[] args) {// Que tal uma matriz tridimensional de dimensões 2 x 2 x 3? :Dint[][][] matriz = {{{ 1, 2, 3 },{ 4, 5, 6 }},{{ 7, 8, 9 },{ 10, 11, 12 }}};// Percorrendo a matriz tridimensionalfor (int[][] subMatriz : matriz) {for (int[] linha : subMatriz) {for (int elemento : linha) {System.out.print(elemento + "t");}System.out.println("");}System.out.println("");}}}Exercícios:a) Escreva um programa que crie uma matriz unidimensional de inteiros de tamanho 10,preencha cada posição da matriz com um valor aleatório entre [0..100] e exiba em uma linhaos elementos da matriz em ordem inversa.b) Escreva um programa que leia do usuário 10 valores inteiros, armazene tais valoresem uma matriz unidimensional e exiba na tela apenas os valores que sejam divisíveis por 3.c) Escreva um programa que leia as notas de 15 alunos, exiba as notas lidas e informequal foi a nota média, a maior nota e a menor nota.d) Escreva um programa que leia do usuário dez números reais, armazene tais valores
  • 35. em uma matriz unidimensional, calcule e mostre a quantidade de números negativos e a somados números positivos da matriz.e) Escreva um programa que sorteie 20 números inteiros, exiba os na tela em umaúnica linha (separados por vírgula) e depois leia do usuário um número inteiro x e verifique sex foi sorteado.f) Escreva um programa que leia dois números inteiros a e b, crie uma matriz dedimensões a x b, preencha aleatoriamente esta matriz com valores 0 ou 1 e exiba a matriz natela de maneira bem formatada, ou seja, respeitando as posições dos elementos quanto a linhae coluna.g) Escreva um programa que leia uma matriz bidimensional de dimensões 4 x 4 eimprima a diagonal principal da matriz.h) Escreva um programa que leia dois números inteiros a e b, crie uma matriz dedimensões a x b, preencha a matriz com valores informados pelo usuário e depois imprima amatriz transposta da matriz original. A matriz transposta de uma matriz é a matriz resultanteda troca de linhas por colunas da matriz original. Abaixo, alguns exemplos de matrizestranspostas:i) Escreva um programa que leia dois números inteiros a e b, crie uma matriz dedimensões a x b, preencha a matriz com valores informados pelo usuário e verifique se amatriz é simétrica. Uma matriz é dita simétrica se ela é igual à sua matriz transposta.

×