Buscar

Solução Exercicios 2

Prévia do material em texto

Exercícios de Revisão - Soluções 
(Resolva todos exercícios a seguir fazendo uso de subalgoritmos) 
 
 
 1. Escreva um algoritmo que leia um número positivo e uma posição k e escreva o k-ésimo 
dígito (da direita para esquerda) do número lido. Use uma função para calcular o k-ésimo 
dígito. Por exemplo, KesimoDigito(2845, 3) = 8. 
 Algoritmo 
Declare x, i numerico 
função numerico KesimoDigito(n,k numerico) 
 Declare j numerico 
 Para j de 1 até k faça 
 r := Resto(n,10) 
 n := Quociente(n,10) 
 fim_para 
 Se r = 0 E n = 0 
 então Escreva „Não existe o digito solicitado‟ 
 retorna -1 
 senão retorna r 
fim_função 
Leia x, i 
Se i>0 
 Escreva KesimoDigito(x,i) 
fim_se 
fim_algoritmo 
 
 OBS.: este algoritmo escreve o dígito caso ele exista, pois se o 
 “i” lido for maior que a quantidade de digitos do número, será 
 exibida a mensagem e o resultado da função será -1 (um digito que 
 não existe). 
 2. O fatorial primo de um número primo positivo é o produto de todos os primos positivos 
menores do que ou iguais a ele: N# = 2 × 3 × 5 × 7 × ⋯ × N (sendo 2# = 2). Por exemplo, 7# 
= 2 × 3 × 5 × 7 = 210. Escreva um algoritmo que teste se um número dado é primo, caso 
seja escreva o seu fatorial primo, caso contrário escreva uma mensagem adequada. Dica: 
use sub-algoritmos para calcular o número de divisores, testar se um número é primo e 
calcular o fatorial primo. 
Algoritmo 
Declare x numerico 
função numerico NumDiv(n numerico) 
 Declare ret, i numerico 
 ret := 0 
 Para i de 1 ate n faça 
 se resto(n,i)=0 
 então ret := ret+1 
 fim_se 
 fim_para 
 retorna ret 
fim_função 
 
 
 
 
 
função logico EhPrimo(n numerico) 
 Declare ret logico 
 se NumDiv(n) = 2 
 então ret := verdadeiro 
 senão ret := falso 
 fim_se 
 retorna ret 
fim_função 
 
função numerico fatorialPrimo(n numerico) 
 Declare ret,i numerico 
 ret := 1 
Para i de n ate 2 passo -1 faça 
 se EhPrimo(i) 
 então ret := ret * i 
 fim_se 
 fim_para 
retorna ret 
fim_função 
 
Leia x 
Se EhPrimo(x) 
 então Escreva fatorialPrimo(x) 
 senão Escreva „O número informado não é primo‟ 
fim_se 
 
 fim_algoritmo 
 3. Escrever um algoritmo que lê 2 vetores de tamanho 10, ordena seus elementos em ordem 
