Universidade do Sul de Santa Catarina
Lógica de Programação II
Disciplina na modalidade a distância
LIVRO DIDÁTICO E CADERNO DE ATIVIDADES
Palhoça
UnisulVirtual
2007
logica_2_livro_caderno.indb 1
7/12/2006 14:19:18
Sumário
LIVRO DIDÁTICO
Palavras do professor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
Plano de estudo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
UNIDADE
UNIDADE
UNIDADE
UNIDADE
UNIDADE
1
2
3
4
5
–
–
–
–
–
Manipulação de vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Manipulação de matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Manipulação de registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Tópicos avançados em algoritmos computacionais . . . . .
Programação estruturada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
33
47
71
95
Para concluir o estudo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Referências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Sobre o professor conteudista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Respostas e comentários das atividades de auto-avaliação . . . . . . . . . . . . 127
logica_2_livro_caderno.indb 2
7/12/2006 14:20:49
CADERNO DE ATIVIDADES
Palavras dos professores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
UNIDADE
UNIDADE
UNIDADE
UNIDADE
UNIDADE
1
2
3
4
5
–
–
–
–
–
Manipulação de vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Manipulação de matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Manipulação de registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Tópicos avançados em algoritmos computacionais . . . . 181
Programação estruturada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Respostas e comentários das atividades de auto-avaliação . . . . . . . . . . . . 199
Sobre os professores conteudistas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
logica_2_livro_caderno.indb 3
7/12/2006 14:20:49
logica_2_livro_caderno.indb 4
7/12/2006 14:20:49
Apresentação
Este livro didático corresponde à disciplina de Lógica de Programação II.
O material foi elaborado visando a uma aprendizagem autônoma, abordando
conteúdos especialmente selecionados e adotando uma linguagem que
facilite seu estudo a distância.
Por falar em distância, isso não significa que você estará sozinho. Não
esqueça que sua caminhada nesta disciplina também será acompanhada
constantemente pelo Sistema Tutorial da UnisulVirtual. Entre em contato
sempre que sentir necessidade, seja por correio postal, fax, telefone, e-mail
ou Espaço UnisulVirtual de Aprendizagem. Nossa equipe terá o maior
prazer em atendê-lo, pois sua aprendizagem é nosso principal objetivo
Bom estudo e sucesso!
Equipe UnisulVirtual.
logica_2_livro_caderno.indb 5
7/12/2006 14:20:49
logica_2_livro_caderno.indb 6
7/12/2006 14:20:49
Carlos Fernando Martins
Lógica de Programação II
Livro didático
Design instrucional
Daniela Erani Monteiro Will
Carolina Hoeller da Silva
4ª edição
revista e atualizada
Palhoça
UnisulVirtual
2007
logica_2_livro_caderno.indb 7
7/12/2006 14:20:49
Copyright © UnisulVirtual 2007
N enhum a parte desta publicação pode ser reproduzida por qualquer m eio sem a prévia autorização desta instituição.
005.1
M34 Martins, Carlos Fernando
Lógica de programação II / Carlos Fernando Martins ; design instrucional
Daniela Erani Monteiro Will, Carolina Hoeller da Silva, [Leandro Kingeski
Pacheco] - 4. ed. rev. e atual. - Palhoça : UnisulVirtual, 2007.
216 p. : il. ; 28 cm
Inclui bibliografia
ISBN 978-85-7817-003-5
1. Programação (Computadores). 2. Lógica – Processamento de dados.
I. Will, Daniela Erani Monteiro. II. Silva, Carolina Hoeller da. III. Pacheco,
Leandro Kingeski. IIII. Título.
Ficha catalográfica elaborada pela Biblioteca Universitária da Unisul
Créditos
Unisul- Universidade do Sulde Santa Catarina
UnisulVirtual- Educação Superiora Distância
Cam pusUnisulVirtual
Rua João Pereira dos
Santos,303
Palhoça - SC- 88130-475
Fone/fax:(48)3279-1541 e
3279-1542
E-m ail:
[email protected]
Site:www.virtual.unisul.br
ReitorUnisul
Gerson LuizJoner da
Silveira
Vice-Reitore Pró-Reitor
Acadêm ico
Sebastião Salésio Heerdt
Chefe de gabinete da
Reitoria
Fabian M artins de Castro
Pró-Reitor
Adm inistrativo
M arcus Vinícius Anátoles da
Silva
Ferreira
Cam pusSul
Diretor:Valter Alves
Schm itzNeto
Diretora adjunta:Alexandra
Orseni
Cam pusNorte
Diretor:Ailton Nazareno
Soares
Diretora adjunta:Cibele
Schuelter
Cam pusUnisulVirtual
Diretor:João Vianney
Diretora adjunta:Jucim ara
Roesler
Equipe UnisulVirtual
Adm inistração
Renato AndréLuz
Valm ir Venício Inácio
Bibliotecária
Soraya Arruda W altrick
Coordenação dosCursos
Adriano Sérgio da Cunha
Ana Luisa M ülbert
Ana Paula Reusing Pacheco
Cátia M elissa S.Rodrigues
(Auxiliar)
Charles Cesconetto
Diva Marília Flem m ing
Elisa Flem m ing Luz
Itam ar Pedro Bevilaqua
Janete Elza Felisbino
Jucim ara Roesler
Lilian Cristina Pettres
(Auxiliar)
Lauro JoséBallock
LuizGuilherm e Buchm ann
Figueiredo
LuizOtávio Botelho Lento
M arcelo Cavalcanti
M auri LuizHeerdt
M auro Faccioni Filho
M ichelle Denise Durieux
Lopes Destri
Nélio Herzm ann
Onei Tadeu Dutra
Patrícia Alberton
Patrícia Pozza
Raulino Jacó Brüning
Design Gráfico
Cristiano Neri Gonçalves
Ribeiro
(coordenador)
Adriana Ferreira dos Santos
AlexSandro Xavier
Evandro Guedes M achado
Fernando Roberto Dias
Zim m erm ann
Higor Ghisi Luciano
Pedro Paulo Alves Teixeira
RafaelPessi
Vilson Martins Filho
Equipe DidáticoPedagógica
Angelita MarçalFlores
Carm en M aria Cipriani
Pandini
Carolina Hoeller da Silva
Boeing
Cristina Klipp de Oliveira
Daniela Erani M onteiro W ill
Dênia Falcão de Bittencourt
Elisa Flem m ing Luz
Enzo de Oliveira M oreira
Flávia Lum i Matuzawa
Karla Leonora Dahse Nunes
Leandro Kingeski Pacheco
Ligia Maria Soufen Tum olo
M árcia Loch
Patrícia M eneghel
Silvana Denise Guim arães
Tade-Ane de Am orim
Vanessa de Andrade
M anuel
Vanessa Francine Corrêa
Viviane Bastos
Viviani Poyer
Logística de Encontros
Presenciais
Caroline Batista
(Coordenadora)
Aracelli Araldi
Graciele Marinês
Lindenm ayr
JoséCarlos Teixeira
Letícia Cristina Barbosa
Kênia Alexandra Costa
Herm ann
M arcia Luzde Oliveira
Priscila Santos Alves
Logística de M ateriais
Jeferson Cassiano Alm eida
da Costa
(coordenador)
Eduardo Kraus
M onitoria e Suporte
Rafaelda Cunha Lara
(coordenador)
Adriana Silveira
Caroline M endonça
Edison Rodrigo Valim
Francielle Arruda
Gabriela M alinverni
Barbieri
Gislane Frasson de Souza
Josiane Conceição Leal
M aria Eugênia Ferreira
Celeghin
Sim one Andréa de Castilho
Vinícius M aycotSera.m
Produção Industriale
Suporte
Arthur Em m anuelF.
Silveira
(coordenador)
Francisco Asp
ProjetosCorporativos
Diane DalM ago
Vanderlei Brasil
Secretaria de Ensino a
Distância
Karine Augusta Zanoni
(secretária de ensino)
Djeim e Sam m er Bortolotti
Carla Cristina Sbardella
Grasiela M artins
Jam es M arcelSilva Ribeiro
Lam uniêSouza
Liana Pam plona
M aira M arina M artins
Godinho
M arcelo Pereira
M arcos Alcides M edeiros
Junior
M aria IsabelAragon
Olavo Lajús
Priscilla Geovana Pagani
Silvana Henrique Silva
Secretária Executiva
Viviane Schalata M artins
Tecnologia
Osm ar de Oliveira Braz
Júnior
(coordenador)
Ricardo Alexandre
Bianchini
Rodrigo de Barcelos
M artins
Edição – Livro Didático
ProfessorConteudista
Carlos Fernando M artins
Design Instrucional
Daniela Erani M onteiro W ill
Carolina Hoeller da Silva
Flavia Lum i Matuzawa
(3a edição revista e
atualizada)
Leandro Kingeski Pacheco
(4a edição revista e
atualizada)
Projeto Gráfico e Capa
Equipe UnisulVirtual
Diagram ação
RafaelPessi
Revisão Ortográfica
Revisare
Palavras do professor
Olá caro estudante, pronto para mais uma etapa?
Na verdade, agora você vai aprimorar o que estudou em
Lógica de Programação I. Não imagine que está na metade
do caminho, tendo em vista que o estudo da lógica de
programação é contínuo e eterno, pelo menos para quem quer
ser um programador verdadeiro.
Ainda hoje, mesmo depois de muitos anos trabalhando com
programação, cada algoritmo que implemento é uma forma de
exercitar os conceitos. Trato cada algoritmo como um desafio
a ser vencido. Você deve pensar assim também, que lógica de
programação é um aprendizado contínuo e dinâmico; que cada
problema solucionado por um algoritmo de programação é um
degrau alcançado. Isso pode ajudar e muito nos desafios desta
disciplina.
Lembre-se, um programador diferencia-se do outro pela
quantidade de exercícios que ele faz. Portanto, aproveite
esse material de base para se aprofundar. Consulte algumas
bibliografias que poderão ajudá-lo a resolver outros problemas
de programação. Quanto mais você estudar, melhor vai ficar.
E quanto melhor ficar, mais você vai estudar. É um ciclo
contínuo e desafiador. Planeje o seu tempo de forma que o
estudo de lógica de programação se torne uma diversão. Se
assim for, você já tem o espírito de programador.
Bom estudo!
Professor Carlos Fernando Martins.
logica_2_livro_caderno.indb 9
7/12/2006 14:20:50
logica_2_livro_caderno.indb 10
7/12/2006 14:20:50
Plano de estudo
O plano de estudos visa a orientá-lo/a no desenvolvimento da
Disciplina. Nele, você encontrará elementos que esclarecerão
o contexto da Disciplina e sugerirão formas de organizar o seu
tempo de estudos.
O processo de ensino e aprendizagem na UnisulVirtual leva
em conta instrumentos que se articulam e se complementam.
Assim, a construção de competências se dá sobre a articulação
de metodologias e por meio das diversas formas de ação/
mediação.
São elementos desse processo:
o livro didático;
o Espaço UnisulVirtual de Aprendizagem - EVA;
as atividades de avaliação (complementares, a distância
e presenciais).
Ementa
Continuação da “Lógica de Programação I” com
aprofundamento dos estudos com Fluxogramas e Diagrama de
Blocos. Linguagens de programação, Códigos computacionais
e ambientes de desenvolvimento. Exercícios de Programação
Linear, de Programação Estruturada e de Programação Visual.
Objetivos
logica_2_livro_caderno.indb 11
Desenvolver a capacidade do aluno em pensar
logicamente, sendo assim, capaz de desenvolver
algoritmos computacionais de média e alta
complexidade.
Elaborar algoritmos de programação de média e
alta complexidade.
7/12/2006 14:20:50
Universidade do Sul de Santa Catarina
Carga horária
A carga horária total da disciplina é 60 horas/aula.
Agenda de atividades/ Cronograma
Verifique com atenção o EVA, organize-se para acessar
periodicamente o espaço da Disciplina. O sucesso nos
seus estudos depende da priorização do tempo para a
leitura; da realização de análises e sínteses do conteúdo; e
da interação com os seus colegas e tutor.
Não perca os prazos das atividades. Registre no espaço
a seguir as datas, com base no cronograma da disciplina
disponibilizado no EVA.
Use o quadro para agendar e programar as atividades
relativas ao desenvolvimento da Disciplina.
12
logica_2_livro_caderno.indb 12
7/12/2006 14:20:50
Lógica de Programação II
Atividades
Avaliação a Distância 1
Avaliação Presencial 1
Avaliação Presencial 2 (2ª chamada)
Avaliação Final (caso necessário)
Demais atividades (registro pessoal)
13
logica_2_livro_caderno.indb 13
7/12/2006 14:20:50
logica_2_livro_caderno.indb 14
7/12/2006 14:20:51
UNIDADE 1
Manipulação de vetores
1
Objetivos de aprendizagem
Conhecer os algoritmos de maiores complexidades.
Construir algoritmos com utilização de vetores.
Seções de estudo
Seção 1 Conceito e declaração de vetores.
Seção 2 Operação de vetores.
Seção 3 Algoritmos com manipulação de vetores.
logica_2_livro_caderno.indb 15
7/12/2006 14:20:51
Universidade do Sul de Santa Catarina
Para início de conversa
Antes de iniciar o estudo sobre vetores, você deve recordar o
que é uma variável e para que ela serve, certo? Bem, voltando
à unidade 4 de Lógica de Programação I, temos que variável
é a representação simbólica dos elementos de memória de um
computador. Cada variável corresponde a uma posição de
memória, cujo conteúdo pode se alterado ao longo do tempo
durante a execução de um programa.
Embora uma variável possa assumir diferentes valores, ela só
pode armazenar um valor a cada instante.
Você também estudou que as variáveis podem ser de três tipos:
numéricas, alfanuméricas e lógicas, e que para declarar uma
variável precisamos definir o seu nome e que tipo de dados será
armazenado nela.
Veja a seguir:
início
nome: literal {variável do tipo literal}
idade: numérica {variável do tipo numérica}
fim
Outro exemplo bem fácil, já utilizando o sinal de atribuição.
Veja.
início
nome: literal {variável do tipo literal}
idade: numérica {variável do tipo numérica}
idade 22 {variável idade assume valor 22}
nome “Paulo Pereira” {variável nome assume “Paulo Pereira”}
fim
16
logica_2_livro_caderno.indb 16
7/12/2006 14:20:51
Lógica de Programação II
O algoritmo acima, amplamente discutido em Lógica de
Programação I, serve de base para a seguinte questão: Suponha
que precisamos cadastrar dois nomes de clientes com suas
respectivas idades. Como fazer? Ora, parece bem simples, você
não acha? Basta criar duas novas variáveis, conforme mostro a
seguir:
início
nome1, nome2: literal {variáveis do tipo literal}
idade1, idade2: numérica {variáveis do tipo numérica}
idade1 22 {variável idade1assume valor 22}
nome1 “Paulo Pereira” {variável nome1 assume “Paulo Pereira”}
idade2 38 {variável idade2 assume valor 38}
nome2 “Ana Luiza” {variável nome2 assume “Ana Luiza”}
fim
Mas, e se quisermos criar um cadastro de alunos de um colégio?
E agora? Quantas variáveis precisamos criar? 500, 2500, 10000?
Basta utilizar o conceito de vetores para lidar com situações como
essas.
- Toda a lógica de programação estudada até agora vai se repetir. Não
há nenhum outro comando. Tudo que você aprendeu em Lógica de
Programação I será utilizado agora. Os únicos assuntos novos são o
conceito, a criação e a utilização de vetores.
Unidade 1
logica_2_livro_caderno.indb 17
17
7/12/2006 14:20:51
Universidade do Sul de Santa Catarina
SEÇÃO 1 - Conceito e declaração de vetores
Antes de definir vetor, imaginemos a seguinte situação.
Precisamos criar um programa que armazene as seguintes notas
de um aluno em Lógica de Programação II: 8.0, 10.0, 9.0, 10.0,
8.5, 10.0 e que calcule a média final. A solução é bem simples,
conforme já visto em Lógica de Programação I.
início
nota, conta, media, soma: numérico
soma 0 {inicializa variável soma com o valor 0}
para conta de 1 até 6 passo 1 faça {laço de repetição}
escreva “Entre com a nota: “
leia nota {leitura da nota}
soma soma + nota {soma de todas as notas entradas}
fim-para
media soma/6 {calcula a média final}
escreva “A média final é “, media {mostra o resultado na tela}
fim
Mas agora consta a seguinte complexidade: necessitamos
imprimir também todas as notas do aluno, além da média final.
Uma solução extremamente pobre seria criar seis variáveis para
armazenar as seis notas digitadas e imprimi-las. Mas, se tiver
mais notas (80, por exemplo), seu algoritmo já não resolveria
mais o problema. Para resolver essa situação, utilize o conceito de
vetor.
Um vetor nada mais é do que uma variável que pode
armazenar vários valores do mesmo tipo.
Bem, mas o que significa isso? Inicialmente, acompanhe o
conceito de variáveis e sua definição.
18
logica_2_livro_caderno.indb 18
7/12/2006 14:20:51
Lógica de Programação II
Quando definimos uma variável, alocamos um espaço na
memória do computador para armazenar uma e somente uma
constante por vez, seja ela literal, numérica ou lógica. Quando
atribuímos um valor à variável sobrescrevemos seu conteúdo.
Por exemplo, ao criarmos uma variável numérica chamada nota,
criamos um espaço na memória para armazenar apenas um valor
numérico por vez, conforme a seguir:
nota: numérica
.......
nota 10
{variável armazena valor numérico 10}
escreva “O valor da variável nota é: “, nota {aqui, o valor impresso
será 10}
nota 8
{variável armazena valor numérico 8}
escreva “O valor da variável nota é: “, nota {aqui, o valor impresso
será 8, ou seja, sobrescrevemos o valor 10}
......
Isso parece bem lógico, pois estamos escrevendo na mesma
posição de memória do computador.
Lembre-se que, sempre que criarmos uma variável, estaremos
criando um espaço na memória do computador para armazenar
dados. É um endereço na qual o computador se referencia para
manipular os dados em questão.
Como queremos armazenar vários valores numéricos, precisamos
criar várias posições de memória sob o nome de uma mesma
variável. O que devemos especificar é quantos valores queremos
armazenar, ou seja, quantas posições de memória queremos
alocar para armazenar esses números. Vejamos o exemplo para
armazenar as notas de um aluno conforme o algoritmo anterior.
Queremos armazenar seis valores diferentes em seis posições de
memória diferentes:
8.0
10.0
9.0
10.0
Unidade 1
logica_2_livro_caderno.indb 19
8.5
10.0
19
7/12/2006 14:20:51
Universidade do Sul de Santa Catarina
Devemos criar 6 posições de memórias para armazenar esses
valores. Como solução, podemos criar 6 variáveis ou criar um
vetor com 6 posições de memória.
Esse esquema representa um vetor do tipo numérico de 6
posições, ou seja, 6 endereços de memória consecutivos alocados
no computador que podem armazenar 6 valores numéricos
diferentes.
Cada quadradinho representa uma posição de memória, onde
podem ser armazenados os valores numéricos.
O número de posições que queremos criar é especificado na
declaração.
Em resumo: um vetor é prático quando precisamos manipular
um conjunto de dados do mesmo tipo sem que seja necessário
declarar muitas variáveis. Por exemplo: O registro de 26 livros e
seus respectivos preços; o registro de notas de 13 avaliações de
um aluno etc.
Mas como criar um vetor? É muito simples. Especificamos o
nome do vetor e o número de posições da memória que queremos
alocar. Cada posição de memória pode armazenar um valor
diferente dos demais.
<nome do vetor>: vetor [tamanho do vetor]
<tipo de constante que o vetor poderá conter>
Sintaxe do vetor
Quando um vetor é declarado, ele se apresenta assim na memória:
Valor 1
Valor 2
Valor n
20
logica_2_livro_caderno.indb 20
7/12/2006 14:20:51
Lógica de Programação II
notas: vetor[6] numérico {vetor numérico de 6 posições. Pode
armazenar até 6 valores numéricos diferentes}
estados: vetor[27] literal {vetor de caracteres de 27 posições. Pode
armazenar até 27 caracteres diferentes}
Importante
Assim como na criação das variáveis, para a
criação de vetores não precisamos especificar os
endereços de memória do computador. Isso é feito
automaticamente, sem que sequer saibamos onde
os valores estão armazenados na memória. A única
coisa que sabemos é que é alocado um espaço para
armazenar esses valores e que são armazenados em
endereços de memória seqüenciais. Para acessar
esses endereços, ou os valores armazenados nesses
endereços, é que é um pouco diferente das variáveis.
Veremos isso na seção 2.
Bem, até agora não resolvemos o nosso problema de mostrar
todas as notas do aluno mais a média final, conforme solicitado.
Sabemos que precisaremos criar um vetor conforme explicado,
porém, ainda não sabemos manipular ou realizar operações com
eles. A próxima seção tratará sobre isso.
Importante
Alguns autores preferem utilizar uma sintaxe diferente
para a criação de vetores, conforme a seguir:
<nome do vetor>: vetor[<posição inicial do vetor>.. <posição final
do vetor>] <tipo de constante que o vetor poderá conter>
Unidade 1
logica_2_livro_caderno.indb 21
21
7/12/2006 14:20:51
Universidade do Sul de Santa Catarina
notas: vetor [1..50]: numérico {criamos um vetor que inicia com
índice 1 e vai até 50}.
O mesmo vetor poderia ser criado da seguinte maneira:
notas: vetor [0..49]: numérico {criamos um vetor que inicia com
índice 0 e vai até 49}.
Qual a melhor maneira? Você pode escolher. Porém, em
linguagens de programação de alto nível como C/C++, JAVA
etc., os vetores começam sempre com índice 0. Desde que você
faça a conversão correta entre pseudocódigo e uma linguagem de
programação de alto nível, não há problemas de qual a maneira
que você vai criar seus vetores. O importante é que seja claro e
sem quaisquer ambigüidades.
SEÇÃO 2 - Operação de vetores
Até agora nossa preocupação foi em saber como criar um vetor
e saber quando ele é necessário. Sempre que trabalharmos com
grandes quantidades de dados, estaremos criando um ou mais
vetores. A sintaxe da criação é bastante simples conforme seção
anterior. Mas como iremos trabalhar com um vetor? Por exemplo,
como atribuir valores a um vetor? Como recuperar um valor de
um vetor? Como realizar operações básicas de adição, subtração
etc. de vetores?
Bem, vamos por etapa. Inicialmente vamos inserir valores em
cada parte do vetor. Como já foi dito anteriormente, quando
um vetor é declarado, são reservados espaços na memória para
armazenar as constantes (literal, numérica ou lógica). Porém,
como acessar esses espaços? É muito simples, basta indicar a
posição que você quer acessar.
22
logica_2_livro_caderno.indb 22
7/12/2006 14:20:52
Lógica de Programação II
Veja um exemplo de um vetor de notas:
notas: vetor[6] numérico
Quando o vetor notas é declarado, ele se apresenta assim na
memória:
Cada quadrado, representando uma posição de memória, é uma
posição do vetor declarado. Chamamos essa posição de índice do
vetor. O primeiro quadrado (posição inicial), dizemos que tem índice
0 e o acesso a essa posição se dá através do nome do vetor seguido
do abre colchete ‘[‘, do valor 0, seguido do fecha colchete ‘]’. Para as
posições seguintes, temos os índices 1, 2, 3, .... .
Para atribuirmos um valor à posição inicial do vetor notas,
podemos então fazer: notas[0] 8.0
Para atribuirmos um valor à segunda posição do vetor notas,
podemos fazer:
notas[1] 10.0
Para atribuirmos um valor à terceira posição do vetor notas,
podemos fazer:
notas[2] 9.0. E assim sucessivamente, até preencher todo o
vetor de notas.
Nosso vetor ficaria assim preenchido:
8.0
10.0
9.0
Importante
Perceba que a primeira posição do vetor tem índice
0, a segunda posição tem índice 1, a terceira posição
tem índice 2, e assim sucessivamente. Isso significa
que para um vetor de tamanho N, o último índice
é N-1. Por exemplo, um vetor de notas de tamanho
150, declarado da seguinte forma notas: vetor [150]
numérico tem índices de vão de 0 (posição inicial) até
150-1, ou seja, índice 149. Não existe a posição 150.
150 é o tamanho do vetor que vai de 0 até 149.
Unidade 1
logica_2_livro_caderno.indb 23
23
7/12/2006 14:20:52
Universidade do Sul de Santa Catarina
Todo o processo de manipulação agora se torna bastante
simples, bastando especificar a posição do vetor onde estaremos
armazenando os valores.
Voltando ao nosso exemplo, onde queremos imprimir as notas
do aluno, além da sua média, podemos armazenar os valores
(notas digitadas) em um vetor de notas. Cada nota digitada será
armazenada em uma posição específica. Perceba que temos 6
notas como entrada, o que sugere um vetor de tamanho 6, com
índices variando de 0 até 5.
início
conta, media, soma: numérico
notas: vetor[6] numérico {vetor para armazenar as notas digitadas}
soma 0 {inicializa variável soma com o valor 0}
para conta de 0 até 5 passo 1 faça {laço de repetição}
escreva “Entre com a nota: “
leia notas[ conta ]
{leitura das notas. Perceba que o que aparece
entre colchetes é a variável conta.
Dentro do laço de repetição, a variável conta vai sendo incrementada de 1,
sendo seu valor inicial de 0 e o final de 5, conforme o comando para.
Para o primeiro laço de repetição, a variável conta tem valo 0. Sendo assim,
o comando leia notas[ conta ] está lendo notas na posição 0, ou seja, leia
notas[ 0 ]. Para o segundo laço de repetição, a variável conta tem valo 1.
Sendo assim, o comando leia notas[ conta ] está lendo notas na posição 1,
ou seja, leia notas[ 1 ], e assim sucessivamente até atingir o valor 5, última
posição do vetor. }
soma soma + notas[conta] {soma das notas digitadas}
fim-para
{para imprimir as notas, basta ler o vetor notas da posição 0 até a posição
5. Façamos com o laço de repetição novamente}
para conta de 0 até 5 passo 1 faça {laço de repetição}
escreva “Nota: “, notas[conta]
fim-para
media soma/6
{calcula a média final}
escreva “A média final é “, media {mostra o resultado na tela}
fim
Dica: para trabalhar com vetores, sempre precisamos
especificar o seu tamanho inicial. Sendo assim, a
forma mais usual e fácil para escrita/leitura de valores
para/de vetores pode ser feita através do comando
para/fim-para. Você consegue saber por quê?
24
logica_2_livro_caderno.indb 24
7/12/2006 14:20:52
Lógica de Programação II
Tudo, agora, não passa de operações simples, como se estivéssemos
manipulando variáveis independentes. Por exemplo, vamos criar
um vetor de números pares e um vetor de números ímpares: a
diferença entre eles será armazenada em um terceiro vetor. Vamos
assumir os 50 primeiros valores numéricos, ou seja, de 0 até 49.
início
{declaração das variáveis}
pares: vetor[25] numérico {armazena números pares com 25 posições,
pois se são os 50 primeiros números positivos, temos apenas 25 pares}
impares: vetor[25] numérico {armazena números ímpares}
subtracao: vetor[25] numérico {armazena a diferença entre números
pares e ímpares}
j,i: numérico {variáveis utilizadas para realizar o laço de repetição}
{vamos armazenar os números pares no vetor pares}
j 0 {será o contador do vetor pares e vetor ímpares}
para i de 0 até 49 passo 2 faça
{armazena 0,2,4,6.....48. Perceba que o passo do laço de
repetição é de 2 em 2.
Então o valor da variável i pula de 2 em 2. Mas no vetor pares
precisamos guardar em posições seqüenciais. Vamos criar
uma outra variável para contar os vetores pares (j).}
pares[ j ] i
j j +1
fim-para
{vamos armazenar os números ímpares no vetor ímpares}
j 0 {inicializar novamente, para iniciar o vetor impares de 0.}
para i de 1 até 49 passo 2 faça
impares [ j ] i {armazena 1,3,5,7.....49. Perceba que o passo
do laço de repetição é de 2 em 2, mas a contagem começa
com 1. O contador j irá guardar o valor de i na posição correta
em seqüência.}
jj+1
fim-para
{vamos realizar as subtrações de cada posição dos vetores pares e
ímpares e armazenar o resultado no vetor subtracao. A estrutura
repetição para-faça inicia em 0 e vai até 25, pois cada vetor tem apenas
25 elementos (25 pares e 25 ímpares) dentre os 50 primeiros números
0-49}
para i de 0 até 24 passo 1 faça
subtracao[ i ] = pares[ i ] – impares[ i ]
fim-para
{como resultado de saída, vamos imprimir os vetores}
para i de 0 até 24 passo 1 faça
escreva “Números Pares: “, pares[ i ]
escreva “Números Ímpares “, impares[ i ]
escreva “Diferença Pares - Ímpares: “, subtracao[ i ]
fim-para
fim
Unidade 1
logica_2_livro_caderno.indb 25
25
7/12/2006 14:20:52
Universidade do Sul de Santa Catarina
Bem, agora você já sabe criar vetores, inserir e recuperar valores
de vetores. Na próxima seção, vai estudar alguns algoritmos de
programação utilizando vetores.
SEÇÃO 3 - Algoritmos com manipulação de Vetores
Conforme falamos na disciplina de Lógica de Programação
I, a melhor maneira de aprender a programar é programando.
Continua valendo a idéia: A melhor maneira de aprender a
utilizar vetores é construindo algoritmos com vetores. Nesta
seção, mostraremos algumas aplicações que manuseiam vetores.
Para esses exemplos, vamos definir as variáveis com nomes
maiúsculos apenas por questões de estética. Vale lembrar que, de
acordo com a seção 4 de Lógica de Programação I, por padrão,
as variáveis são todas com letras minúsculas, mas isso para as
linguagens de programação de alto nível como C/C++, JAVA,
Visual etc. Para o pseudocódigo, podemos representar por letras
maiúsculas, sem perda de padronização.
1. Ler um vetor de 50 números e montar outro vetor com os
valores do primeiro multiplicados por 3.
Pseudocódigo:
início
VET1,VET2 : vetor [50] numérico
CONTADOR : numérico
para CONTADOR de 0 até 49 faça
leia “Digite um número: “,VET1[CONTADOR]
VET2[CONTADOR] VET1[CONTADOR] * 3
fim-para
fim
26
logica_2_livro_caderno.indb 26
7/12/2006 14:20:52
Lógica de Programação II
2. Um armazém contém 400 produtos e para cada tipo de
produto existe um código. Faça um algoritmo para ler o
código do produto e a quantidade em estoque. Depois, monte
dois vetores para armazenar respectivamente os códigos das
mercadorias e a quantidade dos produtos.
Pseudocódigo:
início
{declaração das variáveis}
CODIGOPRODUTO : vetor [400] literal
QUANTIDADE : vetor [400] numérico
CONTADOR : numérico
para CONTADOR de 0 até 399 faça
{leitura de 400 códigos de produtos e a quantidade em estoque
de cada um}
escreva “Digite o código do produto: “
leia CODIGOPRODUTO[CONTADOR]
escreva “Digite a quantidade do produto em estoque: “
leia QUANTIDADE[CONTADOR]
fim-para
fim
3. Ler um vetor contendo 100 números, que correspondem
a matrículas de alunos. Ler cinco números e imprimir uma
mensagem informando se eles estão ou não presentes no vetor.
Pseudocódigo:
início
{declaração de variáveis}
ALUNOS : vetor[100] numérico {lembre que o tamanho do vetor é
100, mas ele vai de 0 até 99}
POS, PESQUISADO, CONT :numérico
{laço de repetição para preencher o vetor ALUNOS}
para POS de 0 até 99 faça
escreva “Digite o código de matrícula de um aluno: “
leia ALUNOS[POS]
fim-para
Unidade 1
logica_2_livro_caderno.indb 27
27
7/12/2006 14:20:53
Universidade do Sul de Santa Catarina
{5 entradas de dados para verificar se alunos estão cadastrados ou
não}
para CONT de 1 até 5 faça
escreva “Digite o número de matrícula a ser pesquisado: “
leia PESQUISADO
POS -1 {inicialmente é atribuído o valor –1 para a variável
POS porque na seqüência, no comando repita, a variável POS será
incrementada de 1 (POS POS + 1). Como queremos começar a
ler o vetor ALUNOS a partir da posição 0, no primeiro laço, a variável
POS assume valor 0}
repita
POS POS+1
{repete o laço até que o número sendo pesquisado (valor
armazenado na variável PESQUISADO) seja igual ao número
armazenado no vetor ALUNOS em uma determinada posição POS,
ou que a variável POS seja maior que o tamanho do vetor ALUNOS,
nesse caso, seja maior que 100}
até que PESQUISADO = ALUNOS[POS] OU POS > 99
se POS > 99 então
{se a variável POS possui um valor superior a 99, ou seja, 100,
isso significa que todo o vetor ALUNOS foi lido desde o índice 0 até
99 (100 alunos), mas que não há nenhum número armazenado
nesse vetor é igual ao valor armazenado na variável PESQUISADO}
escreva “Número não cadastrado !”
senão
escreva “Número localizado na posição “, POS , “ do vetor.”
fim-se
fim-para
fim
4. Criar um algoritmo que leia o preço de compra e o preço de
venda de 100 mercadorias. O algoritmo deverá imprimir quantas
mercadorias proporcionam:
Lucro menor do que 10%
Lucro maior ou igual 10% e menor ou igual a 20%
Lucro superior a 20%
Pseudocódigo:
28
logica_2_livro_caderno.indb 28
7/12/2006 14:20:53
Lógica de Programação II
início
{declaração de variáveis}
PRECOCOMPRA: vetor [100] numérico {armazena os preços de compra das mercadorias}
PRECOVENDA: vetor [100] numérico {armazena os preços de venda das mercadorias}
LUCRO, TOTLUCROMENOR10, TOTLUCROMENOR20, TOTLUCROMAIOR20: numérico
{variáveis utilizadas para armazenar o lucro, o lucro menor que 10%, menor do que
20% e maior do que 20%, respectivamente}
i : numérico {variável utilizada como contadora para laços de repetição}
{precisamos inicializar as variáveis contadoras de lucros}
TOTLUCROMENOR10 0
TOTLUCROMENOR20 0
TOTLUCROMAIOR20 0
{entrada de dados}
para I de 0 até 99 passo 1 faça
{vamos especificar o preço de venda e de compra de todas as 100 mercadorias}
escreva “Entre com o preço de compra da mercadoria: “
leia PRECOCOMPRA[ i ]
escreva “Entre com o preço de venda da mercadoria: “
leia PRECOVENDA[ i ]
fim-para
{Processamento do algoritmo. Vamos verificar o lucro de cada mercadoria (preço
de venda – preço de compra) e verificar as condições de lucro (10%, 20% ou maior
do que 20%. Para isso, vamos ter que ler os vetores PRECOVENDA e PRECOCOMPRA
novamente}
para i de 0 até 99 passo 1 faça
LUCRO (PRECOVENDA[ i ] – PRECOCOMPRA[ i ]) * 100 / PRECOCOMPRA[ i ]
{se a diferença entre preço de venda e preço de compra, ou seja, o lucro for menor do
que 10, então incrementa a variável contadora de mercadorias com lucros inferior a
10%}
se LUCRO < 10.0 então
TOTLUCROMENOR10 TOTLUCROMENOR10 + 1
senão
{se o lucro não é inferior a 10%, então ele só pode ser superior a 10%. Mas quanto?
Precisamos saber se o lucro é menor a 20% ou superior a esse valor. Por isso colocamos
outra condição dentro do comando senão. Essa condição verifica se o lucro é inferior ou
superior a 20%.}
Unidade 1
logica_2_livro_caderno.indb 29
29
7/12/2006 14:20:53
Universidade do Sul de Santa Catarina
se LUCRO < 20.0 então
TOTLUCROMENOR20 TOTLUCROMENOR20 + 1
senão
TOTLUCROMAIOR20 TOTLUCROMAIOR20 + 1
fim-se {fim da condição que testa se lucro é menor do que 20.0}
fim-se
{fim da condição que testa se lucro é menor do que 10.0}
fim-para
{saída do algoritmo}
escreva “Número de mercadorias com lucro inferior a 10%: “,
TOTLUCROMENOR10
escreva “Número de mercadorias com lucro maior ou igual a 10% e menor
do que 20%: “, TOTLUCROMENOR20
escreva “Número de mercadorias com lucro superior a 20%: “,
TOTLUCROMAIOR20
fim
Síntese
Finalizamos mais uma etapa. Mais um passo da nossa
caminhada. Nessa unidade, vimos que um vetor é uma
variável que pode armazenar várias constantes do mesmo tipo
(homogêneas). Isso permite manipular uma grande quantidade
de dados sem a necessidade de declarar várias variáveis. Para
declarar um vetor em pseudocódigo, utilizamos o seguinte
comando:
<nome do vetor>: vetor [tamanho do vetor] <tipo de constante
que o vetor poderá conter>
Quando um vetor é declarado, ele se apresenta assim na memória:
Valor 1
Valor 2
Valor n
30
logica_2_livro_caderno.indb 30
7/12/2006 14:20:53
Lógica de Programação II
Cada posição (representado por um quadrado no desenho
acima) é uma posição de memória do computador. Para inserir
ou ler valores de um vetor basta especificar seu nome e o índice
(posição) que queremos acessar dentro do vetor. Por exemplo:
notas [10] 8.5. Sabendo que o índice dos vetores começa com
o valor numérico 0. Quando colocamos notas [10] estamos nos
referindo ao índice 10, mas a posição no vetor (representado por
um quadrado) é o 9. Poderíamos representar as posições de um
vetor de tamanho 5 conforme apresentado abaixo:
Valor 1
Valor 2
[0]
[1]
Valor n
[2]
[3]
[4]
Podemos perceber que o índice [3] está no quarto quadrado.
Tudo isso porque um vetor tem seu início no índice 0, conforme
já dito.
Bem, um vetor é unidimensional, ou seja, apresenta apenas uma
dimensão ou 1 linha. Poderíamos estar trabalhando com vetores
bidimensionais ou vetores que possuem várias colunas e várias
linhas. A esses vetores damos o nome de matrizes. No próximo
capítulo, estaremos estudando algoritmos que utilizam os
conceitos de matrizes.
Até lá!
Unidade 1
logica_2_livro_caderno.indb 31
31
7/12/2006 14:20:53
Universidade do Sul de Santa Catarina
Atividades de auto-avaliação
1. Crie um vetor para armazenar 25 valores de temperaturas.
2. Crie um vetor para armazenar 150 alunos de um colégio infantil.
3. Um site na web precisa registrar 2500 produtos cadastrados de um
fornecedor. Crie um vetor para representar esses produtos.
4. Criar um algoritmo que realize as reservas de passagem aéreas de uma
companhia. Além da leitura do número de vôos e da quantidade de
lugares disponíveis, leia vários pedidos de reserva, constituídos do
número da carteira de identidade e do número do vôo desejado. Para
cada cliente, verificar se há possibilidade no vôo desejado. Em caso
afirmativo, imprimir o número de identidade do cliente e o número
do vôo, atualizando o número de lugares disponíveis. Caso contrário,
avisar ao cliente a inexistência de lugares.
Saiba mais
Consulte o site http://www.unidev.com.br/artigos. Há uma
série de algoritmos já feitos. É um bom exercício fazer os
exemplos e comparar com o que está feito. Também, neste site,
constam dicas importantes de lógica de programação.
Dicas de programação nunca são demais, não se esqueça disso!
32
logica_2_livro_caderno.indb 32
7/12/2006 14:20:53
UNIDADE 2
Manipulação de matrizes
2
Objetivos de aprendizagem
Entender o conceito de matrizes.
Conhecer e praticar montagens de matrizes.
Construir algoritmos com utilização de matrizes.
Seções de estudo
Seção 1 Conceito e declaração de matrizes.
Seção 2 Operação de matrizes.
Seção 3 Algoritmos com manipulação de matrizes.
logica_2_livro_caderno.indb 33
7/12/2006 14:20:53
Universidade do Sul de Santa Catarina
Para início de conversa
Trabalhamos na unidade anterior apenas com vetores
unidimensionais, ou seja, variáveis que podem conter diferentes
valores de um mesmo tipo em diversas colunas. Na verdade, o
conceito de vetor pode ser representado por uma tabela com 1
linha e várias colunas, onde o tamanho do vetor especifica o
número de colunas, conforme você pode ver a seguir:
Linha 0
Valor 1
Valor 2
Valor 3
Coluna 0
Coluna 1
Coluna 2
...
Valor n
Coluna n-1
Perceba na figura anterior que temos uma linha, denominada
linha 0, e várias colunas, denominadas de colunas 0, coluna 1 e
assim sucessivamente. Como vimos na unidade anterior, cada
valor de um vetor é armazenado em uma posição de memória,
ou seja, em um dos quadrados representados na figura anterior.
Já sabemos também que não precisamos saber o endereço de
memória do computador para acessar os elementos do vetor,
bastando especificar o índice que queremos acessar.
Por exemplo, para um vetor chamado de NOTAS de
tamanho 5, podemos acessar os índices de 0 até 4 (lembrese de que um vetor sempre começa com índice 0). Para
acessar qualquer posição do vetor, basta especificar o índice
de interesse: NOTAS [2] 7.5. Se observarmos o índice que
estamos acessando, no exemplo em questão, o índice 2 do
vetor NOTAS, podemos representá-lo conforme a figura
anterior:
Linha 0
7.5
Coluna 0
Coluna 1
Coluna 2
Coluna n-1
Observando a figura, podemos constatar que o índice 2 está na
linha 0 e coluna 2. Isso mesmo, você já deve ter percebido que
um vetor nada mais é do que uma tabela de 1 (uma) linha, na
qual chamamos de linha 0 e várias colunas, onde é armazenado
34
logica_2_livro_caderno.indb 34
7/12/2006 14:20:54
Lógica de Programação II
cada um dos valores, seja ele numérico, alfanumérico ou lógico, e
que o índice que especificamos para acessar o vetor é exatamente
o número da coluna desse vetor.
Outro exemplo, NOTAS [4] 10.0. Podemos dizer que
estamos inserindo no vetor NOTAS o valor 10.0 no índice 4,
ou seja, na linha 0 e coluna 4 do vetor.
Mas agora vem a questão: e, se quisermos trabalhar com um
vetor que possua várias linhas e várias colunas conforme a figura
a seguir?
Temos agora várias linhas e colunas. Damos o nome para essas
estruturas de matrizes.
- Nesta unidade você vai conhecer o que são matrizes e saber o porquê
de sua importância no mundo da programação.
Unidade 2
logica_2_livro_caderno.indb 35
35
7/12/2006 14:20:54
Universidade do Sul de Santa Catarina
SEÇÃO 1 - Conceito e declaração de matrizes
Uma matriz nada mais é do que um vetor de 2
dimensões (linhas e colunas) capaz de armazenar
variáveis do mesmo tipo (numérica, literal ou lógica).
Pode ser representada por uma tabela, conforme você pode ver a
seguir:
Cada quadrado representa uma posição de memória onde podem
ser armazenadas as variáveis, de maneira idêntica aos vetores.
Porém, os vetores são unidimensionais (apenas colunas) e as
matrizes são bidimensionais (2 dimensões: linhas e colunas).
Agora teremos não somente a linha 0, mas também a linha 1, a
linha 2 e assim sucessivamente.
O número de posições que queremos criar é especificado na
declaração, de forma similar a dos vetores.
Mas qual a utilidade de uma matriz? Uma matriz é prática
quando precisamos manipular um conjunto de dados do
mesmo tipo, sem que seja necessário declarar muitas variáveis e
precisamos fazer relações de 2 variáveis.
Queremos registrar 4 temperaturas de três dias da semana
(segunda-feira, terça-feira e quarta-feira). Nesse caso,
temos duas variáveis: temperatura e dias da semana. A
melhor maneira de representar isso é através de uma tabela,
mostrando nas linhas os dias da semana e, nas colunas, as
temperaturas medidas.
36
logica_2_livro_caderno.indb 36
7/12/2006 14:20:54
Lógica de Programação II
Veja a tabela a seguir:
Dias da semana
Temperatura 1 Temperatura 2 Temperatura 3 Temperatura 4
Segunda
27
29
30
24
Terça
25
27
28
22
Quarta
21
23
25
20
Se olharmos para a tabela anterior, podemos saber, por exemplo,
que na terça-feira, a 4ª temperatura medida foi 22ºC e que na
quarta-feira a 2ª temperatura medida foi de 23ºC. Estamos
fazendo uma correspondência entre a variável Temperatura
e o Dia. Nesse caso, para determinar a temperatura em
uma determinada hora de um dia. Para representar essa
correspondência é que utilizamos o conceito de matrizes. Agora
termos uma estrutura de linhas e colunas e não apenas de colunas
como eram os vetores.
Mas como criar uma matriz? É muito simples. Especificamos
o nome da matriz seguido do número de linhas e colunas que a
matriz conterá, além do tipo de variável que será armazenada.
A exemplo de vetores, as matrizes só podem
armazenar dados do mesmo tipo. Por exemplo:
somente dados numéricos ou somente dados literais
ou somente dados lógicos. Não podemos ter em uma
matriz dados numéricos e literais ao mesmo tempo.
Sintaxe da matriz
<nome da matriz>: matriz [número de linhas][número de
colunas] <tipo de constante que o vetor poderá conter>
notas_de_alunos: matriz[6][4] numérico {matriz que possui 6 linhas
– numeradas de 0 até 5 e 4 colunas, numeradas de 0 até 3. Dizemos
que a matriz tem dimensão de 6x4. No total, são 6x4 = 24 posições
para armazenar valores numéricos}
matriz_de_alunos: matriz[10][30] literal {matriz que possui 10
linhas – numeradas de 0 até 9 e 30 colunas, numeradas de 0 até 29.
Dizemos que a matriz tem dimensão de 10x30. No total, são 10x30
= 300 posições para armazenar valores literais}
Unidade 2
logica_2_livro_caderno.indb 37
37
7/12/2006 14:20:54
Universidade do Sul de Santa Catarina
Assim como na criação de vetores, para a criação de matrizes não
precisamos especificar os endereços de memória do computador.
Isso é feito automaticamente, sem que sequer saibamos onde
os valores estão armazenados na memória. A única coisa que
sabemos é que é alocado um espaço para armazenar esses valores
e que são armazenados em endereços de memória seqüenciais.
Para acessar esses endereços ou os valores armazenados nesses
endereços é que é um pouco diferente dos vetores. Veremos isso
na seção 2.
- Na próxima seção você vai estudar como manipular matrizes, ou
seja, como inserir e ler valores a partir de matrizes.
SEÇÃO 2 - Operação de matrizes
Até agora nossa preocupação foi em saber como criar uma matriz
e saber quando ela é necessária. Sempre que trabalharmos com
grandes quantidades de dados e precisamos relacionas duas ou
mais variáveis, estaremos criando uma ou mais matrizes. A
sintaxe da criação é bastante simples conforme seção anterior.
Mas como iremos trabalhar com uma matriz? Por
exemplo, como atribuir valores a uma matriz? Como
recuperar um valor de uma matriz?
Para a nossa alegria, tudo é realizado de forma similar a
dos vetores, somente com uma atenção especial: precisamos
especificar qual a linha que estamos acessando, além da coluna
como é feito com os vetores.
Assim, para acessar as posições de uma matriz, basta indicar a
linha e a coluna desejadas.
38
logica_2_livro_caderno.indb 38
7/12/2006 14:20:54
Lógica de Programação II
Exemplo: NOTAS.
NOTAS: matriz [6][4] numérico
1. A Matriz NOTAS é uma matriz de dimensão 6x4,
ou seja, 6 linhas por 4 colunas.
2. Para armazenar uma constante numérica na matriz NOTAS,
precisamos identificar a linha e coluna que queremos acessar. Isso é
feito da seguinte forma: nome da matriz [índice da linha][índice da
coluna], lembrando que os índices começam sempre com o valor 0.
Por exemplo, a 3ª (terceira) linha da matriz tem índice 2, isso por que
a 1ª (primeira) linha tem o índice 0, a 2ª (segunda) linha tem índice 1
e a 3ª (terceira) o índice 2.
3. Para armazenar a constante numérica 10 na 3ª (terceira) linha
(linha 2) da 2ª (segunda) coluna (coluna 1), utilizamos os índices
da matriz NOTAS, nesse caso, o índice 2 para linha e o índice 1 para
coluna. Assim, NOTAS [2][1] 10.0. Veja com fica a matriz.
10.0
Todo o processo de manipulação agora se torna simples, bastando
especificar a posição onde estaremos armazenando os valores,
ou seja, basta especificar o nome da matriz e, a seguir, entre
colchetes, o índice que representa a linha e, depois, também entre
colchetes, o índice que representa a coluna.
Unidade 2
logica_2_livro_caderno.indb 39
39
7/12/2006 14:20:54
Universidade do Sul de Santa Catarina
Dica: para trabalhar com matrizes, sempre precisamos
especificar a sua dimensão, ou seja, o número de linha
pelo número de colunas. Sendo assim, a forma mais
usual e fácil para escrita/leitura de valores para/de
matrizes pode ser feita através do comando para/fimpara. Você consegue saber o porquê?
1. Montar uma matriz nas dimensões 4x5 e imprimir a soma
das linhas e colunas.
Pseudocódigo:
início
MAT : matriz [4][5] numérico {matriz de dimensão 4x5. 4 linhas e 5
colunas}
SOMALINHA, SOMACOLUNA, LINHA, COLUNA : numérico
{Aqui um fato importante. Para percorrer um vetor desde o seu
início até o seu final, utilizamos o comando para/faça/fim-para. Agora
temos que percorrer toda a matriz, ou seja, todas as linhas e colunas. O
processo é bem simples. Para percorrer todas as colunas de uma linha
de uma matriz continuamos utilizando o comando para/faça/fimpara. Assim que todas as colunas de uma linha são lidas ou acessadas,
passa-se para a próxima linha. Novamente, para essa nova linha, todas
as colunas são acessadas, e assim sucessivamente. Podemos perceber
que para cada incremento da linha devemos ler ou acessar todas as
colunas daquela linha. Isso sugere dois laços de repetição: 1 para
pular as linhas e outro para pular as colunas. Dessa forma, elaboramos 2 laços de repetição, um para linha com a variável LINHA sendo
incrementada de 0 até 3 (4 linhas no total), e um laço para coluna com
a variável COLUNA sendo incrementada de 0 até 4 (5 colunas no total).
Para cada repetição do laço dentro da linha executamos 5 repetições
para as colunas, percorrendo assim toda a matriz}
para LINHA de 0 até 3 passo 1 faça
para COLUNA de 0 até 4 passo 1 faça
escreva “Digite um número: “
leia MAT[LINHA][COLUNA]
fim-para
fim-para
{Processamento do Algoritmo. Soma das linhas. A explicação
desta parte está após o fim-para do primeiro laço de repetição}
40
logica_2_livro_caderno.indb 40
7/12/2006 14:20:55
Lógica de Programação II
para LINHA de 0 até 3 passo 1 faça
SOMALINHA 0
para COLUNA de 0 até 4 passo 1 faça
SOMALINHA SOMALINHA + MAT[LINHA][COLUNA]
fim-para
escreva “Total da linha”, LINHA,”:”, SOMALINHA
fim-para
{Explicando a lógica anterior: Nossa matriz possui 4 linhas e 5
colunas. Sendo assim, vamos percorrer as linhas de 0 a 3 e as colunas
de 0 a 4 (São os índices da matriz. Para o primeiro laço de repetição
para LINHA de 0 até 3 passo 1 faça, a variável LINHA é incrementada de
0 até 3. Inicialmente ela tem valor numérico 0. O primeiro comando
dentro do laço é inicializar a variável SOMALINHA igual a 0. A variável
SOMALINHA armazenará a soma de todas os valores numéricos de
cada linha. Sabendo que estamos na linha 0, devemos percorrer cada
coluna dessa linha. Isso é feito pelo laço de repetição seguinte para
COLUNA de 0 até 4 passo 1 faça. Quando o programa entra nesse
segundo laço, a variável COLUNA é incrementada com passo 1, de 0 até
4, executando os comandos que estão dentro da estrutura para/faça/
fim-para, no nosso caso, apenas o comando SOMALINHA SOMALINHA + MAT[LINHA][COLUNA]. Quando o segundo laço de repetição é
finalizado, o programa executa os comandos seguintes ao fim-para, ou
seja, executa o comando de impressão na tela escreva “Total da linha”,
LINHA,”:”, SOMALINHA. Ao encontrar o fim-para do primeiro laço de
repetição, o programa incrementa a variável LINHA de 1 no comando
para LINHA de 0 até 3 passo 1 faça passando o valor da variável LINHA
para o valor 1, e executa todos os comandos dentro da estrutura
para/faça/fim-para novamente. Como SOMALINHA armazena o valor
numérico da soma dos valores da linha anterior, a variável é reinicializada com valor 0. Um ótimo exercício é montar uma matriz e executar
o algoritmo passo a passo. Essa é uma atividade para você fazer logo a
seguir.}
{Processamento do Algoritmo. Soma das colunas}
para COLUNA de 0 até 4 passo 1 faça
SOMACOLUNA 0
para LINHA de 0 até 3 passo 1 faça
SOMACOLUNA SOMACOLUNA + MAT[LINHA][COLUNA]
fim-para
escreva “Total da coluna”, COLUNA,”:”, SOMACOLUNA
fim-para
fim
Unidade 2
logica_2_livro_caderno.indb 41
41
7/12/2006 14:20:55
Universidade do Sul de Santa Catarina
SEÇÃO 3 - Algoritmos com manipulação de matrizes
Você já deve ter observado que não criamos qualquer lógica
para manipular tanto os vetores quanto as matrizes. Usamos os
mesmos comandos que aprendemos em Lógica de Programação
I, ou seja, comandos como leia, escreva, para/faça/fim-para,
entre outros que poderíamos estar utilizando também. É uma
oportunidade ímpar para você incrementar os conceitos e revisar
toda a lógica de programação. Nesta seção, apresento mais
alguns exercícios resolvidos, porém, com uma atividade: que você
construa as matrizes em um caderno e execute o algoritmo passo
a passo. Comporte-se como o processador do computador. Tente
e experimente. É um exercício e tanto para aprender cada vez
mais.
1. Monte uma matriz para quando o usuário informar um
número correspondente a um mês, o algoritmo imprima
o nome do mês indicado em português, a abreviatura e o
nome do mês em inglês. Por exemplo, o usuário digita o
número 4 e o algoritmo é ativado para imprimir: 4Abril, Abr,
April.
Pseudocódigo:
início
MESES : matriz [12][3] literal
LINHA, NUM : numérico
para LINHA de 1 até 12 passo 1 faça
escreva “Digite o nome do “,LINHA,”º mês:”
leia MESES[LINHA][1]
escreva “Digite a abreviação do mês de “,MESES[LINHA][1],”:”
leia MESES[LINHA][2]
escreva “Digite o nome em inglês do mês “,MESES[LINHA][1],”:”
leia MESES[LINHA][3]
fim-para
leia “Digite o número do mês a ser consultado: “,NUM
escreva NUM,” “, MESES[NUM][1], “,”, MESES[NUM][2], “, “, MESES[NUM][3]
fim
42
logica_2_livro_caderno.indb 42
7/12/2006 14:20:55
Lógica de Programação II
2. Uma floricultura conhecedora de sua clientela gostaria de
fazer um algoritmo que pudesse controlar via Web sempre
um estoque mínimo de determinadas plantas, pois todo
o dia, pela manhã, o dono faz novas aquisições. Criar um
algoritmo que deixe cadastrar 50 tipos de plantas e nunca
deixa o estoque ficar abaixo do ideal. O algoritmo será
utilizado para construir um programa na página da empresa.
Pseudocódigo:
início
{vamos montar uma matriz de 50 linhas e 3 colunas. As 50 linhas
servem para cadastrar todos os produtos e as três colunas servem
para especificar a quantidade de produtos em estoque, a quantidade
desejada e o resultado da diferença entre a quantidade em estoque e a
quantidade desejada respectivamente.}
PRODUTOS: matriz [50][3] : numérico
NOME: vetor [50] literal
I: numérico
para I de 0 até 49 passo 1 faça
escreva “Entre com o nome do produto: “
leia NOME [i]
escreva “Entre com a quantidade em estoque: “
leia PRODUTOS[ I ][ 0 ]
escreva “Entre com a quantidade desejada: “
leia PRODUTOS[ I ][ 1 ]
se PRODUTOS[ I ][ 0 ] < PRODUTOS[ I ][ 1 ] então
[PRODUTOS [ I ][ 2 ] PRODUTOS[ I ][ 1 ]
- PRODUTOS[ I ][ 0 ]
senão
[PRODUTOS [ I ][ 2 ] 0
fim-se
fim-para
{dados de saída do algoritmo}
escreva “Total de Compras: ”
para I de 0 até 49 passo 1 faça
escreva “Produto: “, NOME [i], “ Qtde = “, PRODUTOS[ I ] [ 2 ]
fim-para
fim
Unidade 2
logica_2_livro_caderno.indb 43
43
7/12/2006 14:20:55
Universidade do Sul de Santa Catarina
Síntese
Nesta unidade, você viu que para relacionar duas ou mais
variáveis precisamos manipular matrizes. Diferentemente de
vetores, que são unidimensionais, as matrizes são bidimensionais,
possuindo linhas e colunas. Podemos ter matrizes com mais
dimensões, mas nesta unidade trabalhamos apenas com 2.
Similarmente aos vetores, as matrizes só podem armazenar
dados do mesmo tipo, ou seja, quando definimos uma matriz,
especificamos que tipo de variável a mesma vai armazenar
(numérico, literal ou lógico). A sintaxe em pseudocódigo para
definir uma matriz é a seguinte:
<nome da matriz>: matriz [número de linhas][número de colunas] <tipo de
constante que o vetor poderá conter>
Quando criamos uma matriz, o computador reserva um espaço
na memória para armazenar Linhas x Colunas valores. É o
que chamamos de dimensão da matriz. Para acessar qualquer
elemento da matriz, basta especificar o índice da linha e coluna,
lembrando sempre que os índices começam com o valor numérico
0. Por exemplo, uma matriz NOTAS de dimensão 5x 6 começa
em [0][0] e termina em [4][5]. Podemos acessar qualquer posição
da matriz desde que esteja dentro das dimensões especificadas:
NOTAS[3][2] 8.5. Estamos acessando a quarta linha e a
terceira coluna da matriz.
Por fim, viu que para percorrer uma matriz de ponta a ponta,
precisamos de dois laços de repetição, um sendo utilizado para
percorrer as colunas de cada linha e o outro para percorrer as
linhas da matriz.
Na próxima unidade, vamos trabalhar com aspectos mais
sofisticados da linguagem de programação: as estruturas. Elas
são a base para algoritmos avançados e também para a linguagem
orientada a objetos, linguagem essa que você, programador web,
deve dominar.
Bom trabalho e até a próxima etapa desse mundo fabuloso que é
o estudo da lógica de programação.
44
logica_2_livro_caderno.indb 44
7/12/2006 14:20:55
Lógica de Programação II
Atividades de auto-avaliação
1. A distância em quilômetros entre algumas capitais é mostrada no
quadro a seguir. Suponha que você tenha sido contratado por uma
empresa, que vende mapas, para montar um programa (algoritmo) que
leia as capitais e suas respectivas distâncias e também deverá imprimir
a distância entre duas capitais solicitadas por um usuário. Esse será um
programa que poderá ser acessado via Web.
Tabela mostrando as distâncias entre as capitais:
1
2
1
0
23
2
23
0
2
45
10
27
110
50
66
Unidade 2
logica_2_livro_caderno.indb 45
27
72
0
45
7/12/2006 14:20:56
Universidade do Sul de Santa Catarina
Saiba mais
Consulte o livro “Construindo algoritmos computacionais: lógica
de programação” de Alfredo Boente.
Para quem deseja participar de um outro grupo de discussão,
basta acessar o site: http://www.aprendaprogramacao.hpg.
ig.com.br/grupo.html.
46
logica_2_livro_caderno.indb 46
7/12/2006 14:20:56
UNIDADE 3
Manipulação de registros
3
Objetivos de aprendizagem
Entender o conceito de registro ou estrutura.
Conhecer e praticar montagens de registros.
Criar novos tipos de variáveis.
Seções de estudo
Seção 1 Conceito e declaração de registros.
Seção 2 Operação com registros.
Seção 3 Algoritmos com manipulação de registros.
logica_2_livro_caderno.indb 47
7/12/2006 14:20:56
Universidade do Sul de Santa Catarina
Para início de conversa
Quantas vezes você já preencheu fichas de cadastros, seja em
hotéis, em videolocadoras, para propostas de consórcios ou
ainda fichas de matrícula escolar? Nessas fichas, certamente
você precisou entrar com dados como: seu nome, sua idade, seu
telefone de contato, endereço etc.
Nesses casos, estamos trabalhando com dados de diferentes tipos.
Por exemplo: nome é uma variável literal, idade é uma
variável numérica, informação se possui ou não veículo
pode ser um valor lógico.
Percebeu que estamos entrando em um mundo onde as coisas
não são tão homogêneas assim, ou seja, nem tudo que estamos
trabalhando são apenas variáveis numéricas ou literais ou ainda
lógicos? Há uma mistura de tipos de dados que devemos
trabalhar.
Mas, o que tem haver isso com lógica de programação? Não
poderíamos criar variáveis independentes, ou seja, cada
informação armazenada em um local diferente como temos
feito até agora? Poderíamos criar, por exemplo, as variáveis em
pseudocódigo representando nossa ficha cadastral. Acompanhe a
seguir.
início
{Declaração de variáveis}
NOME, ESTADOCIVIL, ENDERECO, BAIRRO: literal
IDADE, DATANASC, NUMERO, CEP, FONE: numérico
.....
fim
48
logica_2_livro_caderno.indb 48
7/12/2006 14:20:56
Lógica de Programação II
Se fôssemos preencher apenas uma ficha cadastral, isso resolveria
nossos problemas. Mas vamos supor que queremos cadastrar 50
hóspedes de um hotel. Certamente, tendo visto e estudado as
unidades sobre vetores e matrizes, você responderia que a solução
continua simples. Basta fazer, de todas as variáveis criadas
anteriormente, vetores de dimensão 50.
NOME: vetor [50] literal; IDADE: vetor[50] numérico, e assim
por diante. Isso também resolveria nossos problemas. Se
você pensou assim, pensou certo. Parabéns, por que mostra
que você conseguiu entender os conceitos das unidades
anteriores.
Mas o que há de novo, então?
Quando criamos variáveis independentes, o computador irá
colocá-las em qualquer endereço de memória reservado para
essas ocasiões. Ele não vai se preocupar em colocar em uma
certa ordem que muitas vezes são necessárias por quesitos de
velocidade de execução do programa. Imagine sua ficha cadastral
onde o nome está em uma folha, o endereço está duas folhas a
seguir, depois volta uma folha para preencher a idade e assim
sucessivamente. Parece desorganizado você não acha? Além do
tempo de preenchimento que será bem maior. Ou seja, se estamos
criando variáveis para representar nossas fichas cadastrais, seria
interessante que todas elas fossem declaradas próximas uma das
outras. Isso faria com que o desempenho do programa fosse
melhor. Pode parecer estranho, mas para um programa com
muitas informações e dados para manipular, isso pode fazer a
diferença entre um programa bom e um ruim.
Pois bem, no mundo da lógica de programação, podemos criar
estruturas de dados heterogêneas, ou seja, capaz de armazenar
variáveis de tipos diferentes, de forma que as mesmas estejam
declaradas próximas umas das outras no que diz respeito à
posição de memória do computador. São os chamados registros.
Com esse tipo de estrutura, podemos declarar múltiplas variáveis
de diferentes tipos, todas organizadas umas próximas das outras,
de forma similar a uma ficha cadastral. Na seção seguinte, vamos
definir essa estrutura e vamos aprender a como declará-las.
Unidade 3
logica_2_livro_caderno.indb 49
49
7/12/2006 14:20:56
Universidade do Sul de Santa Catarina
Quando trabalhamos com vetores e matrizes nas unidades
anteriores, os dados armazenados nessas estruturas devem ser
homogêneos, ou seja, tudo do mesmo tipo. Não podemos utilizar
nem vetores e nem matrizes para armazenar dados de tipos
diferentes.
Mas, se quisermos trabalhar com dados do tipo literal
e numérico juntamente, isso é possível?
Posso dizer que sim. Nesta unidade você vai aprender como
trabalhar com dados de tipos diferentes, ou seja, vai conhecer as
estruturas ou registros de dados.
SEÇÃO 1 - Conceito e declaração de registros
Mas, se quisermos trabalhar com dados do tipo literal
e numérico juntamente, isso é possível?
Em lógica de programação um registro é um recurso que permite
a criação de diferentes tipos de variáveis em um mesmo bloco
de memória do computador. Quando criamos um registro,
criamos um espaço na memória do computador que permite
armazenar dados heterogêneos, ou seja, constantes de vários
tipos. É como se fosse uma ficha de dados, organizada de forma
que os dados estão próximos um dos outros dentro da memória
do computador. Uma das grandes vantagens disso, além da
organização, é a velocidade de acesso às informações ali contidas.
Para lembrar!
Diferentemente de vetores e matrizes que só podem
armazenar dados do mesmo tipo, os registros são
estrutura ou recursos que permitem armazenar
constantes de diferentes tipos.
50
logica_2_livro_caderno.indb 50
7/12/2006 14:20:56
Lógica de Programação II
Sintaxe do registro
<nome do registro>: registro
<campos que comporão o registro>
fim-registro
onde <campos que comporão o registro> são todas as variáveis
que irão compor uma ficha de dados, ou seja, NOME, IDADE,
CPF, ENDERECO etc.
Vamos imaginar uma ficha cadastral que chamaremos de
FICHA com as seguintes informações a serem preenchidas
por um cliente de um hotel:
Nome, estado civil, endereço, bairro, cidade, estado, e-mail,
idade, telefone, número.
Utilizando a sintaxe de criação de registro, temos:
FICHA: registro
NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO,
EMAIL: literal
IDADE, TELEFONE, NUMERO: numérico
fim-registro
Bem, você já deve estar perguntando. O que mudou além da palavra
reservada registro e fim-registro?
Pois bem, conforme dito anteriormente, quando declaramos
a FICHA anterior como sendo registro uma parte da
memória do computador é reservada e nela são inseridas as
variáveis declaradas entre os comandos registro e fim-registro.
Portanto, elas ocupam o mesmo bloco de memória, tornando
o desempenho do programa mais rápido. Agora, por exemplo,
NOME e IDADE estão num mesmo bloco de memória. Seria
análogo a ter nome e idade em uma mesma ficha cadastral.
Outra diferença importante é a questão de como acessamos as
variáveis declaradas dentro de uma estrutura.
Unidade 3
logica_2_livro_caderno.indb 51
51
7/12/2006 14:20:56
Universidade do Sul de Santa Catarina
Como podemos ler e escrever nessas variáveis?
A resposta é bastante simples. Basta especificarmos o nome do
registro criado, seguido de um ponto (.) e o nome da variável.
Por exemplo, para acessar a variável NOME, precisamos
especificar o nome do registro do qual ela pertence. Sendo assim,
FICHA.NOME. Observe que a variável NOME não é uma
variável independente qualquer. Ela pertence ao registro FICHA.
Por isso, precisamos preceder o nome da variável NOME com o
nome do registro FICHA seguido de um ponto (.).
Assim como na criação de vetores e matrizes, para a criação de
registros não precisamos especificar os endereços de memória
do computador. Isso é feito automaticamente, sem que sequer
saibamos onde os valores estão armazenados na memória.
A única coisa que sabemos é que é alocado um espaço para
armazenar esses valores e que são armazenados em blocos de
memória.
- Na próxima seção você vai saber como montar algoritmos com
registros.
SEÇÃO 2 - Operação com registros
Novamente, você já deve ter percebido que não criamos qualquer
outra lógica de controle além das já estudadas. É mais uma
oportunidade de mostrar a você a importância dos comandos
básicos de lógica de programação. Nesta seção, vamos mostrar
uma aplicação típica de registros: o conceito de fichas cadastrais.
A figura a seguir mostra uma possível ficha cadastral:
Nome:
Estado Civil:
Endereço:
Número:
Bairro:
Estado:
Idade:
Cidade:
Telefone:
52
logica_2_livro_caderno.indb 52
7/12/2006 14:20:57
Lógica de Programação II
Observando a figura anterior, podemos verificar que temos
variáveis literais e numéricas.
Vamos classificá-las inicialmente: Nome, Estado Civil, Endereço,
Bairro, Cidade e Estado são variáveis literais. Idade, Número
e Telefone de Contato são variáveis numéricas. Observe que
poderíamos colocar Telefone de Contato como literal também.
Se quiséssemos representar um número telefônico por
278-8080, isso é um literal e não um valor numérico. Mas
para nosso exemplo, vamos considerar o Telefone de
Contato como sendo numérico. Para o telefone especificado
devemos colocar então como sendo 2788080.
Criaremos um registro para a ficha cadastral. Iremos chamar esse
registro de FICHA. Sendo assim, em pseudocódigo, temos:
FICHA: registro
{variáveis da ficha}
fim-registro
Agora vamos definir as variáveis. Iremos especificar seis variáveis
literais e três variáveis numéricas. Colocaremos os nomes das
variáveis de forma a não deixar qualquer tipo de dúvida em
relação às constantes que serão armazenadas. Dessa forma, nosso
registro será conforme a seguir:
FICHA: registro
{variáveis da ficha}
NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal
IDADE, NUMERO, TELEFONE: numérico
fim-registro
Isso é tudo. Nossa ficha já está montada. Basta utilizá-la agora
acessando as variáveis do registro. O algoritmo a seguir, mostra
um exemplo completo.
Unidade 3
logica_2_livro_caderno.indb 53
53
7/12/2006 14:20:57
Universidade do Sul de Santa Catarina
Pseudocódigo:
início
{declaração do registro FICHA}
FICHA: registro
{variáveis da ficha}
NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO:
literal
IDADE, NUMERO, TELEFONE: numérico
fim-registro
{entrada de dados}
escreva “Nome: “
leia FICHA.NOME
escreva “Estado Civil: “
leia FICHA.ESTADOCIVIL
escreva “Idade: “
leia FICHA.IDADE
escreva “Endereço: “
leia FICHA.ENDERECO
escreva “Bairro: “
leia FICHA.BAIRRO
escreva “Número: “
leia FICHA.NUMERO
escreva “Cidade: “
leia FICHA.CIDADE
escreva “Estado: “
leia FICHA.ESTADO
escreva “Telefone de Contato: “
leia FICHA.TELEFONE
fim
No algoritmo anterior não mostramos nenhuma saída. O
exemplo foi apenas para mostrar como trabalhar com criar um
registro e como acessar suas variáveis.
54
logica_2_livro_caderno.indb 54
7/12/2006 14:20:57
Lógica de Programação II
Criando novos tipos de variáveis
Muitas vezes, os tipos básicos de variáveis que utilizamos
até agora (numérico, literal e lógico) não são suficientes para
resolver um algoritmo. Seria interessante que pudéssemos criar
tipos definidos pelo usuário. Por exemplo, um tipo de variável
que armazenasse, ao mesmo tempo, um valor literal, um valor
numérico e um valor lógico. Vou lhe dar a boa notícia. Isso
é possível sim, graças à estrutura de registros que acabamos
de estudar. Podemos fazer de um registro criado um tipo de
variável.
Por exemplo, além de termos os tipos básicos como o
numérico, o literal e o lógico, poderíamos ter também o
tipo FICHA. FICHA na verdade, é um registro criado pelo
programador. Chamamos isso de tipo definido pelo usuário.
Isso é fantástico, pode acreditar. Além de podermos criar
variáveis, podemos criar agora, também tipos de variáveis.
Mas como posso fazer isso e para que serve?
Bem, para criar um tipo registro, em pseudocódigo, é necessário
apenas colocar a palavra reservada tipo antes do nome do
registro, ficando assim sua sintaxe:
tipo <nome do registro> = registro
<campos que comporão o registro>
fim-registro
O comando tipo serve para criar novos tipos de variáveis a partir
dos tipos básicos.
Unidade 3
logica_2_livro_caderno.indb 55
55
7/12/2006 14:20:57
Universidade do Sul de Santa Catarina
Por exemplo, no exercício de para manipular uma ficha
cadastral colocado anteriormente, poderíamos fazer do
registro FICHA um tipo e declarar variáveis daquele tipo. A
sintaxe ficaria conforme a seguir:
tipo FICHA = registro
{variáveis da ficha}
NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal
IDADE, NUMERO, TELEFONE: numérico
fim-registro
Para criar uma variável do tipo FICHA, criamos da mesma
forma que criamos as variáveis dos tipos primitivos. Por exemplo,
ficha1: FICHA, onde ficha1 é agora uma variável do tipo
FICHA. Passamos a acessar as variáveis do registro FICHA a
partir da variável ficha1.
Exemplo: ficha1.NOME, ficha1.ENDERECO e assim por diante.
O que quero dizer é que FICHA é um tipo definido pelo
programador e que ficha1 é uma variável do tipo FICHA que
ocupa um espaço na memória para armazenar seis variáveis
literais e três variáveis numéricas, conforme nosso exemplo.
Assim, veja parte do algoritmo anterior atualizado:
56
logica_2_livro_caderno.indb 56
7/12/2006 14:20:57
Lógica de Programação II
início
{declaração do registro FICHA}
tipo FICHA = registro
{variáveis da ficha}
NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal
IDADE, NUMERO, TELEFONE: numérico
fim-registro
ficha1 : FICHA {declaração da variável do tipo FICHA. Observe que o tipo
FICHA é definido antes de ser utilizado. Isso é obrigatório, tendo em vista
que o programa precisa saber o que é FICHA. Como definimos FICHA como
sendo um registro, ao especificar ficha1 como sendo do tipo FICHA, nenhum
problema será encontrado}
escreva “Nome: “
leia ficha1.NOME
escreva “Estado Civil: “
leia ficha1.ESTADOCIVIL
........ {restante do algoritmo}
fim
Mas qual é a utilidade de se criar tipos como no nosso
exemplo?
É muito simples. Perceba que criamos apenas uma ficha
cadastral de um hóspede. Se quiséssemos preencher o cadastro
para um novo hóspede, bastaria criarmos outra variável, ficha2
por exemplo. Poderíamos criar tantas fichas quanto quisermos.
Considerando o tipo FICHA anteriormente criado, podemos
criar várias variáveis:
ficha1, ficha2, ficha3: FICHA.
Cada variável representa uma ficha para cadastrar um hóspede.
É como se tivéssemos 3 fichas cadastrais para serem preenchidas
na mão. Para acessar o nome de ficha1, apenas colocaríamos
ficha1.NOME. Para acessar o nome de ficha2, ficha2.NOME,
e para ficha3, ficha3.NOME. Como cada variável, nesse caso,
ficha1, ficha2 e ficha3 são três blocos de memórias independentes,
Unidade 3
logica_2_livro_caderno.indb 57
57
7/12/2006 14:20:57
Universidade do Sul de Santa Catarina
é como se tivéssemos três variáveis independentes em locais de
memória diferentes, porém, cada uma delas contendo seis variáveis
literais e três numéricas, conforme você já leu.
Criando um conjunto de registros
Precisamos incrementar nosso algoritmo anterior. Ele permite
o cadastramento de 5 hóspedes apenas. Nosso hotel tem 100
quartos. Podemos admitir até 100 hóspedes, certo? Devemos
criar 100 fichas cadastrais. E agora? Você terá problemas se tiver
que criar 100 variáveis do tipo FICHA.
Lembra para que servem os vetores? Será que você
deduziu que podemos utilizar vetores para esse caso?
Vamos por analogia: se estamos precisando armazenar 100
valores numéricos, criamos um vetor do tipo numérico; se
precisamos armazenar 100 nomes de clientes, criamos um vetor
do tipo literal. Raciocinando da mesma maneira, se precisarmos
armazenar 100 fichas de clientes, criamos um vetor de FICHA
(tipo definido por nós). Na sintaxe de pseudocódigo teríamos:
fichas: vetor [100] FICHA. Agora, definimos um vetor de 100
posições chamado de fichas, onde cada posição (quadrado) tem
uma variável do tipo FICHA. Veja a seguir:
Ficha 1
Ficha 2
Ficha 3
...
Ficha 99
Ficha1 está na posição 0 do vetor fichas, Ficha2 está na posição 1
do vetor fichas, e assim sucessivamente.
Mas o que é uma FICHA mesmo? FICHA é um
registro que tem os seguintes campos definidos
anteriormente:
NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE,
ESTADO: literal
IDADE, NUMERO, TELEFONE: numérico.
58
logica_2_livro_caderno.indb 58
7/12/2006 14:20:57
Lógica de Programação II
Como podemos acessar os dados de cada ficha dentro do
vetor? Bem, de forma similar ao acesso dos dados em vetores,
precisamos saber qual a posição que queremos acessar do vetor.
Depois de sabermos qual o índice do vetor, devemos lembrar que
dentro de cada posição do vetor temos um registro com aqueles
campos ou variáveis definidas. Veja a figura a seguir.
[0]
[1]
[2]
...
nome
estadocivil
endereco
bairro
cidade
estado
idade, numero
telefone
...
Ficha 99
nome
estadocivil
endereco
bairro
cidade
estado
idade, numero
telefone
Para acessar um desses campos basta colocar um ponto (.)
seguido do nome da variável definida dentro do registro.
Por exemplo, para acessar o nome do primeiro hóspede
(definido na posição 0 do vetor fichas), colocamos fichas [0].
NOME; para acessar a idade dessa mesma ficha, colocarmos
fichas [0].IDADE e assim por diante.
Vamos supor que estamos cadastrando o cliente 60 do nosso
hotel. Como poderíamos fazer?
Bem, devemos lembrar que, como um vetor sempre começa na
posição 0 (zero), assim o cliente 60 está definido da posição 59
do nosso vetor, certo? Desta forma, podemos preencher os dados
conforme a seguir:
fichas[59].NOME “Luiz Silva”
fichas[59].ESTADOCIVIL “solteiro”
fichas[59].ENDERECO “Avenida Paulista”
fichas[59].IDADE 30
{e assim para os demais dados deste hóspede}.
Unidade 3
logica_2_livro_caderno.indb 59
59
7/12/2006 14:20:58
Universidade do Sul de Santa Catarina
- Olha aí a importância dos vetores novamente. Na seção seguinte
você verá exemplos com código pronto para você estudar e tirar
dúvidas. Tente implementar cada exercício sozinho, depois compare
com a solução proposta. Faça tantas vezes você quiser. Quanto mais
exercícios você fizer, melhor você será.
SEÇÃO 3 - Algoritmos com manipulação de registros
Veja agora alguns exercícios resolvidos com manipulação de
registros.
1. Cadastrar os dados gerais de 300 disciplinas que os
professores lecionam: nome, conteúdo, freqüência e nota
mínimas para aprovação. Ler cinco nomes de disciplinas e
mostrar freqüência e média mínimas para aprovação em
cada uma.
Pseudocódigo:
início
tipo FICHA = registro {criando um tipo FICHA}
NOME, CONTEUDO : literal
FREQUENCIA, MEDIA : numérico
fim-registro
DISCIPLINAS : vetor [300] FICHA {criando um vetor para cadastrar
300 disciplinas, onde cada disciplina é constituída por um nome
(NOME), conteúdo (CONTEUDO), freqüência (FREQUENCIA) e média
(MEDIA)}
NOMECONSUL : literal {Nome da disciplina a ser consultada}
CONT, POS : numérico {Variáveis para controle de laço de repetição}
{Entrada de dados para 300 disciplinas}
para POS de 0 até 299 passo 1 faça
escreva “Digite o nome da disciplina: “
leia DISCIPLINAS[POS].NOME
escreva “Digite o conteúdo da disciplina: “
leia DISCIPLINAS[POS].CONTEUDO
escreva “Digite a freqüência mínima necessária para aprovação: “
leia DISCIPLINAS[POS].FREQUENCIA
60
logica_2_livro_caderno.indb 60
7/12/2006 14:20:58
Lógica de Programação II
escreva “Digite a média mínima necessária para aprovação: “
leia DISCIPLINAS[POS].MEDIA
fim-para
{verificação de 5 disciplinas, conforme o enunciado}
para CONT de 1 até 5 passo 1 faça
escreva “Digite o nome da disciplina a ser consultada: “
leia NOMECONSUL {nome da disciplina a ser consultada}
POS 0 {inicializa a variável POS pois o vetor começa em 0}
enquanto NOMECONSUL < > DISCIPLINAS[POS].NOME ou POS < 300
{percorre todo o vetor DISCIPLINAS até que a variável NOMECONSUL seja igual a DISCIPLINAS [POS].NOME e POS < 300. Utilize aqui,
como exercício, uma tabela-verdade para saber quando a condição
resultante se torna falsa. É uma excelente revisão da operação lógica ou.}
POS POS + 1 {enquanto não encontrar a disciplinas digitadas,
soma POS de 1, o que significa pular para a próxima posição do vetor}
fim-enquanto
se NOMECONSUL = DISCIPLINAS[POS].NOME então
escreva “Disciplina:”, DISCIPLINAS[POS].NOME
escreva “Média Mínima:”, DISCIPLINAS[POS].MEDIA
escreva “Freq. Mínima:”, DISCIPLINAS[POS].FREQUENCIA
senão
escreva “Disciplina não consta no cadastro !”
fim-se
fim-para
fim
2. Elaborar um algoritmo para cadastrar 5000 CDs de uma
loja. Os dados a serem cadastrados são: código, nome do CD,
nome do cantor/grupo, tipo de música, produtora e ano de
produção. Exibir os códigos e nomes dos CDs solicitados por
um usuário por meio do nome de um cantor ou grupo musical.
Pseudocódigo:
início
{declaração do tipo FICHA}
tipo FICHA = registro
NOME, CANTOR, TIPO, PRODUTORA : literal
CODIGO, ANOPRODUCAO : numérico
fim-registro
{declaração do vetor CDS. Cada posição do vetor contém um registro do
tipo FICHA}
CDS : vetor [5000] FICHA
CANTORCONSUL : literal {Cantor a ser consultado}
POS : numérico {variável para percorrer o vetor CDS}
Unidade 3
logica_2_livro_caderno.indb 61
61
7/12/2006 14:20:58
Universidade do Sul de Santa Catarina
{Dados de entrada para o programa de cadastramento de CDS}
para POS de 0 até 4999 passo 1 faça
escreva “Digite o código do CD: “
leia CDS[POS].CODIGO
escreva “Digite o nome do CD: “
leia CDS[POS].NOME
escreva “Digite o nome do cantor ou do grupo: “
leia CDS[POS].CANTOR
escreva “Digite o tipo de música: “
leia CDS[POS].TIPO
escreva “Digite o nome da produtora: “
leia CDS[POS].PRODUTORA
escreva “Digite o ano de produção (somente os números) do CD:”
leia CDS[POS].ANOPRODUCAO
fim-para
{processamento do algoritmo}
escreva “Digite o nome do cantor ou grupo a ser consultado (ou FIM para
encerrar):”
leia CANTORCONSUL
enquanto CANTORCONSUL < > “FIM” faça
POS 0
enquanto CANTORCONSUL < > CDS[POS].CANTOR ou POS < 5000
{percorre cada posição do vetor para verificar a existência do cantor}
POS POS + 1
fim-enquanto
se CANTORCONSUL = CDS[POS].CANTOR então
escreva “Código:”, CDS[POS].CODIGO
escreva “Nome do CD:”, CDS[POS].NOME
senão
escreva “Cantor ou grupo musical não possui nenhum CD cadastrado !”
fim-se
{Observe aqui que estamos solicitando que o usuário entre com o nome
do cantor ou a palavra FIM novamente. Perceba que a primeira vez ocorreu fora do laço de repetição. Dessa vez, o comando de leitura é realizado
para permitir com que o usuário finalize o programa digitando FIM. Caso
não colocássemos essa opção, teríamos um laço infinito. Lembra que todo
algoritmo tem que possuir um fim?}
escreva “Digite o nome do cantor ou grupo a ser consultado (ou FIM para
encerrar): “
leia CANTORCONSUL
fim-enquanto
fim
62
logica_2_livro_caderno.indb 62
7/12/2006 14:20:58
Lógica de Programação II
Síntese
Você acaba de finalizar mais uma etapa na busca pela excelência.
Viu que para implementar variáveis de diferentes tipos utilizamos
um registro, que nada mais é do que um recurso que permite a
criação de diferentes tipos de variáveis em um mesmo bloco de
memória do computador, facilitando, sobretudo, o desempenho
do programa.
Quando criamos um registro, criamos um espaço na memória do
computador que permite armazenar dados heterogêneos, ou seja,
constantes de vários tipos. É como se fosse uma ficha de dados,
organizada de forma que os dados estão próximos um dos outros
dentro da memória do computador.
A sintaxe em pseudocódigo para criar um registro é a seguinte:
<nome do registro>: registro
<campos que comporão o registro>
fim-registro
Viu também que a lógica de programação permite ao usuário
criar seus próprios tipos. Isso facilita bastante porque nem
tudo que estamos trabalhando são apenas números, literais ou
lógicos. Há uma combinação desses tipos básicos. A sintaxe para
implementar um tipo registro é a seguinte:
tipo <nome do registro>: registro
<campos que comporão o registro>
fim-registro
Por fim, aprendeu que podemos construir uma poderosa estrutura
de dados misturando vetores com registros. Podemos construir
vetores de registros, onde cada posição do vetor é um registro de
dados. O acesso a cada elemento dentro do vetor é a seguinte:
<nome do vetor>[índice do vetor].<campo ou variável que compõe o registro}
É preciso, agora, muita prática para que possas seguir adiante.
Na próxima unidade você conhecerá alguns algoritmos de
complexidade maior, que envolverão todos os tópicos até agora
estudados. A unidade conta com muitos exemplos prontos para
que você estude, entenda e possa implementar esses algoritmos.
Boa sorte e até lá!
Unidade 3
logica_2_livro_caderno.indb 63
63
7/12/2006 14:20:58
Universidade do Sul de Santa Catarina
Atividades de auto-avaliação
1. Você é responsável pelo cadastramento de um hóspede em um hotel
de luxo em sua cidade. Crie um registro de dados que implementa
essa ficha cadastral. Escolha as variáveis de maior importância para o
cadastro do hóspede.
64
logica_2_livro_caderno.indb 64
7/12/2006 14:20:59
Lógica de Programação II
2. Monte um algoritmo para cadastrar e imprimir os dados pessoais de
vários professores de um sistema de administração escolar. Os dados
pessoais são: nome, endereço, cidade, estado, CEP, telefone, CPF, RG,
data de nascimento, grau de escolaridade, curso em que se formou.
Unidade 3
logica_2_livro_caderno.indb 65
65
7/12/2006 14:20:59
Universidade do Sul de Santa Catarina
3. Cadastre imprima os dados das fitas de vídeo de uma locadora: código
do filme, nome, tipo de filme, duração, produtor, ator principal, diretor
a ano de produção.
66
logica_2_livro_caderno.indb 66
7/12/2006 14:20:59
Lógica de Programação II
4. Cadastre os dados dos 200 funcionários de uma empresa: código do
funcionário, nome, endereço, data de nascimento, cidade, UF, CEP,
telefone, CPF, RG, grau de escolaridade, número de dependentes
e nome do cônjuge. Exibir nomes, endereços e telefones de 20
funcionários solicitados por um usuário por meio dos códigos de
funcionários.
Unidade 3
logica_2_livro_caderno.indb 67
67
7/12/2006 14:20:59
Universidade do Sul de Santa Catarina
5. Ao criar um sistema de cadastro de clientes de uma lógica de
informática, onde são necessários os seguintes dados: nome do cliente,
CPF e telefone de contato, poderíamos implementar o algoritmo para
cadastrar 50 clientes de duas maneiras:
Primeira maneira:
início
NOME: vetor[50] literal
CPF: vetor[50] literal
FONE: vetor[50] numérico
..... {implementação do algoritmo}
fim
Segunda maneira:
início
tipo FICHA = registro
NOME: literal
CPF: literal
FONE: numérico
fim-registro
fichas: vetor[50] FICHA {declaração de um vetor de FICHAS}
..... {implementação do algoritmo}
fim
Explique com suas próprias palavras as diferenças entre as duas formas
de implementações citadas e as vantagens em se optar pela segunda
maneira.
68
logica_2_livro_caderno.indb 68
7/12/2006 14:20:59
Lógica de Programação II
Saiba mais
MAGRI, João Alexandre. Lógica de Programação - Ensino
Prático.
MANZANO, José Augusto N. G.; OLIVEIRA, Jayr
Figueiredo de. Estudo Dirigido de Algoritmos.
FORBELLONE, André Luiz Villar; EBERSPÄCHER,
Henri Frederico. LÓGICA de programação: a construção de
algoritmos e estruturas de dados.
Unidade 3
logica_2_livro_caderno.indb 69
69
7/12/2006 14:20:59
logica_2_livro_caderno.indb 70
7/12/2006 14:20:59
UNIDADE 4
Tópicos avançados em
algoritmos computacionais
4
Objetivo de aprendizagem
Identificar os comandos e compreender a lógica em
pseudocódigo, proposta para resolver o problema.
Seções de estudo
Seção 1 Implementação de algoritmos de ordenação.
Seção 2 Implementação de algoritmos de busca.
logica_2_livro_caderno.indb 71
7/12/2006 14:20:59
Universidade do Sul de Santa Catarina
Para início de conversa
Você está quase finalizando a disciplina de Lógica de
Programação II. Falta apenas a parte de modularização. Antes
porém, nada é mais importante do que treinar, treinar e treinar
todos os comandos lógicos vistos até agora. Você vai estudar
algumas aplicações de interesse no mundo não somente da web
mas em todas as formas de programação, como por exemplo,
procurar por um nome dentro de um cadastro de clientes ou
ordenar uma lista de clientes por ordem alfabética.
Nesta unidade, vamos ver algumas aplicações que envolverão a
revisão de todos os conceitos, desde Lógica de Programação I
até a atual. O objetivo principal é fazer com que você identifique
os comandos e entenda a lógica em pseudocódigo, proposta para
resolver o problema.
O mais importante agora é fazer os algoritmos antes mesmo
de olhar a solução. Tente fazer uma, duas ou mais vezes, até
entender por completo o problema e a solução encontrada. Após
o exercício, observe a solução proposta e compare com o que você
fez. Se optar por estudar a solução proposta em primeiro lugar,
mesmo assim, tente fazer o algoritmo sozinho para verificar se
realmente entendeu. São fascinantes os desafios aqui propostos.
Esta coletânea de exemplos e exercícios vai fazer de você um
programador mais seguro e pronto para iniciar outras conquistas.
SEÇÃO 1 - Implementação de algoritmos de ordenação
Em caso de dúvida,
consulte a Unidade 3 de
Lógica de Programação I.
Você se lembra dos passos para se fazer um bom algoritmo?
Para escrever um algoritmo precisamos descrever a seqüência de
instruções, de maneira simples e objetiva. Para isso, utilizamos
algumas técnicas:
1. Usar somente um verbo por frase.
2. Imaginar que você está desenvolvendo um algoritmo
para pessoas que não trabalham com informática.
3. Usar frases curtas e simples.
72
logica_2_livro_caderno.indb 72
7/12/2006 14:20:59
Lógica de Programação II
4. Ser objetivo.
5. Procurar usar palavras que não tenham sentido dúbio.
Ao passo de cada algoritmo, mostro a seguir algumas dessas
e outras regras que nos possibilita construir algoritmos mais
complexos de alta qualidade.
Pronto para esse desafio? Respire fundo e mãos à obra!
Problema 1: Imagine um vetor com cinco elementos conforme
descrito a seguir.
10.0
8.0
9.0
7.0
8.5
Como colocá-lo em ordem crescente de tal maneira que os
números sejam dispostos na seguinte ordem?
7.0
8.0
8.5
9.0
10.0
Perceba que há uma troca dos valores dentro do vetor.
Por exemplo, o número 10 que estava na posição 0 foi para
a posição 4. O número 8 ficou na mesma posição, ou seja,
posição 1 em ambos os vetores. O número 9 foi da posição
2 para a posição 3, o número 7 da posição 3 para a posição
0 e o número 8.5 foi da posição 4 para a posição 2. Fizemos
uma reordenação dos números de forma a se mostrarem
em ordem crescente.
Essa aplicação é um exemplo dentre tantas outras, por exemplo,
ordenar nomes de clientes em ordem alfabética para mostrar
em uma página web; mostrar em um cadastro de alunos, os
alunos que possuem as melhores notas, ordenadas em ordem
decrescente; mostrar no site do DETRAN os motoristas com
maiores multas; e assim sucessivamente.
O algoritmo que vamos aplicar aqui serve para todos os casos
citados. É o método da Bolha ou em inglês Bubble Sort.
Unidade 4
logica_2_livro_caderno.indb 73
73
7/12/2006 14:20:59
Universidade do Sul de Santa Catarina
Solucionando o problema em passos
1. Vamos iniciar nosso algoritmo criando um vetor de 5 posições:
Pseudocódigo:
início
NOTAS: vetor[5] numérico {declaração do vetor de 5 posições}
2. Criado o vetor NOTAS, precisamos ler os valores e armazenálos nesse vetor. Utilizamos a estrutura de repetição para/faça/
fim-para para percorrer todo o vetor. Precisamos criar uma
variável de contagem. Vamos chamá-la de CONT.
CONT: numérica
para CONT de 0 até 4 passo 1 faça
escreva “Entre com uma nota”:
leia NOTAS[ CONT ]
fim-para
O vetor poderia se mostrar conforme a seguir:
10.0
8.0
9.0
7.0
8.5
Perceba que estamos lendo os números de uma forma aleatória,
ou seja, sem qualquer seqüência pré-definida. Nosso objetivo é
colocá-los em ordem crescente, ou seja, do menor para o maior.
3. Sempre que quisermos ordenar números e/ou literais,
precisamos realizar uma comparação entre dois números e/
ou literais para saber quem é maior ou menor. Lembrando
de Lógica de Programação I, quando realizamos uma
comparação, realizamos entre dois e apenas dois valores
por vez. Isso sugere que devemos realizar a comparação
dos valores do vetor NOTAS tomando dois a dois, ou seja,
comparamos inicialmente a posição 0 com a posição 1 do vetor
NOTAS, seguido da posição 1 com a 2, da 2 com a posição
3 e assim sucessivamente. Precisamos saber de antemão
que posição estamos testando e quando é finalizado o teste.
Precisamos, assim, criar 2 novas variáveis: POS, armazena
74
logica_2_livro_caderno.indb 74
7/12/2006 14:20:59
Lógica de Programação II
a posição de teste e ULTIMA, armazena o último teste de
comparação. Podemos perceber que POS tem valor inicial de
zero (índice inicial do vetor) e ULTIMA tem valor inicial de 4
(índice final do vetor).
POS, ULTIMO: numérico
POS 0
ULTIMO 4
10.0
8.0
9.0
POS
7.0
8.5
ULTIMA
4. Realizamos a primeira comparação, entre a primeira e
a segunda posição do vetor. O teste é feito por meio da
pergunta: “10.0 é maior do que 8?” e o objetivo é colocar o
menor na primeira posição. Podemos verificar que a resposta é
verdadeira.
5. Como a resposta do passo 4 foi positiva, precisamos trocar
o valor 10.0 pelo valor 8.0, ou seja, o valor 8.0 passa para a
posição 0 do vetor NOTAS e o valor 10.0 vai para a posição 1
do mesmo vetor. Como podemos realizar esse passo?
A resposta é simples desde que criemos uma nova variável.
Chamaremos essa variável de AUX (variável auxiliar na troca
entre os valores). A idéia é passar o conteúdo de NOTAS [0]
para NOTAS [1] e vice-versa. Com auxílio de AUX podemos
fazer o seguinte:
AUX NOTAS [ 0 ] {guardo o valor inicial do vetor de NOTAS. No
exemplo, AUX recebe o valor 10.0}
NOTAS [ 0 ] NOTAS[ 1 ] {o vetor NOTAS na posição 0 recebe o
valor contido na posição 1, ou seja, NOTAS[ 0 ] = 8.0}
NOTAS [ 1 ] AUX { o vetor NOTAS na posição 1 recebe o valor
contido na variável AUX, ou seja, NOTAS[ 0 ] = 10.0}.
Unidade 4
logica_2_livro_caderno.indb 75
75
7/12/2006 14:21:00
Universidade do Sul de Santa Catarina
Sendo assim, observe que os valores das variáveis foram trocados
com a utilização da variável auxiliar AUX. Temos agora a
seguinte formação do vetor de NOTAS:
8.0
10.0
9.0
7.0
POS
8.5
ULTIMA
6. Para realizar nosso próximo passo, vamos testar agora a
posição 1 com a posição 2 do vetor, conforme o passo 3. Para
fazermos esse teste, devemos incrementar a variável POS de 1,
fazendo com que ela assuma o valor 1.
POS POS + 1 {como a variável POS tem valor inicial de 0,
incrementando 1, a variável POS passa a ter valor 1.}
8.0
10.0
POS
9.0
7.0
8.5
ULTIMA
7. Realizamos a segunda comparação, entre a segunda e terceira
posição do vetor. O teste é feito por meio da pergunta: “10.0 é
maior do que 9.0?” e o objetivo é colocar o menor na segunda
posição. Podemos verificar que a resposta é verdadeira.
8. Executamos o passo de maneira análoga ao passo 5, mas agora
observando que estamos testando entre as posições 1 e 2 do
vetor NOTAS:
AUX NOTAS [ 1 ] {guardo o valor da posição 1 vetor de NOTAS na
variável AUX. No exemplo, AUX recebe o valor 10.0}
NOTAS [ 1 ] NOTAS[ 2 ] {o vetor NOTAS na posição 1 recebe o
valor contido na posição 2, ou seja, NOTAS[ 1 ] = 9.0}
NOTAS [ 2 ] AUX { o vetor NOTAS na posição 2 recebe o valor
contido na variável AUX, ou seja, NOTAS[ 2 ] = 10.0}.
76
logica_2_livro_caderno.indb 76
7/12/2006 14:21:00
Lógica de Programação II
Sendo assim, observe que os valores das variáveis foram trocados
com a utilização da variável auxiliar AUX. Temos agora a
seguinte formação do vetor de NOTAS:
8.0
9.0
10.0
7.0
POS
8.5
ULTIMA
9. Executamos o passo 6, 7 e 8 novamente, porém nossa posição
de teste agora é a terceira e iremos comparar os valores
numéricos armazenados na terceira e quarta posição do vetor
de NOTAS.
8.0
9.0
10.0
7.0
POS
8.5
ULTIMA
Como resposta da execução do passo 8, temos a seguinte
formação do vetor:
8.0
9.0
7.0
10.0
POS
8.5
ULTIMA
10. Executamos o passo 6, 7 e 8 novamente, porém nossa posição
de teste agora é a quarta e iremos comparar os valores
numéricos armazenados na quarta e quinta posição do vetor
de NOTAS.
8.0
9.0
7.0
Unidade 4
logica_2_livro_caderno.indb 77
10.0
8.5
POS
ULTIMA
77
7/12/2006 14:21:00
Universidade do Sul de Santa Catarina
11. Como resposta da execução do passo anterior, temos a
seguinte formação do vetor:
8.0
9.0
7.0
8.5
10.0
12. Observando o resultado do passo anterior, podemos perceber
que o número 10.0 está na última posição do vetor e lá deverá
ficar, tendo em vista que não há número maior do que 10.0
dentro do vetor de NOTAS, certo? Atingimos, dessa forma
a posição final do vetor NOTAS. Precisamos recomeçar
a ordenação, colocando a variável POS em 0 e a variável
ULTIMA em ULTIMA-1, ou seja, ULTIMA recebe
valor 3. Mas por que isso? A resposta é que não precisamos
comparar mais o valor 10.0 que está na última posição.
Lembra que o número 10.0 estava inicialmente na posição 0
do vetor e que fomos realizando a comparação com valores
subseqüentes para verificar se ele era maior ou menor? Em
nosso exemplo, coincidiu que o valor 10.0 era o maior de
todos. Sendo assim, em cada passo realizamos as trocas dos
números até colocá-lo na posição final do vetor NOTAS.
O que nos interessa agora é reinicializar a ordenação da
posição 0 até a posição 3 do vetor de NOTAS, conforme a
seguir:
8.0
9.0
7.0
POS
8.5
10.0
ULTIMA
13. Repetimos todos os passos anteriores. Como resultado,
temos a seguinte ordenação, já decrementando a variável
ULTIMA de 1 também:
8.0
POS
7.0
8.5
9.0
10.0
ULTIMA
78
logica_2_livro_caderno.indb 78
7/12/2006 14:21:00
Lógica de Programação II
14. Repetimos novamente os passos, temos o seguinte vetor:
7.0
8.0
POS
ULTIMA
8.5
9.0
10.0
Até quando devemos repetir os passos de ordenação?
Perceba que executamos os passos até que a variável ULTIMA
assuma valor 1. Para cada valor da variável ULTIMA, executamos
as repetições para a variável POS de 0 até ULTIMA-1.
15. Observe que o vetor está ordenado em forma crescente, do
menor valor para o maior. Nosso objetivo foi atingido.
Veja o resultado em pseudocódigo. Execute o algoritmo passo
a passo, de forma a entender o que está colocado. Desenhe
um vetor com quantos elementos você desejar e execute os
comandos colocados em pseudocódigo.
início
NOTAS: vetor [5] numérico {declaração do vetor de 5 posições}
POS, ULTIMA, AUX: numérico
{entrada de dados}
para POS de 0 até 4 passo 1 faça
escreva “Entre com a Nota: “
leia NOTAS[ POS ] {armazena os valores lidos no vetor NOTAS}
fim-para
{inicialização das variáveis}
POS 0
{inicializa a variável POS}
ULTIMA 4 {inicializa a variável ULTIMA}
AUX 0
{inicializa a variável AUX, variável que auxilia na troca de
valores entre as posições do vetor NOTAS}
{processamento da ordenação dos números}
enquanto ULTIMA < > 0 faça
Unidade 4
logica_2_livro_caderno.indb 79
79
7/12/2006 14:21:00
Universidade do Sul de Santa Catarina
enquanto POS < > ULTIMA faça
se NOTAS[ POS ] > NOTAS[ POS + 1 ] então
{processo de troca dos números}
AUX NOTAS [ POS ]
NOTAS [ POS ] NOTAS[ POS + 1]
NOTAS [ POS + 1] AUX
fim-se
{incrementa posição do vetor}
POS POS + 1
fim-enquanto
{inicializa variável POS e decrementa a variável ULTIMA de 1}
POS 0
ULTIMA ULTIMA -1
fim-enquanto
fim
SEÇÃO 2 - Implementação de algoritmos de pesquisa
Métodos de pesquisa, também chamados de
métodos de busca, são algoritmos utilizados para
localizar valores dentro de um vetor.
Na seção anterior, aprendemos a como ordenar os valores de
um vetor. Nesta seção, procuramos por determinados valores de
interesse dentro do vetor, seja os elementos do vetor ordenados
ou não. Há várias técnicas de ordenação. Você vai estudar duas
aplicações bem simples:
O método de procura seqüencial.
O método de procura binária.
80
logica_2_livro_caderno.indb 80
7/12/2006 14:21:00
Lógica de Programação II
Método de procura seqüencial
O método de pesquisa seqüencial é o mais simples de todos. Um
vetor é pesquisado (percorrido) até encontrar o valor desejado
ou até que o vetor termine. É um método bastante aplicado
para vetores com valores desordenados, ou seja, que não estão
ordenados em ordem crescente ou decrescente de valores.
Vamos supor o seguinte exemplo: Um vetor de 5 valores
representando as idades dos clientes de uma loja de vídeo
locadora. Precisamos saber se há clientes com idade de 15
anos, por exemplo. A representação do vetor é mostrada a
seguir:
27
44
14
15
20
Solucionando o problema em passos
1. Inicialmente, precisamos criar nosso vetor de 5 posições. Esse
vetor armazenará as idades de nossos clientes. Vamos permitir
com que o usuário especifique as idades que desejar, ou seja,
será uma entrada de dados via teclado.
Pseudocódigo:
início
IDADES: vetor [5] numérico
ENTRADA: numérico {variável utilizada para armazenar a entrada de uma
idade a ser pesquisada no vetor IDADES.}
CONT: numérico {variável contadora}
{entrada de dados: idade dos clientes. Estamos percorrendo o vetor da
posição 0 até a posição 4.}
para CONT de 0 até 4 passo 1 faça
escreva “Especifique a idade do cliente: “
leia IDADES[CONT] {observe que a variável CONT vai de 0 até 4}
fim-para
Unidade 4
logica_2_livro_caderno.indb 81
81
7/12/2006 14:21:01
Universidade do Sul de Santa Catarina
2. Preenchido o vetor, iremos realizar nosso processamento. O
processamento é simplesmente encontrar a idade especificada
pelo usuário. Vamos precisar entrar com a idade do cliente e
verificar se ela existe ou não no vetor IDADES.
{processamento de procura}
escreva “Entre com a idade a ser procurada no cadastro de clientes: “
leia ENTRADA
{agora, vamos percorrer o vetor IDADES para verificar se existe ou não o valor
numérico digitado pelo usuário e armazenado na variável ENTRADA. Vamos supor
que você especifique a idade 15, ou seja, a variável ENTRADA possui valor numérico
15. Dessa forma, vamos percorrer todo o vetor IDADES procurando pelo valor
numérico 15. O processo é bem simples. Para cada laço de repetição, lemos o valor
contido na posição do vetor. Se encontrarmos o valor que estamos procurando,
finalizamos a pesquisa. Caso contrário, percorremos o vetor IDADES até encontrar
o valor desejado ou até o fim do vetor. Vamos inicializar a variável CONT para ser
reutilizada, ou seja, para percorrer o vetor novamente da posição 0 até a posição 4
do vetor IDADES}
CONT 0
enquanto IDADES[ CONT ] < > ENTRADA e CONT <= 4 faça
{perceba que, enquanto o valor não for encontrado (IDADES [ CONT ] < > ENTRADA)
e não atingirmos o final do vetor IDADES (CONT <= 4 ), incrementamos a variável
CONT de 1. Isso significa irmos de posição em posição do vetor IDADES. Observe
a instrução lógica e aqui no exemplo. Como exercício, faça a tabela verdade e
verifique quando a condição se torna falsa, ou seja, quando que o laço de repetição
é finalizado.}
CONT CONT + 1
fim-enquanto
{na seqüência, verifica-se se há algum valor no vetor igual ao valor lido pelo cliente}
se IDADES[ CONT ] = ENTRADA então
escreva “O número “, ENTRADA, “ está na posição “, CONT
senão
escreva “O número “, ENTRADA, “ não foi encontrado.”
fim-se
fim-algoritmo
82
logica_2_livro_caderno.indb 82
7/12/2006 14:21:01
Lógica de Programação II
3. O algoritmo completo é mostrado a seguir:
início
IDADES: vetor [5] numérico
ENTRADA: numérico
CONT: numérico
para CONT de 0 até 4 passo 1 faça
escreva “Especifique a idade do cliente: “
leia IDADES[ CONT ]
fim-para
CONT 0
escreva “Entre com a idade“
leia ENTRADA
enquanto IDADES[ CONT ] < > ENTRADA e CONT <= 4 faça
CONT CONT + 1
fim-enquanto
se IDADES[ CONT ] = ENTRADA então
escreva “O número “, ENTRADA, “ está na posição “, CONT
senão
escreva “O número “, ENTRADA, “ não foi encontrado.”
fim-se
fim-algoritmo
Método de pesquisa binária
Esse método é aplicado apenas para vetores ordenados,
ou seja, os valores estão em ordem crescente de valores.
Dessa forma, para aplicar esse método precisamos garantir
que o vetor esteja ordenado, conforme a seção 1 desta
unidade.
A grande vantagem desse método é a rapidez, tendo em vista
que o número de dados pesquisados é menor. Apenas parte do
vetor é lida, o que significa uma redução importante de tempo de
procura, principalmente se temos um vetor de dimensão grande,
por exemplo, 1000 elementos.
Unidade 4
logica_2_livro_caderno.indb 83
83
7/12/2006 14:21:01
Universidade do Sul de Santa Catarina
Você deve estar se perguntando: como assim, que
somente parte do vetor é lida? A explicação vem no
próprio desenvolvimento do algoritmo.
Porém, em vez de mostramos todo o algoritmo já desenvolvido,
vamos mexer com o seu potencial. Iremos apenas colocar os
passos e você será o responsável pela montagem do pseudocódigo.
Que belo desafio você tem pela frente. A solução completa está
no final da unidade, para você verificar a sua solução encontrada.
Dica: Tente resolver o algoritmo, ao menos algumas vezes, antes
de olhar a solução. É um exercício que tem raciocínio lógico mais
aprimorado do que todos os anteriores. Vamos lá então?
Solucionando o problema
1. Lembrando sempre que o vetor é assumido como sendo
ordenado em ordem crescente. Vamos supor o seguinte vetor
chamado de VET:
10
44
58
78
100
Vamos supor também que estamos a procura do número 78.
Será que precisamos percorrer o vetor desde o seu
início até encontrar o número 78 na posição 3 do
vetor VET, sabendo de antemão que o mesmo está
ordenado em ordem crescente?
Será que não poderíamos ler o valor na posição
central do vetor, ou próxima do centro do vetor VET e
verificar se o valor contido nessa posição é maior ou
menor do que o valor que estamos procurando?
Em nosso exemplo, podemos verificar que o número central do
vetor VET está na posição 2 do vetor e é o número 58. Como
estamos procurando o número 78 e esse é maior do que 58,
iremos procurar o número 78 apenas na segunda metade do vetor
VET, ou seja, da posição 2 até a posição 4, sem precisar percorrer
84
logica_2_livro_caderno.indb 84
7/12/2006 14:21:01
Lógica de Programação II
o vetor desde o seu início. Parece uma vantagem enorme você não
acha, principalmente quando estamos trabalhando com vetores
de dimensões maiores?
10
44
58
78
100
Como o valor 78 está na segunda metade do vetor VET,
realizamos uma nova divisão, agora considerando apenas os
números nas posições [2], [3] e [4]. A metade do vetor é a posição
[3], que nesse caso é o número 78, ou seja, o número que estamos
procurando.
58
78
100
Se fôssemos realizar a pesquisa seqüencialmente, teríamos 4
passos até encontrar o número 78. Teríamos que ler da posição
0 até a posição 3 do vetor VET. Com a pesquisa binária, onde
dividimos o vetor ao meio, realizamos 2 passos apenas, ou seja,
duas divisões até encontrar o número 78. Vamos à parte lógica do
problema?
1. Monte um vetor VET com os seguintes valores: Montar um
vetor significa criá-lo e preenchê-lo com os valores colocados
na seqüência.
10
44
58
78
100
2. Estabeleça o número 78 como o valor a ser pesquisado. Esse
número deverá ser armazenado na variável NUMEROLIDO.
3. Crie duas variáveis, uma para armazenar a posição inicial do
vetor e outra para armazenar a posição final. As variáveis podem
ser chamadas de PRIMEIRA e ULTIMA respectivamente.
Lembre-se de que a posição inicial do vetor é a posição 0.
Some os dois valores e divida por 2 para achar a posição que
corresponde à metade do vetor VET. Armazena o valor na
variável METADE.
Unidade 4
logica_2_livro_caderno.indb 85
85
7/12/2006 14:21:01
Universidade do Sul de Santa Catarina
METADE = (PRIMEIRA + ULTIMA)/2
PRIMEIRA: 0
ULTIMA: 4
METADE: (0 + 4)/2 = 2
10
44
PRIMEIRA
58
78
METADE
100
ULTIMA
4. Para o primeiro teste, “78 é igual a 58?” o resultado é falso.
Para o segundo teste, “78 é maior do que 58?” o resultado
é verdadeiro. Portanto, o valor que estamos procurando só
pode estar entre a metade do vetor VET até a posição final.
Como já verificamos que o valor na metade do vetor é 58, não
precisamos testá-lo novamente. Sendo assim, fazemos com que
a variável PRIMEIRA assuma o valor da variável METADE
mais um, ou seja, PRIMEIRA = METADE + 1, ficando
assim nossa nova estrutura:
10
44
58
78
100
PRIMEIRA
ULTIMA
Agora temos a seguinte composição de variáveis:
PRIMEIRA: METADE + 1, ou seja, 2 + 1 = 3
ULTIMA: 4
METADE: (3 + 4)/2 = 3 (é uma divisão de números inteiros, por isso o resultado é um
número inteiro, desconsiderando a parte fracionária). Podemos perceber que o valor
da variável PRIMEIRA é igual ao valor da variável METADE.
10
44
58
78
100
PRIMEIRA
METADE
ULTIMA
86
logica_2_livro_caderno.indb 86
7/12/2006 14:21:01
Lógica de Programação II
5. Para o teste “78 é igual a 78?”, o resultado é verdadeiro. Nesse
caso, o algoritmo deve imprimir a mensagem “o número
78 está na posição 3 do vetor”. Essa primeira parte está
concluída.
6. Não podemos nos esquecer de que o número digitado pode
estar entre a posição inicial do vetor e a metade do mesmo.
Temos que resolver essa situação também. Vejamos no caso do
número lido seja 10. A variável NUMEROLIDO armazena o
valor numérico 10.
7. Realizamos os mesmos passos para a procura do valor
numérico 10 através do vetor VET, reinicializando as
variáveis.
PRIMEIRA: 0
ULTIMA: 4
METADE: (0 + 4)/2 = 2
10
44
PRIMEIRA
58
78
METADE
100
ULTIMA
8. Para o primeiro teste, “10 é igual a 58?” o resultado é falso.
Para o segundo teste, “10 é maior do que 58?” o resultado é
falso. Para o terceiro teste “10 é menor do que 58?” o resultado
é verdadeiro. Portanto, o valor que estamos procurando só
pode estar entre a posição inicial do vetor até a sua metade.
Como já verificamos que o valor na metade do vetor é 58, não
precisamos testá-lo novamente. Assim, podemos testar até
METADE-1. Vamos atribuir esse valor à variável ULTIMA,
ou seja ULTIMA METADE –1, e teremos a seguinte
estrutura.
10
44
PRIMEIRA
ULTIMA
58
Unidade 4
logica_2_livro_caderno.indb 87
78
100
87
7/12/2006 14:21:02
Universidade do Sul de Santa Catarina
Agora temos a seguinte composição de variáveis:
PRIMEIRA: 0
ULTIMA: METADE – 1, ou seja, 2 – 1 = 1
METADE: (PRIMEIRA + ULTIMA)/2, ou seja, (0 + 1)/2 = 0
10
44
58
PRIMEIRA
METADE
ULTIMA
78
100
Para o teste “10 é igual a 10?”, o resultado é verdadeiro. Nesse
caso, o algoritmo deve imprimir a mensagem “o número 10 está
na posição 0 do vetor”.
Nosso processo lógico de encontrar um valor numérico através de
um vetor com valores numéricos ordenados em ordem crescente
está finalizado. Agora é com você. Realize as atividades de autoavaliação a seguir.
Síntese
Nesta unidade vimos estruturas de algoritmos um pouco mais
complexas. Dois mecanismos bastante utilizados em lógica
de programação são os métodos de procura e os métodos de
ordenação. Inicialmente vimos como ordenar um vetor com
valores numéricos e, após, vimos como realizar um busca por
valores contidos dentro de um vetor.
Você pôde observar dois tipos de procura: O método mais
simples é o seqüencial, onde percorremos todo o vetor até
encontrar o valor desejado. Esse método tem a vantagem de ser
simples, porém, pelo fato de precisar percorrer todo o vetor para
encontrar o número desejado, não é tão eficiente, caracterizando
como uma das principais desvantagens desse método. O outro
método que vimos foi o método da pesquisa binária, aplicada
somente para vetores com valores ordenados em ordem crescente.
O método consiste em dividir o vetor pela metade e verificar
se o valor que estamos procurando está exatamente na metade
do vetor, ou acima ou abaixo da metade encontra. Caso esteja
88
logica_2_livro_caderno.indb 88
7/12/2006 14:21:02
Lógica de Programação II
acima ou abaixo da metade, dividimos o vetor novamente até que
o número seja encontrado. É um método bastante eficiente de
procura, porém há a necessidade de que o mesmo esteja ordenado
em ordem crescente.
Nossos algoritmos estão ficando grandes e complexos. É hora
de estruturá-los de forma a ficarem mais fáceis de entender e
melhores de trabalhar. Na próxima unidade estaremos vendo uma
parte que dominou toda a década de 80 em relação aos estudos
de linguagem de programação: a estruturação ou modularização
de algoritmos.
Espero por você lá, então.
Atividades de auto-avaliação
1. Ler um vetor contendo 100 códigos relativos às mercadorias de um
armazém e outro relativo às quantidades de mercadorias. Imprimir os
códigos e as quantidades dos produtos, seguindo a ordem crescente
das quantidades.
Unidade 4
logica_2_livro_caderno.indb 89
89
7/12/2006 14:21:02
Universidade do Sul de Santa Catarina
2. Ler um vetor contendo 100 números, que correspondem à matrícula
de alunos. Ler 5 matrículas e verificar se os alunos com essas matrículas
estão matriculados ou não.
90
logica_2_livro_caderno.indb 90
7/12/2006 14:21:02
Lógica de Programação II
3. Monte um algoritmo em pseudocódigo que implemente os processos
lógicos descritos anteriormente. Esse é um algoritmo de pesquisa
binária.
Unidade 4
logica_2_livro_caderno.indb 91
91
7/12/2006 14:21:02
Universidade do Sul de Santa Catarina
4. Um cliente, gerente de supermercado, possui um programa via Web
que permite cadastrar as mercadorias e as quantidades respectivas
para controle de estoque em ordem aleatória. O supermercado possui
um total de 100 mercadorias para serem cadastradas. O cliente
está solicitando um algoritmo para imprimir as mercadorias e as
quantidades em ordem crescente de quantidades disponíveis. Esse
algoritmo será utilizado no programa já existente no supermercado.
Faça esse algoritmo solicitado e comente-o sempre que necessário. O
cliente deverá entender sua solução por completo, tendo em vista que
ele será o programador da solução proposta por você.
92
logica_2_livro_caderno.indb 92
7/12/2006 14:21:02
Lógica de Programação II
Saiba mais
MANZANO, José Augusto N. G.; OLIVEIRA, Jayr
Figueiredo de. ALGORITMOS: lógica para desenvolvimento
de programação. 9. ed.
MANZANO, José Augusto N. G. Lógica Estruturada para
Programação de Computadores.
BORATTI, Isaias Camilo; OLIVEIRA, Álvaro Borges de.
Introdução à Programação e Algoritmos. 2. ed. Ampliada e
atualizada.
Unidade 4
logica_2_livro_caderno.indb 93
93
7/12/2006 14:21:02
logica_2_livro_caderno.indb 94
7/12/2006 14:21:02
UNIDADE 5
Programação estruturada
5
Objetivos de aprendizagem
Entender os conceitos de programação estruturada.
Aplicar modularização aos algoritmos.
Seções de estudo
Seção 1 Modularização: conceitos iniciais.
Seção 2 Modularização: retorno de valores e passagem de
parâmetros.
logica_2_livro_caderno.indb 95
7/12/2006 14:21:02
Universidade do Sul de Santa Catarina
Para início de conversa
Você está iniciando agora a última unidade da disciplina. Isso não
significa que os estudos acabaram por aqui. Muito pelo contrário,
acabaram de começar. No final desta unidade você estará pronto
para começar a se tornar um excelente programador Web. O
que estamos lhe oferecendo é apenas a base, independente da
linguagem de programação que você irá utilizar ou já utiliza.
Você precisa entender agora um dos conceitos que foi alvo de
muitos estudos em décadas passadas: a programação estruturada
ou programação modular. Esse tipo de programação surgiu
quando ocorreu a crise do software, por volta da década de 60.
Os programas de computadores se tornaram grandes e caros,
principalmente em relação à manutenção dos mesmos. Não
havia metodologia para a criação de programas de computadores.
A probabilidade de acontecerem erros na programação era
enorme, mesmo depois de o programa estar funcionando. Eram
necessárias manutenções diárias, aumentando substancialmente
os custos de desenvolvimento.
A tecnologia mudou, o mundo mudou, os problemas também
mudaram. Temos um grau bem maior de complexidade, e a
pressão por redução de custos fez com que os programadores
adotassem metodologias de desenvolvimento de software. Uma
dessas metodologias é a programação estruturada. O objetivo
principal da programação estruturada é decompor o problema
em partes ou blocos, fazendo com que cada bloco execute uma
função específica e, juntos, esses blocos formam o programa
como um todo. A proposta é desenvolver os algoritmos em partes
integradas, de forma a adquirirem maior legibilidade, facilidade
de uso e manutenção.
Por isso, nossa meta nesta unidade é a de decompor os problemas
em partes. Vamos dividir para poder conquistar, ou seja,
vamos transformar nossos algoritmos em uma forma bem mais
estruturada do que temos feito até agora.
O que você acha de iniciar, então?
96
logica_2_livro_caderno.indb 96
7/12/2006 14:21:03
Lógica de Programação II
SEÇÃO 1 - Modularização: conceitos iniciais
Quando nos deparamos com problemas complexos, a melhor
maneira de solucioná-los é decompô-lo em partes, ou seja,
resolver o problema em etapas para que possamos ter êxito no
final. A cada uma dessas partes bem definidas, que contribuem
para a solução do problema, chamamos de módulo.
Assim também são nossas soluções lógicas. Caso separemos
um problema em partes, podemos construir algoritmos
para cada uma das partes de forma bem definida
e independentes uma das outras. A essa técnica
de dividir os algoritmos em módulos chamados de
modularização.
- Retome primeiro o conceito de algoritmo em Lógica de
Programação I.
Para lembrar!
Um algoritmo é formalmente uma seqüência finita
de passos que levam a execução de uma tarefa.
Podemos pensar em algoritmo como uma receita,
uma seqüência de instruções, que tem a função de
atingir uma meta específica. Estas tarefas não podem
ser redundantes nem subjetivas na sua definição,
devendo ser claras e precisas.
Sendo assim, cada parte ou módulo construído deve ter as
mesmas características citadas, devendo cada módulo:
Implementar tarefas não-redundantes e nem subjetivas.
Ter uma função específica e clara.
Ser independente de todos os outros módulos de um
programa.
Ser testado e corrigido antes de ser integrado à solução
completa tendo em vista que é parte da solução lógica
do problema.
Poder ser utilizado em outros algoritmos que requerem
os mesmos procedimentos.
Unidade 5
logica_2_livro_caderno.indb 97
97
7/12/2006 14:21:03
Universidade do Sul de Santa Catarina
Veja um exemplo:
Imagine que você seja responsável por construir uma
página na intranet de uma empresa prestadora de serviços.
O programa deverá realizar a entrada de dados para cada
funcionário da empresa, irá executar o cálculo da folha
de pagamento e, por fim, irá emitir os contracheques e a
relação bancária.
Parece um problema bem mais complexo dos que
temos visto até agora, você concorda?
Pois bem, se quisermos implementar as mesmas soluções lógicas
até agora estudadas, vamos ter um programa grande e complexo,
sujeito a falhas e erros. Podemos separar o problema em
partes, construir pequenos módulos, testá-los e depois integrálos para alcançar o objetivo final. Com esse procedimento, a
complexidade dos algoritmos diminui, os testes se tornam rápidos
e a manutenção também diminui. Pode parecer estranho, mas os
resultados são de arregalar os olhos.
Voltando ao problema, temos que o nosso alvo é a construção de
um programa de mostrar a folha de pagamento. Vamos então
dividi-lo conforme figura a seguir:
98
logica_2_livro_caderno.indb 98
7/12/2006 14:21:03
Lógica de Programação II
FolhaPagamento constitui o nosso programa principal. Esse
programa é constituído de módulos chamados de EntradaDados,
Movimento e Saídas. Por sua vez, o Módulo EntradaDados é
constituído de dois outros módulos: Funcionários e Dependentes.
Cada módulo resolve um pequeno problema e pode ser
solucionado por uma pessoa diferente, diminuindo o tempo de
desenvolvimento.
O módulo Saída mostra a formatação do texto e formulário
no site da empresa. O módulo EntradaDados permite que
os dados cadastrais de funcionários e/ou dependentes
sejam entrados no programa. Cada um desses módulos
deve funcionar de maneira independente e precisa, ou seja,
sempre que precisarmos imprimir algo na tela, chamamos
o módulo responsável por isso, o módulo Saída. Se
precisarmos cadastrar um novo funcionário, chamamos
o módulo EntradaDados, e assim sucessivamente. Tudo
funciona por partes. Não preciso chamar o módulo
Movimento, se meu interesse é apenas mostrar os
resultados na saída ou na página da empresa.
Um fato importante: Os módulos são independentes, mas
todos eles estão integrados ao módulo que chamados de
módulo principal do programa em nosso exemplo o módulo
FolhaPagamento. A partir desse módulo é que os outros são
chamados para resolver problemas como entrada de dados,
impressão de resultados etc.
Lembra como era anteriormente? Entrávamos com
os dados, processávamos o algoritmo e mostrávamos
o resultado na saída? Agora, as coisas se tornaram
independentes. Chamamos apenas o módulo que
nos convier naquele momento, na seqüência em que
quisermos. É realmente uma forma estruturada de
trabalhar, percebeu?
De forma resumida, nossos programas terão agora um módulo
principal, chamado de programa principal e diversos outros
módulos que irão compor todo o programa. Cada módulo é
chamado a partir do programa principal. Quando um módulo é
chamado a partir do programa principal, os comandos definidos
Unidade 5
logica_2_livro_caderno.indb 99
99
7/12/2006 14:21:03
Universidade do Sul de Santa Catarina
dentro do módulo são executados. Quando finalizados, o controle
volta para o programa principal.
Nas linguagens de programação, cada módulo é chamado de
função.
Mas, o que é uma função?
Uma função é dita como sendo uma sub-rotina
ou módulo do algoritmo principal. Cada função é
independente uma da outra. Chamamos uma função
a partir do algoritmo principal. Dentro da função são
executados comandos que realizam alguma tarefa
específica. Quando todos os comandos dentro da
função forem executados, o controle do programa
volta para o programa principal. A partir do programa
principal, podemos chamar outras funções de
interesse também.
Por que usar funções ?
Para permitir o reaproveitamento de código já
construído por você ou por outros programadores.
Para evitar que um trecho de código que seja repetido
várias vezes dentro de um mesmo programa.
Para permitir a alteração de um trecho de código de
uma forma mais rápida. Com o uso de uma função é
preciso alterar apenas dentro da função que se deseja.
Para que os blocos do programa não fiquem grandes
demais e, por conseqüência, mais difíceis de entender.
Para facilitar a leitura do programa de uma forma mais
fácil.
Para separar o programa em partes (blocos) que
possam ser logicamente compreendidas de forma
isolada.
100
logica_2_livro_caderno.indb 100
7/12/2006 14:21:03
Lógica de Programação II
Com dúvida ainda? Não tem problema.
Acompanhe um exemplo bastante simples que
irá permitir que você entenda o que definimos
anteriormente. A exemplo dos algoritmos anteriores,
vamos elaborar um pseudocódigo para o seguinte
problema: queremos somar dois números quaisquer.
Conforme você já estudou até agora, uma solução
bastante simples para o caso seria a seguinte:
início
{declarando as variáveis}
N1, N2, SOMA: numérico
{entrada de dados}
escreva “Programa de soma de dois números”
escreva “Entre com o primeiro número:”
leia N1
escreva “Entre com o segundo número:”
leia N2
{processamento da soma}
SOMA N1 + N2
{mostrando a saída}
escreva “Resultado da soma =”, SOMA
escreva “Programa Finalizado”
fim
A soma dos dois números está sendo realizada no algoritmo ou
programa principal. Vamos considerar que as partes do algoritmo
anterior, que são responsáveis pela soma, sejam as partes de
entrada de dados, a soma propriamente dita, ou seja, SOMA N1 + N2, e a impressão do resultado, ou seja, escreva “Resultado
da soma =”, SOMA. Modularizar ou estruturar um programa
consiste na construção de módulos que irão compor o programa
como um todo e serão chamados a partir do programa principal.
A proposta é a seguinte: em vez de termos a operação soma
realizada dentro do programa principal, podemos construir uma
sub-rotina que faça somente essa operação, ou seja, somar dois
números e mostrar o resultado final. Sempre que quisermos
somar dois números chamamos essa sub-rotina.
Unidade 5
logica_2_livro_caderno.indb 101
101
7/12/2006 14:21:03
Universidade do Sul de Santa Catarina
Nosso pseudocódigo ficaria mais ou menos assim:
início
escreva “Programa de soma de dois números”
CHAMADA DA FUNÇÃO FUNCAO_SOMA {quando chamamos a função
FUNCAO_SOMA o programa passa a executar os comandos dentro da
função. Finalizados os comandos dentro da função, o programa retorna para
o programa principal, continuando a executar os comandos aqui colocados
na seqüência. A sintaxe de uma função será estudada mais adiante.}
escreva “Programa Finalizado”
fim
FUNÇÃO_SOMA
início
{declarando as variáveis}
N1, N2, SOMA: numérico
{entrada de dados}
escreva “Entre com o primeiro número:”
leia N1
escreva “Entre com o segundo número:”
leia N2
{processamento da soma}
SOMA N1 + N2
{mostrando a saída}
escreva “Resultado da soma =”, SOMA
fim-função
102
logica_2_livro_caderno.indb 102
7/12/2006 14:21:04
Lógica de Programação II
Pontos a observar:
1. Observe onde estão definidas as variáveis antes e após
a modularização. Antes da modularização, as variáveis
estão definidas dentro do programa principal. Após a
modularização, as variáveis estão definidas dentro da função
FUNCAO_SOMA. Isso é apenas para colocar o seguinte:
as variáveis são definidas onde elas são utilizadas. Mais
importante, uma variável definida no programa principal não
é reconhecida na função FUNCAO_SOMA, e uma variável
definida na função FUNCAO_SOMA não é reconhecida
no programa principal. A isso damos o nome de variáveis
locais. Por exemplo, em nosso algoritmo principal anterior,
o comando de escrita do valor numérico da variável N1 está
errado.
início
escreva “Programa de soma de dois números”
CHAMADA DA FUNÇÃO FUNCAO_SOMA
escreva “O Valor de N1 =”, N1 {errado pois N1 não está definida dentro
do programa principal}
escreva “Programa Finalizado”
fim
O porquê disso? A resposta é que a variável N1 está definida
dentro da função FUNCAO_SOMA e não dentro do programa
principal.
2. Assim que a função é chamada, os comandos dentro da função
são executados, ou seja, as variáveis N1, N2 e SOMA são
criadas, são executados os comandos de entrada de dados
(escreva e leia), é realizado a soma de N1 com N2 e o valor
armazenado na variável SOMA, e por fim, o valor é impresso.
Quando os comandos são finalizados encontrando o comando
fim da função, o programa volta para o programa principal.
Mas o que acontece com as variáveis locais? Elas são
destruídas. É isso mesmo. São destruídas e recriadas sempre
que a função FUNCAO_SOMA for chamada. Por isso não
podemos acessar essas variáveis a partir do programa principal.
Dentro da função FUNCAO_SOMA as variáveis locais N1,
N2 e SOMA são criadas no início e destruídas no fim.
Unidade 5
logica_2_livro_caderno.indb 103
103
7/12/2006 14:21:04
Universidade do Sul de Santa Catarina
3. Podemos criar variáveis no programa principal com os
mesmos nomes das variáveis da função FUNCAO_SOMA?
A resposta é sim. Elas são variáveis locais e uma nada tem a
ver com a outra. Assim, nosso pseudocódigo principal estaria
correto:
início
{declarando variável N1}
N1: numérico
N1 10
escreva “Programa de soma de dois números”
CHAMADA DA FUNÇÃO SOMA
escreva “O Valor de N1 =”, N1 {agora está correto pois a variável N1
está definida dentro do programa principal. Essa variável local é diferente
da variável local definida na função SOMA.}
escreva “Programa Finalizado”
fim
4. Podemos chamar a função FUNCAO_SOMA quantas vezes
quisermos. Veja o pseudocódigo abaixo:
início
escreva “Programa de soma de dois números”
CHAMADA DA FUNÇÃO FUNCAO_SOMA {primeira chamada da função
FUNCAO_SOMA}
CHAMADA DA FUNÇÃO FUNCAO_SOMA {segunda chamada da função
FUNCAO_SOMA}
CHAMADA DA FUNÇÃO FUNCAO_SOMA {terceira chamada da função
FUNCAO_SOMA}
escreva “Programa Finalizado”
fim
Esta é uma das vantagens da modularização: construímos a
função uma vez e chamamos quantas vezes quisermos.
5. O nome FUNCAO_SOMA foi escolhido apenas para mostrar
que estamos nos referindo a uma função cuja função seja a
de somar dois números. Não é necessário colocar a palavra
FUNCAO. Poderíamos ter definido a função como FSOMA,
104
logica_2_livro_caderno.indb 104
7/12/2006 14:21:04
Lógica de Programação II
SOMAS, ou outro nome qualquer. Não poderíamos chamar
a função de SOMA apenas porque criamos uma variável
também chamada de SOMA. O que quero dizer é que não
podemos ter o mesmo nome significando coisas diferentes
(função ou variável).
SEÇÃO 2 - Modularização: retorno de valores e
passagem de parâmetros
Na seção 1 vimos um algoritmo de função bastante simples que
permite implementar a soma de dois números. Todo o processo
de entrada, cálculo da soma e escrita do resultado é feito na
função FUNCAO_SOMA.
No entanto, se perguntássemos o que realmente a
função FUNCAO_SOMA deve fazer, qual a função
principal da função FUNCAO_SOMA, qual seria sua
resposta?
Se você respondeu que a função FUNCAO_SOMA deve somar
e somente somar dois números você acertou. Observe que dentro
da função FUNCAO_SOMA temos comandos de entrada e
saída, além da soma propriamente dita.
Veja o seguinte exemplo:
Você quer somar dois números quaisquer mas não deseja
imprimir o resultado na tela do seu computador, isso porque a
soma dos dois números serve apenas para verificar se o resultado
é um número superior ou abaixo de 10, por exemplo. Para esse
caso, a nossa função FUNCAO_SOMA não serve, sabe por
quê? Por que além de somar os dois números e função, também
imprime o resultado na tela. Ou seja, estamos atribuindo à
função FUNCAO_SOMA funções que na verdade não lhe
pertencem. A função FUNCAO_SOMA deve somar, e tão
somente somar, dois números. Dados de entrada e saída devem
ser feitos à parte. Isso vai nos levar ao tema de Passagem de
Unidade 5
logica_2_livro_caderno.indb 105
105
7/12/2006 14:21:04
Universidade do Sul de Santa Catarina
parâmetros e retorno de valores a partir das funções. Podemos
imaginar uma função como sendo uma caixa que aceita valores,
processa-os e retorna um resultado para o programa principal.
Se utilizarmos o mesmo exemplo da função FUNCAO_SOMA,
o seguinte esquema nos mostra onde estamos querendo chegar:
Dois valores são passados para a função FUNCAO_SOMA, N1
e N2. A função realiza a soma e retorna o valor (resultado) para
o programa principal. De onde vêm N1 e N2? Para onde vai o
valor da variável SOMA? É isso que vamos responder a partir de
agora.
Retornando valores de funções
Retornar um valor de uma função significa que o valor calculado
pela função pode ser lido no programa principal. Você deve estar
se perguntando: Como assim?
Veja o exemplo da função FUNCAO_SOMA. Queremos que a
função não imprima mais o resultado, ou seja, queremos eliminar
o comando escreva da função FUNCAO_SOMA. Quem irá
imprimir o resultado da soma será o programa principal.
Conforme disse na seção 1, a variável SOMA é criada sempre
que a função FUNCAO_SOMA é chamada. Ao finalizar a
função com o comando fim, a variável SOMA é destruída e não
podemos acessar mais seu conteúdo. No entanto, ainda assim é
possível ler seu valor antes mesmo da variável ser destruída.
O que estamos querendo dizer é que é possível ler o valor da
variável SOMA no momento em que chamamos a função
FUNCAO_SOMA no programa principal.
106
logica_2_livro_caderno.indb 106
7/12/2006 14:21:04
Lógica de Programação II
Veja como isso pode ser feito:
FUNÇÃO_SOMA
início
{declarando as variáveis}
N1, N2, SOMA: numérico
{entrada de dados}
escreva “Entre com o primeiro número:”
leia N1
escreva “Entre com o segundo número:”
leia N2
{processamento da soma}
SOMA N1 + N2
{em vez de imprimir o resultado na tela, vamos retornar o valor da
variável SOMA para o programa principal. Esse valor vai ser retornado
para a linha de comando onde a função FUNCAO_SOMA é chamada.
O comando que executamos nesse caso é o comando retorna
<identificador> onde identificador é o nome de uma variável
definida dentro da função}
retorna SOMA.
fim-função
No programa principal, podemos ter:
início
{declaração da variável}
RESULTADO: numérico
escreva “Programa de soma de dois números”
{observe o comando a seguir: Ele nos indica que o valor retornado pela
função FUNCAO_SOMA é armazenado na variável RESULTADO, variável
essa declarada no programa principal. Com isso, podemos ler o conteúdo
da variável SOMA declarada na função FUNCAO_SOMA.}
RESULTADO CHAMADA DA FUNÇÃO FUNCAO_SOMA
Unidade 5
logica_2_livro_caderno.indb 107
107
7/12/2006 14:21:04
Universidade do Sul de Santa Catarina
{Vamos supor que estamos entrando com os números 2 e 3 e queremos
somá-los. Na chamada da função FUNCAO_SOMA a função retorna o valor
da variável SOMA que é 5. Sendo assim, o comando ficaria RESULTADO 5}
{Importante: O valor retornado por uma função somente pode ser
lido no momento em que ela é chamada. Os comandos a seguir estão
completamente errados:
CHAMADA DA FUNÇÃO FUNCAO_SOMA
RESULTADO SOMA.
Você sabe por quê? Por dois motivos básicos. Quando uma função
retorna um valor ela retorna na linha de comando em que ela é chamada.
Ao encontrar o comando CHAMADA DA FUNÇÃO FUNCAO_SOMA, a função
é chamada, e ao encontrar o comando retorna <identificador> dentro
da função, o valor de <identificador> é colocado na mesma linha que a
função é chamada. O segundo motivo é que a variável SOMA não pode
ser lida a partir do programa principal, tendo em vista que ela é definida
apenas na sub-rotina FUNCAO_SOMA.}
{podemos agora fazer o que quisermos com o resultado da soma, tendo
em vista que armazenamos o resultado na variável RESULTADO. Podemos
verificar se o valor da soma é maior ou igual a 10, por exemplo:
se RESULTADO > 10 então
escreva “A soma é maior que 10”
senão
escreva “A soma é menor ou igual a 10”. Também, podemos apenas
imprimi-lo conforme algoritmo anterior.}
escreva “Resultado da soma =”, RESULTADO
escreva “Programa Finalizado”
fim
Sem segredos não é mesmo?
Estamos com uma função (FUNCAO_SOMA) que tem duas
funções básicas: entrada de dados e a soma dos números.
A impressão fica a cargo do programa principal. Nosso próximo
passo é fazer com que a função FUNCAO_SOMA apenas some,
deixando a entrada de dados para o programa principal ou até
mesmo uma outra função qualquer.
108
logica_2_livro_caderno.indb 108
7/12/2006 14:21:05
Lógica de Programação II
Passando valores para funções
Até agora não nos preocuparmos com a sintaxe para a
implementação de uma função em pseudocódigo. Acho que é
mais importante entender o conceito agora do que mostrar a
sintaxe propriamente dita. Entendido o conceito de função, a
sintaxe é mero detalhe.
Vimos como voltar um valor de uma função. A
questão agora é: Podemos passar valores para dentro
de uma função, ou seja, podemos passar um valor de
uma variável definida dentro do programa principal
para uma função?
A resposta é sim. Perceba que estamos agora fazendo o caminho
da volta do que fizemos no item 2.1. A transferência de valores
para dentro de uma função se dá através de passagem por
parâmetros.
Mas o que significa passagem de parâmetros? Para responder essa
questão, voltamos à figura onde definimos um esquema para a
função FUNCAO_SOMA.
Vimos que SOMA representa o valor de retorno da função
FUNCAO_SOMA. Mas quem são N1 e N2? De onde vêm
essas variáveis? Pois bem, N1 e N2 são duas variáveis declaradas
fora da função FUNCAO_SOMA. Por exemplo, elas podem
estar declaradas dentro do programa principal de forma que a
entrada de dados não é mais realizada pela função FUNCAO_
SOMA e sim pelo programa principal. Poderiam estar definidas
em outra função qualquer também.
Unidade 5
logica_2_livro_caderno.indb 109
109
7/12/2006 14:21:05
Universidade do Sul de Santa Catarina
Para o nosso exemplo, vamos considerar que a entrada de
dados seja feita pelo programa principal.
Sabendo que as variáveis N1 e N2 armazenam dois
valores que queremos somar, e cuja operação de soma é
realizada pela função FUNCAO_SOMA, obviamente
temos que fazer com que esses dois valores possam ser
lidos dentro da função também. É sempre importante
lembrar que as variáveis são locais (definidas dentro
do programa principal) e não podem ser utilizadas
em quaisquer outras funções. A passagem dos valores
das variáveis N1 e N2 se dá através de passagem
de parâmetros. Os parâmetros de uma função são
variáveis locais definidas junto ao nome da função e servem
para receber valores de outras funções ou programa principal e
podem ser utilizados como variáveis locais dentro da função. Por
exemplo, quando definimos anteriormente a função FUNCAO_
SOMA, utilizamos a seguinte sintaxe provisória:
FUNCAO_SOMA
início
{declaração de variáveis locais}
{comandos da função}
fim-função
Os parâmetros de uma função são definidos junto ao nome da
função. Eles recebem valores que serão passados para a função no
momento em que é chamada no programa principal. Em nosso
programa de soma, a função FUNCAO_SOMA deve receber
dois valores para serem somados. Então, temos:
FUNCAO_SOMA( NUM1, NUM2 )
início
{declaração de variáveis locais}
{comandos da função}
fim-função
110
logica_2_livro_caderno.indb 110
7/12/2006 14:21:05
Lógica de Programação II
Perceba que os parâmetros NUM1 e NUM2 são colocados entre
parênteses após o nome da função. Podemos utilizar NUM1
e NUM2 dentro da função de modo que nos convier. Essas
variáveis são variáveis locais que servem para receber valores a
partir da chamada da função. Mostro um exemplo que explica
melhor. Veja o nosso programa principal:
início
N1, N2, RESULTADO: numérico
{vamos realizar a entrada pelo programa principal}
escreva “entre com o número 1”
leia N1
escreva “entre com o número 2”
leia N2
{N1 e N2 são duas variáveis locais que armazenam os valores que
queremos somar. Devemos, portanto, passar esses valores para dentro
da função FUNCAO_SOMA. Fizemos isso através da passagem de
parâmetros}
RESULTADO FUNCAO_SOMA (N1, N2) {Nesse momento, a função
FUNCAO_SOMA é chamada e o valor da variável N1 é armazenado na
variável NUM1 e o valor da variável N2 é armazenado na variável NUM2,
exatamente nessa seqüência. A função calcula a soma e retorna um valor,
cujo resultado é armazenado em RESULTADO.}
escreva “resultado da soma =”, RESULTADO
fim
Nossa função FUNCAO_SOMA é a seguinte: FUNCAO_
SOMA( NUM1, NUM2 )
início
{declaração de variáveis locais}
SOMA : numérico
{o parâmetro ou variável NUM1 armazena o valor da variável N1 e o
parâmetro ou variável NUM2 armazena o valor da variável N2}
SOMA NUM1 + NUM2 {observe aqui que estamos utilizando NUM1
e NUM2 como variáveis locais. Diferentemente das variáveis declaradas
dentro da função, os parâmetros da função servem para receber valores
no momento em que são chamadas. Uma observação importante é o
fato de não podermos definir variáveis locais com os mesmos nomes do
que os parâmetros da função. Em nosso exemplo, não podemos declarar
Unidade 5
logica_2_livro_caderno.indb 111
111
7/12/2006 14:21:05
Universidade do Sul de Santa Catarina
uma variável chamada NUM1 porque já está definida como parâmetro da
função}
retorna SOMA {retorna o valor da variável SOMA para a linha de
comando em que a função foi chamada}
fim-função
Se fôssemos montar um novo esquema para a função
FUNCAO_SOMA, teríamos:
No momento em que a função FUNCAO_SOMA é chamada,
os parâmetros da função (NUM1 e NUM2) são criados e são
passados os valores das variáveis N1 e N2 respectivamente.
Observe que estamos transferindo valores de N1 para
NUM1 e de N2 para NUM2. Isso significa que ambos
devem ser do mesmo tipo, ou seja, se N1 é numérico,
NUM1 também deve ser numérico. Se a variável N2
for literal, então NUM2 também deve ser literal.
Sintaxe da função
Bem, já conhecendo a importância de uma função e de como
ela é chamada, basta saber como implementar utilizando
pseudocódigo. Veja a sintaxe:
Sintaxe da função
função <nome da função> (< lista de parâmetros>):
<tipo de retorno>
112
logica_2_livro_caderno.indb 112
7/12/2006 14:21:05
Lógica de Programação II
Os termos utilizados nesse tipo de sintaxe são explicados a
seguir:
Função
Comando referente à função
<nome da função>
Nome da função que será declarada.
< lista de parâmetros>
Lista dos parâmetros que serão utilizados (se houver)
<tipo de retorno>
Tipo da variável que será retornada pela função declarada
(numérico, literal, lógico)
Observe como fica a função FUNCAO_SOMA utilizando a
sintaxe em pseudocódigo:
Nome da função: FUNCAO_SOMA
Lista de parâmetros: NUM1 e NUM2 do tipo numérico
Tipo de retorno: numérico
Desta forma, a sintaxe para a função FUNCAO_SOMA fica:
função FUNCAO_SOMA (NUM1, NUM2: numérico): numérico
Veja outros exemplos de declaração de função:
1. Função que recebe 4 notas e retorna a média.
função MEDIA (NOTA1, NOTA2, NOTA3, NOTA4: numérico): numérico
2. Função que recebe o nome e idade de uma pessoa e
retorna verdadeiro ou falso.
função CADASTRA (NOME: literal, IDADE: numérico): lógico
3. Função que recebe o nome de um mês e volta o mês em
número
função FUNCAO_MES ( MÊS: literal ): numérico
Unidade 5
logica_2_livro_caderno.indb 113
113
7/12/2006 14:21:05
Universidade do Sul de Santa Catarina
Acompanhe mais alguns exemplos de funções. O interesse aqui
é apenas verificar a implementação das funções. Você poderá
construir qualquer tipo de programa que chame essas funções
da maneira que você quiser, quantas vezes quiser e onde quiser.
Por isso é que chamamos de modularização. Fazemos uma vez e
podemos usar várias.
1. Criar uma função para receber o ano corrente e
o ano de nascimento de uma pessoa. Em seguida,
retornar a idade da pessoa.
Pseudocódigo:
função IDADE (ANOCORRENTE, ANONASCIMENTO: numérico):
numérico
retorna ANOCORRENTE – ANONASCIMENTO
fim-função
2. Criar uma fração para receber o valor de uma
determinada temperatura em graus Fahrenheit e
retornar o valor correspondente em Centígrados. A
fórmula de conversão é C = 5/9 (F-32).
Pseudocódigo:
função CELSUIS (FAHRENHEIT : numérico) : numérico
retorna (5/9) * (FAHRENHEIT - 32)
fim-função
3. Um exemplo bastante interessante é o
desenvolvimento de um algoritmo para
implementação de menus de entrada, ou seja, a
elaboração de opções que permitam o usuário entrar
com os dados de acordo com a seleção de um item.
- Bem, agora você está mesmo finalizando os estudos de lógica de
programação. Foi um desafio e tanto não?
114
logica_2_livro_caderno.indb 114
7/12/2006 14:21:06
Lógica de Programação II
Mas o estudo não deve terminar por aqui. O que você conheceu
e aprendeu é apenas o “ponta-pé” inicial para aprofundamentos
futuros. Lembro novamente que, quanto mais exercícios
você fizer, melhor você será e se diferenciará dos outros
programadores. Um outro fato importante que recomendo é
que, ao estudar linguagem de programação, você não abandone
a lógica. Pense inicialmente em uma solução algorítmica. Isso
é pensar no problema de forma inteligente. Aliás, isso é ser
inteligente. Com a solução pensada, o programador terá apenas
trabalho de digitar a solução lógica encontrada em qualquer
linguagem de programação. Passa a ser um trabalho de digitação.
Faço uma última pergunta a você:
Você quer se tornar um profissional de programação
ou um digitador profissional?
Pense nisso quando estiver programando um website.
Um grande abraço e sucesso!
Síntese
Nesta unidade você viu que para a solução de problemas mais
complexos, devemos dividi-los em partes. Caso separemos um problema complexo em problemas menores, podemos construir algoritmos para cada um deles de forma bem definida, e fazer com que
eles sejam independentes um dos outros. A essa técnica de dividir
os algoritmos em módulos chamamos de modularização.
Cada módulo, quando bem elaborado, deve possuir uma série
de características: implementar tarefas não-redundantes e nem
subjetivas; ter uma função específica e clara; ser independente de
todos os outros módulos de um programa; ser testado e corrigido
antes de ser integrado à solução completa, tendo em vista que é
parte da solução lógica do problema.
Unidade 5
logica_2_livro_caderno.indb 115
115
7/12/2006 14:21:06
Universidade do Sul de Santa Catarina
Em pseudocódigo, utilizamos o conceito de função para modularizar um algoritmo. Uma função é dita como sendo uma
sub-rotina ou módulo do algoritmo principal. Cada função é
independente uma da outra. Chamamos uma função a partir do
algoritmo principal. A sintaxe para implementar uma função é a
seguinte:
função <nome da função> (< lista de parâmetros>): <tipo de retorno>
Onde a lista de parâmetros representa a forma de passagem de
valores para dentro da função. É o que chamamos de passagem
de valor ou passagem de parâmetros por valor. A função também
pode retornar um valor. Esse valor é do tipo <tipo de retorno>,
podendo ser numérico, literal ou lógico.
Sempre que necessário, devemos utilizar funções para desenvolvimento de algoritmos. As grandes vantagens são:
Para permitir o reaproveitamento de código já
construído por você ou por outros programadores.
Para evitar que um trecho de código que seja repetido
várias vezes dentro de um mesmo programa.
Para permitir a alteração de um trecho de código de
uma forma mais rápida. Com o uso de uma função é
preciso alterar apenas dentro da função que se deseja.
Para que os blocos do programa não fiquem grandes
demais e, por conseqüência, mais difíceis de entender.
Para facilitar a leitura do programa de uma forma mais
fácil.
Para separar o programa em partes (blocos) que
possam ser logicamente compreendidas de forma
isolada.
116
logica_2_livro_caderno.indb 116
7/12/2006 14:21:06
Lógica de Programação II
Atividades de auto-avaliação
1. Utilizando o algoritmo anterior, implemente a função SUBTRACAO,
MULTIPLICACAO e DIVISAO. Elabore um programa principal que possa
chamar as funções de acordo com o que o usuário deseja. Por exemplo,
se o usuário digitar 1, a função SUBTRACAO é chamada, se o usuário
digitar 2, a função MULTIPLICACAO é chamada, se o usuário digitar 3
a função DIVISAO é chamada. Qualquer outro número, o programa
deverá indicar uma mensagem de erro e solicitar com que o usuário
digite 1, 2 ou 3 novamente.
Unidade 5
logica_2_livro_caderno.indb 117
117
7/12/2006 14:21:06
Universidade do Sul de Santa Catarina
2. Na atividade 1, altere os algoritmos de cada função de forma que as
mesmas retornem os valores por elas calculados. O programa principal
é que deverá imprimir o resultado de saída, qualquer que seja a
operação escolhida (subtração, multiplicação ou divisão).
118
logica_2_livro_caderno.indb 118
7/12/2006 14:21:06
Lógica de Programação II
3. Elaborar uma função que calcule o maior número entre três valores. A
função deve aceitar três parâmetros e retornar o maior valor entre eles.
A entrada de dados e a impressão do resultado devem ser feitas no
programa principal.
Unidade 5
logica_2_livro_caderno.indb 119
119
7/12/2006 14:21:06
Universidade do Sul de Santa Catarina
Saiba mais
Para aprofundar os estudos leia os livros indicados a seguir.
MANZANO, José Augusto N. G. LÓGICA estruturada para
programação de computadores.
XAVIER, Gley Fabiano Cardoso. Lógica de Programação.
MANZANO, José Augusto N. G. Algoritmos: lógica para desenvolvimento de programação de computadores.
120
logica_2_livro_caderno.indb 120
7/12/2006 14:21:06
Para concluir o estudo
Você chegou ao final da disciplina de Lógica de
Programação II. Foram 120 horas de estudos de
algoritmos de programação. O objetivo principal foi
estudar as principais estruturas lógicas de programação
e perceber a importância de realizar um projeto de
qualquer software através de algoritmos.
Pois bem, gostaria de enfatizar que o conteúdo não
terminou, muito pelo contrário, você está agora apto para
se aprofundar em algoritmos de programação. Por isso,
agora é com você, nobre estudante. Siga em frente! Se
você quiser realmente ser um programador diferenciado
no mercado, passo o bastão para você. A corrida é sua
agora. Tenho certeza também que a vitória virá. Não
se esqueça disso, quanto mais você estiver preparado em
lógica de programação, melhor você será, independente
de qualquer linguagem de programação que você poderá
vir a utilizar. Esse é realmente o diferencial de um bom
programador. Não seja apenas um digitador, seja um
pensador, por isso, saiba bem lógica de programação.
Um grande abraço e até a próxima oportunidade.
Professor Carlos Fernando Martins.
logica_2_livro_caderno.indb 121
7/12/2006 14:21:06
logica_2_livro_caderno.indb 122
7/12/2006 14:21:06
Referências
MANZANO, José Augusto N. G.; OLIVEIRA, Jayr Figueiredo
de. ALGORITMOS: lógica para desenvolvimento de
programação. 9. ed. São Paulo: Érica, 2000. 265 p.
ABE, Jair Minoro; SCALZITTI, Alexandre,; SILVA FILHO, João Inácio
da,. Introdução à lógica para a ciência da computação. 2. ed.
São Paulo: Arte & Ciência, 2002. 247 p.
WARNIER, Jean-Dominique. LCP - Lógica de Construção de
Programas: um método de programação estruturada. 3. ed.
Rio de Janeiro: Campus, 1984. 185 p.
UCCI, Waldir; SOUSA, Reginaldo Luiz; KOTANI, Alice Mayumi.
LÓGICA de programação: os primeiros passos. 8. ed. São
Paulo: Érica, 1999. 339 p.
FORBELLONE, André Luiz Villar; EBERSPÄCHER, Henri Frederico.
LÓGICA de programação: a construção de algoritmos e
estruturas de dados. 2. ed. rev. e atual. São Paulo: Makron
Books, 2000. 197 p.
MANZANO, José Augusto N. G. LÓGICA estruturada para
programação de computadores. São Paulo: Érica, 2002. 180 p.
logica_2_livro_caderno.indb 123
7/12/2006 14:21:06
logica_2_livro_caderno.indb 124
7/12/2006 14:21:07
Sobre o professor conteudista
Carlos Fernando Martins
Engenheiro de Controle e Automação Industrial pela
Universidade Federal de Santa Catarina – UFSC
(1990-1995); Mestre em Engenharia Elétrica pelo
Departamento de Automação e Sistemas da UFSC
(1995-1996); Doutorando no Departamento de
Engenharia Mecânica da UFSC (início em 2001)
na Área de Concentração: Sistemas de Produção da
Manufatura. Professor da Faculdade de Tecnologia
do SENAI Florianópolis nas disciplinas de Lógica
de Programação, Programação Orientada a Objetos,
Linguagens de Programação C/C++ e UML; Professor
de cursos de Pós Graduação em nível de especialização
em automação industrial (Sistemas Discretos da
Manufatura, Integração de Sistemas da Manufatura,
Sistemas da Informação).
logica_2_livro_caderno.indb 125
7/12/2006 14:21:07
logica_2_livro_caderno.indb 126
7/12/2006 14:21:07
Respostas e comentários das
atividades de auto-avaliação
Unidade 1
1) temperaturas: vetor[25] numérico
2) nomes: vetor[150] literal
3) produtos: vetor[2500] literal
4) Pseudocódigo do programa de reserva de vôos
início
{declaração de variáveis}
NUM_VOOS, I, NVD: numérico {NVD = número do vôo desejado}
vetor: VOOS[500] numérico {supondo 500 vôos ao dia. Cada posição do vetor
armazena o número de lugares disponíveis}
RG: literal
{início do programa}
escreva “Especifique o número de vôos disponíveis”
leia NUM_VOOS
para I de 0 até NUM_VOOS-1 passo 1 faça
escreva “Especifique a quantidade de lugares disponíveis para
o vôo:”, I+1
leia VOOS[ I ]
fim-para
{processamento}
escreva “Entre com o número do vôo ou –1 para sair:”
leia NVD {leitura do número do vôo desejado pelo cliente}
enquanto NVD <> -1 faça
se (NVD >= 0 E NVD < NUM_VOOS) então
se VOOS[ NVD ] > 0 então {há lugares disponíveis}
VOOS[ NVD ] VOOS[ NVD ] – 1 {1 lugar ocupado no vôo}
logica_2_livro_caderno.indb 127
7/12/2006 14:21:07
Universidade do Sul de Santa Catarina
escreva “Entre com o RG do passageiro:”
leia RG
senão
escreva “Não há lugares disponíveis no vôo”, NVD
fim-se
senão
escreva “Não existe esse vôo”,
fim-se
escreva “Entre com o número do vôo ou –1 para sair:”
leia NVD
fim-enquanto
fim
Unidade 2
1) Pseudocódigo
início
NOMES : vetor [27] literal
DISTANCIAS : matriz [27][27] numérico
LINHA, COLUNA : numérico
CAPITAL1, CAPITAL2 : literal
para LINHA de 0 até 26 passo 1 faça
escreva “Digite o nome de uma capital: “
leia NOMES[LINHA]
fim-para
para LINHA de 0 até 26 passo 1 faça
para COLUNA de 0 até 26 passo 1 faça
se LINHA = COLUNA então
DISTANCIAS[LINHA][COLUNA] 0
senão
escreva “Digite a distância (kms) entre “,NOMES[LINHA], “ e “,
NOMES[COLUNA]
128
logica_2_livro_caderno.indb 128
7/12/2006 14:21:07
Lógica de Programação II
leia DISTANCIAS[LINHA][COLUNA]
fim-se
fim-para
fim-para
escreva “Digite o nome da primeira capital escolhida:”
leia CAPITAL1
escreva “Digite o nome da segunda capital escolhida:”
leia CAPITAL2
LINHA 0
enquanto NOMES[LINHA] <> CAPITAL1 ou LINHA <= 27 faça
LINHA LINHA + 1
fim-enquanto
COLUNA 0
enquanto NOMES[COLUNA] <> CAPITAL2 ou COLUNA <= 27 faça
COLUNA COLUNA + 1
fim-enquanto
se LINHA <= 27 então
se COLUNA <= 27 então
escreva “A distância entre “,CAPITAL1,” e “,CAPITAL2,” é de “,
DISTANCIAS[LINHA][COLUNA], “kms.”
senão
escreva “Nome “,CAPITAL2,” não consta no cadastro!”
fim-se
senão
escreva “Nome “,CAPITAL1,” não consta no cadastro!”
fim-se
fim
129
logica_2_livro_caderno.indb 129
7/12/2006 14:21:07
Universidade do Sul de Santa Catarina
Unidade 3
1) Declaração de um registro de um hóspede de um hotel de luxo:
FICHA: registro
NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO, EMAIL, MOTIVO_
VIAGEM: literal
TELEFONE, NUM_RESERVAS: numérico
fim-registro
2) Algoritmo de um sistema de administração escolar:
início
{declaração do registro FICHA}
FICHA: registro
{variáveis da ficha}
NOME, ENDERECO, CIDADE, ESTADO, CEP, CPF, RG, DATA_NASC, CURSO: literal
TELEFONE, GRAU_ESC: numérico
fim-registro
CONT, NUM_PROF: numérico {especifica o número de professores a serem cadastrados}
CADASTRO: vetor[0..199] FICHA {permite armazenar até 200 professores. As
posições do vetor vão de 0 até 199}
escreva “Entre com o número de professores a serem cadastrados”
leia NUM_PROF
para CONT de 0 até NUM_PROF-1 passo 1 faça
{entrada de dados}
escreva “Nome do Professor:”
leia CADASTRO[CONT].NOME
escreva “CPF do Professor:”
leia CADASTRO[CONT].CPF
escreva “RG do Professor:”
leia CADASTRO[CONT].RG
escreva “Data de Nascimento do Professor:”
leia CADASTRO[CONT].DATA_NASC
escreva “Grau de Escolaridade:”
leia CADASTRO[CONT].GRAU_ESC
escreva “Curso do Professor:”
leia CADASTRO[CONT].CURSO
escreva “Endereço:”
leia CADASTRO[CONT].ENDERECO
escreva “Cidade:”
130
logica_2_livro_caderno.indb 130
7/12/2006 14:21:07
Lógica de Programação II
leia CADASTRO[CONT].CIDADE
escreva “Estado:”
leia CADASTRO[CONT].ESTADO
escreva “CEP:”
leia CADASTRO[CONT].CEP
escreva “Telefone de Contato:”
leia CADASTRO[CONT].TELEFONE
fim-para
fim
3) Algoritmo de um sistema de cadastro de uma Vídeo Locadora:
início
{declaração do registro FICHA}
VIDEO: registro
{variáveis da ficha}
NOME, CODIGO, TIPO, PRODUTOR, ATOR, DIRETOR: literal
DURACAO, ANO: numérico
fim-registro
FITAS: vetor[0..499] VIDEO {permite cadastrar até 500 fitas de vídeo}
NUM_FITAS, CONT: numérico
{entrada de dados}
escreva “Entre com o número de fitas a serem cadastradas”
leia NUM_FITAS
para CONT de 0 até NUM_FITAS-1 passo 1 faça
escreva “Entre com o nome do filme:”
leia FITAS[CONT].NOME
escreva “Entre com o código do filme:”
leia FITAS[CONT].CODIGO
escreva “Entre com o tipo de filme:”
leia FITAS[CONT].TIPO
escreva “Entre com o nome do produtor:”
leia FITAS[CONT].PRODUTOR
escreva “Entre com o nome do ator principal:”
leia FITAS[CONT].ATOR
escreva “Entre com o nome do diretor do filme:”
leia FITAS[CONT].DIRETOR
escreva “Entre com o tempo de duração do filme:”
leia FITAS[CONT].DURACAO
escreva “Entre com o ano da produção:”
leia FITAS[CONT].ANO
fim-para
131
logica_2_livro_caderno.indb 131
7/12/2006 14:21:07
Universidade do Sul de Santa Catarina
{resultados de saída}
para CONT de 0 até NUM_FITAS-1 passo 1 faça
{resultado de saída do algoritmo. Perceba que vamos colocar as principais
saídas tudo no mesmo comando}
escreva “O filme”, FITAS[CONT].NOME, “do produtor”, FITAS[CONT].
PRODUTOR, “é um”, FITAS[CONT].TIPO, “com uma duração de”, FITAS[CONT].
DURACAO, “.Estrelando o ator”, FITAS[CONT].ATOR “.O filme foi produzido no
ano de”, FITAS[CONT].ANO
fim-para
fim
4) Cadastro de 200 funcionários de uma empresa.
Pseudocódigo:
início
tipo FICHA = registro
NOME, ENDERECO, CIDADE, UF, RG, CURSO, GRAU_ESC, CONJUGE : literal
CODIGO,CEP, DEPENDENTES, FONE, CPF, DATA_NASC : numérico
fim-registro
FUNCIONARIOS : vetor [0..199] FICHA
CODIGOCONSUL, CONT, POS : numérico
para POS de 0 até 199 passo 1 faça
escreva “Especifique o código do funcionário:”
leia FUNCIONARIOS[POS].CODIGO
escreva “Digite o nome do funcionário:”
leia FUNCIONARIOS[POS].NOME
escreva “Especifique o endereço:”
leia, FUNCIONARIOS[POS].ENDERECO
escreva “Espeficique a cidade onde funcionário reside:”
leia FUNCIONARIOS[POS].CIDADE
escreva “Especifique o estado:”,
leia FUNCIONARIOS[POS].UF
escreva “Especifique o CEP:”
leia FUNCIONARIOS[POS].CEP
escreva “Especifique o telefone”
leia FUNCIONARIOS[POS].FONE
132
logica_2_livro_caderno.indb 132
7/12/2006 14:21:07
Lógica de Programação II
escreva “Digite CPF”
leia FUNCIONARIOS[POS].CPF
escreva “Especifique R.G.:”,
leia FUNCIONARIOS[POS].RG
escreva “Digite a data de nascimento”
leia FUNCIONARIOS[POS].DATA_NASC
escreva “Digite o grau de escolaridade:”
leia FUNCIONARIOS[POS].GRAU_ESC
escreva “Digite o nome do cônjuge:”
leia FUNCIONARIOS[POS].CONJUGE
escreva “Digite o número de dependentes:”
leia FUNCIONARIOS[POS].DEPENDENTES
fim-para
para CONT de 1 até 20 passo 1 faça
escreva “Digite o código do funcionário a ser consultado:”
leia CODIGOCONSUL
POS 0
enquanto CODIGOCONSUL < > FUNCIONARIOS[POS].CODIGO OU POS < 200
POS POS + 1
fim-enquanto
se CODIGOCONSUL = FUNCIONARIOS[POS].CODIGO então
escreva “Nome:”, FUNCIONARIOS[POS].NOME
escreva “Endereço:”, FUNCIONARIOS[POS].ENDERECO
escreva “Telefone:”, FUNCIONARIOS[POS].FONE
senão
escreva “Código do funcionário não consta no cadastro”
fim-se
fim-para
fim
5) A Primeira Maneira, declaramos as variáveis individualmente e a
segunda maneira, colocamos as variáveis em um bloco. A praticidade
do segundo tipo está na possibilidade de você criar novas variáveis
em vez de declarar os dados ou estrutura várias vezes. Facilita na
construção de estrutura de dados. Conforme você pode ver na
seqüência do exercício, para criar uma estrutura de dados utilizando
a segunda maneira, basta criarmos um vetor e/ou matriz daquela
estrutura. Você terá um vetor onde cada posição é um registro de
dados, e cada registro possui campos (variáveis) onde são armazenados
os valores.
133
logica_2_livro_caderno.indb 133
7/12/2006 14:21:08
Universidade do Sul de Santa Catarina
Unidade 4
1) Pseudocódigo
início
CODIGOPRODUTO : vetor[100] literal
QUANTIDADE : vetor[100] numérico
POS, ULTIMO, AUX1 : numérico
AUX2 : literal
para POS de 0 até 99 passo 1 faça
escreva “Entre com o código da mercadoria: “
leia CODIGOPRODUTO[POS]
fim-para
para POS de 0 até 99 passo 1 faça
escreva “Entre com a quantidade: “
leia QUANTIDADE[POS]
fim-para
POS 0
ULTIMO 99
AUX 0
enquanto ULTIMO < > 1 faça
enquanto POS < > (ULTIMO - 1) faça
se QUANTIDADE[POS] > QUANTIDADE[POS+1] então
AUX1 QUANTIDADE[POS]
AUX2 CODIGOPRODUTO[POS]
QUANTIDADE[POS] QUANTIDADE[POS+1]
CODIGOPRODUTO[POS] CODIGOPRODUTO[POS+1]
QUANTIDADE[POS+1] AUX1
CODIGOPRODUTO[POS+1] AUX2
senão
POS POS + 1
fim-se
fim-enquanto
POS 1
ULTIMO ULTIMO - 1
fim-enquanto
134
logica_2_livro_caderno.indb 134
7/12/2006 14:21:08
Lógica de Programação II
escreva “Imprimindo os códigos e as quantidades em ordem crescente.”
para POS de 0 até 99 passo 1 faça
escreva CODIGOPRODUTO[POS]
escreva QUANTIDADE[POS]
fim-para
fim
2) Pseudocódigo
início
ALUNOS : vetor[100] numérico
POS, PESQUISADO, CONT :numérico
para POS de 0 até 99 passo 1 faça
escreva “Digite o código de matrícula de um aluno: “
leia ALUNOS[POS]
fim-para
{leitura de 5 números de matrícula}
para CONT de 1 até 5 passo 1 faça
escreva “Digite o número de matrícula a ser pesquisado: “
leia PESQUISADO
POS 0
{o comando repita está sendo utilizado para percorrer o vetor ALUNOS}
repita
POS POS + 1
até que PESQUISADO = ALUNOS[POS] ou POS > 99
se POS > 99 então
escreva “Número não cadastrado !”
senão
escreva “Número localizado na posição “,POS,” do vetor.”
fim-se
fim-para
fim
135
logica_2_livro_caderno.indb 135
7/12/2006 14:21:08
Universidade do Sul de Santa Catarina
3) início
VET: vetor[5] numérico
NUMEROLIDO, PRIMEIRA, ULTIMA, METADE: numérico
POS: numérico
ACHOU : lógico {variável que armazena verdadeiro quando o valor numérico for
encontrado no vetor. Caso contrário, armazena falso}
{preenchendo um vetor com números em ordem crescente}
para POS de 0 até 4 passo 1 faça
escreva “digite um número: “
leia VET[ POS ]
fim-para
escreva “digite um número a ser pesquisado : “
leia NUMEROLIDO
{inicialização das variáveis}
PRIMEIRA 0
ULTIMA 4
ACHOU falso
{processo de procura}
enquanto PRIMEIRA <= ULTIMA e não ACHOU faça
{cálculo da metade. Utilizamos a função aritmética DIV para realizar
uma divisão inteira, Veja Lógica de Programação I}
METADE DIV((PRIMEIRA + ULTIMA), 2)
{verifica se o número procurado já se encontra na metade. É o
primeiro teste}
se VET[ METADE ] = NUMEROLIDO então
ACHOU verdadeiro
fim-se
{caso o número procurado não esteja exatamente na metade o vetor,
verificamos se ele é maior do que esse número}
{Segundo teste}
se VET[ METADE ] < NUMEROLIDO então
PRIMEIRA METADE + 1
{Se ele não for maior, então só poderá ser menor do que o
número contido na metade do vetor. Terceiro teste}
senão
ULTIMA METADE – 1
136
logica_2_livro_caderno.indb 136
7/12/2006 14:21:08
Lógica de Programação II
fim-se
fim-enquanto
{verifica o valor lógico da variável ACHOU}
se ACHOU = verdadeiro então
escreva “Número “, NUMEROLIDO, “encontrado na posição “, METADE,
“ do vetor”
senão
escreva “Número não encontrado no vetor”
fim-se
fim
4) Algoritmo para cadastro de códigos e quantidades dos produtos,
seguindo a ordem crescente das quantidades.
Pseudocódigo:
início
COD_PRODUTO : vetor[0..99] literal {código do produto}
QTDE : vetor[0..99] numérico {quantidade de mercadoria}
POS, ULTIMO, AUX1 :numérico
AUX2 : literal
para POS de 0 até 99 faça
leia COD_PRODUTO[POS]
leia QTDE[POS]
fim-para
POS 0
ULTIMO 99
AUX 0
enquanto ULTIMO < > 1 faça
enquanto POS < > (ULTIMO - 1) faça
{mecanismos de ordenação de valores}
se QTDE[POS] > QTDE[POS+1] então
AUX1 QTDE[POS]
AUX2 COD_PRODUTO[POS]
QTDE[POS] QTDE[POS+1]
COD_PRODUTO[POS] COD_PRODUTO[POS+1]
QTDE[POS+1] AUX1
COD_PRODUTO[POS+1] AUX2
137
logica_2_livro_caderno.indb 137
7/12/2006 14:21:08
Universidade do Sul de Santa Catarina
senão
POS POS + 1
fim-se
fim-enquanto
POS 1
ULTIMO ULTIMO - 1
fim-enquanto
escreva “Imprimindo os códigos e as quantidades em ordem crescente.”
para POS de 0 até 99 faça
escreva COD_PRODUTO[POS]
escreva QTDE[POS]
fim-para
fim
Unidade 5
1) Implementando a função SUBTRACAO, MULTIPLICACAO e DIVISAO sem
retorno de valores.
Pseudocódigo
início
{declaração de variáveis}
OPCAO, N1, N2: numérico
OPCAO 1
enquanto OPCAO < > 4 faça
escreva “Menu de Opções”
escreva “1. Subtração”
escreva “2. Multiplicação”
escreva “3. Divisão”
escreva “4. Sair”
escreva “Selecione uma opção: ”
leia OPCAO
leia N1
leia N2
se OPCAO < > 4 faça
se OPCAO = 1 então
{operação de subtração}
SUBTRACAO (N1, N2)
138
logica_2_livro_caderno.indb 138
7/12/2006 14:21:08
Lógica de Programação II
Senão
se OPCAO = 2 então
{operação de Multiplicação}
MULTIPLICACAO (N1, N2)
Senão
se OPCAO = 3 então
{operação de divisão}
DIVISAO (N1, N2)
senão
escreva “Opção errada. Digite novamente”
fim-se
fim-se
fim-se
fim-se
fim-enquanto
fim
{implementação das funções}
função SUBTRACAO (NUM1, NUM2: numérico)
escreva “resultado =”, NUM1 – NUM2
fim-função
função MULTIPLICACAO (NUM1, NUM2: numérico)
escreva “resultado =”, NUM1*NUM2
fim-função
função DIVISAO (NUM1, NUM2: numérico)
se NUM2 < > 0 então {garante que a divisão nunca será feita por
zero}
escreva “resultado =” NUM1/NUM2
senão
escreva “não existe divisão por zero”
fim-se
fim-função
139
logica_2_livro_caderno.indb 139
7/12/2006 14:21:09
Universidade do Sul de Santa Catarina
2) Implementando a função SUBTRACAO, MULTIPLICACAO e DIVISAO
com retorno de valores.
Pseudocódigo
início
{declaração de variáveis}
OPCAO, NUM1, NUM2, RESULTADO: numérico
OPCAO 1
enquanto OPCAO < > 4 faça
escreva “Menu de Opções”
escreva “1. Subtração”
escreva “2. Multiplicação”
escreva “3. Divisão”
escreva “4. Sair”
escreva “Selecione uma opção: ”
leia OPCAO
se OPCAO < > 4 faça
Escreva “Digite dois números”
Leia N1
Leia N2
se OPCAO = 1 então
{operação de subtração}
RESULTADO SUBTRACAO (N1, N2)
senão se OPCAO = 2 então
{operação de Multiplicação}
RESULTADO MULTIPLICACAO (N1, N2)
senão se OPCAO = 3 então
{operação de divisão}
RESULTADO DIVISAO (N1, N2)
senão
escreva “Opção errada. Digite novamente”
fim se
fim se
fim se
escreva “resultado da operação =”, RESULTADO
fim se
fim enquanto
fim
140
logica_2_livro_caderno.indb 140
7/12/2006 14:21:09
Lógica de Programação II
{implementação das funções}
função SUBTRACAO (NUM1, NUM2: numérico): numérico
retorna NUM1 – NUM2 {retorna a diferença entre os parâmetros da
função}
fim-função
função MULTIPLICACAO (NUM1, NUM2: numérico): numérico
retorna NUM1*NUM2 {retorna a multiplicação entre os parâmetros
da função}
fim-função
função DIVISAO (NUM1, NUM2: numérico): numérico
se NUM2 < > 0 então {garante que a divisão nunca será feita por zero}
retorna NUM1/NUM2
senão
escreva “não existe divisão por zero”
retorna 0
fim-se
fim-função
3) Algoritmo do programa que implementa uma função que aceita três
valores como parâmetro e retorna o maior valor.
início
{declaração de variáveis}
RESULT, VAL1, VAL2, VAL3: numérico
{entrada de dados}
escreva “Digite o primeiro número”
leia VAL1
escreva “Digite o segundo número”
leia VAL2
escreva “Digite o terceiro número”
leia VAL3
{chamando a função}
RESULT FUNCAO_MAIOR(VAL1, VAL2, VAL3)
escreva “O maior valor é:”, RESULT
fim
141
logica_2_livro_caderno.indb 141
7/12/2006 14:21:09
Universidade do Sul de Santa Catarina
{implementação da função}
função FUNCAO_MAIOR (NUM1, NUM2, NUM3: numérico): numérico
MAIOR: numérico {variável local. Válido somente dentro da função}
se NUM1 > NUM2 E NUM1 > NUM3 então
{NUM1 é o maior valor}
MAIOR NUM1
senão se NUM2 > NUM1 E NUM2 > NUM3 então
{NUM2 é o maior valor}
MAIOR NUM2
senão
{NUM3 é o maior valor}
MAIOR NUM3
fim-se
retorna MAIOR
fim-função
142
logica_2_livro_caderno.indb 142
7/12/2006 14:21:09
Elton João Gubert
Mário Gerson Miranda Magno Júnior
Patrícia Gerent Petry
Lógica de Programação II
Caderno de atividades
Design instrucional
Flavia Lumi Matuzawa
Viviane Bastos
2ª edição revista
Palhoça
UnisulVirtual
2007
logica_2_livro_caderno.indb 143
7/12/2006 14:21:09
logica_2_livro_caderno.indb 144
7/12/2006 14:21:09
Apresentação
Este caderno de atividades corresponde ao material
complementar da disciplina de Lógica de Programação II.
O material foi elaborado visando a uma aprendizagem autônoma,
abordando conteúdos especialmente selecionados e adotando uma
linguagem que facilite seu estudo a distância.
Por falar em distância, isso não significa que você estará sozinho.
Não esqueça que sua caminhada nesta disciplina também
será acompanhada constantemente pelo Sistema Tutorial da
UnisulVirtual. Entre em contato sempre que sentir necessidade,
seja por correio postal, fax, telefone, e-mail ou Espaço
UnisulVirtual de Aprendizagem. Nossa equipe terá o maior
prazer em atendê-lo, pois sua aprendizagem é nosso principal
objetivo
Bom estudo e sucesso!
Equipe UnisulVirtual.
logica_2_livro_caderno.indb 145
7/12/2006 14:21:09
Copyright © UnisulVirtual 2007
Nenhuma parte desta publicação pode ser reproduzida por qualquer meio sem a prévia autorização desta instituição.
005.1
G95
Gubert, Elton João
Lógica de programação II : caderno de atividades / Elton João Gubert,
Mário Gerson Miranda Magno Júnior, Patrícia Gerent Petry ; design instrucional
Flavia Lumi Matuzawa; Viviane Bastos. – 2. ed. rev. – Palhoça : UnisulVirtual, 2007.
73p. : il. ; 28 cm.
1. Programação (Computadores). 2. Estrutura de dados (Computador). 3.
Algoritmos. I. Magno Júnior, Mario Gerson Miranda. II. Petry, Patrícia
Gerent. III. Matuzawa, Flavia Lumi. IV. Bastos, Viviane. V. Título.
Ficha catalográfica elaborada pela Biblioteca Universitária da Unisul
Créditos
Unisul - Universidade do Sul de Santa Catarina
UnisulVirtual - Educação Superior a Distância
Campus UnisulVirtual
Rua João Pereira dos Santos, 303
Palhoça - SC - 88130-475
Fone/fax: (48) 3279-1541 e
3279-1542
E-mail: [email protected]
Site: www.virtual.unisul.br
Reitor Unisul
Gerson Luiz Joner da Silveira
Vice-Reitor e Pró-Reitor
Acadêmico
Sebastião Salésio Heerdt
Chefe de gabinete da Reitoria
Fabian Martins de Castro
Pró-Reitor Administrativo
Marcus Vinícius Anátoles da Silva
Ferreira
Campus Sul
Diretor: Valter Alves Schmitz Neto
Diretora adjunta: Alexandra Orseni
Campus Norte
Diretor: Ailton Nazareno Soares
Diretora adjunta: Cibele Schuelter
Campus UnisulVirtual
Diretor: João Vianney
Diretora adjunta: Jucimara Roesler
Equipe UnisulVirtual
Administração
Renato André Luz
Valmir Venício Inácio
logica_2_livro_caderno.indb 146
Bibliotecária
Soraya Arruda Waltrick
Coordenação dos Cursos
Adriano Sérgio da Cunha
Ana Luisa Mülbert
Ana Paula Reusing Pacheco
Cátia Melissa S. Rodrigues (Auxiliar)
Charles Cesconetto
Diva Marília Flemming
Elisa Flemming Luz
Itamar Pedro Bevilaqua
Janete Elza Felisbino
Jucimara Roesler
Lilian Cristina Pettres (Auxiliar)
Lauro José Ballock
Luiz Guilherme Buchmann
Figueiredo
Luiz Otávio Botelho Lento
Marcelo Cavalcanti
Mauri Luiz Heerdt
Mauro Faccioni Filho
Michelle Denise Durieux Lopes Destri
Nélio Herzmann
Onei Tadeu Dutra
Patrícia Alberton
Patrícia Pozza
Raulino Jacó Brüning
Design Gráfico
Cristiano Neri Gonçalves Ribeiro
(coordenador)
Adriana Ferreira dos Santos
Alex Sandro Xavier
Evandro Guedes Machado
Fernando Roberto Dias Zimmermann
Higor Ghisi Luciano
Pedro Paulo Alves Teixeira
Rafael Pessi
Vilson Martins Filho
Equipe Didático-Pedagógica
Angelita Marçal Flores
Carmen Maria Cipriani Pandini
Carolina Hoeller da Silva Boeing
Cristina Klipp de Oliveira
Daniela Erani Monteiro Will
Dênia Falcão de Bittencourt
Elisa Flemming Luz
Enzo de Oliveira Moreira
Flávia Lumi Matuzawa
Karla Leonora Dahse Nunes
Leandro Kingeski Pacheco
Ligia Maria Soufen Tumolo
Márcia Loch
Patrícia Meneghel
Silvana Denise Guimarães
Tade-Ane de Amorim
Vanessa de Andrade Manuel
Vanessa Francine Corrêa
Viviane Bastos
Viviani Poyer
Monitoria e Suporte
Rafael da Cunha Lara (coordenador)
Adriana Silveira
Caroline Mendonça
Edison Rodrigo Valim
Francielle Arruda
Gabriela Malinverni Barbieri
Gislane Frasson de Souza
Josiane Conceição Leal
Maria Eugênia Ferreira Celeghin
Simone Andréa de Castilho
Vinícius Maycot Serafim
Logística de Encontros
Presenciais
Caroline Batista (Coordenadora)
Aracelli Araldi
Graciele Marinês Lindenmayr
José Carlos Teixeira
Letícia Cristina Barbosa
Kênia Alexandra Costa Hermann
Marcia Luz de Oliveira
Priscila Santos Alves
Secretaria de Ensino a Distância
Karine Augusta Zanoni
(secretária de ensino)
Djeime Sammer Bortolotti
Carla Cristina Sbardella
Grasiela Martins
James Marcel Silva Ribeiro
Lamuniê Souza
Liana Pamplona
Maira Marina Martins Godinho
Marcelo Pereira
Marcos Alcides Medeiros Junior
Maria Isabel Aragon
Olavo Lajús
Priscilla Geovana Pagani
Silvana Henrique Silva
Logística de Materiais
Jeferson Cassiano Almeida da Costa
(coordenador)
Eduardo Kraus
Produção Industrial e Suporte
Arthur Emmanuel F. Silveira
(coordenador)
Francisco Asp
Projetos Corporativos
Diane Dal Mago
Vanderlei Brasil
Secretária Executiva
Viviane Schalata Martins
Tecnologia
Osmar de Oliveira Braz Júnior
(coordenador)
Ricardo Alexandre Bianchini
Rodrigo de Barcelos Martins
Edição – Livro Didático
Professores Conteudistas
Elton João Gubert
Mário Gerson Miranda Magno Júnior
Patrícia Gerent Petry
Design Instrucional
Flavia Lumi Matuzawa
Viviane Bastos
Leandro Kingeski Pacheco
(2a edição revista)
Projeto Gráfico e Capa
Equipe UnisulVirtual
Diagramação
Rafael Pessi
Revisão Ortográfica
Heloísa Mano Dorneles
7/12/2006 14:21:10
Palavras dos professores
Prezado aluno,
Você aprendeu, em Lógica de Programação I, os
conceitos iniciais de algoritmos, criação de variáveis,
tipos de dados, expressões e estruturas seqüenciais de
decisão e de repetição.
Em Lógica de Programação II, estudou novas estruturas,
que o auxiliarão na resolução de problemas, e novas
maneiras de representar a informação, como vetores,
matrizes, registros, funções.
Neste caderno de atividades, você vai aprimorar
seu conhecimento com alguns exercícios resolvidos
utilizando todos os conceitos abordados em Lógica de
Programação I e II.
Mãos à obra!
logica_2_livro_caderno.indb 147
7/12/2006 14:21:10
logica_2_livro_caderno.indb 148
7/12/2006 14:21:10
UNIDADE 1
Manipulação de vetores
1
Objetivos de aprendizagem
logica_2_livro_caderno.indb 149
Conhecer os algoritmos de maiores complexidades.
Construir algoritmos com utilização de vetores.
7/12/2006 14:21:10
Universidade do Sul de Santa Catarina
Para início de conversa
Na Unidade referente à Lógica de Programação II, você aprendeu
a manipular vetores, que nada mais é do que uma variável que
pode armazenar vários valores de mesmo tipo.
Neste caderno de atividades, vamos apresentar alguns exercícios
resolvidos passo a passo e, ao fim da unidade, exercícios propostos
para a sua resolução.
Bom trabalho!
Exemplos resolvidos
1) Leia um conjunto N de números armazenados em um vetor,
que representa alturas de pessoas. Calcule e escreva:
a) média aritmética;
b) quantas pessoas possuem altura acima da média;
c) a maior altura;
d) quantas pessoas possuem a maior altura.
Algoritmo AlturaPessoas
Altura : vetor[9999] numérico
I, N, MediaAltura, TotalAcimaMedia, MaiorAltura,
TotalMaiorAltura: numérico
Início
{Lê o total de alturas armazenadas no vetor
Altura}
Leia (“Digite o total de pessoas”,N)
{Inicializar a variável Soma, que contém a soma
de todas as alturas, para no fi nal calcular a
média}
Soma ← 0
150
logica_2_livro_caderno.indb 150
7/12/2006 14:21:11
Lógica de Programação II
{Iniciamos com um valor bem BAIXO, para garantir
que encontraremos uma altura MAIOR que essa no
vetor}
MaiorAltura ← -1
{Iniciamos o laço}
Para I de 1 até N faça
{leitura do vetor de alturas}
Leia “Digite a altura”, ALTURA [I]
{Somamos a altura das pessoas, para depois
calcularmos a média}
Soma ← Soma + Altura[I]
{Se a altura da pessoa atual (Altura[I]) for
MAIOR que a maior altura até agora então,
aquela passa a ser a maior altura}
Se Altura[I] > MaiorAltura Então
MaiorAltura ← Altura[I]
Fim Se
Fim Para
{Calcula a média das alturas}
MediaAltura ← Soma / N
{Inicializando as variáveis que são contadores}
TotalAcimaMedia ← 0
TotalMaiorAltura ← 0
{Novamente iniciamos o laço, para verificar quem
tem altura maior que a média e quem tem a maior
altura}
Para I de 1 até N faça
{Aqui iremos verificar o total de pessoas que
têm a altura acima da média}
Se Altura[I]>MediaAltura então
TotalAcimaMedia ← TotalAcimaMedia + 1
Fim Se
{Agora vamos verificar o total de pessoas que
têm a maior altura}
Se Altura[I]= MaiorAltura então
TotalMaiorAltura ← TotalMaiorAltura + 1
Fim Se
Fim Para
Unidade 1
logica_2_livro_caderno.indb 151
151
7/12/2006 14:21:11
Universidade do Sul de Santa Catarina
{Escrevendo os dados de saída}
Escreva(“Média das alturas: “ + MediaAltura)
Escreva(“Total de pessoas com altura acima da
média: “ + TotalAcimaMedia)
Escreva(“A maior altura é: “ + MaiorAltura)
Escreva(“Total de pessoas com a maior altura é :
“+TotalMaiorAltura)
Fim
2) Faça um programa que leia e armazene em vetores as idades e
o sexo (Masculino: 0 ou Feminino: 1) de um conjunto de pessoas.
A leitura deverá parar quando for lida uma idade negativa. O
programa deverá também:
a) imprimir as idades dos homens e depois as idades das
mulheres;
b) imprimir as médias de idade de cada sexo;
c) encontrar o homem mais novo e colocá-lo na posição
inicial como o primeiro dos homens;
d) encontrar a mulher mais jovem e posicioná-la como a
primeira entre as mulheres.
Algoritmo Pessoas
Idade, Sexo: vetor[9999] numérico
I, N, PosMaisJovem, IdadeMaisNova, PosMaisVelho,
IdadeMaisVelho: numérico
MediaIdadeHomens, MediaIdadeMulheres: numérico
Início
I ← 1
{Lê a idade da primeira pessoa já fora do laço,
para que a condição do comando “enquanto-faça”
possa ser verificada}
Leia (“Digite a idade”,Idade[I])
152
logica_2_livro_caderno.indb 152
7/12/2006 14:21:11
Lógica de Programação II
{Enquanto o usuário digitar números maiores que
-1, o laço continua girando e, conseqüentemente,
lendo a Idade e o Sexo de outra pessoa.}
Enquanto Idade[I] > -1 faça
Leia(“Digite o sexo”,Sexo[I])
I ← I + 1
{Antes de o laço “retornar”, é preciso ler a
idade de outra pessoa. Veja que a leitura da
Idade da primeira pessoa foi realizada “fora”
do laço}
Leia(“Digite um valor para a idade ou -1 para
fi nalizar”,Idade[I])
Fim Enquanto
{Aqui descobrimos quantos dados foram realmente
lidos (N), já que não sabíamos de antemão}
N ← I - 1
{Escreve a idade de todos os homens. Aproveita
o laço para somar as idades deles e encontrar o
mais velho}
Soma ← 0
{Iniciamos com um valor bem BAIXO, para garantir
que encontraremos uma idade MAIOR que essa no
vetor}
IdadeMaisVelho ← -1
Para I de 1 até N faça
Se Sexo[I] = 1 Então
{Escrevemos a idade de cada homem}
Escreva (Idade[I])
{Somamos a idade de cada homem para depois
calcular a média}
Soma ← Soma + Idade[I]
{Se a idade do Homem atual (Idade[I]) for
MAIOR que a idade do mais velho até agora
então, aquele passa a ser o mais velho.
A posição atual no vetor é “guardada” em
PosMaisVelho}
Se Idade[I] > IdadeMaisVelho Então
IdadeMaisVelho ← Idade[I]
PosMaisVelho ← I
Fim Se
Fim Se
Fim Para
{Calcula a média de idade dos homens}
MediaIdadeHomens ← Soma / N
Unidade 1
logica_2_livro_caderno.indb 153
153
7/12/2006 14:21:11
Universidade do Sul de Santa Catarina
{Trocando de posição o homem mais velho com a
primeira posição em que aparece homem}
I ←1
Enquanto |<=N faça
Se Sexo[I]=1 Então
{guardo a primeira idade do homem em
uma variável auxiliar}
Aux ← Idade[I]
{coloco a idade do homem mais velho na
primeira posição do homem}
Idade[I] ← Idade[PosMaisVelho]
{coloco a primeira idade do homem no
local do mais velho}
Idade[PosMaisVelho] ← Aux
{para parar a repetição. Não precisa
achar outra idade, basta a primeira. A
troca já foi realizada.}
I ←N
Fim se
I ←I + 1
Fim enquanto
{Escreve a idade de todas as mulheres. Aproveita
o laço para somar as idades delas e encontrar a
mais nova}
Soma ← 0
{Iniciamos com um valor bem ALTO, para garantir
que encontraremos uma idade MENOR que essa no
vetor}
IdadeMaisNova ← 999
Para I de 1 até N faça
Se Sexo[I] = 0 Então
{Escrevemos a idade de cada mulher}
Escreva (Idade[I])
{Somamos a idade de cada mulher para
depois calcularmos a média}
Soma ← Soma + Idade[I]
{Se a idade da Mulher atual (Idade[I]) for
MENOR que a idade da mais nova até agora
então, aquela passa a ser a mais nova. A
posição atual no vetor é “guardada” em
PosMaisNova}
Se Idade[I] < IdadeMaisNova Então
IdadeMaisNova ← Idade[I]
PosMaisNova ← I
Fim se
Fim Se
Fim Para
{Calcula a média de idade das mulheres}
MediaIdadeMulheres ← Soma / N
{Trocando de posição a mulher mais nova com a
primeira posição em que aparece mulher}
I ←1
Enquanto |<=N faça
Se Sexo[I]=1 Então
{guardo a primeira idade da mulher em
uma variável auxiliar}
Aux ← Idade[I]
{coloco a idade da mulher mais nova na
primeira posição da mulher}
Idade[I] ← Idade[PosMaisNova]
154
logica_2_livro_caderno.indb 154
7/12/2006 14:21:12
Lógica de Programação II
{coloco a primeira idade da mulher no
local da mais nova}
Idade[PosMaisVelho] ← Aux
{para parar a repetição. Não precisa
achar outra idade, basta a primeira. A
troca já foi realizada.}
I ←N
Fim se
I ←I + 1
Fim enquanto
{Escrevendo dados de saída}
Escreva(“Média de idade dos homens: “,
MediaIdadeHomens)
Escreva(“Média de idade das mulheres: “,
MediaIdadeMulheres)
Escreva(“A idade do homem mais velho é: “,
IdadeMaisVelho,“ sua posição no vetor é: “,
PosMaisVelho)
Escreva(“A idade da mulher mais nova é: “,
IdadeMaisNova,“ sua posição no vetor é: “,
PosMaisNova)
Fim
3) Um concurso foi realizado por um número não conhecido
de candidatos e constou de 50 questões, cada uma contendo
5 opções. Cada candidato teve o seu número e respostas
registradas. Sabendo o gabarito da prova, faça um algoritmo
que imprima o número do candidato e o total de acertos de cada
candidato.
{Iniciamos o desenvolvimento deste algoritmo
defi nindo quatro variáveis:
V _ Respostas: Um vetor de cinqüenta posições que
armazenará as respostas de cada questão.
V _ Gabarito: Um vetor de cinqüenta posições que
armazenará os resultados de cada candidato.
NumeroDoCandidato: usado para identificar o
candidato.
Continuar: uma variável lógica usada no laço de
repetição.}
Unidade 1
logica_2_livro_caderno.indb 155
155
7/12/2006 14:21:12
Universidade do Sul de Santa Catarina
Algoritmo Concurso
V _ Respostas, V _ Gabarito : Vetor[50] Literal
NumeroDocandidato, X, ContadorAcertos : numérico
Continuar : Lógico
Início
{Primeiramente, as variáveis devem apresentar os
valores necessários; após, solicitamos a digitação do
gabarito}
Continuar ← V
Para X de 1 até 50 faça
Leia (V _ Gabarito[X])
Fim Para
{Após a digitação do gabarito, podemos desenvolver
a correção das provas; para isso usamos um laço de
repetição enquanto; este é usado porque não sabemos
o número correto de candidatos}
Enquanto (Continuar) faça
{Leitura do número do candidato e um laço de
repetição para ler suas respostas}
Leia (NumeroDocandidato)
Para X de 1 até 50 faça
Leia (V _ Respostas[X])
Fim Para
{Agora vamos comparar os resultados de cada questão
do candidato com o gabarito}
ContadorAcertos ← 0 {para cada candidato vamos
inicializar dentro do laço enquanto}
Para X de 1 até 50 faça
Se V _ Gabarito[X] = V _ Respostas[X] então
ContadorAcertos ← ContadorAcertos +1
Fim Se
Fim para
{Impressão dos resultados deste candidato e a leitura
da variável usada como sinalizador de parada
“Continuar”}
Escreva (NumeroDocandidato)
Escreva (ContadorAcertos)
Escreva (“Digite V para avaliar mais um
candidato ou F para parar”)
Leia (Continuar)
Fim Enquanto
Fim
156
logica_2_livro_caderno.indb 156
7/12/2006 14:21:12
Lógica de Programação II
Atividades propostas
1) Analise o algoritmo a seguir e mostre o desenvolvimento do mesmo
por meio de um teste de mesa (execução passo a passo do algoritmo).
Algoritmo Teste
I: numérico
V: Vetor[5] numérico
Início
Para I de 1 até 5 faça
V[I] ← I+1
Fimpara
V[3] ← V[1]+V[5]
V[5] ← V[V[2]]
Para I de 1 até 5 faça
Escreva (V[I])
Fim para
Fim
2) Escreva um algoritmo que leia um vetor de 13 elementos inteiros, que
é o Gabarito de um teste da loteria esportiva, contendo os valores
1 (coluna 1), 2 (coluna 2) e 3 (coluna do meio). Leia, a seguir, para
cada apostador, o número do seu cartão e um vetor de Respostas
de 13 posições. Verifique para cada apostador o número de acertos,
comparando o vetor de Gabarito com o vetor de Respostas. Escreva o
número do apostador e o número de acertos. Se o apostador tiver 13
acertos, mostre a mensagem “Ganhador”.
Unidade 1
logica_2_livro_caderno.indb 157
157
7/12/2006 14:21:12
Universidade do Sul de Santa Catarina
3) Escreva um algoritmo que leia um vetor de 20 posições e mostre-o.
Em seguida, troque o primeiro elemento pelo último, o segundo pelo
penúltimo, o terceiro pelo antepenúltimo, e assim sucessivamente.
Mostre o novo vetor depois da troca.
4) Faça um algoritmo que leia um vetor (A) de 100 posições. Em seguida,
compacte o vetor retirando os valores nulos e negativos. Coloque o
resultado no vetor B.
158
logica_2_livro_caderno.indb 158
7/12/2006 14:21:13
UNIDADE 2
Manipulação de matrizes
2
Objetivos de aprendizagem
logica_2_livro_caderno.indb 159
Entender o conceito de matrizes.
Conhecer e praticar montagens de matrizes.
Construir algoritmos com utilização de matrizes.
7/12/2006 14:21:13
Universidade do Sul de Santa Catarina
Para início de conversa
Nesta unidade, você estudou as matrizes, que nada mais são que
variáveis bidimensionais (com 2 índices). Em muitos problemas,
torna-se impossível a utilização de variáveis simples para guardar
várias informações.
Na unidade anterior, você viu que os vetores (variáveis
unidimensionais) permitem manipular várias informações em
uma única variável de mesmo tipo de dados. Esse conceito
também serve para uma matriz. Em alguns problemas o uso de
vetores torna-se trabalhoso e, com a utilização de matrizes, pode
facilitar a resolução do problema.
Exemplos resolvidos
1) Um fazendeiro anotou as produções de leite, em litros, de cada
uma de suas dez melhores vacas, durante 30 dias e montou a
Tabela 1 abaixo esquematizada:
Tabela 1- Produções de leite
VACA
1
2
3
4
5
6
7
8
9
10
1
15.5
18.5
10.2
18.3
20.3
15.2
9.5
13.2
11.2
23.4
2
18.2
15.2
9.9
15.0
19.9
20.2
12.9
15.4
13.4
25.4
3
16.2
12.2
10.9
16.2
20.0
17.2
13.3
16.2
12.2
24.9
30
15.6
11.0
10.9
16.3
18.9
17.2
15.2
14.2
12.6
23.9
DIA
Faça um algoritmo que:
a) leia e armazene os dados;
b) imprima as produções da vaca 5 e a da vaca 8 no mês;
c) imprima a produção total do dia 10 com a do dia 20;
d) registre quantos litros de leite o fazendeiro tirou no mês.
160
logica_2_livro_caderno.indb 160
7/12/2006 14:21:13
Lógica de Programação II
Algoritmo Leite
Leite: matriz[30,10] numérico
vaca5,vaca8,linha,coluna,dia10e20,dia01a30 :
numérico
Início
{Inicialização dos acumuladores.}
vaca5 = 0
vaca8 = 0
dia10e20 = 0
dia01a30 = 0
{Leitura e armazenamento da matriz}
{As produções de leite acima são, claramente, dados
de mesma natureza que podem ser armazenados numa
matriz tipo numérico de 30 linhas por 10 colunas,
perfazendo um total de 300 posições de memória. Caso
não armazenássemos em matriz, teríamos que armazenar
item a item, como a seguir:
Leia (leite[1,1], leite[1,2], ..., leite[1,10])
Leia (leite[2,1], leite[2,2], ..., leite[2,10])
...
Leia (leite[30,1], leite[30,2],..., leite[30,10])
Usando uma estrutura de repetição e chamando de
LINHA o primeiro índice, que varia de 1 a 30, e outra
estrutura de repetição embutida dentro da primeira,
chamando, assim, o segundo índice de COLUNA, que
varia de 1 a 10, para cada valor assumido por LINHA,
teríamos:
LINHA = 1, o segundo índice assume valores 1, 2,..., 10
LINHA = 2, o segundo índice assume valores 1, 2,..., 10
...
LINHA = 30, o segundo índice assume valores 1, 2,..., 10
Assim a leitura da matriz acima ficaria:}
Para linha de 1 a 30 faça
Para coluna de 1 a 10 faça
Leia (leite[linha, coluna])
Fim Para
{Como se observa, cada execução do comando LEIA
lê primeiramente uma linha da matriz. Quando a
LINHA for 2, estará lendo a segunda linha}
Fim Para
Unidade 2
logica_2_livro_caderno.indb 161
161
7/12/2006 14:21:13
Universidade do Sul de Santa Catarina
{Produções da vaca 5 e da vaca 8}
{O que se deseja na realidade é a soma da 5a. coluna e
a soma da 8a. coluna. Então, basta zerar um acumulador
para a vaca 5 e outro para a vaca 8 e percorrer todas
as linhas da matriz, somando os elementos da coluna
5 e os da coluna 8, isto é, o primeiro índice, que
indica a linha, varia de 1 a 30, enquanto o segundo
fica constante, valendo ou 5 ou 8}
Para linha de 1 até 30 faça
vaca5 = vaca5 + leite[linha,5]
vaca8 = vaca8 + leite[linha,8]
Fim Para
{Produção total do dia 10 com a do dia 20.}
{Nesse caso devem-se somar as produções do dia 10
com as do dia 20, das 10 vacas, isto é, percorrer as
linhas 10 e 20 somando as colunas de 1 a 10 destas
linhas, e acumulando os valores}
Para coluna de 1 até 10 faça
dia10e20 = dia10e20 + leite(10, col) + leite(20,
col)
Fim Para
{Producao total do mês.}
{A produção total de leite do mês é a soma de todos
os elementos da matriz, isto é, deve-se percorrer cada
linha e, em cada linha, todas as suas colunas somando
os elementos lá posicionados em um acumulador. Então,
a variável LINHA assumirá valores de 1 a 30 e para
cada valor assumido por LINHA, a variável COLUNA
assumirá valores de 1 a 10}
Para linha de 1 a 30 faça
Para coluna de 1 a 10 faça
dia01a30 = dia01a30 + leite(linha, coluna)
Fim Para
Fim Para
{Impressão dos resultados}
Escreva(“Produção da vaca número 5 : “, vaca5)
Escreva(“Produção da vaca número 8 : “, vaca8)
Escreva(“Produção do dia 10 com a do dia 20: “,
dia10e20)
Escreva(“Produção total do mês : “, dia01a30)
Fim
162
logica_2_livro_caderno.indb 162
7/12/2006 14:21:13
Lógica de Programação II
2) Faça um algoritmo que:
a) Leia uma matriz A de ordem N X M.
b) Some todos os elementos da matriz e escreva o resultado
na tela.
c) Some os elementos pares da matriz e escreva o resultado
na tela.
d) Escreva uma mensagem, caso a matriz seja quadrada.
OBS: Uma matriz é quadrada quando o número de
linhas é igual ao número de colunas.
e) Expresse os elementos da diagonal principal.
f) Expresse a soma dos elementos da diagonal secundária.
g) Expresse a soma de cada linha da matriz mostrando o
resultado na tela.
h) Expresse a soma da linha 3.
Algoritmo MatrizNumerica
A: Matriz[999,999] numérico {ou ainda poderíamos
declarar assim: A: Matriz[999x999] numérico ou A:
Matriz[999][999] numérico ou, em vez de escrever
Matriz, pode ser escrito Vetor, assim: A: Vetor[999,999]
numérico, ou ainda: A:Array[999,999] numérico}
I, J, N, M, Soma, SomaPar, SomaDS, SomaLinha,
SomaLinha3 : numérico
Início
{Leitura da ordem da matriz}
Leia (“Digite o total de linhas”,N)
Leia (“Digite o total de colunas”,M)
{Leitura dos valores da matriz}
Para I de 1 até N faça
Para J de 1 até M faça
Leia (A[I, J])
Fim Para
Fim Para
Unidade 2
logica_2_livro_caderno.indb 163
163
7/12/2006 14:21:13
Universidade do Sul de Santa Catarina
{Processo para somar os valores da matriz}
Soma ← 0
Para I de 1 até N faça
Para J de 1 até M faça
Soma ← Soma + A[I,J]
Fim Para
Fim Para
{Processo para somar os valores pares da matriz}
SomaPar ← 0
Para I de 1 até N faça
Para J de 1 até M faça
{Verifica se o valor da matriz é par. É
par quando o resto da divisão do valor
por 2 for igual a zero}
Se (RESTO (A[I,J],2) = 0) então
SomaPar ← SomaPar + A[I,J]
Fim se
Fim Para
Fim Para
{Processo para verificar se uma matriz é quadrada}
Se N = M então
Escreva (“Matriz é quadrada.”)
{Matriz quadrada tem diagonal principal e
secundária. Agora vou mostrar na tela os
valores da diagonal principal. É diagonal
principal quando I for igual a J}
Para I de 1 até N faça
Escreva (“Diagonal Principal : “, A[I,I]
Fim Para
{Agora some os elementos da diagonal
secundária. É diagonal secundária quando I + J
for igual a N+1, ou de N=total de linhas}
SomaDS ← SomaDS + 1
Para I de 1 até N faça
Para J de 1 até M faca
Se (I+J = N+1) então
SomaDS ← SomaDS + A[I,J]
Fim se
Fim Para
Fim Para
Senão
Escreva (“Matriz não é quadrada.”)
Fim se
164
logica_2_livro_caderno.indb 164
7/12/2006 14:21:14
Lógica de Programação II
{Processo para somar cada linha da matriz}
Para I de 1 até N faça
SomaLinha ← 0 {a cada nova linha inicializo a
soma}
Para J de 1 até M faça
SomaLinha ← SomaLinha + A[I,J]
Fim Para
Escreva (“A soma da linha ”,I,” é : “,SomaLinha)
Fim Para
{Processo para somar a linha 3 da matriz}
SomaLinha3 ← 0
{Percorrer toda a coluna da linha 3}
Para J de 1 até M faça
{Fixo a linha 3, ou seja, no lugar do I coloco
3 e percorro toda a coluna J}
SomaLinha3 ← SomaLinha3 + A[3,J]
Fim Para
{Resultado}
Escreva
“,Soma)
(“A
soma
dos
elementos
da
matriz
é:
Escreva (“A soma dos elementos pares da matriz é:
“,SomaPar)
Escreva (“A soma dos elementos da diagonal
secundária da matriz é: “,SomaDS)
Escreva (“A soma dos elementos da linha 3 da
matriz é: “,SomaLinha3)
Fim
Unidade 2
logica_2_livro_caderno.indb 165
165
7/12/2006 14:21:14
Universidade do Sul de Santa Catarina
3) Dada uma matriz de ordem N x N, faça um algoritmo que
verifique se a matriz é simétrica (aij=aji).
Algoritmo MatrizSimetrica
A: Matriz [N,M] numérico {também posso declarar,
como N e M, quando não sei o tamanho. Mas
cuidado com esse tipo de declaração, pois algumas
linguagens não suportam}
I, J, N, M : Numérico
Simetrica : Lógica
Início
{Leitura da ordem da matriz}
Leia (N)
{Leitura dos valores da matriz}
Para I de 1 até N faça
Para J de 1 até N faça
Leia (A[I, J])
Fim Para
Fim Para
{Processo para descobrir se a matriz é simétrica
ou não}
I ← 1
{A princípio consideramos a matriz como simétrica}
Simetrica ← Verdadeiro
Enquanto I < N faça
{Partimos de I+1 para passarmos somente pelos
elementos da diagonal superior da matriz; assim,
para cada um destes valores, comparamos com o
valor da posição simétrica na diagonal inferior.
Observe o comando “Se” a seguir.}
J ← I + 1
Enquanto J < N faça
Se A[I, J] <> A[J, I] então
{Se um dos valores for diferente, podemos,
com certeza, afirmar que a matriz NÃO é
simétrica}
Simetrica ← Falso
166
logica_2_livro_caderno.indb 166
7/12/2006 14:21:14
Lógica de Programação II
{Se já sabemos que a matriz NÃO é simétrica,
então não é preciso comparar os demais
valores; por isso, foi atribuído o valor
N, tanto para I como para J, para que os
dois laços terminem}
J ← N
I ← N
Fim Se
J ← J + 1
Fim Enquanto
I ← I + 1
Fim Enquanto
{Neste momento a variável “Simétrica” tem o valor
Verdadeiro, ou Falso. Com base nesse valor, se
escreve o resultado}
Se Simetrica então
Escreva (“A matriz é simétrica”)
Senão
Escreva (“A matriz NÃO é simétrica”)
Fim Se
Fim
4) Dada uma matriz 10 x 10 de valores reais, faça um algoritmo
que faça a leitura desses valores e, ao final da leitura de todos,
imprima o relatório com os seguintes itens:
a) soma dos valores de cada coluna da matriz;
b) lista dos valores que são menores que a média dos
valores;
c) soma dos elementos da diagonal secundária.
{O trabalho com matrizes é praticamente todo baseado
em comandos de repetição, e, como o tamanho da matriz
é conhecido, usa-se praticamente sempre o comando
Para-faça.
No caso a seguir, será defi nida uma matriz de tamanho
10x10.}
Unidade 2
logica_2_livro_caderno.indb 167
167
7/12/2006 14:21:14
Universidade do Sul de Santa Catarina
Algoritmo Matriz
{Primeiramente serão defi nidas as variáveis necessárias.
Nesse caso, as variáveis novas incluem um vetor, de
nome SomaColuna, com 10 posições, que será usado para
obter o somatório de cada coluna da matriz e uma
variável Mat, que representa uma matriz 10x10.}
I, J, SomaTotal, Media : numérico
SomaDiagSecund
: numérico
Mat : matriz[10,10] numérico
SomaColuna : Vetor[10] numérico
Início
{Como você viu anteriormente, o processo de leitura dos
dados em matrizes é baseado em comandos de repetição.
Você verá, a seguir, que são necessários sempre dois
laços de repetição: o primeiro é para navegação nas
linhas, e o segundo, para navegação nas colunas}
{No exemplo de leitura a seguir, a matriz será preenchida
linha a linha, na seguinte seqüência: todas as colunas
da primeira linha, depois as da segunda linha e assim
sucessivamente até a última coluna da última linha.}
{Aproveitando que a matriz será percorrida inteiramente,
já foi efetuada a soma de todas as suas células, soma
esta que será utilizada mais tarde para o cálculo da
média}
SomaTotal ← 0
Para I de 1 até 10 faça
Para J de 1 até 10 faça
Leia (Mat[I,J])
SomaTotal ← SomaTotal + Mat[I,J]
Fim Para
Fim Para
{Para efetuar a soma das colunas, recorreu-se ao mesmo
processo, porém foi invertida a ordem de navegação,
variáveis I e J. Assim, a navegação será coluna a
coluna. Sendo todas as linhas da primeira
oluna,
depois todas as linhas da segunda coluna e assim por
diante.}
Para J de 1 até 10 faça
SomaColuna[I] ← 0 {inicializo cada coluna
com 0}
Para I de I até 10 faça
SomaColuna[I]
←
SomaColuna[I]
+
Mat[I,J]
Fim Para
Fim Para
168
logica_2_livro_caderno.indb 168
7/12/2006 14:21:14
Lógica de Programação II
{Para a navegação em uma diagonal, foi usado um
artifício matemático; como os números são inversamente
proporcionais, será preciso apenas um laço de
repetição}
SomaDiagSecund ← 0
Para I de 1 até 10 faça
SomaDiagSecund ← SomaDiagSecund +
Mat[I,(11-I)]
Fim Para
{A saída de dados deste algoritmo não é tão simples
como nos outros. Para que se possam escrever os dados
solicitados são necessários também alguns laços de
repetição}
{Para escrever os valores das somas das colunas, foi
construído um laço que percorre o vetor SomaColuna
escrevendo o conteúdo de cada posição}
Para I de I até 10 faça
Escreva (“Soma da coluna”,I,“ é: ”,
SomaColuna[I])
Fim Para
{Calculando a média}
Media = SomaTotal / 100
{Após encontrar a média, é necessário percorrer
novamente a matriz, comparando cada uma das posições
com a média. Assim, é possível escrever somente
aquelas que são menores que ela.}
Para I de 1 até 10 faça
Para J de I até 10 faça
Se Mat[I,J] < Media então
Escreva (Mat[I,J])
Fim se
Fim Para
Fim Para
{A soma da diagonal secundária foi calculada já na
navegação. Então para esse caso não será preciso de
nenhum laço de repetição}
Escreva(“Soma diagonal secundária é:”,
SomaDiagSecund)
Fim
Unidade 2
logica_2_livro_caderno.indb 169
169
7/12/2006 14:21:15
Universidade do Sul de Santa Catarina
Atividades propostas
1) Considere a matriz M:
O
E
R
A
Q
*
E
*
*
E
U
*
I
S
T
S
Agora responda: qual será a sua configuração após a execução do
algoritmo a seguir?
Algoritmo Matriz
Variáveis
I,J: numérico
M: Matriz[4x4] literal
Aux: literal
Início
Para I de 1 até 4 faça
Para J de 1 até 4 faça
Ler (M[I,J])
Fim Para
Fim Para
Para I de 1 até 4 faça
Para J de I+1 até 4 faça
Aux ← M[I,J]
M[I,J] ← M[J,I]
M[J,I] ← Aux
Fim Para
Fim Para
Aux ← M[1,1]
M[1,1] ← M[4,4]
M[4,4] ← Aux
Aux ← M[2,2]
M[2,2] ← M[3,3]
M[3,3] ← Aux
Fim
170
logica_2_livro_caderno.indb 170
7/12/2006 14:21:15
Lógica de Programação II
2) Escreva um algoritmo que lê uma matriz M (12,13) e divida todos os 13
elementos de cada uma das 12 linhas de M pelo maior elemento em
módulo daquela linha (escreva a matriz lida e a modificada).
3) Elabore um algoritmo que lê uma matriz M (6x6) contendo valores
numéricos, e um valor A. Multiplicar M por A, armazenando os valores
resultantes em vetor. Escreva o vetor ao final.
Unidade 2
logica_2_livro_caderno.indb 171
171
7/12/2006 14:21:15
Universidade do Sul de Santa Catarina
4) Troque, a seguir:
a) a linha 2 pela linha 8;
b) a coluna 4 pela coluna 10;
c) a diagonal principal pela diagonal secundária;
d) a linha 5 pela coluna 10.
Escreva a matriz assim modificada (Diagonal principal e diagonal
secundária).
Principal
Secundária
X
X
X
X
X
X
X
X
172
logica_2_livro_caderno.indb 172
7/12/2006 14:21:15
UNIDADE 3
Manipulação de registros
3
Objetivos de aprendizagem
logica_2_livro_caderno.indb 173
Entender o conceito de registro ou estrutura.
Conhecer e praticar montagens de registros.
Criar novos tipos de variáveis.
7/12/2006 14:21:15
Universidade do Sul de Santa Catarina
Para início de conversa
Manipular registros nada mais é que trabalhar com dados
relacionados logicamente, porém de tipos de dados diferentes.
Ou seja, visa a facilitar o agrupamento de variáveis que não são
do mesmo tipo, mas que guardam estreita relação lógica; por
exemplo, o cadastro (nome, telefone, sexo, endereço, número de
dependentes, idade, cidade, etc) de funcionários de uma empresa.
Exemplos resolvidos
1) Crie um cadastro de funcionários com as seguintes
informações: nome, idade, salário, endereço. O cadastro de
Endereço deve conter: rua, número e cidade. Após, crie um
algoritmo para ler as informações de N funcionários. Conte
quantos funcionários são de “São Paulo”.
Algoritmo Empresa
{Como são dois cadastros, é preciso então, criar dois
tipos}
Tipo TENDEREÇO: registro
Rua, Cidade :literal
Número :numérico
Tipo TFUNCIONÁRIO: registro
Nome, sexo: literal
Idade, Salario: numérico
Endereco: TEndereco
{aqui é informado que a variável
Endereco é do tipo TEndereco}
Var
{Agora, será declarada a variável FUNCIONARIO, que é
um vetor do tipo TFuncionário, na qual contém todas as
informações do funcionário}
FUNCIONARIO: Vetor[9999] TFUNCIONARIO
N, cont, I : numérico
Início
Leia (“Digite o total de funcionários: “,N)
Para I de 1 até N faça
{Para acessar a informação nome, que é um componente
do tipo TFuncionário, faço da seguinte forma:}
174
logica_2_livro_caderno.indb 174
7/12/2006 14:21:15
Lógica de Programação II
Leia
Leia
Leia
Leia
(FUNCIONARIO[I].Nome)
(FUNCIONARIO[I].Idade)
(FUNCIONARIO[I].Salario)
(FUNCIONARIO[I].Sexo)
{Como o endereço é um tipo também, para acessar a
rua, por exemplo, será feito da seguinte forma:}
Leia (FUNCIONARIO[I].Endereco.Rua)
Leia (FUNCIONARIO[I].Endereco.Número)
Leia (FUNCIONARIO[I].Endereco.Cidade)
Fim Para
{Cálculo para contar quantos funcionários são de São Paulo}
cont ← 0
Para I de 1 ate N faça
Se (FUNCIONARIO[I].Endereco.Cidade=“São Paulo”) então
cont ← cont + 1
Fim se
Fim Para
Escreva(“Total de funcionários de São Paulo é:“,cont)
Fim
2) Imagine uma eleição onde haja 5 candidatos; você deve gerar
um relatório parcial do andamento: a cada parcial, você deve
fornecer o nome do partido, o nome do candidato, o número do
candidato e sua contagem de votos.
Faça um algoritmo que seja usado para um número desconhecido
de parciais.
Algoritmo eleição
{Declaração de um registro com as variáveis utilizadas
em cada parcial; é necessário, pois, que os dados sejam
relacionados e de tipos diferentes}
tipo parcial = registro
Partido: literal
Candidato: numérico
Nome: Literal
Votos: numérico
Fim-registro
Unidade 3
logica_2_livro_caderno.indb 175
175
7/12/2006 14:21:16
Universidade do Sul de Santa Catarina
{Como possuímos cinco candidatos para cada
relatório de parciais, serão necessários, então,
cinco conjuntos de dados, e a criação de um vetor
facilitará a manipulação dos dados}
relatório: vetor[5] parcial {declaração de um vetor
de parciais}
X : numérico
Início
Para X de 1 até 5 faça
Leia (relatório[X].Partido)
Leia (relatório[X].Candidato)
Leia (relatório[X].Nome)
Leia (relatório[X].Votos)
Fim Para
Escreva (“Impressão do relatório de parciais:”)
Para X de 1 até 5 faça
Escreva (“Partido: ”, relatório[X].Partido)
Escreva (“Canditato:”, relatório[X].Nome)
Escreva (“Numero: ”, relatório[X].Candidato)
Escreva (“Votos: ”, relatório[X].Votos)
Fim Para
Fim
3) Faça um algoritmo para ler nome, idade, altura, sexo, e as
cinco (5) notas de 100 alunos e armazene estas informações num
vetor usando registro. Depois da leitura escreva um relatório
contendo nome e idade de todas as pessoas do sexo feminino que
obtiveram média superior a 8.0.
Algoritmo Aluno
ALUNO: registro
Nome: literal
Idade, Sexo: numérico {Sexo 0-Feminino 1-Masculino}
Altura: numérico
{Observe que uma das partes do registro é um vetor}
Notas: Vetor[5] numérico
CAD _ ALUNOS: Vetor[100] ALUNO
I, K: Numérico
Soma: numérico
176
logica_2_livro_caderno.indb 176
7/12/2006 14:21:16
Lógica de Programação II
Início
Para I de 1 até 100 faça
Leia (CAD _ ALUNOS[I].Nome)
Leia (CAD _ ALUNOS[I].Idade)
Leia (CAD _ ALUNOS[I].Altura)
Leia (CAD _ ALUNOS[I].Sexo)
{Observe os índices [I] e [K], que são
diferentes. O índice [I] controla o vetor de
100 alunos e o [K] controla o vetor de 5 notas
de cada aluno [I]}
Para K de 1 até 5 faça
Leia(CAD _ ALUNOS[I].Notas[K])
Fim Para
Fim Para
Para I de 1 ate 100 faça
{Se o aluno NÃO é do sexo feminino, então NEM
analisamos}
Se (CAD _ ALUNOS[I].Sexo = 0) então
Soma ← 0
{Soma as 5 notas da aluna atual [I]. Observe a
importância de “zerarmos” a variável “Soma”
antes do Para-faça. Assim, garantimos que se
faça uma soma única para aquela determinada
aluna}
Para K de 1 até 5 faça
Soma ← CAD _ ALUNOS[I].Notas[K] + Soma
Fim Para
{Calcula a média e verifica se ela é maior
que 8}
Se (Soma / 5) > 8 então
{Escreve nome e idade das alunas com
média superior a 8}
Escreva(CAD _ ALUNOS[I].Nome)
Escreva(CAD _ ALUNOS[I].Idade)
Fim Se
Fim Para
Fim
Unidade 3
logica_2_livro_caderno.indb 177
177
7/12/2006 14:21:16
Universidade do Sul de Santa Catarina
Atividades propostas
1) Utilizando os conceitos de vetor e registro, estudados nas unidades 1 e
3 respectivamente, faça um algoritmo para ler nome, salário, endereço
e sexo de 200 funcionários e armazene estas informações na memória.
Após a leitura, escreva na tela:
a) quantas mulheres possuem salário maior que R$ 1.000,00;
b) qual o maior salário entre os funcionários homens;
c) a média salarial.
178
logica_2_livro_caderno.indb 178
7/12/2006 14:21:16
Lógica de Programação II
2) Monte um algoritmo para cadastrar dados pessoais de 100 candidatos
a uma vaga de engenheiro de um sistema de administração de
currículos. Os dados pessoais são: nome, endereço, cidade, estado,
telefone, grau de escolaridade (1-Graduação, 2-Pós-graduação, 3Mestrado, 4-Doutorado) e curso em que se formou. Depois da leitura,
imprima uma relação dos candidatos que tenham grau de pósgraduação ou superior e que residam em SC. Os campos do relatório
devem ser: nome, cidade, telefone, grau de escolaridade e curso de
formação.
Unidade 3
logica_2_livro_caderno.indb 179
179
7/12/2006 14:21:16
Universidade do Sul de Santa Catarina
3) Faça um algoritmo que receba as informações sobre determinado
acervo de filmes, título, gênero, autor, duração e sinopse. Além disso,
imprima uma relação de filmes por gênero. Considere que a Pinacoteca
tem 3.500 Filmes.
180
logica_2_livro_caderno.indb 180
7/12/2006 14:21:16
UNIDADE 4
Tópicos avançados em
algoritmos computacionais
4
Objetivos de aprendizagem
logica_2_livro_caderno.indb 181
Identificar os comandos e compreender a lógica em
pseudocódigo, proposta para resolver o problema.
7/12/2006 14:21:16
Universidade do Sul de Santa Catarina
Para início de conversa
Com esta unidade, você vai aprimorar seus estudos em tópicos
avançados utilizando vetores, como a ordenação de literais,
pesquisa simples e pesquisa binária, com explicações passo a
passo da resolução destes métodos.
Exemplos resolvidos
Ordenação de literais
1. Faça um algoritmo para ordenar o nome de 50 pessoas.
Algoritmo OrdenarNomes
{Declarando variáveis}
NOME : Vetor[50] de literal
AUX : literal
I, J : numérico
Início
{Fazendo a leitura do vetor de nomes}
Para I de 1 até 50 faça {ou ainda poderia: Para
I de 0 até 49 faça}
Escreva “Digite o nome na posição : ”, I
Leia NOME[I]
Fim Para
{Fazendo a ordenação do vetor de nomes – Isso
será explicado após o algoritmo}
Para I de 1 até 50 faça
Para J de (I+1) até 50 faça
Se NOME[I] > NOME[J] então
AUX NOME[I]
NOME[I] NOME[J]
NOME[J] AUX
Fim se
Fim Para
Fim Para
{Escrevendo o vetor ordenado}
Escreva “Nomes Ordenados:”
Para I de 1 até 50 faça
Escreva NOME[I]
Fim Para
Fim
182
logica_2_livro_caderno.indb 182
7/12/2006 14:21:17
Lógica de Programação II
Explicação do Método de Ordenação utilizado
Imagine o vetor chamado NOME e suas posições I, com
tamanho 4:
NOME
José
Marcos
Ana
Maria
I
1
2
3
4
É importante lembrar que quando se menciona posição está-se
referindo a I, e quando mencionado no conteúdo do vetor, na
informação, refere-se a NOME[I].
Qual é a idéia do algoritmo apresentado anteriormente? Será
utilizado o primeiro nome (José), comparando-o com todos
os demais, ou seja, será fi xada a posição I=1 e será comparado
o nome José com Marcos, Ana e Maria (I=2, 3 e 4). Então
será colocado o menor nome (Ana) na primeira posição e será
comparada a posição do 2º nome com os demais, e assim por
diante. Acompanhe o exemplo.
Para I de 1 até 4 faça
{essa primeira estrutura de repetição serve para
fi xar o primeiro nome (a primeira vez que entra nesse
para-faça é José) a ser comparado com os demais
quando I=1. Depois será com I=2, I=3 e I=4.}
Para J de (I+1) até 4 faça
{essa segunda estrutura de repetição serve
para percorrer os demais nomes a partir
daquele que será fi xo, ou seja, se estou na
primeira posição I=1, o J será I+1, ou seja, 2
(depois 3, depois 4, e assim por diante).}
Se NOME[I] > NOME[J] então
AUX NOME[I]
NOME[I] NOME[J]
NOME[J] AUX
Fim se
{Na estrutura de decisão, SE está sendo
comparado NOME[1] > NOME[2] (José com
Marcos), ou seja, o I=1 e J=2. Verifica-se
se José é > que Marcos, ou seja, a letra
J vem depois de M? Não. Então não há
troca.
O que ocorre? Volta para o PARA J DE
(I+1) ATÉ 4 FAÇA. Agora o I vale 1 e J
está valendo 3.
Unidade 4
logica_2_livro_caderno.indb 183
183
7/12/2006 14:21:17
Universidade do Sul de Santa Catarina
Então, entro na estrutura de decisão SE e testo
NOME[1] > NOME[3]. José é maior do que Ana? Sim.
Então a troca entre a posição 1 e 3 será feita.}
Meu vetor agora se apresenta assim:
NOME
Ana
Marcos
José
Maria
I
1
2
3
4
{Volta para o PARA J DE (I+1) ATÉ 4 FAÇA.
Agora o J está valendo 4.
Entra na estrutura de decisão SE e testa
NOME[1] > NOME[4]. Agora atenção. Vou
comparar Ana com Maria. Ana é > que
Maria? Não. Não é realizada nenhuma
troca.
Volta para PARA J DE (I+1) ATÉ 4 FAÇA. Já
chegou a 4. Então sai do PARA J e volta
para o PARA I, agora o I vale 2.
Entra novamente no PARA J DE (I+1) ATE 4
FAÇA.}
I=2
J=I+1 = 3
{Então será fi xa; fi xar a posição 2 e
comparar com o restante do vetor a
partir da posição 3.
Se NOME[2] > NOME[3] então. É verdade?
Marcos é > José? Sim. Então realiza a
troca.}
O vetor fica assim agora:
NOME
Ana
José
Marcos
Maria
I
1
2
3
4
{Volta para o PARA J DE (I+1) ATÉ 4 FAÇA.
Entra no SE e compara NOME[2]>NOME[4].
Não. Não é realizada troca.
PARA J já chegou a 4. Então pára! E vai
para o PARA I novamente. O I já chegou
a 4? Não. O I estava valendo 2 e agora
passa a valer 3.}
184
logica_2_livro_caderno.indb 184
7/12/2006 14:21:17
Lógica de Programação II
Entra no PARA J novamente:
I=3
J=I+1=4
{Vou comparar NOME[3]>NOME[4], Marcos é >
Maria? Não. Então não troca.
O PARA J já está em 4. Volta para o PARA
I.}
I=4
J=I+1=5.
{Não entra no PARA J porque já
ultrapassou o limite 4. Volta para o PARA
I. Agora o I já chegou a 4.}
Observe que o vetor exemplo ficou
ordenado.
NOME
Ana
José
Marcos
Maria
I
1
2
3
4
Fim Para
Fim Para
Unidade 4
logica_2_livro_caderno.indb 185
185
7/12/2006 14:21:17
Universidade do Sul de Santa Catarina
Pesquisa
Seqüencial ou Linear
1) Dados desordenados – Pesquisa Linear Simples
{Este algoritmo representa a forma mais básica de
consulta a um grupo de dados; seria o equivalente à
leitura de um livro em procura de uma determinada
palavra; você pode imaginar como isso é trabalhoso
não?}
a,n,i: numérico
{A variável a representa o número procurado}
{A variável n representa o número de valores
armazenados}
Início
Leia (a, n)
{Primeiramente, é preciso preencher o vetor com os
valores; para isso, usamos um laço que pede para o
usuário digitar cada um dos valores}
Para i de 1 até n faça
Leia ( x[ i ] )
Fim Para
{Abaixo posicionamos nossa variável auxiliar i na
primeira posição do vetor e então desenvolvemos um
laço à procura do primeiro valor que corresponder ao
valor procurado}
i ← 1
Enquanto (i<=n)
i ← i + 1
Fim Enquanto
E
(x[i]<>a) faça
{A seguir, verificamos se o nosso ponteiro está
direcionado para uma posição no vetor; se ele
estiver apontando para o fi nal, quer dizer que
não encontramos nenhum valor correspondente; se
estiver no meio, esta corresponde à posição do vetor
procurado.}
Se i > n então
Escreva (“Não encontrou”)
Senão
Escreva (“Encontrou na posição : “, i)
Fim Se
Fim.
186
logica_2_livro_caderno.indb 186
7/12/2006 14:21:17
Lógica de Programação II
2) Dados Ordenados - Pesquisa Binária (para vetores grandes)
{O exemplo abaixo se refere à Pesquisa Binária para
números inteiros, mas o método pode ser aplicado para
tipo de valor, como real e literal.}
Algoritmo PesquisaBinaria
numeroPesquisa: numérico {número a ser
pesquisado}
n: numérico {quantidade de valores no vetor}
x: vetor[N] de numérico {vetor de tamanho “n” de
valores inteiros}
início, meio, fi nal, i: numérico
Início
{A idéia central deste método de pesquisa
é “dividir para conquistar”, isto é, sempre
perguntar “ao vetor” onde está o valor que estamos
procurando: se na metade da esquerda do vetor, ou
na metade da direita. De posse dessa informação,
nós “redefi nimos” o início e o fi m desse vetor e
passamos a ter agora a metade do vetor original,
via de regra, um “novo” vetor. A partir daí o
processo continua, sempre descobrindo em que
metade o valor está (e redefi nindo início e fi m
do vetor sucessivamente), até que o valor seja
encontrado, ou não seja mais possível dividir o
vetor; neste último caso, significa que o valor não
estava no vetor.
Este método é especialmente utilizado em vetores
GRANDES. Como vimos acima, a vantagem é que a
cada iteração o tamanho do vetor passa a ter
a metade do anterior, e assim sucessivamente,
diminuindo, desse modo, o tempo de processamento.}
{Leitura do número a ser pesquisado e do tamanho
do vetor}
Leia (numeroPesquisa , N)
{Leitura dos valores do vetor}
Para i de 1 até N faça
Leia ( x [ i ] )
Fim Para
{O início e o fi nal neste ponto representam o
tamanho original do vetor}
Início ← 1
fi nal ← N
Enquanto (início <= fi nal) faça
Unidade 4
logica_2_livro_caderno.indb 187
187
7/12/2006 14:21:18
Universidade do Sul de Santa Catarina
{Descobrimos qual é o “meio” do vetor}
meio ← (início + fi nal)/2
{Perguntamos se o número a ser pesquisado está
na metade da esquerda ou da direita do vetor
original (ou do passo anterior)}
Se (numeroPesquisa < x[meio] ) então
{O número está na metade esquerda,
“redefi no” o fi nal}
Final ← meio - 1
Senão
Se (numeroPesquisa > x[meio] ) então
{O número está na metade direita,
“redefi no” o início}
Início ← fi nal + 1
Senão
{Nesta opção, o número foi encontrado,
então atribuímos à variável início um
valor tal, para que o laço TERMINE de
“girar”}
Início ← fi nal + 1 {artifício para
interromper o laço}
Fim Se
Fim Se
Fim enquanto
{Se saímos do laço e x[meio] é diferente do
numeroPesquisa, então NÃO encontramos, senão...
(x[meio] é igual a numeroPesquisa, então
ENCONTRAMOS}
Se (x[meio] <> numeroPesquisa) então
Escreva (“Não Encontrou”)
Senão
Escreva (“Encontrou na posição : “, meio)
Fim Se
Fim
188
logica_2_livro_caderno.indb 188
7/12/2006 14:21:18
Lógica de Programação II
Atividades propostas
1) Faça um algoritmo para ler um vetor X com N elemento. Leia um valor
A qualquer. Verifique se este valor pertence ao vetor. Se pertencer,
mostre uma mensagem na tela. E informe quantas vezes ele aparece e
em quais posições. Caso não exista, escreva uma mensagem.
Unidade 4
logica_2_livro_caderno.indb 189
189
7/12/2006 14:21:18
Universidade do Sul de Santa Catarina
2) Faça um algoritmo para ler um vetor com 500 valores inteiros e verificar
se um determinado valor “N” está ou não dentro dele. Escreva uma
mensagem dizendo se encontrou ou não o valor.
190
logica_2_livro_caderno.indb 190
7/12/2006 14:21:18
UNIDADE 5
Programação estruturada
5
Objetivos de aprendizagem
logica_2_livro_caderno.indb 191
Entender os conceitos de programação estruturada.
Aplicar modularização aos algoritmos.
7/12/2006 14:21:18
Universidade do Sul de Santa Catarina
Para início de conversa
A realização de uma determinada tarefa muitas vezes é
decomposta em seqüências de passos. Lembre-se da tarefa de
trocar uma lâmpada: existe uma série de passos que devem ser
seguidos.
Conforme uma tarefa cresce e se torna mais complexa, surge
uma série de situações a serem resolvidas para que esse problema
possa ser solucionado. Podemos dizer que passamos a ter dentro
deste problema uma série de “probleminhas”. Muitas vezes,
essa grande quantidade de probleminhas afeta a legibilidade
(clareza), fazendo com que uma consulta ou manutenção futura
dessa lógica seja uma tarefa difícil de se realizar. Por meio da
modularização é possível evitar isso, como também podemos
reutilizar esse probleminha descrito em uma outra tarefa.
Portanto, modularizar é quebrar um problema em pequenas
partes, sendo que cada uma dessas partes será responsável pela
realização de uma etapa do problema.
Exemplos resolvidos
1) Dada uma frase, faça uma FUNÇÃO que verifique se existe
alguma palavra com mais de 7 caracteres. Considere que cada
palavra é separada da outra por, no mínimo, um espaço em branco.
Função ExistePalavraMaiorQueSete(Frase: literal):
lógico
K, TamPalavra: numérico
{Observe que “Frase” é o parâmetro da função e
ExistePalavraMaiorQueSete é o próprio nome da
função que retorna Verdadeiro ou Falso}
Início
{Partimos do princípio de que NÃO existe Palavra
com tamanho maior que 7 (sete)}
ExistePalavraMaiorQueSete ← Falso
192
logica_2_livro_caderno.indb 192
7/12/2006 14:21:18
Lógica de Programação II
{Artifício identificar o fi nal da frase, neste caso
a frase está terminando com os caracteres “ $”
(espaço e cifrão) }
Frase ← Frase + “ $”
K ← 0
{Vale lembrar que um literal pode ser manipulado
como um VETOR de caracteres, iniciando na posição
0(zero)}
TamPalavra ← 0
Enquanto (NÃO ExistePalavraMaiorQueSete)
(Frase[K] <> “$”) faça
e
{Se o caractere da posição K for diferente de
um espaço em branco, estamos assumindo que ele
está fazendo parte de uma palavra, por isso
incrementamos a variável TamPalavra que guarda
esta informação}
Se Frase[K] <> “ “ Então
TamPalavra ← TamPalavra + 1
Senão
{Neste ponto a palavra terminou e, então,
precisamos testar e seu tamanho}
Se TamPalavra > 7 Então
{Se a palavra for maior que sete,
já temos nosso resultado, por isso
atribuímos “Verdadeiro” à variável para
que o laço termine}
ExistePalavraMaiorQueSete
Senão
← Verdadeiro
{Neste ponto precisamos “zerar” a
variável que guarda o tamanho da
palavra, para começar a contar o
tamanho de outra, visto que essa, neste
ponto, não tem tamanho maior que 7(set(}
TamPalavra ← 0
Fim Se
Fim Se
{Incrementamos a variável K para acessar o
próximo caractere da frase}
K ← K + 1
Fim Enquanto
Fim
Unidade 5
logica_2_livro_caderno.indb 193
193
7/12/2006 14:21:19
Universidade do Sul de Santa Catarina
2) Faça um programa para ler o nome e salário bruto de N
funcionários. Calcule e imprima o valor do desconto do INSS,
o valor de desconto do IRRF (se houver) e o valor do salário
líquido do funcionário. Escreva uma função para retornar o valor
de desconto do INSS e outra função para retornar o valor de
desconto do IRRF.
Tabela de Desconto do INSS
SALÁRIO BRUTO
% DE DESCONTO
Até R$ 429,00
7,65 %
De R$ 429,01 até R$ 540,00
8,65 %
De R$ 540,01 até R$ 715,00
9,00 %
De R$ 715,01 até R$ 1.430,00
11,00 %
Acima de R$ 1430,00
R$ 157,00 (teto de contribuição)
Tabela de Desconto do IRFF
SALÁRIO BRUTO
% DE DESCONTO
Até R$ 1.058,00
Isento
De R$ 1.059,00 a R$ 2.115,00
15%
Acima R$ 2.115,00
27,5%
{Programa Principal; neste, precisamos apenas das
chamadas para as funções}
Algoritmo salário
SalBruto, NumDeFunc,
DescINSS, DescIRRF, SalLiq: numérico
Início
Leia (SalarioBruto)
Leia (NumDeFunc)
DescINSS CalculaINSS(SalarioBruto)
DescIRRF CalculaIRRF (SalarioBruto)
SalLiq = SalarioBruto – DescINSS – DescIRRF
Escreva (“O salário Liquido é:”, SalLiq)
Fim
194
logica_2_livro_caderno.indb 194
7/12/2006 14:21:19
Lógica de Programação II
{Esta é a função para calcular o valor do desconto de
IRRF}
Função CalculaIRRF (SalarioBruto:Numérico) :numérico
Início
Se SalarioBruto <= 1058 então
DescIRRF = 0
Senão
Se SalarioBruto <= 2115 então
DescIRRF = SalarioBruto * 0,15
Senão
DescIRRF = SalarioBruto * 0,275
Fim Se
Fim Se
Retorna DescIRRF
Fim
{Esta é a função para calcular o valor do desconto de
INSS}
Função CalculaINSS(SalarioBruto:Numérico) :numérico
Início
Se SalarioBruto <= 429 então
DescINSS = SalarioBruto * 0,0765
Senão
SE SalarioBruto <= 540 então
DescINSS = SalarioBruto * 0,0865
Senão
SE SalarioBruto <= 715 então
DescINSS = SalarioBruto * 0,0900
Senão
SE SalarioBruto < 1.430 então
DescINSS = SalarioBruto * 0,1100
Senão
DescINSS = 157,00
Fim SE
Fim Se
Fim Se
Fim Se
Retorna DescINSS
Fim
Unidade 5
logica_2_livro_caderno.indb 195
195
7/12/2006 14:21:19
Universidade do Sul de Santa Catarina
Atividades propostas
1) Você estudou, em nossa disciplina, modularização ou sub-rotinas
e descobriu que uma função é dita como sendo uma sub-rotina ou
módulo do algoritmo principal. A partir do “exemplo supermercado”
abaixo, faça uma função chamada CALCDESCONTO que receba como
parâmetro o código de um produto e seu valor. Esta função deve
retornar o novo valor do produto, com as seguintes regras:
caso o produto tenha o código “ABC”, será concedido um desconto
de 4,5% (quatro e meio por cento);
caso o produto tenha o código “XYZ”, será concedido um desconto
de 6,5% (seis e meio por cento), se o valor da mercadoria for inferior
a R$ 85,00 (oitenta e cinco reais);
caso o produto não se enquadre em nenhum desses códigos, ele não
receberá desconto;
Exemplo supermercado:
Um cliente foi a um supermercado e comprou N produtos, sendo
informado que, dependendo do código do produto, ele receberia
um desconto. Faça um algoritmo pedindo que o usuário digite as
informações de N produtos: seu valor e o seu código. Após a digitação,
mostre na tela, o valor total que foi pago pelo cliente, considerando os
possíveis descontos (utilize a função CALCDESCONTO neste algoritmo).
196
logica_2_livro_caderno.indb 196
7/12/2006 14:21:19
Lógica de Programação II
2) Faça uma função chamada EhPrimo que receba um valor e retorne
1, caso o número seja primo, ou 0, em caso contrário. Um número N
é primo quando não é divisível por nenhum valor (exceto 1) até N/2.
Quando se encontrar um valor pelo qual N é divisível, a função pode
parar a busca e considerar o número não primo.
3) Faça um programa que calcule a área e o perímetro do retângulo.
Modularize esse programa, ou seja, divida-o em funções
adequadamente.
Unidade 5
logica_2_livro_caderno.indb 197
197
7/12/2006 14:21:19
logica_2_livro_caderno.indb 198
7/12/2006 14:21:19
Respostas e comentários das
atividades de auto-avaliação
Unidade 1
1) Analise o algoritmo abaixo e mostre o desenvolvimento do
mesmo mediante teste de mesa.
Algoritmo Teste
Var
I:numérico
V: Vetor[5] numérico
Início
Para I de 1 até 5 faça
V[I] ← I+1
Fim Para
V[3] ←
V[1]+V[5]
V[5] ←
V[V[2]]
Para I de 1 até 5 faça
Escreva (V[I])
Fim Para
Fim
Resposta:
I=1
I=2
I=3
I=4
I=5
V[1] = 2
V[2] = 3
V[3] = 4
V[4] = 5
V[5] = 6
V[3] = 2 + 6 = 8
V[5] = V[V[2]] = V[3] = 4
I=1
I=2
I=3
I=4
I=5
V[1] = 2
V[2] = 3
V[3] = 8
V[4] = 5
V[5] = 4
logica_2_livro_caderno.indb 199
7/12/2006 14:21:19
Universidade do Sul de Santa Catarina
2) Escreva um algoritmo que leia um vetor de 13 elementos inteiros, que
é o Gabarito de um teste da loteria esportiva, contendo os valores
1 (coluna 1), 2 (coluna 2) e 3 (coluna do meio). Leia, a seguir, para
cada apostador, o número do seu cartão e um vetor de Respostas
de 13 posições. Verifique para cada apostador o número de acertos,
comparando o vetor de Gabarito com o vetor de Respostas. Escreva o
número do apostador e o número de acertos. Se o apostador tiver 13
acertos, mostre a mensagem “Ganhador”.
Resposta:
Algoritmo loteriaesportiva
Var
Gabarito, Respostas: Vetor[13] numérico
NROCARTAO, CONTACERTOS, I : numérico
Início
Escrever (“Informe o gabarito do jogo”)
Para I de 1 até 13 faça
Escreva(“1= COLUNA1, 2= COLUNA2, 3= COLUNA DO
MEIO”)
Leia (Gabarito[I])
Fim Para
Escrever (“Informe o número do cartão:”)
Leia (NROCARTAO)
CONTACERTOS ← 0
Escrever (“Informe as 13 posições do jogo”)
Para I de 1 até 13 faça
Escreva(“1= COLUNA1, 2= COLUNA2, 3= COLUNA DO
MEIO”)
Leia (RESPOSTAS[I])
Se (RESPOSTAS[I] = GABARITO[I]) então
CONTACERTOS ← CONTACERTOS + 1
Fim Se
Fim Para
Escrever (“Número do cartão = “, NROCARTAO)
Escrever (“Número de acertos = “, CONTACERTOS)
Se (CONTACERTOS=13) então
Escreva (“VENCEDOR”)
Fim Se
Fim
3) Escreva um algoritmo que leia um vetor de 20 posições e mostre-o. Em
seguida, troque o primeiro elemento com o último, o segundo com o
penúltimo, o terceiro com o antepenúltimo, e assim sucessivamente.
Mostre o novo vetor depois da troca.
200
logica_2_livro_caderno.indb 200
7/12/2006 14:21:20
Lógica de Programação II
Resposta :
Algoritmo TROCA_TROCA
Var
V : VETOR[20] numérico
AUX, I, J : numérico
Início
Escreva (“INFORME 20 VALORES”)
Para I de 1 até 20 faça
Leia (V[I])
Fim Para
I ← 1
J ← 20
repita
AUX ← V[I]
V[I] ← V[J]
V[J] ← AUX
I ← I + 1
J ← J – 1
Até (J<=I)
Para I de 1 até 20 faça
Escrever (V[I])
Fim Para
Fim
4) Faça um algoritmo que leia um vetor (A) de 100 posições. Em seguida,
compacte o vetor, retirando os valores nulos e negativos. Coloque o
resultado no vetor B.
Resposta:
Algoritmo Compacto
Var
A, B : Vetor[100] numérico
I, J : numérico
Início
Escreva (“Informe 100 valores”)
Para I de 1 até 100 faça
Leia (A[I])
Fim Para
J ← 1
Para I de 1 até 100 faça
Se (A[I] > 0) então
B[J] ← A[I]
J ← J + 1
Fim se
Fim Para
I ← 1
Enquanto (I<J) faça
Escreva (B[I])
I ← I + 1
Fim enquanto
Fim
201
logica_2_livro_caderno.indb 201
7/12/2006 14:21:20
Universidade do Sul de Santa Catarina
Unidade 2
1) Considere a matriz M:
O
E
R
A
Q
*
E
*
*
E
U
*
I
S
T
S
Agora responda: qual será a sua configuração após a execução do
algoritmo a seguir?
Algoritmo Matriz
Variáveis
I,J: numérico
M: Matriz[4x4] literal
Aux: literal
Início
Para I de 1 até 4 faça
Para J de 1 até 4 faça
Ler (M[I,J])
Fimpara
Fimpara
Para I de 1 até 4 faça
Para J de I+1 até 4 faça
Aux ← M[I,J]
M[I,J] ← M[J,I]
M[J,I] ← Aux
Fimpara
Fimpara
Aux ← M[1,1]
M[1,1] ← M[4,4]
M[4,4] ← Aux
Aux ← M[2,2]
M[2,2] ← M[3,3]
M[3,3] ← Aux
Fim
Resposta:
I = 1
J = 2
AUX M[1,2] (Q)
M[1,2] M[2,1] (E)
M[2,1] AUX (Q)
I = 1
J = 3
AUX M[1,3] (*)
M[1,3] M[3,1] (R)
M[3,1] AUX (*)
I = 2
J = 3
AUX M[2,3] (E)
M[2,3] M[3,2] (E)
M[3,2] AUX (E)
I = 2
J = 4
AUX M[2,4] (S)
M[2,4] M[4,2] (*)
M[4,2] AUX (S)
I = 3
J = 4
AUX M[3,4] (T)
M[3,4] M[4,3] (*)
M[4,3] AUX (T)
I = 4
J = 5
NADA ACONTECE
I = 1
J = 4
AUX M[1,4] (I)
M[1,4] M[4,1] (A)
M[4,1] AUX (I)
202
logica_2_livro_caderno.indb 202
7/12/2006 14:21:20
Lógica de Programação II
AUX M[1,1] (O)
M[1,1] M[4,4] (S)
M[4,4] AUX (O)
AUX M[2,2] (*)
M[2,2] M[3,3] (U)
M[3,3] AUX (*)
Configuração final:
S
Q
*
I
E
U
E
S
R
E
*
T
A
*
*
O
2) Escreva um algoritmo que lê uma matriz M (12,13) e divida todos os
13 elementos de cada uma das 12 linhas de M pelo maior elemento
daquela linha. Escreva a matriz lida e a modificada.
Resposta:
Algoritmo Matriz1
Variáveis
M : MATRIZ[12,13] numérico
MAIOR : numérico
I, J: numérico
Início
Para I de 1 até 12 faça
Para J de 1 até 13 faça
Escreva (“Informe o valor de M[“,I, “,”,J, “]:”)
Leia (M[I,J])
Fim Para
Fim Para
Para I de 1 até 12 faça
MAIOR M[I,1]
Para J de 2 até 13 faça
Se (M[I,J] > MAIOR então
MAIOR M[I,J]
Fim se
Fim Para
Para J de 1 até 13 faça
M[I,J] M[I,J] / MAIOR
Fim Para
Fim Para
Para I de 1 até 12 faça
Para J de 1 até 13 faça
Escreva (‘M[‘ ,I, ‘,’ J ,’]=’)
Escreva (M[I,J])
Fim Para
Fim Para
Fim
203
logica_2_livro_caderno.indb 203
7/12/2006 14:21:20
Universidade do Sul de Santa Catarina
3) Elabore um algoritmo que lê uma matriz M(6x6) contendo valores reais,
e um valor A, do tipo inteiro. Multiplicar M por A, armazenando os
valores resultantes em vetor. Escreva o vetor ao final.
Resposta:
Algoritmo Matriz2
Variáveis
M : MATRIZ[6,6] numérico
V : VETOR [36] numérico
A : numérico
K, I, J: numérico
Início
Escrever (“Informe um valor inteiro”)
Leia(A)
Para I de 1 até 6 faça
Para J de 1 até 6 faça
Leia (M[I,J])
Fim para
Fim para
K 1
Para I de 1 até 6 faça
Para J de 1 até 6 faça
V[K] M[I,J] * A
Escreva (V[K])
K K + 1
Fim Para
Fim Para
Fim
4) Troque, a seguir:
a) a linha 2 pela linha 8;
b) a coluna 4 pela coluna 10;
c) a diagonal principal pela diagonal secundária;
d) a linha 5 pela coluna 10.
Escreva a matriz assim modificada (diagonal principal e diagonal
secundária).
Principal
Secundária
X
X
X
X
X
X
X
X
Resposta:
204
logica_2_livro_caderno.indb 204
7/12/2006 14:21:21
Lógica de Programação II
Algoritmo Matriz3
Var
M : MATRIZ[10,10] numérico
AUX, C, K, I, J: numérico
Início
Para I de 1 até 10 faça
Para J de 1 até 10 faça
Leia (M[I,J])
Fim Para
Fim para
{Troca a linha 2 pela linha 8}
Para J de
AUX M[2,J]
M[8,J]
Fim Para
1 até 10 faça
M[2,J]
M[8,J]
AUX
{Troca a coluna 4 pela coluna 10}
Para I de 1 até 10 faça
AUX M[I,4]
M[I,4] M[I,10]
M[I,10] AUX
Fim Para
{Troca a linha 5 pela coluna 10}
Para K de 1 até 10 faça
AUX M[5,K]
M[5,K] M[K,10]
M[K,10] AUX
Fim Para
{Troca a
secundária}
I 1
J 1
K 10
Repita
AUX M[I,C]
M[I,K]
I I
J J
K K
Até (I>10
diagonal
principal
pela
diagonal
M[I,C]
M[I,K]
AUX
+ 1
+ 1
– 1
E J >10 E K <1)
Para I de 1 até 10 faça
Para J de 1 até 10 faça
Escrever (M[I,J])
Fim para
Fim Para
Fim
205
logica_2_livro_caderno.indb 205
7/12/2006 14:21:21
Universidade do Sul de Santa Catarina
Unidade 3
1) Utilizando os conceitos de vetor e registro, estudados nas unidades 1 e
3 respectivamente, faça um algoritmo para ler nome, salário, endereço
e sexo de 200 funcionários e armazene estas informações na memória.
Após a leitura, escreva na tela:
a) quantas mulheres possuem salário maior que R$ 1.000,00;
b) qual o maior salário entre os funcionários homens;
c) a média salarial.
Resposta:
Algoritmo RelatorioSalarial
Tipo TFUNC
NOME, END, SEXO
SALÁRIO
: literal
: numérico
Var
FUNC
: vetor [200] TFUNC
I, TOTALMUL,
MAIORSAL, MEDIASAL : numérico
Início
{leitura dos dados}
Para I de 1 até 200 faça
Escreva “Digite o nome”
Leia FUNC[I].NOME
Escreva “Digite o endereço”
Leia FUNC[I].END
Escreva “Digite o sexo”
Leia FUNC[I].SEXO
Escreva “Digite o salário”
Leia FUNC[I].SALÁRIO
Fim para
{Letra A}
TOTALMUL0
Para I de 1 até 200 faça
Se
(FUNC[I].SEXO=”F”)
E
SALARIO>1000) então
TOTMULTOTMUL + 1
Fim se
Fim Para
(FUNC[I].
206
logica_2_livro_caderno.indb 206
7/12/2006 14:21:21
Lógica de Programação II
{Letra B}
MAIORSAL0
Para I de 1 até 200 faça
Se (FUNC[I].SEXO=”M”)E(FUNC[I].
SALARIO>MAIORSAL) então
MAIORSALFUNC[I].SALARIO
Fim se
Fim Para
{Letra C}
MEDIASAL0
Para I de 1 até 200 faça
MEDIASALMEDIASAL+ FUNC[I].SALARIO
Fim Para
MEDIASALMEDIASAL/200
{Saída dos dados}
Escreva (“Total de mulheres com mais de R$
1.000,00 : “, TOTALMUL)
Escreva “Maior salário dos homens : “, MAIORSAL
Escreva “Média Salarial : “, MEDIASAL
Fim
2) Monte um algoritmo para cadastrar dados pessoais de 100 candidatos a
uma vaga de engenheiro de um sistema de administração de currículos.
Os dados pessoais são: nome, endereço, cidade, estado, telefone,
grau de escolaridade (1-Graduação, 2-Pós-graduação, 3-Mestrado, 4Doutorado) e curso em que se formou. Depois da leitura, imprima uma
relação dos candidatos que tenham grau de pós-graduação ou superior
e que residam em SC. Os campos do relatório devem ser: nome, cidade,
telefone, grau de escolaridade e curso de formação.
Resposta:
Algoritmo PesquisaCandidatos
Var
{Defi nição do registro}
tipo CADASTRO : registro
NOME: literal {Nome do Candidato}
ENDERECO: literal {Endereço}
CIDADE: literal {Cidade}
UF: literal {Unidade da Federação}
FONE: literal {Telefone}
GRAU : numérico {Grau de Escolaridade}
CURSO : literal {Nome do Curso}
Fim-registro
207
logica_2_livro_caderno.indb 207
7/12/2006 14:21:21
Universidade do Sul de Santa Catarina
{Declaração das variáveis}
CANDIDATOS : vetor[100] CADASTRO
K : numérico {Contador}
Início
{Leitura dos dados cadastrais}
Para K de 1 até 100 passo 1 faça
Leia (CANDIDATOS[K].NOME)
Leia (CANDIDATOS[K].ENDERECO)
Leia (CANDIDATOS[K].CIDADE)
Leia (CANDIDATOS[K].UF)
Leia (CANDIDATOS[K].FONE)
Leia (CANDIDATOS[K].GRAU)
Leia (CANDIDATOS[K].CURSO)
Fim Para
{Processamento}
Para K de 1 até 100 passo 1 faça
Se (CANDIDATOS[K].UF=“SC”)E(CANDIDATOS[K].
GRAU > 1) Então
Escreva (CANDIDATOS[K].NOME)
Escreva (CANDIDATOS[K].ENDEREÇO)
Escreva (CANDIDATOS[K].CIDADE)
Escreva (CANDIDATOS[K].UF)
Escreva (CANDIDATOS[K].FONE)
Escreva (CANDIDATOS[K].GRAU)
Escreva (CANDIDATOS[K].CURSO)
Fim Se
Fim Para
Fim
208
logica_2_livro_caderno.indb 208
7/12/2006 14:21:22
Lógica de Programação II
3) Faça um algoritmo que receba as informações sobre determinado
acervo de filmes, título, gênero, autor, duração e sinopse. Além disso,
imprima uma relação de filmes por gênero. Considere que a Pinacoteca
tem 3.500 Filmes.
Resposta:
Algoritmo Acervo
tipo Filme = registro
Título: literal
Gênero: literal
Autor: Literal
Duração: numérico
Sinopse: literal
fi m-registro
Acervo : Vetor [3500] Filme
Generodesejado: literal
contador : numérico
Início
Para contador de 1 até 3500 faça
Leia Acervo[contador].Título
Leia Acervo[contador].Genero
Leia Acervo[contador].Autor
Leia Acervo[contador].Duracao
Leia Acervo[contador].Sinopse
Fim Para
Escreva (“Deseja pesquisar algum gênero?”)
Leia (Generodesejado)
Enquanto Genero = “sim” faça
Para contador de 1 até 3500 faça
Se Acervo[contador].Genero =
Generodesejado
Escreva Acervo[contador].
Título
Escreva Acervo[contador].
Genero
Escreva Acervo[contador].
Autor
Escreva Acervo[contador].
Duracao
Escreva Acervo[contador].
Sinopse
Fim Se
Fim Para
Escreva (“Deseja mais algum gênero?”)
Leia (Generodesejado )
Fim Enquanto
Fim.
209
logica_2_livro_caderno.indb 209
7/12/2006 14:21:22
Universidade do Sul de Santa Catarina
Unidade 4
1) Faça um algoritmo para ler um vetor X com N elemento. Leia um valor
A qualquer. Verifique se este valor pertence ao vetor. Se pertencer,
mostre uma mensagem na tela. E informe quantas vezes ele aparece e
em quais posições. Caso não exista, escreva uma mensagem.
Resposta:
Algoritmo EncontraValor
Var
X, Posicoes: vetor[9999] numérico
K, N, cont: numérico
Inicio
{Leitura dos valores do vetor}
Leia (“Digite o total de valores do vetor: ”,N)
Para I de 1 até N faça
Leia(X[I])
Fim Para
{Leitura do valor a ser pesquisado}
Leia (K)
{Processamento – Encontrar o valor}
{Considerarmos inicialmente que NÃO
encontraremos o valor}
cont ← 0
Para I de 1 até N faça
Se (X[I] = K) então {pesquisando o valor no
vetor}
Posicoes[cont] ← I {guardando a
posição onde o valor se encontra}
cont ← cont + 1
Fim Se
Fim Para
Se cont = 0 então
Escreva (“Valor não encontrado.”)
Senão
{Escrever quantas vezes o valor aparece no
vetor}
Escreva (“Valor encontrado. Ele aparece
“,cont,” vezes no vetor X”)
{Escrever as posições em que o valor
aparece no vetor}
Para I de 1 até cont faça
Escreva(Posicoes[I])
Fim Para
Fim Se
Fim.
210
logica_2_livro_caderno.indb 210
7/12/2006 14:21:22
Lógica de Programação II
2) Faça um algoritmo para ler um vetor com 500 valores inteiros e verificar
se um determinado valor “N” está ou não dentro dele. Escreva uma
mensagem dizendo se encontrou ou não o valor.
Resposta:
Algoritmo EncontraValor
Algoritmo EncontraValor
Var
Números: vetor[500] numérico
K, N: numérico
Encontrou: lógico
Início
{Leitura dos valores do vetor}
Para K de 1 até 500 faça
Leia(Numeros[K])
Fim Para
{Leitura do valor a ser pesquisado}
Leia (N)
{Processamento – Encontrar o valor}
{Considerarmos inicialmente que NÃO
encontraremos o valor}
Encontrou ← Falso
K ← 1
Enquanto (Não Encontrou) e (K < 500) faça
Encontrou ← Numeros[K] = N
K ← K + 1
Fim Enquanto
{Precisamos decidir porque o laço terminou e
isso nos garante a resposta.}
Se Encontrou então
Escreva(“O número “ + N + “ foi encontrado”)
Senão
Escreva(“O número “ + N + “ Não foi
encontrado”)
Fim Se
Fim
211
logica_2_livro_caderno.indb 211
7/12/2006 14:21:22
Universidade do Sul de Santa Catarina
Unidade 5
1) Você estudou, em nossa disciplina, modularização ou sub-rotinas
e descobriu que uma função é dita como sendo uma sub-rotina ou
módulo do algoritmo principal. A partir do “exemplo supermercado”
abaixo, faça uma função chamada CALCDESCONTO que receba como
parâmetro o código de um produto e seu valor. Esta função deve
retornar o novo valor do produto, com as seguintes regras:
caso o produto tenha o código “ABC”, será concedido um desconto
de 4,5% (quatro e meio por cento);
caso o produto tenha o código “XYZ”, será concedido um desconto
de 6,5% (seis e meio por cento), se o valor da mercadoria for inferior
a R$ 85,00 (oitenta e cinco reais);
caso o produto não se enquadre em nenhum desses códigos, ele não
receberá desconto;
Exemplo supermercado:
Um cliente foi a um supermercado e comprou N produtos, sendo
informado que, dependendo do código do produto, ele receberia
um desconto. Faça um algoritmo pedindo que o usuário digite as
informações de N produtos: seu valor e o seu código. Após a digitação,
mostre na tela, o valor total que foi pago pelo cliente, considerando os
possíveis descontos (utilize a função CALCDESCONTO neste algoritmo).
Função CALCDESCONT (COD: literal, VALOR: numérico):
numérico
Var
NVALOR : numérico
Início
Se (COD=”ABC”) então
NVALOR ← VALOR – VALOR * 4.5/100
Senão
Se (COD=”XYZ”) E (VALOR<85.00) então
NVALOR ← VALOR – VALOR * 6.5/100
Senão
NVALOR ← VALOR
Fim Se
Fim Se
Retorne NVALOR
Fim
Algoritmo Supermercado
Var
N, TOTALPAGO, VALORPROD, CONT : numérico
CODPROD
:
literal
212
logica_2_livro_caderno.indb 212
7/12/2006 14:21:22
Lógica de Programação II
Início
Escreva
“Digite
o
total
comprado”
Leia N
TOTALPAGO ← 0
Para CONT de 1 até N faça
de
produtos
{Entrada dos dados}
Escreva “Digite o código do produto”
Leia CODPROD
Escreva “Digite o valor do produto”
Leia VALORPROD
{Chamando a função
parâmetro o código e o valor}
VALORPROD
←
e
levando
CALCDESCONTO
de
(CODPROD,
VALORPROD)
{Acumulando valor de cada produto para,
ao fi nal, saber quanto o cliente pagou}
TOTALPAGO ← TOTALPAGO + VALORPROD
Fim Para
Escreva “O total pago pelo cliente na compra
dos “, N, “ produtos foi: “, TOTALPAGO
Fim
2) Faça uma função chamada EhPrimo que receba um valor e retorne
1, caso o número seja primo, ou 0, em caso contrário. Um número N
é primo quando não é divisível por nenhum valor (exceto 1) até N/2.
Quando se encontrar um valor pelo qual N é divisível, a função pode
parar a busca e considerar o número não primo.
Função EhPrimo (N: numérico) : numérico
Var
K, Fim : numérico
Início
EhPrimo ← 1 {Partimos do princípio de que o
número N é primo}
K ← 2
Fim ← N/2
Enquanto (RESTO(N,K) > 0) E (K < Fim) Faca
K ← K + 1
Fim Enquanto
{Ao sair do laço precisamos saber o motivo:
se foi porque encontrou um número divisível ou
porque chegou ao fi m do laço (K alcançou o valor
de N)}
Se (RESTO(N,K) =
EhPrimo ← 0
Senão
EhPrimo ← 1
Fim Se
Retorne EhPrimo
Fim
0) Então
213
logica_2_livro_caderno.indb 213
7/12/2006 14:21:23
Universidade do Sul de Santa Catarina
3) Faça um programa que calcule a área e o perímetro do retângulo.
Modularize esse programa, ou seja, divida-o em funções
adequadamente.
Algoritmo DadosDoRetangulo
Variáveis
LadoA, LadoB : numérico
Início
Leia (LadoA, LadoB)
Escreva (“A área retângulo é:”,CalculaArea(LadoA,
LadoB))
Escreva (“O perímetro é:”,CalculaPerimetro(Lado
A, LadoB))
Fim
Função CalculaArea (LA:numérico; LB:numérico) :
numérico
AreaTotal : numérico
Início
AreaTotal = (LA * LB)
Retorna AreaTotal
Fim.
Função CalculaPerimetro (A:numérico; B:numérico) :
numérico
Perimetro : numérico
Inicio
Perimetro = ((A * 2)+(B * 2))
Retorna Perimetro
Fim
214
logica_2_livro_caderno.indb 214
7/12/2006 14:21:23
Sobre os professores conteudistas
Patrícia Gerent Petry
Formada em Ciências da Computação pela Universidade
Federal de Santa Catarina, mestre em Ciências da
Computação, área Informática e Educação, pela Universidade
Federal de Santa Catarina, tendo como tema principal
de sua dissertação o Processo de Ensino e Aprendizagem
de Algoritmos. Atuou como professora substituta na
Universidade Federal de Santa Catarina. Foi professora nas
instituições de ensino superior: Universidade do Vale do Itajaí
e Faculdades Barddal. Atualmente é Analista de Sistemas dos
Correios/SC e atua como professora na Universidade do Sul
de Santa Catarina desde 1998. Atuou por muitos anos nas
disciplinas de Programação I, Programação II, Laboratório de
Informática e Análise e Sistemas I dos cursos de Sistema de
Informação e Ciência da Computação, no ensino presencial da
Unisul. No ensino virtual, atua como tutora nas cadeiras de
Introdução à Internet, Lógica de Programação I e II do curso
de Tecnólogo em Web Design e Programação.
Elton João Gubert
É formado em Ciências da computação (UFSC) e é
especialista em Gestão empresarial (UFSC). Atua na empresa
Sistemas e Tecnologias de Informação Ltda, voltada para o
desenvolvimento de software para área de produção animal
de suínos e bovinos de confinamento. É professor do curso
de Ciências da Computação e Sistemas de Informação, nas
disciplinas de Linguagem Visual (Delphi), Técnicas de
Programação, Estruturas de Dados e Análise e Projetos
de Sistemas Orientados a Objetos. É professor do curso
Web Designer da UnisulVirtual (Ensino à Distancia).
Apresenta sólida atuação em desenvolvimento de sistemas
informatizados, baseada em atividades de análise de sistemas,
logica_2_livro_caderno.indb 215
7/12/2006 14:21:23
Universidade do Sul de Santa Catarina
projeto estruturado, programação, suporte a usuários. Além
disso, tem experiência em desenvolvimento de sistemas e
programação orientada a objetos.
Mário Gerson Miranda Magno Júnior
Formado em Ciências da Computação pela Universidade do
Vale do Itajaí, mestrando em Ciências da Linguagem pela
Universidade do Sul de Santa Catarina, é professor do ensino
superior e Consultor em Gerência de Projetos e Auditoria de
Tecnologia da Informação, com experiência reconhecida no
mercado nacional. É responsável, no ensino presencial, pelas
cadeiras de Tecnologia da Informação de Programação para
Engenharia e de Programação para Internet, respectivamente,
nos cursos de Engenharia de Telemática, Engenharia Civil e
Sistemas de Informação. No ensino virtual, atua como professor
tutor nas cadeiras de Lógica de Programação I e II do curso de
Tecnólogo em Web Design e Programação.
216
logica_2_livro_caderno.indb 216
7/12/2006 14:21:23
Download

Lógica de Programação II - UNISUL