216
Universidade do Sul de Santa Catarina Palhoça UnisulVirtual 2007 Lógica de Programação II Disciplina na modalidade a distância LIVRO DIDÁTICO E CADERNO DE ATIVIDADES

LÓGICA de PROGRAMAÇÃO II Avançado

Embed Size (px)

Citation preview

Page 1: LÓGICA de PROGRAMAÇÃO II Avançado

Universidade do Sul de Santa Catarina

PalhoçaUnisulVirtual

2007

Lógica de Programação IIDisciplina na modalidade a distância

LIVRO DIDÁTICO E CADERNO DE ATIVIDADES

logica_2_livro_caderno.indb 1logica_2_livro_caderno.indb 1 7/12/2006 14:19:187/12/2006 14:19:18

Page 2: LÓGICA de PROGRAMAÇÃO II Avançado

Sumário

LIVRO DIDÁTICO

Palavras do professor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9Plano de estudo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

UNIDADE 1 – Manipulação de vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15UNIDADE 2 – Manipulação de matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33UNIDADE 3 – Manipulação de registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47UNIDADE 4 – Tópicos avançados em algoritmos computacionais . . . . . 71UNIDADE 5 – Programação estruturada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

Para concluir o estudo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121Referências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123Sobre o professor conteudista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125Respostas e comentários das atividades de auto-avaliação . . . . . . . . . . . . 127

logica_2_livro_caderno.indb 2logica_2_livro_caderno.indb 2 7/12/2006 14:20:497/12/2006 14:20:49

Page 3: LÓGICA de PROGRAMAÇÃO II Avançado

CADERNO DE ATIVIDADES

Palavras dos professores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

UNIDADE 1 – Manipulação de vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149UNIDADE 2 – Manipulação de matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159UNIDADE 3 – Manipulação de registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173UNIDADE 4 – Tópicos avançados em algoritmos computacionais . . . . 181UNIDADE 5 – Programação estruturada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191

Respostas e comentários das atividades de auto-avaliação . . . . . . . . . . . . 199Sobre os professores conteudistas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215

logica_2_livro_caderno.indb 3logica_2_livro_caderno.indb 3 7/12/2006 14:20:497/12/2006 14:20:49

Page 4: LÓGICA de PROGRAMAÇÃO II Avançado

logica_2_livro_caderno.indb 4logica_2_livro_caderno.indb 4 7/12/2006 14:20:497/12/2006 14:20:49

Page 5: LÓGICA de PROGRAMAÇÃO II Avançado

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 signifi ca 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 5logica_2_livro_caderno.indb 5 7/12/2006 14:20:497/12/2006 14:20:49

Page 6: LÓGICA de PROGRAMAÇÃO II Avançado

logica_2_livro_caderno.indb 6logica_2_livro_caderno.indb 6 7/12/2006 14:20:497/12/2006 14:20:49

Page 7: LÓGICA de PROGRAMAÇÃO II Avançado

Carlos Fernando Martins

Design instrucionalDaniela Erani Monteiro Will

Carolina Hoeller da Silva

PalhoçaUnisulVirtual

2007

Lógica de Programação II

Livro didático

4ª edição revista e atualizada

logica_2_livro_caderno.indb 7logica_2_livro_caderno.indb 7 7/12/2006 14:20:497/12/2006 14:20:49

Page 8: LÓGICA de PROGRAMAÇÃO II Avançado

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 Sul de Santa Catarina

UnisulVirtual - Educação Superior a Distância Cam pus UnisulVirtual 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

Reitor Unisul Gerson Luiz Joner da Silveira

Vice-Reitor e Pró-Reitor

Acadêm ico Sebastião Salésio Heerdt Chefe de gabinete da

Reitoria Fabian Martins de Castro

Pró-Reitor Adm inistrativo Marcus Vinícius Anátoles da Silva Ferreira

Cam pus Sul Diretor: Valter Alves Schm itz Neto Diretora adjunta: Alexandra Orseni

Cam pus Norte Diretor: Ailton Nazareno Soares Diretora adjunta: Cibele Schuelter

Cam pus UnisulVirtual 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 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 Flemm ing Elisa Flemm ing Luz Itamar Pedro Bevilaqua Janete Elza Felisbino Jucim ara Roesler Lilian Cristina Pettres (Auxiliar) Lauro José Ballock Luiz Guilherm e Buchmann Figueiredo Luiz Otávio Botelho Lento Marcelo Cavalcanti Mauri Luiz Heerdt Mauro 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 Alex Sandro Xavier Evandro Guedes Machado Fernando Roberto Dias Zimm ermann Higor Ghisi Luciano

Pedro Paulo Alves Teixeira Rafael Pessi Vilson Martins Filho Equipe Didático-

Pedagógica Angelita Marçal Flores Carm en Maria Cipriani Pandini Carolina Hoeller da Silva Boeing Cristina Klipp de Oliveira Daniela Erani Monteiro W ill Dênia Falcão de Bittencourt Elisa Flemm ing Luz Enzo de Oliveira Moreira Flávia Lum i Matuzawa Karla Leonora Dahse Nunes Leandro Kingeski Pacheco Ligia Maria Soufen Tumolo Márcia Loch Patrícia Meneghel Silvana Denise Guim arães Tade-Ane de Am orim Vanessa de Andrade Manuel Vanessa Francine Corrêa Viviane Bastos Viviani Poyer

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 Herm ann Marcia Luz de Oliveira Priscila Santos Alves

Logística de M ateriais Jeferson Cassiano Almeida da Costa (coordenador)

Eduardo Kraus

M onitoria 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 Sim one Andréa de Castilho Vinícius Maycot Sera. m Produção Industrial e

Suporte Arthur Emm anuel F. Silveira (coordenador) Francisco Asp

Projetos Corporativos Diane Dal Mago Vanderlei Brasil

Secretaria de Ensino a Distância Karine Augusta Zanoni (secretária de ensino) Djeim e Sammer Bortolotti Carla Cristina Sbardella Grasiela Martins Jam es 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

Secretária Executiva Viviane Schalata Martins

Tecnologia Osm ar de Oliveira Braz Júnior (coordenador) Ricardo Alexandre Bianchini Rodrigo de Barcelos Martins

Edição – Livro Didático

Professor Conteudista Carlos Fernando Martins

Design Instrucional Daniela Erani Monteiro 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 Rafael Pessi Revisão Ortográfica Revisare

Page 9: LÓGICA de PROGRAMAÇÃO II Avançado

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 desafi o

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 desafi os 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

bibliografi as que poderão ajudá-lo a resolver outros problemas

de programação. Quanto mais você estudar, melhor vai fi car.

E quanto melhor fi car, mais você vai estudar. É um ciclo

contínuo e desafi ador. 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 9logica_2_livro_caderno.indb 9 7/12/2006 14:20:507/12/2006 14:20:50

Page 10: LÓGICA de PROGRAMAÇÃO II Avançado

logica_2_livro_caderno.indb 10logica_2_livro_caderno.indb 10 7/12/2006 14:20:507/12/2006 14:20:50

Page 11: LÓGICA de PROGRAMAÇÃO II Avançado

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

� 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.

logica_2_livro_caderno.indb 11logica_2_livro_caderno.indb 11 7/12/2006 14:20:507/12/2006 14:20:50

Page 12: LÓGICA de PROGRAMAÇÃO II Avançado

12

Universidade do Sul de Santa Catarina

Carga horária

A carga horária total da disciplina é 60 horas/aula.

Agenda de atividades/ Cronograma

Verifi que 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.

logica_2_livro_caderno.indb 12logica_2_livro_caderno.indb 12 7/12/2006 14:20:507/12/2006 14:20:50

Page 13: LÓGICA de PROGRAMAÇÃO II Avançado

13

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)

logica_2_livro_caderno.indb 13logica_2_livro_caderno.indb 13 7/12/2006 14:20:507/12/2006 14:20:50

Page 14: LÓGICA de PROGRAMAÇÃO II Avançado

logica_2_livro_caderno.indb 14logica_2_livro_caderno.indb 14 7/12/2006 14:20:517/12/2006 14:20:51

Page 15: LÓGICA de PROGRAMAÇÃO II Avançado

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.

UNIDADE 1

Manipulação de vetores 1

logica_2_livro_caderno.indb 15logica_2_livro_caderno.indb 15 7/12/2006 14:20:517/12/2006 14:20:51

Page 16: LÓGICA de PROGRAMAÇÃO II Avançado

16

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 defi nir 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}

fi m

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”}

fi m

logica_2_livro_caderno.indb 16logica_2_livro_caderno.indb 16 7/12/2006 14:20:517/12/2006 14:20:51

Page 17: LÓGICA de PROGRAMAÇÃO II Avançado

17

Lógica de Programação II

Unidade 1

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”}

fi m

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.

logica_2_livro_caderno.indb 17logica_2_livro_caderno.indb 17 7/12/2006 14:20:517/12/2006 14:20:51

Page 18: LÓGICA de PROGRAMAÇÃO II Avançado

18

Universidade do Sul de Santa Catarina

SEÇÃO 1 - Conceito e declaração de vetores

Antes de defi nir 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 fi nal. 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}

fi m-para

media � soma/6 {calcula a média fi nal}

escreva “A média fi nal é “, media {mostra o resultado na tela}

fi m

Mas agora consta a seguinte complexidade: necessitamos imprimir também todas as notas do aluno, além da média fi nal. 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 signifi ca isso? Inicialmente, acompanhe o conceito de variáveis e sua defi nição.

logica_2_livro_caderno.indb 18logica_2_livro_caderno.indb 18 7/12/2006 14:20:517/12/2006 14:20:51

Page 19: LÓGICA de PROGRAMAÇÃO II Avançado

19

Lógica de Programação II

Unidade 1

Quando defi nimos 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 especifi car é 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 8.5 10.0

logica_2_livro_caderno.indb 19logica_2_livro_caderno.indb 19 7/12/2006 14:20:517/12/2006 14:20:51

Page 20: LÓGICA de PROGRAMAÇÃO II Avançado

20

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 é especifi cado 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. Especifi camos 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.

Sintaxe do vetor <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

logica_2_livro_caderno.indb 20logica_2_livro_caderno.indb 20 7/12/2006 14:20:517/12/2006 14:20:51

Page 21: LÓGICA de PROGRAMAÇÃO II Avançado

21

Lógica de Programação II

Unidade 1

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 especifi car 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 fi nal, 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 fi nal do vetor>] <tipo de constante que o vetor poderá conter>

logica_2_livro_caderno.indb 21logica_2_livro_caderno.indb 21 7/12/2006 14:20:517/12/2006 14:20:51

Page 22: LÓGICA de PROGRAMAÇÃO II Avançado

22

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.

logica_2_livro_caderno.indb 22logica_2_livro_caderno.indb 22 7/12/2006 14:20:527/12/2006 14:20:52

Page 23: LÓGICA de PROGRAMAÇÃO II Avançado

23

Lógica de Programação II

Unidade 1

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 fi caria 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 signifi ca 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.

logica_2_livro_caderno.indb 23logica_2_livro_caderno.indb 23 7/12/2006 14:20:527/12/2006 14:20:52

Page 24: LÓGICA de PROGRAMAÇÃO II Avançado

24

Universidade do Sul de Santa Catarina

Todo o processo de manipulação agora se torna bastante simples, bastando especifi car 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ífi ca. 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 fi nal 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}

fi m-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]

fi m-para

media � soma/6 {calcula a média fi nal}

escreva “A média fi nal é “, media {mostra o resultado na tela}

fi m

Dica: para trabalhar com vetores, sempre precisamos especifi car 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/fi m-para. Você consegue saber por quê?

logica_2_livro_caderno.indb 24logica_2_livro_caderno.indb 24 7/12/2006 14:20:527/12/2006 14:20:52

Page 25: LÓGICA de PROGRAMAÇÃO II Avançado

25

Lógica de Programação II

Unidade 1

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 fi m-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.}

j � j + 1 fi m-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 ] fi m-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 ] fi m-parafi m

logica_2_livro_caderno.indb 25logica_2_livro_caderno.indb 25 7/12/2006 14:20:527/12/2006 14:20:52

Page 26: LÓGICA de PROGRAMAÇÃO II Avançado

26

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 defi nir 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

fi m-para

fi m

logica_2_livro_caderno.indb 26logica_2_livro_caderno.indb 26 7/12/2006 14:20:527/12/2006 14:20:52

Page 27: LÓGICA de PROGRAMAÇÃO II Avançado

27

Lógica de Programação II

Unidade 1

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]

fi m-para

fi m

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]

fi m-para

logica_2_livro_caderno.indb 27logica_2_livro_caderno.indb 27 7/12/2006 14:20:537/12/2006 14:20:53

Page 28: LÓGICA de PROGRAMAÇÃO II Avançado

28

Universidade do Sul de Santa Catarina