crescente e os escreve. Crie, a seguir, um vetor de 20 posições que contenha os elementos 
dos outros 2 vetores em ordem crescente. Escreva o vetor resultante. 
Algoritmo 
 Declare v1(10),v2(10),v3(20) numerico 
 
 subrotina LeVetor(CR v() numerico; tam numerico) 
 Declare i numerico 
 Para i de 1 ate tam faça 
 Leia v(i) 
 fim_para 
 fim_subrotina 
 
 subrotina EscreveVetor(v(),tam numerico) 
 Declare i numerico 
 Para i de 1 ate tam faça 
 Escreva v(i) 
 fim_para 
 fim_subrotina 
 
 
 
 
 
 
 
 
 
 subrotina Ordena(CR v() numérico; tam numerico) 
 Declare i,j,pos,aux numerico 
 Para i de 1 ate tam faça 
 pos := i 
 Para j de i+1 até 15 faça 
 Se v(j) < v(pos) 
 então pos := j 
 fim_se 
 fim_para 
 aux := v(pos) 
 v(pos) := v(i) 
 v(i) := aux 
 fim_para 
 fim_subrotina 
 
 
 subrotina Concatena(CR r() numerico; v1(),v2(),tam1,tam2 numerico) 
 Declare i,j,k numerico 
 i:=1 
 j:=1 
 k:=1 
 Enquanto i <= tam1 E j <= tam2 faça 
 se v1(i) <= v2(j) 
 entao r(k):= v1(i) 
 i := i+1 
 senão r(k):= v2(j) 
 j := j+1 
 fim_se 
 k:=k+1 
 fim_enquanto 
 Enquanto i <= tam1 faça 
 r(k):=v1(i) 
 i:=i+1 
 k:=k+1 
 fim_enquanto 
 Enquanto j <= tam2 faça 
 r(k):=v2(j) 
 j:=j+1 
 k:=k+1 
 fim_enquanto 
 
 LeVetor(v1,10) 
 LeVetor(v2,10) 
 Ordena(v1,10) 
 Ordena(v2,10) 
 EscreveVetor(v1,10) 
 EscreveVetor(v2,10) 
 Concatena(v3,v1,v2,10,10) 
 EscreveVetor(v3,20) 
 
 fim_subrotina 
 
 
 
 4. Elaborar um algoritmo que lê duas matrizes M(4,6) e N(6,4) e cria uma matriz que seja: 
 a) a transposta de M 
 b) o produto matricial de M por N; 
Escrever as matrizes calculadas. 
Algoritmo 
 Declare M(4,6),N(6,4),T(6,4),P(4,4) numerico 
 
 subrotina LeMatriz(CR m() numerico; tamL,tamC numerico) 
 Declare i,j numerico 
 Para i de 1 ate tamL faça 
 Para j de 1 ate tamC faça 
 Leia m(i,j) 
 fim_para 
 fim_para 
 fim_subrotina 
 
 subrotina EscreveMatriz(m(),tamL,tamC numerico) 
 Declare i,j numerico 
 Para i de 1 ate tamL faça 
 Para j de 1 ate tamC faça 
 Escreva m(i,j) 
 fim_para 
 fim_para 
 fim_subrotina 
 
 subrotina Transposta (CR m2() numerico; m1(),tamL,tamC numerico) 
 Declare i,j numerico 
 Para i de 1 até tamL faça 
 Para j de 1 até tamC faça 
 m2(j,i) := m1(i,j) 
 fim_para 
 fim_para 
 fim_subrotina 
 
 subrotina Produto (CR m3() numerico; 
 m1(),m2(),tamL1,tamC2,tamC1L2 numerico) 
 Declara i,j,k numerico 
 Para i de 1 ate tamL1 
 Para j de 1 até tamC2 faça 
 m3(i,j) := 0 
 Para k de 1 até tamC1L2 faça 
 m3(i,j) := m3(i,j) + m1(i,k) * m2(k,j) 
 fim_para 
 fim_para 
 fim_para 
 fim_subrotina 
 
 LeMatriz(M,4,6) 
 LeMatriz(N,6,4) 
 Transposta(T,M,4,6) 
 Produto(P,M,N,4,4,6) 
 EscreveMatriz(T,6,4) 
 EscreveMatriz(P,4,4) 
 
fim_algoritmo 
 
 5. Considerando a necessidade de desenvolver uma agenda que contenha nomes, endereços 
e telefones de 10 pessoas, defina uma estrutura de dados apropriada e desenvolva um 
algoritmo para a execução das seguintes funcionalidades: 
 a) Cadastrar 10 registros 
 b) Pesquisar um registro pelo nome ou pelo telefone 
 c) Classificar por ordem de nome os registros 
 d) Listar todos os registros 
 e) Sair do programa 
