apostila 0apostila 04 444 lÓgica de programaÇÃo ... · o cobol, por exemplo, permite nomes...

29
EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 1 U.E PROF EDGAR TITO - NOITE PROF. RANILDO LOPES DISCIPLINA: Lógica de Programação APOSTILA 0 APOSTILA 0 APOSTILA 0 APOSTILA 04 LÓGICA DE PROGRAMAÇÃO LÓGICA DE PROGRAMAÇÃO LÓGICA DE PROGRAMAÇÃO LÓGICA DE PROGRAMAÇÃO EXERCÍ EXERCÍ EXERCÍ EXERCÍCIOS CIOS CIOS CIOS P P P PRÁ RÁTICOS TICOS TICOS TICOS Visite nosso sítio Visite nosso sítio Visite nosso sítio Visite nosso sítio http://ueedgartito.wordpress.com http://ueedgartito.wordpress.com http://ueedgartito.wordpress.com http://ueedgartito.wordpress.com Nele estão os resumos e trabalho de sala de aula” Obrigado pela preferência de nossa ESCOLA!

Upload: trinhthuan

Post on 08-Nov-2018

221 views

Category:

Documents


3 download

TRANSCRIPT

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 1

U.E PROF EDGAR TITO - NOITE PROF. RANILDO LOPES DISCIPLINA: Lógica de Programação

APOSTILA 0APOSTILA 0APOSTILA 0APOSTILA 04444 LÓGICA DE PROGRAMAÇÃOLÓGICA DE PROGRAMAÇÃOLÓGICA DE PROGRAMAÇÃOLÓGICA DE PROGRAMAÇÃO

EXERCÍEXERCÍEXERCÍEXERCÍCIOSCIOSCIOSCIOS P P P PRÁRÁRÁRÁTICOSTICOSTICOSTICOS

Visite nosso sítioVisite nosso sítioVisite nosso sítioVisite nosso sítio

http://ueedgartito.wordpress.comhttp://ueedgartito.wordpress.comhttp://ueedgartito.wordpress.comhttp://ueedgartito.wordpress.com “ Nele estão os resumos e trabalho de sala de aula”

Obrigado pela preferência de nossa ESCOLA!

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 2

Variáveis x Dados Damos o nome de variável ao local de memória onde serão armazenados os dados. Em nossos algoritmos não nos preocuparemos

com o endereço real dessas variáveis, pois a maioria das linguagens de Programação tornam estes endereços transparentes ao Programador. Para exemplificarmos a diferença entre dados (constantes) e variáveis, bem como entender melhor o endereçamento de variáveis,

podemos citar o exemplo de uma estante de prateleiras, onde estão guardados livros ou quaisquer outros objetos (veja figura). Os livros e objetos podem ser chamados de dados, conteúdo das variáveis. Para nos referenciarmos à variável é necessário darmos um

nome à mesma, pois não trabalharemos com endereço de memória propriamente dito, e sim com apelidos (identificadores). É aconselhável que o nome da variável seja expressivo, isto é, um nome que expresse o que vai ser armazenado dentro dela. As variáveis podem ainda ser simples ou compostas. As variáveis simples são aquelas que recebem um único dado por vez, enquanto

que as compostas podem armazenar vários dados de uma só vez (veremos mais adiante). Para exemplificarmos melhor, imagine que em um Algoritmo você precise armazenar certa idade em algum lugar, para posteriormente

decidir se esta idade permite que alguém possa requerer a sua carteira de motorista. Para tanto, tudo o que temos a fazer é declarar, em nosso Algoritmo, esta variável (veremos mais adiante). Quando declaramos uma variável, temos que associar a ela algumas características:

• NOME ou IDENTIFICADOR • TIPO Como dissemos anteriormente, o endereço físico da variável não precisa ser declarado, a menos que estejamos programando em

alguma linguagem de baixo nível, como o ASSEMBLER. As linguagens de alto nível procuram espaços livres na memória do computador para associarem bytes à variável declarada. Algumas linguagens não exigem sequer a declaração do TAMANHO da variável (BASIC, CLIPPER entre outras).

Uso das Variáveis no Algoritmo O nome a ser associado à variável (ex.: X, Y, KTI34), não é importante para o computador, pois este servirá apenas como uma mera

referência. Entretanto para outros Programadores que possam vir a analisar os seus Algoritmos, ou até para você mesmo após algum tempo, é necessário que esses nomes sejam expressivos, simples e objetivos.

Vejamos agora alguns exemplos de identificadores: SALARIO Um bom nome para variável que irá armazenar um valor salarial; CONT Um bom nome para variável que irá registrar uma contagem; TOTAL Um bom nome para variáveis acumuladoras de somas; DATANASC Um bom nome para variáveis usadas para armazenar uma data de nascimento. Devemos evitar nomes do tipo: X, K, C1, ABC, etc... a menos que eles expressem algo real. Nomes de variável, na maioria das linguagens, não devem: Iniciar por números: 1C2, 9ANOS, 100, 4CANTOS, etc... Ser descontínuos: DATA NASC, FONE COMERC, etc... Outros requisitos podem aparecer dependendo de cada linguagem. O COBOL, por exemplo, permite nomes longos para variáveis, já o

CLIPPER, com apenas 10 bytes. O COBOL permite separadores como hífens, barras, entre outros. Linguagens derivadas do DBASE permitem apenas o UnderLine _ como caractere separador.

A maioria das linguagens apresenta certas restrições à livre escolha dos nomes das variáveis. A mais evidente é a impossibilidade da utilização de palavras reservadas da própria linguagem. Por exemplo, a palavra MOVE representa um comando para o COBOL. Não é possível utilizarmos este nome como identificador de qualquer variável nesta linguagem. Já para o CLIPPER, o MOVE pode ser um bom identificador.

Outras vezes, a linguagem traz consigo algumas variáveis reservadas. Trata-se de algumas variáveis que são automaticamente declaradas pela linguagem. Normalmente elas registram a data e a hora do sistema operacional, ou algumas informações internas como códigos de periféricos, endereços de memória para buffers, etc.

Escolha do Identificador da Variável O segundo argumento presente na declaração de uma variável é o seu tipo. O tipo de uma variável define que tipos de dados poderão

ser armazenados nela. A identificação ou nomeação de variáveis segue algumas regras: - Nomes de variáveis não podem ser iguais a palavras reservadas; - Nomes de variáveis devem possuir como primeiro caractere uma letra ou sublinhado '_' (os outros caracteres

podem ser letras, números e sublinhado); - Nomes de variáveis devem ter no máximo 127 caracteres; - Nomes de variáveis não podem conter espaços em branco; - Na sintaxe do Português Estruturado, não há diferença entre letras maiúsculas de minúsculas (NOME é o mesmo

que noMe). Exemplo Identificadores válidos: NOME, TELEFONE, IDADE_FILHO, IdadeFilho, NOTA1, Est_Civil Identificadores inválidos: 3Endereco, Estado Civil, PARA, algoritmo, numero/complemento

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 3

Variáveis Numéricas São variáveis que aceitam apenas dados numéricos, sejam eles inteiros ou reais (sem ou com casas decimais respectivamente), o que

será definido junto com a sua declaração no início do algoritmo. Ex.: 1200; 10,9; -12,5; 0; etc Variáveis alfanuméricas ou Caractere São variáveis que aceitam conteúdos de qualquer natureza, portanto: números, letras e símbolos em geral, não podendo estes números

serem utilizados para operações aritméticas. Os conteúdos de variáveis do tipo caractere são delimitados por aspas. Ex.: "MARIA JOSE"; "CASA AMARELA"; "123"; "NOMES" Variáveis Lógicas Este tipo de variável não permite o registro de números nem de palavras. Uma variável lógica só armazena um entre dois valores:

VERDADEIRO ou FALSO. Não importa como, exatamente, o computador registra esta informação na memória. Pode ser por bytes zerados e não zerados, pelas

letras V ou F, ou por um outro mecanismo qualquer. O que nos interessa de fato é que este tipo de variável não registra outro tipo de informação exceto V ou F.

Em Português Estruturado, só existem três tipos de dados, conforme a tabela abaixo

Outros tipos de variáveis também são tratados por novas linguagens, tais como: HORA, MEMORANDO, OBJETO. Entretanto aqui só

trataremos os tipos mencionados anteriormente, ou seja: NUMÉRICO, CARACTERE e LÓGICO. Operador de Atribuição Para “colocar” um valor em uma variável dentro de um algoritmo, utilizamos o operador de atribuição. O operador de atribuição é

representado por uma seta (<-) apontando para a esquerda. Exemplo Peso <- 78.7 // Este comando atribui à variável Peso o valor 78.7. Nome <- "João da Silva" // Este comando atribui à variável Nome o valor "João da Silva". Achei <- FALSO // Este comando atribui à variável Achei o valor FALSO. É importante lembrar que só se pode atribuir às variáveis valores do mesmo tipo da variável. Assim, o seguinte comando seria inválido: Exemplo VAR salario: REAL INICIO salario <- "Insuficiente" Deve estar claro, também, que sempre à esquerda do comando de atribuição deve haver um (e somente um) identificador de variável.

Assim, são incorretos os seguintes comandos: Exemplo “são incorretos” 2060 <- NumeroConta NumeroAgencia+digitoControle <- 2345 + 0 NomeCliente+sobrenome <- “João” + “Silva” Linhas de Comentário

Os comentários são declarações não compiladas que podem conter qualquer informação textual que você queira adicionar ao código-