{5 entradas de dados para verifi car 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 signifi ca 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.”

fi m-se

fi m-para

fi m

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:

logica_2_livro_caderno.indb 28logica_2_livro_caderno.indb 28 7/12/2006 14:20:537/12/2006 14:20:53

Page 29: LÓGICA de PROGRAMAÇÃO II Avançado

29

Lógica de Programação II

Unidade 1

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 especifi car 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 ]

fi m-para

{Processamento do algoritmo. Vamos verifi car o lucro de cada mercadoria (preço de venda – preço de compra) e verifi car 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 verifi ca se o lucro é inferior ou superior a 20%.}

logica_2_livro_caderno.indb 29logica_2_livro_caderno.indb 29 7/12/2006 14:20:537/12/2006 14:20:53

Page 30: LÓGICA de PROGRAMAÇÃO II Avançado

30

Universidade do Sul de Santa Catarina

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

se LUCRO < 20.0 então

TOTLUCROMENOR20 � TOTLUCROMENOR20 + 1

senão

TOTLUCROMAIOR20 � TOTLUCROMAIOR20 + 1

fi m-se {fi m da condição que testa se lucro é menor do que 20.0}

fi m-se {fi m da condição que testa se lucro é menor do que 10.0}

fi m-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

fi m

logica_2_livro_caderno.indb 30logica_2_livro_caderno.indb 30 7/12/2006 14:20:537/12/2006 14:20:53

Page 31: LÓGICA de PROGRAMAÇÃO II Avançado

31

Lógica de Programação II

Unidade 1

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 especifi car 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 Valor n

[0] [1] [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á!

logica_2_livro_caderno.indb 31logica_2_livro_caderno.indb 31 7/12/2006 14:20:537/12/2006 14:20:53

Page 32: LÓGICA de PROGRAMAÇÃO II Avançado

32

Universidade do Sul de Santa Catarina

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!

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, verifi car se há possibilidade no vôo desejado. Em caso afi rmativo, 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.

logica_2_livro_caderno.indb 32logica_2_livro_caderno.indb 32 7/12/2006 14:20:537/12/2006 14:20:53

Page 33: LÓGICA de PROGRAMAÇÃO II Avançado

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.

UNIDADE 2

Manipulação de matrizes 2

logica_2_livro_caderno.indb 33logica_2_livro_caderno.indb 33 7/12/2006 14:20:537/12/2006 14:20:53

Page 34: LÓGICA de PROGRAMAÇÃO II Avançado

34

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 especifi ca o número de colunas, conforme você pode ver a seguir:

Linha 0 Valor 1 Valor 2 Valor 3 ... Valor n

Coluna 0 Coluna 1 Coluna 2 Coluna n-1

Perceba na fi gura 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 fi gura 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 especifi car o índice que queremos acessar.

Por exemplo, para um vetor chamado de NOTAS de tamanho 5, podemos acessar os índices de 0 até 4 (lembre-se de que um vetor sempre começa com índice 0). Para acessar qualquer posição do vetor, basta especifi car 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 fi gura anterior:

Linha 0 7.5

Coluna 0 Coluna 1 Coluna 2 Coluna n-1

Observando a fi gura, 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

logica_2_livro_caderno.indb 34logica_2_livro_caderno.indb 34 7/12/2006 14:20:547/12/2006 14:20:54

Page 35: LÓGICA de PROGRAMAÇÃO II Avançado

35

Lógica de Programação II

Unidade 2

cada um dos valores, seja ele numérico, alfanumérico ou lógico, e que o índice que especifi camos 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 fi gura 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.

logica_2_livro_caderno.indb 35logica_2_livro_caderno.indb 35 7/12/2006 14:20:547/12/2006 14:20:54

Page 36: LÓGICA de PROGRAMAÇÃO II Avançado

36

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 é especifi cado 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.

logica_2_livro_caderno.indb 36logica_2_livro_caderno.indb 36 7/12/2006 14:20:547/12/2006 14:20:54

Page 37: LÓGICA de PROGRAMAÇÃO II Avançado

37

Lógica de Programação II

Unidade 2

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. Especifi camos 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}

logica_2_livro_caderno.indb 37logica_2_livro_caderno.indb 37 7/12/2006 14:20:547/12/2006 14:20:54

Page 38: LÓGICA de PROGRAMAÇÃO II Avançado

38

Universidade do Sul de Santa Catarina

Assim como na criação de vetores, para a criação de matrizes não precisamos especifi car 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 especifi car 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.

logica_2_livro_caderno.indb 38logica_2_livro_caderno.indb 38 7/12/2006 14:20:547/12/2006 14:20:54

Page 39: LÓGICA de PROGRAMAÇÃO II Avançado

39

Lógica de Programação II

Unidade 2

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 identifi car 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 fi ca a matriz.

10.0

Todo o processo de manipulação agora se torna simples, bastando especifi car a posição onde estaremos armazenando os valores, ou seja, basta especifi car 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.

logica_2_livro_caderno.indb 39logica_2_livro_caderno.indb 39 7/12/2006 14:20:547/12/2006 14:20:54

Page 40: LÓGICA de PROGRAMAÇÃO II Avançado

40

Universidade do Sul de Santa Catarina

Dica: para trabalhar com matrizes, sempre precisamos especifi car 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/fi m-para. 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 fi nal, utilizamos o comando para/faça/fi m-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/fi m-

para. 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, elabora-

mos 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]

fi m-para

fi m-para

{Processamento do Algoritmo. Soma das linhas. A explicação

desta parte está após o fi m-para do primeiro laço de repetição}

logica_2_livro_caderno.indb 40logica_2_livro_caderno.indb 40 7/12/2006 14:20:557/12/2006 14:20:55

Page 41: LÓGICA de PROGRAMAÇÃO II Avançado

41

Lógica de Programação II

Unidade 2

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]

fi m-para

escreva “Total da linha”, LINHA,”:”, SOMALINHA

fi m-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/

fi m-para, no nosso caso, apenas o comando SOMALINHA � SOMA-

LINHA + MAT[LINHA][COLUNA]. Quando o segundo laço de repetição é

fi nalizado, o programa executa os comandos seguintes ao fi m-para, ou

seja, executa o comando de impressão na tela escreva “Total da linha”,

LINHA,”:”, SOMALINHA. Ao encontrar o fi m-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/fi m-para novamente. Como SOMALINHA armazena o valor

numérico da soma dos valores da linha anterior, a variável é reinicial-

izada 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]

fi m-para

escreva “Total da coluna”, COLUNA,”:”, SOMACOLUNA

fi m-para

fi m

logica_2_livro_caderno.indb 41logica_2_livro_caderno.indb 41 7/12/2006 14:20:557/12/2006 14:20:55

Page 42: LÓGICA de PROGRAMAÇÃO II Avançado

42

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/fi m-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]

fi m-para

leia “Digite o número do mês a ser consultado: “,NUM

escreva NUM,” “, MESES[NUM][1], “,”, MESES[NUM][2], “, “, MESES[NUM][3]

fi m

logica_2_livro_caderno.indb 42logica_2_livro_caderno.indb 42 7/12/2006 14:20:557/12/2006 14:20:55

Page 43: LÓGICA de PROGRAMAÇÃO II Avançado

43

Lógica de Programação II

Unidade 2

2. Uma fl oricultura 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 fi car 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 especifi car 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

fi m-se

fi m-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 ]

fi m-para

fi m

logica_2_livro_caderno.indb 43logica_2_livro_caderno.indb 43 7/12/2006 14:20:557/12/2006 14:20:55

Page 44: LÓGICA de PROGRAMAÇÃO II Avançado

44

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 defi nimos uma matriz, especifi camos que tipo de variável a mesma vai armazenar (numérico, literal ou lógico). A sintaxe em pseudocódigo para defi nir 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 especifi car 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 especifi cadas: NOTAS[3][2] � 8.5. Estamos acessando a quarta linha e a terceira coluna da matriz.

Por fi m, 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 sofi sticados 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.

logica_2_livro_caderno.indb 44logica_2_livro_caderno.indb 44 7/12/2006 14:20:557/12/2006 14:20:55

Page 45: LÓGICA de PROGRAMAÇÃO II Avançado

45

Lógica de Programação II

Unidade 2

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 2 27

1 0 23 45

2 23 0 10

27 110 50 66 72 0

logica_2_livro_caderno.indb 45logica_2_livro_caderno.indb 45 7/12/2006 14:20:567/12/2006 14:20:56

Page 46: LÓGICA de PROGRAMAÇÃO II Avançado

46

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.

logica_2_livro_caderno.indb 46logica_2_livro_caderno.indb 46 7/12/2006 14:20:567/12/2006 14:20:56

Page 47: LÓGICA de PROGRAMAÇÃO II Avançado

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.

UNIDADE 3

Manipulação de registros 3

logica_2_livro_caderno.indb 47logica_2_livro_caderno.indb 47 7/12/2006 14:20:567/12/2006 14:20:56

Page 48: LÓGICA de PROGRAMAÇÃO II Avançado

48

Universidade do Sul de Santa Catarina

Para início de conversa

Quantas vezes você já preencheu fi chas de cadastros, seja em hotéis, em videolocadoras, para propostas de consórcios ou ainda fi chas de matrícula escolar? Nessas fi chas, 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 fi cha cadastral. Acompanhe a seguir.

início

{Declaração de variáveis}

NOME, ESTADOCIVIL, ENDERECO, BAIRRO: literal

IDADE, DATANASC, NUMERO, CEP, FONE: numérico

.....

fi m

logica_2_livro_caderno.indb 48logica_2_livro_caderno.indb 48 7/12/2006 14:20:567/12/2006 14:20:56

Page 49: LÓGICA de PROGRAMAÇÃO II Avançado

49

Lógica de Programação II

Unidade 3

Se fôssemos preencher apenas uma fi cha 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 fi cha 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 fi chas 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 fi cha cadastral. Na seção seguinte, vamos defi nir essa estrutura e vamos aprender a como declará-las.

logica_2_livro_caderno.indb 49logica_2_livro_caderno.indb 49 7/12/2006 14:20:567/12/2006 14:20:56

Page 50: LÓGICA de PROGRAMAÇÃO II Avançado

50

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 fi cha 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.

logica_2_livro_caderno.indb 50logica_2_livro_caderno.indb 50 7/12/2006 14:20:567/12/2006 14:20:56

Page 51: LÓGICA de PROGRAMAÇÃO II Avançado

51

Lógica de Programação II

Unidade 3

Sintaxe do registro<nome do registro>: registro

<campos que comporão o registro>

fi m-registro

onde <campos que comporão o registro> são todas as variáveis que irão compor uma fi cha de dados, ou seja, NOME, IDADE, CPF, ENDERECO etc.

Vamos imaginar uma fi cha 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

fi m-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 fi m-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 fi cha cadastral.

Outra diferença importante é a questão de como acessamos as variáveis declaradas dentro de uma estrutura.

logica_2_livro_caderno.indb 51logica_2_livro_caderno.indb 51 7/12/2006 14:20:567/12/2006 14:20:56

Page 52: LÓGICA de PROGRAMAÇÃO II Avançado

52

Universidade do Sul de Santa Catarina

Como podemos ler e escrever nessas variáveis?

A resposta é bastante simples. Basta especifi carmos o nome do registro criado, seguido de um ponto (.) e o nome da variável. Por exemplo, para acessar a variável NOME, precisamos especifi car 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 especifi car 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 fi chas cadastrais. A fi gura a seguir mostra uma possível fi cha cadastral:

Nome: Idade:

Estado Civil:

Endereço:

Número:

Bairro: Cidade:

Estado: Telefone:

logica_2_livro_caderno.indb 52logica_2_livro_caderno.indb 52 7/12/2006 14:20:577/12/2006 14:20:57

Page 53: LÓGICA de PROGRAMAÇÃO II Avançado

53

Lógica de Programação II

Unidade 3

Observando a fi gura anterior, podemos verifi car que temos variáveis literais e numéricas.

Vamos classifi cá-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 especifi cado devemos colocar então como sendo 2788080.

Criaremos um registro para a fi cha cadastral. Iremos chamar esse registro de FICHA. Sendo assim, em pseudocódigo, temos:

FICHA: registro

{variáveis da fi cha}

fi m-registro

Agora vamos defi nir as variáveis. Iremos especifi car 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 fi cha}

NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal

IDADE, NUMERO, TELEFONE: numérico

fi m-registro

Isso é tudo. Nossa fi cha já está montada. Basta utilizá-la agora acessando as variáveis do registro. O algoritmo a seguir, mostra um exemplo completo.

logica_2_livro_caderno.indb 53logica_2_livro_caderno.indb 53 7/12/2006 14:20:577/12/2006 14:20:57

Page 54: LÓGICA de PROGRAMAÇÃO II Avançado

54

Universidade do Sul de Santa Catarina