Algoritmo 
 Tipo AGENDA = registro 
 nome Literal 
 end Literal 
 fone Numerico 
 fim_registro 
 
 Declare op, fone numerico 
 Declare nome literal 
 Declare A(10) AGENDA 
 
 função logico MenuPrincipal(CR p numérico) 
 Declare ret logico 
 Repita 
 Escreva "Selecione a opção desejada:",\n 
 Escreva "1 – Cadastrar registros",\n 
 Escreva "2 – Pesquisar",\n 
 Escreva "3 – Classificar",\n 
 Escreva "4 – Listar",\n 
 Escreva "5 – Sair",\n 
 Leia p 
 até p > 0 E p < 6 
 Se p = 5 
 então ret:= falso 
 senão ret:= verdadeiro 
 fim_se 
 retorna ret 
 fim_função 
 
 subrotina Cadastra(CR v() AGENDA; t numérico) 
 Declare i numérico 
 Para i de 1 até t faca 
 Leia v(i).nome 
 Leia v(i).end 
 Leia v(i).fone 
 fim_para 
 fim_subrotina 
 
função numérico Critério() 
Declare p numérico 
 Repita 
 Escreva "Escolha o critério de pesquisa:",\n 
 Escreva "1 – Nome",\n 
 Escreva "2 – Telefone",\n 
 Leia p 
 até p > 0 E p < 3 
 retorna p 
fim_função 
subrotina PesquisaNome(n literal; v() AGENDA; t numérico) 
 Declare i, achou numérico 
 i:=1 
 achou := 0 
 Enquanto i <= t OU achou = 0 faca 
 Se v(i).nome = n 
 então Escreva "Endereço: ", v(i).end,\n 
 Escreva "Fone: ", v(i).fone 
 achou := 1 
 fim_se 
 fim_enquanto 
 Se achou = 0 
 então Escreva "Registro não localizado" 
 fim_se 
fim_subrotina 
 
 
subrotina PesquisaFone(f,t numérico; v() AGENDA) 
 Declare i, achou numérico 
 i:=1 
 achou := 0 
 Enquanto i <= t OU achou = 0 faca 
 Se v(i).fone = f 
 então Escreva "Nome: ", v(i).nome,\n 
 Escreva "Endereço: ", v(i).end 
 achou := 1 
 fim_se 
 fim_enquanto 
 Se achou = 0 
 então Escreva "Registro nãolocalizado" 
 fim_se 
fim_subrotina 
 
 
subrotina Classifica(CR v() AGENDA; t numérico) 
 Declare i,pos,j,x numérico 
 Declare aux literal 
 Para i de 1 até t faça 
 pos := i 
 Para j de i+1 até t faça 
 Se v(j).nome < v(pos).nome 
 então pos := j 
 fim_se 
 fim_para 
 aux := v(pos).nome 
 v(pos).nome := v(i).nome 
 v(i).nome := aux 
 aux := v(pos).end 
 v(pos).end := v(i).end 
 v(i).end := aux 
 x := v(pos).fone 
 v(pos).fone := v(i).fone 
 v(i).fone := x 
 fim_para 
fim_subrotina 
 
 
 
subrotina Lista(v() AGENDA; t numérico) 
 Declare i numérico 
 Para i de 1 até t faça 
 Escreva v(i).nome, " - ", v(i).end, " - ", v(i).fone, \n 
 fim_para 
fim_subrotina 
 
Enquanto MenuPrincipal(op) faça 
 Se op = 1 
 então Cadastra(A,10) 
 senão se op = 2 
 então se Critério()=1 
 então Leia nome 
 PesquisaNome(nome,A,10) 
 senão Leia fone 
 PesquisaFone(fone,A,10) 
 fim_se 
 senão se op = 3 
 então Classifica(A,10) 
 senão Lista(A,10) 
 fim_se 
 fim_se 
 fim_se 
fim_enquanto 
fim_algoritmo 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 6. Considerando a necessidade de um programa que armazene o nome e as notas bimestrais 
de 20 alunos, escreva um algoritmo que realize as seguintes tarefas: 
 a) Cadastro dos alunos (após o cadastro classificar por nome) 
 b) Pesquisar pelo nome os dados de um aluno. Como resultado da pesquisa, além dos 
dados registrados, apresentar a média do aluno e a mensagem “Aprovado” caso a 
média seja maior ou igual a 6 ou a mensagem “Reprovado” caso contrário. 
 c) Apresentar todos os registros, médias e a mensagem de aprovação ou reprovação 
 d) Apresentar apenas os registros e médias dos alunos aprovados 
 e) Apresentar apenas os registros e médias dos alunos reprovados 
 f) Sair do programa 
