Baixe o app para aproveitar ainda mais
Prévia do material em texto
Algoritmos - Notas de Aula Ricardo Vargas Dorneles 9 de dezembro de 2016 1 / 421 Comando condicional Comandos de Repetição Vetores Vetores Lista de tópicos de vetores Lista Vetores 2 / 421 Ementa Construção de soluções algorítmicas para problemas numéricos simples e problemas envolvendo entrada e saída de dados. Utilização de rotinas de manipulação de variáveis. Implementação de algoritmos para realização de operações sobre conjuntos e de pesquisa e ordenação de dados. 3 / 421 Objetivo Proporcionar condições de ensino-aprendizagem para que o aluno seja capaz de analisar problemas, formular soluções algorítmicas estruturadas que possam ser executadas pelo computador. Implementar algoritmos simples utilizando uma linguagem de programação em português estruturado. 4 / 421 Conteúdo Programado 1 Introdução 1 1.1.Linguagens de programação de alto nível 2 1.2.Etapas no processo de elaboração e execução de programas 2 2. Introdução à programação estruturada com a construção de soluções algorítmicas para: 1 2.1.Cálculo de expressões aritméticas simples 2 2.2.Problemas numéricos simples 3 2.3.Entrada e saída de dados 4 2.4.Classificação usando variáveis simples e operadores relacionais 5 2.5.Processamento de uma ou mais entradas gerando uma ou mais saídas 6 2.6.Cálculo de médias e do desvio padrão 7 2.7.Técnicas de verificação de algoritmos (teste de mesa ou simulação de algoritmos) 5 / 421 Conteúdo Programado 1 3. Manipulação de variáveis 1 3.1.Auxiliares 2 3.2.Temporárias 3 3.3.Contadoras 4 3.4.Acumuladoras 5 3.5.Sinalizadoras 6 3.6.Totalizadoras 6 / 421 Conteúdo Programado 1 4. Algoritmos de operações com conjuntos 1 4.1.Operações básicas 2 5. Algoritmos de Ordenação e Pesquisa 1 5.1.Método bolha (bubble sort) 2 5.2.Método de seleção 3 5.3.Inserção ordenada 4 5.4.Fusão ordenada 5 5.5.Busca linear 6 5.6.Busca binária 7 / 421 Metodologia A disciplina deve ser desenvolvida através de exposições/discussões teóricas que serão realizadas em função das atividades relacionadas aos conteúdos abordados. Implementação de soluções para problemas específicos priorizando a busca de soluções algorítmicas para classes de problemas tradicionais da computação. As soluções algorítmicas devem ser expressas em uma linguagem na forma "português estruturado"para que sejam trabalhados igualmente aspectos sintáticos e semânticos dos comandos da linguagem. 8 / 421 Metodologia A disciplina deve ser desenvolvida em sala de aula convencional, permitindo que os alunos resolvam os problemas propostos, testando e comparando soluções. A disciplina deverá dispor de uma home-page com a função de organizar o trabalho a ser desenvolvido. Os alunos deverão ainda ter acesso a um ambiente virtual através do qual lhes serão disponibilizados recursos para aprendizagem , assim como recursos de comunicação com professores e alunos, para tratar de temas e problemas de interesse comum. 9 / 421 Avaliação Os resultados da avaliação deverão retro-alimentar o processo de ensino-aprendizagem. O sistema de avaliação compreende três avaliações parciais provas sobre o conteúdo programático, das quais é obtida a média de aproveitamento do aluno quanto aos objetivos propostos. Serão atribuídos pesos diferenciados para cada uma das provas, sendo que para a primeira prova será atribuído peso 1 (um), para a segunda prova será atribuído peso 2 (dois) e para a terceira prova será atribuído peso 3 (três). 10 / 421 Avaliação O resultado da avaliação será calculado de acordo com as regras estabelecidas pela unidade responsável pela oferta do curso, bem como a forma de recuperação da avaliação. Será considerado aprovado o aluno que alcançar 60% dos resultados das avaliações e tiver freqüência igual ou superior a 75% das aulas. A nota final do aluno será expressa segundo as normas regimentais da Instituição. 11 / 421 O cálculo da média final é feito pela média harmônica ponderada das três provas, ou seja: M.H. = 6 1 P 1 + 2 P 2 + 3 P 3 Alunos que não atingirem média 6 podem recuperar uma das provas ao final do semestre. 12 / 421 Bibliografia Básica FAR 89 FARRER, H. et al. Algoritmos Estruturados. Rio de Janeiro: Editora Guanabara, 1999. Cor 04 CORMEN, Thomas H.. Algoritmos: teoria e prática. Rio de Janeiro: Elsevier, 2004. 13 / 421 Bibliografia Complementar SCH 84 SCHEID, F. Computadores e Programação. São Paulo: McGraw-Hill, 1984. SIL 82 SILVA, H.V.R.C.; BARANAUSKAS, M.C.C.; DIAS, S.V. Introdução a Programação de Computadores. Rio de Janeiro: Campus, 1982. TRE83 TREMBLAY, J.; BUNT, R.B. Ciência dos Computadores - Uma abordagem algorítmica. São Paulo: McGraw-Hill, 1983. SAL 98 SALVETTI, D.D.; BARBOSA, M.B. Algoritmos. São Paulo: Makron Books, 1998. ORT 02 ORTH, A.I. Algoritmos. Porto Alegre: Ciência dos Computadores, 2002. 14 / 421 Bibliografia online Curso de 15 Vídeo-aulas de Gustavo Guanabara disponíveis no Youtube Procurar por "Gustavo Guanabara Algoritmos" 15 / 421 Algoritmo Definição Um algoritmo é uma lista ordenada de comandos que, quando executados, resultam em uma sequencia de ações, que visam resolver um determinado problema. Ex:???? 16 / 421 Algoritmo n. 1 Um amigo vai viajar na Rota do Sol e está com medo de que fure um pneu. Ajude o seu amigo escrevendo um algoritmo com todos os passos para trocar o pneu de um carro. Considere que: Ele não tem experiência nenhuma em troca de pneus, mas sabe ler instruções e conhece razoavelmente a língua portuguesa. É uma pessoa normal, sabe que para sair do carro precisa abrir a porta e soltar o cinto :-) Não tem muita experiência em direção e estará nervoso. 17 / 421 Nessa disciplina os algoritmos vistos serão algoritmos computacionais, a serem executados por um computador. A um conjunto de comandos que pode ser executado por um computador chamamos de "Linguagem de Programação". Exs:????? (uma consulta ao Google "Quantas linguagens de programação existem"mostrará que existem centenas) 18 / 421 Ao conjunto de regras que definem os comandos válidos em uma linguagem (de programação ou não) chamamos de sintaxe da linguagem. Sintaxe : é a parte da gramática que estuda a disposição das palavras na frase e a das frases no discurso, bem como a relação lógica das frases entre si. Aplica-se a linguagens naturais, como a língua portuguesa (lembram da análise sintática?) Aplica-se a linguagens de programação 19 / 421 Nessa disciplina, todos os nossos algoritmos serão escritos em uma linguagem chamada Português Estruturado, que é uma tradução direta de uma linguagem chamada Pascal. Todos os algoritmos nessa linguagem tem o formato: Algoritmo Declarações Inicio Comandos Fimalgoritmo 20 / 421 Programador x Usuário 21 / 421 Estudo de Caso: O algoritmo Soma2 O objetivo do algoritmo soma2 é que o usuário digite 2 números no teclado e o algoritmo deve exibir na tela a soma dos 2 números. Um possível diálogo entre o algoritmo e o usuário seria: (computador) - Digite o primeiro número (usuário) 7 (computador) - Digite o segundo número (usuário) 4 (computador) - A soma é 11 22 / 421 Para a construção de qualquer tipo de algoritmo, é necessário seguir estes passos: 1 Compreender completamente o problema a ser resolvido, destacando os pontos mais importantes e os objetos que o compõem. 2 Definir os dados de entrada, ou seja, quais dados serão fornecidos e quais objetos fazem parte desse cenário-problema. 3 Definir o processamento, ou seja,quais cálculos serão efetuados e quais as restrições para esses cálculos. O processamento é responsável pela transformação dos dados de entrada em dados de saída. Além disso, deve-se verificar quais objetos são responsáveis pelas atividades. 4 Definir os dados de saída, ou seja, quais dados serão gerados depois do processamento. 5 Construir o algoritmo utilizando um formalismo conhecido. 6 Testar o algoritmo realizando simulações. 23 / 421 Comando de Escrita A primeira ação do computador deve ser emitir para a tela a mensagem "Digite o primeiro número". Para isso é utilizado o comando de escrita. O comando de escrita é utilizado para o algoritmo enviar mensagens para a tela. Essas mensagens podem ser mensagens solicitando dados ao usuário ou resultados do processamento. Seu formato é: Escreva (lista de mensagens) onde as mensagens da lista são separadas por vírgula, e cada mensagem é uma sequência de quaisquer caracteres delimitadas por � �. 24 / 421 Escreval Ex: Escreva("Bom","Dia") Ao terminar de executar o comando Escreva, o cursor ficará imediatamente após o último caracter escrito. Alternativamente, o comando Escreval(lista de mensagens ) escreve uma lista de mensagens e posiciona o cursor na primeira coluna da linha seguinte. 25 / 421 Variáveis São os elementos de armazenamento de dados em um programa. Uma variável corresponde fisicamente a uma posição de memória do computador. Ela contem sempre um (1) valor. Ao receber um novo valor, o valor anterior é substituído. Uma variável é identificada por um nome, chamado identificador da variável. Um identificador de variável deve iniciar por letra e só pode conter letras, dígitos e o caracter "sublinha". E não pode conter caracteres acentuados ou cedilha. E não pode ser nenhuma palavra reservada da linguagem (p.ex. Escreva, algoritmo, inicio, fimalgoritmo...) 26 / 421 Uma variável pode ser vista como uma caixinha identificada por um nome e que pode armazenar valores de um tipo definido (por exemplo: inteiro ou real) 27 / 421 Comando de Atribuição O comando utilizado para alterar o valor de uma variável chama-se comando de atribuição e tem o formato: variável <- expressão (leia-se "variável RECEBE expressão") Ex: a <- 1 a <- a+1 a <- a+b Na atribuição, quando uma variável recebe uma expressão, o valor da expressão é calculado e o resultado é atribuído à variável. Ao utilizar constantes reais em expressões, o ponto (.) é utilizado como separador das casas decimais (ex: 3.14) 28 / 421 Em um algoritmo que contenha as variáveis a, b, c e d, após a sequência de atribuições a seguir: a <- 1 b <- 2 c <- 3 as variáveis terão os seguintes valores (o "?"em d significa que d ainda não tem um valor definido ou, em outras palavras, contem "lixo"): 29 / 421 Ex: O que será escrito pelo trecho de código abaixo? a <- 1 b <- 2 a <- a+b b <- a+b a <- a+b b <- a+b a <- a+b b <- a+b escreva (a,b) A lista de elementos do comando de escrita pode conter variáveis e expressões. Nesse caso, é escrito o conteúdo da variável ou, no caso da expressão, o valor resultante do cálculo da expressão. 30 / 421 Teste de Mesa O teste de mesa simula a execução de um algoritmo sem utilizar o computador,empregando apenas "papel e caneta"(ou melhor, sem utilizar um computador). Passos para realizar o teste de mesa: Identifique as variáveis envolvidas em seu algoritmo; Crie uma tabela com uma coluna para cada uma das variáveis do algoritmo; Crie também uma coluna para o que será escrito pelo algoritmo ao ser executado um comando de escrita 31 / 421 Situação inicial Inicialmente nenhuma das variáveis possui um valor conhecido. Isso pode ser representado por um "?" a <- 1 b <- 2 a <- a+b b <- a+b a <- a+b b <- a+b a <- a+b b <- a+b escreva (a,b) a b escritas ? ? 32 / 421 Simule a execução do algoritmo, passo a passo, a partir da primeira instrução. A cada comando de leitura a variável que recebe o valor lido deve ser atualizada na tabela A cada comando de atribuição, a variável que recebe a expressão é atualizada na tabela A cada comando de escrita, o valor escrito pelo comando é colocado na coluna das escritas O valor corrente da variável é representado pelo último valor (mais embaixo) da coluna correspondente; 33 / 421 Primeira instrução a <- 1 b <- 2 a <- a+b b <- a+b a <- a+b b <- a+b a <- a+b b <- a+b escreva (a,b) a b escritas ? ? 1 34 / 421 Segunda instrução a <- 1 b <- 2 a <- a+b b <- a+b a <- a+b b <- a+b a <- a+b b <- a+b escreva (a,b) a b escritas ? ? 1 2 35 / 421 Terceira instrução a <- 1 b <- 2 a <- a+b b <- a+b a <- a+b b <- a+b a <- a+b b <- a+b escreva (a,b) a b escritas ? ? 1 2 3 36 / 421 Quarta instrução a <- 1 b <- 2 a <- a+b b <- a+b a <- a+b b <- a+b a <- a+b b <- a+b escreva (a,b) a b escritas ? ? 1 2 3 5 37 / 421 Quinta instrução a <- 1 b <- 2 a <- a+b b <- a+b a <- a+b b <- a+b a <- a+b b <- a+b escreva (a,b) a b escritas ? ? 1 2 3 5 8 38 / 421 Final da simulação a <- 1 b <- 2 a <- a+b b <- a+b a <- a+b b <- a+b a <- a+b b <- a+b escreva (a,b) a b escritas ? ? 1 2 3 5 8 13 21 34 2134 39 / 421 O valor escrito foi 2134 porque não há separação entre o a e b O comando de escrita deve explicitamente identificar o que será escrito entre as variáveis Ex: Escreva(a," ",b) // escreverá um espaço em branco entre a e b Escreva(a,",",b) // escreverá uma vírgula entre a e b É importante executar TODOS os comandos, atualizando a tabela a cada comando, sem pular nenhum. Se um comando não for executado, o resultado obtido provavelmente estará errado. A simulação deve refletir o que o algoritmo realmente faz, e não aquilo que o programador espera que ele faça 40 / 421 Declaração de variáveis Para que uma variável seja utilizada em um algoritmo é necessário que ela seja declarada no início do mesmo. O formato de uma declaração é: Var <lista de declarações> onde cada declaração tem o formato lista de variáveis : tipo onde tipo pode ser inteiro ou real. Ex: Var a,b,c:inteiro x,y:real 41 / 421 Comando de Leitura É utilizado para o algoritmo receber dados pelo teclado. Seu formato é: Leia (lista de variáveis) Ex: Leia (valor1, valor2, valor3) Ao executar esse comando, o algoritmo espera o usuário digitar 3 valores, e armazena o primeiro em valor1, o segundo em valor2 e o terceiro em valor3. 42 / 421 Assim: o algoritmo Soma2 pode ser completado: Algoritmo var a,b,soma:inteiro inicio escreval("Digite um valor") leia(a) escreval("Digite outro valor") leia(b) soma <- a + b escreval("A soma é ",soma) escreval("Tenha um bom dia!!!") fimalgoritmo 43 / 421 Exercícios Faça um algoritmo que leia as 3 notas de um aluno (valores reais) e calcule e escreva sua média aritmética. Obs: A média aritmética de 3 valores a, b e c é dada por a+b+c 3 Faça um algoritmo que leia as 3 notas de um aluno (valores reais) e calcule e escreva sua média harmônica ponderada com pesos 1, 2 e 3 (expressão abaixo): MH = 6 1 N 1 + 2 N 2 + 3 N 3 44 / 421 Exercícios(2) O coeficiente angular (inclinação) da reta que liga dois pontos dados pelas coordenadas (x 1 ,y 1 ) e (x 2 ,y 2 ) é dado por y 2 −y 1 x 2 −x 1 . Faça um algoritmoque leias as coordenadas x e y de dois pontos A e B (na ordem x a , y a , x b , y b ) e calcule e escreva o coeficiente angular entre os pontos a e b. 45 / 421 Baixe do UCS Virtual / Acervo da Turma o programa vposeidon.jar (está sob o nome "Portal de Algoritmos") Execute-o 46 / 421 Portal de Algoritmos - Versão Desktop 47 / 421 1 Editar, na janela da esquerda (editor de algoritmos) o algoritmo a seguir: Algoritmo var a,b,soma:inteiro inicio escreval("Digite um valor") leia(a) escreval("Digite outro valor") leia(b) soma <- a + b escreval("A soma é ",soma) escreval("Tenha um bom dia!!!") fimalgoritmo 48 / 421 Algoritmo digitado 49 / 421 1 Executar o algoritmo digitado (botão "Executar"em cima à esquerda) diversas vezes, testando com as opções linha-a-linha e leia aleatório selecionados. 50 / 421 1 Executar através do botão Passo-a-Passo. 2 Durante a execução passo a passo examinar o conteúdo das variáveis na aba "Variáveis/Computação"(abaixo) 51 / 421 1 Executar através do botão Passo-a-Passo. 2 Durante a execução passo a passo examinar o conteúdo das variáveis na aba "Variáveis/Computação"(abaixo) 52 / 421 Funcionalidades do Ambiente de Algoritmos Além dos recursos apresentados (edição e execução de algoritmos) o ambiente apresentado possui os seguintes recursos: Uma lista de aproximadamente 300 problemas cobrindo todo o conteúdo de algoritmos da disciplina; Um mecanismo de verificação automática da correção das soluções para os problemas da lista; Possibilidade de armazenar todas as soluções dos usuários em um servidor, possibilitando o acesso às mesmas de qualquer computador dentro ou fora da UCS; Mecanismo de avaliação do custo de execução de uma solução; "Ranking"dos usuários que resolveram corretamente a maior quantidade de problemas em cada categoria. 53 / 421 "Ranking"dos usuários com mais exercícios resolvidos Para acessar selecione no menu "Estatísticas"a opção Top5 54 / 421 Cadastro de usuário Para utilizar as funcionalidades descritas, é necessário efetuar um cadastro no servidor do ambiente Sugere-se que utilize-se o mesmo login, email e senha do ucs virtual, mas não é indispensável, mas o login, senha e email só podem conter letras e dígitos O cadastro é efetuado através do menu Usuário mostrado abaixo: 55 / 421 Banco de Problemas Após efetuar o cadastro, logar-se no ambiente e selecionar qual categoria de problemas será trabalhada. Isso é feito na caixinha de seleção "Tipo de Algoritmo"mostrada abaixo. A lista de problemas é dividida em 8 categorias de problemas, de acordo com os comandos necessários para resolvê-los. Inicialmente trabalharemos com os problemas da categoria "Sequenciais". 56 / 421 Seleção de Problema Após selecionada a categoria, selecionar o problema a ser trabalhado na lista de problemas. O enunciado do problema irá aparecer na caixinha "Problema Selecionado". 57 / 421 Seleção da solução a ser trabalhada Um usuário pode manter no servidor várias soluções para um mesmo problema. Isso pode ser útil para poder comparar desempenhos de algoritmos diferentes para o mesmo problema. Após selecionar o problema a ser trabalhado, o usuário pode iniciar uma nova solução a partir de um algoritmo vazio, ou carregar alguma solução já existente para o editor de algoritmos. A seleção de uma solução já existente é feita na caixa de seleção "Soluções". 58 / 421 Criação de uma solução para um problema novo Se o problema selecionado ainda não possui uma solução ou deseja-se criar uma solução nova, deve-se seguir os seguintes passos: a) Criar uma solução vazia para o problema (Botão "Criar Solução"embaixo, à direita). b) A solução criada irá aparecer na lista de soluções do usuário, abaixo. c) Selecionar a solução recém criada na lista de soluções, carregá-la para o editor (botão "Carregar") e editar a solução do problema na janela de edição de algoritmos. Obs: Os dados de teste para a validação do problema só serão carregados ao ser clicado o botão "Carregar". 59 / 421 Salvamento de uma solução O salvamento de uma solução no servidor só é habilitado quando ela está associada a algum problema da lista. O salvamento pode ser feito a qualquer momento durante a edição, mesmo que a solução não esteja completa ou que não funcione. 60 / 421 Salvamento de uma solução O salvamento de uma solução no servidor só é habilitado quando ela está associada a algum problema da lista. O salvamento pode ser feito a qualquer momento durante a edição, mesmo que a solução não esteja completa ou que não funcione. 61 / 421 Cálculo do Custo de uma solução No cálculo do custo são contabilizadas todas as operações aritméticas, atribuições, escritas, leituras, testes e desvios efetuados pelo algoritmo. No exemplo abaixo as 8 operações executadas são: 1) Escrita de uma mensagem 2) Salto de linha na escrita 3) Uma leitura 4) Cálculo de uma multiplicação 5) Uma atribuição 6) Escrita de uma mensagem 7) Escrita de uma variável 8) Salto de linha na escrita 62 / 421 Validação de uma solução Na validação de uma solução, ela é executada para diversos conjuntos de dados, que buscam testar se o algoritmo funciona em diferentes situações. Se o algoritmo não gerar o resultado esperado para algum dos conjuntos de dados previstos, será emitida uma mensagem de erro. O algoritmo abaixo funciona somente para a=1 e o erro será identificado quando o algoritmo tentar escrever o resultado (errado) gerado. 63 / 421 Validação de uma solução Na validação de uma solução, se o algoritmo testado gerar a resposta correta para todos os dados de teste, será mostrada a mensagem "Executou corretamente todas as instâncias" Nesse caso o custo total das diversas execuções será mostrado imediatamente abaixo da tela de edição à esquerda. 64 / 421 Alternativa B - Visualg O Visualg é um ambiente de edição e execução de algoritmos produzido pela Apoio Informática. É um programa de livre uso e distribuição e não é necessário efetuar uma instalação no computador, podendo ser usado mesmo a partir de um pen drive. Ao contrário do vposeidon ele permite o salvamento dos algoritmos em disco e permite a importação/exportação (ctrl-c/ctrl-v) de trechos de algoritmos. O executável do VisuAlg pode ser baixado em http://www.apoioinformatica.inf.br/produtos/visualg 65 / 421 Visualg 66 / 421 Visualg: vantagens e desvantagens (em relação ao vposeidon) Vantagem: Não é necessário ter Java instalado no computador Desvantagens (de modo geral, devidas a não estar ligado a servidor): Os algoritmos a serem trabalhados devem estar na máquina que está sendo usada (ou carregados em um pendrive) Não possui um mecanismo de validação automática da correção dos problemas Os comandos que contém erro são identificados somente na hora da execução Há alguns erros na linguagem utilizada 67 / 421 Visualg Para executar um algoritmo, basta digitá-lo na janela de edição e executá-lo clicando no ícone correspondente: 68 / 421 S00000050 - Faça um algoritmo que leia um valor N, representando o lado de um quadrado, e calcule e escreva a área do quadrado. algoritmo "S001_S00000050" var N,area:inteiro inicio Escreval("Digite o valor do lado") leia (N) area<-n*n escreval("A area é ",area) fimalgoritmo 69 / 421 S00000100 - Faça um algoritmo que leia dois valores inteiros e escreva a sua soma. algoritmo "S001_S00000100" var a,b,soma:real inicio escreva("Digite dois valores:") leia(a,b) soma < − a+b escreva("A soma é ",soma)fimalgoritmo 70 / 421 S00000150 - Faça um algoritmo que leia 3 valores reais, notas de um aluno, e escreva sua média aritmética. A média aritmética de um conjunto de valores é dada pela soma dos valores dividido pela quantidade de valores considerados. algoritmo "S002_S00000150" var a,b,c,media:real inicio leia(a,b,c) media<-(a+b+c)/3 escreva("a média é ",media) fimalgoritmo 71 / 421 S00000200 - Faça um algoritmo que leia 2 valores reais v1 e v2 e calcule e escreva a área do triângulo que tem base igual a v1 e altura igual a v2. Dica:A área de um triângulo é dada pela expressão: (base x altura)/2 72 / 421 S00000220 - O produto escalar A.B de dois vetores A=[a1,a2,a3...] e B=[b1,b2,b3...] é dado pelo somatório a1*b1+a2*b2+a3*b3+... Faça um algoritmo que leia as coordenadas ax,ay,az,bx,by,bz de dois vetores no espaço tridimensional e calcule e escreva seu produto escalar. a l g o r i tmo "S001_S00000220" va r ax , ay , az , bx , by , bz : r e a l i n i c i o l e i a ( ax , ay , az , bx , by , bz ) e s c r e v a ( ax∗bx+ay∗by+az∗bz ) f ima l g o r i tmo 73 / 421 Expressões: Podem ser aritméticas, lógicas ou literais. Consistem da aplicação de operadores sobre operandos resultando em valores. Os operadores podem ser: Aritméticos : são aplicados a operandos numéricos e resultam em valores numéricos. Os operadores aritméticos suportados pelo AlgoUCS são o seguintes: 74 / 421 Operação Operador Prioridade Associatividade Tipo de valor retornado Troca de Sinal - 1 <- o mesmo do operando Potenciação � 2 <- se algum operando é real, resulta real, caso contrário resulta inteiro Multiplicação * 3 -> idem à potenciação Divisão / 3 -> real Quociente da divisão inteira \ 3 -> inteiro Resto da divisão inteira % 3 -> inteiro Soma + 4 -> idem à potenciação Subtração - 4 -> idem à potenciação Observações: O operador de troca de sinal é o único operador de apenas um operando Os operadores de quociente e resto de divisão inteira só são aplicáveis a operandos inteiros 75 / 421 Observações: 1 Operadores da mesma prioridade são avaliados pela sua associatividade, normalmente da esquerda para a direita, com exceção da potenciação e troca de sinal, que são avaliadas da direita para a esquerda. 2 Parênteses podem ser utilizados para alterar a ordem de avaliação dos operadores. 3 Radiciação pode ser obtida com o operador de potenciação. 76 / 421 A distância entre dois pontos definidos pelas coordenadas (x 1 , y 1 ) e (x 2 , y 2 ) no plano cartesiano é dada por:√ (x 1 − x 2 )2 + (y 1 − y 2 )2 Escreva a expressão correspondente de acordo com as regras e operadores utilizados em português estruturado: As raízes da equação ax 2 + bx + c = 0 podem ser calculadas pela fórmula de Baskhara a seguir: −b ±√b2 − 4ac 2a Escreva a expressão correspondente de acordo com as regras e operadores utilizados em português estruturado: 77 / 421 1 Escreva as expressões correspondentes na nossa linguagem à expressão da fórmula de Baskhara. 2 Entre com o Firefox em http://vposeidon9.ucs.br e logue-se com seu usuário (quem não veio à aula anterior e ainda não tem usuário, execute as orientações da aula anterior). 3 Resolva os exercícios 300 e 900. 78 / 421 S00000300 - Faça um algoritmo que leia 3 valores a, b e c, coeficientes de uma equação de segundo grau, e calcule e escreva a soma das raízes da equação. Dica:As raízes de uma equação podem ser calculadas pela fórmula de Baskhara. a l g o r i tmo va r a , b , c , d e l t a , x1 , x2 : r e a l i n i c i o l e i a ( a , b , c ) d e l t a <−r a i z q ( b^2−4∗a∗c ) x1<−(−b+d e l t a )/(2∗ a ) x2<−(−b−d e l t a )/(2∗ a ) e s c r e v a ( x1+x2 ) f ima l g o r i tmo 79 / 421 S00000350 - Faça um algoritmo que leia 3 valores a, b e c, coeficientes de uma equação de segundo grau, e calcule e escreva o produto (multiplicação) das raízes da equação. Dica:As raízes de uma equação podem ser calculadas pela fórmula de Baskhara. a l g o r i tmo va r a , b , c , d e l t a , x1 , x2 : r e a l i n i c i o l e i a ( a , b , c ) d e l t a <−r a i z q ( b^2−4∗a∗c ) x1<−(−b+d e l t a )/(2∗ a ) x2<−(−b−d e l t a )/(2∗ a ) e s c r e v a ( x1∗x2 ) f ima l g o r i tmo 80 / 421 Funções raizq( ) e abs( ) Além dos operadores aritméticos, também podem ser utilizadas em expressões as funções raizq( ), que calcula a raiz quadrada de um valor, e a função abs( ) que calcula o valor absoluto (módulo) de um valor. Uma chamada de função pode ser colocada em qualquer lugar da expressão onde iria um operando. Ex: a <- raizq (b� 2-4*a*c) b <- a + abs(x-y) Resolver os exercícios 400, 500 e 600 do portal. 81 / 421 S00000210 - O produto vetorial AxB de dois vetores A=[ax,ay] e B=[bx,by] é um vetor perpendicular ao plano formado pelos vetores A e B, de módulo igual a |ax*by-ay*bx|. Faça um algoritmo que leia as componentes ax,ay,bx e by dos vetores A e B, e calcule e escreva o módulo do vetor resultante do produto vetorial. a l g o r i tmo va r ax , ay , bx , by : r e a l i n i c i o l e i a ( ax , ay , bx , by ) e s c r e v a ( abs ( ax∗by−ay∗bx ) ) f ima l g o r i tmo 82 / 421 S00000400 - Faça um algoritmo que leia 2 valores e escreva o maior deles. Dica:O maior entre dois valores quaisquer v 1 e v 2 pode ser calculado pela expressão v 1 +v 2 +|v 1 −v 2 | 2 . O operador matemático de módulo ( |x| ) é representado na nossa linguagem pela função abs(x) algoritmo var a,b,valor:real inicio escreva ("digite 2 valores") leia (a,b) valor < − (a+b+abs(a-b))/2 escreva ("o maior número é",valor) fimalgoritmo 83 / 421 S00000500 - Faça um algoritmo que leia 2 valores e escreva o menor deles. Dica:O menor entre dois valores pode ser obtido a partir do maior valor e da soma dos dois (por exemplo: Se a soma de dois valores é 15 e o valor do maior é 10, como pode ser calculado o valor do menor?). algoritmo var a,b,menor:real inicio leia(a,b) maior< −(a+b+abs(a-b))/2 menor< −a+b-maior escreva(menor) fimalgoritmo 84 / 421 S00000600 - Faça um algoritmo que leia 3 valores escreva o maior deles. Dica:O maior entre três valores pode ser encontrado pela aplicação repetida da expressão para encontrar o maior entre dois valores. 85 / 421 algoritmo var a,b,c,valor:real inicio escreva ("digite 3 valores") leia (a,b,c) valor < − (a+b+abs(a-b))/2 valor < − (valor+c+abs(valor-c))/2 escreva ("o maior número é",valor) fimalgoritmo 86 / 421 S00000900 - Faça um algoritmo que lê 3 valores, lados de um triângulo, e calcule e escreva a área do triângulo formado. Dica: A área de um triângulo de lados l 1 , l 2 e l 3 pode ser calculada pela expressão Area = √ S ∗ (S − l 1 ) ∗ (S − l 2 ) ∗ (S − l 3 ) onde S é o semi-perímetro, ou seja, a metade da soma dos lados. 87 / 421 algoritmo "S001_S00000900" var a,b,c,s,area:real inicio leia(a,b,c) s<-(a+b+c)/2 area<-raizq(s*(s-a)*(s-b)*(s-c)) escreva(area) fimalgoritmo 88 / 421 Operadores de divisão inteira São utilizados para divisões entre valores inteiros, que devem resultar em um quociente inteiro e um resto inteiro. Os operadores são o de quociente inteiro, representado pela contrabarra (\) e o de resto inteiro, representado pelo percentual (%). Os operadores são independentes um do outro, pode-se querer calcular só o resto ou só o quociente. Se for necessário calcular os dois (o resto e o quociente), deve-se executar dois comandos, um para o cálculo do resto e um para o cálculo do quociente.Ex: b <- 378 a <- b \ 100 nesse comando a variável a recebe 3 c <- b % 100 e c recebe 78 Resolva os exercícios 700, 800 e 1000 do portal. 89 / 421 S00000700 - Faça um algoritmo que lê um valor inteiro em reais e calcula e escreve qual o menor número possível de notas de 100,50,20,10,5,2 e 1 real em que o valor pode ser decomposto. Dica:Isso pode ser calculado a partir de operações de divisão inteira. l e i a ( v a l o r ) Notas100 <− v a l o r \ 100 v a l o r <− v a l o r % 100 Notas50 <− v a l o r \50 v a l o r <− v a l o r %50 . . . 90 / 421 S00000800 - Faça um algoritmo que lê uma quantia inteira em segundos e escreva o número de horas, minutos e segundos correspondente. Dica:Pode-se converter segundos para minutos usando-se a divisão inteira por 60. Ou pode-se converter segundos para horas usando-se a divisão por 3600. 91 / 421 S00001000 - Faça um algoritmo que le um valor entre 0 e 9999 e calcula a soma dos seus dígitos. Dica: O dígito menos significativo de um número inteiro pode ser obtido pelo resto da divisão do número por 10. Os dígitos restantes podem ser obtidos pela divisão inteira por 10. 92 / 421 Ex: Separação de dígitos l e i a ( v a l o r ) m i l h a r <− v a l o r \ 1000 93 / 421 Ex: Separação de dígitos l e i a ( v a l o r ) m i l h a r <− v a l o r \ 1000 v a l o r <− v a l o r % 1000 94 / 421 Ex: Separação de dígitos l e i a ( v a l o r ) m i l h a r <− v a l o r \ 1000 v a l o r <− v a l o r % 1000 centena <− v a l o r \ 100 95 / 421 Ex: Separação de dígitos l e i a ( v a l o r ) m i l h a r <− v a l o r \ 1000 v a l o r <− v a l o r % 1000 centena <− v a l o r \ 100 v a l o r <− v a l o r % 100 96 / 421 Ex: Separação de dígitos l e i a ( v a l o r ) m i l h a r <− v a l o r \ 1000 v a l o r <− v a l o r % 1000 centena <− v a l o r \ 100 v a l o r <− v a l o r % 100 dezena <− v a l o r \ 10 97 / 421 Ex: Separação de dígitos l e i a ( v a l o r ) m i l h a r <− v a l o r \ 1000 v a l o r <− v a l o r % 1000 centena <− v a l o r \ 100 v a l o r <− v a l o r % 100 dezena <− v a l o r \ 10 un idade <− v a l o r % 10 98 / 421 Ex: Separação de dígitos (b) l e i a ( v a l o r ) un idade <− v a l o r % 10 v a l o r <− v a l o r \ 10 dezena <− v a l o r % 10 v a l o r <− v a l o r \ 10 centena <− v a l o r % 10 m i l h a r <− v a l o r \ 10 99 / 421 S00001200 - Faça um algoritmo que leia 4 valores, Hi, Mi, Hf, Mf, representando respectivamente a hora e minuto inicial e final de um evento, e calcule a duração do mesmo em horas e minutos. Considere que o evento inicia e termina no mesmo dia. Dica: Para simplificar o problema, converta cada par de valores em um único valor em minutos. algoritmo "S001_S00001200" var hi,mi,hf,mf,dh,dm,d:inteiro inicio leia(hi,mi,hf,mf) d<-hf*60+mf-hi*60-mi dh<-d\60 dm<-d % 60 escreva(dh,"horas e ",dm,"minutos") fimalgoritmo 100 / 421 S00001300 - Faça um algoritmo que leia dois horários (hora, minuto e segundo) e escreva quantos segundos transcorreram entre esses dois horários. algoritmo "S001_S00001300" var hi,mi,si,hf,mf,sf:inteiro inicio leia(hi,mi,si,hf,mf,sf) escreva(hf*3600+mf*60+sf-(hi*3600+mi*60+si)) fimalgoritmo 101 / 421 S00001350 - Faça um algoritmo que leia um horário (hora, minuto e segundo) e escreva o horário correspondente ao segundo seguinte. Ex: se for lido, 17,21,36 escrever 17,21,37. Considere que os horários (lido e escrito) estão na faixa de 00:00:00 a 23:59:59. a l g o r i tmo va r h ,m, s : i n t e i r o i n i c i o l e i a (h ,m, s ) s<−3600∗h+60∗m+s+1 h<−(s \3600)%24 m<−s%3600\60 s<−s%60 e s c r e v a (h ,m, s ) f ima l g o r i tmo 102 / 421 S00001400 - Faça um algoritmo que a partir de um horário (hora, minuto, segundo) e uma quantidade de segundos transcorridos, calcule o segundo horário. a l g o r i tmo "S001_S00001400" va r h ,m, s , s t : i n t e i r o i n i c i o l e i a (h ,m, s , s t ) s<−s+s t m<−m+s \60 s<−s%60 h<−h+m\60 m<−m%60 e s c r e v a (h ,m, s ) f ima l g o r i tmo 103 / 421 S00001500 - Faça um algoritmo que leia a quantidade de alunos em uma sala de aula e a quantidade de alunos por grupo, e calcule e escreva quantos grupos serão formados e o resto de alunos que não foram suficientes para formar mais um grupo. a l g o r i tmo "S001_S00001500" va r N, Ag , g , r : i n t e i r o i n i c i o l e i a (N, Ag) g<−N\Ag r<−N%Ag e s c r e v a ( g , r ) f ima l g o r i tmo 104 / 421 S00001650 - Faça um algoritmo que leia um número de 10 dígitos e rotacione os dígitos uma posição para a esquerda, de modo que o primeiro dígito passe a ocupar a última posição. Ex: 1234561234 deve gerar 2345612341 (todos os dígitos foram uma posição para a esquerda e o 1 da primeira posição passou a ocupar a última posição). a l g o r i tmo "S001_S00001650" va r a : i n t e i r o i n i c i o l e i a ( a ) e s c r e v a ( a%1000000000∗10+a \1000000000) f ima l g o r i tmo 105 / 421 S00001700 - Faça um algoritmo que leia 5 números inteiros e escreva a quantidade deles que são pares. Dica:Um número é par se o resto da sua divisão por 2 é zero. a l g o r i tmo "S001_S00001700" va r a , b , c , d , f : i n t e i r o i n i c i o l e i a ( a , b , c , d , f ) e s c r e v a (5−(a%2+b%2+c%2+d%2+f %2)) f ima l g o r i tmo 106 / 421 S00001800 - Faça um algoritmo que leia 5 números inteiros e escreva a soma dos que forem ímpares. Dica:Um número é ímpar se o resto da sua divisão por 2 é um. a l g o r i tmo "S001_S00001800" va r n1 , n2 , n3 , n4 , n5 , soma : i n t e i r o i n i c i o l e i a ( n1 , n2 , n3 , n4 , n5 ) n1<−n1 % 2 ∗ n1 n2<−n2 % 2 ∗ n2 n3<−n3 % 2 ∗ n3 n4<−n4 % 2 ∗ n4 n5<−n5 % 2 ∗ n5 soma<−n1+n2+n3+n4+n5 e s c r e v a ( soma ) f ima l g o r i tmo 107 / 421 Troca de variáveis Para trocar os conteúdos de duas variáveis entre si, é necessário copiar o valor de uma delas para uma terceira variável. O trecho a seguir é o trecho padrão para trocar entre si os valores de a e b: aux <- a a <- b b <- aux Resolva o exercício 1100. 108 / 421 S00001100 - Faça um algoritmo que leia 3 valores v1, v2 e v3, e troque os valores entre si de modo que ao final a variável v2 contenha o valor que foi lido para v1, a variável v3 contenha o valor que foi lido para v2, e a variável v1 contenha o valor que foi lido para a variável v3. Dica:Para trocar os valores de duas variáveis (digamos v1 e v2) entre si, salva-se o valor de uma delas (p.ex., v1) em uma variável auxiliar qualquer (p.ex., aux) , copia-se o valor da segunda (v2) para a variável que foi salva (v1), e copia-se o valor da variável auxiliar (que contem o valor original da primeira), para a segunda variável. 109 / 421 Comando Se ou Comando Condicional É utilizado quando o algoritmo deve executar comandos diferentes em diferentes situações. Seu formato é: Se condição entao lista de comandos fimse ou Se condição entao lista 1 senao lista 2 fimse onde condição é uma expressão de comparação que resulta verdadeiro ou falso. 110 / 421 Os operadores de comparação (chamados de operadores relacionais porque identificam a relação entre dois valores) são: = <> (diferente) > < >= <= Exemplo: Se a>0 entao escreva("Positivo") senao escreva("Negativo") fimse Se a>b entao escreva(A, "é maior") fimse 111 / 421 O comando condicional deve ser utilizado quando há diversas situações que devem ser tratadas de formas diferentes pelo algoritmo. Os passos para utilizá-lo são: 1 Identificar com clareza quais as diferentes situaçõesque devem ser tratadas pelo algoritmo. 2 Definir qual o comportamento (comandos que devem ser executados) que o algoritmo deve ter em cada uma das situações. 3 Encontrar expressões que permitam ao algoritmo identificar cada uma das situações. 112 / 421 Caso mais simples: Há somente 2 situações Nesse caso um único "se"é suficiente para diferenciar as duas situações Se a>0 entao escreva("Positivo") senao escreva("Negativo") fimse Pode ocorrer também que no caso de a condição falhar, nada deve ser feito. Nesse caso o "senao"pode ser omitido Se a>b entao escreva(A, "é maior") fimse Resolva os exercícios 20, 40, 60, 80, 100, 200, 1200, 300, 350 e 360 da lista de condicionais. 113 / 421 C00000300 - Faça um algoritmo que leia 3 valores a, b e c, coeficientes de uma equação de segundo grau, e verifique se a equação tem raízes reais. Se a equação tiver raízes reais, calcule e escreva as raízes da equação (em ordem crescente). Se não tiver, escreva "A equação não possui raízes reais". Dica: As raízes de uma equação podem ser calculadas pela fórmula de Baskhara. Uma equação não possui raízes se reais se B*B-4*a*c < 0 114 / 421 C00000040 - Faça um algoritmo que leia um valor e escreva: 0, se o valor é par; 1, se o valor é ímpar. C00000060 - Faça um algoritmo que leia dois valores e, através de uma comparação, escreva o maior deles. Considere que os dois valores são diferentes. C00000080 - Faça um algoritmo que leia dois valores e escreva os dois em ordem crescente. 115 / 421 Caso menos simples: Há mais de 2 situações Nesse caso um único "se"não é suficiente para diferenciar as diferentes situações Pode-se utilizar um "se"para identificar cada situação Nesse caso, a expressão deve ser suficiente para identificar cada caso dentre todos os casos C00000020 - Faça um algoritmo que leia um valor e escreva: 0, se o valor é zero; 1, se o valor é maior que zero; -1 - se o valor é negativo. 116 / 421 escreva("Digite um valor:") leia(a) Se a>0 entao escreva(1) fimse Se a=0 entao escreva(0) fimse Se a<0 entao escreva(-1) fimse 117 / 421 Alternativa B - Comandos Se aninhados A sintaxe do comando Se é: Se cond i ção entao l i s t a de comandos senao l i s t a 2 f ims e As listas de comandos (do entao e do senao) podem conter qualquer comando dentre os comandos já vistos, leitura, escrita, atribuição... inclusive o comando se. Para utilizar um comando se dentro de outro (no então ou no senão), ele deve estar completo (Se condição entao lista de comandos fimse). Um exemplo de uso é: 118 / 421 Se a=0 entao escreva("zero ",0) senao Se a>0 entao escreva("positivo", 1) senao escreva("negativo", 2) fimse fimse 119 / 421 O que NÃO fazer em hipótese nenhuma Combinar as duas soluções: Se a=0 entao escreva("zero ",0) fimse se a>0 entao escreva("positivo", 1) senao escreva("negativo", 2) fimse Qual é o problema com essa abordagem? 120 / 421 Operadores Lógicos uma condição pode conter diversas expressões de comparação combinadas com o uso dos operadores e e ou.Ex: Se a>=b e a>=c entao escreva(a, "é maior") fimse uma expressão com e é verdadeira se ambas as subexpressões são verdadeiras. Uma expressão com ou é verdadeira se pelo menos uma das expressões é verdadeira. O operador e tem prioridade maior que o operador ou. Pelo descrito acima, a linguagem não permite expressões do tipo a>b>c. 121 / 421 C00000100 - Faça um algoritmo que leia 3 valores v 1 , v 2 e v 3 , e escreva-os em ordem crescente. Há 6 ordens possíveis (sem contar a possibilidade de ocorrerem números repetidos) v1 < v2 < v3 v1 < v3 < v2 v2 < v1 < v3 v2 < v3 < v1 v3 < v1 < v2 v3 < v2 < v1 122 / 421 Uma alternativa é utilizar um "se"para cada situação: se v1<v2 e v2<v3 entao e s c r e v a ( v1 , " " , v2 , " " , v3 ) f ims e se v1<v3 e v3<v2 entao e s c r e v a ( v1 , " " , v3 , " " , v2 ) f ims e se v2<v1 e v1<v3 entao e s c r e v a ( v2 , " " , v1 , " " , v3 ) f ims e se v2<v3 e v3<v1 entao e s c r e v a ( v2 , " " , v3 , " " , v1 ) f ims e se v3<v1 e v1<v2 entao e s c r e v a ( v3 , " " , v1 , " " , v2 ) f ims e se v3<v2 e v2<v1 entao e s c r e v a ( v3 , " " , v2 , " " , v1 ) f ims e O que acontecerá se houverem valores repetidos? Como se pode corrigir? 123 / 421 Alternativa B - Cada teste só é feito se o teste anterior falhou: se v1<v2 e v2<v3 entao e s c r e v a ( v1 , " " , v2 , " " , v3 ) senao se v1<v3 e v3<v2 entao e s c r e v a ( v1 , " " , v3 , " " , v2 ) senao se v2<v1 e v1<v3 entao e s c r e v a ( v2 , " " , v1 , " " , v3 ) senao se v2<v3 e v3<v1 entao e s c r e v a ( v2 , " " , v3 , " " , v1 ) senao se v3<v1 e v1<v2 entao e s c r e v a ( v3 , " " , v1 , " " , v2 ) senao se v3<v2 e v2<v1 entao e s c r e v a ( v3 , " " , v2 , " " , v1 ) f ims e f ims e f ims e f ims e f ims e f ims e O que acontecerá se houverem valores repetidos? Como se pode corrigir? O último teste é necessário? 124 / 421 C00000200 - Faça um algoritmo que leia 3 valores v1, v2 e v3 e coloque-os em ordem crescente, de forma que v1 contenha o menor, v2 contenha o elemento do meio (nem o maior, nem o menor), e v3 contenha o maior. Escreva os valores ordenados. A solução anterior não pode ser utilizada nesse exercício porque o enunciado pede explicitamente que os valores sejam trocados e v1 fique com o menor valor. Para se conseguir isso, compara-se as variáveis entre si, trocando-as entre si quando necessário: 125 / 421 algoritmo "C001 C00000100" var a,b,c,aux:inteiro inicio leia(a,b,c) se a>b entao aux<-a a<-b b<-aux fimse se a>c entao aux<-a a<-c c<-aux fimse se b>c entao aux<-b b<-c c<-aux fimse escreva(a,b,c) fimalgoritmo 126 / 421 C00000250 - Escreva um algoritmo que leia os valores das quatro provas de um aluno e escreva a média aritmética considerando apenas as três melhores notas. Por exemplo, se o valores lidos foram 9, 9.5, 7, e 8, a média será (9 + 9.5 + 8)/3 (a prova de nota 7 é descartada). Dica:Não esqueça de considerar a possibilidade de ocorrerem notas iguais. 127 / 421 C00000350 - Faça um algoritmo que leia 3 valores a, b e c, lados de um triângulo, e verifique o tipo de triângulo formado escrevendo: 0 - se o triângulo é equilátero (os três lados são iguais); 1 - se o triângulo é isósceles (dois lados iguais e um diferente); 2 - escaleno (3 lados diferentes). 128 / 421 Alternativa 1 Leia(a,b,c) se a=b e a=c entao escreva("Equilatero ",0) fimse se a<>b e a<>c e b<>c entao escreva("Escaleno ",2) fimse se a=b e a<>c ou a=c e a<>b ou b=c e a<>b entao escreva("Isósceles ",1) fimse 129 / 421 Alternativa 2 Leia(a,b,c) se a=b e a=c entao escreva("Equilatero ",0) senao se a<>b e a<>c e b<>c entao escreva("Escaleno ",2) senao escreva("Isósceles", 1) fimse fimse 130 / 421 Alternativa 3 Leia(a,b,c) se a=b e a=c entao escreva("Equilatero ",0) senao se a=b ou a=c ou b=c entao escreva("Isósceles", 1) senao escreva("Escaleno ",2) fimse fimse 131 / 421 Qual das três alternativas é mais eficiente? Por quê é mais eficiente? Por que a expressão do Isósceles na alternativa 1 é diferente da alternativa 3? Em que situações se pode colocar um se dentro do outro (Se's aninhados) Pode-se colocar sempre? Pode-se usar Se's aninhados no código seguinte? 132 / 421 C00000360 - Faça um algoritmo que leia 3 valores a, b e c, lados de um triângulo, e verifique o tipo de triângulo formado escrevendo:0 - se o triângulo é retângulo (A 2 = B2 + C 2); 1 - se o triângulo é obtusângulo (um dos ângulos internos é obtuso, isto é, maior que 90) (A 2 > B2 + C 2) ; 2 - se o triângulo é acutângulo (todos os ângulos internos são agudos, isto é, menores que 90)(A 2 < B2 + C 2). Lembre que, para aplicar as relações mostradas, o algoritmo deve garantir que o maior dos 3 lados estará em A. 133 / 421 C00000400 - Faça um algoritmo que leia 3 valores l1,l2 e l3 e verifique se formam um triângulo. Se formarem, calcule e escreva a área do triângulo formado (veja exercício S00000900). Se não formarem, escreva -1. Obs: A área do triângulo de lados a, b e c pode ser calculada pela fórmula de Hierão, dada abaixo: Area = √ S(S − a)(S − b)(S − c) onde S = a + b + c 2 134 / 421 Obs: Uma triângulo pode ser definido pelo valor de seus três lados. Entretanto, nem todo conjunto de 3 valores formam um triângulo. Assim, 3,4,5 formam um triângulo. 10,3,2 não formam. 10,5,5 formam? Qual a condição para que 3 valores formem um triângulo? 135 / 421 Condição para 3 valores formarem um triângulo "Cada um dos três lados deve ser menor que a soma dos outros dois" ou seja, "A deve ser menor que B+C, B deve ser menor que A+C e C deve ser menor que A+B" ou, como uma condição: A<B+C e B<A+C e C<A+B 136 / 421 Condição para 3 valores NÃO formarem um triângulo "Um dos lados deve ser maior que a soma dos outros dois" ou seja, "A deve ser maior ou igual a B+C, B deve ser maior ou igual a A+C OU C deve ser maior ou igual a que A+B" ou, como uma condição: A>=B+C ou B>=A+C ou C>=A+B 137 / 421 C00000410 - Faça um algoritmo que leia 3 valores l1,l2 e l3 e verifique se formam um triângulo e, se formarem, o tipo de triângulo formado, escreva: 0 - se não formarem triângulo; 1 - se formarem um triângulo equilatero (os três lados são iguais); 2 - se formarem um triângulo isósceles (dois lados iguais e um diferente); 3 - se formarem um triângulo escaleno (3 lados diferentes) 138 / 421 C00000450 - Faça um algoritmo que implemente uma calculadora de 4 operações. O algoritmo deve ler, nessa ordem: o primeiro operando, o operador (+,-,*,/) e o segundo operando, e deve escrever o resultado da operação. Por exemplo, se o usuário digitar 2,+,3 o algoritmo deve escrever 5. Dica: Para que uma variável possa receber um texto (mesmo que seja apenas o caracter "+") ela deve ser declarada como "literal". 139 / 421 Literais Variáveis literais são variáveis utilizadas para trabalhar com informação não numérica. Elas devem ser declaradas como "literal"e podem conter qualquer sequencia de caracteres. Para atribuir um texto a uma variável literal usa-se o comando de atribuição, da mesma forma que uma variável numérica. Ex: nome <- "Maria" 140 / 421 Comparação de Literais Pode-se efetuar comparações entre literais usando os operadores de comparação: se nome="Juca" entao ... Para comparação de maior ou menor, é considerada a ordem lexicográfica (alfabética). Resolva o exercício 450 da lista de condicional. 141 / 421 C00000460 - Faça um algoritmo que leia um literal contendo uma expressão com 3 caracteres, onde o primeiro caractere é um dígito entre 0 e 9, o segundo é um operador (+,-,*,/) e o terceiro caractere é um dígito entre 0 e 9, e efetue o cálculo da expressão escrevendo o resultado. Dica:Use a função subliteral para separar os 3 caracteres e a função val para converter os operandos em seus valores numéricos. 142 / 421 Função subliteral Além de atribuição e comparação há outras funções para trabalhar com literais: subliteral ( literal, posicao inicial, numero de posicoes) - retorna o subliteral, a partir de <posicao inicial> por <numero posicoes> Ex: nome<-subliteral("Joana",2,3) retorna o literal "oan"(3 caracteres a partir da segunda posição) 143 / 421 val(lit,var) - converte o literal em lit para o valor numerico correspondente que coloca em var. A função retorna um valor lógico (verdadeiro ou falso) dizendo se o literal era um valor numérico ou não se val("123",valor)=verdadeiro entao... vai colocar o valor 123 na variável "valor". Se o literal não for um número válido, retorna falso tamanho(literal) - retorna o tamanho do literal, em caracteres e o operador + aplicado a literal concatena os literais ex: Nomecomp <- "Joao"+ "da Silva" 5) Resolva o exercício 460 da lista de condicional. 144 / 421 C00000500 - Faça um algoritmo que leia 3 notas de um aluno e escreva sua média harmônica. Dica: A média harmônica entre três valores N1, N2 e N3 é calculada pela expressão 3 1/N 1 + 1/N 2 + 1/N 3 O que acontece se alguma das notas for igual a 0? Que resultado o algoritmo deve emitir? 145 / 421 C00000600 - Faça um algoritmo que leia 3 notas de um aluno e escreva sua média harmônica. Se o aluno obteve média abaixo de 6.0, E SOMENTE NESSE CASO, leia uma quarta nota (da prova de recuperação) e substitua a menor das três notas pela nota da recuperação e recalcule a média harmônica. Escreva a média harmônica final e o conceito obtido (0, se média harmônica (MH) < 6.0; 1 se 6.0 <= MH <7.0; 2 se 7.0 <= MH < 8.0; 3 se 8.0 <= MH < 9.0; 4 se MH>=9.0). 146 / 421 C00000650 - Faça um algoritmo que leia 3 notas de um aluno e escreva sua média harmônica (MH). Caso alguma das notas seja 0 (zero), MH deve receber 0 (zero). Se o aluno obteve uma MH abaixo de 6.0 e AINDA PUDER OBTER média igual ou superior a 6.0, o algoritmo deve ler uma quarta nota (da prova de recuperação) e substituir a menor das três notas pela nota da recuperação, recalculando MH. O algoritmo deve escrever a MH final e o conceito obtido (0, se MH < 6.0; 1 se 6.0 <= MH <7.0; 2 se 7.0 <= MH < 8.0; 3 se 8.0 <= MH < 9.0; 4 se MH>=9.0). Dica:No caso do aluno ter obtido média inferior a 6.0, uma forma de verificar se ele pode alcançar média 6.0 através da prova de recuperação é substituindo a menor nota por 10 e verificando se a MH resultante é igual ou superior a 6.0. 147 / 421 C00000660 - Faça um algoritmo que leia 4 valores, Hi, Mi, Hf, Mf, representando respectivamente a hora e minuto inicial e final de um evento, e calcule a duração do mesmo em horas e minutos. Considere que o evento pode iniciar em um dia e terminar no dia seguinte. Algumas (mas não todas) situações que podem ocorrer são: Entrada: 10:30 Saída: 10:45 Duração: 00:15 Entrada: 10:30 Saída: 11:15 Duração: 00:45 Entrada: 22:15 Saída: 01:45 Duração: 03:30 Entrada: 22:15 Saída: 10:45 Duração: 12:30 148 / 421 C00001000 - Faça um algoritmo que leia para um trabalhador o valor que ganha por hora, a hora de entrada e a hora de saída (valores inteiros, sem minutos) e calcule quanto ele ganhou pelo turno. Considere que ele entra e sai no mesmo dia, e que as horas a partir das 20:00 valem 20% a mais (adicional noturno). Quantos casos diferentes existem? Que cálculo deve ser feito em cada caso? Como o algoritmo pode identificar cada caso? 149 / 421 150 / 421 he: hora de entrada hs: hora de saída vh: valor por hora Caso Entrada Saída condição cálculo 1 até as 20:00 até as 20:00 hs<=20 sal←(hs-he)*vh 2 até as 20:00 entre 20:00 e 24:00 he<=20 e hs>20 sal←(hs-he)*vh+(hs-20)*vh*0.2 ou sal←(20-he)*vh+(hs-20)*vh*1.2 3 a partir das 20:00 após 20:00 he>=20 sal←(hs-he)*vh*1.2 Exemplos (considerando VH (valor por hora)=10 reais): Caso Entrada Saída Salário 1 15 19 2 15 21 3 21 23 151 / 421 C00001100 - Faça um algoritmo que leia para um trabalhador o valor que ganha por hora, a hora de entrada e a hora de saída (valores inteiros, sem minutos) e calcule quanto ele ganhou pelo turno.Considere que ele entra e sai no mesmo dia, e que as horas antes das 6:00 da manhã e a partir das 20:00 valem 20% a mais (adicional noturno). Quantos casos diferentes existem? Que cálculo deve ser feito em cada caso? Como o algoritmo pode identificar cada caso? Como devem ser tratados os casos-limite? (p.ex. He=6, Hs=6, He=20, Hs=20) 152 / 421 153 / 421 Caso Entrada Saída condição cálculo ex: Resultado 1 <=6 <=6 HS<=6 sal←(hs-he)*vh*1.2 He=4,Hs=5,VH=10 12 2 3 4 5 6 154 / 421 C00001200 - Faça um algoritmo que leia para um trabalhador o valor que ganha por hora, a hora de entrada e a hora de saída (valores inteiros, sem minutos) e calcule quanto ele ganhou pelo turno. Considere que ele pode entrar em um dia e sair no outro, mas que o total de horas trabalhadas não excede 23 horas. Quantos casos diferentes existem? Que cálculo deve ser feito em cada caso? Como o algoritmo pode identificar cada caso? 155 / 421 C00001250 - Faça um algoritmo que leia para um trabalhador o valor que ganha por hora, a hora de entrada e a hora de saída (valores inteiros, sem minutos) e calcule quanto ele ganhou pelo turno. Considere que ele pode entrar em um dia e sair no dia seguinte, e que se ele permanecer mais do que 8 horas, as duas horas a partir da nona hora valem 20% a mais, e as horas a partir da décima primeira hora valem 50% a mais (horas extras). 156 / 421 C00001300 - Faça um algoritmo que leia para um trabalhador o valor que ganha por hora, a hora de entrada e a hora de saída (valores inteiros, sem minutos) e calcule quanto ele ganhou pelo turno. Considere que ele pode entrar em um dia e sair no outro, mas que o total de horas trabalhadas não excede 23 horas. Considere que as horas a partir das 20:00 valem 20% a mais (adicional noturno). 157 / 421 C00001400 - Faça um algoritmo que leia para um trabalhador o valor que ganha por hora, a hora de entrada e a hora de saída (valores inteiros, sem minutos) e calcule quanto ele ganhou pelo turno. Considere que ele pode entrar em um dia e sair no outro, mas que o total de horas trabalhadas não excede 23 horas. Considere também que as horas antes das 6:00 da manhã e a partir das 20:00 valem 20% a mais (adicional noturno). 158 / 421 C00001700 - Escreva um algoritmo que leia duas datas, cada uma composta de Dia, Mês e Ano, e as escreva em ordem cronológica crescente. Ex:se as datas são 01/04/2000 e 17/05/1988, o algoritmo deve escrever 17/05/1988 01/04/2000. Na comparação de duas datas, o ano deve ser considerado em primeiro lugar. Se os anos das duas datas são diferentes, o mês e o dia não interessam. Se os anos são iguais, deve ser considerado o mês (e o dia não interessa). O dia só é considerado quando o ano e o mês são iguais. 159 / 421 Sugestões: Converta cada data (dia,mês,ano) em um único valor, da forma como fizemos com hora-minuto-segundo, para poder efetuar uma única comparação (que pesos podem ser atribuídos aos anos e aos meses?); ou Efetue primeiro a comparação entre os anos, se esses forem iguais compare os meses e, se anos e meses forem iguais compare os dias. Idem ao anterior, mas em uma única expressão de comparação. 160 / 421 data1 <− ano1∗10000 + mes1∗100 + d i a1 data2 <− ano2∗10000 + mes2∗100 + d i a2 se data1<data2 entao . . . s e ano1>ano2 entao e s c r e v a ( d ia2 , mes2 , ano2 , d ia1 , mes1 , ano1 ) senao se ano1<ano2 entao e s c r e v a ( d ia1 , mes1 , ano1 , d ia2 , mes2 , ano2 ) senao se mes1>mes2 entao . . . . . . f im s e f ims e f ims e se ano1>ano2 ou ano1=ano2 e mes1>mes2 ou ano1=ano2 e mes1=mes2 e d ia1>d i a2 entao . . . senao f ims e 161 / 421 C00001750 - Escreva um algoritmo que leia três datas, cada uma composta de Dia, Mês e Ano, e as escreva em ordem cronológica crescente. Ex:se as datas são 01/04/2000, 17/05/1988 e 23/10/1969, o algoritmo deve escrever 23/10/1969 17/05/1988 01/04/2000. Sugestão: As mesmas do exercício anterior 162 / 421 C00001790 - Escreva um algoritmo que leia uma data, composta por dia, mês e ano, e verifique se a data corresponde ao último dia do mês, escrevendo: 1, se for o último dia do mês 0 se não for o último dia do mês. Considere, para simplificar o problema, que ano bissexto é aquele divisível por 4, e que fevereiro tem 28 dias (29 em ano bissexto). Setembro, abril, junho e novembro têm 30 dias e todos os outros meses tem 31 dias. 163 / 421 C00001800 - Escreva um algoritmo que leia uma data, composta por dia, mês e ano, e escreva a data correspondente ao dia seguinte. Considere, para simplificar o problema, que ano bissexto é aquele divisível por 4, e que fevereiro tem 28 dias (29 em ano bissexto), setembro, abril, junho e novembro têm 30 dias e todos os outros meses tem 31 dias. Sugestão: lâmina seguinte 164 / 421 leia(dia,mes,ano) Se {dia é o último dia do ano} estao escreva (1, 1, ano+1) senao se {dia é o último dia do mes} estao escreva (1, mes+1, ano) senao escreva(dia+1,mes,ano) 165 / 421 C00001850 - Escreva um algoritmo que leia uma data, composta por dia, mês e ano, e escreva quantos dias passaram-se desde o início do ano. Considere, para simplificar o problema, que ano bissexto é aquele divisível por 4, e que fevereiro tem 28 dias (29 em ano bissexto), setembro, abril, junho e novembro têm 30 dias e todos os outros meses tem 31 dias. 166 / 421 C00001900 - Para enviar uma carta são necessários um selo e um envelope. O selo custa 12 centavos e o envelope custa 5 centavos. Faça um algoritmo que leia uma quantia inicial de selos, envelopes e centavos, e escreva o número de cartas que podem ser enviadas com esses selos, envelopes e centavos (utilizando-os para comprar mais selos e envelopes). Considere que não é possível converter selos ou envelopes em dinheiro. 167 / 421 Quais são as diferentes situações que podem ocorrer? Há mais selos que envelopes e: O dinheiro é suficiente para igualar os dois O dinheiro não é suficiente para igualar os dois Há mais envelopes do que selos e: O dinheiro é suficiente para igualar os dois O dinheiro não é suficiente para igualar os dois O caso em que o número inicial de selos e envelopes é igual pode ser tratado dentro de algum dos casos anteriores 168 / 421 C00001925 - Para enviar uma carta são necessários um selo e um envelope. O selo custa 12 centavos e o envelope custa 5 centavos. Faça um algoritmo que leia uma quantia inicial de selos, envelopes e dinheiro (em reais), e escreva o número de cartas que podem ser enviadas com esses selos, envelopes e centavos (utilizando-os para comprar mais selos e envelopes). Escreva também, nessa ordem, a quantidade de selos, envelopes e dinheiro (em centavos), que restará após enviadas as cartas. Considere que não é possível converter selos ou envelopes em dinheiro. 169 / 421 C00001950 - Uma fábrica produz um recipiente de plástico com sua tampa (também de plástico). Ambos os componentes utilizam o mesmo equipamento para fabricação (ou seja, não podem ser fabricados ao mesmo tempo). A fabricação do recipiente consome duas horas; a fabricação da tampa consome meia hora. Um cliente deseja o máximo de recipientes (com tampa) para 10 dias. A fábrica trabalha 24 horas/dia e já dispõe de uma quantidade r de recipientes e t de tampas em seu estoque (não necessariamente iguais). Faça um algoritmo que leia os valores de r e t e informe o máximo de conjuntos recipiente-tampa que ela pode fornecer em 10 dias. 170 / 421 C00002100 - A distância entre dois pontos definidos pelas coordenadas (X 1 ,Y 1 ) e (X 2 ,Y 2 ) é dada por√(X 1 − X 2 )2 + (Y 1 − Y 2 )2 . Faça um algoritmo que leia 8 valores representando as coordenadas X e Y de 4 pontos,vértices de um polígono, e verifique se os pontos formam um quadrado, escrevendo: 1 - se formam um quadrado; 0 - se não formam. Considere que os pontos são lidos no sentido horário, seguindo o perímetro do quadrado. 171 / 421 C00002150 - Faça um algoritmo que leia oito valores correspondentes às coordenadas dos quatro vértices de um quadrilátero convexo no espaço cartesiano (X 0 ,Y 0 , X 1 ,Y 1 , X 2 ,Y 2 , X 3 ,Y 3 ). O algoritmo deve identificar o tipo de polígono formado escrevendo: 1 se os 4 pontos formam um quadrado; 2 se formam um retângulo; 3 se formam um losango; 4 se formam um paralelograma; 5 se formam um papagaio (2 pares de lados adjacentes iguais. Ex: lados de tamanhos 3,3,4 e 4); 6 se não formam nenhum dos anteriores. 172 / 421 173 / 421 A distância (tamanho dos lados) entre dois pontos quaisquer (X i ,Y i ) e (X j ,Y j ) pode ser obtida através da fórmula distX i Y i X j Y j = √ (X i − X j )2 + (Y i − Y j )2). Por exemplo, se os pontos lidos foram (3,2), (0,5), (3,8) e (6,5), a figura formada é um quadrado e o algoritmo escreve 1. Para que a figura seja um quadrado, os comprimentos das duas diagonais devem ser iguais, bem como os 4 lados. Se os pontos lidos foram (4,2), (1,4), (4,6) e (7,4), a figura formada é um losango. Se os pontos lidos foram (2,3), (0,5), (3,8) e (5,6), a figura formada é um retângulo. Se os pontos lidos foram (7,3), (0,3), (2,5) e (5,5), a figura formada não é nenhuma das anteriores e o algoritmo escreve 6 Os pontos são fornecidos em sentido horário ao longo do perímetro do quadrilátero. 174 / 421 C00003100 - Faça um algoritmo que leia as dimensões (altura, largura e profundidade) de duas caixas e verifique se a primeira caixa pode ser colocada dentro da segunda. Considere que as caixas podem ser rotacionadas em qualquer direção. Se a primeira caixa couber dentro da segunda escreva 1, caso contrário escreva 0. 175 / 421 C00003300 - Faça um algoritmo que leia 4 valores X 1 ,Y 1 ,X 2 ,Y 2 , correspondendo às coordenadas do canto inferior esquerdo e canto superior direito de uma região retangular no plano. Leia a seguir dois valores X,Y correspondendo a um ponto no plano e escreva: 0 - Se o ponto está fora da região retangular; 1 - Se o ponto está dentro da região retangular; 2 - Se o ponto está exatamente na borda da região retangular. 176 / 421 177 / 421 C00003000 - Escreva um algoritmo que leia dois valores D e DS, correspondentes a um dia do mes, e ao dia da semana que corresponde a ele (1-domingo 2-segunda 3- terça 4-quarta 5-quinta 6-sexta 7-sábado). Calcule e escreva em que dia da semana caiu o dia primeiro do mês do dia digitado. Exemplo: dia 10 no mês e 3 (terça) na semana. Resposta 1 (domingo) Exemplo: dia 30 no mês e 4 (quarta) na semana. Resposta 3 (terça feira) Sugestão: Subtraia do dia do mês as semanas inteiras, reduzindo o dia a um valor entre 1 e 7 Calcule a diferença do dia resultante até o dia 1. Subtraia a mesma diferença do dia da semana, corrigindo-o se o resultado for menor que 1. 178 / 421 C00003100 - Faça um algoritmo que leia as dimensões (altura, largura e profundidade) de duas caixas e verifique se a primeira caixa pode ser colocada dentro da segunda. Considere que as caixas podem ser rotacionadas em qualquer direção. Se a primeira caixa couber dentro da segunda escreva 1, caso contrário escreva 0. Sugestões: a) Ordene as dimensões das duas caixas e verifique se cada dimensão da segunda é menor que a dimensão correspondente da primeira ou b) Verifique se há alguma permutação das dimensões da segunda caixa que cabe na primeira caixa. 179 / 421 C00003200 - Faça um algoritmo que leia dois números de três dígitos cada um, e verifique se possuem os mesmos dígitos. Considere que pode haver dígitos repetidos em um número, e que a cada dígito de um número deve corresponder exatamente um dígito do outro número. Assim, os números 221 e 112 não tem os mesmos dígitos, porque apesar de ambos terem somente os dígitos 1 e 2, aos dois dígitos 2 do primeiro número corresponde o mesmo dígito no segundo número. O algoritmo deve escrever 1, caso os números tenham os mesmos dígitos, e 0 em caso contrário. Sugestões: a e b) As duas sugestões do problema anterior ou c) Encontre uma função matemática que converta os 3 valores em um único valor, de modo que dois conjuntos com os mesmos valores gerem o mesmo valor, e conjuntos com valores diferentes gerem valores diferentes, e compare os valores correspondentes aos dois conjuntos. 180 / 421 C00003250 - Faça um algoritmo que leia um número de três dígitos e escreva o maior número que possui os mesmos dígitos do número lido. Se um dígito aparecer repetido no número lido, deve ser repetido o mesmo número de vezes no número gerado. Dica: Ordene os dígitos e gere um número com os mesmos dígitos, com peso maior para o maior dígito. 181 / 421 C0003650 - A locadora Só Filmassos classifica os filmes em "lançamentos"e "acervo", sendo que a diária do lançamento é 5 reais e a diária do acervo é 3 reais. A locadora está com uma promoção, ao locar 2 lançamentos o cliente tem direito a um filme de acervo grátis. Faça um algoritmo que leia a quantidade de lançamentos e a quantidade de filmes de acervo a serem locados, e calcule o valor (mínimo) a ser pago. Exemplos: Acervo Lançamentos Valor a ser pago 3 2 16 reais 10 10 65 reais 182 / 421 C00003700 - A locadora Só Filmassos classifica os filmes em "lançamentos"e "acervo", sendo que a diária do lançamento é 5 reais e a diária do acervo é 3 reais. A locadora está com uma promoção, ao locar 2 lançamentos o cliente tem direito a um filme grátis, podendo ser de acervo ou lançamento. Faça um algoritmo que leia a quantidade de lançamentos e a quantidade de filmes de acervo a serem locados, e calcule o valor (mínimo) a ser pago. Exemplos: Acervo Lançamentos Valor a ser pago 3 2 16 reais 5 3 25 reais 3 4 23 reais 183 / 421 Questões de provas anteriores 1) Considere um reservatório com três segmentos cilíndricos , conforme o diagrama abaixo: 184 / 421 Faça um algoritmo que leia as dimensões R 1 , H 1 , R 2 , H 2 , R 3 e H 3 em metros e a vazão da água preenchendo o reservatório em litros/segundo. Leia a seguir um tempo T e calcule a altura atingida pela água no tempo T. Se no tempo T o reservatório já estiver completamente preenchido, escreva "Reservatório completo". O volume de um cilindro é dado por pir2h. 1 metro cúbico equivale a 1000 litros. Considere o valor de pi como 3.14. 185 / 421 Sugestão de dados de teste: Vazão=1000 l/s (1 m 3 /s) R 1 =1 H 1 =1 T 1 (Tempo para encher o segmento 1):=piR2 1 H 1 /vazão = 3.14 seg R 2 =2 H 2 =2 T 2 =25.12 R 3 =3 H 3 =3 T 3 =84.78 Tempo (seg) Altura (metros) 2 186 / 421 2) A função abaixo descreve a altitude de um modelo de foguete desde o momento em que é disparado até o momento em que atinge o solo. O tempo é dado em segundos e a altura é dada em metros. Escreva um algoritmo que leia um tempo T e calcule a altura do projétil no tempo T. Se o projétil já tiver atingido o solo, escreva "O projétil já atingiu o solo". h(t) = 50 ∗ t2 p/t ≤ 1 50+ 50(t − 1)− 5(t − 1)2 p/t > 1 e t ≤ 8 155− 20(t − 8) p/t > 8 e t <= 15.75 187 / 4213) Um resistor, R=4Ω, e um indutor, L=1.3 H, são conectados em um circuito a uma fonte de tensão conforme a figura abaixo. Quando a fonte de tensão aplica uma onda retangular de amplitude V=12 V de duração 0.5 segundos, mostrado na figura abaixo. 188 / 421 A corrente i(t) no circuito é dada por: i(t) = { V R (1− e(−Rt)/L) p/ 0 ≤ t ≤ 0.5s V R e −(Rt)/L(e(0.5R)/L − 1) p/ 0.5 ≤ t Faça um algoritmo que leia um tempo T e calcule e escreva a corrente no circuito no instante T. Considere para a constante "e"o valor de 2.7182. 189 / 421 4) A velocidade de uma partícula que se move ao longo de uma linha reta, como função do tempo, é dada pelas equações abaixo: v(t) = 1.4t p/ 0 ≤ t ≤ 10 s 14+ 5sin( pi 10 (t − 10)) p/ 10 ≤ t ≤ 25 s 9 p/ 25 ≤ t ≤ 35 s 9− 9 5 (t − 35) p/ 35 ≤ t ≤ 40 s Faça um algoritmo que que leia um tempo T e calcule e escreva a posição da partícula no instante T. 190 / 421 C00000750 - Faça um algoritmo que leia, para duas barras de ouro, o seu peso e seu valor. O algoritmo deve ler também o limite de peso de uma mochila, e verificar e escrever que barra (s) devem ir na mochila de modo a maximizar o valor dentro dela, sem exceder seu limite de peso. O algoritmo deve escrever: 0 - Se nenhuma das barras puder ser colocada na mochila sem exceder o limite de peso 1 - Se a melhor solução for colocar somente a barra 1 na mochila 2 - Se a melhor solução for colocar somente a barra 2 na mochila 3 - Se a melhor solução for colocar a barra 1 e a barra 2 na mochila 191 / 421 Casos possíveis: Cabem as duas barras na mochila Cabe a primeira barra e não cabe a segunda Cabe a segunda barra e não cabe a primeira Não cabe nenhuma das barras na mochila MAIS ALGUM???????? 192 / 421 Lista de problemas sequenciais e condicionais por categorias: Números primos Separação de dígitos Ordenar poucos valores Conversões hora-minuto-segundo Aplicação de tabelas 193 / 421 Comandos de Repetição São utilizados quando um ou mais comandos deve ser executado mais de uma vez no algoritmo. Nossa linguagem possui três comandos de repetição, o Enquanto, o Para e o Repita. O formato do comando Enquanto é: Enquanto condição faca lista de comandos fimenquanto onde condição é uma expressão lógica, como as condições do comando se. 194 / 421 Ao entrar no comando Enquanto a condição é avaliada. Se ela é verdadeira, a lista de comandos é executada. Isso (avalia condição + executa comandos) se repete até que a condição seja falsa. Por exemplo, o trecho ao lado escreve de quanto a quanto? a←1 enquanto a<4 faca escreva(a) a←a+1 fimenquanto 195 / 421 Teste de Mesa Uma coluna para cada variável e uma coluna para os comandos de escrita Executa-se os comandos sequencialmente, um a um A cada atribuição, a coluna da variável que recebeu o valor deve ser atualizada A cada comando de escrita, a coluna das escritas é atualizada Esse formalismo é usado há 60 anos e funciona muito bem. Não tente inventar algo diferente. a←1 enquanto a<4 faca escreva(a) a←a+1 fimenquanto a esc 1 196 / 421 Teste de Mesa a←1 enquanto a<4 faca escreva(a) a←a+1 fimenquanto a esc 1 1 197 / 421 Teste de Mesa a←1 enquanto a<4 faca escreva(a) a←a+1 fimenquanto a esc 1 1 2 198 / 421 Teste de Mesa a←1 enquanto a<4 faca escreva(a) a←a+1 fimenquanto a esc 1 1 2 199 / 421 Teste de Mesa a←1 enquanto a<4 faca escreva(a) a←a+1 fimenquanto a esc 1 1 2 200 / 421 Teste de Mesa a←1 enquanto a<4 faca escreva(a) a←a+1 fimenquanto a esc 1 1 2 2 E continua até concluir a simulação... 201 / 421 Uma estrutura de repetição, como o enquanto, também é chamada de laço de repetição (ou loop) Cada repetição dos comandos dentro do enquanto também é chamada de iteração. Por essa razão algoritmos ou métodos que utilizam estruturas de repetição são ditos iterativos 202 / 421 Ex: os trechos a seguir escrevem o que na tela? (teste de mesa) a) i <−1 Enquanto i <=2 fa ca e s c r e v a ( i ) i<− i +1 f imenquanto b) i <−1 Enquanto i <=2 fa ca i<− i +1 e s c r e v a ( i ) f imenquanto 203 / 421 Ex: os trechos a seguir escrevem o que na tela? (teste de mesa) c) i <−1 enquanto i <3 f a ca i<− i +1 e s c r e v a ( i ) f imenquanto d) i <−1 enquanto i <3 f a ca e s c r e v a ( i ) i<− i +1 f imenquanto 204 / 421 Ex: os trechos a seguir escrevem o que na tela? (teste de mesa) e) a<−1 b<−2 enquanto a<200 f a ca a<−a+b b<−a+b e s c r e v a ( a , "" , b , "" ) f imenquanto f) a<−100 enquanto a>0 f a ca e s c r e v a ( a%2) a<−a\2 f imenquanto 205 / 421 g) a<−1234 b<−0 enquanto a>0 f a ca b<−b∗10+a%10 a<−a\10 f imenquanto e s c r e v a ( b ) h) a<−100 d<−2 enquanto a>1 f a ca se a%d=0 entao e s c r e v a ( d ) a<−a\d senao d<−d+1 f ims e f imenquanto 206 / 421 I00000100 - Faça um algoritmo que escreva os números de 1 a 20. I00000200 - Faça um algoritmo que escreva todos os números pares entre 1 e 50. Esse exercício pode ser resolvido por dois caminhos diferentes: a) Gerando todos os números entre 1 e 50 e escrevendo somente os que forem pares; b) Gerando e escrevendo somente os números pares. 207 / 421 a) a<−1 enquanto a<=50 f a ca se a %2=0 entao e s c r e v a ( a ) f ims e a<−a+1 f imenquanto b) a<−2 enquanto a<=50 f a ca e s c r e v a ( a ) a<−a+2 // o inc r emento da v a r i á v e l // que c o n t r o l a o l a ç o pode // s e r d i f e r e n t e de 1 f imenquanto 208 / 421 I00000300 - Faça um algoritmo que escreva todos os números entre 1 e 200 que são múltiplos de 11. (Não está no Portal) Faça um algoritmo que escreva 1000 vezes o nome do melhor time do Rio Grande do Sul A solução para esse problema deve, de alguma forma, repetir 1000 vezes o comando Escreval("Internacional!") Para isso, utiliza-se uma estrutura de repetição com uma variável que controle as 1000 repetições. 209 / 421 i <−1 enquanto i <=1000 f a ca e s c r e v a ( " I n t e r n a c i o n a l ! ! ! " ) i<− i +1 f imenquanto Nesse algoritmo, a variável i tem a importante função de controlar o número de repetições, para que o comando de escrita seja executado exatamente 1000 vezes, nem uma a mais, nem uma a menos. À variável que controla o número de repetições dá-se o nome de variável de controle. 210 / 421 Um laço controlado por variável de controle deve conter 3 elementos: 1 A definição do valor inicial (inicialização) da variável de controle, que deve obrigatoriamente ser feita fora do laço, e apenas uma vez, no início 2 O incremento (ou decremento) da variável de controle 3 Uma condição de saída que resulte falsa quando o número de iterações desejadas for completada. 211 / 421 Alguns erros comuns ao implementar laços controlados são: Falta da inicialização da variável de controle Inicialização da variável de controle dentro do laço Falta do incremento (ou decremento) da variável de controle Condição de saída incompatível com o valor inicial e incremento da variável de controle, o que fará com que nunca termine a execução do laço (o famoso "entrar em loop") 212 / 421 I00000400 - Faça um algoritmo que leia 10 números e escreva os que forem pares. i<-1 enquanto i<=10 faca leia(N) se N %2=0 entao escreva(N) fimse i ← i + 1 fimenquanto 213 / 421 I00000600 - Faça um algoritmo que leia 30 valores e conte quantos estão no intervalo [10,20], escrevendo
Compartilhar