Pseudocódigo:

início

{declaração do registro FICHA}

FICHA: registro

{variáveis da fi cha}

NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal

IDADE, NUMERO, TELEFONE: numérico

fi m-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

fi m

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.

logica_2_livro_caderno.indb 54logica_2_livro_caderno.indb 54 7/12/2006 14:20:577/12/2006 14:20:57

Page 55: LÓGICA de PROGRAMAÇÃO II Avançado

55

Lógica de Programação II

Unidade 3

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 sufi cientes para resolver um algoritmo. Seria interessante que pudéssemos criar tipos defi nidos 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 defi nido 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, fi cando assim sua sintaxe:

tipo <nome do registro> = registro

<campos que comporão o registro>

fi m-registro

O comando tipo serve para criar novos tipos de variáveis a partir dos tipos básicos.

logica_2_livro_caderno.indb 55logica_2_livro_caderno.indb 55 7/12/2006 14:20:577/12/2006 14:20:57

Page 56: LÓGICA de PROGRAMAÇÃO II Avançado

56

Universidade do Sul de Santa Catarina

Por exemplo, no exercício de para manipular uma fi cha cadastral colocado anteriormente, poderíamos fazer do registro FICHA um tipo e declarar variáveis daquele tipo. A sintaxe fi caria conforme a seguir:

tipo FICHA = registro

{variáveis da fi cha}

NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal

IDADE, NUMERO, TELEFONE: numérico

fi m-registro

Para criar uma variável do tipo FICHA, criamos da mesma forma que criamos as variáveis dos tipos primitivos. Por exemplo, fi cha1: FICHA, onde fi cha1 é agora uma variável do tipo FICHA. Passamos a acessar as variáveis do registro FICHA a partir da variável fi cha1.

Exemplo: fi cha1.NOME, fi cha1.ENDERECO e assim por diante.

O que quero dizer é que FICHA é um tipo defi nido pelo programador e que fi cha1 é 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:

logica_2_livro_caderno.indb 56logica_2_livro_caderno.indb 56 7/12/2006 14:20:577/12/2006 14:20:57

Page 57: LÓGICA de PROGRAMAÇÃO II Avançado

57

Lógica de Programação II

Unidade 3

início

{declaração do registro FICHA}

tipo FICHA = registro

{variáveis da fi cha}

NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal

IDADE, NUMERO, TELEFONE: numérico

fi m-registro

fi cha1 : FICHA {declaração da variável do tipo FICHA. Observe que o tipo FICHA é defi nido antes de ser utilizado. Isso é obrigatório, tendo em vista que o programa precisa saber o que é FICHA. Como defi nimos FICHA como sendo um registro, ao especifi car fi cha1 como sendo do tipo FICHA, nenhum problema será encontrado}

escreva “Nome: “

leia fi cha1.NOME

escreva “Estado Civil: “

leia fi cha1.ESTADOCIVIL

........ {restante do algoritmo}

fi m

Mas qual é a utilidade de se criar tipos como no nosso exemplo?

É muito simples. Perceba que criamos apenas uma fi cha cadastral de um hóspede. Se quiséssemos preencher o cadastro para um novo hóspede, bastaria criarmos outra variável, fi cha2 por exemplo. Poderíamos criar tantas fi chas quanto quisermos. Considerando o tipo FICHA anteriormente criado, podemos criar várias variáveis:

fi cha1, fi cha2, fi cha3: FICHA.

Cada variável representa uma fi cha para cadastrar um hóspede. É como se tivéssemos 3 fi chas cadastrais para serem preenchidas na mão. Para acessar o nome de fi cha1, apenas colocaríamos fi cha1.NOME. Para acessar o nome de fi cha2, fi cha2.NOME, e para fi cha3, fi cha3.NOME. Como cada variável, nesse caso, fi cha1, fi cha2 e fi cha3 são três blocos de memórias independentes,

logica_2_livro_caderno.indb 57logica_2_livro_caderno.indb 57 7/12/2006 14:20:577/12/2006 14:20:57

Page 58: LÓGICA de PROGRAMAÇÃO II Avançado

58

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 fi chas 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 fi chas de clientes, criamos um vetor de FICHA (tipo defi nido por nós). Na sintaxe de pseudocódigo teríamos: fi chas: vetor [100] FICHA. Agora, defi nimos um vetor de 100 posições chamado de fi chas, 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 fi chas, Ficha2 está na posição 1 do vetor fi chas, e assim sucessivamente.

Mas o que é uma FICHA mesmo? FICHA é um registro que tem os seguintes campos defi nidos anteriormente:

NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal

IDADE, NUMERO, TELEFONE: numérico.

logica_2_livro_caderno.indb 58logica_2_livro_caderno.indb 58 7/12/2006 14:20:577/12/2006 14:20:57

Page 59: LÓGICA de PROGRAMAÇÃO II Avançado

59

Lógica de Programação II

Unidade 3

Como podemos acessar os dados de cada fi cha 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 defi nidas. Veja a fi gura a seguir.

[0] [1] [2] ... ... Ficha 99

Para acessar um desses campos basta colocar um ponto (.) seguido do nome da variável defi nida dentro do registro.

Por exemplo, para acessar o nome do primeiro hóspede (defi nido na posição 0 do vetor fi chas), colocamos fi chas [0].NOME; para acessar a idade dessa mesma fi cha, colocarmos fi chas [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á defi nido da posição 59 do nosso vetor, certo? Desta forma, podemos preencher os dados conforme a seguir:

fi chas[59].NOME � “Luiz Silva”

fi chas[59].ESTADOCIVIL � “solteiro”

fi chas[59].ENDERECO � “Avenida Paulista”

fi chas[59].IDADE � 30

{e assim para os demais dados deste hóspede}.

� nome

� estadocivil

� endereco

� bairro

� cidade

� estado

� idade, numero

� telefone

� nome

� estadocivil

� endereco

� bairro

� cidade

� estado

� idade, numero

� telefone

logica_2_livro_caderno.indb 59logica_2_livro_caderno.indb 59 7/12/2006 14:20:587/12/2006 14:20:58

Page 60: LÓGICA de PROGRAMAÇÃO II Avançado

60

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ê fi zer, 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

fi m-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

logica_2_livro_caderno.indb 60logica_2_livro_caderno.indb 60 7/12/2006 14:20:587/12/2006 14:20:58

Page 61: LÓGICA de PROGRAMAÇÃO II Avançado

61

Lógica de Programação II

Unidade 3

escreva “Digite a média mínima necessária para aprovação: “

leia DISCIPLINAS[POS].MEDIA

fi m-para

{verifi caçã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 NOME-

CONSUL 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 signifi ca pular para a próxima posição do vetor}

fi m-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 !”

fi m-se

fi m-parafi m

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 fi m-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}

logica_2_livro_caderno.indb 61logica_2_livro_caderno.indb 61 7/12/2006 14:20:587/12/2006 14:20:58

Page 62: LÓGICA de PROGRAMAÇÃO II Avançado

62

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 fi m-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 verifi car a existência do cantor} POS � POS + 1 fi m-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 !” fi m-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 ocor-reu fora do laço de repetição. Dessa vez, o comando de leitura é realizado para permitir com que o usuário fi nalize o programa digitando FIM. Caso não colocássemos essa opção, teríamos um laço infi nito. Lembra que todo algoritmo tem que possuir um fi m?} escreva “Digite o nome do cantor ou grupo a ser consultado (ou FIM para encerrar): “ leia CANTORCONSUL fi m-enquanto

fi m

logica_2_livro_caderno.indb 62logica_2_livro_caderno.indb 62 7/12/2006 14:20:587/12/2006 14:20:58

Page 63: LÓGICA de PROGRAMAÇÃO II Avançado

63

Lógica de Programação II

Unidade 3

Síntese

Você acaba de fi nalizar 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 fi cha 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> fi m-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> fi m-registro

Por fi m, 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á!

logica_2_livro_caderno.indb 63logica_2_livro_caderno.indb 63 7/12/2006 14:20:587/12/2006 14:20:58

Page 64: LÓGICA de PROGRAMAÇÃO II Avançado

64

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 fi cha cadastral. Escolha as variáveis de maior importância para o cadastro do hóspede.

logica_2_livro_caderno.indb 64logica_2_livro_caderno.indb 64 7/12/2006 14:20:597/12/2006 14:20:59

Page 65: LÓGICA de PROGRAMAÇÃO II Avançado

65

Lógica de Programação II

Unidade 3

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.

logica_2_livro_caderno.indb 65logica_2_livro_caderno.indb 65 7/12/2006 14:20:597/12/2006 14:20:59

Page 66: LÓGICA de PROGRAMAÇÃO II Avançado

66

Universidade do Sul de Santa Catarina

3. Cadastre imprima os dados das fi tas de vídeo de uma locadora: código do fi lme, nome, tipo de fi lme, duração, produtor, ator principal, diretor a ano de produção.

logica_2_livro_caderno.indb 66logica_2_livro_caderno.indb 66 7/12/2006 14:20:597/12/2006 14:20:59

Page 67: LÓGICA de PROGRAMAÇÃO II Avançado

67

Lógica de Programação II

Unidade 3

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.

logica_2_livro_caderno.indb 67logica_2_livro_caderno.indb 67 7/12/2006 14:20:597/12/2006 14:20:59

Page 68: LÓGICA de PROGRAMAÇÃO II Avançado

68

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}

fi m

Segunda maneira:

início

tipo FICHA = registro

NOME: literal

CPF: literal

FONE: numérico

fi m-registro

fi chas: vetor[50] FICHA {declaração de um vetor de FICHAS}

..... {implementação do algoritmo}

fi m

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.

logica_2_livro_caderno.indb 68logica_2_livro_caderno.indb 68 7/12/2006 14:20:597/12/2006 14:20:59

Page 69: LÓGICA de PROGRAMAÇÃO II Avançado

69

Lógica de Programação II

Unidade 3

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.

logica_2_livro_caderno.indb 69logica_2_livro_caderno.indb 69 7/12/2006 14:20:597/12/2006 14:20:59

Page 70: LÓGICA de PROGRAMAÇÃO II Avançado

logica_2_livro_caderno.indb 70logica_2_livro_caderno.indb 70 7/12/2006 14:20:597/12/2006 14:20:59

Page 71: LÓGICA de PROGRAMAÇÃO II Avançado

UNIDADE 4

Tópicos avançados em algoritmos computacionais 4

Objetivo de aprendizagem

� Identifi car 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 71logica_2_livro_caderno.indb 71 7/12/2006 14:20:597/12/2006 14:20:59

Page 72: LÓGICA de PROGRAMAÇÃO II Avançado

72

Universidade do Sul de Santa Catarina

Para início de conversa

Você está quase fi nalizando 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ê identifi que 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 verifi car se realmente entendeu. São fascinantes os desafi os 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

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.

Em caso de dúvida, consulte a Unidade 3 de

Lógica de Programação I.

logica_2_livro_caderno.indb 72logica_2_livro_caderno.indb 72 7/12/2006 14:20:597/12/2006 14:20:59

Page 73: LÓGICA de PROGRAMAÇÃO II Avançado

73

Lógica de Programação II

Unidade 4

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 desafi o? 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 fi cou 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.

logica_2_livro_caderno.indb 73logica_2_livro_caderno.indb 73 7/12/2006 14:20:597/12/2006 14:20:59

Page 74: LÓGICA de PROGRAMAÇÃO II Avançado

74

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/fi m-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 ]

fi m-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é-defi nida. 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 é fi nalizado o teste. Precisamos, assim, criar 2 novas variáveis: POS, armazena

logica_2_livro_caderno.indb 74logica_2_livro_caderno.indb 74 7/12/2006 14:20:597/12/2006 14:20:59

Page 75: LÓGICA de PROGRAMAÇÃO II Avançado

75

Lógica de Programação II

Unidade 4

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 fi nal do vetor).

POS, ULTIMO: numérico

POS � 0

ULTIMO � 4

10.0 8.0 9.0 7.0 8.5

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 verifi car 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}.

POS ULTIMA

logica_2_livro_caderno.indb 75logica_2_livro_caderno.indb 75 7/12/2006 14:21:007/12/2006 14:21:00

Page 76: LÓGICA de PROGRAMAÇÃO II Avançado

76

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 8.5

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 9.0 7.0 8.5

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 verifi car 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}.

POS ULTIMA

POS ULTIMA

logica_2_livro_caderno.indb 76logica_2_livro_caderno.indb 76 7/12/2006 14:21:007/12/2006 14:21:00

Page 77: LÓGICA de PROGRAMAÇÃO II Avançado

77

Lógica de Programação II

Unidade 4

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 8.5

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 8.5

Como resposta da execução do passo 8, temos a seguinte formação do vetor:

8.0 9.0 7.0 10.0 8.5

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 10.0 8.5

POS ULTIMA