Algoritmo 
 Tipo ALUNO = registro 
 nome literal 
 notas(4) numérico 
 fim_registro 
 Declare op numerico 
 Declare nome literal 
 Declare A(20) ALUNO 
 
 função lógico MenuPrincipal(CR p numérico) 
 Declare ret logico 
 Repita 
 Escreva "Selecione a opção desejada: ",\n 
 Escreva "1 – Cadastrar alunos",\n 
 Escreva "2 – Pesquisar",\n 
 Escreva "3 – Listar",\n 
 Escreva "4 – Listar aprovados",\n 
 Escreva "5 – Listar reprovados",\n 
 Escreva "6 – Sair",\n 
 Leia p 
 até p > 0 E p < 7 
 Se p = 6 
 então ret := falso 
 senão ret := verdadeiro 
 fim_se 
 retorna ret 
 fim_função 
 
 função numerico media(v() ALUNO; i numérico) 
 Declare j,soma numérico 
 soma:=0 
 Para j de 1 até 4 faca 
 soma:=soma+v(i).notas(j) 
 fim_para 
 retorna soma/4 
 fim_funcao 
 
 subrotina Cadastra(CR v() ALUNO; t numérico) 
 Declare i,j numérico 
 Para i de 1 até t faca 
 Leia v(i).nome 
 Para j de 1 ate 4 faca 
 Leia v(i).notas(j) 
 fim_para 
 fim_para 
 fim_subrotina 
 subrotina Pesquisa(n literal; v() ALUNO; t numérico) 
 Declare i,j,m,achou numérico 
 i:=1 
 achou := 0 
 Enquanto i<=t OU achou = 0 faca 
 Se v(i).nome = n 
 então Para j de 1 até 4 faca 
 Escreve "Nota ", j, ": ", v(i).notas(j),\n 
 fim_para 
 m := media(v,i) 
 Escreva "Média: ", m, \n 
 Se m >= 6 
 então Escreva "Aprovado" 
 senão Escreva "Reprovado" 
 fim_se 
 achou := 1 
 fim_se 
 fim_enquanto 
 Se achou = 0 
 então Escreva "Registro não localizado" 
 fim_se 
 fim_subrotina 
 
 subrotina Classifica(CR v() ALUNO; t numérico) 
 Declare i,pos,j,x numérico 
 Declare aux literal 
 Para i de 1 até t faça 
 pos := i 
 Para j de i+1 até t faça 
 Se v(j).nome < v(pos).nome 
 então pos := j 
 fim_se 
 fim_para 
 aux := v(pos).nome 
 v(pos).nome := v(i).nome 
 v(i).nome := aux 
 Para k de 1 até 4 faca 
 x := v(pos).notas(k) 
 v(pos).notas(k) := v(i).notas(k) 
 v(i).notas(k) := x 
 fim_para 
 fim_para 
 fim_subrotina 
 
 subrotina Lista(v() ALUNO; t numérico) 
 Declare i,j,m numérico 
 Para i de 1 até t faça 
 Escreva "Nome: ", v(i).nome,\n 
 Para j de 1 até 4 faca 
 Escreve "Nota ", j, ": ", v(i).notas(j),\n 
 fim_para 
 m := media(v,i) 
 Escreva "Média: ", m,\n 
 Se m >= 6 
 então Escreva "Aprovado" 
 senão Escreva "Reprovado" 
 fim_se 
 fim_para 
 fim_subrotina 
 
 subrotina ListaApRep(v() ALUNO; t, p numérico) 
 Declare i,j,m numérico 
 Para i de 1 até t faça 
 m = media(v,i) 
 Se p = 1 E m >=6 
 então Escreva "Nome: ", v(i).nome,\n 
 Para j de 1 até 4 faca 
 Escreve "Nota ", j, ": ",v(i).notas(j),\n 
 fim_para 
 Escreva "Média: ", m,\n 
 senão se p = 2 E m < 6 
 então Escreva "Nome: ", v(i).nome,\n 
 Para j de 1 até 4 faca 
 Escreve "Nota ", j, ": ", 
 v(i).notas(j),\n 
 fim_para 
 Escreva "Média: ", m,\n 
 fim_se 
 fim_para 
 fim_subrotina 
 
 Enquanto MenuPrincipal(op) faça 
 Se op = 1 
 então Cadastra(A,20) 
 Classifica(A,20) 
 senão se op = 2 
 então Leia nome 
 Pesquisa(nome,A,20) 
 senão se op = 3 
 então Lista(A,20) 
 senão se op = 4 
 então ListaApRep(A,20,1) 
 senão ListaApRep(A,20,2) 
 fim_se 
 fim_se 
 fim_se 
 fim_se 
 fim_enquanto 