fonte para referência e documentação de seu Algoritmo. Uma Linha São representados por duas barras normais ( // ). Todo o texto que você digitar após as duas barras será comentário. Exemplo // Este método calcula o fatorial de n...x <- y; // Inicializa a variável x com o valor de y

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 4

Declaração de Variáveis Variáveis são palavras que tem um significado bem específico em um algoritmo. Para que o computador possa executar comandos que

envolvem variáveis da maneira correta, ele deve conhecer os detalhes das variáveis que pretendemos usar. Esses detalhes são: o identificador desta variável e o tipo de valores que essa variável irá conter. Precisamos assim, de uma maneira de especificar esses detalhes e comunicá-los ao computador. Para isso devemos declarar nossas variáveis logo abaixo da expressão “VAR” que tem a seguinte forma:

Exemplos: var x: real

y: inteiro a: caractere l: logico

Operadores Como dissemos anteriormente, podemos atribuir a uma variável o resultado de uma expressão numérica. Entendemos por expressão

numérica um conjunto de operações aritméticas combinadas entre operandos e operadores. Mas além das expressões numéricas, podemos escrever expressões dos tipos caractere e lógica.

Operadores Numéricos São elementos (símbolos) utilizados para representar uma operação de cunho aritmético.

+,- Operadores unários, isto é, são aplicados a um único operando. São os operadores aritméticos de maior precedência. Exemplos: -3, +x. Enquanto o operador unário - inverte o sinal do seu operando, o operador + não altera o valor em nada o seu valor.

\ Operador de divisão inteira. Por exemplo, 5 \ 2 = 2. Tem a mesma precedência do operador de divisão tradicional.

+,-,*,/ Operadores aritméticos tradicionais de adição, subtração, multiplicação e divisão. Por convenção, *

e / têm precedência sobre + e -. Para modificar a ordem de avaliação das operações, é necessário usar parênteses como em qualquer expressão aritmética.

MOD ou % Operador de módulo (isto é, resto da divisão inteira). Por exemplo, 8 MOD 3 = 2. Tem a mesma

precedência do operador de divisão tradicional.

^ Operador de potenciação. Por exemplo, 5 ^ 2 = 25. Tem a maior precedência entre os operadores aritméticos binários (aqueles que têm dois operandos).

Relembrando um pouco a matemática elementar, a ordem de execução de uma expressão aritmética segundo as prioridades de

operações é: Parêntesis: ( ) Multiplicação e Divisão: * / Soma e Subtração: + - Obs.: Caso existam numa mesma sentença operadores de mesma ordem de prioridade, a execução será feita da esquerda para direita. A <- 2 * 6 / 3 12 4 Concatenação de variáveis.

+ Operador de concatenação de strings (isto é, cadeias de caracteres), quando usado com dois

valores (variáveis ou constantes) do tipo "caractere". Por exemplo: "Rio " + " de Janeiro" = "Rio de Janeiro".

Para concatenarmos uma variável, precisamos ter certeza que elas são do tipo caracter, pois se elas forem numéricas, irão provocar

uma operação de adição e não de concatenação. Ex.: B <- 1 + 1 (retornará o valor 2) C <- “1” + “1“ (retornará o valor “11”) Logo, B <> C Operadores Relacionais Os operadores relacionais realizam a comparação entre dois operandos ou duas expressões e resultam em valores lógicos

(VERDADEIRO ou FALSO).

=, <, >,

<=, >=, <> Respectivamente: igual, menor que, maior que, menor ou igual a, maior ou igual a, diferente de. São

utilizados em expressões lógicas para se testar a relação entre dois valores do mesmo tipo. Exemplos: 3 = 3 ( 3 é igual a 3?) resulta em VERDADEIRO ; "A" > "B" ("A" está depois de "B" na ordem alfabética?) resulta em FALSO.

> maior que >= maior ou igual a < menor que <= menor ou igual a <> diferente de = igual a Exemplos: Dados A = 3, B = 2, C = ‘José’ e D = ‘José’ A > B Retorna VERDADEIRO C = D Retorna VERDADEIRO NOME = "JOSE" Retorna VERDADEIRO se NOME for exatamente igual a "JOSE" 2+5>4 Retorna VERDADEIRO

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 5

3<>3 Retorna FALSO Importante: No VisuAlg, as comparações entre strings não diferenciam as letras maiúsculas das minúsculas. Assim, "ABC" é igual a

"abc". Valores lógicos obedecem à seguinte ordem: FALSO < VERDADEIRO. Os operadores relacionais incidem sobre dados e variáveis numéricas e caracteres. Assim sendo, podemos comparar não apenas

números, mas também palavras. Neste sentido, a comparação respeitará a ordem alfabética das iniciais de cada uma. Exemplos: "MARIA">"ANA" Retorna VERDADEIRO "MARIA"<"MARIO" Retorna VERDADEIRO Não há porque comparar variáveis lógicas, a não ser através de igualdade, pois qual é a necessidade de sabermos se VERDADEIRO é

maior que FALSO? Operadores Lógicos Estes elementos são necessários quando você deseja realizar comparações entre resultados lógicos obtendo como resposta outro valor

lógico. Estranho, não? Mas é exatamente isso que ocorre. Por exemplo: se você ler um anuncio sobre emprego que tenham as seguintes solicitações:

Precisa-se de pessoas do sexo feminino e com idade máxima 40 anos. O que você consegue extrair deste anuncio? A resposta seria, duas exigências, a saber, o SEXO da pessoa deve ser igual a feminino (“F”) e a IDADE deve ser menor ou igual a 40 anos. Logo, estamos diante de duas sentenças, que, dependendo do que seja colocado como dados na comparação, poderemos ter a possibilidade do resultado ser falso ou verdadeiro. Se o SEXO for igual a “M” (masculino), a primeira sentença será falsa. Para você poder ocupar a vaga de erecida, necessário que sejas do sexo feminino e sua idade esteja na faixa etária solicitada. Para o Algoritmo, o raciocínio é exatamente igual. Você terá expressões lógicas e só será tomada alguma decisão se for obtido como resposta final o valor VERDADEIRO (VERDADEIRO).

Para que gerenciarmos esta etapa da lógica, utilizaremos os operadores a seguir:

nao Quando queremos inverter o resultado de uma condição ou expressão lógica (negar) Operador unário de negação. nao VERDADEIRO = FALSO, e nao FALSO = VERDADEIRO.

Tem a maior precedência entre os operadores lógicos.

ou A sentença que contiver este operador será verdadeira se pelo menos uma das expressões

nela contida retornar valor verdadeiro. Operador que resulta VERDADEIRO quando um dos seus operandos lógicos for verdadeiro.

e

A sentença que contiver este operador será verdadeira se as expressões nela contida resultarem valores verdadeiros.

Operador que resulta VERDADEIRO somente se seus dois operandos lógicos forem verdadeiros.

xou Operador que resulta VERDADEIRO se seus dois operandos lógicos forem diferentes, e FALSO se forem iguais.

Observação: caso sejam colocados os parênteses na sentença, a prioridade de execução será alterada iniciando-se pelos elementos

contidos dentro destes. Caso exista mais de uma sentença nesta condição, observar-se-á, além do exposto acima, a execução dos comandos da esquerda para a direita da expressão.

Vejamos a “TABELA VERDADE” a seguir para entendermos melhor. E OU

VERDADEIRO

VERDADEIRO

VERDADEIRO

VERDADEIRO

VERDADEIRO

VERDADEIRO

FALSO

VERDADEIRO

FALSO

FALSO

VERDADEIRO

VERDADEIRO

VERDADEIRO

FALSO

FALSO

VERDADEIRO

FALSO

VERDADEIRO

FALSO

FALSO

FALSO

FALSO

FALSO

FALSO

Exemplos: X = 90 E Z = 100 A >= 67 OU A <= 200 NOME <> "ANA" E NAO NOME = "MARIA" NOME <> "ANA" E (NAO NOME="MARIA" OU NOME="PEDRO")

Entendendo Representações de Sintaxes Agora que você já aprendeu o primeiro comando de nossa linguagem algorítmica, é importante aprender a forma sintética de se

representar um comando. Note que, ao enunciarmos o comando VAR, nós utilizamos algumas nomenclaturas e simbologias que você, certamente, encontrará em qualquer livro sobre quaisquer linguagens.

Assim, vamos elucidar algumas delas: Repetindo o comando,

VAR <Nome da variável>: <tipo>

< > Delimita o espaço reservado para inserirmos um parâmetro do comando. A maioria dos comandos de todas as linguagens apresentam parâmetros. Os parâmetros direcionam o objetivo de um comando específico.

Linearização de Expressões Para a construção de algoritmos que realizam cálculos matemáticos, todas as expressões aritméticas devem ser linearizadas, ou seja,

colocadas em linhas, devendo também ser feito o mapeamento dos operadores da aritmética tradicional para os do Português Estruturado.

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 6

Atribuição de Valores a Variáveis Até agora, vimos conceitos e exemplos de variáveis. Agora vamos aprender a utilizá-las em algoritmos. Representaremos o comando de atribuição pela combinação de dois símbolos do teclado, que são <- . Este símbolo representará a

atribuição de um dado a uma variável.

<variável> <- <dado a ser armazenado>

Exemplos: NOME <- "JOÃO" Dados CARACTERE têm que vir entre aspas

IDADE <- 25 Dados NUMERICO não precisam de aspas

ALTURA <- 1,67 Vírgula decimal (linguagens comerciais adotam o ponto)

DEPENDE <- FALSO Dados LOGICO devem vir entre pontos Também podemos atribuir, a uma variável, o valor de outra: Exemplo: ALTURA <- IDADE a variável ALTURA recebe o valor de IDADE Também podemos atribuir o resultado de uma expressão numérica, ou de outro tipo, a uma variável: SOMA <- QUOEF * (VALOR + 10) / DIVISOR

Estruturação do Algoritmo Existem alguns formatos para organizar um algoritmo, porém adotaremos o mais global, facilitando assim o aprendizado. O formato

básico do pseudocódigo na ferramenta VisualG é o seguinte: algoritmo "semnome"

// Função : // Autor : // Data : // Seção de Declarações

Var {Local para declaração das variáveis} inicio

// Seção de Comandos fimalgoritmo

Entrada e Saída de Dados Até aqui nós vimos como atribuir um valor a uma variável dentro de um Algoritmo. Mas este valor foi atribuído pelo próprio Algoritmo,

não é? Mas como fazer com que um Algoritmo, em um dado momento, receba um valor digitado pelo usuário? Como receber este dado através do teclado? Como exibir o resultado de uma operação qualquer no monitor de vídeo? É para isto que existem, em todas as linguagens de programação, os comandos de entrada e saída de dados. No caso do algoritmo,

estes comandos são os seguintes: leia (entrada), Escreva (saída - tela). Comando LEIA

<variável1...n> - Lista de variáveis a receberem os dados digitados pelo usuário. leia (NomeCliente+Sobrenome) Algoritmo "semnome" Var wnome : CARACTERE Widade: INTEIRO inicio LEIA (wnome, widade) //sequencia de comandos Fimalgoritmo

A execução do comando LEIA provoca uma pausa na execução do Algoritmo, aonde o computador fica em estado de espera,

aguardando a digitação de algo que deva ser atribuído às variáveis especificadas na sintaxe do comando. No exemplo acima, veja que o computador aguarda que o usuário digite dois valores distintos através do teclado. Estes dois valores

irão ocupar, respectivamente, as variáveis NOME e IDADE. Comando ESCREVA (lista informações no vídeo)

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 7

OBS.: Pelo menos um dos parâmetros deve ser informado quando da utilização deste comando. Exemplo Escreva ("Digite seu nome: ") Leia (nome) Escreva ("Digite sua agencia: ") Leia (NumeroAgencia) Escreva ("Digite sua conta: ") Leia (NumeroConta) Deve estar claro que sempre à direita do comando leia haverá um identificador de variável. Assim, são incorretos os seguintes

comandos: Exemplo “são incorretos” leia (NumeroConta+60) leia (12345) Exemplo: Algoritmo "semnome" Var wnome: CARACTERE inicio ESCREVA (" NOME ..:") LEIA (wnome) ESCREVA ("Seu nome é "+ wnome) Fimalgoritmo

Quando estudamos lógica algorítmica não nos preocupamos em que coordenada ou posição a informação será exibida, mas sim com o fato de que deve ser dado o comando de saída dos dados.

No exemplo acima, teremos o conteúdo da variável NOME exibido no vídeo logo após a mensagem “Seu nome é ”, como mostra a ilustração abaixo.

NOME ..: Karla Silva Seu nome é Karla Silva

Construindo os Primeiros Algoritmos: Estruturas seqüenciais De forma genérica, a construção de um algoritmo se resume às seguintes etapas: a) entendimento do problema; b) elaboração da solução algorítmica; e c) codificação da solução no Português Estruturado; Geralmente a etapa 2 é a mais complexa, pois depende da engenhosidade e experiência do “construtor”. Enunciado: Faça um Algoritmo que leia dois valores numéricos, e calcule e exiba a sua média aritmética. Etapa 1 Simples, hein? Dos tempos de escola lembramos que a média aritmética de dois valores é calculada como (a+b)/2, e sendo assim a

primeira etapa já está pronta. Etapa 2 Os dados necessários serão os dois valores, que colocaremos em duas variáveis A e B, do tipo numérico, e uma terceira variável, que

chamaremos Média, que armazenará a média aritmética calculada. Etapa 3 A obtenção dos dados neste Algoritmo é simples e direta. Basta pedir ao usuário que digite os valores. Etapa 4 O processamento aqui é o cálculo da média, usando o método citado acima, na etapa 1. O resultado do cálculo será armazenado na

variável Média. Etapa 5 Basta exibir o conteúdo da variável Média. Solução: 1. Algoritmo "Cálculo de Média Aritmética" 2. VAR 3. A,B,Media : REAL 4. Inicio 5. Escreva ("Algoritmo que calcula a média aritmética de dois valores.") 6. Escreva ("Digite um valor : ") 7. Leia (A) 8. Escreva ("Digite outro valor : ") 9. Leia (B) 10. Media <- (A+B)/2 11. Escreva ("A média dos dois valores é : ", Media) 12. FimAlgoritmo Exercícios 1. Algoritmo que lê o nome de um aluno, as notas de suas três provas e calcule e exibe a média harmônica das provas. A

média harmônica de três provas a, b e c é dada pela fórmula

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 8

Os dados necessários serão o nome do aluno e os valores das provas. O algoritmo limita-se basicamente à própria