POS ULTIMA

POS ULTIMA

POS ULTIMA

logica_2_livro_caderno.indb 77logica_2_livro_caderno.indb 77 7/12/2006 14:21:007/12/2006 14:21:00

Page 78: LÓGICA de PROGRAMAÇÃO II Avançado

78

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á fi car, 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 fi nal 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 verifi car 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 fi nal 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 8.5 10.0

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 7.0 8.5 9.0 10.0

POS ULTIMA

POS ULTIMA

logica_2_livro_caderno.indb 78logica_2_livro_caderno.indb 78 7/12/2006 14:21:007/12/2006 14:21:00

Page 79: LÓGICA de PROGRAMAÇÃO II Avançado

79

Lógica de Programação II

Unidade 4

14. Repetimos novamente os passos, temos o seguinte vetor:

7.0 8.0 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.

POS ULTIMA

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}

fi m-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

logica_2_livro_caderno.indb 79logica_2_livro_caderno.indb 79 7/12/2006 14:21:007/12/2006 14:21:00

Page 80: LÓGICA de PROGRAMAÇÃO II Avançado

80

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

fi m-se

{incrementa posição do vetor}

POS � POS + 1

fi m-enquanto

{inicializa variável POS e decrementa a variável ULTIMA de 1}

POS � 0

ULTIMA � ULTIMA -1

fi m-enquanto

fi m

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.

logica_2_livro_caderno.indb 80logica_2_livro_caderno.indb 80 7/12/2006 14:21:007/12/2006 14:21:00

Page 81: LÓGICA de PROGRAMAÇÃO II Avançado

81

Lógica de Programação II

Unidade 4

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 especifi que 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 “Especifi que a idade do cliente: “

leia IDADES[CONT] {observe que a variável CONT vai de 0 até 4}

fi m-para

logica_2_livro_caderno.indb 81logica_2_livro_caderno.indb 81 7/12/2006 14:21:017/12/2006 14:21:01

Page 82: LÓGICA de PROGRAMAÇÃO II Avançado

82

Universidade do Sul de Santa Catarina

2. Preenchido o vetor, iremos realizar nosso processamento. O processamento é simplesmente encontrar a idade especifi cada pelo usuário. Vamos precisar entrar com a idade do cliente e verifi car 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 verifi car se existe ou não o valor numérico digitado pelo usuário e armazenado na variável ENTRADA. Vamos supor que você especifi que 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, fi nalizamos a pesquisa. Caso contrário, percorremos o vetor IDADES até encontrar o valor desejado ou até o fi m 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 fi nal do vetor IDADES (CONT <= 4 ), incrementamos a variável CONT de 1. Isso signifi ca 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 verifi que quando a condição se torna falsa, ou seja, quando que o laço de repetição é fi nalizado.}

CONT � CONT + 1

fi m-enquanto

{na seqüência, verifi ca-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.”

fi m-se

fi m-algoritmo

logica_2_livro_caderno.indb 82logica_2_livro_caderno.indb 82 7/12/2006 14:21:017/12/2006 14:21:01

Page 83: LÓGICA de PROGRAMAÇÃO II Avançado

83

Lógica de Programação II

Unidade 4

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 “Especifi que a idade do cliente: “

leia IDADES[ CONT ]

fi m-para

CONT � 0

escreva “Entre com a idade“

leia ENTRADA

enquanto IDADES[ CONT ] < > ENTRADA e CONT <= 4 faça

CONT � CONT + 1

fi m-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.”

fi m-se

fi m-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 signifi ca uma redução importante de tempo de procura, principalmente se temos um vetor de dimensão grande, por exemplo, 1000 elementos.

logica_2_livro_caderno.indb 83logica_2_livro_caderno.indb 83 7/12/2006 14:21:017/12/2006 14:21:01

Page 84: LÓGICA de PROGRAMAÇÃO II Avançado

84

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 desafi o você tem pela frente. A solução completa está no fi nal da unidade, para você verifi car 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 verifi car se o valor contido nessa posição é maior ou menor do que o valor que estamos procurando?

Em nosso exemplo, podemos verifi car 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

logica_2_livro_caderno.indb 84logica_2_livro_caderno.indb 84 7/12/2006 14:21:017/12/2006 14:21:01

Page 85: LÓGICA de PROGRAMAÇÃO II Avançado

85

Lógica de Programação II

Unidade 4

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 signifi ca 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 fi nal. 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.

logica_2_livro_caderno.indb 85logica_2_livro_caderno.indb 85 7/12/2006 14:21:017/12/2006 14:21:01

Page 86: LÓGICA de PROGRAMAÇÃO II Avançado

86

Universidade do Sul de Santa Catarina

METADE = (PRIMEIRA + ULTIMA)/2

PRIMEIRA: 0

ULTIMA: 4

METADE: (0 + 4)/2 = 2

10 44 58 78 100

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 fi nal. Como já verifi camos 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, fi cando assim nossa nova estrutura:

10 44 58 78 100

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 ULTIMAMETADE

PRIMEIRA ULTIMA

METADEPRIMEIRA ULTIMA

logica_2_livro_caderno.indb 86logica_2_livro_caderno.indb 86 7/12/2006 14:21:017/12/2006 14:21:01

Page 87: LÓGICA de PROGRAMAÇÃO II Avançado

87

Lógica de Programação II

Unidade 4

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 58 78 100

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á verifi camos 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 58 78 100

PRIMEIRA ULTIMAMETADE

PRIMEIRA ULTIMA

logica_2_livro_caderno.indb 87logica_2_livro_caderno.indb 87 7/12/2006 14:21:027/12/2006 14:21:02

Page 88: LÓGICA de PROGRAMAÇÃO II Avançado

88

Universidade do Sul de Santa Catarina

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á fi nalizado. Agora é com você. Realize as atividades de auto-avaliaçã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 efi ciente, 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 verifi car se o valor que estamos procurando está exatamente na metade do vetor, ou acima ou abaixo da metade encontra. Caso esteja

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 78 100

PRIMEIRA ULTIMAMETADE

logica_2_livro_caderno.indb 88logica_2_livro_caderno.indb 88 7/12/2006 14:21:027/12/2006 14:21:02

Page 89: LÓGICA de PROGRAMAÇÃO II Avançado

89

Lógica de Programação II

Unidade 4

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.

acima ou abaixo da metade, dividimos o vetor novamente até que o número seja encontrado. É um método bastante efi ciente de procura, porém há a necessidade de que o mesmo esteja ordenado em ordem crescente.

Nossos algoritmos estão fi cando grandes e complexos. É hora de estruturá-los de forma a fi carem 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.

logica_2_livro_caderno.indb 89logica_2_livro_caderno.indb 89 7/12/2006 14:21:027/12/2006 14:21:02

Page 90: LÓGICA de PROGRAMAÇÃO II Avançado

90

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 verifi car se os alunos com essas matrículas estão matriculados ou não.

logica_2_livro_caderno.indb 90logica_2_livro_caderno.indb 90 7/12/2006 14:21:027/12/2006 14:21:02

Page 91: LÓGICA de PROGRAMAÇÃO II Avançado

91

Lógica de Programação II

Unidade 4

3. Monte um algoritmo em pseudocódigo que implemente os processos lógicos descritos anteriormente. Esse é um algoritmo de pesquisa binária.

logica_2_livro_caderno.indb 91logica_2_livro_caderno.indb 91 7/12/2006 14:21:027/12/2006 14:21:02

Page 92: LÓGICA de PROGRAMAÇÃO II Avançado

92

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ê.

logica_2_livro_caderno.indb 92logica_2_livro_caderno.indb 92 7/12/2006 14:21:027/12/2006 14:21:02

Page 93: LÓGICA de PROGRAMAÇÃO II Avançado

93

Lógica de Programação II

Unidade 4

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.

logica_2_livro_caderno.indb 93logica_2_livro_caderno.indb 93 7/12/2006 14:21:027/12/2006 14:21:02

Page 94: LÓGICA de PROGRAMAÇÃO II Avançado

logica_2_livro_caderno.indb 94logica_2_livro_caderno.indb 94 7/12/2006 14:21:027/12/2006 14:21:02

Page 95: LÓGICA de PROGRAMAÇÃO II Avançado

UNIDADE 5

Programação estruturada 5Objetivos 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 95logica_2_livro_caderno.indb 95 7/12/2006 14:21:027/12/2006 14:21:02

Page 96: LÓGICA de PROGRAMAÇÃO II Avançado

96

Universidade do Sul de Santa Catarina

Para início de conversa

Você está iniciando agora a última unidade da disciplina. Isso não signifi ca que os estudos acabaram por aqui. Muito pelo contrário, acabaram de começar. No fi nal 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ífi ca 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?

logica_2_livro_caderno.indb 96logica_2_livro_caderno.indb 96 7/12/2006 14:21:037/12/2006 14:21:03

Page 97: LÓGICA de PROGRAMAÇÃO II Avançado

97

Lógica de Programação II

Unidade 5

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 fi nal. A cada uma dessas partes bem defi nidas, 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 defi nida 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 fi nita 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ífi ca. Estas tarefas não podem ser redundantes nem subjetivas na sua defi niçã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.

logica_2_livro_caderno.indb 97logica_2_livro_caderno.indb 97 7/12/2006 14:21:037/12/2006 14:21:03

Page 98: LÓGICA de PROGRAMAÇÃO II Avançado

98

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 fi m, 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 fi nal. 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 fi gura a seguir:

logica_2_livro_caderno.indb 98logica_2_livro_caderno.indb 98 7/12/2006 14:21:037/12/2006 14:21:03

Page 99: LÓGICA de PROGRAMAÇÃO II Avançado

99

Lógica de Programação II

Unidade 5

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 defi nidos

logica_2_livro_caderno.indb 99logica_2_livro_caderno.indb 99 7/12/2006 14:21:037/12/2006 14:21:03

Page 100: LÓGICA de PROGRAMAÇÃO II Avançado

100

Universidade do Sul de Santa Catarina

dentro do módulo são executados. Quando fi nalizados, 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ífi ca. 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.

logica_2_livro_caderno.indb 100logica_2_livro_caderno.indb 100 7/12/2006 14:21:037/12/2006 14:21:03

Page 101: LÓGICA de PROGRAMAÇÃO II Avançado

101

Lógica de Programação II

Unidade 5

Com dúvida ainda? Não tem problema. Acompanhe um exemplo bastante simples que irá permitir que você entenda o que defi nimos 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”

fi m

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 fi nal. Sempre que quisermos somar dois números chamamos essa sub-rotina.

logica_2_livro_caderno.indb 101logica_2_livro_caderno.indb 101 7/12/2006 14:21:037/12/2006 14:21:03

Page 102: LÓGICA de PROGRAMAÇÃO II Avançado

102

Universidade do Sul de Santa Catarina

Nosso pseudocódigo fi caria 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”

fi m

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

fi m-função

logica_2_livro_caderno.indb 102logica_2_livro_caderno.indb 102 7/12/2006 14:21:047/12/2006 14:21:04

Page 103: LÓGICA de PROGRAMAÇÃO II Avançado

103

Lógica de Programação II

Unidade 5

Pontos a observar:

1. Observe onde estão defi nidas as variáveis antes e após a modularização. Antes da modularização, as variáveis estão defi nidas dentro do programa principal. Após a modularização, as variáveis estão defi nidas dentro da função FUNCAO_SOMA. Isso é apenas para colocar o seguinte: as variáveis são defi nidas onde elas são utilizadas. Mais importante, uma variável defi nida no programa principal não é reconhecida na função FUNCAO_SOMA, e uma variável defi nida 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á defi nida dentro do programa principal}

escreva “Programa Finalizado”

fi m

O porquê disso? A resposta é que a variável N1 está defi nida 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 fi m, o valor é impresso. Quando os comandos são fi nalizados encontrando o comando fi m 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 fi m.

logica_2_livro_caderno.indb 103logica_2_livro_caderno.indb 103 7/12/2006 14:21:047/12/2006 14:21:04

Page 104: LÓGICA de PROGRAMAÇÃO II Avançado

104

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á defi nida dentro do programa principal. Essa variável local é diferente da variável local defi nida na função SOMA.}

escreva “Programa Finalizado”

fi m

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”

fi m

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 defi nido a função como FSOMA,

logica_2_livro_caderno.indb 104logica_2_livro_caderno.indb 104 7/12/2006 14:21:047/12/2006 14:21:04

Page 105: LÓGICA de PROGRAMAÇÃO II Avançado

105

Lógica de Programação II

Unidade 5

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 signifi cando 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 verifi car 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

logica_2_livro_caderno.indb 105logica_2_livro_caderno.indb 105 7/12/2006 14:21:047/12/2006 14:21:04

Page 106: LÓGICA de PROGRAMAÇÃO II Avançado

106

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 signifi ca 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 fi nalizar a função com o comando fi m, 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.