fim_algoritmo 
 
 
 
 
 
 
 
 7. Elabore um algoritmo que permita cadastrar os dados de 10 linhas de ônibus de uma 
empresa. Para cada linha, deverão ser mantidas as seguintes informações: 
 a) Origem 
 b) Destino 
 c) Horário 
 d) Distância 
 e) As seguintes informações para cada uma das 44 poltronas (essas informações estão 
preenchidas somente quando a poltrona estiver ocupada) 
 Número da passagem 
 Nome 
 Sexo (F/M) 
O acesso as funcionalidades do algoritmo deverão ser feitas através do seguinte menu: 
1. Cadastro da linha 
Permite cadastrar as informações de a) até d) (listadas acima) para as 10 linhas. 
2. Venda de passagem 
A venda é registrada a partir do preenchimento das informações de uma poltrona 
livre de uma determinada linha. Para isso, o usuário deverá informar o número da 
linha desejada. Após será exibida uma lista das poltronas livres e solicitado o número 
da poltrona a ser preenchida. Caso não haja poltronas livres exibir mensagem 
adequada. 
3. Consultas 
Apresentará um sub-menu que permitirá escolher o tipo de consulta desejado até 
que o usuário selecione a opção de retornar ao menu principal: 
 Qual o horário de saída e a distância percorrida por um ônibus cujo número 
da linha é fornecido? 
 Quais linhas de ônibus estão lotadas? 
 Qual o horário estimado de chegada e duração da viagem de um ônibus cujo 
número da linha é fornecido (use velocidade média de 65km/h)? 
4. Sair 
Permite encerrar o algoritmo 
 