fórmula. 1. Algoritmo "MediaHarmonica" 2. VAR 3. a, b, c, MH: REAL 4. NOME: CARACTER 5. inicio 1. escreva ("Entre com o nome do aluno: ") 2. leia (nome) 3. escreval ("Entre com as notas das três provas") 4. escreva ("Digite a primeira nota: ") 5. leia (a) 6. escreva ("Digite a segunda nota: ") 7. leia (b) 8. escreva ("Digite a terceira nota: ") 9. leia (c) 10. MH <- 3/(1/a + 1/b +1/c) 11. escreval ("A média harmônica do aluno: ", NOME, " é ", MH) 12. FimAlgoritmo Exemplo Enunciado: Um algoritmo que lê o valor do raio e calcule a área do círculo correspondente. Etapa 1: o cálculo da área do círculo é Pi*R2. Etapa 2: o dado necessário é o valor do raio, que será lido (colocado) na variável Raio. 1. algoritmo "Calcula Área Circulo" 2. var 3. Area, Raio: REAL 4. inicio 5. Escreval ("Entre com o raio: ") 6. Leia (Raio) 7. Area <- Pi*Raio^2 8. Escreva ("A área do circulo com o raio ", Raio, " é ", Area) 9. fimalgoritmo Você não precisa declarar o pi, pois já é uma função definida pelo Algoritmo Visualg. Exercícios

Conceitos Fundamentais Contador x Acumulador Estes nomes são dados a expressões que realizam adição de dados, porém, no primeiro caso, CONTADOR, é a expressão de adição

que contabiliza valores fixos e predeterminados. No segundo caso, ACUMULADOR, é a expressão de adição que contabiliza valores variáveis. Exemplo de Contador: QtdFem <- QtdFem + 1 (note que o valor adicionado a quantidade de femininos será sempre 1) Exemplo de Acumulador: SomaIdade <- SomaIdade + Idade (note que o valor adicionado a soma das idades será variável) Percentuais Encontramos algumas dificuldades quando tratamos estes temas. Aqui daremos algumas regras básica para que você se sinta a

vontade no momento do cálculo. Encontrando um valor percentual: Veja esta continha simples 50 bolas 100 % (50 = Todo) 25 bolas x % (25 = Parte do Todo) Chegaremos a conclusão: X % = 25 x 100 / 50 Estas informações nos leva imaginar a fórmula a seguir: <perc> <- < Parte do Todo> * 100 / < Todo> Encontrando um valor final após aplicação do percentual: <Novo valor> <- <valor anterior> * 1,<valor do percentual> Ex.: adicionar 5 % sobre o salário e informar o valor do novo salário. Nsal <- Salario * 1,05 Encontrando um valor adicionado percentualmente a uma variável:

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 9

<Novo valor> <- <valor anterior> * 0,<valor do percentual> Ex.: adicionar 5 % sobre o salário e informar o valor acrescido ao salário. Reajuste <- Salario * 0,05

Estruturas Condicionais Estrutura Condicional SE (Símples) Se <condição> então <sequência de comandos> Fimse

<condição> - Expressão lógica qualquer. <sequência de comandos> São comandos quaisquer que serão executados caso o resultado da expressão lógica seja verdadeira.

Esses comandos devem ser escritos entre as delimitações da gerência do comando. Em tempo de execução, se a expressão lógica retornar verdadeiro então a seqüência de comandos será executada. Para fixar esta idéia, tente depurar o seguinte algoritmo: Algoritmo “semnome” VAR Idade: inteiro Nome: Caractere Sexo: Caractere Inicio LEIA (Nome, Sexo, Idade) SE Sexo = “M” ENTAO ESCREVA ("A idade de " + Nome + “ é “ + Idade) FIMSE ESCREVA ("Fim da transação") Fimalgoritmo

Estrutura Condicional SE (Composta)

Se <condição> então <sequência de comandos 1> senão <sequência de comandos 2> FIMSE

Onde: <condição> - Expressão lógica qualquer. <sequência de comandos 1> São comandos quaisquer que serão executados caso o resultado da expressão lógica seja verdadeira. <sequência de comandos 2> São comandos quaisquer que serão executados caso o resultado da expressão lógica seja falsa. Para fixar esta idéia, tente depurar o seguinte algoritmo: Algoritmo “semnome” VAR Idade: inteiro Nome: Caractere Sexo: Caractere Inicio LEIA (Nome, Sexo, Idade) SE Sexo = “M” ENTAO ESCREVAL ("A idade de ", Nome, “ é “, Idade, “ Sexo Masculino”) senao SE Sexo = “F” ENTAO ESCREVAL ("A idade de ", Nome, “ é “, Idade, “ Sexo Feminino”) FIMSE FIMSE ESCREVA ("Fim da transacao") Fimalgoritmo

Estrutura Condicional SE (Encadeada) Aqui vale comentar que esta estrutura não é algo preestabelecido, mas sim, uma estrutura formada de várias condições, separando

informações e dando os tratamentos de acordo com a necessidade. Abaixo segue um modêlo hipotético de uma estrutura SE (Encadeada). Se <condição 1> então <sequência de comandos 1> Se <condição 2> então <sequência de comandos 2> FIMSE senão Se <condição 3> então <sequência de comandos 3> senão <sequência de comandos 4> FIMSE <sequência de comandos 5> FIMSE

Para exemplificarmos melhor, vejamos o exemplo: 1) Receber dois números (Num1 e Num2). 2) Realize a soma dos dois valores.

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 10

2.1) Caso a soma seja maior que zero, mostrar na tela o valor da soma e a mensagem: “valor positivo”; 2.2) Caso contrário, verifique: 2.2.1) se o valor calculado é igual a zero. Se for, informar "valor igual a zero", senão; 2.2.2) informar, "valor negativo". (De qualquer maneira, em 2.2, exibir os dois números envolvidos na soma). Algoritmo “semnome” VAR X: inteiro Y: inteiro SOMA: inteiro Inicio LEIA (X, Y) SOMA<- X + Y SE SOMA > 0 ENTAO ESCREVA (SOMA, “ Valor Positivo”) SENAO ESCREVAL (X, Y) SE SOMA = 0 ENTAO ESCREVA ("Valor Igual a Zero") SENAO ESCREVA ("Valor Negativo") FIMSE FIMSE Fimalgoritmo

Sobre esta solução, é importante salientar o seguinte: • Note que a estética, apesar de não influir no resultado da execução do Algoritmo, é de extrema importância para o bom

entendimento do mesmo. Perceba que todos os comandos subordinados ao primeiro SE ficam descolados na mesma margem. Apenas a cláusula SENAO fica na mesma margem do SE. O mesmo ocorre com o segundo SE e com todos os que vierem. A isto damos o nome de IDENTAÇÃO.

• Veja que o comando ESCREVA X, Y é executado independente da condição do segundo SE. É por isto que eles foram escritos após o SENÃO do primeiro SE.

Exercícios de Aprendizagem 1) Dados 2 números digitados via teclado, faça um algoritmo capaz de exibir no vídeo o maior deles. Algoritmo “SEMNOME” VAR X: inteiro Y: inteiro Inicio LEIA (X, Y) SE X > Y ENTAO ESCREVA (X) SENAO ESCREVA (Y) FIMSE FimAlgoritmo

2) Dados 3 números digitados via teclado, faça um algoritmo capaz de exibir no vídeo o maior deles. Algoritmo “SEMNOME” VAR X: inteiro Y: inteiro Z: inteiro Inicio LEIA (X, Y, Z) SE (X > Y) E (X > Z) ENTAO ESCREVA (X) SENAO SE (Y > Z) E (Y > X) ENTAO ESCREVA (Y) SENAO ESCREVA (Z) FIMSE FIMSE FimAlgoritmo

Comentário: Note que, para descobrirmos qual o maior entre três números, precisamos codificar 2 comandos SE encadeados. Se fossem 4 variáveis, seriam 3 SE”s. Na hora de testar este Algoritmo, não esqueça de jogar com as situações de exceção, como por exemplo: 2 dos números sendo iguais, números negativos ou nulos, etc.

3) Dados 2 números digitados via teclado, faça um algoritmo capaz de exibi-los em ordem crescente. Algoritmo “SEMNOME” VAR A: inteiro B: inteiro Inicio LEIA (A, B) SE A > B ENTAO ESCREVA (B, A) SENAO ESCREVA (A, B) FIMSE FimAlgoritmo

Como você solucionaria este problema se tivéssemos de utilizar apenas um comando ESCREVA ?

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 11

A primeira imagem que nos vem a mente é que seria impossível, tendo em vista que uma informação ao ser colocada em uma variável simples irá “ocupar” o lugar da informação já existente na dita variável. Mas em informática podemos utilizar todos os recursos disponíveis para solucionarmos um problema, evitando entretanto, soluções muito extensas e complicadas.

O recurso que vamos dispor nesse momento é a utilização de uma variável auxiliar. Variável auxiliar é aquela que nós utilizamos para servir de apoio. Veja que para realizar a troca de dados exposta a seguir, só com esse recurso.

Algoritmo “SEMNOME” VAR A: inteiro B: inteiro X: inteiro Inicio LEIA (A, B) SE A > B ENTAO X <- A A <- B B <- X FIMSE ESCREVA (A) ESCREVA (B) FimAlgoritmo

Comentário: Para economizarmos comandos ESCREVA, observe que invertemos os valores de A e B toda vez que A fosse maior que B. Assim, independente dos valores de A e B, sempre exibiremos A e B nesta ordem. Para propiciar esta inversão utilizamos uma variável auxiliar X.

Se você não entendeu muito bem o porque da variável X ter sido utilizada no algoritmo acima, preste bastante atenção agora: Deseja-se trocar os valores de duas variáveis: A e B, por exemplo. A B

0 5 Se fizermos simplesmente A <- B, apagaremos o valor original de A e colocaremos o de B em seu lugar. Assim, ambas as variáveis

ficariam com o valor 15. Para viabilizar o processo da troca, temos que recorrer a uma variável auxiliar que conterá provisoriamente o valor de uma das variáveis a fim de devolvê-lo para a outra.

A B

0 5 X

0 4) Dados 3 números digitados via teclado, faça um algoritmo capaz de exibi-los em ordem crescente. Algoritmo “semnome” VAR A: inteiro B: inteiro C: inteiro Inicio LEIA (A, B, C) SE A > B ENTAO SE B > C ENTAO ESCREVA (C, B, A) SENAO SE A > C ENTAO ESCREVA (B, C, A) SENAO ESCREVA (B, A, C) FIMSE FIMSE SENAO SE A > C ENTAO ESCREVA (C, A, B) SENAO SE B > C ENTAO ESCREVA (A, C, B) SENAO ESCREVA (A, B, C) FIMSE FIMSE FIMSE FimAlgoritmo

Estruturas de Repetição Algumas vezes, sentimos necessidade de escrevermos repetidamente o mesmo comando. Em alguns casos, a quantidade de vezes

que temos de escrever é indeterminada ou depende de uma condição.

1º passo

2º passo

3º passo

X<- A

A<- B

B<- X

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 12

Existem algumas formas de definir as estruturas de repetições. Algumas lembram até esta ou aquela linguagem. Em nosso curso iremos no ater a três estruturas, as quais podemos representar tranqüilamente em qualquer ambiente de Programação.

As estruturas são: Repita, Enquanto e Para. Cada uma delas possui uma característica que lhe é peculiar. É normal ouvir a pergunta: “quando iremos utilizar esta ou aquela estrutura”? a resposta é simples pois depende da habilidade de cada um. Existem momentos que podemos resolver a mesma questão com todas as três formas, mas existem momentos que não é possível. Por isso o segredo encontra-se no exercitar.

Bem, vamos dismistificar estas estruturas.

Comando REPITA Aqui você entra na estrutura e pode testar para ver se uma determinada condição foi satisfeita antes ou após a execução de comandos.

Quando a condição de encerramento for verdadeira, será encerrado o processamento do comando Repita e será dado prosseguimento exatamente no primeiro comando imediatamente após o FimRepita.

Repita < comandos > Ate < condição >

Comando ENQUANTO O comando ENQUANTO prende um trecho do Algoritmo a um laço (looping), ou seja, podemos determinar que um certo conjunto de