logica_2_livro_caderno.indb 106logica_2_livro_caderno.indb 106 7/12/2006 14:21:047/12/2006 14:21:04

Page 107: LÓGICA de PROGRAMAÇÃO II Avançado

107

Lógica de Programação II

Unidade 5

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

<identifi cador> onde identifi cador é o nome de uma variável defi nida dentro da função}

retorna SOMA.

fi m-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

logica_2_livro_caderno.indb 107logica_2_livro_caderno.indb 107 7/12/2006 14:21:047/12/2006 14:21:04

Page 108: LÓGICA de PROGRAMAÇÃO II Avançado

108

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 fi caria 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 <identifi cador> dentro da função, o valor de <identifi cador> é 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 é defi nida 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 verifi car 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”

fi m

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 fi ca 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.

logica_2_livro_caderno.indb 108logica_2_livro_caderno.indb 108 7/12/2006 14:21:057/12/2006 14:21:05

Page 109: LÓGICA de PROGRAMAÇÃO II Avançado

109

Lógica de Programação II

Unidade 5

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 defi nida dentro do programa principal para uma função?

A resposta é sim. Perceba que estamos agora fazendo o caminho da volta do que fi zemos 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 signifi ca passagem de parâmetros? Para responder essa questão, voltamos à fi gura onde defi nimos 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 defi nidas em outra função qualquer também.

logica_2_livro_caderno.indb 109logica_2_livro_caderno.indb 109 7/12/2006 14:21:057/12/2006 14:21:05

Page 110: LÓGICA de PROGRAMAÇÃO II Avançado

110

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 (defi nidas 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 defi nidas 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 defi nimos 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}

fi m-função

Os parâmetros de uma função são defi nidos 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}

fi m-função

logica_2_livro_caderno.indb 110logica_2_livro_caderno.indb 110 7/12/2006 14:21:057/12/2006 14:21:05

Page 111: LÓGICA de PROGRAMAÇÃO II Avançado

111

Lógica de Programação II

Unidade 5

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

fi m

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 defi nir variáveis locais com os mesmos nomes do que os parâmetros da função. Em nosso exemplo, não podemos declarar

logica_2_livro_caderno.indb 111logica_2_livro_caderno.indb 111 7/12/2006 14:21:057/12/2006 14:21:05

Page 112: LÓGICA de PROGRAMAÇÃO II Avançado

112

Universidade do Sul de Santa Catarina

uma variável chamada NUM1 porque já está defi nida 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}

fi m-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 signifi ca 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>

logica_2_livro_caderno.indb 112logica_2_livro_caderno.indb 112 7/12/2006 14:21:057/12/2006 14:21:05

Page 113: LÓGICA de PROGRAMAÇÃO II Avançado

113

Lógica de Programação II

Unidade 5

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 fi ca 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 fi ca:

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

logica_2_livro_caderno.indb 113logica_2_livro_caderno.indb 113 7/12/2006 14:21:057/12/2006 14:21:05

Page 114: LÓGICA de PROGRAMAÇÃO II Avançado

114

Universidade do Sul de Santa Catarina

Acompanhe mais alguns exemplos de funções. O interesse aqui é apenas verifi car 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

fi m-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)

fi m-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 fi nalizando os estudos de lógica de

programação. Foi um desafi o e tanto não?

logica_2_livro_caderno.indb 114logica_2_livro_caderno.indb 114 7/12/2006 14:21:067/12/2006 14:21:06

Page 115: LÓGICA de PROGRAMAÇÃO II Avançado

115

Lógica de Programação II

Unidade 5

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ê fi zer, 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 profi ssional de programação ou um digitador profi ssional?

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 pro-

blema complexo em problemas menores, podemos construir algo-

ritmos para cada um deles de forma bem defi nida, 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ífi ca 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.

logica_2_livro_caderno.indb 115logica_2_livro_caderno.indb 115 7/12/2006 14:21:067/12/2006 14:21:06

Page 116: LÓGICA de PROGRAMAÇÃO II Avançado

116

Universidade do Sul de Santa Catarina

Em pseudocódigo, utilizamos o conceito de função para mo-

dularizar 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 desenvolvi-

mento 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.

logica_2_livro_caderno.indb 116logica_2_livro_caderno.indb 116 7/12/2006 14:21:067/12/2006 14:21:06

Page 117: LÓGICA de PROGRAMAÇÃO II Avançado

117

Lógica de Programação II

Unidade 5

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.

logica_2_livro_caderno.indb 117logica_2_livro_caderno.indb 117 7/12/2006 14:21:067/12/2006 14:21:06

Page 118: LÓGICA de PROGRAMAÇÃO II Avançado

118

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).

logica_2_livro_caderno.indb 118logica_2_livro_caderno.indb 118 7/12/2006 14:21:067/12/2006 14:21:06

Page 119: LÓGICA de PROGRAMAÇÃO II Avançado

119

Lógica de Programação II

Unidade 5

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.

logica_2_livro_caderno.indb 119logica_2_livro_caderno.indb 119 7/12/2006 14:21:067/12/2006 14:21:06

Page 120: LÓGICA de PROGRAMAÇÃO II Avançado

120

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 de-

senvolvimento de programação de computadores.

logica_2_livro_caderno.indb 120logica_2_livro_caderno.indb 120 7/12/2006 14:21:067/12/2006 14:21:06

Page 121: LÓGICA de PROGRAMAÇÃO II Avançado

Para concluir o estudo

Você chegou ao fi nal 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 121logica_2_livro_caderno.indb 121 7/12/2006 14:21:067/12/2006 14:21:06

Page 122: LÓGICA de PROGRAMAÇÃO II Avançado

logica_2_livro_caderno.indb 122logica_2_livro_caderno.indb 122 7/12/2006 14:21:067/12/2006 14:21:06

Page 123: LÓGICA de PROGRAMAÇÃO II Avançado

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.

Referências

logica_2_livro_caderno.indb 123logica_2_livro_caderno.indb 123 7/12/2006 14:21:067/12/2006 14:21:06

Page 124: LÓGICA de PROGRAMAÇÃO II Avançado

logica_2_livro_caderno.indb 124logica_2_livro_caderno.indb 124 7/12/2006 14:21:077/12/2006 14:21:07

Page 125: LÓGICA de PROGRAMAÇÃO II Avançado

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 125logica_2_livro_caderno.indb 125 7/12/2006 14:21:077/12/2006 14:21:07

Page 126: LÓGICA de PROGRAMAÇÃO II Avançado

logica_2_livro_caderno.indb 126logica_2_livro_caderno.indb 126 7/12/2006 14:21:077/12/2006 14:21:07

Page 127: LÓGICA de PROGRAMAÇÃO II Avançado

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 “Especifi que o número de vôos disponíveis”

leia NUM_VOOS

para I de 0 até NUM_VOOS-1 passo 1 faça

escreva “Especifi que a quantidade de lugares disponíveis para o vôo:”, I+1

leia VOOS[ I ]

fi m-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 127logica_2_livro_caderno.indb 127 7/12/2006 14:21:077/12/2006 14:21:07

Page 128: LÓGICA de PROGRAMAÇÃO II Avançado

128

Universidade do Sul de Santa Catarina

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]

fi m-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]

escreva “Entre com o RG do passageiro:”

leia RG

senão

escreva “Não há lugares disponíveis no vôo”, NVD

fi m-se

senão

escreva “Não existe esse vôo”,

fi m-se

escreva “Entre com o número do vôo ou –1 para sair:”

leia NVD

fi m-enquanto

fi m

logica_2_livro_caderno.indb 128logica_2_livro_caderno.indb 128 7/12/2006 14:21:077/12/2006 14:21:07

Page 129: LÓGICA de PROGRAMAÇÃO II Avançado

129

Lógica de Programação II

leia DISTANCIAS[LINHA][COLUNA]

fi m-se

fi m-para

fi m-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

fi m-enquanto

COLUNA � 0

enquanto NOMES[COLUNA] <> CAPITAL2 ou COLUNA <= 27 faça

COLUNA � COLUNA + 1

fi m-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!”

fi m-se

senão

escreva “Nome “,CAPITAL1,” não consta no cadastro!”

fi m-se

fi m

logica_2_livro_caderno.indb 129logica_2_livro_caderno.indb 129 7/12/2006 14:21:077/12/2006 14:21:07

Page 130: LÓGICA de PROGRAMAÇÃO II Avançado

130

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

fi m-registro

2) Algoritmo de um sistema de administração escolar:

início

{declaração do registro FICHA}

FICHA: registro

{variáveis da fi cha}

NOME, ENDERECO, CIDADE, ESTADO, CEP, CPF, RG, DATA_NASC, CURSO: literal

TELEFONE, GRAU_ESC: numérico

fi m-registro

CONT, NUM_PROF: numérico {especifi ca 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:”

logica_2_livro_caderno.indb 130logica_2_livro_caderno.indb 130 7/12/2006 14:21:077/12/2006 14:21:07

Page 131: LÓGICA de PROGRAMAÇÃO II Avançado

131

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

fi m-para

fi m

3) Algoritmo de um sistema de cadastro de uma Vídeo Locadora:

início

{declaração do registro FICHA}

VIDEO: registro

{variáveis da fi cha}

NOME, CODIGO, TIPO, PRODUTOR, ATOR, DIRETOR: literal

DURACAO, ANO: numérico

fi m-registro

FITAS: vetor[0..499] VIDEO {permite cadastrar até 500 fi tas de vídeo}

NUM_FITAS, CONT: numérico

{entrada de dados}

escreva “Entre com o número de fi tas a serem cadastradas”

leia NUM_FITAS

para CONT de 0 até NUM_FITAS-1 passo 1 faça

escreva “Entre com o nome do fi lme:”

leia FITAS[CONT].NOME

escreva “Entre com o código do fi lme:”

leia FITAS[CONT].CODIGO

escreva “Entre com o tipo de fi lme:”

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 fi lme:”

leia FITAS[CONT].DIRETOR

escreva “Entre com o tempo de duração do fi lme:”

leia FITAS[CONT].DURACAO

escreva “Entre com o ano da produção:”

leia FITAS[CONT].ANO

fi m-para

logica_2_livro_caderno.indb 131logica_2_livro_caderno.indb 131 7/12/2006 14:21:077/12/2006 14:21:07

Page 132: LÓGICA de PROGRAMAÇÃO II Avançado

132

Universidade do Sul de Santa Catarina

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

fi m-registro

FUNCIONARIOS : vetor [0..199] FICHA

CODIGOCONSUL, CONT, POS : numérico

para POS de 0 até 199 passo 1 faça

escreva “Especifi que o código do funcionário:”

leia FUNCIONARIOS[POS].CODIGO

escreva “Digite o nome do funcionário:”

leia FUNCIONARIOS[POS].NOME

escreva “Especifi que o endereço:”

leia, FUNCIONARIOS[POS].ENDERECO

escreva “Espefi cique a cidade onde funcionário reside:”

leia FUNCIONARIOS[POS].CIDADE

escreva “Especifi que o estado:”,

leia FUNCIONARIOS[POS].UF

escreva “Especifi que o CEP:”

leia FUNCIONARIOS[POS].CEP

escreva “Especifi que o telefone”

leia FUNCIONARIOS[POS].FONE

{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 fi lme”, 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 fi lme foi produzido no ano de”, FITAS[CONT].ANO

fi m-para

fi m

logica_2_livro_caderno.indb 132logica_2_livro_caderno.indb 132 7/12/2006 14:21:077/12/2006 14:21:07

Page 133: LÓGICA de PROGRAMAÇÃO II Avançado

133

Lógica de Programação II

escreva “Digite CPF”

leia FUNCIONARIOS[POS].CPF

escreva “Especifi que 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

fi m-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

fi m-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”

fi m-se

fi m-para

fi m

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.

logica_2_livro_caderno.indb 133logica_2_livro_caderno.indb 133 7/12/2006 14:21:087/12/2006 14:21:08

Page 134: LÓGICA de PROGRAMAÇÃO II Avançado

134

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]

fi m-para

para POS de 0 até 99 passo 1 faça

escreva “Entre com a quantidade: “

leia QUANTIDADE[POS]

fi m-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

fi m-se

fi m-enquanto

POS � 1

ULTIMO � ULTIMO - 1

fi m-enquanto

logica_2_livro_caderno.indb 134logica_2_livro_caderno.indb 134 7/12/2006 14:21:087/12/2006 14:21:08

Page 135: LÓGICA de PROGRAMAÇÃO II Avançado

135

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]

fi m-para

fi m

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]

fi m-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.”

fi m-se

fi m-para

fi m

logica_2_livro_caderno.indb 135logica_2_livro_caderno.indb 135 7/12/2006 14:21:087/12/2006 14:21:08

Page 136: LÓGICA de PROGRAMAÇÃO II Avançado

136

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 ]

