FACULDADE DE VIÇOSA DEPARTAMENTO DE CIÊNCIAS EXATAS E TECNOLÓGICAS DET 109 [PROGRAMAÇÃO DE COMPUTADORES I] APOSTILA [Maria Vanderléa de Queiroz] 1º Semestre – 2013 Sumário 1 SISTEMAS DE NUMERAÇÃO........................................................................................................................ 3 2 ALGORITMO................................................................................................................................................ 9 3 Estrutura Condicional................................................................................................................................ 21 4 ESTRUTURAS DE REPETIÇÃO..................................................................................................................... 28 5 MÓDULOS................................................................................................................................................. 37 6 VETORES ................................................................................................................................................... 45 DET109 [Programação de Computadores I] 1 SISTEMAS DE NUMERAÇÃO Para registrar informações sobre quantidades foram criados diversos métodos de representálas. O método usual é o sistema de numeração posicional de base 10. Isso significa que a posição ocupada por cada algarismo em um número altera seu valor de uma potência de 10 (na base 10) para cada casa à esquerda. Por exemplo, no sistema decimal, de base 10, no número 125 o algarismo 1 representa 100 (uma centena ou 102), o 2 representa 20 (duas dezenas ou 2x10 1) e o 5 representa 5 mesmo (5 unidades ou 5x100). Assim, em nossa notação, 125 = 1x102 + 2x101 + 5x100 1.1 BASE DE UM SISTEMA DE NUMERAÇÃO A base de um sistema é a quantidade de algarismos disponível na representação. A base 10 é a mais usualmente empregada, embora não seja a única utilizada. Exemplos de outras bases no nosso dia a dia acontecem como comprar uma dúzia de rosas ou uma grosa de parafusos (base 12) e também, uma partida de futebol que dura 90 minutos. Os computadores utilizam a base 2 (sistema binário) e os programadores, por facilidade, usam em geral uma base que seja uma potência de 2, tal como a base hexadecimal, 2 4 ou eventualmente ainda a base octal, 23. Na base 10, dispomos de 10 algarismos para a representação do número: 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9. Na base 2, seriam apenas 2 algarismos: 0 e 1. Na base 16, seriam 16: os 10 algarismos aos quais estamos acostumados, mais os símbolos A, B, C, D, E e F, representando respectivamente 10, 11, 12, 13, 14 e 15 unidades. Generalizando, temos que uma base b qualquer disporá de b algarismos, variando entre 0 e (b-1). A representação 125.3810 (base 10) significa 1x102 + 2x101 + 5x100 + 3x10-1 + 8x10-2 Generalizando, representamos uma quantidade N qualquer, numa dada base b, com um número tal como segue: Nb = an.bn + .... + a2.b2 + a1.b1 + a0.b0 + a-1.b-1 + a-2.b-2 + .... + a-n.b-n sendo que an.bn + .... + a2.b2 + a1.b1 + a0.b0 é a parte inteira e a-1.b-1 + a-2.b-2 + .... + a-n.b-n é a parte fracionária. Intuitivamente, sabemos que o maior número que podemos representar com n algarismos, na base b, será o número composto n vezes pelo maior algarismo disponível naquela base (ou seja, b-1). Por exemplo, o maior número que pode ser representado na base 10 usando 3 algarismos será 999 (ou seja, 103 - 1 = 999). Generalizando, podemos ver que o maior número inteiro N que pode ser representado, em uma dada base b, com n algarismos (n "casas"), será N = b n - 1. Assim, o maior número de 2 algarismos na base 16 será FF16 que, na base 10, equivale a 25510 = 162 - 1. 3 DET109 [Programação de Computadores I] 1.2 REPRESENTAÇÃO BINÁRIA Os computadores modernos utilizam apenas o sistema binário, isto é, todas as informações armazenadas ou processadas no computador usam apenas duas grandezas, representadas pelos algarismos 0 e 1. Essa decisão de projeto deve-se à maior facilidade de representação interna no computador, que é obtida através de dois diferentes níveis de tensão. Havendo apenas dois algarismos, portanto dígitos binários, o elemento mínimo de informação nos computadores foi apelidado de bit (uma contração do inglês binary digit). Na base 2, o número "10" vale dois. Mas se 10 2 = 210, então dez é igual a dois? Não, dez não é e nunca será igual a dois! Na realidade, "10" não significa necessariamente "dez". Nós estamos acostumados a associar "10" a "dez" porque estamos acostumados a usar o sistema de numeração decimal. O número 102 seria lido "um-zero" na base 2 e vale 2 10 (convertido para "dois" na base dez), 105 seria lido "um-zero" na base 5 e vale 5 10 (convertido para "cinco" na base dez), 1010 pode ser lido como "um-zero" na base 10 ou então como "dez" na base dez, 1016 seria lido "um-zero" na base 16 e vale 1610 (convertido para "dezesseis" na base dez), etc. Toda vez que um número for apresentado sem que seja indicado em qual sistema de numeração ele está representado, entenderemos que a base é dez. Sempre que outra base for utilizada, a base será obrigatoriamente indicada. A representação binária é perfeitamente adequada para utilização pelos computadores. No entanto, um número representado em binário apresenta muitos bits, ficando longo e passível de erros quando manipulado por seres humanos normais como, por exemplo, os programadores, analistas e engenheiros de sistemas. Para facilitar a visualização e manipulação por programadores de grandezas processadas em computadores, são usualmente adotadas as representações octal (base 8) e principalmente hexadecimal (base 16). Ressaltamos mais uma vez que o computador opera apenas na base 2 e as representações octal e hexadecimal não são usadas no computador, elas se destinam apenas à manipulação de grandezas pelos programadores. 1.2.1Atividades a) Qual a representação em binário do número 57? Solução: Para encontrarmos esta representação podemos fazer divisões sucessivas por 2 e marcar todos os restos e ao final o que sobrou como pode ser visto abaixo. 57 1 2 28 0 2 14 0 Pegando os dígitos marcados na direção da seta, temos o nº na base 2, 1 1 1 0 0 1 2 7 1 2 3 1 2 1 Outra forma de encontrar o número é considerar as potências da base 2 e ligar, colocar um, naquelas que serão usadas para somar o valor desejado como mostrado abaixo: 25 32 1 24 16 1 23 8 1 22 4 0 21 2 0 20 1 1 = 32+ 16+ 8+ 0+ 0+ 1= 57 b) De maneira inversa, o número 101012 representa qual número decimal? Vamos colocar todos os números e somar as potências de duas correspondentes. 1 0 1 0 1x24 0x23 1x22 0x21 =16+ 0+ 4+ 1+ 1 1x20 1 = 21 4 DET109 [Programação de Computadores I] 1.2.2Exercícios a) Qual a representação binária do número 68? b) Qual a representação em decimal do número 111012? 1.3 REPRESENTAÇÃO EM OCTAL E EM HEXADECIMAL Em projetos de informática, isto é, nos trabalhos realizados pelos programadores, analistas e engenheiros de sistemas, é usual representar quantidades usando sistemas em potências do binário. Octal e principalmente hexadecimal, são utilizados para reduzir o número de algarismos da representação e conseqüentemente facilitar a compreensão da grandeza e evitar erros. No sistema octal, base 8, cada três bits são representados por apenas um algarismo octal, de 0 a 7. No sistema hexadecimal, base 16, cada quatro bits são representados por apenas um algarismo hexadecimal, de 0 a F. Em Computação e Eletrônica, as bases mais utilizadas para sistemas de numeração são: - Binária (base 2) - Octal (base 8) - Decimal (base 10) - Hexadecimal (base 16) 1.3.1Atividades c) Qual a representação em octal do número 157? Solução: Para encontrarmos esta representação podemos fazer divisões sucessivas por 8 e marcar todos os restos e ao final o que sobrou como pode ser visto abaixo. 157 5 8 19 3 8 2 Pegando os dígitos marcados na direção da seta, temos o nº na base 8, 2 3 5 Outra forma de encontrar o número é considerar as potências da base 8 e ligar, colocar um, naquelas que serão usadas para somar o valor desejado como mostrado abaixo: 82 64 2 81 8 3 80 1 5 = 2x64+ 3x8+ 5x1= 157 d) De maneira inversa, o número 20711 representa qual número decimal? Vamos colocar todos os números e somar as potências de duas correspondentes. 2 0 7 1 4 3 2 2x8 0x8 7x8 1x81 =8192+ 0+ 448+ 8+ 1 1x80 1 = 8649 e) Posso dizer que o número 180 está na base octal? Justifique sua resposta. f) Qual a representação em hexadecimal do número 2150? Solução: Para encontrarmos esta representação podemos fazer divisões sucessivas por 16 e marcar todos os restos e ao final o que sobrou como pode ser visto abaixo. 238 0 16 Pegando os dígitos marcados na direção da seta, temos o nº na base 16, 9 4 C 5 DET109 [Programação de Computadores I] 12 148 4 16 9 Outra forma de encontrar o número é considerar as potências da base 8 e ligar, colocar um, naquelas que serão usadas para somar o valor desejado como mostrado abaixo: 162 256 9 161 16 4 160 1 12 = 9x256+ 4x16+ 12x1= 2380 g) De maneira inversa, o número 1AB21 representa qual número decimal? Vamos colocar todos os números e somar as potências de duas correspondentes. 1 A B 2 1x164 Ax163 Bx162 2x161 =65536+ 40960+ 2816+ 32+ 1 1x160 1 = 109345 1.3.2Exercícios c) Qual a representação octal do número 111? d) Qual a representação em decimal do número 77108? e) Qual a representação hexadecimal de 4268? f) Qual a representação em decimal do número 8048? 1.3.3Lista de exercícios complementar http://www.questoesdeconcursos.com.br/pesquisar/disciplina/arquitetura-de-computadores/assunto/sistemas-denumeracao?di=93&page=3&pp=&ss=249 1. Coloque V(Verdadeiro) ou F(Falso). Deixe os cálculos na solução da questão. a) ( ) No sistema binário, a operação de multiplicação dos números 1011 e 101 resulta no número 1000101 (CESPE - 2011 - EBC - Analista - Administração de Sistemas). b) ( ) No sistema binário, a operação de subtração dos números 101101 e 100111 tem como resultado o número 000110. (CESPE - 2011 - EBC - Analista - Administração de Sistemas) c) ( ) A soma dos números binários 11001 e 10111 é o binário 110000; a soma dos números hexadecimais A2E e C1F é o hexadecimal 1A4D; e a soma dos números octais 376 e 427 é o octal 1025. (CESPE - 2008 - MPE-RR - Analista de Sistemas) d) ( ) Considere que, em uma operação, os números binários 1100 e 1111 sejam somados em um microprocessador. Nesse caso, o resultado dessa operação, em notação binária, corresponde a 10011. (CESPE - 2011 - FUB - Técnico de Laboratório - Física – Específicos) e) A soma dos endereços representados em hexadecimal pelos números 243A e B7D6 resulta no endereço DC10, também representado na base 16. (CESPE - 2010 - MPU - Técnico de Informática) f) O endereço codificado em hexadecimal como 10F é representado na base 2 pelo número 100001111. (CESPE - 2010 - MPU - Técnico de Informática) 2. Nos sistemas de numeração, da conversão do número 120 na base octal para a base hexadecimal, resulta: (FUNCAB - 2010 - SEJUS-RO - Analista de Sistemas) a) ( ) 80 b) ( ) 2E c) ( ) 3E8 d) ( ) 50 e) ( ) 1010000 3. Se o sistema decimal é utilizado pelos seres humanos, o sistema binário constitui a base para a representação da informação nos computadores. Nesse contexto, um equipamento 6 DET109 [Programação de Computadores I] dispõe de três displays, o primeiro que mostra números em formato decimal, o segundo em binário e o terceiro em hexadecimal, havendo uma correspondência entre as representações. Se o display decimal mostra o número 250, os equivalentes em binário e em hexadecimal mostrarão, respectivamente, (FGV - 2010 - CODESP-SP - Analista de Sistemas - Tipo 1) a) ( d) ( ) 11111010 e FA b) ( ) 11111110 e FE. e) ( 4. Seja N uma base ) 11111010 e FE. ) 11111110 e FA. de numeração, c) ( ) 11111010 e FC. e os números . Sabendo-se que a igualdade B + D = A + E.C é válida, o produto de valores válidos para a base N é (CESGRANRIO - 2011 - TRANSPETRO - Analista de Sistemas Júnior) a) ( ) 24 b) ( ) 35 c) ( ) 36 d) ( ) 42 e) ( ) 45 5. Em relação aos sistemas de numeração e representação de dados, analise as seguintes afirmativas: (FUMARC - 2011 - BDMG - Analista de Sistemas) I. O número 10001 em binário corresponde ao número 17 na representação decimal. II. D na representação hexadecimal corresponde ao número 1110 em binário. III. BBB na representação hexadecimal corresponde ao número 3003 na representação decimal. Marque a a) b) c) d) alternativa CORRETA: apenas as afirmativas I e II são verdadeiras. apenas as afirmativas I e III são verdadeiras. apenas as afirmativas II e III são verdadeiras. todas as afirmativas são verdadeiras. 6. 1001+1010=10011 no sistema de numeração binário é equivalente a (COPEVE-UFAL - 2011 - UFAL - Analista de Tecnologia da Informação) a) b) c) d) e) 9+8=17 no sistema de numeração decimal. 10+11=21 no sistema de numeração decimal. 9+10=19 no sistema de numeração decimal. 7+12=19 no sistema de numeração decimal. 11+12=23 no sistema de numeração decimal. 7. Considere o quadro abaixo: (FCC - 2011 - TRT - 1ª REGIÃO (RJ) - Analista Judiciário - Tecnologia da Informação) Os valores que preenchem correta e respectivamente as colunas Binário, Octogonal e Hexadecimal são a) 11001 e 101101; b) 11000 e 101100; c) 10111 e 101010; d) 11010 e 101011; e) 10111 e 101001; 8. Multiplicando-se os 23 e 43; 11 e 1B. 20 e 53; 10 e 1A. 22 e 54; 10 e 1C. 21 e 53; 11 e 1A. 21 e 45; 12 e 1A. hexadecimais A3 DESENVOLVIMENTO - Analista de Sistemas) a) 7C29 b) 7DAF c) 7D6F e C5, obtém-se d) 7EF9 (FCC - 2011 - NOSSA CAIXA e) 7EA9 7 DET109 [Programação de Computadores I] 9. O resultado de 15AF subtraído de 17FA, em hexa, é (FCC - 2011 - NOSSA CAIXA DESENVOLVIMENTO - Analista de Sistemas) a) 25 b) 200 c) 24B d) 24C e) DB5 10. Um sistema de numeração é um conjunto de regras que permite ler e escrever números. Sobre os sistemas de numeração é CORRETO afirmar: (IESES - 2010 - CRM-DF - Assistente de Tecnologia da Informação) I. O sistema decimal, que representa números em base 10, é um sistema de numeração em que todas as quantidades são representadas utilizando o conjunto de símbolos S = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }. II. O sistema binário, que representa números em base 2, é um sistema de numeração em que todas as quantidades são representadas utilizando o conjunto de símbolos S = { 0, 1 }. III. O sistema octal, que representa números em base 8, é um sistema de numeração em que todas as quantidades são representadas utilizando o conjunto de símbolos S = { 1, 2, 3, 4, 5, 6, 7, 8 }. IV. O sistema hexadecimal, que representa números em base 16, é um sistema de numeração em que todas as quantidades são representadas utilizando o conjunto de símbolos S = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F }. A sequência correta é: a) Apenas as assertivas I, II e IV estão corretas. b) Apenas as assertivas I e II estão corretas. c) Apenas as assertivas I, II e III estão corretas. d) As assertivas I, II, III e IV estão corretas. 11. Todo sistema de computação moderno é construído de modo a ser capaz de armazenar, interpretar, armazenar e manipular informações codificadas de qual forma? a) Decimal b) Octal. c) Binária. d) Hexadecimal. 12. Considere A=1010 e B=1100, sendo esses valores representados em binário. O valor de y para = A.B, ou seja, y =Aand B, é: (FUNCAB - 2010 - PRODAM-AM - Analista de Tecnologia da Informação - Banco de Dados) a) 0110 b) 1001 c) 1000 d) 1110 f) 10110 13. Um administrador de sistemas, ao analisar o conteúdo de um arquivo binário, percebeu que o primeiro byte desse arquivo é, em hexadecimal, igual a 9F, que corresponde, em decimal, ao valor (CESGRANRIO - 2010 - BNDES - Analista de Sistemas – Suporte) a) 16 b) 99 c) 105 d) 159 e) 234 14. Considere os dois números abaixo: X = 2577377 (octal) Y = AFEFF (hexadecimal) Assinale a alternativa que apresenta o resultado da subtração (X - Y), expresso no sistema de numeração decimal. (FUNIVERSA - 2010 - MPE-GO - Técnico de Informática) b) 38564948 b) 1856738 c) 7052342 d) 105432 e) 0 15. Considerando o início em zero, o sistema de numeração hexadecimal tem a mesma representação do sistema decimal até o número (FCC - 2010 - TRE-RS - Técnico Judiciário Programação de Sistemas) a) 1 b) 9 c) 10 d) 15 e) 16 16. Um odômetro binário digital mostra 10010010 no mostrador. Os dois números que se seguem a partir desse número, são: (FGV - 2009 - MEC – Documentador) a) 10010011 e 10010111 b) 10010011 e 10010101 c) 10010011 e 10010100 d) 10010101 e 10010110 e) 10010101 e 10010111 8 DET109 [Programação de Computadores I] 2 ALGORITMO 2.1 CONCEITO 1. "Serve como modelo para programas, pois sua linguagem é intermediária à linguagem humana e às linguagens de programação, sendo então, uma boa ferramenta na validação da lógica de tarefas a serem automatizadas.“ 2. “Os algoritmos, servem para representar a solução de qualquer problema, mas no caso do Processamento de Dados, eles devem seguir as regras básicas de programação para que sejam compatíveis com as linguagens de programação.” 3. “Um procedimento para resolver um problema matemático (ex. achar o máximo divisor comum) em um número finito de passos que frequentemente envolve a repetição de uma operação; ou de forma mais abrangente: um procedimento passo-a-passo para resolver um problema ou realizar algum objetivo.” (Manber, 1989:1) 4. Em Matemática: “sequência finita de regras, raciocínios ou operações que, aplicada a um número finito de dados, permite solucionar classes semelhantes de problemas (por exemplo, algoritmo para extrais uma raiz cúbica)”. 5. Em Informática: “conjunto das regras e procedimentos lógicos perfeitamente definidos que levam à solução de um problema em um número finito de etapas”. O significado da palavra é muito similar ao de uma receita, procedimento, técnica, rotina. Um algoritmo é um conjunto finito de regras que fornece uma seqüência de operações para resolver um problema específico. Segundo o dicionário do prof. Aurélio Buarque de Holando um algoritmo é um: "Processo de cálculo, ou de resolução de um grupo de problemas semelhantes, em que se estipulam, com generalidade e sem restrições, regras formais para a obtenção de resultado ou de solução de problema." Knuth (1968,1973), uma das pessoas mais respeitadas na área de algoritmos computacionais, indicou uma lista de cinco propriedades que são amplamente aceitas como requisitos para um algoritmo: Finitude: “Um algoritmo deve sempre terminar após um número finito de etapas”. Definição: “Cada passo de um algoritmo deve ser definido com precisão; as ações a serem executadas deverão ser especificadas rigorosamente e sem ambiguidades para cada caso”. Entrada: “Valores que são dados ao algoritmo antes que ele inicie. Estas entradas são tomadas a partir de um conjunto de objetos especificados”. Saída: “...os valores resultantes das ações do algoritmo relacionadas com as entradas especificadas”. Eficácia: “...todas as operações a serem realizadas no algoritmo deve ser suficientemente básicas que podem, em princípio, ser feitas com precisão e em um período de tempo finito por um homem usando papel e lápis”. 2.2 FORMAS DE REPRESENTAÇÃO 2.2.1Descrição Narrativa Nesta forma de representação os algoritmos simples são expressos diretamente em linguagem natural. 9 DET109 [Programação de Computadores I] 1. Receita de bolo Misture os ingredientes Unte a forma com manteiga Despeje a mistura na forma Se houver coco ralado então despeje sobre a mistura Leve a forma ao forno Enquanto não corar deixe a forma no forno Retire do forno Deixe esfriar 3. Trocar um pneu furado Afrouxar ligeiramente os parafusos Suspender o carro Retirar os parafusos e o pneu Colocar o pneu reserva Apertar os parafusos Abaixar o carro Dar o aperto final nos parafusos 5. Calcular o IMC e o peso ideal de uma pessoa Obter o peso de uma pessoa Obter a altura de uma pessoa Obter o sexo de uma pessoa Calcular o IMC dividindo-se o peso pelo quadrado da altura (IMC = peso/altura2) Se o sexo for feminino Exibir o IMC Peso Ideal = (62.1 * altura) – 44.7 Se o sexo for masculino Peso Ideal = (72.7 * altura) – 58 Exibir o Peso Ideal 2. Tomar um banho Entrar no banheiro e tirar a roupa Abrir a torneira do chuveiro Entrar na água Ensaboar-se Sair da água Fechar a torneira Enxugar-se Vestir-se 4. Calcular média de um aluno Obter as suas 2 notas de provas Calcular a média aritmética Se a média for maior que 7, o aluno foi aprovado, senão ele foi reprovado 6. Calcular a distância entre dois pontos(x1,y1) e (x2,y2) Obter o valor de X1 Obter o valor de y1 Obter o valor de x2 Obter o valor de Y2 Calcular a distância Distancia = ( x 2 − x1) 2 + ( y 2 − y1) 2 Exibir Distancia 2.2.2Fluxograma 6. Fluxograma Convencional É uma representação gráfica de algoritmos onde formas geométricas diferentes implicam ações (instruções, comandos) distintos. – Tal propriedade facilita o entendimento das idéias contidas nos algoritmos e justifica sua popularidade – Esta forma é aproximadamente intermediária à descrição narrativa e ao pseudocódigo (subitem seguinte), pois é menos imprecisa que a primeira e, no entanto, não se preocupa com detalhes de implementação do programa Início e fim Decisão Operação de atribuição Operaçã Operação de Saída o de Entrada EXEMPLO: Cálculo da média de duas notas de um aluno 10 DET109 [Programação de Computadores I] Não existe consenso entre os especialistas sobre qual seria a melhor maneira de representar um algoritmo. Atualmente a maneira mais comum de representar-se algoritmos é através de uma pseudo-linguagem ou pseudo-código. Esta forma de representação tem a vantagem de fazer com que o algoritmo seja escrito de uma forma que está próxima de uma linguagem de programação de computadores. Algoritmo de encontrar a menor temperatura dentro de registros de temperaturas mostrada na seção anterior usou linguagem natural para representar o algoritmo. 2.2.3Conceitos Importantes PROGRAMA é uma seqüência de instruções. O programa deve ser escrito numa LINGUAGEM DE PROGRAMAÇÃO; as linguagens naturais têm ambigüidades e podem dar margem a diferentes interpretações. HARDWARE é o conjunto de dispositivos físicos do computador, o equipamento. SOFTWARE são os programas que permitem que o equipamento saiba o que realizar, que ele funcione. MEMÓRIA (escaninhos no modelo hipotético) é um dispositivo físico para armazenar programas e dados. PROCESSADOR (operador e máquina de calcular no modelo hipotético) é o dispositivo que realiza o processamento. DISPOSITIVOS DE ENTRADA E SAÍDA OU PERIFÉRICOS (no modelo hipotético corresponde à caixa de entrada, caixa de saída, máquina de escrever) são formas de 11 DET109 [Programação de Computadores I] comunicação entre o usuário e o computador. Ex.: leitoras de disco, monitores, teclados, vídeos, impressoras, etc. BIT é a menor unidade de informação de um computador, pode assumir os valores 0 ou 1. BYTE é o conjunto de oito bits. SISTEMA OPERACIONAL é a coleção de programas que gerencia e aloca recursos de hardware e de software. Exemplos de tarefas que um sistema operacional realiza são: leitura de dados pelo teclado, impressão de informações no vídeo, gerenciamento da execução de vários programas pela CPU, gerenciamento da memória principal e da memória secundária para uso dos programas em execução, etc. Ex.: Linux, Unix, Windows XP, OS2, MS-DOS. LINGUAGEM DE MÁQUINA é o conjunto de instruções que podem ser interpretados e executados diretamente pela CPU de um dado computador. É específica para cada computador. LINGUAGEM ASSEMBLER (Linguagem de Baixo Nível) representação da linguagem de máquina através de códigos mnemônicos. Também é específica de cada máquina. LINGUAGEM DE ALTO NÍVEL (Linguagem de Programação) é uma linguagem formal que independe do conjunto de instruções da linguagem de máquina do computador. Cada instrução de alto nível equivale a várias instruções da linguagem de máquina, sendo assim mais produtiva. Ex.: Pascal, C, Algol, BASIC, Lisp, Prolog, Java, PHP, etc. Esta linguagem se aproxima da linguagem humana e pode ser traduzida por programas especiais em linguagem de máquina. COMPILADOR é um tradutor de programas escritos em uma linguagem de programação para programas em linguagem de máquina. Uma vez que o programa foi convertido para código de máquina, este pode ser executado independente do compilador e do programa original. SISTEMA - Um conjunto equipamentos). interligado de programas (e, eventualmente, também de 2.2.4Exercícios 1. Faça um algoritmo que descreva o procedimento para trocar um pneu de um carro. 2. Uma agência de previsão do tempo armazena diariamente a temperatura média de uma determinada região. Cada uma dessas temperaturas fica arquivada em um cartão, com a data e o horário da coleta. Você deve desenvolver um algoritmo que irá descobrir qual a menor temperatura registrada nos arquivos da agência. Lembre-se que as temperaturas podem ser negativas ou positivas. 3. Você está dirigindo um ônibus que vai do Rio de Janeiro para Fortaleza. No início temos 32 passageiros no ônibus. Na primeira parada, 11 pessoas saem do ônibus e 9 entram. Na segunda parada, 2 pessoas saem do ônibus e 2 entram. Na parada seguinte, 12 pessoas entram e 16 pessoas saem. Na próxima parada, 5 pessoas entram no ônibus e 3 saem. Qual a cor dos olhos do motorista do ônibus? 4. Foram pintadas cinco casas com cinco cores diferentes. Em cada casa mora uma pessoa de nacionalidade diferente. Cada um dos proprietários dessas casas bebe uma bebida diferente, tem um animal de estimação diferente e pratica um determinado esporte. Essas três características: bebidas, animais de estimação e esportes são únicos para cada proprietário, não existe repetição. Segundo as lendas, existe um problema de lógica, criado por Albert Einstein, de difícil solução, mas possível. Este problema é genial pois não possui pegadinhas e não precisa de um grande número de conhecimento extra. Para resolvê-lo você deve aplicar a lógica e ter muita perseverança. Os fatos que devem ser considerados são os seguintes: 1. O inglês mora na casa vermelha. 12 DET109 [Programação de Computadores I] 2. O sueco tem cães. 3. O dinamarquês bebe chá. 4. A casa verde fica a esquerda da casa branca. 5. O dono da casa verde bebe café. 6. A pessoa que joga futebol cria pássaros. 7. O dono da casa amarela joga beisebol. 8. O homem que mora na casa do centro bebe leite. 9. O norueguês mora na primeira casa. 10. O homem que joga vôlei mora ao lado da pessoa que tem gatos. 11. O homem que tem um cavalo mora ao lado do homem que joga beisebol. 12. A pessoa que joga tênis bebe cerveja. 13. O alemão joga hóquei. 14. O norueguês mora ao lado da casa azul. 15. O homem que joga vôlei tem um vizinho que bebe agua. O problema é: Qual proprietário tem como animal de estimação o peixe? 5. Faça um algoritmo que calcule a área de uma mesa de jantar (redonda ou retangular). 6. Dois caçadores estão perdidos em uma floresta, sem munição e prestes a morrer de fome. Um deles, conhecedor da flora, conseguiu achar uma planta muito nutritiva. Entretanto, para comê-la, eles têm de esquentá-la por 30 segundos exatos senão ela os matará. Porém, para marcar o tempo, eles só têm duas ampulhetas, uma que marca 22 segundos e outra que marca 14 segundos. Como eles conseguirão marcar o tempo? 7. Você acaba de encontrar uma caixa. Ao abri-la, você encontra nove moedas de ouro idênticas e um bilhete que diz que uma das moedas é falsa (foi forjada com um metal que possui um peso diferente do outro, mas que é imperceptível pela comparação unitária feita pelas mãos). Você também dispõe de uma balança de dois pratos. Como descobrir qual a moeda diferente usando apenas três vezes a balança e ainda dizer se ela é mais leve ou mais pesada? 8. Em um lado de uma ponte estão cinco pessoas que precisam atravessá-la. Está escuro e elas possuem apenas uma lanterna que deve ser sempre utilizada durante a travessia da ponte que suporta a passagem de apenas duas pessoas simultaneamente. Essas pessoas possuem idades diferentes levando, portanto, tempos diferentes para atravessar a ponte: uma delas leva 1 minuto, outra; 3 minutos, a terceira; 6 minutos a quarta 8 e a última leva 20 minutos. Como elas devem fazer para que todos atravessem a ponte em no máximo 30 minutos? Você pode praticar interativamente no seguinte endereço: http://www.mdig.com.br/index.php?itemid=1014 9. Em um lado de um rio se encontram: três missionários e três canibais. Existe apenas uma canoa capaz de levar apenas duas pessoas de cada vez. Sabendo que, caso o número de canibais seja maior do que o de missionários, esses serão devorados por eles, como fazer para atravessar todos eles em segurança para a outra margem do rio? Lembre-se que, para que outros entrem no barco, os que estão lá precisam descer e nesse momento pode ocorrer uma tragédia! A canoa nunca faz qualquer viagem (seja de ida ou de volta) sozinha. 10. Desenvolva um fluxograma para representar o algoritmo 5 (cálculo do IMC e do peso ideal) em descrição narrativa apresentado anteriormente. 13 DET109 [Programação de Computadores I] 11. Considere duas cidades A e B. A cidade A encontra-se nas coordenadas (x1,y1) e a cidade B em (x2,y2). Desenvolva um algoritmo que calcule a distância entre elas (DAB) e exiba a melhor rota para sair de A e chegar em B, considerando que se a distância entre as cidades (DAB) for maior ou igual a 400 km exiba a mensagem “Ir pela BR262”, caso seja menor que 400 km “Ir para BR101”. 12. Considere o seguinte algoritmo em descrição narrativa para calcular e exibir as raízes de uma equação do segundo grau. Desenvolva um fluxograma que represente este algoritmo. Obter o valor de A Obter o valor de B Obter o valor de C Calcular delta = B 2 − 4 AC Se delta for menor que zero entao Exiba mensagem “Não existem raízes reais” Senão − B + delta Calcule x1 = 2A − B − delta Calcule x 2 = 2A Exibir x1 Exibir x2 13. Para calcular o salário líquido de um funcionário temos o seguinte algoritmo em descrição narrativa. Desenvolva o fluxograma correspondente a esta situação. Obter o número de horas trabalhadas (NHT) Obter o valor da hora trabalhada (VHT) Obter o número de dependentes (NDEP) Obter o número de horas extras (NHE) Obter o número de dias faltosos (FALTAS) Calcular o salário Bruto (SBRUTO) multiplicando-se NHT por VHT Calcular desconto do INSS que é igual a 10% do salário bruto Calcular o salário família (SFAMILIA) que é 5% do salário bruto para cada dependente Se houver hora extra Calcular o valor a pagar pelas horas extras (VEXTRA), 50% a mais de VHT multiplicado por NHT Calcular o desconto por falta (VFALTAS) igual a FALTAS multiplicado por VHT Calcular salário líquido Calcular o desconto do imposto de renda (IR) de forma simplificada. Caso salário seja maior ou igual a 2000,00 descontar 6% Calcular e exibir o salário líquido SLIQUIDO = SBRUTO + SALARIOFAMILIA + VEXTRA – INSS – IR – VFALTAS 2.2.5PSEUDOCÓDIGO Esta é uma forma de representação de algoritmos rica em detalhes, como a definição dos tipos das variáveis usadas no algoritmo. Por assemelhar-se bastante à forma em que os programas são escritos, encontra muita aceitação. Na verdade, esta representação é suficientemente geral para permitir a tradução de um algoritmo nela representado para uma linguagem de programação específica seja praticamente direta. Neste curso, utilizaremos a linguagem Visualg para descrever os algoritmos em pseudocódigo. 14 DET109 [Programação de Computadores I] O Visualg é um programa que permite editar, interpretar e executar algoritmos em uma linguagem próxima do português estruturado, pseudocódigo como um programa normal de computador. Este é um bom recurso para quem inicia em programação pois permite em um mesmo ambiente criar e entender o processo de execução. O formato geral de um algoritmo no Visualg é o seguinte: algoritmo "semnome" // Função : // Autor : // Data : 8/8/2011 // Seção de Declarações var inicio // Seção de Comandos fimalgoritmo 2.2.6 Exemplos EXEMPLO 1 algoritmo "CalculaMedia" // Função : Calcula a média aritmética entre duas notas // Autor : Maria Vanderléa de Queiroz // Data : 8/8/2005 var nota1,nota2, media: real inicio leia(nota1) leia(nota2) media <- (nota1+nota2)/2 escreva("Media = ",media) fimalgoritmo EXEMPLO 2 algoritmo "CalculaIMC" // Função : // Autor : // Data : 8/8/2011 // Seção de Declarações var peso, altura, imc: real inicio // Seção de Comandos leia(peso) leia(altura) imc <- peso/(altura * altura) escreval("IMC = ",imc) fimalgoritmo 2.2.7Etapas para execução de um programa Considerando uma linguagem compilada, em primeiro lugar é preciso escrever o programa fonte. Este é o processo de edição. Nesta fase o programa fonte é como um texto, porém com uma estrutura característica, como mostrado nos exemplos anteriores. O programa fonte é um texto que nós entendemos, porém o computador não. Para que o algoritmo escrito seja entendido pelo computador, ele precisa ser traduzido para uma linguagem que o computador possa entender e executar, uma linguagem mais próxima dos comandos da máquina. Este processo de tradução chama-se compilação. 15 DET109 [Programação de Computadores I] Após a compilação gera-se um programa executável, que pode enfim, entrar na fase de execução. Outra forma de execução de um programa é a interpretação. A execução de um programa interpretado é em geral mais lenta que o programa compilado. Por outro lado, o uso de programas interpretados permite que trechos de código possam ser trocados por novos facilmente, fazendo com que o programa fonte possa mudar durante sua execução. Este é um dos grandes motivos de se usar programas interpretados em sistemas especialistas. Duas linguagens para as quais podemos encontrar interpretadores são Lisp e Prolog. No nosso caso, utilizaremos o Visualg para implementar nossos algoritmos. Este é ambiente que permite editar e interpretar algoritmos em sua linguagem própria. Assim, precisamos: (1) editar (escrever e corrigir) o algoritmo, (2) executar, de forma interpretada, isto é, um a um os comandos, (3) observar o comportamento das variáveis, (4) fornecer ou gerar valores de entrada e (5) observar os resultados de saída. Por permitir estas etapas, o Visualg é uma ferramenta inicial que após o entendimento dos conceitos fundamentais pode ser facilmente descartada para utilizar-se um outro ambiente de programação específico para uma determinada linguagem de programação. 2.3 LINGUAGEM DO VISUALG • Formato geral do algoritmo algoritmo "semnome" // Função : Coloque aqui a função deste algoritmo // Autor : Coloque aqui seu nome // Data : 29/2/2012 // Seção de Declarações: são colocadas as variáveis necessárias ao processamento var inicio // Seção de Comandos fimalgoritmo • Variáveis o Identificam informações necessárias no processamento o Precisam ser declaradas antes de serem utilizadas o Possuem nome e tipo (inteiro, real, caracter, ...) - o Com relação ao nome da variável: deve começar com uma letra e conter letras, números e underline, até um limite de 30 caracteres. É sugestão que os nomes sejam significativos. - Com relação ao tipo: • inteiro: define variáveis numéricas sem do tipo inteiro, sem casas decimais • real: define variáveis numéricas do tipo real, com casas decimais • caractere: define variáveis com sequências de caracteres ou strings. Estas podem representar nome de pessoas, nome de cidades, telefone entre outros. • logico: variáveis com apenas dois valores, verdadeiro ou falso, conhecidos como tipos booleanos. • Existem variáveis que podem ser do tipo vetor que será apresentado posteriormente. Observe os exemplos 1 e 2 no item 2.2.6. 16 DET109 [Programação de Computadores I] • Operador de atribuição: permite atribuir valores o A atribuição de valores a variáveis é feita com o operador <- . o Do lado esquerdo fica a variável à qual se deseja atribuir um valor e do lado direito pode-se colocar qualquer expressão (constante, variáveis, expressões) desde que seu resultado tenha tipo igual ou compatível ao da variável. Exemplos: x <- 3 salario <- 4580.50 nomeDoEstudante <- “Jose Florentino de Jesus” terminar <- falso delta <- b^2 – 4 * a * c • Operadores Aritméticos +,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). + 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". • Operadores Relacionais =,<, 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"?)resulta em 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. • Operadores Lógicos nao Operador unário de negação. nao VERDADEIRO = FALSO, e nao FALSO = VERDADEIRO. Tem a maior precedência entre os operadores lógicos. ou Operador que resulta VERDADEIRO quando um dos seus operandos lógicos for verdadeiro. e 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. 17 DET109 [Programação de Computadores I] • 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. Exemplos. Representação tradicional x1 + x 2 + x3 3 ( x 2 − x1) 2 + x1 = • − B+ ( y 2 − y1) 2 delta 2A Representação computacional (x1 + x2 + x3)/3 raizq((x2-x1)^2+(y2-y1)^2) x1 <- (-B + raizq(delta)) / (2 * A) Comandos de entrada e saída: o Saída: escreva ou escreval: escreve no dispositivo de saída padrão, na tela, o conteúdo de cada uma das expressões que compõem a lista de expressões, que devem estar separadas por vírgulas. É possível especificar o número de espaços no qual se deseja escrever um determinado valor. Por exemplo, o comando escreva(x:5) escreve o valor da variável x em 5 espaços, alinhado-o à direita. Para variáveis reais, pode-se também especificar o número de casas fracionárias que serão exibidas. Por exemplo, considerando y como uma variável real, o comando escreva(y:6:2)escreve seu valor em 6 espaços colocando 2 casas decimais. Outros exemplos: escreva(“Valor da média = “,media) escreval(“Raiz cúbica de 27 = “,27 ^(1/3)) escreval(“x = “, x:4:1, y+3:4)) Entrada: leia - Forma geral: leia(<lista de variáveis>) - Descrição: recebe valores digitados pelo usuário, atribuindo-os às variáveis cujos nomes estão em <lista de variáveis>, é respeitada a ordem especificada na lista. - Exemplos: leia(nome) leia(salario) Após esta introdução de conceitos fundamentais fica mais fácil entender os algoritmos dos exemplos 1 e 2 anteriores. Na próxima sessão são apresentadas as versões em Visualg de algoritmos vistos anteriormente. o 2.4 TRADUÇÃO DE ALGORITMOS Traduza os algoritmos em fluxograma à esquerda para algoritmos em Visualg. 18 DET109 [Programação de Computadores I] início nota1,nota2,nota3 media ← (nota1 + nota 2 + nota3) 3 media algoritmo "calculaMedia" var nota1,nota2,nota3: real //dados de entrada media: real //processamento e saída inicio escreva("Digite 1ª nota: ") leia(nota1) escreva("Digite 2ª nota: ") leia(nota2) escreva("Digite 3ª nota: ") leia(nota3) media <- (nota1+nota2+nota3)/3 escreva("Média = ",media) fimalgoritmo fim algoritmo "distancia2Pontos" var x1,y1,x2,y2: inteiro distancia: real inicio escreva("Digite a coordenada x1: ") leia(x1) escreva("Digite a coordenada y1: ") leia(y1) escreva("Digite a coordenada x2: ") leia(x2) escreva("Digite a coordenada y2: ") leia(y2) distancia <- raizq((x2-x1)^2+(y2-y1)^2) escreva("Distância (",x1,",",y1,") e ","(",x2,",",y2,") = ",distancia) início x1,y1,x2,y2 distancia = distancia fim 2.5 EXERCÍCIOS 1. Faça um algoritmo que leia as 3 notas de um aluno (x1, x2 e x3), no intervalo de 0 a 10, calcule e exiba a média ponderada das notas deste aluno, com pesos p1 = 2, p2 = 3 e p3 = 5. A média aritmética ponderada é dada por: Ou seja, neste caso, somatório das notas multiplicadas pelos respectivos pesos e tudo dividido pela soma dos pesos _ xp = Teste seu algoritmo para x1 = 5, x2 = 7 e x3 = 8. O resultado deverá ser 7.1. 2. Um sistema de equações lineares do tipo: , pode ser resolvido de acordo com: 19 DET109 [Programação de Computadores I] Desenvolva um algoritmo que lê os coeficientes a,b,c,d,e e f, calcule e exiba os valores de x e y. Teste seu algoritmo com a = 2, b = 3, c = 8, d = 5, e = -1 e f = 3. O resultado será x = 1 e y = 2. 3. O custo ao consumidor de um carro novo é a soma do custo de fábrica com a percentagem do distribuidor e dos impostos (aplicados ao custo de fábrica). Supondo que a percentagem do distribuidor seja de 25% e os impostos de 46%, desenvolva um algoritmo que leia o custo de fábrica de um carro e exiba o custo ao consumidor. 4. Faça um algoritmo que leia o tempo de duração de um evento em uma fábrica expressa em segundos e mostre-o expresso em horas, minutos e segundos. 5. Escrever um algoritmo que lê um valor inteiro em reais (R$) e calcula qual o menor número possível de notas de 100, 50, 20, 10, 5, 2 e 1 em que o valor lido pode ser decomposto. Escrever o valor lido e a relação de notas necessárias. 20 DET109 [Programação de Computadores I] 3 ESTRUTURA CONDICIONAL 3.1 INTRODUÇÃO Na vida real tomamos decisões a todo o momento baseadas em uma situação existente. Em um algoritmo, chamamos esta situação de condição. Associada a uma condição, existirá uma alternativa possível de ações. se <condição> entao <ações (uma ou mais) a serem realizadas se a condição for verdadeira> fimse 3.2 EXEMPLOS E FORMA GERAL se (saldo < 0) entao escreval(“Saldo insuficiente”) fimse se (lado1 = lado2) e (lado2 = lado3) entao escreval(“Triângulo eqüilátero”) fimse se <condição> entao <ações (uma ou mais) a serem realizadas se a condição for verdadeira> senao <ações (uma ou mais) a serem realizadas se a condição for falsa> fimse Exemplos: se (lado1 = lado2) e (lado2 = lado3) entao escreval(“Triângulo equilátero”) senao escreval(“Não é triângulo equilátero”) fimse algoritmo "CalculaAreadoCirculo" var area, raio: Real inicio escreva ("Entre com raio do círculo") leia (raio) se Raio > 0 entao area <- PI*(raio^2) escreva ("A área do círculo de raio ", raio, " é ", area) senao escreva ("Raio não pode ser nulo ou negativo!") fimse fimalgoritmo 3.2.1Exercícios 1. Considere as variáveis abaixo: var x,y: inteiro achou: lógico k,z: real 21 DET109 [Programação de Computadores I] cor: caracter Avalie as expressões lógicas abaixo e preencha os espaços com os valores lógicos V(verdadeiro) ou F(falso): x y k z Cor x%2=0 x>y (x+y)>z Cor=”branco” 10 5 2.5 3.0 “azul” 13 25 0.5 45.0 “branco” 2. Complete o algoritmo abaixo de modo a exibir o resultado final, caso a média seja maior ou igual a 70, o algoritmo deve exibir a mensagem “APROVADO” caso contrário exibir a mensagem “REPROVADO OU EM PROVA FINAL”. algoritmo "Media3Notas" // Este algoritmo tem como entrada as 3 notas de um estudante // Calcula e exibe a média aritmética considerando-as // Utiliza uma estrutura sequencial de comandos var nota1,nota2,nota3,media: real inicio escreva("Nota 1: ") leia(nota1) escreva("Nota 2: ") leia(nota2) escreva("Nota 3: ") leia(nota3) media <- (nota1 + nota2 + nota3)/3 escreval("Media = ",media) fimalgoritmo 3. Observe os trechos de códigos abaixo, eles são equivalentes? Explique sua resposta. (I) se (media >= 70) entao escreval(“Aprovado”) senao escreval(“Reprovado ou em prova final”) fimse (II) se (media >= 70) entao escreval(“Aprovado”) fimse se (media < 70) entao escreval(“Reprovado ou em prova final”) fimse (III) se (media >= 70) entao escreval(“Aprovado”) se (media < 70) entao escreval(“Reprovado ou em prova final”) fimse fimse 22 DET109 [Programação de Computadores I] 4. O que faz o algoritmo abaixo? algoritmo "exercicio3" var x,y,z,k: inteiro inicio escreva("digite valor: ") leia(x) k <- x escreva("digite valor: ") leia(y) se (y > k) entao k <- y fimse escreva("digite valor: ") leia(z) se (z > k) entao k <- z fimse escreval("Resultado = ",k) fimalgoritmo Teste seu algoritmo com os dados da tabela x y z k 5 6 7 10 20 8 5 3 2 5. Escreva um algoritmo que leia um número inteiro. Se o número lido for positivo, escreva uma mensagem indicando se ele é par ou ímpar. Se o número for negativo, escreva a seguinte mensagem “Este número não é positivo”. 6. Observe e estude o seguinte algoritmo em descrição narrativa. Em seguida implemente este algoritmo no Visualg. Obter o valor de A Obter o valor de B Obter o valor de C Calcular delta = B 2 − 4 AC Se delta for menor que zero entao Exiba mensagem “Não existem raízes reais” Senão − B + delta 2A − B − delta Calcule x 2 = 2A Calcule x1 = Exibir x1 Exibir x2 7. Observe o fluxograma abaixo, estude-o e depois de entendê-lo, identificar entrada, processamento e saída, desenvolva um algoritmo em Visualg que implemente-o. 23 DET109 [Programação de Computadores I] V 8. Avalie o seguinte problema: F peso 2 altura O IMC é calculado pela fórmula IMC = é dada de acordo com o seguinte critério: IMC < 18,5 18,5 – 24,9 25,0 – 29,9 Classificação Magreza Saudável Sobrepeso IMC 30,0 – 34,9 35,0 – 39,9 ≥ 40,0 . A classificação Classificação Obesidade Grau I Obesidade Grau II (severa) Obesidade Grau III (mórbida) Suponha que você tenha que calcular o seu próprio IMC. Que dados precisa como entrada? Qual será o processamento? Qual será a saída? Desenvolva um algoritmo que permita calcular e exibir o IMC e a respectiva classificação de uma pessoa. Teste-o, invente dados para testar as faixas e confirmar a ausência de erros. Ele funcionou corretamente? Teste valores absurdos para peso e altura. Seu programa aceita? Se sim, não deveria. Modifique-o para que fique mais robusto, isto é, funcione em qualquer situação. 9. Para calcular o salário líquido de um funcionário temos o seguinte algoritmo em descrição narrativa. Após estudá-lo, implemente-o no Visualg. Obter o número de horas trabalhadas (NHT) Obter o valor da hora trabalhada (VHT) Obter o número de dependentes (NDEP) Obter o número de horas extras (NHE) Obter o número de dias faltosos (FALTAS) Calcular o salário Bruto (SBRUTO) multiplicando-se NHT por VHT Calcular desconto do INSS que é igual a 10% do salário bruto Calcular o salário família (SFAMILIA) que é 5% do salário bruto para cada dependente Se houver hora extra Calcular o valor a pagar pelas horas extras (VEXTRA), 50% a mais de VHT multiplicado por NHT Calcular o desconto por falta (VFALTAS) igual a FALTAS multiplicado por VHT Calcular salário líquido Calcular o desconto do imposto de renda (IR) de forma simplificada. Caso salário seja maior ou igual a 2000,00 descontar 6% Calcular e exibir o salário líquido SLIQUIDO = SBRUTO + SALARIOFAMILIA + VEXTRA – INSS – IR – VFALTAS 24 DET109 [Programação de Computadores I] 10. 11. Altere o algoritmo 1 do capítulo anterior, sessão 2.5, para também emitir o resultado, uma mensagem de "Aprovado", caso a média seja igual ou superior a 6, ou a mensagem "Reprovado", caso contrário. O que muda no algoritmo se utilizarmos outro critério, como o utilizado na FDV: Media Resultado Média >= 70 “APROVADO” 40 <= Média < 70 “EM PROVA FINAL” Média < 40 “REPROVADO” 12. Elaborar um algoritmo que lê 2 valores a e b e exiba a mensagem: "São múltiplos" ou "Não são múltiplos". 13. Elabore um algoritmo que tendo como entrada uma das seguintes categorias, exibindo-a: Categoria Infantil A Infantil B Juvenil A Juvenil B Adulto 14. 15. a idade de uma pessoa, classifique-o em Faixa etárea 5-7 8-10 11-13 14-17 Acima de 18 Escreva um algoritmo que leia 3 números inteiros e mostre o maior deles. Escreva um algoritmo que leia a matrícula de um aluno e suas três notas. Calcule a média ponderada do aluno, considerando que o peso para a maior nota seja 4 e para as duas restantes, 3. Exiba o código do aluno, suas três notas, a média calculada e uma mensagem "APROVADO" se a média for maior ou igual a 6 e "REPROVADO" se a média for menor que 6. 16. O cardápio de uma lanchonete é o seguinte: Especificação Código Preço Cachorro quente 100 1,20 Bauru simples 101 2,30 Bauru com ovo 102 2,70 Hambúrger 103 2,50 Cheeseburguer 104 3,20 Refrigerante 105 2,00 Escrever um algoritmo que leia o código do item pedido, a quantidade e calcule o valor a ser pago por aquele lanche. Considere que a cada execução somente será calculado um item. 17. Desenvolva um algoritmo que baseando-se no peso e na altura de um indivíduo calcule e exiba seu IMC de acordo com a seguinte expressão: IMC = peso altura 2 Em seguida, o algoritmo deverá exibir a classificação de acordo com o IMC calculado: IMC (kg/m2) < 18,5 18,5 <= IMC <25 25 <= IMC < 30 30 <= IMC < 35 35 <= IMC < 40 IMC >= 40 Classificação Baixo Peso Peso Normal Sobrepeso Obeso I Obeso II Obeso III 25 DET109 [Programação de Computadores I] 18. Altere indivíduo. - para - para o algoritmo anterior de modo a também calcular e exibir o peso ideal do O peso ideal é calculado de acordo com as seguintes expressões: homem, sexo = ‘M’: (72.7 x altura) – 58.0 mulheres, sexo = ‘F’: (62.1 x altura) – 44.7 19. Um banco concederá um crédito especial aos seus clientes, variável com o saldo médio no último ano. Faça um algoritmo que leia o saldo médio de um cliente e calcule o valor do crédito de acordo com a tabela abaixo. Seu algoritmo deve exibir uma mensagem informando o saldo médio e o valor do crédito. Saldo médio Percentual de 0 a 200 nenhum crédito de 201 a 400 20% do valor do saldo médio de 401 a 600 30% do valor do saldo médio acima de 601 40% do valor do saldo médio 20. Um usuário deseja um algoritmo onde possa escolher que tipo de média deseja calcular a partir de 3 notas. Faça um algoritmo que leia as notas, a opção escolhida pelo usuário, calcule e exiba a média. 1 - aritmética 2 - ponderada (3,3,4) 3 – harmônica Expressões para cálculos das médias mediaAritmética = (nota1 + nota 2 + nota3) 3 mediaPonderada = ((nota1x3) + (nota 2 x3) + (nota3x 4)) mediaHarmonica = (3 + 3 + 6) 3 1 1 1 + + nota1 nota 2 nota3 21. Um vendedor precisa de um algoritmo que calcule o preço total devido por um cliente. O algoritmo deve receber o código de um produto e a quantidade comprada e calcular o preço total, usando a tabela abaixo. Mostre uma mensagem no caso de código inválido. Preço Código unitário 'ABCD' R$ 5,30 'XYPK' R$ 6,00 'KLMP' R$ 3,20 'QRST' R$ 2,50 22. Uma empresa concederá um aumento de salário aos seus funcionários, variável de acordo com o cargo, conforme a tabela abaixo. Faça um algoritmo que leia o salário e o cargo de um funcionário e calcule o novo salário. Se o cargo do funcionário não estiver na tabela, ele deverá, então, receber 40% de aumento. Mostre o salário antigo, o novo salário e a diferença. Código 23. Cargo Percentual 101 Gerente 10% 102 Engenheiro 20% 103 Técnico 30% Elaborar um algoritmo que lê 3 valores a,b,c e verifica se eles formam ou não um triângulo. Supor que os valores lidos são inteiros e positivos. Caso os valores formem um 26 DET109 [Programação de Computadores I] triângulo, calcular e escrever a área deste triângulo de acordo com as expressões abaixo. Se não formam triângulo escrever os valores lidos e uma mensagem informando “não formam um triângulo”. Se um dos lados for maior que a soma dos outros dois, os lados não formam triângulo. area = s ( s − lado1)( s − lado 2)( s − lado3) s= lado1 + lado 2 + lado3 2 24. Escrever um algoritmo que lê a hora de início de um jogo e a hora do final do jogo (considerando apenas horas inteiras) e calcula a duração do jogo em horas, sabendo-se que o tempo máximo de duração do jogo é de 24 horas e que o jogo pode iniciar em um dia e terminar no dia seguinte. 25. Escrever um algoritmo que lê um conjunto de 4 valores i, a, b, c, onde i é um valor inteiro e positivo e a, b, c, são quaisquer valores reais e os escreva. A seguir: a) Se i=1 escrever os três valores a, b, c em ordem crescente. b) Se i=2 escrever os três valores a, b, c em ordem decrescente. c) Se i=3 escrever os três valores a, b, c de forma que o maior entre a, b, c fique dentre os dois. 26. Escrever um algoritmo que lê: - a percentagem do IPI a ser acrescido no valor das peças - o código da peça 1, valor unitário da peça 1, quantidade de peças 1 - o código da peça 2, valor unitário da peça 2, quantidade de peças 2 O algoritmo deve calcular o valor total a ser pago e apresentar o resultado. Fórmula : (valor1*quant1 + valor2*quant2)*(IPI/100 + 1) 27. Escrever um algoritmo que lê a hora de início e hora de término de um jogo, ambas subdivididas em dois valores distintos : horas e minutos. Calcular e escrever a duração do jogo, também em horas e minutos, considerando que o tempo máximo de duração de um jogo é de 24 horas e que o jogo pode iniciar em um dia e terminar no dia seguinte. 28. Escrever um algoritmo que lê o número de identificação, as 3 notas obtidas por um aluno nas 3 verificações e a média dos exercícios que fazem parte da avaliação. Calcular a média de aproveitamento, usando a fórmula MA = (Nota1 + Nota2 x 2 + Nota3 x 3 + ME )/7 A atribuição de conceitos obedece a tabela abaixo: Média de Conceito Aproveitamento 9,0 A 7,5 e < 9,0 B 6,0 e < 7,5 C 4,0 e < 6,0 D < 4,0 E O algoritmo deve escrever o número do aluno, suas notas, a média dos exercícios, a média de aproveitamento, o conceito correspondente e a mensagem: APROVADO se o conceito for A,B ou C e REPROVADO se o conceito for D ou E. 29. O departamento que controla o índice de poluição do meio ambiente mantém 3 grupos de indústrias que são altamente poluentes do meio ambiente. O índice de poluição aceitável varia de 0,05 até 0,25. Se o índice sobe para 0,3 as indústrias do 1º grupo são intimadas a suspenderem suas atividades, se o índice cresce para 0,4 as do 1° e 2° grupo são intimadas a suspenderem suas atividades e se o índice atingir 0,5 todos os 3 grupos devem ser notificados a paralisarem suas atividades. Escrever um algoritmo que lê o índice de poluição medido e emite a notificação adequada aos diferentes grupos de empresas. 27 DET109 [Programação de Computadores I] 4 ESTRUTURAS DE REPETIÇÃO O VisuAlg implementa as três estruturas de repetição usuais nas linguagens de programação: o laço contado para...ate...faca e os laços condicionados enquanto...faca e repita...ate (similar ao repeat...until). A sintaxe destes comandos vem a seguir. 4.1 A ESTRUTURA PARA ... FACA Esta estrutura repete uma sequência de comandos um número pré determinado de vezes. Seu formato geral é apresentado abaixo: para <variável-de-controle> de <valor-inicial> ate <valor-final> [passo <incremento>] faca <sequência de comandos? fimpara variável-de-controle valor-inicial valor-final incremento fimpara Uma variável que controla a repetição. Deve ser necessariamente uma variável de tipo enumerável como o tipo inteiro. É uma expressão que especifica o valor inicial da variável de controle. É uma expressão que especifica o valor máximo da variável de controle. É um elemento opcional. Quando presente, precedida pela palavra passo, é uma expressão que especifica o incremento que será acrescentado à variável de controle em cada repetição. Quando esta opção não é utilizada, o valor padrão de <incremento> é 1. Vale a pena ter em conta que também é possível especificar valores negativos para <incremento>. Por outro lado, se a avaliação da expressão <incremento > resultar em valor nulo, a execução do algoritmo será interrompida, com a impressão de uma mensagem de erro. Indica o fim da seqüência de comandos a serem repetidos. Cada vez que o programa chega neste ponto, é acrescentado à variável contadora o valor de <incremento >, e comparado a <valor-final >. Se for menor ou igual (ou maior ou igual, quando <incremento > for negativo), a seqüência de comandos será executada mais uma vez; caso contrário, a execução prosseguirá a partir do primeiro comando que esteja após o fimpara. <valor-inicial >, <valor-final > e <incremento > são avaliados uma única vez antes da execução da primeira repetição, e não se alteram durante a execução do laço, mesmo que variáveis eventualmente presentes nessas expressões tenham seus valores alterados. No exemplo a seguir, os números de 1 a 10 são exibidos em ordem crescente. algoritmo "NúmerosDe1a10" var j: inteiro inicio para j de 1 ate 10 faca escreva (j:3) fimpara fimalgoritmo 28 DET109 [Programação de Computadores I] Importante: Se, logo no início da primeira repetição, <valor-inicial > for maior que <valorfinal > (ou menor, quando <incremento> for negativo), o laço não será executado nenhuma vez. O exemplo a seguir não imprime nada. algoritmo "NumerosDe10a1NaoFunciona" var j: inteiro inicio para j de 10 ate 1 faca escreva (j:3) fimpara fimalgoritmo Este outro exempo, no entanto, funcionará por causa do passo -1: algoritmo "NumerosDe10a1Eestefunciona" var j: inteiro inicio para j de 10 ate 1 passo -1 faca escreva (j:3) fimpara fimalgoritmo 4.2 A ESTRUTURA REPITA ... ATE Esta estrutura repete uma sequência de comandos até que uma determinada condição seja satisfeita. Seu formato geral é mostrado abaixo: repita <sequência de comandos> ate <expressão lógica> repita ate <expressão lógica> Indica o início da repetição. Indica o fim da <seqüência-de-comandos> a serem repetidos. Cada vez que o programa chega neste ponto, <expressão-lógica> é avaliada: se seu resultado for FALSO, os comandos presentes entre esta linha e a linha repita são executados; caso contrário, a execução prosseguirá a partir do primeiro comando após esta linha. Considerando ainda o mesmo exemplo: algoritmo "NumerosDe1a10" var j: inteiro inicio j <- 1 repita escreva (j:3) j <- j + 1 ate j > 10 fimalgoritmo Importante: Como o laço repita...ate testa sua condição de parada depois de executar sua seqüência de comandos, esta seqüência poderá ser executada uma ou mais vezes. 4.3 A ESTRUTURA ENQUANTO ... FACA Esta estrutura repete uma seqüência de comandos enquanto uma determinada condição (especificada através de uma expressão lógica) for satisfeita. 29 DET109 [Programação de Computadores I] Seu formato geral é apresentado abaixo: enquanto <expressão-lógica> faca <seqüência-de-comandos> fimenquanto <expressão lógica> fimequanto Esta expressão é avaliada antes de cada repetição do laço. Quando seu resultado for VERDADEIRO, <sequência-de-comandos> é executada. Indica o fim da <sequência-de-comandos> que será repetida. Cada vez que a execução atinge este ponto, volta-se ao início do laço para que <expressão-lógica> seja avaliada novamente. Se o resultado desta avaliação for VERDADEIRO, a <sequência-decomandos> será executada mais uma vez; caso contrário, a execução prosseguirá a partir do primeiro comando após fimenquanto. O mesmo exemplo anterior pode ser resolvido com esta estrutura de repetição: algoritmo "NumerosDe1a10" var j: inteiro inicio j <- 1 enquanto j <= 10 faca escreva (j:3) j <- j + 1 fimenquanto fimalgoritmo Importante: Como o laço enquanto ... faca testa sua condição de parada antes de executar sua seqüência de comandos, esta seqüência poderá ser executada zero ou mais vezes. 4.4 EXERCÍCIOS 1. Observe o algoritmo abaixo algoritmo "calculaMediaComRepeticao" var nota1,nota2,nota3: real //dados de entrada media: real //processamento e saída numeroDeAlunos: inteiro //contador para o número de alunos inicio numeroDeAlunos <- 0 repita escreva("Digite 1ª nota: ") leia(nota1) escreva("Digite 2ª nota: ") leia(nota2) escreva("Digite 3ª nota: ") leia(nota3) media <- (nota1+nota2+nota3)/3 escreval("Média = ",media) escreval("-----------------") numeroDeAlunos <- numeroDeAlunos + 1 ate (numeroDeAlunos = 3) fimalgoritmo a. Quantas vezes os comandos serão executados? Por que? 30 DET109 [Programação de Computadores I] b. Explique como fazer para que seja calculada a média para 100 estudantes. c. Agora vamos calcular a média da turma. Observe o algoritmo modificado abaixo. algoritmo "calculaMediaComRepeticao" var nota1,nota2,nota3: real //dados de entrada media, soma, mediaTurma: real //processamento e saída numeroDeAlunos: inteiro //contador para o número de alunos inicio numeroDeAlunos <- 0 soma <- 0 repita escreva("Digite 1ª nota: ") leia(nota1) escreva("Digite 2ª nota: ") leia(nota2) escreva("Digite 3ª nota: ") leia(nota3) media <- (nota1+nota2+nota3)/3 escreval("Média = ",media:6:2) soma <- soma + media //ACUMULADOR escreval("-----------------") numeroDeAlunos <- numeroDeAlunos + 1 //CONTADOR ate (numeroDeAlunos = 3) mediaTurma <- soma / 3 escreval("-----------------") escreval("Média da turma = ",mediaTurma:6:2) fimalgoritmo d. O que mudou? e. Agora vamos contar quantos estudantes conseguiram média maior ou igual a 60. algoritmo "calculaMediaComRepeticao" var nota1,nota2,nota3: real //dados de entrada media, soma, mediaTurma: real //processamento e saída numeroDeAlunos, contaAcima60: inteiro //contador para o número de alunos inicio numeroDeAlunos <- 0 contaAcima60 <- 0 soma <- 0 repita escreva("Digite 1ª nota: ") leia(nota1) escreva("Digite 2ª nota: ") leia(nota2) escreva("Digite 3ª nota: ") leia(nota3) media <- (nota1+nota2+nota3)/3 se (media >= 60) entao contaAcima60 <- contaAcima60 + 1 fimse escreval("Média = ",media:6:2) soma <- soma + media escreval("-----------------") numeroDeAlunos <- numeroDeAlunos + 1 ate (numeroDeAlunos = 3) mediaTurma <- soma / 3 31 DET109 [Programação de Computadores I] escreval("-----------------") escreval("Média da turma = ",mediaTurma:6:2) escreval("Número de estudantes com média acima de 60 = ",contaAcima60) fimalgoritmo f. O que foi alterado? 2. Desenvolva um algoritmo que leia informações sobre um grupo de 50 pessoas (teste seu algoritmo para 3 pessoas e depois reformule o algoritmo para 50 pessoas) e calcule alguns dados estatísticos. Para cada pessoa do grupo deve ler o nome da pessoa, a altura, o peso e o sexo (“F” para feminino e “M” para o masculino). Calcular e escrever: a. A média de peso das pessoas (somatório dos pesos de todas as pessoas pela quantidade de pessoas); b. A quantidade total de homens e mulheres e o percentual de cada. c. Como tornar o número de pessoas da pesquisa flexível? Implemente sua solução. d. O nome da pessoa mais alta. Solução: Seguem abaixo algoritmos que mostram a construção do algoritmo por partes. Um processo de repetição para x pessoas. algoritmo "pesquisa" var pessoas, contaPessoas: inteiro inicio escreva("Quantas pessoas foram entrevistadas ? ") leia(pessoas) contaPessoas <- 1 repita escreval("Processando pessoa nº: ",contaPessoas) escreval("------------------------") contaPessoas <- contaPessoas + 1 ate (contaPessoas > pessoas) fimalgoritmo Processo de repetição para um número determinado de pessoas com a leitura dos dados. algoritmo "pesquisa" var pessoas, contaPessoas: inteiro nome: caracter peso,altura: real sexo: caracter inicio escreva("Quantas pessoas foram entrevistadas ? ") leia(pessoas) contaPessoas <- 1 repita escreval("Processando pessoa nº: ",contaPessoas) escreval("------------------------") escreva("Nome: ") leia(nome) escreva("Peso: ") leia(peso) escreva("Altura: ") leia(altura) escreva("Sexo [F - Feminino] ou [M - Masculino]: ") contaPessoas <- contaPessoas + 1 ate (contaPessoas > pessoas) fimalgoritmo leia(sexo) Cálculo da média de peso das pessoas. 32 DET109 [Programação de Computadores I] algoritmo "pesquisa" var pessoas, contaPessoas: inteiro nome: caracter peso,altura, somapeso, mediaPeso: real sexo: caracter inicio escreva("Quantas pessoas foram entrevistadas ? ") leia(pessoas) contaPessoas <- 1 somaPeso <- 0 repita escreval("Processando pessoa nº: ",contaPessoas) escreval("------------------------") escreva("Nome: ") leia(nome) escreva("Peso: ") leia(peso) escreva("Altura: ") leia(altura) escreva("Sexo [F - Feminino] ou [M - Masculino]: ") somaPeso <- somaPeso + peso contaPessoas <- contaPessoas + 1 ate (contaPessoas > pessoas) mediaPeso <- somaPeso/pessoas escreval("Média de peso das pessoas = ",mediaPeso:5:2) fimalgoritmo leia(sexo) Cálculo do número de homens e mulheres e seus percentuais. algoritmo "pesquisa" var pessoas, contaPessoas, homens, mulheres: inteiro nome: caracter peso,altura, somapeso, mediaPeso: real sexo: caracter inicio escreva("Quantas pessoas foram entrevistadas ? ") leia(pessoas) contaPessoas <- 1 somaPeso <- 0 homens <- 0 mulheres <- 0 repita escreval("Processando pessoa nº: ",contaPessoas) escreval("------------------------") escreva("Nome: ") leia(nome) escreva("Peso: ") leia(peso) escreva("Altura: ") leia(altura) escreva("Sexo [F - Feminino] ou [M - Masculino]: ") leia(sexo) somaPeso <- somaPeso + peso se (sexo = "F") entao mulheres <- mulheres + 1 senao se (sexo = "M") entao homens <- homens + 1 senao escreva("Sexo inesperado, não considerado!") fimse fimse contaPessoas <- contaPessoas + 1 ate (contaPessoas > pessoas) mediaPeso <- somaPeso/pessoas escreval("Média de peso das pessoas = ",mediaPeso:5:2) escreval("Número de mulheres consideradas = ",mulheres," equivale a ", (mulheres/pessoas*100):5:2," %") 33 DET109 [Programação de Computadores I] escreval("Número de homens considerados = ",homens," equivale a ",homens/pessoas*100:5:2," %") fimalgoritmo Verificação da pessoa mais alta. algoritmo "pesquisa" var pessoas, contaPessoas, homens, mulheres: inteiro nome, nomePessoaMaisAlta: caracter peso,altura, somapeso, mediaPeso, maiorAltura: real sexo: caracter inicio escreva("Quantas pessoas foram entrevistadas ? ") leia(pessoas) contaPessoas <- 1 somaPeso <- 0 homens <- 0 mulheres <- 0 maiorAltura <- 0 repita escreval("Processando pessoa nº: ",contaPessoas) escreval("------------------------") escreva("Nome: ") leia(nome) escreva("Peso: ") leia(peso) escreva("Altura: ") leia(altura) escreva("Sexo [F - Feminino] ou [M - Masculino]: ") leia(sexo) somaPeso <- somaPeso + peso se (sexo = "F") entao mulheres <- mulheres + 1 senao se (sexo = "M") entao homens <- homens + 1 senao escreva("Sexo inesperado, não considerado!") fimse fimse se (altura > maiorAltura) entao maiorAltura <- altura nomePessoaMaisAlta <- nome fimse contaPessoas <- contaPessoas + 1 ate (contaPessoas > pessoas) mediaPeso <- somaPeso/pessoas escreval("Média de peso das pessoas = ",mediaPeso:5:2) escreval("Número de mulheres consideradas = ",mulheres," equivale a ", (mulheres/pessoas*100):5:2," %") escreval("Número de homens considerados = ",homens," equivale a ",homens/pessoas*100:5:2," %") escreval("Pessoa mais alta é ",nomePessoaMaisAlta," com ",maiorAltura:5:2," m.") fimalgoritmo 3. Observe o algoritmo abaixo. O que faz o trecho de algoritmo abaixo? repita escreva(“Digite sua altura: “) leia(altura) se (altura <= 0) entao escreval(“Altura inválida! “) fimse ate (altura > 0) 4. O que há de novo no algoritmo abaixo? 34 DET109 [Programação de Computadores I] algoritmo "comandoCaso" var nota : inteiro inicio escreva("Entre com a nota do aluno:") leia(nota) escolha nota caso 0,1,2,3 escreval("Reprovado.") caso 5 ate 7, 4 // A lista não precisa estar em uma ordem específica // Só na cláusula ATE o primeiro valor precisam ser menor que o segundo escreval("Em final.") caso 8 ate 10 escreval("Aprovado") outrocaso escreval("Nota inválida.") fimescolha fimalgoritmo 5. Faça com que o processo de leitura da nota e exibição do resultado seja repetitivo e pare somente quando a matrícula 0 (zero) for digitada. Lembre-se de validar a matrícula, ela deve ser maior ou igual a 0 (zero). 6. Observe a seguinte interação com o usuário feita por um algoritmo em execução no Visualg. O computador sorteia um número através do comando n <- randi(10) + 1 e o usuário tenta acertar. O algoritmo interage com o usuário dando uma dica se o valor fornecido é pequeno ou grande e ao acertar dá os parabéns e mostra o número de tentativas. Vamos programar? Início da execução Digite palpite de 1 a 10: 5 Tente número menor Digite palpite de 1 a 10: 2 Tente número maior Digite palpite de 1 a 10: 3 Parabéns você acertou em 3 ! Fim da execução. E se desejarmos dar apenas 3 chances ao jogador, o que mudará no algoritmo? 7. Lembra-se de como converter números na notação decimal para a binária? Fazemos sucessivas divisões por 2 e consideramos o resto até que não possamos mais dividir e consideramos também o quociente ao final. Observe o exemplo abaixo. 21 1 2 10 0 2 5 1 2 2 2 0 1 Considerando os restos marcados com tracejado e o último quociente temos o número binário 10101. Descrição narrativa do algoritmo Considere o número decimal n, no nosso exemplo 21. Considere uma variável do tipo caractere, chamada resposta, que nenhum caracter armazena inicialmente. 35 DET109 [Programação de Computadores I] Divida n por 2 e caso o resto seja 0 concatene o caractere ”0” à resposta, caso seja 1 concatene ”1” Armazene em n agora o resultado quociente da divisão do passo anterior. Repita o processo até que _______________________ . Desenvolva um algoritmo que tenha como entrada o número inteiro e exiba o número binário correspondente. 8. Agora vamos fazer o contrário, dado um número binário vamos descobrir qual é o decimal correspondente. Como fazer? Precisamos pegar cada um dos números, 0 (zero) ou 1 (um) e multiplicar pela potência de 2 correspondente à posição que ocupa. Por exemplo: 24 1 1x16 23 0 0x8 22 1 1x4 21 0 0x2 20 1 1x1 16+4+1=21 Existem funções que manipulam caracteres que serão úteis: Exemplificando: algoritmo "testes" Var sequencia: caractere expoente: inteiro inicio sequencia <- "Boa noite" escreval(compr(sequencia)) // escreverá 9 escreval(copia(sequencia,1,3)) // exibirá Boa expoente <- 3 escreval(exp(2,expoente)) //exibirá 8 fimalgoritmo Descrição narrativa do algoritmo Considere o número binário n do tipo caractere. Considere o número a ser formado decimal, iniciando com 0 (zero). Considere um expoente inteiro começando com zero. Acrescente à variável decimal exp(2,expoente) e passe para o próximo expoente até não existir mais caracteres. 36 DET109 [Programação de Computadores I] 5 MÓDULOS 5.1 INTRODUÇÃO Módulos ou subalgoritmos: São trechos de algoritmos que efetuam um ou mais cálculos determinados. Ao invés de escrever um algoritmo grande, escreva vários algoritmos menores, os quais, não isoladamente, mas em conjunto, resolvem o problema proposto. É conveniente utilizá-los quando uma determinada tarefa é efetuada em diversos lugares no mesmo algoritmo. Ao invés de escrever um trecho diversas vezes, escreva um sub-algoritmo e chameo diversas vezes. _ - Eles reduzem o tamanho do algoritmo. _ - Facilitam a compreensão e visualização do algoritmo. _ - São declarados no início do algoritmo e podem ser chamados em qualquer ponto após _ sua declaração. _ - Eles podem ser do tipo Funcao que retorna algum valor ou Procedimento que nada retorna. _ 5.2 FUNÇÕES Uma função é um instrumento estático que tem como objetivo retornar um valor ou uma informação como parâmetro. A chamada de uma função é feita através da citação do seu nome seguido de seus argumentos iniciais entre parênteses. As funções podem ser predefinidas pela linguagem ou criadas pelo programador de acordo com o seu interesse. Funções Predefinidas do Visualg O Visualg vem com bibliotecas de funções predefinidas que você pode utilizar em seus programas. Veja a tabela abaixo: Abs (valor : real) : real Arccos (valor : real) : real Valor absoluto Arco cosseno Arcsen (valor : real) : real Arco seno Arctan (valor : real) : real Arco tangente Asc (s : caracter) : inteiro Cos (valor : real) : real Retorna o código ASCII Retorna o nº de caracateres de c Copia um determinado trecho do caractere Cosseno Pi : real Logaritmo natural (ln) Converte em Maiúscula Converte em Minúscula Converte um numero inteiro ou real para caractere Valor Pi Pos (subc, c : caracter) : inteiro Quad (valor : real) : real Retorna a posição do caractere. Elevado quadrado Co-tangente Potenciação Radpgrau (valor : real) : real Raizq (valor : real) : real Rand : real Grauprad (valor : real) : real Converte grau para radiano Randi (limite : inteiro) : inteiro Int (valor : real) : inteiro Converte o valor em inteiro Logaritmo de base 10 Sen (valor : real) : real Converte Radiano para grau. Raiz quadrada Gerador de números aleatórios entre 0 e 1 Gerador de números inteiros aleatórios com um limite determinado Seno Cotan (valor : real) : real Exp (<base>,<expoente>) Tan (valor : real) : real Tangente Compr (c : caracter) : inteiro Copia (c : caracter , posini, posfin : inteiro) : caracter Log (valor : real) : real Logn (valor : real) : real Maiusc (c : caracter) : caracter Minusc (c : caracter) : caracter Numpcarac (n : inteiro ou real) : caracter 37 DET109 [Programação de Computadores I] 5.3 FUNÇÕES A criação de uma função deve ser declarada, com os demais objetos, no início do programa. Este tipo de subalgoritmo sempre retorna um e apenas um valor ao algoritmo que lhe chamou. Cada função tem associada ao seu valor de retorno um tipo explícito. Da mesma maneira com que os parâmetros são fixos para todas as chamadas o retorno também é fixo. Algoritmo "<nome do algoritmo>" var <declaração de variáveis globais> <definição da função> inicio < lista de comandos> fimalgoritmo Sintaxe da Função funcao <identificador> ([var]<parâmetros>) <tipo de retorno> var <declaração de variáveis locais> inicio <lista de comandos> retorne <variável de retorno> fimfuncao Identificador: Nome da função. Passagem de parâmetros por referência: utiliza-se a construção VAR antes dos identificadores para indicar a passagem por referência. Os identificadores são separados por vírgula. Parâmetros: Entre um mesmo tipo de dados são separados por vírgula. Entre tipos de dados a separação é feita com ponto-e-vírgulas ';'. Tipo de retorno da função: Real, Inteiro, Lógico ou Caractere. Declaração de variáveis locais: idêntica a declaração de variáveis globais. As variáveis declaradas localmente tem validade dentro do escopo da função. Retorne: local onde é colocado a variável de retorno. Criando Procedimentos A criação de um procedimento também deve ser declarado, com os demais objetos, no início do programa. Este tipo de subalgoritmo nada retorna, apenas executa uma sequência de instruções. Os parâmetros são fixos para todas as chamadas. Sintaxe Procedimento: procedimento <identificador> ([var]<parâmetros>) var <declaração de variáveis locais> inicio <lista de comandos> fimprocedimento Identificador: Nome do procedimento. 38 DET109 [Programação de Computadores I] Passagem de parâmetros por referência: utiliza-se a construção VAR antes dos identificadores para indicar a passagem por referência. Os identificadores são separados por vírgula. Parâmetros: Entre um mesmo tipo de dados são separados por vírgula. Entre tipos de dados a separação é feita com ponto-e-vírgulas ';'. 5.4 APLICAÇÃO DE FUNÇÕES E PROCEDIMENTOS 1. Observe o algoritmo abaixo: algoritmo "MenuComModulos" funcao fatorial(n: inteiro): inteiro var x, fat: inteiro inicio fat <- 1 para x de 2 ate n faca fat <- fat * x fimpara retorne fat fimfuncao funcao somatorio(n: inteiro): inteiro var soma, contador: inteiro inicio soma <- 0 para contador de 1 ate n faca soma <- soma + contador fimpara retorne soma fimfuncao funcao primo(n: inteiro): logico var contador,divisores: inteiro inicio divisores <- 0 para contador de 1 ate n faca se (n % contador = 0) entao divisores <- divisores + 1 fimse fimpara se (divisores = 2) ou (n = 1) entao retorne verdadeiro senao retorne falso fimse fimfuncao procedimento exibeDivisores(n: inteiro) var contador, quantos: inteiro inicio quantos <- 0 para contador de 1 ate n faca se (n % contador = 0) entao escreva(contador:3) quantos <- quantos + 1 fimse fimpara 39 DET109 [Programação de Computadores I] escreval escreval("Existem ",quantos," divisores.") fimprocedimento funcao sorteiAte(n: inteiro): inteiro var sorteio: inteiro inicio sorteio <- randi(n) + 1 retorne sorteio fimfuncao procedimento converteDecimalBinario(n: inteiro) var numeroDecimal: inteiro numeroBinarioEmCaracter: caracter inicio numeroDecimal <- n enquanto numeroDecimal > 0 faca se (numeroDecimal mod 2) = 0 entao numeroBinario <- "0" + numeroBinarioEmCaracter senao numeroBinario <- "1" + numeroBinarioEmCaracter fimse numeroDecimal <- numeroDecimal div 2 fimenquanto escreval("A representação binária de", n, " é ", numeroBinarioEmCaracter) fimprocedimento procedimento converteBinarioDecimal(numeroBinarioEmCaracter: caracter) var numeroDecimal, expoente, posicao, i: inteiro inicio numeroDecimal <- 0 expoente <- 0 para i de 1 ate compr(numeroBinarioEmCaracter) faca posicao <- compr(numeroBinarioEmCaracter) - i + 1 se copia(numeroBinarioEmCaracter,posicao,1)="1" entao numeroDecimal <- numeroDecimal + int(exp(2,expoente)) fimse expoente <- expoente + 1 fimpara escreval("A representação decimal de ", numeroBinarioEmCaracter, " é ", numeroDecimal) fimprocedimento var //GLOBAIS n, opcao: inteiro inicio //PROGRAMA PRINCIPAL repita escreval("MENU DE OPÇÕES") escreval("--------------") escreval("1. Fatorial") escreval("2. Somatório") escreval("3. Exibe divisores") escreval("4. Verifica se é primo") escreval("5. Sair") escreva("Digite opção: ") leia(opcao) escolha opcao 40 DET109 [Programação de Computadores I] caso 1 escreva("Digite o nº inteiro e maior que zero: ") leia(n) escreval("Fatorial(",n,") = ",fatorial(n)) caso 2 escreva("Digite o nº inteiro e maior que zero: ") leia(n) escreval("Somatório de 1 a ",n," = ",somatorio(n)) caso 3 escreva("Digite o nº inteiro e maior que zero: ") leia(n) escreval("Divisores de ",n) exibeDivisores(n) caso 4 escreva("Digite o nº inteiro e maior que zero: ") leia(n) se primo(n) entao escreval("O número ",n," é primo.") senao escreval("O número ",n," não é primo.") fimse outrocaso escreval("Opção inválida") fimescolha ate (opcao = 5) converteBinarioDecimal("1111") fimalgoritmo 5.5 EXERCÍCIOS 1. Desenvolva no programa principal os comandos para obter os dados do teclado, calcular e exibir o IMC, peso ideal e emitir o diagnóstico de uma pessoa. algoritmo "CalculaIMC" funcao calculaIMC(peso,altura: real): real inicio retorne (peso/altura^2) fimfuncao funcao calculaPesoIdeal(sexo: caracter): real var pesoIdeal: real inicio se sexo = "F" entao pesoIdeal <- (62.1 * altura) - 44.7 senao pesoIdeal <- (72.7 * altura) - 58 fimse retorne pesoIdeal fimfuncao procedimento emiteDiagnostico(imc: real) inicio se (imc < 18.5) entao escreva("Peso abaixo do ideal!") senao se (imc < 2409) entao escreva("Saudável!") 41 DET109 [Programação de Computadores I] senao se (imc < 29,9) entao escreva("Sobrepeso!") senao se (imc < 34,9 entao escreva("Sobrepeso Grau I") senao se (imc < 39,9) entao escreva("Sobrepeso Grau II") senao escreva("Sobrepeso Grau III") fimse fimse fimse fimse fimse fimprocedimento var inicio fimalgoritmo 2. Observe o algoritmo abaixo e: - Escreva no programa principal os comandos para ler do teclado os dados necessários, calcular e exibir o tipo do triângulo e sua área. Teste seu algoritmo várias vezes com os seguintes triângulos, completando a tabela abaixo com os resultados obtidos: Lado 1 Lado 2 Lado 3 Tipo Área 4 5 6 8 8 12 10 10 10 algoritmo "triangulo" funcao triangulo(a,b,c: real): caracter var tipo: caracter inicio se ((a > b + c) ou (b > a + c) ou (c > a + b)) entao tipo <- " As medidas não formam um triangulo. " senao se (a = b) e (a = c) entao tipo := " Eqüilátero " senao se (a = b) ou (a = c) ou (b = c) entao tipo <- " Isóceles " 42 DET109 [Programação de Computadores I] senao tipo := " Escaleno " fimse fimse fimse retorne tipo fimfuncao procedimento areaTriangulo(a,b,c: real) var sp, area: real inicio sp <- (a+b+c)/2 area <- raizq ( (sp*(sp - a) * ( sp - b) * (sp - c) )) escreva("Área calculada = ",area) fimprocedimento var lado1, lado2, lado3: real inicio // programa principal fimalgoritmo 43 1 - Os comandos que colocou fazem o processamento apenas para um triângulo, como realizar os cálculos para um conjunto de 5 triângulos? algoritmo "triangulo" funcao triangulo(a,b,c: real): caracter var tipo: caracter inicio se ((a > b + c) ou (b > a + c) ou (c > a + b)) entao tipo <- " As medidas não formam um triangulo. " senao se (a = b) e (a = c) entao tipo := " Eqüilátero " senao se (a = b) ou (a = c) ou (b = c) entao tipo <- " Isóceles " senao tipo := " Escaleno " fimse fimse fimse retorne tipo fimfuncao procedimento areaTriangulo(a,b,c: real) var sp, area: real inicio sp <- (a+b+c)/2 area <- raizq ( (sp*(sp - a) * ( sp - b) * (sp - c) )) escreva("Área calculada = ",area) fimprocedimento var lado1, lado2, lado3: real inicio // programa principal fimalgoritmo - Identifique as linhas onde existem variáveis locais e variáveis globais no algoritmo da questão 1. Locais Globais 2 3 6 VETORES 6.1 INTRODUÇÃO Vetores – são estruturas de dados, disponíveis nas linguagens de programação, que permitem, durante o processamento de um programa, manter e/ou alterar na memória, um conjunto de dados de um mesmo tipo, organizados em uma única dimensão. Exemplos: A=[3 0 13 ] 5 NOME = F F M F] 9.6 8.1 ] 2 7 8 1 6 9 10 4] JOSE MARIA CARLA PEDRO B=[ -2 S=[ M F M 4 M 5 F 0 F -5 F LUCIA declaração leitura ou geração dos elementos do vetor processamento, usando e/ou modificando os elementos do vetor impressão dos elementos do vetor 6.2.1DECLARAÇÃO DE VETORES … var A, B: vetor [1..10] de inteiro nome : vetor [1..5] de caracter s: vetor [1..15] de caracter … 6.2.2LEITURA E GERAÇÃO a. Leitura dos elementos de um vetor ... para i de 1 ate 10 faca leia ( A[i] ) {ou} fimpara … … 4 F M 8 11 M M NOTAS=[6.5 7.9 4.3 8.2 10.0 5.7 8.4 2.1 6.2 OPERAÇÕES BÁSICAS 1. 2. 3. 4. 0 5 para i de 1 ate 10 faca escreva(“A[“, i ,’] = ” ) leia(A[i]) fimpara … b. Leitura dos elementos de 2 vetores de mesma dimensão ... { leitura de todo o vetor A, e depois, leitura de todo o vetor B } para i de 1 ate 10 faca leia ( A[i] ) fimpara para i de 1 ate 10 faca leia ( B[i] ) fimpara … ... {lendo o 1º elemento do vetor A, o 1º do vetor B, o 2º elemento de A, o 2º elemento de B etc} para i de 1 ate 10 faca leia( A[i], B[i] ) … {ou} … para i de 1 ate 10 faca escreva( “A[“, i ,”]=’” leia( A[i] ) escreva( “ B[“ i ,”=”) leia( B[i] ) fimpara … c. Geração de vetores com elementos que seguem uma regra prédefinida ... { gerando um vetor de 10 elementos inteiros, com todos os elementos iguais a 0 } para i de 1 ate 10 faca A[ i ] <- 0 fimpara ... ... { gerando um vetor de 10 elem., com os elementos de índice par iguais a 0, e impar iguais a 1 } para i de 1 ate 10 faca 6 7 se ( i % 2 = 0 ) entao A[i] <- 0 senao A[i] <- 1 fimse fimpara ... ... { gerando o vetor de 10 elementos A = [ 1 para i de 1 ate 10 faca A[ i ] <- i fimpara ... 2 3 4 5 6 7 8 9 10 ] } ... { gerando um vetor FIB com os 10 primeiros elementos da seqüência de Fibonacci } FIB[1] <- 1 FIB[2] <- 1 para i de 3 ate 10 faca FIB[i] <- FIB [i-2] + FIB [i-1] … 6.2.3PROCESSAMENTO d. Processando vetores sem modificar o valor ou a posição de seus elementos ... { somando os elementos de um vetor A, já lidos, colocando a soma na variável s } s <- 0 para i de 1 ate 10 faca s <- s + A[i] … ... { calculando a soma e a media dos elem. do vetor NOTAS, colocando os resultados em sem} s <- 0 para i de 1 ate 10 faca s <- s + NOTAS[i] fimpara m<- s / 10 … … { contando o nº de elem. do vet. NOTAS maiores ou igual a 6.0, colocando o resultado em nm6 } nm6 <- 0 para i de 1 ate 10 faca se NOTAS[ i ] >= 6.0 entao 8 9 nm6 <- nm6 + 1 fimse fimpara … { contando o número de elementos menores que 0 no vetor B, colocando o resultado em nneg nneg <- 0 para i de 1 ate 10 faca if B[ i ] < 0 entao nneg <- nneg + 1 fimse fimpara … … { contando e somando os elem. menores que 0 no vetor B e os elementos maiores ou iguais a 0 } nmen0 <- 0 smen0 <- 0 nmai0 <- 0 smai0 <- 0 para i de 1 ate 10 faca se B[ i ] < 0 entao nmen0 <- nmen0 + 1 smen0 <- smen0 + B[i] senao nmai0 <- nmai0 + 1 smai0 <- smai0 + B[i] fimse fimpara … … { localizando e imprimindo as posições dos elementos iguais a 0 dentro do vetor B } para i de 1 ate 10 faca se B[i] =0 entao escreval( “ Zero encontrado na posição “ , i ) senao escreval( “ Zero não existe no vetor B “); fimse fimpara … 10 11 { localizando e imprimindo a posição de um único elemento cujo valor é AK, dentro do vetor A } AK <- 8 i <- 1 enquanto ( A[i] <> AK ) e (i < 10) i <- i+1 fimenquanto faca se A[i] =AK entao escreval(AK , “ encontrado na posição ’”, i ) senao escreval( AK, “ não existe no vetor A “) fimse … … { localizando e imprimindo as posições dos elementos iguais a 0 dentro do vetor B } para i de 1 ate 10 faca se B[i] =0 entao escreval( “ Zero encontrado na posição ’”, i ) senao escreval( “ Zero não existe no vetor B ‘”; … … { localizando e imprimindo a posição de um único elemento cujo valor é AK, dentro do vetor A } AK <- 8 i <- 1 enquanto ( A[i] <> AK ) e (i < 10) i <- i+1 faca se A[i] = AK entao escreval(AK , “ encontrado na posição ’”, i ) senao escreval(AK, “ não existe no vetor A “); … .... { encontrando o maior elemento do vetor B } maior <- B[1] para i de 2 ate 10 faca se maior < B[i] entao maior <- B[i] fimse fimpara … 12 13 { encontrando o maior elemento do vetor B e sua posição dentro do vetor } maior <- B[1] posmaior <- 1 para i de 2 ate 10 faca se maior < B[i] entao maior <- B[i] posmaior <- i fimse fimpara e. Processando vetores modificando o valor ou a posição de seus elementos ... { trocando o 10º elemento com o 1º elemento do vetor A } temp <- A[10] ; A[10] <- A[1] ; A[1] <- A[10]; ... ... { acumulando a soma dos i primeiros elementos do vetor B no i-ésimo do vetor B } para i de 2 ate 10 faca B[i] <- B[i] + B[i-1] fimpara … ... { trocando o 10º elem. com o 1º elem., 0 9º elem. Com o 2º, o 8º com o 3º do vetor B etc } para i de 1 ate 5 faca temp <- B[i] B[i] <- B[11-i] B[11-i] <- temp fimpara … 6.2.4IMPRESSÃO f. Cálculo da média de notas da turma e impressão das notas acima desta algoritmo "alunosENotas" var numeroEstudantes, i: inteiro nome: vetor [1..45] de caracter nota: vetor [1..45] de real soma, media: real inicio repita 14 15 escreva("Digite o número de estudantes a considerar: ") leia(numeroEstudantes) se (numeroEstudantes < 1) ou (numeroEstudantes > 45) entao escreval("Nº de estudantes inválido, deve ser entre 1 e 45!") fimse ate (numeroEstudantes >= 1) e (numeroEstudantes <= 45) para i de 1 ate numeroEstudantes faca escreva("Nome do estudante nº ",i," : ") leia(nome[i]) escreva("Nota final: ") leia(nota[i]) escreval("--------------------------") soma <- soma + nota[i] fimpara media <- soma / numeroEstudantes escreval("--------------------------") escreval("Média de notas da turma = ",media:5:2) escreval("--------------------------") escreval("RELAÇÃO DE ESTUDANTES COM NOTA ACIMA DA MÉDIA DA TURMA") escreval("------------------------------------------------------") para i de 1 ate numeroEstudantes faca se nota[i] >= media entao escreval(nome[i]:40, nota[i]:5:2) fimse fimpara fimalgoritmo DET109 [Programação de Computadores I] 16 17 Trabalho Final em 20/06/2012 Observe o algoritmo abaixo: algoritmo "trabalhoFinal" arquivo "C:\Documents documentos\DET109\vetores\clientes.txt" var soma, media: real contador, acima: inteiro clientes: vetor[1..43] de caracter consumo: vetor [1..43] de real local: vetor [1..43] de inteiro local_nome: vetor[1..5] de caracter inicio local_nome[1] local_nome[2] local_nome[3] local_nome[4] local_nome[5] <<<<<- and Settings\Aluno\Meus "Amoras" "Bom Jesus" "Centro" "Fátima" "Nova Viçosa" para contador de 1 ate 43 faca leia(clientes[contador]) fimpara soma <- 0 escreval("CLIENTE":40,"BAIRRO":11,"CONSUMO":10) escreval("------------------------------------------------------------") para contador de 1 ate 43 faca consumo[contador] <- randi(101) soma <- soma + consumo[contador] local[contador] <- randi(5)+1 //1: Amoras 2: Bom Jesus 3: Centro 4: Fátima 5: Nova Viçosa 18 19 escreval(clientes[contador]:40,local_nome[local[contador]]:11,consumo[contador ]:10) fimpara escreval("------------------------------------------------------------") media <- soma / 43 escreval("Média de consumo geral = ",media:5:2) escreval escreval("RELAÇÃO DE CLIENTES COM CONSUMO ACIMA DA MÉDIA") escreval("---------------------------------------------") para contador de 1 ate 43 faca se (consumo[contador] >= media) entao escreval(clientes[contador]:40,consumo[contador]:10) acima <- acima + 1 fimse fimpara escreval escreval("---------------------------------------") escreval("Nº de cliente com consumo acima da média = ",acima) 20 21 fimalgoritmo Modifique o algoritmo acima de modo a: a. Calcular e exibir a média de consumo por bairro. b. Processar e exibir o nome do bairro que tem maior consumo médio. 22