comandos seja executado repetidamente enquanto uma condição seja verdadeira. Enquanto <condição> Faca < comandos > FimEnquanto

Comando PARA O comando PARA prende um trecho do Algoritmo a um laço (looping), sendo que sua gerência é em cima de uma contagem. Enquanto

ela não for satisfeita, ou seja, o valor final não for ultrapassado, será executado os comandos subordinados a esta estrutura. Para <variável de controle> de <valor inicial> ate <Valor_final> [passo <incremento>] Faca < comandos > FimPara

Na estrutura para..faca, a variável de controle é inicializada com <valor inicial> e no início de cada iteração, seu valor é comparado com

<valor final>. Se o valor da variável for menor ou igual a <valor final>, a lista de comandos é executada e após ser executado o último comando da lista, a variável de controle é incrementada. Isto repete-se até que o valor da variável de controle seja maior que <valor final>, quando então é executado o comando imediatamente após a palavra fimpara. A instrução passo é necessária se o incremento for diferente de 1.

Vamos utilizar um exemplo para esclarecer cada uma dessas instruções dentro de suas respectivas estruturas de repetições. Digamos que temos de fazer o computador escrever do numero 1 ate 10. Usaremos os comandos aprendidos até agora.

♦ Com a estrutura REPITA Algoritmo "DemonstraRepeticao" VAR i: INTEIRO inicio i<- 1 repita escreva (i) i<- i + 1 ate i > 10 fimalgoritmo

♦ Com a estrutura ENQUANTO Algoritmo "DemonstraRepeticao" Var i: INTEIRO inicio i<- 1 enquanto i<=10 faca escreva (i) i<- i + 1 fimenquanto fimalgoritmo

♦ Com a estrutura PARA Algoritmo "DemonstraRepeticao" Var i: INTEIRO inicio i<- 1 para i de 1 ate 10 faca escreva (i) fimpara fimalgoritmo

Maior Valor Existirão momentos em que você sentirá necessidade de identificar o maior elemento dentro de um conjunto de dados processados. Só

existe uma forma de sabermos qual o maior valor: comparando as grandezas do conjunto. Para descobrirmos qual será o maior elemento, inicializaremos uma variável, que armazenará o maior valor do conjunto, com um valor bem pequeno para a situação, e, cada dado existente no conjunto iremos comparar com esta dita variável. Caso o valor encontrado seja superior, este será colocado como conteúdo da variável maior, já que este novo dado representa a maior grandeza neste momento do processamento.

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 13

Encontrando o maior valor dentro de um conjunto: Obs.: para entender melhor esse exemplo, é bom estar familiarizado com a estrutura de repetição comentada mais adiante. Algoritmo “semnome” Var MAIOR_ID: inteiro Idade: inteiro Cont: inteiro Inicio MAIOR_ID <- 0 Para cont de 1 ate 10 Faca LEIA(Idade) Se Idade > MAIOR_ID entao MAIOR_ID <- Idade FIMSE Fimpara Escreva ("A maior idade é " , MAIOR_ID) Fimalgoritmo

Menor Valor De igual forma iremos trabalhar para encontrar o elemento que possui o menor valor. Para tanto, iremos inicializar uma variável, que

armazenará o menor valor do conjunto, com um valor bem alto adequado para a situação, e, cada dado existente no conjunto iremos comparar com esta dita variável. Caso o valor encontrado seja inferior, este será colocado como conteúdo da variável menor, já que este novo dado representa a menor grandeza neste momento do processamento.

Encontrando o menor valor dentro de um conjunto: Algoritmo “semnome” Var MENOR_ID: inteiro Idade: inteiro Cont: inteiro Inicio MENOR_ID <- 999 Para cont de 1 ate 10 Faca LEIA(Idade) Se Idade < MENOR_ID entao MENOR_ID <- Idade FIMSE Fimpara Escreva ("A menor idade é ", MENOR_ID) Fimalgoritmo

Exercícios de Aprendizagem 1) Elabore um algoritmo capaz de exibir todos os números inteiros, desde o 1 até o 10. Algoritmo "inteiros" VAR NUMERO: NUMERICO INICIO NUMERO <- 1 ENQUANTO NUMERO <= 10 FACA ESCREVA (NUMERO) NUMERO <- NUMERO + 1 FIMENQUANTO FimAlgoritmo

Comentário: Note que, utilizamos uma variável numérica chamada NUMERO que recebeu, inicialmente, o valor 1, e daí em diante foi ciclicamente incrementada de 1 (NUMERO<-NUMERO+1) até que a condição imposta pelo ENQUANTO tornasse falsa.

2) Elabore um algoritmo capaz de receber um número e, em seguida, listar todos os números de 1 até ele. Algoritmo "LIMITES" VAR NUMERO: NUMERICO LIMITE: NUMERICO INICIO LEIA (LIMITE) NUMERO<-1 ENQUANTO NUMERO <= LIMITE FACA ESCREVA (NUMERO) NUMERO <- NUMERO + 1 FIMENQUANTO FimAlgoritmo

Comentário: Este Algoritmo é similar ao anterior. A única sde isticação implementada foi a flexibilização do limite. Isto tornou o algoritmo mais genérico, servindo para listar a seqüência de qualquer número, e não apenas a do 10. Para alcançar esta sde isticação, foi necessário o uso da variável LIMITE que de fato limitou o laço do REPITA ao seu conteúdo, conteúdo este que fora recebido logo no início da execução do Algoritmo, com o comando LEIA LIMITE.

3) Sofisticando ainda mais o Algoritmo da 3ª questão, vamos fazer com que, além de listar todos os números de 1 até um determinado número digitado via teclado, ele mostre a soma de todos esses números no final da listagem.

Algoritmo "LIMITES" VAR NUMERO: NUMERICO LIMITE: NUMERICO SOMA: NUMERICO INICIO LEIA (LIMITE) NUMERO <- 1 SOMA <- 0 ENQUANTO NUMERO <= LIMITE FACA ESCREVA (NUMERO) SOMA <- SOMA + NUMERO NUMERO <- NUMERO + 1 FIMENQUANTO ESCREVA (SOMA)

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 14

FimAlgoritmo

Comentário: Perceba que, para acumular os valores parciais assumidos pela variável NUMERO, precisamos lançar mão de uma outra variável, a qual chamamos de SOMA. Assim, a cada ciclo do Enquanto acrescentamos ao valor de SOMA o novo valor de NUMERO (SOMA <-SOMA+NUMERO).

Observe também que declaramos SOMA com mais bytes que NUMERO ou LIMITE. É fácil entender por que ! Como SOMA será um “Acumulador” dos valores de NUMERO, ela sempre terá valores maiores que NUMERO, podendo seu montante, exceder ao quantitativo de casas definidas em NUMERO.

4) Receba uma seqüência de nomes via teclado até que seja digitado um nome em branco (“ ”). Após a digitação desta lista, escrever no vídeo quantos nomes começaram pela letra “A”.

Algoritmo "EXEMPLO" VAR NOME: CARACTER CONT: NUMERICO INICIO LEIA (NOME) CONT<-0 ENQUANTO NOME <> " " FACA SE POS("A", NOME) = 1 ENTAO CONT <- CONT + 1 FIMSE LEIA (NOME) FIMENQUANTO ESCREVA (CONT) FimAlgoritmo

Comentário: Novamente recorremos a um contador, desta vez, contabilizando os nomes com inicial “A”. Observe que tivemos que utilizar duas vezes o comando LEIA NOME. Isto para que o primeiro NOME digitado não fosse igual a branco, forçando a saída do ENQUANTO logo de início.

Técnicas de Algoritmização Como dissemos anteriormente, não há qualquer receita de bolo para resolvermos um determinado problema através da programação.

Cada caso é um caso bastante específico. Entretanto, alguns procedimentos sistemáticos podem auxiliar a elucidação de alguns problemas. Dicas sobre Resolução de Algoritmos Nunca dê um algoritmo por encerrado antes de testar todas as possibilidades condicionais. Só o teste garante a eficácia do Algoritmo.

Teste sempre as situações extremas. Em algoritmos utilize diversas condições; teste ao menos uma situação que se enquadre em cada condição prevista pelo algoritmo.

Não tente decorar algoritmos. Cada caso é um caso, por mais que se assemelhem. Há sempre uma forma melhor de fazer a mesma coisa. Após o ZERO ERRO, examine se o seu algoritmo é eficiente, isto é, se ele não

usa variáveis demais, se ele é facilmente compreendido por uma terceira pessoa, se os nomes de variáveis são auto-expressivos, se o usuário não terá dificuldade em utilizá-lo, e se o computador não passará muito tempo para processá-lo (performance).

Não tente arquitetar, ainda que mentalmente, a solução de um problema sem antes entender perfeitamente o que pede no enunciado. Não inicie a programação sem ter claramente a solução arquitetada na sua cabeça. Não deixe a curiosidade afetar a sua criatividade. Durante o desenvolvimento do seu algoritmo, não pesas orientação sobre o como

fazer, sem antes ter chegado a algum resultado, ainda que errado. Nunca desista de uma solução. Concluí-a. Chegue até o fim. Teste-a, e somente quando os testes sinalizarem a sua ineficácia, tente

modificá-la ou refazê-la. Técnica para extrair os dados de um enunciado Quando nos deparamos com um enunciado pequeno, nos sentimos a vontade para resolvê-lo pois os dados existentes neste são

poucos. Porém, quando nos deparamos com um enunciado mais complexo, existe a tendência natural de pensarmos que é algo muito difícil de resolver. Mas, por incrível que pareça, o maior problema encontra-se em nosso lidar com o desafio e o encarar “friamente”. Justamente para melhor lhe capacitar a interpretar um texto é que estamos te dando esta dica.

Todos os Algoritmos possuem 3 fases bem definidas e nestas, os seus dados necessários. Quando você tiver domínio sobre estas três fases, o algoritmo fluirá naturalmente.

Procure identificar a 1ª fase que é a da identificação dos dados de entrada; a 2ª fase e a que verifica os dados relativos ao processamento (condições de encerramento, cálculos, mensagens, etc; a 3ª fase é aquela aonde você descobre quais os dados de saída, ou seja, após o processamento, aonde irão ser colocado estes dados?

Vamos exemplificar. Elaborar um algoritmo que receba a matrícula, o nome e o salário de 50 funcionários, imprimindo ao final, o somatório dos

salários e a média salarial. Vamos por em prática nosso aprendizado. 1ª fase (Dados de Entrada) Será recebido a MATRICULA, NOME E SALÁRIO; LEIA Matricula, Nome, Salário) 2ª fase (Processamentos) Serão processados dados de 50 funcionários. (isto implica dizer que precisaremos de uma variável para contabilizar e gerenciar este

processo); O melhor comando para gerenciar um valor predefinido é o PARA. Cada elemento que for processado, será acumulado o valor do salário (somatório dos salários). AcumSal <- AcumSal + Salario Observe que para cálculo da média salarial é necessário sabermos o somatório dos salários e dividir o mesmo pela quantidade de

pessoas que os possuem. Como sabemos que existirão 50 pessoas, para encontrar a média é super simples. Calcular a média dos salários. Media <- AcumSal / 50 3ª fase (Dados de Saída) Dar saída no valor da média calculada. Escreva (“A média salarial é “, Media) Montando o Algoritmo Algoritmo "EXEMPLOLOGICA" Var AcumSal: numerico Cont: numerico Salario: numerico

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 15

Media: numerico Nome: Caracter INICIO AcumSal <- 0 Para cont <- 1 ate 50 faca LEIA (Nome, Salario) AcumSal <- AcumSal + Salario FimPara Media <- AcumSal / 50 Escreva (“A média Salarial é “, Media) FimAlgoritmo

Desafios Resolvidos � Como fazer para descobrir a quantidade de elementos iguais ao maior do conjunto? � Simples. Primeiro, você deverá encontrar o maior; � Em segundo lugar, verificar quais os elementos são iguais a este maior encontrado. � Aqui damos uma dica. Ao encontrar um elemento cujo valor seja superior àquele que representa o maior,

