Baixe o app para aproveitar ainda mais
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
Compartilhar