Algoritmo 
 Tipo PASSAGEM = Registro 
 Num Numérico 
 Nome, Sexo Literal 
 fim_registro 
 Tipo HORA = Registro 
 H,M Numérico 
 fim_registro 
 
 Tipo LINHA = Registro 
 Orig, Dest Literal 
 Horario HORA 
 Dist Numérico 
 Pt(44) PASSAGEM 
 fim_registro 
 
 Declare L(10) LINHA 
 Declare op,Cadastrou Numerico 
 
 função lógico MenuPrincipal(CR p numérico) 
 Declare ret logico 
 Repita 
 Escreva "Selecione a opção desejada: ",\n 
 Escreva "1 – Cadastro de Linha",\n 
 Escreva "2 – Venda de Passagem",\n 
 Escreva "3 – Consultas",\nEscreva "4 – Sair",\n 
 Leia p 
 até p > 0 E p < 5 
 Se p = 4 
 então ret := falso 
 senão ret := verdadeiro 
 fim_se 
 retorna ret 
 fim_função 
 
 subrotina Cadastra(CR v() LINHA; tam numerico) 
 Declare i,j numerico 
 Para i de 1 até tam faça 
 Escreva "Informe a Cidade de Origem: " 
 Leia v(i).Orig 
 Escreva "Informe a Cidade de Destino: " 
 Leia v(i).Dest 
 Escreva "Informe o Horário(Hora e Minutos): " 
 Leia v(i).Horario.H, v(i).Horario.M 
 Escreva "Informe a Distância: " 
 Leia v(i).Dist 
 Para j de 1 até 44 faça 
 v(i).Pt(j).Num = 0 
 fim_para 
 fim_para 
 fim_subrotina 
 
 subrotina Venda(CR v() LINHA; tam numerico) 
 Declare i,cont,lin numerico 
 Repita 
 Escreva „Informe a linha desejada:‟ 
 Leia lin 
 até lin > 0 E lin < tam+1 
 
 Escreva "Poltronas liberadas" 
 cont :=0 
 Para i de 1 até 44 faça 
 Se v(lin).Pt(i).Num <> 0 
 então Escreva i,\n 
 cont := cont + 1 
 fim_se 
 fim_para 
 Se cont > 0 
 então Repita 
 Escreva "Selecione a poltrona:" 
 Leia j 
 até v(lin).Pt(j).Num = 0 
 Escreva "Informe o número da passagem: " 
 Leia v(lin).Pt(j).Num 
 Escreva "Informe o nome do passageiro: " 
 Leia v(lin).Pt(j).Nome 
 Repita 
 Escreva "Informe o sexo do passageiro: " 
 Leia v(lin).Pt(j).Sexo 
 até v(lin).Pt(j).Sexo="F" OU v(lin).Pt(j).Sexo="M" 
 senão Escreva "Ônibus Lotado" 
 fim_se 
 fim_subrotina 
 
 
 função lógico Critério(CR p numérico) 
 Declare ret logico 
 Repita 
 Escreva "Escolha o critério de consulta:",\n 
 Escreva „1 – Consulta Hora/Distancia‟ 
 Escreva „2 – Consulta Lotação‟ 
 Escreva „3 – Consulta Hora Chegada‟ 
 Escreva „4 – Voltar‟ 
 Leia p 
 até p > 0 E p < 5 
 se ret = 4 
 então ret := falso 
 senão ret := verdadeiro 
 fim_se 
 retorna ret 
 fim_função 
 
 sub_rotinha ConsultaHoraDistancia(v() LINHA; tam numerico) 
 Declare lin numerico 
 Repita 
 Escreva "Informe a linha desejada",\n 
 Leia lin 
 até lin > 0 E lin < tam+1 
 Escreva "Horário: ",v(lin).Horario.H, ": ", v(lin).Horario.M,\n 
 Escreva "Distância: ", v(lin).Dist,\n 
 fim_subrotina 
 
 sub_rotinha ConsultaLotacao(v() LINHA; tam numerico) 
 Declare i,j,cont numerico 
 Escreva „Linhas Lotadas‟ 
 Para i de 1 até tam faça 
 cont :=0 
 Para j de 1 até 44 faça 
 Se v(i).Pt(j).Num <> 0 
 então cont := cont + 1 
 fim_se 
 fim_para 
 Se cont > 0 
 então Escreva i 
 fim_se 
 fim_para 
 fim_subrotina 
 
 sub_rotinha ConsultaChegada(v() LINHA; tam numerico) 
 Declare temp,h,m,lin numerico 
 Repita 
 Escreva "Informe a linha desejada" 
 Leia lin 
 até lin > 0 E lin < tam+1 
 temp := Arredonda((v(lin).Dist/65)*60) 
 h := v(lin).Horario.H 
 m := v(lin).Horario.M+temp 
 h := h + quociente(m,60) 
 m := resto(m,60) 
 Escreva "Duração: ", temp, "minutos" 
 Escreva "Horario de chegada",h,":",m 
 fim_subrotina 
 
 
 
 
 
 
 
 sub_rotinha Consulta(v() LINHA; tam numerico) 
 Declare op2 numerico 
 Enquanto Criterio(op2) faça 
 Se op2 = 1 
 então ConsultaHoraDistancia(v,tam) 
 senão se op2 = 2 
 então ConsultaLotacao(v,tam) 
 senão ConsultaChegada(v,tam) 
 fim_se 
 fim_se 
 fim_enquanto 
 fim_subrotina 
 
 
 Cadastrou = 0 
 Enquanto MenuPrincipal(op) faça 
 Se op = 1 E Cadastrou = 0 
 então Cadastrou := 1 
 Cadastra(L,10) 
 senão se op = 2 E Cadastrou = 1 
 então Venda(L, 10) 
 senão Se Cadastrou = 1 
 então Consulta(L,10) 
 fim_se 
 fim_se 
 fim_se 
 fim_enquanto 
fim_algoritmo

Continue navegando