temos duas tarefas a fazer. Uma é atribuir o valor do elemento para ser o maior e em seguida inicializar a quantidade com o numeral 1 (um). Mas porque 1 (um)? Pelo fato de que acabamos de encontrar um número maior e com certeza, nesse momento ele é único. Como fazer para contabilizar todos os iguais? A própria pergunta já é a resposta: cada vez que você encontrar algum valor igual ao maior, contabilizaremos mais um.

� Vamos ao Exemplo? “Elaborar um algoritmo que receba idade de 50 pessoas e informe ao final, a maior delas e quantas pessoas a possuem.” Algoritmo "DESAFIO1" Var Ma_idade: numerico Qt_maid: numerico Cont: numerico Widade: numerico INICIO Ma_idade <- 0 Qt_maid <- 0 Para cont <- 1 ate 50 faca LEIA (widade) Se widade > Ma_idade entao Ma_idade <- widade Qt_maid <- 1 Senao Se widade = Ma_idade entao Qt_maid <- Qt_maid + 1 FIMSE FIMSE FimPara Escreval (“A maior idade é ..........................: “, Ma_idade) Escreval (“Quantidade de pessoas com a maior idade...: “, Qt_maid) FimAlgoritmo

� Como fazer para descobrir a quantidade de elementos iguais aos dois maiores elementos do conjunto? � Agora ficou mais fácil. Precisamos atentar para um pequeno detalhe: quando encontrarmos um elemento que

é superior ao primeiro, este último passa a ser o segundo maior. Para não perdermos o conteúdo original do maior, passaremos seus conteúdos para as respectivas variáveis e depois procederemos naturalmente colocando o elemento maior no seu referido lugar. Vejamos parte do código a seguir.

Ma_idade2 <- Ma_idade1 Qt_maid2 <- Qt_maid1 Ma_idade1 <- widade Qt_maid1 <- 1

� Percebeu como é simples? Isto fazemos em todos os momentos em que devemos verificar o maior e o segundo maior. No demais é tomar cuidado com o segundo maior, pois apesar do valor as vezes, ser inferior ao primeiro, nada garante que ele o seja em relação ao segundo. Desta forma, precisamos fazer a comparação para termos certeza.

� Vamos ao Exemplo? “Elaborar um algoritmo que receba idade de 50 pessoas e informe ao final, as duas maiores idades e quantas pessoas as possuem.”

Algoritmo "DESAFIO2" Var Ma_idade1: numerico Ma_idade2: numerico Qt_maid1: numerico Qt_maid2: numerico Cont: numerico Widade: numerico inicio Ma_idade1 <- 0 Ma_idade2 <- 0 Qt_maid1 <- 0 Qt_maid2 <- 0 Para cont <- 1 ate 50 faca LEIA (widade) Se widade > Ma_idade1 entao Ma_idade2 <- Ma_idade1

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 16

Qt_maid2 <- Qt_maid1 Ma_idade1 <- widade Qt_maid1 <- 1 Senao Se widade = Ma_idade1 entao Qt_maid1 <- Qt_maid1 + 1 Senao Se widade > Ma_idade2 entao Ma_idade2 <- widade Qt_maid2 <- 1 Senao Se widade = Ma_idade2 entao Qt_maid2 <- Qt_maid2 + 1 FIMSE FIMSE FIMSE FIMSE FimPara Escreval (“A maior idade é ..........................: “, Ma_idade1) Escreval (“Quant. de pessoas com a maior idade.......: “, Qt_maid1) Escreval (“A segunda maior idade é ..................: “, Ma_idade2) Escreval (“Quant. de pessoas com Seg. maior idade....: “, Qt_maid2) FimAlgoritmo

Escolha...Caso Em algumas situações é necessário termos várias soluções ligadas a respostas diferentes, neste caso o comando de

alternativa simples ou composta não é uma solução prática, isto porque obrigará o Programador a escrever muitas linhas de Algoritmo, além de ter que criar vários comandos de alternativas compostas e verificar a validade de suas condições para que o comando execute o caminho correto para uma determinada condição. Temos então o comando de alternativa de múltipla escolha.

O funcionamento deste comando obedece a seguinte regra: Escolha < expressão-de-seleção > Caso < exp 1 > , < exp 2 >, ... , < exp n > < lista-de-comandos-1 > Caso < exp 1 > , < exp 2 >, ... , < exp n > < lista-de-comandos-2 > outrocaso < lista-de-comandos-3 > fimescolha

Exemplo IDADE CATEGORIA De 05 a 10 Infantil De 11 a 15 Juvenil De 16 a 20 Junior De 21 a 25 Prde issional Construa um Algoritmo que solicite o nome e a idade de um atleta e imprima a sua categoria. Algoritmo "CLASSIFICAÇÃO DE ATLETAS var nome, categoria : caractere idade : inteiro inicio Escreva("Nome do Atleta = ") Leia (nome) Escreva("Idade do Atleta = ") Leia (idade) Escolha idade caso 5,6,7,8,9,10 categoria <- "Infantil" caso 11,12,13,14,15 categoria <- "Juvenil" caso 16,17,18,19,20 categoria <- "Junior" caso 21,22,23,24,25 categoria <- "Prde issional" outrocaso categoria <- "INVALIDO" Fimescolha Escreva ("Categoria = ",categoria) Fimalgoritmo

Variáveis Compostas Homogêneas Vetores - Variáveis Indexadas Unidimensionais Até então trabalhamos com variáveis simples, que só recebem um dado por vez. Neste capítulo trataremos sobre variáveis compostas,

que são capazes de armazenar mais de um dado ao mesmo tempo. Chamamos de Vetor a toda variável (estrutura) capaz de armazenar em si, vários elementos, e que possua apenas uma dimensão

(Unidimensional). Para acessar os elementos deste vetor é necessário um índice que serve como indicador de posição. Como declarar um vetor? Através do comando VAR. Vejamos a sintaxe abaixo: Algoritmo “X” var <nome_vetor> : vetor[1..<qtd.ocor.>] de <tipo>

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 17

inicio ... FimAlgoritmo

Imagine um vetor definido para receber 10 nomes, onde cada elemento possui 40 dígitos do tipo caracter, e um segundo vetor para receber 10 salários, onde cada elemento possui 8 dígitos, sendo 2 casas decimais .

Algoritmo “X” var vnome : vetor[1..10] de caractere Vsal : vetor[1..10] de real inicio ... FimAlgoritmo

Observe: 1. O tamanho do vetor é definido pelo intervalo entre colchetes após a palavra reservada vetor. Ex.: O intervalo [1..10]

indica que o vetor pode conter 10 valores. 2. O tipo de dado do vetor é definido pelo tipo de dado declarado após a palavra reservada de . Todos os valores de

um vetor têm o mesmo tipo de dado. Para acessar um dado num vetor o que é necessário fazer? Muito simples. Informe o valor do índice cujo posicionamento incide na ocorrência que você quer verificar. Caso esta ocorrência exista,

será mostrado o conteúdo da célula indicada pelo índice. Vnome

1 2 (. . .) 9 10 Paul

o Ana Karla Ivo

Escreva ( Vnome[1] ); { será impresso ‘Paulo’ } Escreva ( Vnome[9] ); { será impresso ‘Karla’ } Como fazer para atribuir um valor a uma ocorrência do vetor? A forma mais clássica e que funciona em qualquer linguagem é receber a informação na tela (via teclado) e colocar o valor recebido na

ocorrência que queremos do vetor. (...) Leia (wnum1, wnum2, wnum3) Vnum[1] <- wnum1 Vnum[2] <- wnum2 Vnum[3] <- wnum3 (...) ou (...) Para ind de 1 ate 3 faca Leia ( wnum) Vnum[ind] <- wnum Fimpara (...)

Como fazer para atribuir um valor a uma ocorrência do vetor? (...) Leia (wnum1, wnum2, wnum3) Vnum[1] <- wnum1 Vnum[2] <- wnum2 Vnum[3] <- wnum3 (...) ou (...) Var Vnum : vetor [1..3] de caractere Ind : inteiro Inicio Para ind de 1 ate 3 faca Leia (wnum[ind]) (...)

Como fazer para somar os elementos de um vetor numérico? (...) soma <- 0 Para ind de 1 ate 3 faca Soma <- soma + Vnum[ind] Escreva(Soma) (...)

Para entendermos melhor o que de fato vem a ser um vetor e sua importância, analisemos um problema básico conforme o enunciado a seguir.

‘Elaborar um algoritmo que receba 5 números e informe: a) O maior entre eles; b) Quantas vezes o maior número ocorreu; c) Informe em que momento (quando) o número igual ao maior foi informado (1ª, 2ª,...,5ª vez).’ Resolvendo com variáveis simples: � Para sabermos qual o maior elemento digitado já sabemos (vide TDL - parte 1); � Para sabermos quantas vezes o maior elemento ocorreu, já sabemos (vide TDL - parte 1); � Para sabermos em que momento foi digitado o maior número é fácil detectarmos, mas verificarmos em quais

momentos se repetiu a digitação do número igual ao maior é mais complexo, necessitando de um algoritmo com um controle bem feito e criação de algumas variáveis auxiliares para controlar este processo.

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 18

Resolvendo com Variável Composta Unidimensional (VETOR) � Com vetor, a lógica se torna muito simples, pois os dados são digitados e carregados em cada ocorrência do vetor

ficando disponível enquanto não for encerrado o processamento. Nesse momento podemos aproveitar para encontrar o maior e quantas vezes ele ocorre.

(...) Para ind de 1 ate 5 faca Leia (wnum) Vnum[ind] <- wnum Se wnum > Ma_num entao Ma_num <- wnum Ma_qtd <- 1 Senao Se wnum = Ma_num entao Ma_qtd <- Ma_qtd + 1 fimse fimse fimPara (...)

� Uma segunda etapa é a de encontrar qual(ais) elemento(s) foi(ram) igual(ais) aquele identificado como sendo o

maior. Quando isso ocorrer, é só informar em que posição (índice atual do vetor) este elemento foi encontrado; (...) Para ind de 1 ate 5 faca Leia ( wnum[ind]) Se wnum[ind] > Ma_num entao Ma_num <- wnum[ind] Ma_qtd <- 1 Senao Se wnum[ind] = Ma_num entao Ma_qtd <- Ma_qtd + 1 Fimse finse fimPara Para ind de 1 ate 5 faca Se Vnum[ind] = Ma_num entao Escreva (ind) fimse FimPara (...)

Mas para que servem os Vetores ? Existem situações nas quais precisamos armazenar uma seqüência de dados semelhantes entre si. Por exemplo: imagine que

tenhamos de armazenar 5 números telefônicos para cada cliente de uma determinada empresa. Considerando o que vimos na primeira etapa do curso, teríamos que declarar 5 variáveis literais, cada uma com um identificador próprio.

var FONE1: caractere FONE2: caractere FONE3: caractere FONE4: caractere FONE5: caractere

Como sabemos que cada um dos números telefônicos terá o mesmo tipo e tamanho, poderemos descartar as 5 variáveis acima, e utilizarmos apenas uma variável vetor, com 5 elementos:

VAR FONES : vetor [1..5] de caractere

Já que sabemos a quantidade de elementos que o vetor irá receber, podemos desenvolver um algoritmo de armazenamento dos dados no vetor. Usaremos, para isto, os comandos que aprendemos até agora.

Algoritmo “ex” Var WFONE: caractere FONES: vetor [1..5] de caractere IND: inteiro Inicio IND <- 1 Enquanto IND <= 5 faca Leia (WFONE) FONES[IND] <- WFONE IND <- IND + 1 FimEnquanto IND <- 1 Enquanto INDICE <= 5 faca Escreva (FONES[IND]) IND <- IND + 1 FimEnquanto FimAlgoritmo

ou Algoritmo “ex” Var WFONE: caractere FONES: vetor [1..5] de caractere IND: inteiro Inicio Para IND de 1 ate 5 faca Leia (WFONE)

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 19