fi m-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)

{verifi ca se o número procurado já se encontra na metade. É o

primeiro teste}

se VET[ METADE ] = NUMEROLIDO então

ACHOU � verdadeiro

fi m-se

{caso o número procurado não esteja exatamente na metade o vetor,

verifi camos 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

logica_2_livro_caderno.indb 136logica_2_livro_caderno.indb 136 7/12/2006 14:21:087/12/2006 14:21:08

Page 137: LÓGICA de PROGRAMAÇÃO II Avançado

137

Lógica de Programação II

fi m-se

fi m-enquanto

{verifi ca 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”

fi m-se

fi m

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]

fi m-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

logica_2_livro_caderno.indb 137logica_2_livro_caderno.indb 137 7/12/2006 14:21:087/12/2006 14:21:08

Page 138: LÓGICA de PROGRAMAÇÃO II Avançado

138

Universidade do Sul de Santa Catarina

senão

POS � POS + 1

fi m-se

fi m-enquanto

POS � 1

ULTIMO � ULTIMO - 1

fi m-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]

fi m-para

fi m

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)

logica_2_livro_caderno.indb 138logica_2_livro_caderno.indb 138 7/12/2006 14:21:087/12/2006 14:21:08

Page 139: LÓGICA de PROGRAMAÇÃO II Avançado

139

Lógica de Programação II

fi m-enquanto

fi m

{implementação das funções}

função SUBTRACAO (NUM1, NUM2: numérico)

escreva “resultado =”, NUM1 – NUM2

fi m-função

função MULTIPLICACAO (NUM1, NUM2: numérico)

escreva “resultado =”, NUM1*NUM2

fi m-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”

fi m-se

fi m-função

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” fi m-se fi m-se fi m-sefi m-se

logica_2_livro_caderno.indb 139logica_2_livro_caderno.indb 139 7/12/2006 14:21:097/12/2006 14:21:09

Page 140: LÓGICA de PROGRAMAÇÃO II Avançado

140

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”

fi m se

fi m se

fi m se

escreva “resultado da operação =”, RESULTADO

fi m se

fi m enquanto

fi m

logica_2_livro_caderno.indb 140logica_2_livro_caderno.indb 140 7/12/2006 14:21:097/12/2006 14:21:09

Page 141: LÓGICA de PROGRAMAÇÃO II Avançado

141

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}

fi m-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}

fi m-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

fi m-se

fi m-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

fi m

logica_2_livro_caderno.indb 141logica_2_livro_caderno.indb 141 7/12/2006 14:21:097/12/2006 14:21:09

Page 142: LÓGICA de PROGRAMAÇÃO II Avançado

142

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

fi m-se

retorna MAIOR

fi m-função

logica_2_livro_caderno.indb 142logica_2_livro_caderno.indb 142 7/12/2006 14:21:097/12/2006 14:21:09

Page 143: LÓGICA de PROGRAMAÇÃO II Avançado

Elton João Gubert

Mário Gerson Miranda Magno Júnior

Patrícia Gerent Petry

Design instrucionalFlavia Lumi Matuzawa

Viviane Bastos

2ª edição revista

PalhoçaUnisulVirtual

2007

Lógica de Programação II

Caderno de atividades

logica_2_livro_caderno.indb 143logica_2_livro_caderno.indb 143 7/12/2006 14:21:097/12/2006 14:21:09

Page 144: LÓGICA de PROGRAMAÇÃO II Avançado

logica_2_livro_caderno.indb 144logica_2_livro_caderno.indb 144 7/12/2006 14:21:097/12/2006 14:21:09

Page 145: LÓGICA de PROGRAMAÇÃO II Avançado

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 signifi ca 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 145logica_2_livro_caderno.indb 145 7/12/2006 14:21:097/12/2006 14:21:09

Page 146: LÓGICA de PROGRAMAÇÃO II Avançado

Copyright © UnisulVirtual 2007

Nenhuma parte desta publicação pode ser reproduzida por qualquer meio sem a prévia autorização desta instituição.

Ficha catalográfi ca elaborada pela Biblioteca Universitária da Unisul

005.1G95 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.

CréditosUnisul - Universidade do Sul de Santa CatarinaUnisulVirtual - Educação Superior a Distância

Campus UnisulVirtualRua 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 UnisulGerson Luiz Joner da Silveira

Vice-Reitor e Pró-Reitor AcadêmicoSebastião Salésio Heerdt

Chefe de gabinete da ReitoriaFabian Martins de Castro

Pró-Reitor AdministrativoMarcus Vinícius Anátoles da Silva

Ferreira

Campus SulDiretor: Valter Alves Schmitz Neto

Diretora adjunta: Alexandra Orseni

Campus NorteDiretor: Ailton Nazareno Soares

Diretora adjunta: Cibele Schuelter

Campus UnisulVirtualDiretor: João Vianney

Diretora adjunta: Jucimara Roesler

Equipe UnisulVirtual

AdministraçãoRenato André Luz

Valmir Venício Inácio

BibliotecáriaSoraya Arruda Waltrick

Coordenação dos CursosAdriano 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áfi coCristiano 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ógicaAngelita 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

Logística de Encontros PresenciaisCaroline 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

Logística de MateriaisJeferson Cassiano Almeida da Costa

(coordenador)

Eduardo Kraus

Monitoria e SuporteRafael 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 Serafi m

Produção Industrial e SuporteArthur Emmanuel F. Silveira

(coordenador)

Francisco Asp

Projetos CorporativosDiane Dal Mago

Vanderlei Brasil

Secretaria de Ensino a DistânciaKarine 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

Secretária ExecutivaViviane Schalata Martins

TecnologiaOsmar de Oliveira Braz Júnior

(coordenador)

Ricardo Alexandre Bianchini

Rodrigo de Barcelos Martins

Edição – Livro Didático

Professores ConteudistasElton João Gubert

Mário Gerson Miranda Magno Júnior

Patrícia Gerent Petry

Design InstrucionalFlavia Lumi Matuzawa

Viviane Bastos

Leandro Kingeski Pacheco

(2a edição revista)

Projeto Gráfi co e CapaEquipe UnisulVirtual

DiagramaçãoRafael Pessi

Revisão Ortográfi ca Heloísa Mano Dorneles

logica_2_livro_caderno.indb 146logica_2_livro_caderno.indb 146 7/12/2006 14:21:107/12/2006 14:21:10

Page 147: LÓGICA de PROGRAMAÇÃO II Avançado

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 147logica_2_livro_caderno.indb 147 7/12/2006 14:21:107/12/2006 14:21:10

Page 148: LÓGICA de PROGRAMAÇÃO II Avançado

logica_2_livro_caderno.indb 148logica_2_livro_caderno.indb 148 7/12/2006 14:21:107/12/2006 14:21:10

Page 149: LÓGICA de PROGRAMAÇÃO II Avançado

1UNIDADE 1

Manipulação de vetores

Objetivos de aprendizagem

� Conhecer os algoritmos de maiores complexidades.

� Construir algoritmos com utilização de vetores.

logica_2_livro_caderno.indb 149logica_2_livro_caderno.indb 149 7/12/2006 14:21:107/12/2006 14:21:10

Page 150: LÓGICA de PROGRAMAÇÃO II Avançado

150

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 fi m 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éricoI, 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

logica_2_livro_caderno.indb 150logica_2_livro_caderno.indb 150 7/12/2006 14:21:117/12/2006 14:21:11

Page 151: LÓGICA de PROGRAMAÇÃO II Avançado

151

Lógica de Programação II

Unidade 1

{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ãoMaiorAltura ← Altura[I]

Fim SeFim Para

{Calcula a média das alturas}

MediaAltura ← Soma / N

{Inicializando as variáveis que são contadores}TotalAcimaMedia ← 0TotalMaiorAltura ← 0

{Novamente iniciamos o laço, para verifi car quem tem altura maior que a média e quem tem a maior altura}Para I de 1 até N faça

{Aqui iremos verifi car 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 verifi car o total de pessoas que têm a maior altura}

Se Altura[I]= MaiorAltura então TotalMaiorAltura ← TotalMaiorAltura + 1

Fim SeFim Para

logica_2_livro_caderno.indb 151logica_2_livro_caderno.indb 151 7/12/2006 14:21:117/12/2006 14:21:11

Page 152: LÓGICA de PROGRAMAÇÃO II Avançado

152

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éricoI, N, PosMaisJovem, IdadeMaisNova, PosMaisVelho, IdadeMaisVelho: numéricoMediaIdadeHomens, MediaIdadeMulheres: numérico

InícioI ← 1{Lê a idade da primeira pessoa já fora do laço, para que a condição do comando “enquanto-faça” possa ser verifi cada}

Leia (“Digite a idade”,Idade[I])

logica_2_livro_caderno.indb 152logica_2_livro_caderno.indb 152 7/12/2006 14:21:117/12/2006 14:21:11

Page 153: LÓGICA de PROGRAMAÇÃO II Avançado

153

Lógica de Programação II

Unidade 1

{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çaSe 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 SeFim Se

Fim Para{Calcula a média de idade dos homens}MediaIdadeHomens ← Soma / N

logica_2_livro_caderno.indb 153logica_2_livro_caderno.indb 153 7/12/2006 14:21:117/12/2006 14:21:11

Page 154: LÓGICA de PROGRAMAÇÃO II Avançado

154

Universidade do Sul de Santa Catarina

{Trocando de posição o homem mais velho com a primeira posição em que aparece homem}I ← 1Enquanto |<=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 + 1Fim 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çaSe 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 seFim 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 ← 1Enquanto |<=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]

logica_2_livro_caderno.indb 154logica_2_livro_caderno.indb 154 7/12/2006 14:21:127/12/2006 14:21:12

Page 155: LÓGICA de PROGRAMAÇÃO II Avançado

155

Lógica de Programação II

Unidade 1

{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 + 1Fim 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 identifi car o candidato.

Continuar: uma variável lógica usada no laço de repetição.}

logica_2_livro_caderno.indb 155logica_2_livro_caderno.indb 155 7/12/2006 14:21:127/12/2006 14:21:12

Page 156: LÓGICA de PROGRAMAÇÃO II Avançado

156

Universidade do Sul de Santa Catarina

Algoritmo Concurso

V _ Respostas, V _ Gabarito : Vetor[50] LiteralNumeroDocandidato, X, ContadorAcertos : numéricoContinuar : Lógico

Início

{Primeiramente, as variáveis devem apresentar os valores necessários; após, solicitamos a digitação do gabarito}

Continuar ← VPara 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 EnquantoFim

logica_2_livro_caderno.indb 156logica_2_livro_caderno.indb 156 7/12/2006 14:21:127/12/2006 14:21:12

Page 157: LÓGICA de PROGRAMAÇÃO II Avançado

157

Lógica de Programação II

Unidade 1

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éricoV: 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. Verifi que 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”.

logica_2_livro_caderno.indb 157logica_2_livro_caderno.indb 157 7/12/2006 14:21:127/12/2006 14:21:12

Page 158: LÓGICA de PROGRAMAÇÃO II Avançado

158

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.

logica_2_livro_caderno.indb 158logica_2_livro_caderno.indb 158 7/12/2006 14:21:137/12/2006 14:21:13

Page 159: LÓGICA de PROGRAMAÇÃO II Avançado

2UNIDADE 2

Manipulação de matrizes

Objetivos de aprendizagem

Entender o conceito de matrizes.�

Conhecer e praticar montagens de matrizes.�

Construir algoritmos com utilização de matrizes.�

logica_2_livro_caderno.indb 159logica_2_livro_caderno.indb 159 7/12/2006 14:21:137/12/2006 14:21:13

Page 160: LÓGICA de PROGRAMAÇÃO II Avançado

160

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

DIA

VACA1 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

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.

logica_2_livro_caderno.indb 160logica_2_livro_caderno.indb 160 7/12/2006 14:21:137/12/2006 14:21:13

Page 161: LÓGICA de PROGRAMAÇÃO II Avançado

161

Lógica de Programação II

Unidade 2

Algoritmo Leite

Leite: matriz[30,10] numérico vaca5,vaca8,linha,coluna,dia10e20,dia01a30 : numéricoIní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,..., 10LINHA = 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 fi caria:}

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

logica_2_livro_caderno.indb 161logica_2_livro_caderno.indb 161 7/12/2006 14:21:137/12/2006 14:21:13

Page 162: LÓGICA de PROGRAMAÇÃO II Avançado

162

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 fi ca 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

logica_2_livro_caderno.indb 162logica_2_livro_caderno.indb 162 7/12/2006 14:21:137/12/2006 14:21:13

Page 163: LÓGICA de PROGRAMAÇÃO II Avançado

163

Lógica de Programação II

Unidade 2

2) Faça um algoritmo que:

Leia uma matriz A de ordem N X M.

Some todos os elementos da matriz e escreva o resultado na tela.

