Introdução aos Computadores e Programação Instituto Politécnico de Viseu Escola Superior de Tecnologia Engenharia Civil 1º Ano - 2º Semestre Departamento de Informática Ficha de Trabalho n.º 2 Soluções propostas Estudo prático de algoritmos 1. Dado o preço de um determinado artigo e a quantidade de dinheiro disponível, determinar quantas unidades se podem comprar e quanto dinheiro sobra. Entradas: preço_artigo, dinheiro Saídas: unidades, troco Descrição do problema: unidades dinheiro / preço_artigo (divisão inteira) troco dinheiro preço_artigo * unidades Preço_artigo, dinheiro, unidades, troco: tipo INTEIRO ESCREVER( Qual o preço do artigo? ) LER(preço_artigo) ESCREVER( Qual o dinheiro disponível? ) LER(dinheiro) SE preço_artigo = 0 ENTÃO ESCREVER( ERRO: Preço não válido ) unidades dinheiro DIVISÃO_INTEIRA preço_artigo troco dinheiro unidades*preço_artigo ESCREVER( Com, dinheiro, é possível comprar, unidades, e receber de troco troco) SE 2. Determinar o maior de três números. Entradas: valor1, valor2, valor3 Saídas: maior Descrição do problema: maior valor1 se maior que valor2 e valor3 maior valor2 se maior que valor1 e valor3 maior valor3 se maior que valor1 e valor2 maior, valor1, valor2, valor3: tipo INTEIRO ESCREVER( Indique o valor 1, valor 2 e valor 3? ) LER(valor1, valor2, valor3) SE valor1 > valor2 ENTÃO maior valor1 maior valor2 SE SE valor3 > maior ENTÃO maior valor3 SE ESCREVER( O maior valor encontrado é:, maior) 1/9
3. Calcular a área e o perímetro das seguintes figuras: Rectângulo, Triângulo rectângulo e Círculo. Entradas: opção, (ladoa, ladob) ou (base, altura) ou (raio) Saídas: area, perimetro Descrição do problema: Para o rectângulo: area ladoa * ladob; perimetro (ladoa+ladob)*2 Para o triângulo rect.: area base*altura/2; perimetro base+altura+raizq(base^2+altura^2) Para o círculo: area pi*raio^2; perimetro 2*pi*raio Constantes: Pi = 3,1415 area, perimetro, ladoa, ladob, base, altura, raio: tipo REAL opção: tipo CARACTER ESCREVER( Calcular a área e perímetro do (R)ectângulo, (T)riângulo rectângulo ou (C)írculo? ) LER(opção) CASO opção SEJA R ou r FAZ: ESCREVER( Quais as dimensões do lado A e lado B do rectângulo? ) LER(ladoA, ladob) area ladoa*ladob perimetro (ladoa + ladob)*2 ESCREVER( A área do Rectângulo é, area, e o perímetro é, perimetro) T ou t FAZ: ESCREVER( Quais as dimensões da Base e Altura do Triângulo rectângulo? ) LER(base, altura) area base*altura/2 perimetro base + altura + raizq(base^2+altura^2) ESCREVER( A área do Triângulo rectângulo é, area, e o perímetro é, perimetro) C ou c FAZ: ESCREVER( Qual o raio do Círculo? ) LER(raio) area pi*raio*raio perimetro 2*pi*raio ESCREVER( A área do Círculo é, area, e o perímetro é, perimetro) FAZ: ESCREVER( Opção não válida! ) CASO 4. Calcule a soma dos primeiros N números inteiros positivos. Saídas: soma Descrição do problema: soma 1+2+3+...+N soma, N, contador: tipo INTEIRO ESCREVER( Qual o número de elementos a determinar a soma? ) soma 0 DE contador 1 ATÉ N FAZ Soma soma + contador DE ESCREVER( O resultado da soma é, soma) 2/9
Outra versão Estratégia: calcular a soma de N termos de uma progressão aritmética: u 1 + u 2 + + u N = (u 1 +u N )/2*N Saídas: soma Descrição do problema: soma (u 1 +u N )/2*N soma, N: tipo INTEIRO ESCREVER( Qual o número de elementos a determinar a soma? ) soma (u 1 +u N )/2*N ESCREVER( O resultado da soma é, soma) 5. Simular uma máquina de calcular que só efectua as operações básicas de adição, subtracção, multiplicação e divisão, entre dois números. (Nota: atenção á divisão por zero). Entradas: operador, operando1, operando2 Saídas: resultado Descrição do problema: resultado operando1 (operador) operando2 operando1, operando2, resultado: tipo REAL operador: tipo CARACTER ESCREVER( Qual o valor do Operando 1 e do Operando 2? ) LER(operando1, operando2) ESCREVER( Qual a operação a realizar (+, -, *, /)? ) LER(operador) CASO operador SEJA + FAZ: resultado operando1 + operando2 ESCREVER( O resultado da Adição é, resultado) - FAZ: resultado operando1 - operando2 ESCREVER( O resultado da Subtracção é, resultado) * FAZ: resultado operando1 * operando2 ESCREVER( O resultado da Multiplicação é, resultado) / FAZ: SE operando2 = 0 ENTÃO ESCREVER( Erro: divisão por zero! ) resultado operando1 / operando2 ESCREVER( O resultado da Divisão é, resultado) SE FAZ: ESCREVER( Operador não válido! ) CASO 3/9
6. Calcular o quadrado de todos os números compreendidos entre x 1 e x 2. Entradas: x1, x2 Saídas: quadrado Descrição do problema: quadrado x*x com x a variar entre x1 e x2 quadrado, x1, x2, x, temp: tipo INTEIRO ESCREVER( Qual o valor de x1 e x2? ) LER(x1, x2) SE x1 > x2 ENTÃO temp x1 x1 x2 x2 temp SE DE x x1 ATÉ x2 FAZ quadrado x*x ESCREVER( O quadrado de, x, é, quadrado) DE 7. Para uma sequência de N elementos, determine a soma dos elementos ímpares. Saídas: soma Descrição do problema: soma 1+3+5+7+9+...+N se N for ímpar N, soma, contador: tipo INTEIRO ESCREVER( Qual o número de elementos a determinar a soma? ) soma 0 DE contador 1 ATÉ N FAZ soma soma + contador contador contador + 1 DE ESCREVER( O resultado da soma é, soma) ou... soma 0 contador 1 ENQUANTO contador <= N FAZ soma soma + contador contador contador + 2 ENQUANTO... 4/9
Outra versão Estratégia: calcular a soma dos termos de ordem ímpar numa progressão aritmética: u 1 + u 3 + + u m = (u 1 +u m )/2*x Cálculo do número de termos (x) e do índice (m) do último termo, dados os N elementos da sucessão: x (N+1) DIVISÃO INTEIRA 2 SE N ímpar ENTÃO m N m N-1 Caso de soma dos pares u 2 + u 4 + + u 2k = (u 1 +u 2k )/2*k Cálculo de k, dados os N elementos da sucessão: k N DIVISÃO INTEIRA 2 8. Escrever a tabuada (multiplicação) de um número entre 1 e 10. Entradas: numero Saídas: resultado Descrição do problema: resultado numero * i com i de 1 a 10 resultado, numero, i: tipo INTEIRO ESCREVER( Qual o número (1 a 10) da Tabuada? ) LER(numero) SE numero >= 1 E numero <= 10 ENTÃO ESCREVER( Tabuada do, numero) DE i 1 ATÉ 10 FAZ resultado numero * i ESCREVER(numero, x, i, =, resultado) DE ESCREVER( Número inválido! ) SE 9. Calcular a soma de uma sequência de números inteiros terminada por 0. Entradas: numero Saídas: soma Descrição do problema: soma numero (1) + numero (2) +... até numero ser 0 numero, soma: tipo INTEIRO Soma 0 ESCREVER( Qual o número? ) LER(numero) SE numero <> 0 ENTÃO soma soma + numero SE ATÉ numero = 0 ESCREVER( O resultado da soma é, soma) 5/9
10. Calcular os divisores de um número N. Saídas: divisor Descrição do problema: é divisor se N for divisível por divisor N, divisor: tipo INTEIRO ESCREVER( Qual o número N? ) DE divisor 1 ATÉ N FAZ SE N (Resto_Divisão_Inteira) divisor = 0 ENTÃO ESCREVER(divisor, é divisor de, N) SE DE Melhor: efectuar apenas metade das divisões (N não é divisível por nenhum inteiro superior a N/2): 11. Determinar se um número N é primo. Saídas: VERDADEIRO ou FALSO Descrição do problema: Se N só for divisível pelo próprio e pela unidade então é número primo N, contador, resto: tipo INTEIRO ESCREVER( Qual o número N? ) contador N contador contador - 1 resto N (Resto_Divisão_Inteira) contador ATÉ resto = 0 SE contador = 1 ENTÃO ESCREVER(N, é número primo. ) ESCREVER(N, não é número primo. ) SE Melhor: efectuar apenas metade das verificações (N não é divisível por nenhum inteiro superior a N/2): contador N DIVISÃO INTEIRA 2 resto N (Resto_Divisão_Inteira) contador contador contador - 1 ATÉ resto = 0 6/9
12. Cálculo da média de uma sequência de valores. Entradas: valor, N Saídas: media Descrição do problema: media (valor (1) + valor (2) +... + valor (N))/ N valor, media, soma: tipo REAL N, contador: tipo INTEIRO ESCREVER( Qual o número N? ) soma 0 DE contador 1 ATÉ N FAZ ESCREVER( Qual o, contador, º valor? ) Ler(valor) soma soma + valor DE SE N <> 0 ENTÃO media soma/n ESCREVER( Média =, media) ESCREVER( Média = 0 ) SE 13. Determinar o número de ocorrências de um dado número inteiro numa sequência de números terminada por 0. Entradas: numero, valor Saídas: contador Descrição do problema: se valor = numero então incrementa o contador, até valor ser 0 numero, valor, contador: tipo INTEIRO ESCREVER( Qual o número a comparar? ) LER(numero) contador 0 ESCREVER( Qual o valor? ) LER(valor) SE valor = numero ENTÃO contador contador + 1 SE ATÉ valor = 0 ESCREVER( O número, numero, está repetido, contador, vezes ) 7/9
14. Jogo do palpite: encontrar um número entre 0 e 100 introduzido por outro utilizador. Entradas: numero, palpite Saídas: tentativa Descrição do problema: repetir o palpite ate numero ser igual ao palpite numero, palpite, tentativa: tipo INTEIRO ESCREVER( Jogador 1: Qual o número a encontrar? ) LER(número) tentativa 0 ESCREVER( Jogador 2: Qual o seu palpite? ) LER(palpite) SE palpite > numero ENTÃO ESCREVER( O seu palpite é maior que o número a encontrar. ) SE palpite < numero ENTÃO ESCREVER( O seu palpite é menor que o número a encontrar. ) ESCREVER( Parabéns, acertou! ) SE SE tentativa tentativa +1 ATÉ numero = palpite ESCREVER( Necessitou de, tentativa, tentativas. ) 15. Calcular o número de dias que falta para o fim do mês, sendo pedidos o dia, o mês e o ano. Entradas: dia, mês, ano Saídas: dias Descrição do problema: Janeiro, Março, Maio, Julho, Agosto, Outubro, Dezembro: dias 31 dia Abril, Junho, Setembro, Novembro: dias 30 dia Fevereiro ano bissexto dias 29 dia; ano não bissexto dias 28 dia dia, mês, ano, dias, dias_mes: tipo INTEIRO ESCREVER( Qual o dia, mês e ano? ) LER(dia, mês, ano) CASO mês SEJA 1, 3, 5, 7, 8, 10, 12 FAZ: dias_mês 31 4, 6, 9, 11 FAZ: dias_mês 30 2 FAZ: SE ano (Resto_Divisão_Inteira) 4 = 0 ENTÃO dias_mês 29 dias_mês 28 SE FAZ: dias_mês 0 CASO SE dias_mês = 0 OU dia > dias_mês OU dia <= 0 ENTÃO ESCREVER( Data errada! ) dias dias_mês dia ESCREVER( O número de dias até final do mês é, dias) SE 8/9
16. Calcular o produto de sucessivos grupos de dois números inteiros, até que o utilizador introduza a letra N quando o programa pergunta se quer continuar. Entradas: numero1, numero2, opção Saídas: produto Descrição do problema: se opção diferente de N: produto numero1 * numero2 numero1, numero2, produto: tipo INTEIRO opção: tipo CARACTER ESCREVER( Quais os valores 1 e 2? ) LER(numero1, numero2) produto numero1 * numero2 ESCREVER( O produto de, numero1, por, numero2, é, produto) ESCREVER( Deseja continuar (S/N)? ) LER(opção) ATÉ opção = N OU opção = n 17. Dado um valor inicial entre 10 e 20 e um incremento entre 5 e 10 introduzidos pelo utilizador, determine os números entre o valor inicial e 100 que se obtêm adicionando, sucessivamente a partir do valor inicial, o incremento ao valor anterior. Entradas: valor_inicial, incremento Saídas: contador Descrição do problema: mostrar os valores até 100, inicio entre 10 e 20 e incrementos entre 5 e 10 Constantes: valor_final = 100 valor_inicial, incremento, contador ESCREVER( Qual o valor inicial (entre 10 e 20)? ) LER(valor_inicial) ATÉ valor_inicial >= 10 E valor_inicial <= 20 ESCREVER( Qual o incremento (entre 5 e 10)? ) LER(incremento) ATÉ incremento >= 5 E incremento <= 10 contador valor_inicial ENQUANTO contador <= valor_final FAZ ESCREVER( O valor é, contador) contador contador + incremento ENQUANTO 9/9