FONES[IND] <- WFONE FimPara Para IND de 1 ate 5 faca Escreval (FONES[IND]) FimPara FimAlgoritmo

Veja que, pelo exemplo acima, podemos utilizar como índice de um vetor uma outra variável, desde que esta seja do tipo numérica, inteira (sem casas decimais) e positiva (maior que zero). Não fosse este artifício, teríamos que criar 5 variáveis para receber os telefones e depois escrever uma a uma na ordem de entrada

Algoritmo “ex2” Var WFONE1, WFONE2, WFONE3, WFONE4, WFONE5: caractere Inicio Leia (WFONE1, WFONE2, WFONE3, WFONE4, WFONE5) Escreva (WFONE1, WFONE2, WFONE3, WFONE4, WFONE5) FimAlgoritmo

Que trabalheira, não ? Trabalhando dois Vetores utilizando o mesmo índice 5) Uma das grandes dificuldades que os iniciantes do aprendizado da lógica encontra é com o raciocínio espacial. Temos que

nos desprender das limitações que nossa mente nos traz e abraçar todos os desafios analisando-os ‘friamente’. Por exemplo, o mais comum é beber água em um copo de vidro ou de plástico, mas, será que podemos praticar a mesma ação (tomar água) em um copo de papel? Claro que sim, apesar de não ser o mais comum. Então a regra é simples: aceite a nova informação e coloque em prática exercitando seu raciocínio diante das novas informações.

6) Uma das muitas facetas da informática é a de reaproveitamento de variáveis para tarefas separadas. Um caso típico desses é o de utilização de um mesmo índice em estruturas de vetores diferentes. A medida que percorremos um vetor A qualquer com um índice, outro vetor B poderá está se utilizar deste mesmo índice. Vejamos o caso a seguir.

7) Elabore um algoritmo que alimente dois vetores, cada um de 10 elementos (informados pelo teclado). Guarde num terceiro vetor, o produto dos elementos do primeiro pelo segundo e o escreva no vídeo o resultado armazenado no terceiro vetor.

Algoritmo “ex1” Var A: vetor [1..10] de inteiro B: vetor [1..10] de inteiro P: vetor [1..10] de inteiro WA, WB: inteiro SOMA: inteiro IND: inteiro Inicio Para IND de 1 ate 10 faca Leia (WA, WB) A[ind] <- WA B[ind] <- WB P[ind]<-A[ind] * B[ind] FimPara Para IND de 1 ate 10 faca Escreva (P[ind]) FimPara FimAlgoritmo

Exercícios 1. Sendo o Vetor V igual a:

0

0 6 1 3 4 e as variáveis X = 2 e Y = 4, escreva o valor correspondente à solicitação: a) V[X+1] b) V[X+2] c) V[X+3] d) V[X+4]

e) V[X*1] f) V[X*2] g) V[X*3] h) V[X*4] i) V[X+Y] j) V[Y*X] k) V[V[4]] l) V[V[V[7]]] m) V[2+V[8-V[2]]] n) V[V[1]*V[4]]

Solução comentada de alguns itens A. Se X = 2, então V[X+1] é o mesmo que V[2+1], ou seja, V[3], cujo conteúdo é 8. B. Se X = 2 e Y = 4, então V[X+Y] é o mesmo que V[2+4], ou seja V[6], que vale 16. C. V[V[4]] parece complicado em princípio, porém podemos simplificar bastante as coisas se solucionarmos primeiramente as

expressões mais internas aos colchetes, passando para as mais externas. Assim, V[V[4]] é o mesmo que V[3], porque V[4] é igual a 3. Portanto, V[3] é 8.

D. V[2+V[8-V[2]]] ===> V[2+V[8-6]] ===> V[2+V[2]] ===> V[2+6] ===> V[8] ===> 21. Faça analogia e solucione os demais itens. 2. Elabore um algoritmo que guarde num vetor A, 10 elementos inteiros informados pelo teclado, e que calcule o somatório de

todos os elementos, escrevendo, no vídeo, o resultado final. Algoritmo “ex2” Var A[10]: Numérico Wvalor: Numérico SOMA: Numérico IND: Numérico Inicio Para IND de 1 ate 10 faca Leia (Wvalor) A[IND] <- Wvalor SOMA <- SOMA + A[IND] FimPara Escreval (SOMA)

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 20

FimAlgoritmo

3. Elabore um algoritmo que preencha um vetor alfanumérica de 10 elementos, que deverá conter 10 nomes de pessoas. Após o preenchimento do vetor, ele deverá solicitar um nome a ser pesquisado dentro do vetor. Após receber este nome, pesquisá-lo dentro do vetor recém digitado e, caso encontre-o, escrever ‘NOME CADASTRADO’ no vídeo.

Algoritmo “ex3” Var NOMES : vetor [1..10] de caractere WNome: caractere IND: inteiro Inicio Para IND de 1 ate 10 faca Leia (Wnome) NOMES[IND] <- Wnome FimPara Leia (Wnome) Para IND de 1 ate 10 faca Se Wnome = NOMES[ind] entao Escreval (“NOME CADASTRADO”) fimse FimPara FimAlgoritmo

Comentário: Este algoritmo apresenta duas fases bem distintas: preenchimento e busca. A fase de preenchimento já não tem mais mistério. Na fase de busca, o usuário digita um nome qualquer dentro de WNOME. Em seguida o algoritmo inicia um processo de busca pelo nome digitado dentro do vetor carregado. Quando o elemento digitado for encontrado, será emitido a mensagem confirmando o fato. Vai agora uma pergunta: se a pesquisa não for bem sucedida, com o fazer para o usuário ter ciência do ocorrido? Vamos dar uma das saídas possíveis reorganizando o algoritmo.

Algoritmo “ex3” Var NOMES : vetor [1..10] de caractere WNome: caractere IND: inteiro Achou: logico Inicio Para IND de 1 ate 10 faca Leia (Wnome) NOMES[IND] <- Wnome FimPara Leia (Wnome) Achou <- Falso Para IND de 1 ate 10 faca Se Wnome = NOMES[ind] entao Escreval (“NOME CADASTRADO”) Achou <- Verdadeiro fimse FimPara Se Achou = Falso entao Escreval (“Nome não Cadastrado”) fimse FimAlgoritmo

Comentário: Veja que utilizamos um artifício muito comum entre os Programadores, que é uma variável auxiliar contendo um valor inicial qualquer (no nosso caso, iniciamos com .F.) e, caso tenha ocorrido alguma ação dentro do que esperávamos, mudamos o conteúdo para outro valor (mudamos o valor para .V.)

4. Elabore um algoritmo capaz de receber uma data no formato (‘DD/MM/AA’) e imprimi-la no formato (DD de <mês por extenso> de 20AA).

Algoritmo "ex3" Var MESES : vetor [1..12] de caractere DATA: caractere MES:INTEIRO Inicio MESES[1]<- "Janeiro" MESES[2]<-"Fevereiro" MESES[3]<-"Março" MESES[4]<-"Abril" MESES[5]<-"Maio" MESES[6]<-"Junho" MESES[7]<-"Julho" MESES[8]<-"Agosto" MESES[9]<-"Setembro" MESES[10]<-"Outubro" MESES[11]<-"Novembro" MESES[12]<-"Dezembro" escreva("Informe uma data no formato dd/mm/aa") Leia (DATA) MES <- CARACPNUM( COPIA (DATA,4,2)) Escreval (COPIA(DATA,1,2) + " de " + MESES[ MES ] + " de 20" + COPIA(DATA,7,2)) FimAlgoritmo

Comentário: Note que, caso a data seja digitada incorretamente, VALOR(PARTE(DATA,4,2)) poderá ser um número fora do intervalo de 1 a 12. Neste caso um erro poderá ocorrer em tempo de execução do Algoritmo. Por isto é interessante criticar a data antes que ela seja processada pelo algoritmo.

5. Faça um algoritmo que preencha um vetor de inteiros com 40 ocorrências recebendo do teclado. 6. Faça um algoritmo que receba 30 nomes digitados pelo usuário. O nome não pode ser preenchido com brancos 7. Faça um algoritmo que receba 30 valores reais pelo teclado. Os valores devem ser maiores que zero.

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 21

8. Faça um algoritmo que preencha um vetor de inteiros com 20 ocorrências, onde Vetor[I] <-2I , ou seja, o conteúdo de cada ocorrência é o dobro do seu índice.

9. Faça um algoritmo que preencha um vetor A com 10 ocorrências onde A[I] <- 2I + 1, preencha um vetor B com 10 ocorrências onde B[I] <- 2I + 4 e um vetor C com 10 ocorrências onde cada ocorrência é a soma das ocorrências de mesmo índice dos vetores A e B.

10. Escreva os comandos necessários para imprimir o vetor do exercício 1 na ordem inversa do índice ( de trás para frente) 11. Escreva os comandos necessários para preencher todas as ocorrências do vetor do exercício 3 com o valor ZERO. 12. Escreva os comandos necessários para somar todas as ocorrências do vetor do exercício 4. 13. Escreva os comandos necessários para mover todos os valores do vetor C do exemplo 5 para o vetor B do mesmo exemplo 14. Escreva os comandos necessários para encontrar o maior elemento do vetor do exercício 1. Ordenação Vetores Primeiramente, quero pensar com você o que seria uma ordenação. Podemos afirmar que ordenar é um processo no qual elementos

ficarão em uma ordem sequêncial crescente ou decrescente. Imagine os números: � 3, 1, 2 (estes dados estão desordenados); � 1, 2, 3 (estes dados estão ordenados crescentemente); � 3, 2, 1 (estes dados estão ordenados decrescentemente). Vamos aprender a ordenar os dados de forma crescente. Existem algumas formas, porém estudaremos duas delas. Se você tiver um vetor numérico contendo dois elementos (num[02], numérico, 1) e quiser que eles fiquem ordenados

crescentemente, o que fazer? � 1º Passo: Verificar qual dos dois elementos é o maior. Se num[1] > num[2] então (...) � 2º Passo: Se o primeiro elemento for maior que o segundo, precisamos inverter os elementos de posição (isto

aprendemos na primeira etapa de TDL). Caso contrário, os elementos já estão ordenados e não precisaremos inverter os dados. Se num[1] > num[2] entao Aux <- num[1] Num[1] <- num[2] Num[2] <- Aux fimse Escreval ( num[1] , num[2])

Vejamos um segundo caso. Se você tiver três elementos numéricos expostos na seqüência abaixo e quiser ordená-los o que faríamos? 1 2 3 3 1 2

1. Não poderíamos colocar os índices fixos. Como assim? Os valores que ficam valendo como índices de acesso

deveriam ser variáveis (mutáveis). 2. No caso em estudo iremos fazer as comparações entre num[1] e num[2], verificando se os elementos já estão em

ordem, depois realizaremos a comparação entre os elementos num{2] e num[3], fazendo a mesma comparação, invertendo os elementos caso estes estejam fora da ordem desejada. Com isso temos as seguintes conclusões:

� Estaremos comparando dois elementos ao mesmo tempo, logo, as posições são diferentes [ I ] e [I + 1] ; � O índice irá até a penúltima posição [n-1]; � Precisamos de uma estrutura de repetição para ‘varrer’ todos os elementos. Vamos ao algoritmo. Algoritmo “ordena” Var num : vetor [1..3] de inteiro Aux : inteiro Ind : inteiro Inicio Para ind de 1 ate 2 faca Se num[ind] > num[ind + 1] entao Aux <- num[ind] num[ind] <- num[ind + 1] num[ind + 1] <- Aux fimse FimPara Para ind de 1 ate 3 faca Escreval (num[ind], “ “) FimPara FimAlgoritmo

Pronto! Para os elementos dispostos na forma como citados anteriormente, este algoritmo funcionará. Porém, este Algoritmo testou apenas uma seqüência de números, conseguindo colocar em ordem. Se você alterar a seqüência das informações para:

1 2 3 3 2 1

e utilizar-se do mesmo algoritmo, irá perceber que houve uma falha, pois os números após a execução do processo ficaram organizados assim:

1 2 3 2 1 3

