Introdução aos Computadores e
Programação
Engenharia Civil
Instituto Politécnico de Viseu
Escola Superior de Tecnologia
Departamento de Informática
1º Ano - 2º Semestre
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.
Análise do problema:
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
Algoritmo:
Parte declarativa:
Variáveis:
Preço_artigo, dinheiro, unidades, troco: tipo INTEIRO
Parte operativa:
INICIO
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”)
SENÃO
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)
FIM SE
FIM
2. Determinar o maior de três números.
Análise do problema:
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
Algoritmo:
Parte declarativa:
Variáveis: maior, valor1, valor2, valor3: tipo INTEIRO
Parte operativa:
INICIO
ESCREVER(‘Indique o valor 1, valor 2 e valor 3?’)
LER(valor1, valor2, valor3)
SE valor1 > valor2 ENTÃO
maior ← valor1
SENÃO
maior ← valor2
FIM SE
SE valor3 > maior ENTÃO
maior ← valor3
FIM SE
ESCREVER(‘O maior valor encontrado é: ‘, maior)
FIM
1/9
3. Calcular a área e o perímetro das seguintes figuras: Rectângulo, Triângulo rectângulo e Círculo.
Análise do problema:
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
Algoritmo:
Parte declarativa:
Constantes: Pi = 3,1415
Variáveis:
area, perimetro, ladoA, ladoB, base, altura, raio: tipo REAL
opção: tipo CARACTER
Parte operativa:
INICIO
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)
SENÃO FAZ: ESCREVER(‘Opção não válida!’)
FIM CASO
FIM
4. Calcule a soma dos primeiros N números inteiros positivos.
Análise do problema:
Entradas: N
Saídas: soma
Descrição do problema: soma ← 1+2+3+...+N
Algoritmo:
Parte declarativa:
Variáveis:
soma, N, contador: tipo INTEIRO
Parte operativa:
INICIO
ESCREVER(‘Qual o número de elementos a determinar a soma?’)
LER(N)
soma ← 0
DE contador ← 1 ATÉ N FAZ
Soma ← soma + contador
FIM DE
ESCREVER(‘O resultado da soma é ‘, soma)
FIM
2/9
Outra versão
Estratégia: calcular a soma de N termos de uma progressão aritmética: u1+ u2 + … + uN = (u1+uN)/2*N
Análise do problema:
Entradas: N
Saídas: soma
Descrição do problema: soma ← (u1+uN)/2*N
Algoritmo:
Parte declarativa:
Variáveis:
soma, N: tipo INTEIRO
Parte operativa:
INICIO
ESCREVER(‘Qual o número de elementos a determinar a soma?’)
LER(N)
soma ← (u1+uN)/2*N
ESCREVER(‘O resultado da soma é ‘, soma)
FIM
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).
Análise do problema:
Entradas: operador, operando1, operando2
Saídas: resultado
Descrição do problema: resultado ← operando1 (operador) operando2
Algoritmo:
Parte declarativa:
Variáveis:
operando1, operando2, resultado: tipo REAL
operador: tipo CARACTER
Parte operativa:
INICIO
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!’)
SENÃO
resultado ← operando1 / operando2
ESCREVER(‘O resultado da Divisão é ‘, resultado)
FIM SE
SENÃO FAZ: ESCREVER(‘Operador não válido!’)
FIM CASO
FIM
3/9
6. Calcular o quadrado de todos os números compreendidos entre x1 e x2.
Análise do problema:
Entradas: x1, x2
Saídas: quadrado
Descrição do problema: quadrado ← x*x com x a variar entre x1 e x2
Algoritmo:
Parte declarativa:
Variáveis:
quadrado, x1, x2, x, temp: tipo INTEIRO
Parte operativa:
INICIO
ESCREVER(‘Qual o valor de x1 e x2?’)
LER(x1, x2)
SE x1 > x2 ENTÃO
temp ← x1
x1 ← x2
x2 ← temp
FIM SE
DE x ← x1 ATÉ x2 FAZ
quadrado ← x*x
ESCREVER(‘O quadrado de ‘, x, ‘ é ‘, quadrado)
FIM DE
FIM
7. Para uma sequência de N elementos, determine a soma dos elementos ímpares.
Análise do problema:
Entradas: N
Saídas: soma
Descrição do problema: soma ← 1+3+5+7+9+...+N se N for ímpar
Algoritmo:
Parte declarativa:
Variáveis: N, soma, contador: tipo INTEIRO
Parte operativa:
INICIO
ESCREVER(‘Qual o número de elementos a determinar a soma?’)
LER(N)
soma ← 0
DE contador ← 1 ATÉ N FAZ
soma ← soma + contador
contador ← contador + 1
FIM DE
ESCREVER(‘O resultado da soma é ‘, soma)
FIM
ou
INICIO
...
soma ← 0
contador ← 1
ENQUANTO contador <= N FAZ
soma ← soma + contador
contador ← contador + 2
FIM ENQUANTO
...
FIM
4/9
Outra versão
Estratégia: calcular a soma dos termos de ordem ímpar numa progressão aritmética: u1+ u3 + … + um = (u1+um)/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 SENÃO m←N-1
Caso de soma dos pares
u2+ u4 + … + u2k = (u1+u2k)/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.
Análise do problema:
Entradas: numero
Saídas: resultado
Descrição do problema: resultado ← numero * i com i de 1 a 10
Algoritmo:
Parte declarativa:
Variáveis: resultado, numero, i: tipo INTEIRO
Parte operativa:
INICIO
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)
FIM DE
SENÃO
ESCREVER(‘Número inválido!’)
FIM SE
FIM
9. Calcular a soma de uma sequência de números inteiros terminada por 0.
Análise do problema:
Entradas: numero
Saídas: soma
Descrição do problema: soma ← numero (1) + numero (2) + ... até numero ser 0
Algoritmo:
Parte declarativa:
Variáveis: numero, soma: tipo INTEIRO
Parte operativa:
INICIO
Soma ← 0
REPETIR
ESCREVER(‘Qual o número? ‘)
LER(numero)
SE numero <> 0 ENTÃO
soma ← soma + numero
FIM SE
ATÉ numero = 0
ESCREVER(‘O resultado da soma é ‘, soma)
FIM
5/9
10. Calcular os divisores de um número N.
Análise do problema:
Entradas: N
Saídas: divisor
Descrição do problema: é divisor se N for divisível por divisor
Algoritmo:
Parte declarativa:
Variáveis: N, divisor: tipo INTEIRO
Parte operativa:
INICIO
ESCREVER(‘Qual o número N? ‘)
LER(N)
DE divisor ← 1 ATÉ N FAZ
SE N (Resto_Divisão_Inteira) divisor = 0 ENTÃO
ESCREVER(divisor, ‘ é divisor de ‘, N)
FIM SE
FIM DE
FIM
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.
Análise do problema:
Entradas: N
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
Algoritmo:
Parte declarativa:
Variáveis: N, contador, resto: tipo INTEIRO
Parte operativa:
INICIO
ESCREVER(‘Qual o número N? ‘)
LER(N)
contador ← N
REPETIR
contador ← contador - 1
resto ← N (Resto_Divisão_Inteira) contador
ATÉ resto = 0
SE contador = 1 ENTÃO
ESCREVER(N, ‘ é número primo.’)
SENÃO
ESCREVER(N, ‘ não é número primo.’)
FIM SE
FIM
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
REPETIR
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.
Análise do problema:
Entradas: valor, N
Saídas: media
Descrição do problema: media ← (valor (1) + valor (2) + ... + valor (N))/ N
Algoritmo:
Parte declarativa:
Variáveis: valor, media, soma: tipo REAL
N, contador: tipo INTEIRO
Parte operativa:
INICIO
ESCREVER(‘Qual o número N? ‘)
LER(N)
soma ← 0
DE contador ← 1 ATÉ N FAZ
ESCREVER(‘Qual o ‘, contador, ‘º valor? ’)
Ler(valor)
soma ← soma + valor
FIM DE
SE N <> 0 ENTÃO
media ← soma/N
ESCREVER(‘Média = ‘, media)
SENÃO
ESCREVER(‘Média = 0’)
FIM SE
FIM
13. Determinar o número de ocorrências de um dado número inteiro numa sequência de números
terminada por 0.
Análise do problema:
Entradas: numero, valor
Saídas: contador
Descrição do problema: se valor = numero então incrementa o contador, até valor ser 0
Algoritmo:
Parte declarativa:
Variáveis: numero, valor, contador: tipo INTEIRO
Parte operativa:
INICIO
ESCREVER(‘Qual o número a comparar? ‘)
LER(numero)
contador ← 0
REPETIR
ESCREVER(‘Qual o valor? ‘)
LER(valor)
SE valor = numero ENTÃO
contador ← contador + 1
FIM SE
ATÉ valor = 0
ESCREVER(‘O número ‘, numero, ‘ está repetido ‘, contador, ‘ vezes’)
FIM
7/9
14. Jogo do palpite: encontrar um número entre 0 e 100 introduzido por outro utilizador.
Análise do problema:
Entradas: numero, palpite
Saídas: tentativa
Descrição do problema: repetir o palpite ate numero ser igual ao palpite
Algoritmo:
Parte declarativa:
Variáveis: numero, palpite, tentativa: tipo INTEIRO
Parte operativa:
INICIO
ESCREVER(‘Jogador 1: Qual o número a encontrar? ‘)
LER(número)
tentativa ← 0
REPETIR
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.’)
SENÃO
SE palpite < numero ENTÃO
ESCREVER(‘O seu palpite é menor que o número a encontrar.’)
SENÃO
ESCREVER(‘Parabéns, acertou!’)
FIM SE
FIM SE
tentativa ← tentativa +1
ATÉ numero = palpite
ESCREVER(‘Necessitou de ‘, tentativa, ‘ tentativas.’)
FIM
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.
Análise do problema:
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
Algoritmo:
Parte declarativa:
Variáveis: dia, mês, ano, dias, dias_mes: tipo INTEIRO
Parte operativa:
INICIO
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
SENÃO
dias_mês ← 28
FIM SE
SENÃO FAZ: dias_mês ← 0
FIM CASO
SE dias_mês = 0 OU dia > dias_mês OU dia <= 0 ENTÃO
ESCREVER(‘Data errada!’)
SENÃO
dias ← dias_mês – dia
ESCREVER(‘O número de dias até final do mês é ‘, dias)
FIM SE
FIM
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.
Análise do problema:
Entradas: numero1, numero2, opção
Saídas: produto
Descrição do problema: se opção diferente de N: produto ← numero1 * numero2
Algoritmo:
Parte declarativa:
Variáveis: numero1, numero2, produto: tipo INTEIRO
opção: tipo CARACTER
Parte operativa:
INICIO
REPETIR
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’
FIM
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.
Análise do problema:
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
Algoritmo:
Parte declarativa:
Constantes: valor_final = 100
Variáveis: valor_inicial, incremento, contador
Parte operativa:
INICIO
REPETIR
ESCREVER(‘Qual o valor inicial (entre 10 e 20)?’)
LER(valor_inicial)
ATÉ valor_inicial >= 10 E valor_inicial <= 20
REPETIR
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
FIM ENQUANTO
FIM
9/9
Download

Resolução - Escola Superior de Tecnologia