Some os elementos pares da matriz e escreva o resultado na tela.

Escreva uma mensagem, caso a matriz seja quadrada. OBS: Uma matriz é quadrada quando o número de linhas é igual ao número de colunas.

Expresse os elementos da diagonal principal.

Expresse a soma dos elementos da diagonal secundária.

Expresse a soma de cada linha da matriz mostrando o resultado na tela.

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 ParaFim Para

a)

b)

c)

d)

e)

f)

g)

h)

logica_2_livro_caderno.indb 163logica_2_livro_caderno.indb 163 7/12/2006 14:21:137/12/2006 14:21:13

Page 164: LÓGICA de PROGRAMAÇÃO II Avançado

164

Universidade do Sul de Santa Catarina

{Processo para somar os valores da matriz}

Soma ← 0Para I de 1 até N faça Para J de 1 até M faça Soma ← Soma + A[I,J] Fim ParaFim Para

{Processo para somar os valores pares da matriz}

SomaPar ← 0Para I de 1 até N faça Para J de 1 até M faça

{Verifi ca 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 ParaFim Para

{Processo para verifi car 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 ParaSenão Escreva (“Matriz não é quadrada.”)Fim se

logica_2_livro_caderno.indb 164logica_2_livro_caderno.indb 164 7/12/2006 14:21:147/12/2006 14:21:14

Page 165: LÓGICA de PROGRAMAÇÃO II Avançado

165

Lógica de Programação II

Unidade 2

{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 (“A soma dos elementos da matriz é: “,Soma)

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

logica_2_livro_caderno.indb 165logica_2_livro_caderno.indb 165 7/12/2006 14:21:147/12/2006 14:21:14

Page 166: LÓGICA de PROGRAMAÇÃO II Avançado

166

Universidade do Sul de Santa Catarina

3) Dada uma matriz de ordem N x N, faça um algoritmo que verifi que 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éricoSimetrica : 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 ParaFim Para

{Processo para descobrir se a matriz é simétrica ou não}

I ← 1

{A princípio consideramos a matriz como simétrica}

Simetrica ← VerdadeiroEnquanto 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 + 1Enquanto J < N faça

Se A[I, J] <> A[J, I] então

{Se um dos valores for diferente, podemos, com certeza, afi rmar que a matriz NÃO é simétrica}

Simetrica ← Falso

logica_2_livro_caderno.indb 166logica_2_livro_caderno.indb 166 7/12/2006 14:21:147/12/2006 14:21:14

Page 167: LÓGICA de PROGRAMAÇÃO II Avançado

167

Lógica de Programação II

Unidade 2

{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 ← NI ← N

Fim SeJ ← J + 1

Fim EnquantoI ← 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ãoEscreva (“A matriz é simétrica”)

SenãoEscreva (“A matriz NÃO é simétrica”)

Fim SeFim

4) Dada uma matriz 10 x 10 de valores reais, faça um algoritmo que faça a leitura desses valores e, ao fi nal da leitura de todos, imprima o relatório com os seguintes itens:

soma dos valores de cada coluna da matriz;

lista dos valores que são menores que a média dos valores;

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.}

a)

b)

c)

logica_2_livro_caderno.indb 167logica_2_livro_caderno.indb 167 7/12/2006 14:21:147/12/2006 14:21:14

Page 168: LÓGICA de PROGRAMAÇÃO II Avançado

168

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éricoSomaDiagSecund : numéricoMat : matriz[10,10] numéricoSomaColuna : 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

logica_2_livro_caderno.indb 168logica_2_livro_caderno.indb 168 7/12/2006 14:21:147/12/2006 14:21:14

Page 169: LÓGICA de PROGRAMAÇÃO II Avançado

169

Lógica de Programação II

Unidade 2

{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

logica_2_livro_caderno.indb 169logica_2_livro_caderno.indb 169 7/12/2006 14:21:157/12/2006 14:21:15

Page 170: LÓGICA de PROGRAMAÇÃO II Avançado

170

Universidade do Sul de Santa Catarina

Atividades propostas

1) Considere a matriz M:

O Q * I

E * E S

R E U T

A * * S

Agora responda: qual será a sua confi guração após a execução do algoritmo a seguir?

Algoritmo MatrizVariáveis I,J: numérico

M: Matriz[4x4] literalAux: 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] ← AuxAux ← M[2,2]M[2,2] ← M[3,3]M[3,3] ← Aux

Fim

logica_2_livro_caderno.indb 170logica_2_livro_caderno.indb 170 7/12/2006 14:21:157/12/2006 14:21:15

Page 171: LÓGICA de PROGRAMAÇÃO II Avançado

171

Lógica de Programação II

Unidade 2

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 modifi cada).

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 fi nal.

logica_2_livro_caderno.indb 171logica_2_livro_caderno.indb 171 7/12/2006 14:21:157/12/2006 14:21:15

Page 172: LÓGICA de PROGRAMAÇÃO II Avançado

172

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 modifi cada (Diagonal principal e diagonal secundária).

Principal Secundária

X X

X X

X X

X X

logica_2_livro_caderno.indb 172logica_2_livro_caderno.indb 172 7/12/2006 14:21:157/12/2006 14:21:15

Page 173: LÓGICA de PROGRAMAÇÃO II Avançado

3UNIDADE 3

Manipulação de registros

Objetivos de aprendizagem

Entender o conceito de registro ou estrutura.�

Conhecer e praticar montagens de registros.�

Criar novos tipos de variáveis. �

logica_2_livro_caderno.indb 173logica_2_livro_caderno.indb 173 7/12/2006 14:21:157/12/2006 14:21:15

Page 174: LÓGICA de PROGRAMAÇÃO II Avançado

174

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] TFUNCIONARION, cont, I : numérico

InícioLeia (“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:}

logica_2_livro_caderno.indb 174logica_2_livro_caderno.indb 174 7/12/2006 14:21:157/12/2006 14:21:15

Page 175: LÓGICA de PROGRAMAÇÃO II Avançado

175

Lógica de Programação II

Unidade 3

Leia (FUNCIONARIO[I].Nome)Leia (FUNCIONARIO[I].Idade)Leia (FUNCIONARIO[I].Salario)Leia (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 ← 0Para I de 1 ate N faça Se (FUNCIONARIO[I].Endereco.Cidade=“São Paulo”) então cont ← cont + 1 Fim seFim 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

logica_2_livro_caderno.indb 175logica_2_livro_caderno.indb 175 7/12/2006 14:21:167/12/2006 14:21:16

Page 176: LÓGICA de PROGRAMAÇÃO II Avançado

176

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 ParaFim

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] ALUNOI, K: NuméricoSoma: numérico

logica_2_livro_caderno.indb 176logica_2_livro_caderno.indb 176 7/12/2006 14:21:167/12/2006 14:21:16

Page 177: LÓGICA de PROGRAMAÇÃO II Avançado

177

Lógica de Programação II

Unidade 3

InícioPara 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çaLeia(CAD _ ALUNOS[I].Notas[K])

Fim ParaFim 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 verifi ca 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 ParaFim

logica_2_livro_caderno.indb 177logica_2_livro_caderno.indb 177 7/12/2006 14:21:167/12/2006 14:21:16

Page 178: LÓGICA de PROGRAMAÇÃO II Avançado

178

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.

logica_2_livro_caderno.indb 178logica_2_livro_caderno.indb 178 7/12/2006 14:21:167/12/2006 14:21:16

Page 179: LÓGICA de PROGRAMAÇÃO II Avançado

179

Lógica de Programação II

Unidade 3

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, 4-Doutorado) 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.

logica_2_livro_caderno.indb 179logica_2_livro_caderno.indb 179 7/12/2006 14:21:167/12/2006 14:21:16

Page 180: LÓGICA de PROGRAMAÇÃO II Avançado

180

Universidade do Sul de Santa Catarina

3) Faça um algoritmo que receba as informações sobre determinado acervo de fi lmes, título, gênero, autor, duração e sinopse. Além disso, imprima uma relação de fi lmes por gênero. Considere que a Pinacoteca tem 3.500 Filmes.

logica_2_livro_caderno.indb 180logica_2_livro_caderno.indb 180 7/12/2006 14:21:167/12/2006 14:21:16

Page 181: LÓGICA de PROGRAMAÇÃO II Avançado

4UNIDADE 4

Tópicos avançados em algoritmos computacionais

Objetivos de aprendizagem

Identifi car os comandos e compreender a lógica em pseudocódigo, proposta para resolver o problema.

logica_2_livro_caderno.indb 181logica_2_livro_caderno.indb 181 7/12/2006 14:21:167/12/2006 14:21:16

Page 182: LÓGICA de PROGRAMAÇÃO II Avançado

182

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 ParaFim

logica_2_livro_caderno.indb 182logica_2_livro_caderno.indb 182 7/12/2006 14:21:177/12/2006 14:21:17

Page 183: LÓGICA de PROGRAMAÇÃO II Avançado

183

Lógica de Programação II

Unidade 4

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. Verifi ca-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.

logica_2_livro_caderno.indb 183logica_2_livro_caderno.indb 183 7/12/2006 14:21:177/12/2006 14:21:17

Page 184: LÓGICA de PROGRAMAÇÃO II Avançado

184

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=2J=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 fi ca 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.}

logica_2_livro_caderno.indb 184logica_2_livro_caderno.indb 184 7/12/2006 14:21:177/12/2006 14:21:17

Page 185: LÓGICA de PROGRAMAÇÃO II Avançado

185

Lógica de Programação II

Unidade 4

Entra no PARA J novamente:

I=3J=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=4J=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 fi cou ordenado.

NOME Ana José Marcos Maria

I 1 2 3 4

Fim ParaFim Para

logica_2_livro_caderno.indb 185logica_2_livro_caderno.indb 185 7/12/2006 14:21:177/12/2006 14:21:17

Page 186: LÓGICA de PROGRAMAÇÃO II Avançado

186

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) E (x[i]<>a) faça i ← i + 1 Fim Enquanto

{A seguir, verifi camos 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 SeFim.

logica_2_livro_caderno.indb 186logica_2_livro_caderno.indb 186 7/12/2006 14:21:177/12/2006 14:21:17

Page 187: LÓGICA de PROGRAMAÇÃO II Avançado

187

Lógica de Programação II

Unidade 4

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 PesquisaBinarianumeroPesquisa: 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, signifi ca 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

logica_2_livro_caderno.indb 187logica_2_livro_caderno.indb 187 7/12/2006 14:21:187/12/2006 14:21:18

Page 188: LÓGICA de PROGRAMAÇÃO II Avançado

188

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 SeFim

logica_2_livro_caderno.indb 188logica_2_livro_caderno.indb 188 7/12/2006 14:21:187/12/2006 14:21:18

Page 189: LÓGICA de PROGRAMAÇÃO II Avançado

189

Lógica de Programação II

Unidade 4

Atividades propostas

1) Faça um algoritmo para ler um vetor X com N elemento. Leia um valor A qualquer. Verifi que 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.

logica_2_livro_caderno.indb 189logica_2_livro_caderno.indb 189 7/12/2006 14:21:187/12/2006 14:21:18

Page 190: LÓGICA de PROGRAMAÇÃO II Avançado

190

Universidade do Sul de Santa Catarina

2) Faça um algoritmo para ler um vetor com 500 valores inteiros e verifi car se um determinado valor “N” está ou não dentro dele. Escreva uma mensagem dizendo se encontrou ou não o valor.

logica_2_livro_caderno.indb 190logica_2_livro_caderno.indb 190 7/12/2006 14:21:187/12/2006 14:21:18

Page 191: LÓGICA de PROGRAMAÇÃO II Avançado

5UNIDADE 5

Programação estruturada

Objetivos de aprendizagem

Entender os conceitos de programação estruturada.�

Aplicar modularização aos algoritmos.�

logica_2_livro_caderno.indb 191logica_2_livro_caderno.indb 191 7/12/2006 14:21:187/12/2006 14:21:18

Page 192: LÓGICA de PROGRAMAÇÃO II Avançado

192

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 verifi que 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

logica_2_livro_caderno.indb 192logica_2_livro_caderno.indb 192 7/12/2006 14:21:187/12/2006 14:21:18

Page 193: LÓGICA de PROGRAMAÇÃO II Avançado

193

Lógica de Programação II

Unidade 5