Como garantir que os dados ficarão ordenados? Simplesmente, mandando executar esta rotina de comparação de elementos tantas quantas vezes sejam necessárias até nenhum elemento ser trocado de posição, caracterizando assim, a ordenação do vetor. Vamos nos utilizar outra vez de uma chave de controle batizando-a como mudou. Ela definirá se houve ou não uma troca de elementos. Chegamos agora a uma das estruturas de ordenação.

Algoritmo “ordena” Var num : vetor [1..3] de inteiro Aux : inteiro Ind : inteiro Mudou : caracter Inicio

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 22

Repita mudou <- “N” Para ind de 1 ate 2 faca Se num[ind] > num[ind + 1] entao Aux <- num[ind] num[ind] <- num[ind + 1] num[ind + 1] <- Aux mudou <- “S” fimse FimPara ate mudou = “N” Para ind de 1 ate 3 faca Escreval (num[ind]) FimPara FimAlgoritmo

Pronto! Após a execução deste algoritmo, teremos nossos dados organizados de forma crescente. Outro algoritmo que utilizamos para ordenar os vetores é o exposto a seguir. Ele é bem menor em quantidade de código e é um dos

mais utilizados entre os desenvolvedores de sde twares. Observar que n-1 é igual ao valor do índice da penúltima posição, e n é o valor do índice da última posição. Algoritmo “ordena” Var num : vetor [1..3] de inteiro K,j,Aux : inteiro Ind,n : inteiro Mudou : caractere Inicio Para k de 1 ate n-1 faca Para j de k + 1 ate n faca Se num[k] > num[j] entao Aux <- num[k] num[k] <- num[j] num[j] <- Aux fimse FimPara FimPara Para ind de 1 ate 3 faca Escreval (num[ind]) FimPara FimAlgoritmo

Exercícios 1. Faça um algoritmo que preencha um vetor de inteiros com 20 ocorrências recebendo do teclado. Ordene os números

informados e exiba os valores do vetor de forma. 2. Faça um algoritmo que preencha um vetor de nomes com 10 ocorrências recebendo do teclado, onde cada ocorrência é

capaz de armazenar 30 dígitos. Ordene os nomes informados e exiba os valores do vetor. 3. Faça um algoritmo capaz de preencher um vetor de 10 posições com inteiros positivos. Ordene o vetor, imprima na tela e

mostre a media dos valores informados. 4. Faça um algoritmo capaz de preencher um vetor de 10 posições com nomes. Ordene o vetor e imprima na tela apenas os

nomes que começam com a letra ‘A’.

Matrizes O vetor é uma variável composta unidimensional, por quanto solicita 1 índice para endereçar seus elementos. Estudaremos as

bidimensionais As variáveis compostas bidimensionais, aqui intituladas MATRIZES, exigem dois índices para endereçar um de seus elementos. Assim como no vetor, as matrizes aceitam dados de um mesmo tipo (homogêneas) ou de tipos diferentes (heterogêneas). Neste último

caso, os dados deverão ser comuns nas linhas ou nas colunas. Quando formos declarar uma estrutura do tipo Matriz, poderemos definir o tipo como único, caso essa seja a realidade da matriz

(homogênea). Porém se você for trabalhar com uma matriz com mais de um tipo de dado (heterogênea), declare apenas a matriz com sua respectiva quantidade de linhas e colunas.

A quantidade de elementos de uma matriz não precisa ser definida, pois ao definirmos quantas linhas e colunas ela terá, automaticamente teremos o número de elementos da mesma (qt_lin x qt_col).

Exemplo: Uma matriz M com 4 linhas por 3 colunas (4X3) terá 12 elementos. Neste exemplo, a matriz M é do tipo NUMERICO, mas poderíamos ter uma matriz de outros tipos:

ALFANUMÉRICA ou LOGICO. O conteúdo do elemento M[2,3] é -16, pois o primeiro índice indica a linha, e o segundo, a coluna onde se encontra o elemento procurado.

Este índice poderá ser, como no caso dos vetores, variáveis numéricas inteiras positivas, o que facilita mais uma vez o nosso trabalho na montagem, pesquisa e processamento dos elementos de uma matriz.

Como Declarar uma Matrizes? Para declarar uma matriz no nosso algoritmo, usaremos mais uma vez o comando DECLARE. VAR <Nome_matriz>: VETOR [1.. <qtd_linha> , 1..<qtd_coluna>] de <tipo>

<Nome_matriz> - Nome da matriz <qtd_linha> - Quantidade de linhas da matriz <qtd_coluna> - Quantidade de colunas da matriz <Tipo> - Tipo da matriz definida (caractere, inteiro, real, logico , etc) Exemplos: VAR Fones : vetor [1..10,1..5] de caractere A matriz terá 50 elementos distribuídos em 10 linhas e 5 colunas, sendo todos do tipo CARACTERE. VAR Salários: Vetor [1..50,1..900] de inteiro Esta matriz comportará 45.000 elementos, cada um do tipo inteiro.

-1 5,6

302 4 16

21 ,5

1,45 400 00

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 23

Para acessar um dado numa matriz o que é necessário fazer? Necessitamos informar o nome da matriz e as coordenadas que nos deixarão ‘setados’ na ocorrência desejada. Por exemplo: se

tivermos uma matriz ‘Mnomes’ de 3 linhas e 4 colunas, carregada com elementos e quisermos pegar aquele que se encontra na linha 3 e coluna 2, o que deveríamos informar? Simplesmente, informaríamos: Matriz[lin,col] ou seja, Mnomes[3,2].

1 2 3 4 Nome

11 Nom

e12 Nom

e13 Nom

e14 Nome

21 Nom

e22 Nom

e23 Nom

e24 Nome

31 Nom

e32 Nom

e33 Nom

e34

Como fazer para somar os elementos de uma matriz numérica? Vamos trabalhar algumas situações que envolvam a soma de elementos. Preencher os elementos da matriz Algoritmo “Prog 17” var LINHA, COLUNA : inteiro MAT : vetor[1..3, 1..4] de inteiro Inicio Para LINHA de 1 ate 3 faca Para COLUNA de 1 ate 4 faca Escreva('DIGITE ELEMENTO ',LINHA,'X',COLUNA,': ') Leia (MAT[LINHA,COLUNA]) FimPara FimPara FimAlgoritmo

Somar todos os elementos da matriz Algoritmo “matriz” Var Mnum : vetor [1..3,1..4] de inteiro LINHA, COLUNA : inteiro Soma : inteiro Inicio Soma <- 0 Para LINHA de 1 ate 3 faca Para COLUNA de 1 ate 4 faca Soma <- Soma + Mnum[LINHA, COLUNA] FimPara FimPara Escreval (Soma) FimAlgoritmo

Somar todos os elementos linha a linha (subtotal por linha) Para cada linha acessada, serão somados todos os elementos das colunas da referida linha. Algoritmo “subtotalL” Var Mnum : vetor [1..3,1..4] de inteiro LINHA, COLUNA : inteiro Soma : inteiro Inicio Para LINHA de 1 ate 3 faca Soma <- 0 Para COLUNA de 1 ate 4 faca Soma <- Soma + Mnum[LINHA, COLUNA] Escreval (“soma dos elementos da linha “, LINHA, “ = “ , Soma) FimPara FimAlgoritmo

Somar todos os elementos coluna a coluna (subtotal por coluna) Para cada coluna acessada, serão somados todos os elementos das linha da referida coluna. Algoritmo “subtotalC” Var Mnum : vetor [1..3,1..4] de inteiro LINHA, COLUNA : inteiro Soma : inteiro Inicio Para COLUNA de 1 ate 4 faca Soma <- 0 Para LINHA de 1 ate 3 faca Soma <- Soma + Mnum[LINHA, COLUNA] FimPara Escreval (“soma dos elementos da coluna “, COLUNA, “ = “ , Soma) FimPara FimAlgoritmo

Para transferir todos os elementos de uma matriz MAT para outra matriz chamada COPIA Algoritmo “CopiaMat” Var Mnum, Copia : vetor [1..3,1..4] de inteiro LINHA, COLUNA: inteiro Inicio . . Para LINHA de 1 ate 3 faca Para COLUNA de 1 ate 4 faca

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 24

COPIA[LINHA, COLUNA] <- Mnum[LINHA, COLUNA] FimPara FimPara . . {Ou simplesmente} . . COPIA<- Mnum; . FimAlgoritmo

Trabalhando um vetor e uma matriz ao mesmo tempo Existirão momentos em que você poderá resolver um caso que envolva uma matriz e um vetor. O primeiro passo é não ficar

preocupado e simplesmente, prestar atenção aos detalhes tais como: aproveitar ou não um índice; os elementos do vetor estão associados a linha ou a coluna da matriz? Vamos a um caso que lhe dará condições de trabalhar este novo momento.

Dado um vetor VNOMES[50] contendo nome de alunos, e uma MNOTAS[50,4] contendo as 4 notas tiradas por cada aluno nos módulos de TDL. Elaborar um algoritmo que liste na tela, o nome de cada aluno e suas respectivas médias (será do tipo aritmética). Admitamos que os dados das estruturas vetor e matriz já estejam carregadas e esta parte do Algoritmo expresse apenas uma parte do processamento.

Atente para o caso em que o primeiro aluno cujo nome é citado em VNOMES terá suas notas gravadas na primeira linha de MNOTAS. Com isso teremos o algoritmo abaixo.

Algoritmo “vet_mat” Var VNOMES : vetor [1..50] de caractere MNOTAS : vetor [1..50,1..4] de real K, j : inteiro Soma, Media :real Inicio Para k de 1 ate 50 faca Soma <- 0 Para j de 1 ate 4 faca Soma <- Soma + MNOTAS[k,j] Media <- Soma / 4 Escreval (VNOMES[k], “ – “ , Media) FimPara FimAlgoritmo

Utilizando-se de um vetor auxiliar para resolver um caso Muitas vezes nos deparamos com situações nas quais necessitamos de outras variáveis para nos auxiliar no desenvolvimento do

algoritmo (lembra da variável auxiliar que utilizamos para trocar os dados entre dois elementos do vetor / matriz?). Vamos aproveitar as estruturas anteriores e alterarmos o enunciado para solicitarmos os nomes dos alunos que possuam a média igual a maior média do grupo.

Algoritmo "notas" Var VNOMES : vetor [1..50] de caractere MNOTAS : vetor [1..50,1..4] de real K, j: inteiro VMEDIA : vetor [1..50] de real Soma, Maior :real Inicio //Preenchendo o vetor e a matriz de notas Para k de 1 ate 50 faca escreva("Informe o nome do aluno:") leia ( VNOMES[k] ) escreva("Informe as 4 notas do aluno:") Para j de 1 ate 4 faca leia ( MNOTAS[k,j] ) FimPara FimPara //Calculando a media das notas de cada aluno Para k de 1 ate 50 faca Soma <- 0 Para j de 1 ate 4 faca Soma <- Soma + MNOTAS[k,j] FimPara VMEDIA[k] <- Soma / 4 //Encontra a maior nota Se VMEDIA[k] > Maior entao Maior <- VMEDIA[k] fimse FimPara // Exibe os nomes dos alunos com a maior nota Escreval ("Aluno(s) com a maior nota") Para k de 1 ate 50 faca Se VMEDIA[k] = Maior entao Escreval (VNOMES[k]) Fimse FimPara FimAlgoritmo

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 25

U.E PROF EDGAR TITO - NOITE PROF. RANILDO LOPES DISCIPLINA: Lógica de Programação

1ª Lista de Exercícios – Proposição Composta e Conectivos Lógicos (Gabarito)

01. Sejam as proposições p: Jorge é rico e q: Carlos é feliz. Traduzir para linguagem corrente as seguintes proposições:

a) p ν ~q b) ~p → q c) q ↔ ~p; 02. Sejam as proposições p: O livro é interessante e q: O livro é de lógica. Traduzir para linguagem

corrente as seguintes proposições:

a) ~p b) p ν q c) p ∧ ~q d) ~(p ν q) e) q ↔ ~p; 03. Traduzir para a linguagem simbólica, considerando p = Josefa é rica, q = Josefa é feliz, r = Josefa

é estudante.

a) Josefa é rica ou infeliz. b) Se Josefa é estudante e rica então é estudante e feliz. c) Josefa é pobre, mas feliz. d) Josefa é pobre e infeliz. e) Josefa é pobre ou rica, mas é infeliz. f) Se Josefa é pobre então é feliz. g) Josefa é rica se e somente se não for pobre. h) Se Josefa é estudante então é rica se e somente se é feliz. i) Josefa é pobre, infeliz, estudante ou rica. j) Josefa estuda, mas é feliz se e somente não for pobre.

04. Indicar as proposições simples abaixo por letras minúsculas e traduzir as sentenças para notação

simbólica:

a) Se Janet vencer ou perder, ela estará cansada; Exemplo: p: Janet vence, q: Janet perde, t: Janet está cansada; Notação simbólica: (p ν q) → t; b) Ou vai chover ou vai nevar, mas não ambos; c) Se os preços subirem, as construções ficarão mais caras, mas se as construções não forem

caras, elas serão muitas; d) Ou Janet irá vencer ou, se perder, ficará cansada; e) Se a quantidade de água é suficiente então o crescimento das plantas é sadio;

05. Escreva fórmulas para as sentenças abaixo utilizando as seguintes proposições:

p: Paula vai à festa. q: Quincas vai à festa. r: Ricardo vai à festa. s: Sara vai à festa.

a) Paula não vai. b) Paula vai, mas Quincas não vai. c) Se Paula for, então Quincas também irá. d) Paula irá, se Quincas for. e) Paula irá se e somente se Quincas for. f) Nem Paula nem Quincas irão. g) Paula e Quincas não irão. h) Paula não irá, se Quincas for. i) Se Ricardo for, então se Paula não for, Quincas irá. j) Se nem Ricardo nem Quincas forem, então Paula irá. k) Se Ricardo ou Quincas forem, então Paula irá e Sara não irá.

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 26

l) Se Sara for, então Ricardo ou Paula irão, e se Sara não for, então Paula e Quincas irão.

Sejam as proposições p e q, traduzir para a linguagem corrente as seguintes proposições:

1. p: Está frio e q: Está Chovendo.

a) ~p b) p ^ q c) p v q d) q ↔ p e) p → ~q f) p v ~q g) ~p ^ ~q h) p ↔ ~q i) p ^ ~q → p

2. p: Jorge é rico e q: Carlos é feliz.

a) q → p b) p v ~q c) q ↔ ~p d) ~p → q e) ~~p f) ~p ^ q → p 3. p: Claudio fala inglês e q: Claudio fala alemão.

a) q v p b) p ^ q c) p ^ ~q d) ~p ^ ~q e) ~~p f) ~(~p ^ ~q) 4. p: João é gaúcho e q: Jaime é paulista.

a) ~(~p ^ ~q) b) ~~p c) ~(~p v ~q) d) p → ~q e) ~p → ~q f) ~(~q → p) Sejam as proposições p e q, traduzir para a linguagem simbólica as seguintes proposições:

5. p: Marcos é alto e q: Marcos é elegante.

a) Marcos é alto e elegante c) Não é verdade que Marcos é baixo ou elegante d) Marcos não é nem alto e nem elegante e) Marcos é alto ou é baixo e elegante f) É falso que Marcos é baixo ou que não é elegante

6. p: Suely é rica e q: Suely é feliz.

a) Suely é pobre, mas feliz b) Suely é rica ou infeliz c) Suely é pobre e infeliz d) Suely é pobre ou rica, mas infeliz

7. p: Carlos fala francês e q: Carlos fala inglês e r: Carlos fala alemão.

a) Carlos fala francês ou inglês, mas não fala alemão b) Carlos fala francês e inglês, ou não fala francês e alemão c) É falso que Carlos fala francês mas que não fala alemão d) É falso que Carlos fala inglês ou alemão mas que não fala francês

8. a) x = 0 ou x > 0 b) x ≠ 0 e y ≠ 0

c) x > 1 ou x + y > 0 d) x2 = x . x ou x0 = 1 9. a) (x + y = 0 e z > 0) ou z = 0

b) x = 0 e (y + z > x ou z = 0) c) x ≠ 0 ou (x = 0 e y < 0 e z = 0)

10. a) Se x > 0 então y = 2

b) Se x + y = 2 então z > 0 c) x = 1 ou z = 2 então y > 1 d) Se z > 5 então x ≠ 1 e x ≠ 2 e) Se x ≠ y então x + z > 5 e y + z < 5 f) Se x + y > z e z = 1 então x + y > 1 g) Se x < 2 então x = 1 ou x = 0 h) Se y = 4 e se x < y então x < 5

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 27

U.E PROF EDGAR TITO - NOITE PROF. RANILDO LOPES DISCIPLINA: Lógica de Programação

2ª Listas de Exercícios (Revisão)

1. Quais das seguintes proposições são proposições da lógica proposicional? a) Feliz Natal!= b) Márcio não é irmão de Júlio. c) Não faça isto. d) Quantos japoneses moram no Brasil? e) Parabéns! f) A maioria dos homens é fofoqueiro. g) Resolva esta questão. h) 4 × 5. i) 6 × 3 = 34. j) O quilômetro tem 100 metros. k) Talvez hoje chova. l) Alguns carros são caros.

2. Determine o valor lógico (V ou F) de cada uma das sentenças.

a) 3 > 8 e 2 + 2 = 4 b) 32 = 6 ou pi é um número racional. c) -2 > -3 , se e somente se, Aracaju é a capital da Bahia. d) Se 25 é um número primo então 25 é par. e) É falso que 3 + 4 = 4 e 2 + 2= 5.

3. Dê o valor lógico das seguintes proposições:

a. A Lua é um satélite da Terra e o planeta Vênus gira em torno da Terra. b. Uma estrela tem luz própria ou o sol é um planeta. c. Se 3 é par então 3 + 1 é impar. d. Se 3 é par então 5 é par. e. 4 + 3 = 5 se e somente se 4 = 2 + 2. f. Santos Dumont inventou o avião ou Romário descobriu o caminho para as Índias. g. Se Santos Dumont não inventou o avião então Romário descobriu o caminho para as Índias. h. Se galinha começa com h então pato começa com j. 4. Dê o valor lógico das seguintes proposições:

a. p ∧ q, se V(p) = F e V(q) = F. b. p ∨ q, se V(p) = F e V(q) = F. c. p → q, se V(p) = F e V(q) = F. d. p ↔ q, se V(p) = F e V(q) = F. e. p ∧ q, se V(p) = V e V(q) = F. f. p ∨ q, se V(p) = V e V(q) = F. g. p → q, se V(p) = V e V(q) = F. h. p ↔ q, se V(p) = V e V(q) = F I. p ∧ q, se V(p) = F e V(q) = V. j. p ∨ q, se V(p) = F e V(q) = V. k. p → q, se V(p) = F e V(q) = V. l. p ↔ q, se V(p) = F e V(q) = V. m. p ∧ q, se V(p) = V e V(q) = V. n. p ∨ q, se V(p) = V e V(q) = V. o. p → q, se V(p) = V e V(q) = V. p. ~p se V(p) = F. 5. Marque a opção incorreta:

a) Se 2 + 1 = 7 então 3 + 3 = 12. b) Se 3 + 1 = 4 então 2 + 2 = 5. c) Se 4 + 5 = 9 então 3 + 3 = 6. d) Se 1 + 1 = 9 então 2 + 2 = 4.

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 28

6. Marque a opção incorreta

a) Quem nasce em Barbacena é mineiro ou quem nasce no Rio de Janeiro é paulista. b) Quem nasce em São Paulo é mineiro ou quem nasce no Rio de Janeiro é carioca. c) Quem nasce em São Paulo é paulista ou quem nasce no Rio de Janeiro é carioca. d) Quem nasce em Barbacena é paulista ou quem nasce no Rio de Janeiro é mineiro.

7. Dê o conceito ou defina os termos: expressão, proposição, valor lógico, proposição simples e proposição composta.

8. Quais são os conectivos usados para formação de proposições compostas e quais são os símbolos

usados. 9. Dê exemplos de proposições compostas, usando cada um dos conectivos. 10. Determine o valor lógico de cada uma das seguintes proposições:

a) Santiago é a capital do México. b) Brasília é a capital do Brasil. c) Cristóvão Colombo foi o descobridor do Brasil. d) (a + b)3 = a3 + b3. e) A soma dos ângulos internos de um triângulo é 180º. f) Os lados opostos de um paralelogramo são iguais. g) 3 + 4 < 9. h) 1/3 > 1/4.

11. Considere as proposições p: Todo homem é mortal e q: Sócrates é mortal.

Represente simbolicamente as proposições:

a) Se todo homem é mortal então Sócrates é mortal. b) Todo homem é mortal ou Sócrates é mortal. c) Sócrates é mortal se e somente se todo homem é mortal. d) Todo homem é mortal ou Sócrates é mortal. e) Não é verdade que Sócrates é mortal. f) Não é verdade que (Sócrates é mortal ou todos os homens são mortais).

12. Considere as proposições p: Pedro é italiano e q: Pedro é brasileiro. Represente simbolicamente as proposições:

a) Pedro é italiano ou Pedro é brasileiro. (cuidado). b) Pedro é italiano e Pedro é brasileiro. c) Pedro é italiano e Pedro não é brasileiro. d) Não é verdade que (Pedro é italiano e Pedro não é brasileiro).

13. Sejam as proposições p: 19 é um número primo e q: 12 é um número par. Traduza em palavras as sentenças:

a) p ∧ q b) p ∨ q c) p → q d) p ∨ q e) p ↔ q f) ~( p ∧ q) g) ~p ∧ q h) ~(p ∨ q) i) ~~p j) ~(~p ∨ ~q).

EDGAR TITO - INFORMÁTICA 2015 – Prof. Ranildo Lopes 29

U.E PROF EDGAR TITO - NOITE PROF. RANILDO LOPES DISCIPLINA: Lógica de Programação

3ª Lista de Exercícios – Revisão de Conteúdos

7. Dar a negação em linguagem natural, e escrever em linguagem simbólica:

a. Se está sol, então está calor. b. Mariana é estudiosa ou não é inteligente. c. Se a rotina de comandos A é executada e a rotina B também, então executar a rotina C. d. O cinema está lotado, se o filme é bom. e. Execute o comando A e o comando B. f. Execute a rotina B se e somente se o conjunto de comandos A é executado. g. Nem a rotina A nem a rotina B são executadas. h. O robô aprende a falar e sabe conceitos musicais se, e somente se ele possuir um programa de

Inteligência Artificial.

i. Uma pessoa ama os animais e as plantas se, e somente se ela não odiar a natureza e for consciente.

j. Se maior riqueza de um homem é seu conhecimento, então vale a pena ler e estudar. 8. Sejam as proposições:

• p: O astro observado é uma Estrela.

• q: O astro observado emite luz.

• r: O astro observado é maior que a Terra.

Traduza para linguagem natural: a. p → (q ∧ r) b. (p ∧ q) ↔ r c. ~(r ∧ q) → ~p d. (~r ∧ q) → ~(r ∧ ~p) e. ~p ↔ ~(r v q) f. ((r ∨ ~r) ∧ q) → p

9. Sabe-se que:

• (p ∧ q) → r é verdadeiro

• p ↔ ~r é falso

• (p ∨ q) → r é falso

Determine o valor lógico das seguintes proposições: a. (r → p) → q b. ~(q ∨ r) ↔ ~p c. ~(~r) ↔ ((τ ∧ q) ∨ (γ ∧ p))

Obs: Simbologia utilizada para todos os exercícios desta lista: • Conjunção:∧ • Disjunção:∨ • Negação: ~ • Contradição:γ • Tautologia:τ • Condicional:→ • Bicondicional:↔ • Implicação lógica: ⇒ • Equivalência lógica:⇔ • Equivalência lógica: ≡ • Valor lógico de p: V(p) • Verdadeiro: V • Falso: F