{Artifício identifi car 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 ← 0Enquanto (NÃO ExistePalavraMaiorQueSete) e (Frase[K] <> “$”) faça

{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ãoTamPalavra ← 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 ← VerdadeiroSenão

{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 ← 0Fim Se

Fim Se

{Incrementamos a variável K para acessar o próximo caractere da frase}

K ← K + 1Fim Enquanto

Fim

logica_2_livro_caderno.indb 193logica_2_livro_caderno.indb 193 7/12/2006 14:21:197/12/2006 14:21:19

Page 194: LÓGICA de PROGRAMAÇÃO II Avançado

194

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ícioLeia (SalarioBruto)Leia (NumDeFunc)

DescINSS � CalculaINSS(SalarioBruto)DescIRRF � CalculaIRRF (SalarioBruto)SalLiq = SalarioBruto – DescINSS – DescIRRFEscreva (“O salário Liquido é:”, SalLiq)

Fim

logica_2_livro_caderno.indb 194logica_2_livro_caderno.indb 194 7/12/2006 14:21:197/12/2006 14:21:19

Page 195: LÓGICA de PROGRAMAÇÃO II Avançado

195

Lógica de Programação II

Unidade 5

{Esta é a função para calcular o valor do desconto de IRRF} Função CalculaIRRF (SalarioBruto:Numérico) :numéricoInício

Se SalarioBruto <= 1058 então DescIRRF = 0Senão Se SalarioBruto <= 2115 então DescIRRF = SalarioBruto * 0,15

Senão DescIRRF = SalarioBruto * 0,275

Fim SeFim SeRetorna DescIRRF

Fim

{Esta é a função para calcular o valor do desconto de INSS} Função CalculaINSS(SalarioBruto:Numérico) :numéricoInício

Se SalarioBruto <= 429 então DescINSS = SalarioBruto * 0,0765Senão SE SalarioBruto <= 540 então DescINSS = SalarioBruto * 0,0865

Senão SE SalarioBruto <= 715 então

DescINSS = SalarioBruto * 0,0900Senão SE SalarioBruto < 1.430 então

DescINSS = SalarioBruto * 0,1100Senão

DescINSS = 157,00Fim SE

Fim Se Fim SeFim SeRetorna DescINSS

Fim

logica_2_livro_caderno.indb 195logica_2_livro_caderno.indb 195 7/12/2006 14:21:197/12/2006 14:21:19

Page 196: LÓGICA de PROGRAMAÇÃO II Avançado

196

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).

logica_2_livro_caderno.indb 196logica_2_livro_caderno.indb 196 7/12/2006 14:21:197/12/2006 14:21:19

Page 197: LÓGICA de PROGRAMAÇÃO II Avançado

197

Lógica de Programação II

Unidade 5

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.

logica_2_livro_caderno.indb 197logica_2_livro_caderno.indb 197 7/12/2006 14:21:197/12/2006 14:21:19

Page 198: LÓGICA de PROGRAMAÇÃO II Avançado

logica_2_livro_caderno.indb 198logica_2_livro_caderno.indb 198 7/12/2006 14:21:197/12/2006 14:21:19

Page 199: LÓGICA de PROGRAMAÇÃO II Avançado

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éricoIní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 199logica_2_livro_caderno.indb 199 7/12/2006 14:21:197/12/2006 14:21:19

Page 200: LÓGICA de PROGRAMAÇÃO II Avançado

200

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. Verifi que 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éricoIní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 SeFim

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.

logica_2_livro_caderno.indb 200logica_2_livro_caderno.indb 200 7/12/2006 14:21:207/12/2006 14:21:20

Page 201: LÓGICA de PROGRAMAÇÃO II Avançado

201

Lógica de Programação II

Resposta :

Algoritmo TROCA_TROCA

Var V : VETOR[20] numérico AUX, I, J : numéricoIní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 ParaFim

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éricoIní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 enquantoFim

logica_2_livro_caderno.indb 201logica_2_livro_caderno.indb 201 7/12/2006 14:21:207/12/2006 14:21:20

Page 202: LÓGICA de PROGRAMAÇÃO II Avançado

202

Universidade do Sul de Santa Catarina

Unidade 2

1) Considere a matriz M:

O Q * I

E * E S

R E U T

A * * S

Agora responda: qual será a sua confi guração após a execução do algoritmo a seguir?

Algoritmo Matriz

Variáveis I,J: numérico

M: Matriz[4x4] literalAux: 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] ← AuxAux ← M[2,2]M[2,2] ← M[3,3]M[3,3] ← Aux

Fim

Resposta:

I = 1J = 2AUX � M[1,2] (Q)M[1,2] � M[2,1] (E)M[2,1] � AUX (Q)

I = 1J = 3AUX � M[1,3] (*)M[1,3] � M[3,1] (R)M[3,1] � AUX (*)

I = 1J = 4AUX � M[1,4] (I)M[1,4] � M[4,1] (A)M[4,1] � AUX (I)

I = 2J = 3AUX � M[2,3] (E)M[2,3] � M[3,2] (E)M[3,2] � AUX (E)

I = 2J = 4AUX � M[2,4] (S)M[2,4] � M[4,2] (*)M[4,2] � AUX (S)

I = 3J = 4AUX � M[3,4] (T)M[3,4] � M[4,3] (*)M[4,3] � AUX (T)

I = 4J = 5NADA ACONTECE

logica_2_livro_caderno.indb 202logica_2_livro_caderno.indb 202 7/12/2006 14:21:207/12/2006 14:21:20

Page 203: LÓGICA de PROGRAMAÇÃO II Avançado

203

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 (*)

Confi guração fi nal:

S E R A

Q U E *

* E * *

I S T 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 modifi cada.

Resposta:

Algoritmo Matriz1

Variáveis M : MATRIZ[12,13] numérico MAIOR : numérico I, J: numéricoIní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 ParaFim

logica_2_livro_caderno.indb 203logica_2_livro_caderno.indb 203 7/12/2006 14:21:207/12/2006 14:21:20

Page 204: LÓGICA de PROGRAMAÇÃO II Avançado

204

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 fi nal.

Resposta:

Algoritmo Matriz2

Variáveis M : MATRIZ[6,6] numérico V : VETOR [36] numérico A : numérico K, I, J: numéricoIní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 ParaFim

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 modifi cada (diagonal principal e diagonal secundária).

Principal Secundária

X X

X X

X X

X X

Resposta:

logica_2_livro_caderno.indb 204logica_2_livro_caderno.indb 204 7/12/2006 14:21:217/12/2006 14:21:21

Page 205: LÓGICA de PROGRAMAÇÃO II Avançado

205

Lógica de Programação II

Algoritmo Matriz3

Var M : MATRIZ[10,10] numérico AUX, C, K, I, J: numéricoIní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 1 até 10 faça AUX � M[2,J] M[2,J] � M[8,J] M[8,J] � AUX Fim Para

{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 diagonal principal pela diagonal secundária}

I � 1 J � 1 K � 10 Repita AUX � M[I,C] M[I,C] � M[I,K] M[I,K] � AUX I � I + 1 J � J + 1 K � K – 1 Até (I>10 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 ParaFim

logica_2_livro_caderno.indb 205logica_2_livro_caderno.indb 205 7/12/2006 14:21:217/12/2006 14:21:21

Page 206: LÓGICA de PROGRAMAÇÃO II Avançado

206

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 : literal SALÁRIO : 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}

TOTALMUL�0 Para I de 1 até 200 faça Se (FUNC[I].SEXO=”F”) E (FUNC[I].SALARIO>1000) então TOTMUL�TOTMUL + 1 Fim se Fim Para

logica_2_livro_caderno.indb 206logica_2_livro_caderno.indb 206 7/12/2006 14:21:217/12/2006 14:21:21

Page 207: LÓGICA de PROGRAMAÇÃO II Avançado

207

Lógica de Programação II

{Letra B}

MAIORSAL�0 Para I de 1 até 200 faça Se (FUNC[I].SEXO=”M”)E(FUNC[I].SALARIO>MAIORSAL) então MAIORSAL�FUNC[I].SALARIO Fim se Fim Para

{Letra C}

MEDIASAL�0 Para I de 1 até 200 faça MEDIASAL�MEDIASAL+ FUNC[I].SALARIO Fim Para

MEDIASAL�MEDIASAL/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 : “, MEDIASALFim

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, 4-Doutorado) 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 : registroNOME: 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

logica_2_livro_caderno.indb 207logica_2_livro_caderno.indb 207 7/12/2006 14:21:217/12/2006 14:21:21

Page 208: LÓGICA de PROGRAMAÇÃO II Avançado

208

Universidade do Sul de Santa Catarina

{Declaração das variáveis}CANDIDATOS : vetor[100] CADASTROK : 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

logica_2_livro_caderno.indb 208logica_2_livro_caderno.indb 208 7/12/2006 14:21:227/12/2006 14:21:22

Page 209: LÓGICA de PROGRAMAÇÃO II Avançado

209

Lógica de Programação II

3) Faça um algoritmo que receba as informações sobre determinado acervo de fi lmes, título, gênero, autor, duração e sinopse. Além disso, imprima uma relação de fi lmes por gênero. Considere que a Pinacoteca tem 3.500 Filmes.

Resposta: Algoritmo Acervo

tipo Filme = registroTítulo: literalGênero: literalAutor: LiteralDuração: numéricoSinopse: literal

fi m-registro

Acervo : Vetor [3500] FilmeGenerodesejado: literal

contador : numérico

InícioPara 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 EnquantoFim.

logica_2_livro_caderno.indb 209logica_2_livro_caderno.indb 209 7/12/2006 14:21:227/12/2006 14:21:22

Page 210: LÓGICA de PROGRAMAÇÃO II Avançado

210

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. Verifi que 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

VarX, Posicoes: vetor[9999] numéricoK, 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 ← 0Para 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 SeFim 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 SeFim.

logica_2_livro_caderno.indb 210logica_2_livro_caderno.indb 210 7/12/2006 14:21:227/12/2006 14:21:22

Page 211: LÓGICA de PROGRAMAÇÃO II Avançado

211

Lógica de Programação II

2) Faça um algoritmo para ler um vetor com 500 valores inteiros e verifi car 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 EncontraValorVar

Números: vetor[500] numéricoK, N: numéricoEncontrou: lógico

Início

{Leitura dos valores do vetor}

Para K de 1 até 500 façaLeia(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 ← 1Enquanto (Não Encontrou) e (K < 500) faça

Encontrou ← Numeros[K] = NK ← K + 1

Fim Enquanto

{Precisamos decidir porque o laço terminou e isso nos garante a resposta.}

Se Encontrou entãoEscreva(“O número “ + N + “ foi encontrado”)

SenãoEscreva(“O número “ + N + “ Não foi encontrado”)

Fim SeFim

logica_2_livro_caderno.indb 211logica_2_livro_caderno.indb 211 7/12/2006 14:21:227/12/2006 14:21:22

Page 212: LÓGICA de PROGRAMAÇÃO II Avançado

212

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éricoVar NVALOR : numéricoIní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 NVALORFim

Algoritmo SupermercadoVar N, TOTALPAGO, VALORPROD, CONT : numérico CODPROD : literal

logica_2_livro_caderno.indb 212logica_2_livro_caderno.indb 212 7/12/2006 14:21:227/12/2006 14:21:22

Page 213: LÓGICA de PROGRAMAÇÃO II Avançado

213

Lógica de Programação II

Início Escreva “Digite o total de produtos comprado” Leia N TOTALPAGO ← 0 Para CONT de 1 até N faça

{Entrada dos dados}

Escreva “Digite o código do produto” Leia CODPROD Escreva “Digite o valor do produto” Leia VALORPROD

{Chamando a função e levando de parâmetro o código e o valor}

VALORPROD ← CALCDESCONTO (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: “, TOTALPAGOFim

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éricoVar

K, Fim : numéricoInício

EhPrimo ← 1 {Partimos do princípio de que o número N é primo}K ← 2Fim ← N/2Enquanto (RESTO(N,K) > 0) E (K < Fim) Faca

K ← K + 1Fim 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) = 0) EntãoEhPrimo ← 0

SenãoEhPrimo ← 1

Fim SeRetorne EhPrimo

Fim

logica_2_livro_caderno.indb 213logica_2_livro_caderno.indb 213 7/12/2006 14:21:237/12/2006 14:21:23

Page 214: LÓGICA de PROGRAMAÇÃO II Avançado

214

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 DadosDoRetanguloVariáveis LadoA, LadoB : numéricoIní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éricoInício

AreaTotal = (LA * LB)Retorna AreaTotal

Fim.

Função CalculaPerimetro (A:numérico; B:numérico) :numérico

Perimetro : numéricoInicio

Perimetro = ((A * 2)+(B * 2))Retorna Perimetro

Fim

logica_2_livro_caderno.indb 214logica_2_livro_caderno.indb 214 7/12/2006 14:21:237/12/2006 14:21:23

Page 215: LÓGICA de PROGRAMAÇÃO II Avançado

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 confi namento. É 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 215logica_2_livro_caderno.indb 215 7/12/2006 14:21:237/12/2006 14:21:23

Page 216: LÓGICA de PROGRAMAÇÃO II Avançado

216

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.

logica_2_livro_caderno.indb 216logica_2_livro_caderno.indb 216 7/12/2006 14:21:237/12/2006 14:21:23