You are on page 1of 218

Universidade do Sul de Santa Catarina

Lgica de Programao II
Disciplina na modalidade a distncia

LIVRO DIDTICO E CADERNO DE ATIVIDADES


5 edio revista e atualizada

Palhoa UnisulVirtual 2009

Crditos

Unisul - Universidade do Sul de Santa Catarina UnisulVirtual - Educao Superior a Distncia Campus UnisulVirtual
Avenida dos Lagos, 41 - Cidade Universitria Pedra Branca Palhoa SC - 88137-100 Fone/fax: (48) 3279-1242 e 3279-1271 E-mail: cursovirtual@unisul.br Site: www.virtual.unisul.br

Capacitao e Assessoria ao Docente

Acessibilidade

Reitor Unisul
Ailton Nazareno Soares

Angelita Maral Flores (Coordenadora) Adriana Silveira Caroline Batista Cludia Behr Valente Elaine Surian Patrcia Meneghel Simone Perroni da Silva Zigunovas

Vanessa de Andrade Manoel

Monitoria e Suporte

Avaliao da Aprendizagem

Coordenao dos Cursos

Mrcia Loch (Coordenadora) Elosa Machado Seemann Franciele Dbora Maia Gabriella Arajo Souza Esteves Lis Air Fogolari Simone Soares Haas Carminatti

Vice-Reitor

Sebastio Salsio Heerdt

Chefe de Gabinete da Reitoria


Willian Mximo

Pr-Reitor Acadmico
Mauri Luiz Heerdt

Pr-Reitor de Administrao
Fabian Martins de Castro

Campus Sul

Diretora: Milene Pacheco Kindermann

Campus Norte

Diretor: Hrcules Nunes de Arajo

Campus UnisulVirtual

Diretor: Joo Vianney Diretora Adjunta: Jucimara Roesler

Equipe UnisulVirtual
Gerncia Acadmica
Mrcia Luz de Oliveira

Gerncia Administrativa
Renato Andr Luz (Gerente) Marcelo Fraiberg Machado Naiara Jeremias da Rocha Valmir Vencio Incio

Adriana Ramme Adriano Srgio da Cunha Alosio Jos Rodrigues Ana Luisa Mlbert Ana Paula Reusing Pacheco Bernardino Jos da Silva Carmen Maria Cipriani Pandini Charles Cesconetto Diva Marlia Flemming Eduardo Aquino Hbler Fabiana Lange Patrcio (auxiliar) Fabiano Ceretta Itamar Pedro Bevilaqua Jairo Afonso Henkes Janete Elza Felisbino Jorge Alexandre Nogared Cardoso Jos Carlos Noronha de Oliveira Jucimara Roesler Karla Leonora Dahse Nunes Luiz Guilherme B. Figueiredo Luiz Otvio Botelho Lento Marciel Evangelista Catneo Maria da Graa Poyer Maria de Ftima Martins (auxiliar) Mauro Faccioni Filho Moacir Fogaa Moacir Heerdt Nazareno Marcineiro Nlio Herzmann Onei Tadeu Dutra Raulino Jac Brning Rose Clr Estivalete Beche Rodrigo Nunes Lunardelli

Design Visual

Pedro Paulo Alves Teixeira (Coordenador) Adriana Ferreira dos Santos Alex Sandro Xavier Alice Demaria Silva Anne Cristyne Pereira Diogo Rafael da Silva Edison Rodrigo Valim Elusa Cristina Sousa Higor Ghisi Luciano Patricia Fragnani Vilson Martins Filho

Rafael da Cunha Lara (Coordenador) Andria Drewes Anderson da Silveira Anglica Cristina Gollo Bruno Augusto Zunino Claudia Noemi Nascimento Cristiano Dalazen Dbora Cristina Silveira Ednia Araujo Alberto Fernanda Farias Jonatas Collao de Souza Karla Fernanda W. Desengrini Maria Eugnia Ferreira Celeghin Maria Isabel Aragon Maria Lina Moratelli Prado Mayara de Oliveira Bastos Patrcia de Souza Amorim Poliana Morgana Simo Priscila Machado Priscilla Geovana Pagani

Produo Industrial

Multimdia

Cristiano Neri Gonalves Ribeiro Fernando Gustav Soares Lima

Francisco Asp (coordenador) Ana Paula Pereira Marcelo Bittencourt

Portal

Relacionamento com o Mercado


Walter Flix Cardoso Jnior

Rafael Pessi

Disciplinas a Distncia

Enzo de Oliveira Moreira (Coordenador) Franciele Arruda Rampelotti (auxiliar) Luiz Fernando Meneghel

Secretaria de Ensino a Distncia Karine Augusta Zanoni Albuquerque (Secretria de ensino)


Andra Luci Mandira Andrei Rodrigues Bruno De Faria Vaz Sampaio Daiany Elizabete da Silva Djeime Sammer Bortolotti Douglas Silveira Fylippy Margino dos Santos James Marcel Silva Ribeiro Jenniffer Camargo Luana Borges Da Silva Luana Tarsila Hellmann Marcelo Jos Soares Micheli Maria Lino de Medeiros Miguel Rodrigues Da Silveira Junior Patricia Nunes Martins Rafael Back Rosngela Mara Siegel Silvana Henrique Silva Vanilda Liordina Heerdt Vilmar Isaurino Vidal

Gesto Documental

Lamuni Souza (Coordenadora) Janaina Stuart da Costa Josiane Leal Juliana Dias ngelo Marlia Locks Fernandes Roberta Melo Platt

Gerncia de Ensino, Pesquisa e Extenso


Moacir Heerdt Clarissa Carneiro Mussi Letcia Cristina Barbosa (auxiliar)

Criao e Reconhecimento de Cursos


Diane Dal Mago Vanderlei Brasil

Logstica de Encontros Presenciais

Gerncia Financeira
Fabiano Ceretta

Desenho Educacional

Carolina Hoeller da Silva Boeing (Coordenadora)

Gerncia de Produo e Logstica

Design Instrucional

Arthur Emmanuel F. Silveira

Gerncia Servio de Ateno Integral ao Acadmico


James Marcel Silva Ribeiro

Avaliao Institucional
Dnia Falco de Bittencourt Rafael Bavaresco Bongiolo

Biblioteca

Soraya Arruda Waltrick (Coordenadora) Maria Fernanda Caminha de Souza

Ana Cludia Ta Carmen Maria Cipriani Pandini Cristina Klipp de Oliveira Daniela Erani Monteiro Will Emlia Juliana Ferreira Flvia Lumi Matuzawa Karla Leonora Dahse Nunes Leandro Jos Rocha Lucsia Pereira Luiz Henrique Milani Queriquelli Mrcia Loch Marcelo Mendes de Souza Marina Cabeda Egger Moellwald Marina M. G. da Silva Michele Correa Nagila Cristina Hinckel Silvana Souza da Cruz Viviane Bastos

Graciele Marins Lindenmayr (Coordenadora) Ana Paula de Andrade Aracelli Araldi Hackbarth Daiana Cristina Bortolotti Douglas Fabiani da Cruz Edsio Medeiros Martins Filho Fabiana Pereira Fernando Steimbach Marcelo Faria Marcelo Jair Ramos Rodrigo Lino da Silva

Secretria Executiva Viviane Schalata Martins Tenille Nunes Catarina (Recepo) Tecnologia Osmar de Oliveira Braz Jnior (Coordenador)
Andr Luis Leal Cardoso Jnior Felipe Jacson de Freitas Jefferson Amorin Oliveira Jos Olmpio Schmidt Marcelo Neri da Silva Phelipe Luiz Winter da Silva Rodrigo Battistotti Pimpo

Formatura e Eventos

Jackson Schuelter Wiggers

Logstica de Materiais

Jeferson Cassiano Almeida da Costa (Coordenador) Carlos Eduardo Damiani da Silva Geanluca Uliana Guilherme Lentz Luiz Felipe Buchmann Figueiredo Jos Carlos Teixeira Rubens Amorim

Carlos Fernando Martins

Lgica de Programao II
Livro didtico Design instrucional Daniela Erani Monteiro Will Carolina Hoeller da Silva Boeng
Reviso e atualizao de contedo Clavison Martinelli Zapelini 5 edio revista e atualizada

Palhoa UnisulVirtual 2009

Copyright UnisulVirtual 2009 Nenhuma parte desta publicao pode ser reproduzida por qualquer meio sem a prvia autorizao desta instituio.

Edio Livro Didtico


Professores Conteudistas Carlos Fernando Martins Design Instrucional Daniela Erani Monteiro Will Carolina Hoeller da Silva Boeng Reviso e atualizao de contedo Clavison Martinelli Zapelini Assistente Acadmico Michele Antunes Corra (5 edio revista e atualizada) Projeto Grfico e Capa Equipe UnisulVirtual Diagramao Rafael Pessi Reviso Revisare

005.1 L82 Martins, Carlos Fernando Lgica de programao II : livro didtico / Carlos Fernando Martins ; revisor, Clavison Martinelli Zapelini ; design instrucional Daniela Erani Monteiro Will, Carolina Hoeller da Silva ; [assistente acadmico Michele Antunes Corra]. 5. ed. rev. e atual. Palhoa : UnisulVirtual, 2009. 142 p. : il. ; 28 cm. Inclui bibliografia. 1. Lgica Processamento de dados. 2. Programao (Computadores). 3. Estrutura de dados (Computao). I. Zapelini, Clavison Martinelli. II. Will, Daniela Erani Monteiro. III.Silva, Carolina Hoeller da. IV. Corra, Michele Antunes. V. Ttulo.
Ficha catalogrfica elaborada pela Biblioteca Universitria da Unisul

Sumrio
LIVRO DIDTICO
Palavras do professor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 Plano de estudo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 UNIDADE UNIDADE UNIDADE UNIDADE UNIDADE 1 2 3 4 5 Manipulao de vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Manipulao de matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Manipulao de registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tpicos avanados em algoritmos computacionais . . . . . Programao estruturada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 33 47 71 95

Para concluir o estudo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 Referncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 Sobre o professor conteudista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 Respostas e comentrios das atividades de autoavaliao . . . . . . . . . . . . . 127

Apresentao
Este livro didtico corresponde disciplina de Lgica de Programao II. O material foi elaborado visando a uma aprendizagem autnoma, abordando contedos especialmente selecionados e adotando uma linguagem que facilite seu estudo a distncia. Por falar em distncia, isso no significa que voc estar sozinho. No esquea que sua caminhada nesta disciplina tambm ser acompanhada constantemente pelo Sistema Tutorial da UnisulVirtual. Entre em contato sempre que sentir necessidade, seja por correio postal, fax, telefone, e-mail ou Espao UnisulVirtual de Aprendizagem. Nossa equipe ter o maior prazer em atend-lo, pois sua aprendizagem nosso principal objetivo Bom estudo e sucesso! Equipe UnisulVirtual.

Palavras do professor
Ol caro estudante, pronto para mais uma etapa? Na verdade, agora voc vai aprimorar o que estudou em Lgica de Programao I. No imagine que est na metade do caminho, tendo em vista que o estudo da lgica de programao contnuo e eterno, pelo menos para quem quer ser um programador verdadeiro. Ainda hoje, mesmo depois de muitos anos trabalhando com programao, cada algoritmo que implemento uma forma de exercitar os conceitos. Trato cada algoritmo como um desafio a ser vencido. Voc deve pensar assim tambm, que lgica de programao um aprendizado contnuo e dinmico; que cada problema solucionado por um algoritmo de programao um degrau alcanado. Isso pode ajudar e muito nos desafios desta disciplina. Lembre-se, um programador diferencia-se do outro pela quantidade de exerccios que ele faz. Portanto, aproveite esse material de base para se aprofundar. Consulte algumas bibliografias que podero ajud-lo a resolver outros problemas de programao. Quanto mais voc estudar, melhor vai ficar. E quanto melhor ficar, mais voc vai estudar. um ciclo contnuo e desafiador. Planeje o seu tempo de forma que o estudo de lgica de programao se torne uma diverso. Se assim for, voc j tem o esprito de programador. Bom estudo! Professor Carlos Fernando Martins.

Plano de estudo
O plano de estudos visa a orient-lo/a no desenvolvimento da Disciplina. Nele, voc encontrar elementos que esclarecero o contexto da Disciplina e sugeriro 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 construo de competncias se d sobre a articulao de metodologias e por meio das diversas formas de ao/ mediao. So elementos desse processo:

o livro didtico; o Espao UnisulVirtual de Aprendizagem - EVA; as atividades de avaliao (complementares, a distncia e presenciais).

Ementa
Continuao da Lgica de Programao I com aprofundamento dos estudos com Fluxogramas e Diagrama de Blocos. Linguagens de programao, Cdigos computacionais e ambientes de desenvolvimento. Exerccios de Programao Linear, de Programao Estruturada e de Programao Visual.

Objetivos

Desenvolver a capacidade do aluno em pensar logicamente, sendo assim, capaz de desenvolver algoritmos computacionais de mdia e alta complexidade. Elaborar algoritmos de programao de mdia e alta complexidade.

Universidade do Sul de Santa Catarina

Carga horria
A carga horria total da disciplina 60 horas/aula.

Agenda de atividades/ Cronograma

Verifique com ateno o EVA, organize-se para acessar periodicamente o espao da Disciplina. O sucesso nos seus estudos depende da priorizao do tempo para a leitura; da realizao de anlises e snteses do contedo; e da interao com os seus colegas e tutor. No perca os prazos das atividades. Registre no espao a seguir as datas, com base no cronograma da disciplina disponibilizado no EVA. Use o quadro para agendar e programar as atividades relativas ao desenvolvimento da Disciplina.

12

Lgica de Programao II

Atividades

Demais atividades (registro pessoal)

13

UNiDADE 1

Manipulao de vetores
Objetivos de aprendizagem

Conhecer os algoritmos de maiores complexidades. Construir algoritmos com utilizao de vetores.

Sees de estudo
Seo 1 Conceito e declarao de vetores. Seo 2 Operao de vetores. Seo 3 Algoritmos com manipulao de vetores.

Universidade do Sul de Santa Catarina

Para incio de estudo


Antes de iniciar o estudo sobre vetores, voc deve recordar o que uma varivel e para que ela serve, certo? Bem, voltando unidade 4 de Lgica de Programao I, temos que varivel a representao simblica dos elementos de memria de um computador. Cada varivel corresponde a uma posio de memria, cujo contedo pode se alterado ao longo do tempo durante a execuo de um programa. Embora uma varivel possa assumir diferentes valores, ela s pode armazenar um valor a cada instante. Voc tambm estudou que as variveis podem ser de quatro tipos: inteiras, reais e laterais, e que para declarar uma varivel precisamos definir o seu nome e que tipo de dados ser armazenado nela. Veja a seguir:
incio nome: literal {varivel do tipo literal} idade: inteiro {varivel do tipo inteira} fim

Outro exemplo bem fcil, j utilizando o sinal de atribuio. Veja.


incio nome: literal {varivel do tipo literal} idade: inteiro {varivel do tipo inteira} idade 22 {varivel idade assume valor 22} nome Paulo Pereira {varivel nome assume Paulo Pereira} fim

16

Lgica de Programao II

O algoritmo acima, amplamente discutido em Lgica de Programao I, serve de base para a seguinte questo: Suponha que precisamos cadastrar dois nomes de clientes com suas respectivas idades. Como fazer? Ora, parece bem simples, voc no acha? Basta criar duas novas variveis, conforme mostro a seguir:
incio nome1, nome2: literal {variveis do tipo literal} idade1, idade2: inteiro {variveis do tipo inteira} idade1 22 {varivel idade1assume valor 22} nome1 Paulo Pereira {varivel nome1 assume Paulo Pereira} idade2 38 {varivel idade2 assume valor 38} nome2 Ana Luiza {varivel nome2 assume Ana Luiza} fim

Mas, e se quisermos criar um cadastro de alunos de um colgio? E agora? Quantas variveis precisamos criar? 500, 2500, 10000? Basta utilizar o conceito de vetores para lidar com situaes como essas. - Toda a lgica de programao estudada at agora vai se repetir. No h nenhum outro comando. Tudo que voc aprendeu em Lgica de Programao I ser utilizado agora. Os nicos assuntos novos so o conceito, a criao e a utilizao de vetores.

Unidade 1

17

Universidade do Sul de Santa Catarina

SEO 1 - Conceito e declarao de vetores


Antes de definir vetor, imaginemos a seguinte situao. Precisamos criar um programa que armazene as seguintes notas de um aluno em Lgica de Programao II: 8.0, 10.0, 9.0, 10.0, 8.5, 10.0 e que calcule a mdia final. A soluo bem simples, conforme j visto em Lgica de Programao I.
incio conta:inteiro nota, media, soma: real soma 0 {inicializa varivel soma com o valor 0} para conta de 1 at 6 passo 1 faa {lao de repetio} escreva Entre com a nota: leia nota {leitura da nota} soma soma + nota {soma de todas as notas entradas} fim-para media soma/6 {calcula a mdia final} escreva A mdia final , media {mostra o resultado na tela} fim

Mas agora consta a seguinte complexidade: necessitamos imprimir tambm todas as notas do aluno, alm da mdia final. Uma soluo extremamente pobre seria criar seis variveis para armazenar as seis notas digitadas e imprimi-las. Mas, se tiver mais notas (80, por exemplo), seu algoritmo j no resolveria mais o problema. Para resolver essa situao, utilize o conceito de vetor.
Um vetor nada mais do que uma varivel que pode armazenar vrios valores do mesmo tipo.

Bem, mas o que significa isso? Inicialmente, acompanhe o conceito de variveis e sua definio.

18

Lgica de Programao II

Quando definimos uma varivel, alocamos um espao na memria do computador para armazenar uma e somente uma constante por vez, seja ela literal, numrica(real ou inteiro) ou lgica. Quando atribumos um valor varivel sobrescrevemos seu contedo. Por exemplo, ao criarmos uma varivel real chamada nota, criamos um espao na memria para armazenar apenas um valor real por vez, conforme a seguir:
nota: real ....... nota 10 {varivel armazena valor real 10} escreva O valor da varivel nota : , nota {aqui, o valor impresso ser 10} nota 8 {varivel armazena valor real 8} escreva O valor da varivel nota : , nota {aqui, o valor impresso ser 8, ou seja, sobrescrevemos o valor 10} ......

Isso parece bem lgico, pois estamos escrevendo na mesma posio de memria do computador. Lembre-se que, sempre que criarmos uma varivel, estaremos criando um espao na memria do computador para armazenar dados. um endereo na qual o computador se referencia para manipular os dados em questo. Como queremos armazenar vrios valores numricos, precisamos criar vrias posies de memria sob o nome de uma mesma varivel. O que devemos especificar quantos valores queremos armazenar, ou seja, quantas posies de memria queremos alocar para armazenar esses nmeros. Vejamos o exemplo para armazenar as notas de um aluno conforme o algoritmo anterior. Queremos armazenar seis valores diferentes em seis posies de memria diferentes:
8.0 10.0 9.0 10.0 8.5 10.0

Unidade 1

19

Universidade do Sul de Santa Catarina

Devemos criar 6 posies de memrias para armazenar esses valores. Como soluo, podemos criar 6 variveis ou criar um vetor com 6 posies de memria. Esse esquema representa um vetor do tipo real de 6 posies, ou seja, 6 endereos de memria consecutivos alocados no computador que podem armazenar 6 valores reais diferentes. Cada quadradinho representa uma posio de memria, onde podem ser armazenados os valores reais. O nmero de posies que queremos criar especificado na declarao. Em resumo: um vetor prtico quando precisamos manipular um conjunto de dados do mesmo tipo sem que seja necessrio declarar muitas variveis. Por exemplo: O registro de 26 livros e seus respectivos preos; o registro de notas de 13 avaliaes de um aluno etc. Mas como criar um vetor? muito simples. Especificamos o nome do vetor e o nmero de posies da memria que queremos alocar. Cada posio de memria pode armazenar um valor diferente dos demais.
<nome do vetor>: vetor [tamanho do vetor] <tipo de constante que o vetor poder conter>

Sintaxe do vetor

Quando um vetor declarado, ele se apresenta assim na memria:


Valor 1 Valor 2 Valor n

20

Lgica de Programao II

notas: vetor[6] real {vetor real de 6 posies. Pode armazenar at 6 valores reais diferentes} estados: vetor[27] literal {vetor de caracteres de 27 posies. Pode armazenar at 27 caracteres diferentes}

Importante
Assim como na criao das variveis, para a criao de vetores no precisamos especificar os endereos de memria do computador. isso feito automaticamente, sem que sequer saibamos onde os valores esto armazenados na memria. A nica coisa que sabemos que alocado um espao para armazenar esses valores e que so armazenados em endereos de memria seqenciais. Para acessar esses endereos, ou os valores armazenados nesses endereos, que um pouco diferente das variveis. Veremos isso na seo 2.

Bem, at agora no resolvemos o nosso problema de mostrar todas as notas do aluno mais a mdia final, conforme solicitado. Sabemos que precisaremos criar um vetor conforme explicado, porm, ainda no sabemos manipular ou realizar operaes com eles. A prxima seo tratar sobre isso.

Importante
Alguns autores preferem utilizar uma sintaxe diferente para a criao de vetores, conforme a seguir:

<nome do vetor>: vetor[<posio inicial do vetor>.. <posio final do vetor>] <tipo de constante que o vetor poder conter>

Unidade 1

21

Universidade do Sul de Santa Catarina

notas: vetor [1..50]: real {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]: real {criamos um vetor que inicia com ndice 0 e vai at 49}.

Qual a melhor maneira? Voc pode escolher. Porm, em linguagens de programao de alto nvel como C/C++, JAVA etc., os vetores comeam sempre com ndice 0. Desde que voc faa a converso correta entre pseudocdigo e uma linguagem de programao de alto nvel, no h problemas de qual a maneira que voc vai criar seus vetores. O importante que seja claro e sem quaisquer ambigidades.

SEO 2 - Operao de vetores


At agora nossa preocupao foi em saber como criar um vetor e saber quando ele necessrio. Sempre que trabalharmos com grandes quantidades de dados, estaremos criando um ou mais vetores. A sintaxe da criao bastante simples conforme seo 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 operaes bsicas de adio, subtrao 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, so reservados espaos na memria para armazenar as constantes literal, numrica (real ou inteira) ou lgica. Porm, como acessar esses espaos? muito simples, basta indicar a posio que voc quer acessar.

22

Lgica de Programao II

Veja um exemplo de um vetor de notas: notas: vetor[6] real Quando o vetor notas declarado, ele se apresenta assim na memria:

(ndices)

Cada quadrado, representando uma posio de memria, uma posio do vetor declarado. Chamamos essa posio de ndice do vetor. O primeiro quadrado (posio inicial), dizemos que tem ndice 0 e o acesso a essa posio se d atravs do nome do vetor seguido do abre colchete [, do valor 0, seguido do fecha colchete ]. Para as posies seguintes, temos os ndices 1, 2, 3, .... . Para atribuirmos um valor posio inicial do vetor notas, podemos ento fazer: notas[0] 8.0 Para atribuirmos um valor segunda posio do vetor notas, podemos fazer: notas[1] 10.0 Para atribuirmos um valor terceira posio do vetor notas, podemos fazer: notas[2] 9.0. E assim sucessivamente, at preencher todo o vetor de notas. Nosso vetor ficaria assim preenchido:
8.0 10.0 9.0

Importante
Perceba que a primeira posio do vetor tem ndice 0, a segunda posio tem ndice 1, a terceira posio tem ndice 2, e assim sucessivamente. isso significa que para um vetor de tamanho N, o ltimo ndice N-1. Por exemplo, um vetor de notas de tamanho 150, declarado da seguinte forma notas: vetor [150] real tem ndices de vo de 0 (posio inicial) at 150-1, ou seja, ndice 149. No existe a posio 150. 150 o tamanho do vetor que vai de 0 at 149.

Unidade 1

23

Universidade do Sul de Santa Catarina

Todo o processo de manipulao agora se torna bastante simples, bastando especificar a posio do vetor onde estaremos armazenando os valores. Voltando ao nosso exemplo, onde queremos imprimir as notas do aluno, alm da sua mdia, podemos armazenar os valores (notas digitadas) em um vetor de notas. Cada nota digitada ser armazenada em uma posio especfica. Perceba que temos 6 notas como entrada, o que sugere um vetor de tamanho 6, com ndices variando de 0 at 5.
incio conta: inteiro media, soma: real notas: vetor[6] real {vetor para armazenar as notas digitadas} soma 0 {inicializa varivel soma com o valor 0} para conta de 0 at 5 passo 1 faa {lao de repetio} escreva Entre com a nota: leia notas[ conta ] {leitura das notas. Perceba que o que aparece entre colchetes a varivel conta. Dentro do lao de repetio, a varivel conta vai sendo incrementada de 1, sendo seu valor inicial de 0 e o final de 5, conforme o comando para. Para o primeiro lao de repetio, a varivel conta tem valor 0. Sendo assim, o comando leia notas[ conta ] est lendo notas na posio 0, ou seja, leia notas[ 0 ]. Para o segundo lao de repetio, a varivel conta tem valor 1. Sendo assim, o comando leia notas[ conta ] est lendo notas na posio 1, ou seja, leia notas[ 1 ], e assim sucessivamente at atingir o valor 5, ltima posio do vetor. } soma soma + notas[conta] {soma das notas digitadas} fim-para {para imprimir as notas, basta ler o vetor notas da posio 0 at a posio 5. Faamos com o lao de repetio novamente} para conta de 0 at 5 passo 1 faa {lao de repetio} escreva Nota: , notas[conta] fim-para media soma/6 fim Dica: para trabalhar com vetores, sempre precisamos especificar o seu tamanho inicial. Sendo assim, a forma mais usual e fcil para escrita/leitura de valores para/de vetores pode ser feita atravs do comando para/fim-para. Voc consegue saber por qu? {calcula a mdia final} escreva A mdia final , media {mostra o resultado na tela}

24

Lgica de Programao II

Tudo, agora, no passa de operaes simples, como se estivssemos manipulando variveis independentes. Por exemplo, vamos criar um vetor de nmeros pares e um vetor de nmeros mpares: a diferena entre eles ser armazenada em um terceiro vetor. Vamos assumir os 50 primeiros valores inteiros, ou seja, de 0 at 49.
incio {declarao das variveis} pares: vetor[25] inteiro {armazena nmeros pares com 25 posies, pois se so os 50 primeiros nmeros positivos, temos apenas 25 pares} impares: vetor[25] inteiro {armazena nmeros mpares} subtracao: vetor[25] inteiro {armazena a diferena entre nmeros pares e mpares} j,i: inteiro {variveis utilizadas para realizar o lao de repetio} {vamos armazenar os nmeros pares no vetor pares} j 0 {ser o contador do vetor pares e vetor mpares} para i de 0 at 49 passo 2 faa {armazena 0,2,4,6.....48. Perceba que o passo do lao de repetio de 2 em 2. Ento o valor da varivel i pula de 2 em 2. Mas no vetor pares precisamos guardar em posies seqenciais. Vamos criar uma outra varivel para contar os vetores pares (j).} pares[ j ] i j j +1 fim-para {vamos armazenar os nmeros mpares no vetor mpares} j 0 {inicializar novamente, para iniciar o vetor impares de 0.} para i de 1 at 49 passo 2 faa impares [ j ] i {armazena 1,3,5,7.....49. Perceba que o passo do lao de repetio de 2 em 2, mas a contagem comea com 1. O contador j ir guardar o valor de i na posio correta em seqncia.} jj+1 fim-para {vamos realizar as subtraes de cada posio dos vetores pares e mpares e armazenar o resultado no vetor subtracao. A estrutura repetio para-faa inicia em 0 e vai at 25, pois cada vetor tem apenas 25 elementos (25 pares e 25 mpares) dentre os 50 primeiros nmeros 0-49} para i de 0 at 24 passo 1 faa subtracao[ i ] = pares[ i ] impares[ i ] fim-para {como resultado de sada, vamos imprimir os vetores} para i de 0 at 24 passo 1 faa escreva Nmeros Pares: , pares[ i ] escreva Nmeros mpares , impares[ i ] escreva Diferena Pares - mpares: , subtracao[ i ] fim-para

fim

Unidade 1

25

Universidade do Sul de Santa Catarina

Bem, agora voc j sabe criar vetores, inserir e recuperar valores de vetores. Na prxima seo, vai estudar alguns algoritmos de programao utilizando vetores.

SEO 3 - Algoritmos com manipulao de Vetores


Conforme falamos na disciplina de Lgica de Programao I, a melhor maneira de aprender a programar programando. Continua valendo a idia: A melhor maneira de aprender a utilizar vetores construindo algoritmos com vetores. Nesta seo, mostraremos algumas aplicaes que manuseiam vetores. Para esses exemplos, vamos definir as variveis com nomes maisculos apenas por questes de esttica. Vale lembrar que, de acordo com a seo 4 de Lgica de Programao I, por padro, as variveis so todas com letras minsculas, mas isso para as linguagens de programao de alto nvel como C/C++, JAVA, Visual etc. Para o pseudocdigo, podemos representar por letras maisculas, sem perda de padronizao. 1. Ler um vetor de 50 nmeros e montar outro vetor com os valores do primeiro multiplicados por 3. Pseudocdigo:
incio VET1,VET2 : vetor [50] real CONTADOR : inteiro para CONTADOR de 0 at 49 faa leia Digite um nmero: ,VET1[CONTADOR] VET2[CONTADOR] VET1[CONTADOR] * 3 fim-para fim

26

Lgica de Programao II

2. Um armazm contm 400 produtos e para cada tipo de produto existe um cdigo. Faa um algoritmo para ler o cdigo do produto e a quantidade em estoque. Depois, monte dois vetores para armazenar respectivamente os cdigos das mercadorias e a quantidade dos produtos. Pseudocdigo:
incio {declarao das variveis} CODIGOPRODUTO : vetor [400] literal QUANTIDADE : vetor [400] inteiro CONTADOR : inteiro para CONTADOR de 0 at 399 faa {leitura de 400 cdigos de produtos e a quantidade em estoque de cada um} escreva Digite o cdigo do produto: leia CODIGOPRODUTO[CONTADOR] escreva Digite a quantidade do produto em estoque: leia QUANTIDADE[CONTADOR] fim-para fim

3. Ler um vetor contendo 100 nmeros, que correspondem a matrculas de alunos. Ler cinco nmeros e imprimir uma mensagem informando se eles esto ou no presentes no vetor. Pseudocdigo:
incio {declarao de variveis} ALUNOS : vetor[100] inteiro {lembre que o tamanho do vetor 100, mas ele vai de 0 at 99} POS, PESQUISADO, CONT :inteiro {lao de repetio para preencher o vetor ALUNOS} para POS de 0 at 99 faa escreva Digite o cdigo de matrcula de um aluno: leia ALUNOS[POS] fim-para
Unidade 1

27

Universidade do Sul de Santa Catarina

{5 entradas de dados para verificar se alunos esto cadastrados ou no} para CONT de 1 at 5 faa escreva Digite o nmero de matrcula a ser pesquisado: leia PESQUISADO POS -1 {inicialmente atribudo o valor 1 para a varivel POS porque na seqncia, no comando repita, a varivel POS ser incrementada de 1 (POS POS + 1). Como queremos comear a ler o vetor ALUNOS a partir da posio 0, no primeiro lao, a varivel POS assume valor 0} repita POS POS+1 {repete o lao at que o nmero sendo pesquisado (valor armazenado na varivel PESQUISADO) seja igual ao nmero armazenado no vetor ALUNOS em uma determinada posio POS, ou que a varivel 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 ento {se a varivel POS possui um valor superior a 99, ou seja, 100, isso significa que todo o vetor ALUNOS foi lido desde o ndice 0 at 99 (100 alunos), mas que no h nenhum nmero armazenado nesse vetor igual ao valor armazenado na varivel PESQUISADO} escreva Nmero no cadastrado ! seno escreva Nmero localizado na posio , POS , do vetor. fim-se fim-para fim

4. Criar um algoritmo que leia o preo de compra e o preo 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%

Pseudocdigo:
28

Lgica de Programao II

Inicio {declarao de variveis} PRECOCOMPRA: vetor [100] real {armazena os preos de compra das mercadorias} PRECOVENDA: vetor [100] real {armazena os preos de venda das mercadorias} LUCRO, TOTLUCROMENOR10, TOTLUCROMENOR20, TOTLUCROMAIOR20: real {variveis utilizadas para armazenar o lucro, o lucro menor que 10%, menor do que 20% e maior do que 20%, respectivamente} i : inteiro {varivel utilizada como contadora para laos de repetio} {precisamos inicializar as variveis contadoras de lucros} TOTLUCROMENOR10 0 TOTLUCROMENOR20 0 TOTLUCROMAIOR20 0 {entrada de dados} para I de 0 at 99 passo 1 faa {vamos especificar o preo de venda e de compra de todas as 100 mercadorias} escreva Entre com o preo de compra da mercadoria: leia PRECOCOMPRA[ i ] escreva Entre com o preo de venda da mercadoria: leia PRECOVENDA[ i ] fim-para {Processamento do algoritmo. Vamos verificar o lucro de cada mercadoria (preo de venda preo de compra) e verificar as condies 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 faa LUCRO (PRECOVENDA[ i ] PRECOCOMPRA[ i ]) * 100 / PRECOCOMPRA[ i ] {se a diferena entre preo de venda e preo de compra, ou seja, o lucro for menor do que 10, ento incrementa a varivel contadora de mercadorias com lucros inferior a 10%} se LUCRO < 10.0 ento TOTLUCROMENOR10 seno {se o lucro no inferior a 10%, ento 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 condio dentro do comando seno. Essa condio verifica se o lucro inferior ou superior a 20%.} se LUCRO < 20.0 ento 29 TOTLUCROMENOR10 + 1

Unidade 1

Universidade do Sul de Santa Catarina

TOTLUCROMENOR20 TOTLUCROMENOR20 + 1 seno TOTLUCROMAIOR20 TOTLUCROMAIOR20 + 1 fim-se {fim da condio que testa se lucro menor do que 20.0} fim-se fim-para {sada do algoritmo} escreva Nmero de mercadorias com lucro inferior a 10%: , TOTLUCROMENOR10 escreva Nmero de mercadorias com lucro maior ou igual a 10% e menor do que 20%: , TOTLUCROMENOR20 escreva Nmero de mercadorias com lucro superior a 20%: , TOTLUCROMAIOR20 fim {fim da condio que testa se lucro menor do que 10.0}

Sntese
Finalizamos mais uma etapa. Mais um passo da nossa caminhada. Nessa unidade, vimos que um vetor uma varivel que pode armazenar vrias constantes do mesmo tipo (homogneas). Isso permite manipular uma grande quantidade de dados sem a necessidade de declarar vrias variveis. Para declarar um vetor em pseudocdigo, 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 memria:
Valor 1 ndices -> 0 Valor 2 1 2 3 Valor n n

30

Lgica de Programao II

Cada posio (representado por um quadrado no desenho acima) uma posio de memria do computador. Para inserir ou ler valores de um vetor basta especificar seu nome e o ndice (posio) que queremos acessar dentro do vetor. Por exemplo: notas [10] 8.5. Sabendo que o ndice dos vetores comea com o valor numrico 0. Quando colocamos notas [10] estamos nos referindo ao ndice 10, mas a posio no vetor (representado por um quadrado) o 11. Poderamos representar as posies de um vetor de tamanho 5 conforme apresentado abaixo:

Valor 1

Valor 2

Valor 3

Valor 4

Valor 5

Valores

[0]

[1]

[2]

[3]

[4]

ndices

Podemos perceber que o ndice [3] est no quarto quadrado. Tudo isso porque um vetor tem seu incio no ndice 0, conforme j dito. Bem, um vetor unidimensional, ou seja, apresenta apenas uma dimenso ou 1 linha. Poderamos estar trabalhando com vetores bidimensionais ou vetores que possuem vrias colunas e vrias linhas. A esses vetores damos o nome de matrizes. No prximo captulo, estaremos estudando algoritmos que utilizam os conceitos de matrizes. At l!

Unidade 1

31

Atividades de autoavaliao
1. Crie um vetor para armazenar 25 valores de temperaturas. 2. Crie um vetor para armazenar 150 alunos de um colgio 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 areas de uma companhia. Alm da leitura do nmero de vos e da quantidade de lugares disponveis, leia vrios pedidos de reserva, constitudos do nmero da carteira de identidade e do nmero do vo desejado. Para cada cliente, verificar se h possibilidade no vo desejado. Em caso afirmativo, imprimir o nmero de identidade do cliente e o nmero do vo, atualizando o nmero de lugares disponveis. Caso contrrio, avisar ao cliente a inexistncia de lugares.

Saiba mais
Consulte o site http://www.unidev.com.br/artigos. H uma srie de algoritmos j feitos. um bom exerccio fazer os exemplos e comparar com o que est feito. Tambm, neste site, constam dicas importantes de lgica de programao. Dicas de programao nunca so demais, no se esquea disso!

UNiDADE 2

Manipulao de matrizes
Objetivos de aprendizagem

Entender o conceito de matrizes. Conhecer e praticar montagens de matrizes. Construir algoritmos com utilizao de matrizes.

Sees de estudo
Seo 1 Conceito e declarao de matrizes. Seo 2 Operao de matrizes. Seo 3 Algoritmos com manipulao de matrizes.

Universidade do Sul de Santa Catarina

Para incio de estudo


Trabalhamos na unidade anterior apenas com vetores unidimensionais, ou seja, variveis 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 vrias colunas, onde o tamanho do vetor especifica o nmero de colunas, conforme voc pode ver a seguir:
Linha 0 Valor 1 Coluna 0 Valor 2 Coluna 1 Valor 3 Coluna 2

...

Valor n Coluna n-1

Perceba na figura anterior que temos uma linha, denominada linha 0, e vrias colunas, denominadas de coluna 0, coluna 1 e assim sucessivamente. Como vimos na unidade anterior, cada valor de um vetor armazenado em uma posio de memria, ou seja, em um dos quadrados representados na figura anterior. J sabemos tambm que no precisamos saber o endereo de memria do computador para acessar os elementos do vetor, bastando especificar o ndice que queremos acessar.
Por exemplo, para um vetor chamado de NOTAS de tamanho 5, podemos acessar os ndices de 0 at 4 (lembrese de que um vetor sempre comea com ndice 0). Para acessar qualquer posio do vetor, basta especificar o ndice de interesse: NOTAS [2] 7.5. Se observarmos o ndice que estamos acessando, no exemplo em questo, o ndice 2 do vetor NOTAS, podemos represent-lo conforme a figura anterior: Linha 0 Coluna 0 Coluna 1 7.5 Coluna 2 Coluna n-1

Observando a figura, podemos constatar que o ndice 2 est na linha 0 e coluna 2. Isso mesmo, voc j deve ter percebido que um vetor nada mais do que uma tabela de 1 (uma) linha, na qual chamamos de linha 0 e vrias colunas, onde armazenado

34

Lgica de Programao II

cada um dos valores, seja ele numrica (real ou inteiro), alfanumrico (literal) ou lgico e que o ndice que especificamos para acessar o vetor exatamente o nmero 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 questo: e, se quisermos trabalhar com um vetor que possua vrias linhas e vrias colunas conforme a figura a seguir?
Linha 0 Linha 1 Linha 2 Coluna 0 Coluna 1 Coluna 2 Coluna 3

Temos agora vrias linhas e colunas. Damos o nome para essas estruturas de matrizes. - Nesta unidade voc vai conhecer o que so matrizes e saber o porqu de sua importncia no mundo da programao.

Unidade 2

35

Universidade do Sul de Santa Catarina

SEO 1 - Conceito e declarao de matrizes


Uma matriz nada mais do que um vetor de 2 dimenses (linhas e colunas) capaz de armazenar variveis do mesmo tipo (numrica, literal ou lgica).

Pode ser representada por uma tabela, conforme voc pode ver a seguir:
0 1 2 0 1 2 3

Cada quadrado representa uma posio de memria onde podem ser armazenadas as variveis, de maneira idntica aos vetores. Porm, os vetores so unidimensionais (apenas colunas) e as matrizes so bidimensionais (2 dimenses: linhas e colunas). Agora teremos no somente a linha 0, mas tambm a linha 1, a linha 2 e assim sucessivamente. O nmero de posies que queremos criar especificado na declarao, de forma similar a dos vetores. Mas qual a utilidade de uma matriz? Uma matriz prtica quando precisamos manipular um conjunto de dados do mesmo tipo, sem que seja necessrio declarar muitas variveis e precisamos fazer relaes de 2 variveis.
Queremos registrar 4 temperaturas de trs dias da semana (segunda-feira, tera-feira e quarta-feira). Nesse caso, temos duas variveis: temperatura e dias da semana. A melhor maneira de representar isso atravs de uma tabela, mostrando nas linhas os dias da semana e, nas colunas, as temperaturas medidas.

Veja a tabela a seguir:

36

Lgica de Programao II

Dias da semana Temperatura 1 Segunda Tera Quarta 27 25 21

Temperatura 2 29 27 23

Temperatura Temperatura 3 4 30 24 28 25 22 20

Se olharmos para a tabela anterior, podemos saber, por exemplo, que na tera-feira, a 4 temperatura medida foi 22C e que na quarta-feira a 2 temperatura medida foi de 23C. Estamos fazendo uma correspondncia entre a varivel Temperatura e o Dia. Nesse caso, para determinar a temperatura em uma determinada hora de um dia. Para representar essa correspondncia que utilizamos o conceito de matrizes. Agora termos uma estrutura de linhas e colunas e no apenas de colunas como eram os vetores. Mas como criar uma matriz? muito simples. Especificamos o nome da matriz seguido do nmero de linhas e colunas que a matriz conter, alm do tipo de varivel que ser armazenada.
A exemplo de vetores, as matrizes s podem armazenar dados do mesmo tipo. Por exemplo: somente dados numricos (reais e inteiros) ou somente dados literais ou somente dados lgicos. No podemos ter em uma matriz dados numricos e literais ao mesmo tempo.

Sintaxe da matriz

<nome da matriz>: matriz [nmero de linhas][nmero de colunas] <tipo de constante que o vetor poder conter>

notas_de_alunos: matriz[6][4] real {matriz que possui 6 linhas numeradas de 0 at 5 e 4 colunas, numeradas de 0 at 3. Dizemos que a matriz tem dimenso de 6x4. No total, so 6x4 = 24 posies para armazenar valores reais} 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 dimenso de 10x30. No total, so 10x30 = 300 posies para armazenar valores literais}

Unidade 2

37

Universidade do Sul de Santa Catarina

Assim como na criao de vetores, para a criao de matrizes no precisamos especificar os endereos de memria do computador. Isso feito automaticamente, sem que sequer saibamos onde os valores esto armazenados na memria. A nica coisa que sabemos que alocado um espao para armazenar esses valores e que so armazenados em endereos de memria seqenciais. Para acessar esses endereos ou os valores armazenados nesses endereos que um pouco diferente dos vetores. Veremos isso na seo 2. - Na prxima seo voc vai estudar como manipular matrizes, ou seja, como inserir e ler valores a partir de matrizes.

SEO 2 - Operao de matrizes


At agora nossa preocupao foi em saber como criar uma matriz e saber quando ela necessria. Sempre que trabalharmos com grandes quantidades de dados e precisamos relacionar duas ou mais variveis, estaremos criando uma ou mais matrizes. A sintaxe da criao bastante simples conforme seo 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 ateno especial: precisamos especificar qual a linha que estamos acessando, alm da coluna como feito com os vetores. Assim, para acessar as posies de uma matriz, basta indicar a linha e a coluna desejadas.

38

Lgica de Programao II

Exemplo: NOTAS. NOTAS: matriz [6][4] real 0 1 2 3 4 5 0 1 2 3

1. A Matriz NOTAS uma matriz de dimenso 6x4, ou seja, 6 linhas por 4 colunas. 2. Para armazenar uma constante real na matriz NOTAS, precisamos identificar a linha e coluna que queremos acessar. Isso feito da seguinte forma: nome da matriz [ndice da linha][ndice da coluna], lembrando que os ndices comeam 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 real 10 na 3 (terceira) linha (linha 2) da 2 (segunda) coluna (coluna 1), utilizamos os ndices da matriz NOTAS, nesse caso, o ndice 2 para linha e o ndice 1 para coluna. Assim, NOTAS [2][1] 10.0. Veja com fica a matriz. 0 1 2 3 4 5 0 1 2 3

10.0

Todo o processo de manipulao agora se torna simples, bastando especificar a posio onde estaremos armazenando os valores, ou seja, basta especificar o nome da matriz e, a seguir, entre colchetes, o ndice que representa a linha e, depois, tambm entre colchetes, o ndice que representa a coluna.

Unidade 2

39

Universidade do Sul de Santa Catarina

Dica: para trabalhar com matrizes, sempre precisamos especificar a sua dimenso, ou seja, o nmero de linha pelo nmero de colunas. Sendo assim, a forma mais usual e fcil para escrita/leitura de valores para/de matrizes pode ser feita atravs do comando para/fimpara. Voc consegue saber o porqu?

1. Montar uma matriz nas dimenses 4x5 e imprimir a soma das linhas e colunas. Pseudocdigo:

incio MAT : matriz [4][5] inteiro {matriz de dimenso 4x5. 4 linhas e 5 colunas} SOMALINHA, SOMACOLUNA, LINHA, COLUNA : inteiro {Aqui um fato importante. Para percorrer um vetor desde o seu incio at o seu final, utilizamos o comando para/faa/fim-para. Agora temos que percorrer toda a matriz, ou seja, todas as linhas e colunas. O processo bem simples. Para percorrer todas as colunas de uma linha de uma matriz continuamos utilizando o comando para/faa/fimpara. Assim que todas as colunas de uma linha so lidas ou acessadas, passa-se para a prxima linha. Novamente, para essa nova linha, todas as colunas so acessadas, e assim sucessivamente. Podemos perceber que para cada incremento da linha devemos ler ou acessar todas as colunas daquela linha. Isso sugere dois laos de repetio: 1 para pular as linhas e outro para pular as colunas. Dessa forma, elaboramos 2 laos de repetio, um para linha com a varivel LINHA sendo incrementada de 0 at 3 (4 linhas no total), e um lao para coluna com a varivel COLUNA sendo incrementada de 0 at 4 (5 colunas no total). Para cada repetio do lao dentro da linha executamos 5 repeties para as colunas, percorrendo assim toda a matriz} para LINHA de 0 at 3 passo 1 faa para COLUNA de 0 at 4 passo 1 faa escreva Digite um nmero: leia MAT[LINHA][COLUNA] fim-para fim-para {Processamento do Algoritmo. Soma das linhas. A explicao desta parte est aps o fim-para do primeiro lao de repetio}

40

Lgica de Programao II

para LINHA de 0 at 3 passo 1 faa SOMALINHA 0 para COLUNA de 0 at 4 passo 1 faa SOMALINHA SOMALINHA + MAT[LINHA][COLUNA] fim-para escreva Total da linha, LINHA,:, SOMALINHA fim-para {Explicando a lgica 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 (So os ndices da matriz. Para o primeiro lao de repetio para LINHA de 0 at 3 passo 1 faa, a varivel LINHA incrementada de 0 at 3. Inicialmente ela tem valor numrico 0. O primeiro comando dentro do lao inicializar a varivel SOMALINHA igual a 0. A varivel SOMALINHA armazenar a soma de todos os valores inteiros de cada linha. Sabendo que estamos na linha 0, devemos percorrer cada coluna dessa linha. Isso feito pelo lao de repetio seguinte para COLUNA de 0 at 4 passo 1 faa. Quando o programa entra nesse segundo lao, a varivel COLUNA incrementada com passo 1, de 0 at 4, executando os comandos que esto dentro da estrutura para/faa/ fim-para, no nosso caso, apenas o comando SOMALINHA SOMALINHA + MAT[LINHA][COLUNA]. Quando o segundo lao de repetio finalizado, o programa executa os comandos seguintes ao fim-para, ou seja, executa o comando de impresso na tela escreva Total da linha, LINHA,:, SOMALINHA. Ao encontrar o fim-para do primeiro lao de repetio, o programa incrementa a varivel LINHA de 1 no comando para LINHA de 0 at 3 passo 1 faa passando o valor da varivel LINHA para o valor 1, e executa todos os comandos dentro da estrutura para/ faa/fim-para novamente. Como SOMALINHA armazena o valor inteiro da soma dos valores da linha anterior, a varivel reinicializada com valor 0. Um timo exerccio 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 faa SOMACOLUNA 0 para LINHA de 0 at 3 passo 1 faa SOMACOLUNA SOMACOLUNA + MAT[LINHA][COLUNA] fim-para escreva Total da coluna, COLUNA,:, SOMACOLUNA fim-para fim

Unidade 2

41

Universidade do Sul de Santa Catarina

SEO 3 - Algoritmos com manipulao de matrizes


Voc j deve ter observado que no criamos qualquer lgica para manipular tanto os vetores quanto as matrizes. Usamos os mesmos comandos que aprendemos em Lgica de Programao I, ou seja, comandos como leia, escreva, para/faa/fim-para, entre outros que poderamos estar utilizando tambm. uma oportunidade mpar para voc incrementar os conceitos e revisar toda a lgica de programao. Nesta seo, apresento mais alguns exerccios resolvidos, porm, 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 exerccio e tanto para aprender cada vez mais.
1. Monte uma matriz para quando o usurio informar um nmero correspondente a um ms, o algoritmo imprima o nome do ms indicado em portugus, a abreviatura e o nome do ms em ingls. Por exemplo, o usurio digita o nmero 4 e o algoritmo ativado para imprimir: 4Abril, Abr, April. Pseudocdigo:

incio MESES : matriz [12][3] literal LINHA, NUM : inteiro para LINHA de 0 at 11 passo 1 faa escreva Digite o nome do ,LINHA +1,ms: leia MESES[LINHA][1] escreva Digite a abreviao do ms de ,MESES[LINHA][1],: leia MESES[LINHA][2] escreva Digite o nome em ingls do ms ,MESES[LINHA][1],: leia MESES[LINHA][3] fim-para leia Digite o nmero do ms a ser consultado: ,NUM escreva NUM, , MESES[NUM][1], ,, MESES[NUM][2], , , MESES[NUM][3] fim

42

Lgica de Programao II

2. Uma floricultura conhecedora de sua clientela gostaria de fazer um algoritmo que pudesse controlar via Web sempre um estoque mnimo de determinadas plantas, pois todo o dia, pela manh, o dono faz novas aquisies. Criar um algoritmo que deixe cadastrar 50 tipos de plantas e nunca deixa o estoque ficar abaixo do ideal. O algoritmo ser utilizado para construir um programa na pgina da empresa. Pseudocdigo:

incio {vamos montar uma matriz de 50 linhas e 3 colunas. As 50 linhas servem para cadastrar todos os produtos e as trs colunas servem para especificar a quantidade de produtos em estoque, a quantidade desejada e o resultado da diferena entre a quantidade em estoque e a quantidade desejada respectivamente.} PRODUTOS: matriz [50][3] : inteiro NOME: vetor [50] literal I: inteiro para I de 0 at 49 passo 1 faa 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 ] ento PRODUTOS [ I ][ 2 ] PRODUTOS[ I ][ 1 ] - PRODUTOS[ I ][ 0 ] seno [PRODUTOS [ I ][ 2 ] 0 fim-se fim-para {dados de sada do algoritmo} escreva Total de Compras: para I de 0 at 49 passo 1 faa escreva Produto: , NOME [i], Qtde = , PRODUTOS[ I ] [ 2 ] fim-para fim

Unidade 2

43

Universidade do Sul de Santa Catarina

Sntese
Nesta unidade, voc viu que para relacionar duas ou mais variveis precisamos manipular matrizes. Diferentemente de vetores, que so unidimensionais, as matrizes so bidimensionais, possuindo linhas e colunas. Podemos ter matrizes com mais dimenses, mas nesta unidade trabalhamos apenas com 2. Similarmente aos vetores, as matrizes s podem armazenar dados do mesmo tipo, ou seja, quando definimos uma matriz, especificamos que tipo de varivel a mesma vai armazenar numreica (real ou inteira), literal ou lgica. A sintaxe em pseudocdigo para definir uma matriz a seguinte: <nome da matriz>: matriz [nmero de linhas][nmero de colunas] <tipo de constante que o vetor poder conter> Quando criamos uma matriz, o computador reserva um espao na memria para armazenar Linhas x Colunas. o que chamamos de dimenso da matriz. Para acessar qualquer elemento da matriz, basta especificar o ndice da linha e coluna, lembrando sempre que os ndices comeam com o valor numrico 0. Por exemplo, uma matriz NOTAS de dimenso 5x 6 comea em [0][0] e termina em [4][5]. Podemos acessar qualquer posio da matriz desde que esteja dentro das dimenses especificadas: NOTAS[3][2] 8.5. Estamos acessando a quarta linha e a terceira coluna da matriz. Por fim, viu que para percorrer uma matriz de ponta a ponta, precisamos de dois laos de repetio, um sendo utilizado para percorrer as colunas de cada linha e o outro para percorrer as linhas da matriz. Na prxima unidade, vamos trabalhar com aspectos mais sofisticados da linguagem de programao: as estruturas. Elas so a base para algoritmos avanados e tambm para a linguagem orientada a objetos, linguagem essa que voc, programador web, deve dominar. Bom trabalho e at a prxima etapa desse mundo fabuloso que o estudo da lgica de programao.

44

Lgica de Programao II

Atividades de autoavaliao
1. A distncia em quilmetros 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 distncias e tambm dever imprimir a distncia entre duas capitais solicitadas por um usurio. Esse ser um programa que poder ser acessado via Web. Tabela mostrando as distncias entre as capitais: 1 0 23 110 2 23 0 50 2 45 10 66 72 27

1 2 27

Unidade 2

45

Universidade do Sul de Santa Catarina

Saiba mais
Consulte o livro Construindo algoritmos computacionais: lgica de programao de Alfredo Boente. Para quem deseja participar de um outro grupo de discusso, basta acessar o site: http://www.aprendaprogramacao.hpg. ig.com.br/grupo.html.

46

UNiDADE 3

Manipulao de registros
Objetivos de aprendizagem

Entender o conceito de registro ou estrutura. Conhecer e praticar montagens de registros. Criar novos tipos de variveis.

Sees de estudo
Seo 1 Conceito e declarao de registros. Seo 2 Operao com registros. Seo 3 Algoritmos com manipulao de registros.

Universidade do Sul de Santa Catarina

Para incio de estudo


Quantas vezes voc j preencheu fichas de cadastros, seja em hotis, em videolocadoras, para propostas de consrcios ou ainda fichas de matrcula escolar? Nessas fichas, certamente voc precisou entrar com dados como: seu nome, sua idade, seu telefone de contato, endereo etc. Nesses casos, estamos trabalhando com dados de diferentes tipos.
Por exemplo: nome uma varivel literal, idade uma varivel inteira, informao se possui ou no veculo pode ser um valor lgico.

Percebeu que estamos entrando em um mundo onde as coisas no so to homogneas assim, ou seja, nem tudo que estamos trabalhando so apenas variveis numricas (real ou inteiras) ou literais ou ainda lgicos? H uma mistura de tipos de dados que devemos trabalhar. Mas, o que tem haver isso com lgica de programao? No poderamos criar variveis independentes, ou seja, cada informao armazenada em um local diferente como temos feito at agora? Poderamos criar, por exemplo, as variveis em pseudocdigo representando nossa ficha cadastral. Acompanhe a seguir.
incio {Declarao de variveis} DATANASC, NOME, ESTADOCIVIL, ENDERECO, BAIRRO: literal IDADE, NUMERO, CEP, FONE: inteiro ..... fim

48

Lgica de Programao II

Se fssemos preencher apenas uma ficha cadastral, isso resolveria nossos problemas. Mas vamos supor que queremos cadastrar 50 hspedes de um hotel. Certamente, tendo visto e estudado as unidades sobre vetores e matrizes, voc responderia que a soluo continua simples. Basta fazer, de todas as variveis criadas anteriormente, vetores de dimenso 50.
NOME: vetor [50] literal; iDADE: vetor[50] inteiro, e assim por diante. isso tambm resolveria nossos problemas. Se voc pensou assim, pensou certo. Parabns, por que mostra que voc conseguiu entender os conceitos das unidades anteriores.

Mas o que h de novo, ento?


Quando criamos variveis independentes, o computador ir coloc-las em qualquer endereo de memria reservado para essas ocasies. Ele no vai se preocupar em colocar em uma certa ordem que muitas vezes so necessrias por quesitos de velocidade de execuo do programa. Imagine sua ficha cadastral onde o nome est em uma folha, o endereo est duas folhas a seguir, depois volta uma folha para preencher a idade e assim sucessivamente. Parece desorganizado voc no acha? Alm do tempo de preenchimento que ser bem maior. Ou seja, se estamos criando variveis para representar nossas fichas cadastrais, seria interessante que todas elas fossem declaradas prximas uma das outras. Isso faria com que o desempenho do programa fosse melhor. Pode parecer estranho, mas para um programa com muitas informaes e dados para manipular, isso pode fazer a diferena entre um programa bom e um ruim. Pois bem, no mundo da lgica de programao, podemos criar estruturas de dados heterogneas, ou seja, capaz de armazenar variveis de tipos diferentes, de forma que as mesmas estejam declaradas prximas umas das outras no que diz respeito posio de memria do computador. So os chamados registros. Com esse tipo de estrutura, podemos declarar mltiplas variveis de diferentes tipos, todas organizadas umas prximas das outras, de forma similar a uma ficha cadastral. Na seo seguinte, vamos definir essa estrutura e vamos aprender a como declar-las.

Unidade 3

49

Universidade do Sul de Santa Catarina

Quando trabalhamos com vetores e matrizes nas unidades anteriores, os dados armazenados nessas estruturas devem ser homogneos, ou seja, tudo do mesmo tipo. No podemos utilizar nem vetores e nem matrizes para armazenar dados de tipos diferentes.
Mas, se quisermos trabalhar com dados do tipo literal e numrico juntamente, isso possvel?

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.

SEO 1 - Conceito e declarao de registros


Mas, se quisermos trabalhar com dados do tipo literal e inteiro juntamente, isso possvel?

Em lgica de programao um registro um recurso que permite a criao de diferentes tipos de variveis em um mesmo bloco de memria do computador. Quando criamos um registro, criamos um espao na memria do computador que permite armazenar dados heterogneos, ou seja, constantes de vrios tipos. como se fosse uma ficha de dados, organizada de forma que os dados esto prximos um dos outros dentro da memria do computador. Uma das grandes vantagens disso, alm da organizao, a velocidade de acesso s informaes ali contidas.

Para lembrar!
Diferentemente de vetores e matrizes que s podem armazenar dados do mesmo tipo, os registros so estrutura ou recursos que permitem armazenar constantes de diferentes tipos.

50

Lgica de Programao II

Sintaxe do registro

<nome do registro>: registro <campos que comporo o registro> fim-registro

onde <campos que comporo o registro> so todas as variveis que iro compor uma ficha de dados, ou seja, NOME, IDADE, CPF, ENDERECO etc.
Vamos imaginar uma ficha cadastral que chamaremos de FiCHA com as seguintes informaes a serem preenchidas por um cliente de um hotel: Nome, estado civil, endereo, bairro, cidade, estado, e-mail, idade, telefone, nmero. Utilizando a sintaxe de criao de registro, temos:

FICHA: registro NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO, EMAIL: literal IDADE, TELEFONE, NUMERO: inteiro fim-registro

Bem, voc j deve estar perguntando. O que mudou alm da palavra reservada registro e fim-registro?
Pois bem, conforme dito anteriormente, quando declaramos a FICHA anterior como sendo registro uma parte da memria do computador reservada e nela so inseridas as variveis declaradas entre os comandos registro e fim-registro. Portanto, elas ocupam o mesmo bloco de memria, tornando o desempenho do programa mais rpido. Agora, por exemplo, NOME e IDADE esto num mesmo bloco de memria. Seria anlogo a ter nome e idade em uma mesma ficha cadastral. Outra diferena importante a questo de como acessamos as variveis declaradas dentro de uma estrutura.

Unidade 3

51

Universidade do Sul de Santa Catarina

Como podemos ler e escrever nessas variveis?

A resposta bastante simples. Basta especificarmos o nome do registro criado, seguido de um ponto (.) e o nome da varivel. Por exemplo, para acessar a varivel NOME, precisamos especificar o nome do registro do qual ela pertence. Sendo assim, FICHA.NOME. Observe que a varivel NOME no uma varivel independente qualquer. Ela pertence ao registro FICHA. Por isso, precisamos preceder o nome da varivel NOME com o nome do registro FICHA seguido de um ponto (.). Assim como na criao de vetores e matrizes, para a criao de registros no precisamos especificar os endereos de memria do computador. Isso feito automaticamente, sem que sequer saibamos onde os valores esto armazenados na memria. A nica coisa que sabemos que alocado um espao para armazenar esses valores e que so armazenados em blocos de memria. - Na prxima seo voc vai saber como montar algoritmos com registros.

SEO 2 - Operao com registros


Novamente, voc j deve ter percebido que no criamos qualquer outra lgica de controle alm das j estudadas. mais uma oportunidade de mostrar a voc a importncia dos comandos bsicos de lgica de programao. Nesta seo, vamos mostrar uma aplicao tpica de registros: o conceito de fichas cadastrais. A figura a seguir mostra uma possvel ficha cadastral:
Nome: Estado Civil: Endereo: Nmero: Bairro: Estado: Idade:

Cidade: Telefone:

52

Lgica de Programao II

Observando a figura anterior, podemos verificar que temos variveis literais e inteiras. Vamos classific-las inicialmente: Nome, Estado Civil, Endereo, Bairro, Cidade e Estado so variveis literais. Idade, Nmero e Telefone de Contato so variveis inteiras. Observe que poderamos colocar Telefone de Contato como literal tambm.
Se quisssemos representar um nmero telefnico por 278-8080, isso um literal e no um valor inteiro. Mas para nosso exemplo, vamos considerar o Telefone de Contato como sendo initeiro. Para o telefone especificado devemos colocar ento como sendo 2788080.

Criaremos um registro para a ficha cadastral. Iremos chamar esse registro de FICHA. Sendo assim, em pseudocdigo, temos:
FICHA: registro {variveis da ficha} fim-registro

Agora vamos definir as variveis. Iremos especificar seis variveis literais e trs variveis inteiras. Colocaremos os nomes das variveis de forma a no deixar qualquer tipo de dvida em relao s constantes que sero armazenadas. Dessa forma, nosso registro ser conforme a seguir:
FICHA: registro {variveis da ficha} NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal IDADE, NUMERO, TELEFONE: inteiro fim-registro

Isso tudo. Nossa ficha j est montada. Basta utiliz-la agora acessando as variveis do registro. O algoritmo a seguir, mostra um exemplo completo.

Unidade 3

53

Universidade do Sul de Santa Catarina

Pseudocdigo: incio {declarao do registro FICHA} FICHA: registro {variveis da ficha} NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal IDADE, NUMERO, TELEFONE: inteiro fim-registro {entrada de dados} escreva Nome: leia FICHA.NOME escreva Estado Civil: leia FICHA.ESTADOCIVIL escreva Idade: leia FICHA.IDADE escreva Endereo: leia FICHA.ENDERECO escreva Bairro: leia FICHA.BAIRRO escreva Nmero: leia FICHA.NUMERO escreva Cidade: leia FICHA.CIDADE escreva Estado: leia FICHA.ESTADO escreva Telefone de Contato: leia FICHA.TELEFONE fim

No algoritmo anterior no mostramos nenhuma sada. O exemplo foi apenas para mostrar como trabalhar com criar um registro e como acessar suas variveis.

54

Lgica de Programao II

Criando novos tipos de variveis


Muitas vezes, os tipos bsicos de variveis que utilizamos at agora (inteiro, real, literal e lgico) no so suficientes para resolver um algoritmo. Seria interessante que pudssemos criar tipos definidos pelo usurio. Por exemplo, um tipo de varivel que armazenasse, ao mesmo tempo, um valor literal, um valor numrico e um valor lgico. Vou lhe dar a boa notcia. Isso possvel sim, graas estrutura de registros que acabamos de estudar. Podemos fazer de um registro criado um tipo de varivel.
Por exemplo, alm de termos os tipos bsicos como o real, inteiro, o literal e o lgico, poderamos ter tambm o tipo FiCHA. FiCHA na verdade, um registro criado pelo programador. Chamamos isso de tipo definido pelo usurio.

Isso fantstico, pode acreditar. Alm de podermos criar variveis, podemos criar agora, tambm tipos de variveis.
Mas como posso fazer isso e para que serve?

Bem, para criar um tipo registro, em pseudocdigo, necessrio apenas colocar a palavra reservada tipo antes do nome do registro, ficando assim sua sintaxe:
tipo <nome do registro> = registro <campos que comporo o registro> fim-registro

O comando tipo serve para criar novos tipos de variveis a partir dos tipos bsicos.

Unidade 3

55

Universidade do Sul de Santa Catarina

Por exemplo, no exerccio para manipular uma ficha cadastral colocado anteriormente, poderamos fazer do registro FiCHA um tipo e declarar variveis daquele tipo. A sintaxe ficaria conforme a seguir:

tipo FICHA = registro {variveis da ficha} NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal IDADE, NUMERO, TELEFONE: inteiro fim-registro

Para criar uma varivel do tipo FICHA, criamos da mesma forma que criamos as variveis dos tipos primitivos. Por exemplo, ficha1: FICHA, onde ficha1 agora uma varivel do tipo FICHA. Passamos a acessar as variveis do registro FICHA a partir da varivel ficha1.
Exemplo: ficha1.NOME, ficha1.ENDERECO e assim por diante.

O que quero dizer que FICHA um tipo definido pelo programador e que ficha1 uma varivel do tipo FICHA que ocupa um espao na memria para armazenar seis variveis literais e trs variveis inteiras, conforme nosso exemplo. Assim, veja parte do algoritmo anterior atualizado:

56

Lgica de Programao II

incio {declarao do registro FICHA} tipo FICHA = registro {variveis da ficha} NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal IDADE, NUMERO, TELEFONE: inteiro fim-registro ficha1 : FICHA {declarao da varivel do tipo FICHA. Observe que o tipo FICHA definido antes de ser utilizado. Isso obrigatrio, tendo em vista que o programa precisa saber o que FICHA. Como definimos FICHA como sendo um registro, ao especificar ficha1 como sendo do tipo FICHA, nenhum problema ser encontrado} escreva Nome: leia ficha1.NOME escreva Estado Civil: leia ficha1.ESTADOCIVIL ........ {restante do algoritmo} fim

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

muito simples. Perceba que criamos apenas uma ficha cadastral de um hspede. Se quisssemos preencher o cadastro para um novo hspede, bastaria criarmos outra varivel, ficha2 por exemplo. Poderamos criar tantas fichas quanto quisermos. Considerando o tipo FICHA anteriormente criado, podemos criar vrias variveis:
ficha1, ficha2, ficha3: FICHA.

Cada varivel representa uma ficha para cadastrar um hspede. como se tivssemos 3 fichas cadastrais para serem preenchidas na mo. Para acessar o nome de ficha1, apenas colocaramos ficha1.NOME. Para acessar o nome de ficha2, ficha2.NOME, e para ficha3, ficha3.NOME. Como cada varivel, nesse caso, ficha1, ficha2 e ficha3 so trs blocos de memrias independentes,

Unidade 3

57

Universidade do Sul de Santa Catarina

como se tivssemos trs variveis independentes em locais de memria diferentes, porm, cada uma delas contendo seis variveis literais e trs numricas, conforme voc j leu.

Criando um conjunto de registros


Precisamos incrementar nosso algoritmo anterior. Ele permite o cadastramento de 5 hspedes apenas. Nosso hotel tem 100 quartos. Podemos admitir at 100 hspedes, certo? Devemos criar 100 fichas cadastrais. E agora? Voc ter problemas se tiver que criar 100 variveis 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 inteiros, criamos um vetor do tipo inteiro; se precisamos armazenar 100 nomes de clientes, criamos um vetor do tipo literal. Raciocinando da mesma maneira, se precisarmos armazenar 100 fichas de clientes, criamos um vetor de FICHA (tipo definido por ns). Na sintaxe de pseudocdigo teramos: fichas: vetor [100] FICHA. Agora, definimos um vetor de 100 posies chamado de fichas, onde cada posio (quadrado) tem uma varivel do tipo FICHA. Veja a seguir:
Ficha 1 Ficha 2 Ficha 3 ... Ficha 99

...

99

Ficha1 est na posio 0 do vetor fichas, Ficha2 est na posio 1 do vetor fichas, e assim sucessivamente.
Mas o que uma FiCHA mesmo? FiCHA um registro que tem os seguintes campos definidos anteriormente: NOME, ESTADOCiViL, ENDERECO, BAiRRO, CiDADE, ESTADO: literal iDADE, NUMERO, TELEFONE: inteiro.

58

Lgica de Programao II

Como podemos acessar os dados de cada ficha dentro do vetor? Bem, de forma similar ao acesso dos dados em vetores, precisamos saber qual a posio que queremos acessar do vetor. Depois de sabermos qual o ndice do vetor, devemos lembrar que dentro de cada posio do vetor temos um registro com aqueles campos ou variveis definidas. Veja a figura a seguir.
[0] [1] [2] ... ... Ficha 99

nome estadocivil endereco bairro cidade estado idade, numero telefone

nome estadocivil endereco bairro cidade estado idade, numero telefone

Para acessar um desses campos basta colocar um ponto (.) seguido do nome da varivel definida dentro do registro.
Por exemplo, para acessar o nome do primeiro hspede (definido na posio 0 do vetor fichas), colocamos fichas [0]. NOME; para acessar a idade dessa mesma ficha, colocarmos fichas [0].iDADE e assim por diante.

Vamos supor que estamos cadastrando o cliente 60 do nosso hotel. Como poderamos fazer? Bem, devemos lembrar que, como um vetor sempre comea na posio 0 (zero), assim o cliente 60 est definido da posio 59 do nosso vetor, certo? Desta forma, podemos preencher os dados conforme a seguir:
fichas[59].NOME Luiz Silva fichas[59].ESTADOCIVIL solteiro fichas[59].ENDERECO Avenida Paulista fichas[59].IDADE 30 {e assim para os demais dados deste hspede}.

Unidade 3

59

Universidade do Sul de Santa Catarina

- Olha a a importncia dos vetores novamente. Na seo seguinte voc ver exemplos com cdigo pronto para voc estudar e tirar dvidas. Tente implementar cada exerccio sozinho, depois compare com a soluo proposta. Faa tantas vezes voc quiser. Quanto mais exerccios voc fizer, melhor voc ser.

SEO 3 - Algoritmos com manipulao de registros


Veja agora alguns exerccios resolvidos com manipulao de registros.
1. Cadastrar os dados gerais de 300 disciplinas que os professores lecionam: nome, contedo, freqncia e nota mnimas para aprovao. Ler cinco nomes de disciplinas e mostrar freqncia e mdia mnimas para aprovao em cada uma. Pseudocdigo:

incio tipo FICHA = registro {criando um tipo FICHA} NOME, CONTEUDO : literal FREQUENCIA, MEDIA : real fim-registro DISCIPLINAS : vetor [300] FICHA {criando um vetor para cadastrar 300 disciplinas, onde cada disciplina constituda por um nome (NOME), contedo (CONTEUDO), freqncia (FREQUENCIA) e mdia (MEDIA)} NOMECONSUL : literal {Nome da disciplina a ser consultada} CONT, POS : inteiro {Variveis para controle de lao de repetio} {Entrada de dados para 300 disciplinas} para POS de 0 at 299 passo 1 faa escreva Digite o nome da disciplina: leia DISCIPLINAS[POS].NOME escreva Digite o contedo da disciplina: leia DISCIPLINAS[POS].CONTEUDO escreva Digite a freqncia mnima necessria para aprovao: leia DISCIPLINAS[POS].FREQUENCIA

60

Lgica de Programao II

fim

escreva Digite a mdia mnima necessria para aprovao: leia DISCIPLINAS[POS].MEDIA fim-para {verificao de 5 disciplinas, conforme o enunciado} para CONT de 1 at 5 passo 1 faa escreva Digite o nome da disciplina a ser consultada: leia NOMECONSUL {nome da disciplina a ser consultada} POS 0 {inicializa a varivel POS pois o vetor comea em 0} enquanto NOMECONSUL < > DISCIPLINAS[POS].NOME ou POS < 300 {percorre todo o vetor DISCIPLINAS at que a varivel NOMECONSUL seja igual a DISCIPLINAS [POS].NOME e POS < 300. Utilize aqui, como exerccio, uma tabela-verdade para saber quando a condio resultante se torna falsa. uma excelente reviso da operao lgica ou.} POS POS + 1 {enquanto no encontrar a disciplinas digitadas, soma POS de 1, o que significa pular para a prxima posio do vetor} fim-enquanto se NOMECONSUL = DISCIPLINAS[POS].NOME ento escreva Disciplina:, DISCIPLINAS[POS].NOME escreva Mdia Mnima:, DISCIPLINAS[POS].MEDIA escreva Freq. Mnima:, DISCIPLINAS[POS].FREQUENCIA seno escreva Disciplina no consta no cadastro ! fim-se fim-para

2. Elaborar um algoritmo para cadastrar 5000 CDs de uma loja. Os dados a serem cadastrados so: cdigo, nome do CD, nome do cantor/grupo, tipo de msica, produtora e ano de produo. Exibir os cdigos e nomes dos CDs solicitados por um usurio por meio do nome de um cantor ou grupo musical.

Pseudocdigo: incio {declarao do tipo FICHA} tipo FICHA = registro NOME, CANTOR, TIPO, PRODUTORA : literal CODIGO, ANOPRODUCAO : inteiro fim-registro {declarao do vetor CDS. Cada posio do vetor contm um registro do tipo FICHA} CDS : vetor [5000] FICHA CANTORCONSUL : literal {Cantor a ser consultado} POS : inteiro {varivel para percorrer o vetor CDS}

Unidade 3

61

Universidade do Sul de Santa Catarina

fim

{Dados de entrada para o programa de cadastramento de CDS} para POS de 0 at 4999 passo 1 faa escreva Digite o cdigo 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 msica: leia CDS[POS].TIPO escreva Digite o nome da produtora: leia CDS[POS].PRODUTORA escreva Digite o ano de produo (somente os nmeros) do CD: leia CDS[POS].ANOPRODUCAO fim-para {processamento do algoritmo} escreva Digite o nome do cantor ou grupo a ser consultado (ou FIM para encerrar): leia CANTORCONSUL enquanto CANTORCONSUL < > FIM faa POS 0 enquanto CANTORCONSUL < > CDS[POS].CANTOR ou POS < 5000 {percorre cada posio do vetor para verificar a existncia do cantor} POS POS + 1 fim-enquanto se CANTORCONSUL = CDS[POS].CANTOR ento escreva Cdigo:, CDS[POS].CODIGO escreva Nome do CD:, CDS[POS].NOME seno escreva Cantor ou grupo musical no possui nenhum CD cadastrado ! fim-se {Observe aqui que estamos solicitando que o usurio entre com o nome do cantor ou a palavra FIM novamente. Perceba que a primeira vez ocorreu fora do lao de repetio. Dessa vez, o comando de leitura realizado para permitir com que o usurio finalize o programa digitando FIM. Caso no colocssemos essa opo, teramos um lao infinito. Lembra que todo algoritmo tem que possuir um fim?} escreva Digite o nome do cantor ou grupo a ser consultado (ou FIM para encerrar): leia CANTORCONSUL fim-enquanto

62

Lgica de Programao II

Sntese
Voc acaba de finalizar mais uma etapa na busca pela excelncia. Viu que para implementar variveis de diferentes tipos utilizamos um registro, que nada mais do que um recurso que permite a criao de diferentes tipos de variveis em um mesmo bloco de memria do computador, facilitando, sobretudo, o desempenho do programa. Quando criamos um registro, criamos um espao na memria do computador que permite armazenar dados heterogneos, ou seja, constantes de vrios tipos. como se fosse uma ficha de dados, organizada de forma que os dados esto prximos um dos outros dentro da memria do computador. A sintaxe em pseudocdigo para criar um registro a seguinte:
<nome do registro>: registro <campos que comporo o registro> fim-registro

Viu tambm que a lgica de programao permite ao usurio criar seus prprios tipos. Isso facilita bastante porque nem tudo que estamos trabalhando so apenas nmeros, literais ou lgicos. H uma combinao desses tipos bsicos. A sintaxe para implementar um tipo registro a seguinte:
tipo <nome do registro>: registro

<campos que comporo o registro> fim-registro

Por fim, aprendeu que podemos construir uma poderosa estrutura de dados misturando vetores com registros. Podemos construir vetores de registros, onde cada posio do vetor um registro de dados. O acesso a cada elemento dentro do vetor a seguinte:
<nome do vetor>[ndice do vetor].<campo ou varivel que compe o registro}

preciso, agora, muita prtica para que possas seguir adiante. Na prxima unidade voc conhecer alguns algoritmos de complexidade maior, que envolvero todos os tpicos at agora estudados. A unidade conta com muitos exemplos prontos para que voc estude, entenda e possa implementar esses algoritmos. Boa sorte e at l!
Unidade 3

63

Universidade do Sul de Santa Catarina

Atividades de autoavaliao
1. Voc responsvel pelo cadastramento de um hspede em um hotel de luxo em sua cidade. Crie um registro de dados que implementa essa ficha cadastral. Escolha as variveis de maior importncia para o cadastro do hspede.

64

Lgica de Programao II

2. Monte um algoritmo para cadastrar e imprimir os dados pessoais de vrios professores de um sistema de administrao escolar. Os dados pessoais so: nome, endereo, cidade, estado, CEP, telefone, CPF, RG, data de nascimento, grau de escolaridade, curso em que se formou.

Unidade 3

65

Universidade do Sul de Santa Catarina

3. Cadastre imprima os dados das fitas de vdeo de uma locadora: cdigo do filme, nome, tipo de filme, durao, produtor, ator principal, diretor a ano de produo.

66

Lgica de Programao II

4. Cadastre os dados dos 200 funcionrios de uma empresa: cdigo do funcionrio, nome, endereo, data de nascimento, cidade, UF, CEP, telefone, CPF, RG, grau de escolaridade, nmero de dependentes e nome do cnjuge. Exibir nomes, endereos e telefones de 20 funcionrios solicitados por um usurio por meio dos cdigos de funcionrios.

Unidade 3

67

Universidade do Sul de Santa Catarina

5. Ao criar um sistema de cadastro de clientes de uma loja de informtica, onde so necessrios os seguintes dados: nome do cliente, CPF e telefone de contato, poderamos implementar o algoritmo para cadastrar 50 clientes de duas maneiras: Primeira maneira:

incio NOME: vetor[50] literal CPF: vetor[50] literal FONE: vetor[50] inteiro ..... {implementao do algoritmo} fim
Segunda maneira:

incio tipo FICHA = registro NOME: literal CPF: literal FONE: initeiro fim-registro fichas: vetor[50] FICHA {declarao de um vetor de FICHAS} ..... {implementao do algoritmo} fim
Explique com suas prprias palavras as diferenas entre as duas formas de implementaes citadas e as vantagens em se optar pela segunda maneira.

68

Lgica de Programao II

Saiba mais
MAGRI, Joo Alexandre. Lgica de Programao - Ensino Prtico. MANZANO, Jos Augusto N. G.; OLIVEIRA, Jayr Figueiredo de. Estudo Dirigido de Algoritmos. FORBELLONE, Andr Luiz Villar; EBERSPCHER, Henri Frederico. LGICA de programao: a construo de algoritmos e estruturas de dados.
Unidade 3

69

UNiDADE 4

Tpicos avanados em algoritmos computacionais


Objetivo de aprendizagem

identificar os comandos e compreender a lgica em pseudocdigo, proposta para resolver o problema.

Sees de estudo
Seo 1 implementao de algoritmos de ordenao. Seo 2 implementao de algoritmos de busca.

Universidade do Sul de Santa Catarina

Para incio de estudo


Voc est quase finalizando a disciplina de Lgica de Programao II. Falta apenas a parte de modularizao. Antes porm, nada mais importante do que treinar, treinar e treinar todos os comandos lgicos vistos at agora. Voc vai estudar algumas aplicaes de interesse no mundo no somente da web mas em todas as formas de programao, como por exemplo, procurar por um nome dentro de um cadastro de clientes ou ordenar uma lista de clientes por ordem alfabtica. Nesta unidade, vamos ver algumas aplicaes que envolvero a reviso de todos os conceitos, desde Lgica de Programao I at a atual. O objetivo principal fazer com que voc identifique os comandos e entenda a lgica em pseudocdigo, proposta para resolver o problema. O mais importante agora fazer os algoritmos antes mesmo de olhar a soluo. Tente fazer uma, duas ou mais vezes, at entender por completo o problema e a soluo encontrada. Aps o exerccio, observe a soluo proposta e compare com o que voc fez. Se optar por estudar a soluo proposta em primeiro lugar, mesmo assim, tente fazer o algoritmo sozinho para verificar se realmente entendeu. So fascinantes os desafios aqui propostos. Esta coletnea de exemplos e exerccios vai fazer de voc um programador mais seguro e pronto para iniciar outras conquistas.

SEO 1 - Implementao de algoritmos de ordenao


Em caso de dvida, consulte a Unidade 3 de Lgica de Programao i.

Voc se lembra dos passos para se fazer um bom algoritmo? Para escrever um algoritmo precisamos descrever a seqncia de instrues, de maneira simples e objetiva. Para isso, utilizamos algumas tcnicas: 1. Usar somente um verbo por frase. 2. Imaginar que voc est desenvolvendo um algoritmo para pessoas que no trabalham com informtica. 3. Usar frases curtas e simples.

72

Lgica de Programao II

4. Ser objetivo. 5. Procurar usar palavras que no tenham sentido dbio. Ao passo de cada algoritmo, mostro a seguir algumas dessas e outras regras que nos possibilita construir algoritmos mais complexos de alta qualidade. Pronto para esse desafio? Respire fundo e mos obra! Problema 1: Imagine um vetor com cinco elementos conforme descrito a seguir.
10.0 0 8.0 1 9.0 2 7.0 3 8.5 4

Como coloc-lo em ordem crescente de tal maneira que os nmeros sejam dispostos na seguinte ordem?
7.0 0 8.0 1 8.5 2 9.0 3 10.0 4

Perceba que h uma troca dos valores dentro do vetor.


Por exemplo, o nmero 10 que estava na posio 0 foi para a posio 4. O nmero 8 ficou na mesma posio, ou seja, posio 1 em ambos os vetores. O nmero 9 foi da posio 2 para a posio 3, o nmero 7 da posio 3 para a posio 0 e o nmero 8.5 foi da posio 4 para a posio 2. Fizemos uma reordenao dos nmeros de forma a se mostrarem em ordem crescente.

Essa aplicao um exemplo dentre tantas outras, por exemplo, ordenar nomes de clientes em ordem alfabtica para mostrar em uma pgina 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 mtodo da Bolha ou em ingls Bubble Sort.
Unidade 4

73

Universidade do Sul de Santa Catarina

Solucionando o problema em passos


1. Vamos iniciar nosso algoritmo criando um vetor de 5 posies: Pseudocdigo:
incio NOTAS: vetor[5] real {declarao do vetor de 5 posies}

2. Criado o vetor NOTAS, precisamos ler os valores e armazenlos nesse vetor. Utilizamos a estrutura de repetio para/faa/ fim-para para percorrer todo o vetor. Precisamos criar uma varivel de contagem. Vamos cham-la de CONT.
CONT: inteiro para CONT de 0 at 4 passo 1 faa escreva Entre com uma nota: leia NOTAS[ CONT ] fim-para

O vetor poderia se mostrar conforme a seguir:


10.0 0 8.0 1 9.0 2 7.0 3 8.5 4

Perceba que estamos lendo os nmeros de uma forma aleatria, ou seja, sem qualquer seqncia pr-definida. Nosso objetivo coloc-los em ordem crescente, ou seja, do menor para o maior. 3. Sempre que quisermos ordenar nmeros e/ou literais, precisamos realizar uma comparao entre dois nmeros e/ ou literais para saber quem maior ou menor. Lembrando de Lgica de Programao I, quando realizamos uma comparao, realizamos entre dois e apenas dois valores por vez. Isso sugere que devemos realizar a comparao dos valores do vetor NOTAS tomando dois a dois, ou seja, comparamos inicialmente a posio 0 com a posio 1 do vetor NOTAS, seguido da posio 1 com a 2, da 2 com a posio 3 e assim sucessivamente. Precisamos saber de antemo
74

Lgica de Programao II

que posio estamos testando e quando finalizado o teste. Precisamos, assim, criar 2 novas variveis: POS, armazena a posio de teste e ULTIMA, armazena o ltimo teste de comparao. Podemos perceber que POS tem valor inicial de zero (ndice inicial do vetor) e ULTIMA tem valor inicial de 4 (ndice final do vetor).
POS, ULTIMO: inteiro POS 0 ULTIMO 4 10.0 0 8.0 1 9.0 2 7.0 3 8.5 4

POS

ULTIMA

4. Realizamos a primeira comparao, entre a primeira e a segunda posio do vetor. O teste feito por meio da pergunta: 10.0 maior do que 8? e o objetivo colocar o menor na primeira posio. Podemos verificar que a resposta verdadeira. 5. Como a resposta do passo 4 foi positiva, precisamos trocar o valor 10.0 pelo valor 8.0, ou seja, o valor 8.0 passa para a posio 0 do vetor NOTAS e o valor 10.0 vai para a posio 1 do mesmo vetor. Como podemos realizar esse passo? A resposta simples desde que criemos uma nova varivel. Chamaremos essa varivel de AUX (varivel auxiliar na troca entre os valores). A idia passar o contedo de NOTAS [0] para NOTAS [1] e vice-versa. Com auxlio 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 posio 0 recebe o valor contido na posio 1, ou seja, NOTAS[ 0 ] = 8.0} NOTAS [ 1 ] AUX { o vetor NOTAS na posio 1 recebe o valor contido na varivel AUX, ou seja, NOTAS[ 0 ] = 10.0}.

Unidade 4

75

Universidade do Sul de Santa Catarina

Sendo assim, observe que os valores das variveis foram trocados com a utilizao da varivel auxiliar AUX. Temos agora a seguinte formao do vetor de NOTAS:
8.0 0 POS 10.0 1 9.0 2 7.0 3 8.5 4 ULTIMA

6. Para realizar nosso prximo passo, vamos testar agora a posio 1 com a posio 2 do vetor, conforme o passo 3. Para fazermos esse teste, devemos incrementar a varivel POS de 1, fazendo com que ela assuma o valor 1.
POS POS + 1 {como a varivel POS tem valor inicial de 0, incrementando 1, a varivel POS passa a ter valor 1.} 8.0 0 10.0 1 9.0 2 7.0 3 8.5 4

POS

ULTIMA

7. Realizamos a segunda comparao, entre a segunda (ndice 1) e terceira (ndice 2) posio do vetor. O teste feito por meio da pergunta: 10.0 maior do que 9.0? e o objetivo colocar o menor na segunda posio (ndice 1). Podemos verificar que a resposta verdadeira. 8. Executamos o passo de maneira anloga ao passo 5, mas agora observando que estamos testando entre os ndices 1 e 2 do vetor NOTAS:
AUX NOTAS [ 1 ] {guardo o valor da posio 1 vetor de NOTAS na varivel AUX. No exemplo, AUX recebe o valor 10.0} NOTAS [ 1 ] NOTAS[ 2 ] {o vetor NOTAS na posio 1 recebe o valor contido na posio 2, ou seja, NOTAS[ 1 ] = 9.0} NOTAS [ 2 ] AUX { o vetor NOTAS na posio 2 recebe o valor contido na varivel AUX, ou seja, NOTAS[ 2 ] = 10.0}. 76

Lgica de Programao II

Sendo assim, observe que os valores das variveis foram trocados com a utilizao da varivel auxiliar AUX. Temos agora a seguinte formao do vetor de NOTAS:

8.0 0

9.0 1

10.0 2

7.0 3

8.5 4

POS

ULTIMA

9. Executamos o passo 6, 7 e 8 novamente, porm nossa posio de teste agora a terceira (ndice 2) e iremos comparar os valores numricos armazenados na terceira e quarta posio do vetor de NOTAS, respectivamente ndices 2 e 3.
8.0 0 9.0 1 10.0 2 7.0 3 8.5 4

POS

ULTIMA

Como resposta da execuo do passo 8, temos a seguinte formao do vetor:


8.0 0 9.0 1 7.0 2 10.0 3 8.5 4

POS

ULTIMA

Unidade 4

77

Universidade do Sul de Santa Catarina

10. Executamos o passo 6, 7 e 8 novamente, porm nossa posio de teste agora a quarta (ndice 3) e iremos comparar os valores numricos armazenados na quarta e quinta posio do vetor de NOTAS, respectivamente ndices 3 e 4.
8.0 0 9.0 1 7.0 2 10.0 3 POS 8.5 4 ULTIMA

11. Como resposta da execuo do passo anterior, temos a seguinte formao do vetor:
8.0 0 9.0 1 7.0 2 8.5 3 10.0 4

12. Observando o resultado do passo anterior, podemos perceber que o nmero 10.0 est na ltima posio do vetor e l dever ficar, tendo em vista que no h nmero maior do que 10.0 dentro do vetor de NOTAS, certo? Atingimos, dessa forma a posio final do vetor NOTAS. Precisamos recomear a ordenao, colocando a varivel POS em 0 e a varivel ULTIMA em ULTIMA-1, ou seja, ULTIMA recebe valor 3. Mas por que isso? A resposta que no precisamos comparar mais o valor 10.0 que est na ltima posio. Lembra que o nmero 10.0 estava inicialmente na posio 0 do vetor e que fomos realizando a comparao com valores subseqentes para verificar se ele era maior ou menor? Em nosso exemplo, coincidiu que o valor 10.0 era o maior de todos. Sendo assim, em cada passo realizamos as trocas dos nmeros at coloc-lo na posio final do vetor NOTAS. O que nos interessa agora reinicializar a ordenao do ndice 0 at o ndice 3 do vetor de NOTAS, conforme a seguir:
8.0 0 POS 78 9.0 1 7.0 2 8.5 3 ULTIMA 10.0 4

Lgica de Programao II

13. Repetimos todos os passos anteriores. Como resultado, temos a seguinte ordenao, j decrementando a varivel ULTIMA de 1 tambm:
8.0 0 POS 7.0 1 8.5 2 ULTIMA 9.0 3 10.0 4

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


7.0 0 POS 8.0 1 ULTIMA 8.5 2 9.0 3 10.0 4

At quando devemos repetir os passos de ordenao?

Perceba que executamos os passos at que a varivel ULTIMA assuma valor 1. Para cada valor da varivel ULTIMA, executamos as repeties para a varivel 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 pseudocdigo. 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 pseudocdigo.
incio NOTAS: vetor [5] numrico {declarao do vetor de 5 posies} POS, ULTIMA, AUX: inteiro {entrada de dados} para POS de 0 at 4 passo 1 faa escreva Entre com a Nota:
Unidade 4

79

Universidade do Sul de Santa Catarina

leia NOTAS[ POS ] {armazena os valores lidos no vetor NOTAS} fim-para {inicializao das variveis} POS 0 {inicializa a varivel POS} ULTIMA 4 {inicializa a varivel ULTIMA} {processamento da ordenao dos nmeros} enquanto ULTIMA < > 0 faa enquanto POS < > ULTIMA faa se NOTAS[ POS ] > NOTAS[ POS + 1 ] ento {processo de troca dos nmeros} AUX NOTAS [ POS ] NOTAS [ POS ] NOTAS[ POS + 1] NOTAS [ POS + 1] AUX fim-se {incrementa posio do vetor} POS POS + 1 fim-enquanto {inicializa varivel POS e decrementa a varivel ULTIMA de 1} POS 0 ULTIMA ULTIMA -1 fim-enquanto fim

SEO 2 - Implementao de algoritmos de pesquisa


Mtodos de pesquisa, tambm chamados de mtodos de busca, so algoritmos utilizados para localizar valores dentro de um vetor.

Na seo anterior, aprendemos a como ordenar os valores de um vetor. Nesta seo, procuramos por determinados valores de interesse dentro do vetor, seja os elementos do vetor ordenados ou no. H vrias tcnicas de ordenao. Voc vai estudar duas aplicaes bem simples: O mtodo de procura seqencial.

O mtodo de procura binria.

80

Lgica de Programao II

Mtodo de procura seqencial


O mtodo de pesquisa seqencial o mais simples de todos. Um vetor pesquisado (percorrido) at encontrar o valor desejado ou at que o vetor termine. um mtodo bastante aplicado para vetores com valores desordenados, ou seja, que no esto 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 vdeo locadora. Precisamos saber se h clientes com idade de 15 anos, por exemplo. A representao do vetor mostrada a seguir:

27 0

44 1

14 2

15 3

20 4

Solucionando o problema em passos


1. Inicialmente, precisamos criar nosso vetor de 5 posies. Esse vetor armazenar as idades de nossos clientes. Vamos permitir com que o usurio especifique as idades que desejar, ou seja, ser uma entrada de dados via teclado. Pseudocdigo:
incio IDADES: vetor [5] inteiro ENTRADA: inteiro {varivel utilizada para armazenar a entrada de uma idade a ser pesquisada no vetor IDADES.} CONT: inteiro {varivel contadora} {entrada de dados: idade dos clientes. Estamos percorrendo o vetor da posio 0 at a posio 4.} para CONT de 0 at 4 passo 1 faa escreva Especifique a idade do cliente: leia IDADES[CONT] {observe que a varivel CONT vai de 0 at 4} fim-para

Unidade 4

81

Universidade do Sul de Santa Catarina

2. Preenchido o vetor, iremos realizar nosso processamento. O processamento simplesmente encontrar a idade especificada pelo usurio. Vamos precisar entrar com a idade do cliente e verificar se ela existe ou no no vetor IDADES.
{processamento de procura} escreva Entre com a idade a ser procurada no cadastro de clientes: leia ENTRADA {agora, vamos percorrer o vetor IDADES para verificar se existe ou no o valor inteiro digitado pelo usurio e armazenado na varivel ENTRADA. Vamos supor que voc especifique a idade 15, ou seja, a varivel ENTRADA possui valor inteiro 15. Dessa forma, vamos percorrer todo o vetor IDADES procurando pelo valor inteiro 15. O processo bem simples. Para cada lao de repetio, lemos o valor contido na posio do vetor. Se encontrarmos o valor que estamos procurando, finalizamos a pesquisa. Caso contrrio, percorremos o vetor IDADES at encontrar o valor desejado ou at o fim do vetor. Vamos inicializar a varivel CONT para ser reutilizada, ou seja, para percorrer o vetor novamente da posio 0 at a posio 4 do vetor IDADES} CONT 0 enquanto IDADES[ CONT ] < > ENTRADA e CONT <= 4 faa {perceba que, enquanto o valor no for encontrado (IDADES [ CONT ] < > ENTRADA) e no atingirmos o final do vetor IDADES (CONT <= 4 ), incrementamos a varivel CONT de 1. Isso significa irmos de posio em posio do vetor IDADES. Observe a instruo lgica e aqui no exemplo. Como exerccio, faa a tabela verdade e verifique quando a condio se torna falsa, ou seja, quando que o lao de repetio finalizado.} CONT CONT + 1 fim-enquanto {na seqncia, verifica-se se h algum valor no vetor igual ao valor lido pelo cliente} se IDADES[ CONT ] = ENTRADA ento escreva O nmero , ENTRADA, est na posio , CONT seno escreva O nmero , ENTRADA, no foi encontrado. fim-se fim-algoritmo

82

Lgica de Programao II

3. O algoritmo completo mostrado a seguir:


incio IDADES: vetor [5] inteiro ENTRADA: inteiro CONT: inteiro para CONT de 0 at 4 passo 1 faa escreva Especifique a idade do cliente: leia IDADES[ CONT ] fim-para CONT 0 escreva Entre com a idade leia ENTRADA enquanto IDADES[ CONT ] < > ENTRADA e CONT <= 4 faa CONT CONT + 1 fim-enquanto se IDADES[ CONT ] = ENTRADA ento escreva O nmero , ENTRADA, est na posio , CONT seno escreva O nmero , ENTRADA, no foi encontrado. fim-se fim-algoritmo

Mtodo de pesquisa binria


Esse mtodo aplicado apenas para vetores ordenados, ou seja, os valores esto em ordem crescente de valores. Dessa forma, para aplicar esse mtodo precisamos garantir que o vetor esteja ordenado, conforme a seo 1 desta unidade. A grande vantagem desse mtodo a rapidez, tendo em vista que o nmero de dados pesquisados menor. Apenas parte do vetor lida, o que significa uma reduo importante de tempo de procura, principalmente se temos um vetor de dimenso grande, por exemplo, 1000 elementos. A lgica da busca binria semelhante quando buscamos um nome em uma lista telefnica, ou seja, no buscamos nome nome, pois os mesmos esto em ordem alfabtica.
Unidade 4

83

Universidade do Sul de Santa Catarina

Voc deve estar se perguntando: como assim, que somente parte do vetor lida? A explicao vem no prprio desenvolvimento do algoritmo.

Porm, em vez de mostramos todo o algoritmo j desenvolvido, vamos mexer com o seu potencial. Iremos apenas colocar os passos e voc ser o responsvel pela montagem do pseudocdigo. Que belo desafio voc tem pela frente. A soluo completa est no final da unidade, para voc verificar a sua soluo encontrada. Dica: Tente resolver o algoritmo, ao menos algumas vezes, antes de olhar a soluo. um exerccio que tem raciocnio lgico mais aprimorado do que todos os anteriores. Vamos l ento?

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 0 44 1 58 2 78 3 100 4

Vamos supor tambm que estamos a procura do nmero 78.


Ser que precisamos percorrer o vetor desde o seu incio at encontrar o nmero 78 no ndice 3 do vetor VET, sabendo de antemo que o mesmo est ordenado em ordem crescente? Ser que no poderamos ler o valor na posio central do vetor, ou prxima do centro do vetor VET e verificar se o valor contido nessa posio maior ou menor do que o valor que estamos procurando?

Em nosso exemplo, podemos verificar que o nmero central do vetor VET est no ndice 2 do vetor e o nmero 58. Como estamos procurando o nmero 78 e esse maior do que 58, iremos procurar o nmero 78 apenas na segunda metade do vetor
84

Lgica de Programao II

VET, ou seja, da posio 2 at a posio 4, sem precisar percorrer o vetor desde o seu incio. Parece uma vantagem enorme voc no acha, principalmente quando estamos trabalhando com vetores de dimenses maiores?
10 0 44 1 58 2 78 3 100 4

Como o valor 78 est na segunda metade do vetor VET, realizamos uma nova diviso, agora considerando apenas os nmeros nos ndices [2], [3] e [4]. A metade do vetor o ndice [3], que nesse caso o nmero 78, ou seja, o nmero que estamos procurando.
58 2 78 3 100 4

Se fssemos realizar a pesquisa seqencialmente, teramos 4 passos at encontrar o nmero 78. Teramos que ler do ndice 0 at o ndice 3 do vetor VET. Com a pesquisa binria, onde dividimos o vetor ao meio, realizamos 2 passos apenas, ou seja, duas divises at encontrar o nmero 78. Vamos parte lgica do problema? 1. Monte um vetor VET com os seguintes valores: Montar um vetor significa cri-lo e preench-lo com os valores colocados na seqncia.
10 0 44 1 58 2 78 3 100 4

2. Estabelea o nmero 78 como o valor a ser pesquisado. Esse nmero dever ser armazenado na varivel NUMEROLIDO. 3. Crie duas variveis, uma para armazenar o ndice inicial do vetor e outra para armazenar o ndice final. As variveis podem ser chamadas de PRIMEIRA e ULTIMA respectivamente.
Unidade 4

85

Universidade do Sul de Santa Catarina

Lembre-se de que a posio inicial do vetor o ndice 0. Some os dois valores e divida por 2 para achar o ndice que corresponde metade do vetor VET. Armazena o valor na varivel METADE.
METADE = (PRIMEIRA + ULTIMA)/2 PRIMEIRA: 0 ULTIMA: 4 METADE: (0 + 4)/2 = 2 10 0 PRIMEIRA 44 1 58 2 METADE 78 3 100 4 ULTIMA

4. Para o primeiro teste, 78 igual a 58? o resultado falso. Para o segundo teste, 78 maior do que 58? o resultado verdadeiro. Portanto, o valor que estamos procurando s pode estar entre a metade do vetor VET at o ndice final. Como j verificamos que o valor na metade do vetor 58, no precisamos test-lo novamente. Sendo assim, fazemos com que a varivel PRIMEIRA assuma o valor da varivel METADE mais um, ou seja, PRIMEIRA = METADE + 1, ficando assim nossa nova estrutura:
10 0 44 1 58 2 78 3 100 4

PRIMEIRA

ULTIMA

Agora temos a seguinte composio de variveis:


PRIMEIRA: METADE + 1, ou seja, 2 + 1 = 3 ULTIMA: 4 METADE: (3 + 4)/2 = 3 ( uma diviso de nmeros inteiros, por isso o resultado um nmero inteiro, desconsiderando a parte fracionria). Podemos perceber que o valor da varivel PRIMEIRA igual ao valor da varivel METADE.

86

Lgica de Programao II

10 0

44 1

58 2

78 3 PRIMEIRA METADE

100 4 ULTIMA

5. Para o teste 78 igual a 78?, o resultado verdadeiro. Nesse caso, o algoritmo deve imprimir a mensagem o nmero 78 est no ndice 3 do vetor. Essa primeira parte est concluda. 6. No podemos nos esquecer de que o nmero digitado pode estar entre o ndice inicial do vetor e a metade do mesmo. Temos que resolver essa situao tambm. Vejamos no caso do nmero lido seja 10. A varivel NUMEROLIDO armazena o valor numrico 10. 7. Realizamos os mesmos passos para a procura do valor numrico 10 atravs do vetor VET, reinicializando as variveis.
PRIMEIRA: 0 ULTIMA: 4 METADE: (0 + 4)/2 = 2 10 0 PRIMEIRA 44 1 58 2 METADE 78 3 100 4 ULTIMA

8. Para o primeiro teste, 10 igual a 58? o resultado falso. Para o segundo teste, 10 maior do que 58? o resultado falso. Para o terceiro teste 10 menor do que 58? o resultado verdadeiro. Portanto, o valor que estamos procurando s pode estar entre a posio inicial do vetor at a sua metade. Como j verificamos que o valor na metade do vetor 58, no precisamos test-lo novamente. Assim, podemos testar at METADE-1. Vamos atribuir esse valor varivel ULTIMA, ou seja ULTIMA METADE 1, e teremos a seguinte estrutura.

Unidade 4

87

Universidade do Sul de Santa Catarina

10 0 PRIMEIRA

44 1 ULTIMA

58 2

78 3

100 4

Agora temos a seguinte composio de variveis:


PRIMEIRA: 0 ULTIMA: METADE 1, ou seja, 2 1 = 1 METADE: (PRIMEIRA + ULTIMA)/2, ou seja, (0 + 1)/2 = 0 10 0 PRIMEIRA METADE 44 1 ULTIMA 58 2 78 3 100 4

Para o teste 10 igual a 10?, o resultado verdadeiro. Nesse caso, o algoritmo deve imprimir a mensagem o nmero 10 est no ndice 0 do vetor. Nosso processo lgico de encontrar um valor numrico atravs de um vetor com valores numricos ordenados em ordem crescente est finalizado. Agora com voc. Realize as atividades de autoavaliao a seguir.

Sntese
Nesta unidade vimos estruturas de algoritmos um pouco mais complexas. Dois mecanismos bastante utilizados em lgica de programao so os mtodos de procura e os mtodos de ordenao. Inicialmente vimos como ordenar um vetor com valores numricos e, aps, vimos como realizar uma busca por valores contidos dentro de um vetor.

88

Lgica de Programao II

Voc pde observar dois tipos de busca: O mtodo mais simples o seqencial, onde percorremos todo o vetor at encontrar o valor desejado. Esse mtodo tem a vantagem de ser simples, porm, pelo fato de precisar percorrer todo o vetor para encontrar o nmero desejado, no to eficiente, caracterizando como uma das principais desvantagens desse mtodo. O outro mtodo que vimos foi o mtodo da pesquisa binria, aplicada somente para vetores com valores ordenados em ordem crescente. O mtodo consiste em dividir o vetor pela metade e verificar se o valor que estamos procurando est exatamente na metade do vetor, ou acima ou abaixo da metade encontra. Caso esteja acima ou abaixo da metade, dividimos o vetor novamente at que o nmero seja encontrado. um mtodo bastante eficiente de procura, porm h a necessidade de que o mesmo esteja ordenado em ordem crescente. Nossos algoritmos esto ficando grandes e complexos. hora de estrutur-los de forma a ficarem mais fceis de entender e melhores de trabalhar. Na prxima unidade estaremos vendo uma parte que dominou toda a dcada de 80 em relao aos estudos de linguagem de programao: a estruturao ou modularizao de algoritmos. Espero por voc l, ento.

Atividades de autoavaliao
1. Ler um vetor contendo 100 cdigos relativos s mercadorias de um armazm e outro relativo s quantidades de mercadorias. imprimir os cdigos e as quantidades dos produtos, seguindo a ordem crescente das quantidades.

Unidade 4

89

Universidade do Sul de Santa Catarina

2. Ler um vetor contendo 100 nmeros, que correspondem matrcula de alunos. Ler 5 matrculas e verificar se os alunos com essas matrculas esto matriculados ou no.

90

Lgica de Programao II

3. Monte um algoritmo em pseudocdigo que implemente os processos lgicos descritos anteriormente. Esse um algoritmo de pesquisa binria.

Unidade 4

91

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 aleatria. 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 disponveis. Esse algoritmo ser utilizado no programa j existente no supermercado. Faa esse algoritmo solicitado e comente-o sempre que necessrio. O cliente dever entender sua soluo por completo, tendo em vista que ele ser o programador da soluo proposta por voc.

92

Lgica de Programao II

Saiba mais
MANZANO, Jos Augusto N. G.; OLIVEIRA, Jayr Figueiredo de. ALGORITMOS: lgica para desenvolvimento de programao. 9. ed. MANZANO, Jos Augusto N. G. Lgica Estruturada para Programao de Computadores. BORATTI, Isaias Camilo; OLIVEIRA, lvaro Borges de. Introduo Programao e Algoritmos. 2. ed. Ampliada e atualizada.

Unidade 4

93

UNiDADE 5

Programao estruturada
Objetivos de aprendizagem

Entender os conceitos de programao estruturada. Aplicar modularizao aos algoritmos.

Sees de estudo
Seo 1 Modularizao: conceitos iniciais. Seo 2 Modularizao: retorno de valores e passagem de
parmetros.

Universidade do Sul de Santa Catarina

Para incio de estudo


Voc est iniciando agora a ltima unidade da disciplina. Isso no significa que os estudos acabaram por aqui. Muito pelo contrrio, acabaram de comear. No final desta unidade voc estar pronto para comear a se tornar um excelente programador Web. O que estamos lhe oferecendo apenas a base, independente da linguagem de programao que voc ir utilizar ou j utiliza. Voc precisa entender agora um dos conceitos que foi alvo de muitos estudos em dcadas passadas: a programao estruturada ou programao modular. Esse tipo de programao surgiu quando ocorreu a crise do software, por volta da dcada de 60. Os programas de computadores se tornaram grandes e caros, principalmente em relao manuteno dos mesmos. No havia metodologia para a criao de programas de computadores. A probabilidade de acontecerem erros na programao era enorme, mesmo depois de o programa estar funcionando. Eram necessrias manutenes dirias, aumentando substancialmente os custos de desenvolvimento. A tecnologia mudou, o mundo mudou, os problemas tambm mudaram. Temos um grau bem maior de complexidade, e a presso por reduo de custos fez com que os programadores adotassem metodologias de desenvolvimento de software. Uma dessas metodologias a programao estruturada. O objetivo principal da programao estruturada decompor o problema em partes ou blocos, fazendo com que cada bloco execute uma funo especfica 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 manuteno. 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, ento?

96

Lgica de Programao II

SEO 1 - Modularizao: conceitos iniciais


Quando nos deparamos com problemas complexos, a melhor maneira de solucion-los decomp-lo em partes, ou seja, resolver o problema em etapas para que possamos ter xito no final. A cada uma dessas partes bem definidas, que contribuem para a soluo do problema, chamamos de mdulo. Assim tambm so nossas solues lgicas. Caso separemos um problema em partes, podemos construir algoritmos para cada uma das partes de forma bem definida e independentes uma das outras. A essa tcnica de dividir os algoritmos em mdulos chamados de modularizao. - Retome primeiro o conceito de algoritmo em Lgica de Programao I.

Para lembrar!
Um algoritmo formalmente uma seqncia finita de passos que levam a execuo de uma tarefa. Podemos pensar em algoritmo como uma receita, uma seqncia de instrues, que tem a funo de atingir uma meta especfica. Estas tarefas no podem ser redundantes nem subjetivas na sua definio, devendo ser claras e precisas.

Sendo assim, cada parte ou mdulo construdo deve ter as mesmas caractersticas citadas, devendo cada mdulo:

Implementar tarefas no-redundantes e nem subjetivas. Ter uma funo especfica e clara. Ser independente de todos os outros mdulos de um programa. Ser testado e corrigido antes de ser integrado soluo completa tendo em vista que parte da soluo lgica do problema. Poder ser utilizado em outros algoritmos que requerem os mesmos procedimentos.
Unidade 5

97

Universidade do Sul de Santa Catarina

Veja um exemplo:
imagine que voc seja responsvel por construir uma pgina na intranet de uma empresa prestadora de servios. O programa dever realizar a entrada de dados para cada funcionrio da empresa, ir executar o clculo da folha de pagamento e, por fim, ir emitir os contracheques e a relao bancria.

Parece um problema bem mais complexo dos que temos visto at agora, voc concorda?
Pois bem, se quisermos implementar as mesmas solues lgicas at agora estudadas, vamos ter um programa grande e complexo, sujeito a falhas e erros. Podemos separar o problema em partes, construir pequenos mdulos, test-los e depois integrlos para alcanar o objetivo final. Com esse procedimento, a complexidade dos algoritmos diminui, os testes se tornam rpidos e a manuteno tambm diminui. Pode parecer estranho, mas os resultados so de arregalar os olhos. Voltando ao problema, temos que o nosso alvo a construo de um programa de mostrar a folha de pagamento. Vamos ento dividi-lo conforme figura a seguir:

98

Lgica de Programao II

FolhaPagamento constitui o nosso programa principal. Esse programa constitudo de mdulos chamados de EntradaDados, Movimento e Sadas. Por sua vez, o Mdulo EntradaDados constitudo de dois outros mdulos: Funcionrios e Dependentes. Cada mdulo resolve um pequeno problema e pode ser solucionado por uma pessoa diferente, diminuindo o tempo de desenvolvimento.
O mdulo Sada mostra a formatao do texto e formulrio no site da empresa. O mdulo EntradaDados permite que os dados cadastrais de funcionrios e/ou dependentes sejam entrados no programa. Cada um desses mdulos deve funcionar de maneira independente e precisa, ou seja, sempre que precisarmos imprimir algo na tela, chamamos o mdulo responsvel por isso, o mdulo Sada. Se precisarmos cadastrar um novo funcionrio, chamamos o mdulo EntradaDados, e assim sucessivamente. Tudo funciona por partes. No preciso chamar o mdulo Movimento, se meu interesse apenas mostrar os resultados na sada ou na pgina da empresa.

Um fato importante: Os mdulos so independentes, mas todos eles esto integrados ao mdulo que chamados de mdulo principal do programa em nosso exemplo o mdulo FolhaPagamento. A partir desse mdulo que os outros so chamados para resolver problemas como entrada de dados, impresso de resultados etc.
Lembra como era anteriormente? Entrvamos com os dados, processvamos o algoritmo e mostrvamos o resultado na sada? Agora, as coisas se tornaram independentes. Chamamos apenas o mdulo que nos convier naquele momento, na seqncia em que quisermos. realmente uma forma estruturada de trabalhar, percebeu?

De forma resumida, nossos programas tero agora um mdulo principal, chamado de programa principal e diversos outros mdulos que iro compor todo o programa. Cada mdulo chamado a partir do programa principal. Quando um mdulo chamado a partir do programa principal, os comandos definidos

Unidade 5

99

Universidade do Sul de Santa Catarina

dentro do mdulo so executados. Quando finalizados, o controle volta para o programa principal. Nas linguagens de programao, cada mdulo chamado de funo.

Mas, o que uma funo?


Uma funo dita como sendo uma sub-rotina ou mdulo do algoritmo principal. Cada funo independente uma da outra. Chamamos uma funo a partir do algoritmo principal. Dentro da funo so executados comandos que realizam alguma tarefa especfica. Quando todos os comandos dentro da funo forem executados, o controle do programa volta para o programa principal. A partir do programa principal, podemos chamar outras funes de interesse tambm.

Por que usar funes ?

Para permitir o reaproveitamento de cdigo j construdo por voc ou por outros programadores. Para evitar que um trecho de cdigo que seja repetido vrias vezes dentro de um mesmo programa. Para permitir a alterao de um trecho de cdigo de uma forma mais rpida. Com o uso de uma funo preciso alterar apenas dentro da funo que se deseja. Para que os blocos do programa no fiquem grandes demais e, por conseqncia, mais difceis de entender. Para facilitar a leitura e manuteno do programa. Para separar o programa em partes (blocos) que possam ser logicamente compreendidas de forma isolada.

100

Lgica de Programao II

Com dvida ainda? No tem problema. Acompanhe um exemplo bastante simples que ir permitir que voc entenda o que definimos anteriormente. A exemplo dos algoritmos anteriores, vamos elaborar um pseudocdigo para o seguinte problema: queremos somar dois nmeros quaisquer. Conforme voc j estudou at agora, uma soluo bastante simples para o caso seria a seguinte:
incio {declarando as variveis} N1, N2, SOMA: inteiro {entrada de dados} escreva Programa de soma de dois nmeros escreva Entre com o primeiro nmero: leia N1 escreva Entre com o segundo nmero: leia N2 {processamento da soma} SOMA N1 + N2 {mostrando a sada} escreva Resultado da soma =, SOMA escreva Programa Finalizado fim

A soma dos dois nmeros est sendo realizada no algoritmo ou programa principal. Vamos considerar que as partes do algoritmo anterior, que so responsveis pela soma, sejam as partes de entrada de dados, a soma propriamente dita, ou seja, SOMA N1 + N2, e a impresso do resultado, ou seja, escreva Resultado da soma =, SOMA. Modularizar ou estruturar um programa consiste na construo de mdulos que iro compor o programa como um todo e sero chamados a partir do programa principal. A proposta a seguinte: em vez de termos a operao soma realizada dentro do programa principal, podemos construir uma sub-rotina que faa somente essa operao, ou seja, somar dois nmeros e mostrar o resultado final. Sempre que quisermos somar dois nmeros chamamos essa sub-rotina.
Unidade 5

101

Universidade do Sul de Santa Catarina

Nosso pseudocdigo ficaria mais ou menos assim:


incio escreva Programa de soma de dois nmeros CHAMADA DA FUNO FUNCAO_SOMA {quando chamamos a funo FUNCAO_SOMA o programa passa a executar os comandos dentro da funo. Finalizados os comandos dentro da funo, o programa retorna para o programa principal, continuando a executar os comandos aqui colocados na seqncia. A sintaxe de uma funo ser estudada mais adiante.} escreva Programa Finalizado fim FUNO_SOMA incio {declarando as variveis} N1, N2, SOMA: inteiro {entrada de dados} escreva Entre com o primeiro nmero: leia N1 escreva Entre com o segundo nmero: leia N2 {processamento da soma} SOMA N1 + N2 {mostrando a sada} escreva Resultado da soma =, SOMA fim-funo

102

Lgica de Programao II

Pontos a observar:
1. Observe onde esto definidas as variveis antes e aps a modularizao. Antes da modularizao, as variveis esto definidas dentro do programa principal. Aps a modularizao, as variveis esto definidas dentro da funo FUNCAO_SOMA. Isso apenas para colocar o seguinte: as variveis so definidas onde elas so utilizadas. Mais importante, uma varivel definida no programa principal no reconhecida na funo FUNCAO_SOMA, e uma varivel definida na funo FUNCAO_SOMA no reconhecida no programa principal. A isso damos o nome de variveis locais. Por exemplo, em nosso algoritmo principal anterior, se tentssemos utilizar a varivel N1, como abaixo, estaramos cometendo um erro.
incio escreva Programa de soma de dois nmeros CHAMADA DA FUNO FUNCAO_SOMA escreva O Valor de N1 =, N1 {errado pois N1 no est definida dentro do programa principal} escreva Programa Finalizado fim

O porqu disso? A resposta que a varivel N1 est definida dentro da funo FUNCAO_SOMA e no dentro do programa principal. 2. Assim que a funo chamada, os comandos dentro da funo so executados, ou seja, as variveis N1, N2 e SOMA so criadas, so executados os comandos de entrada de dados (escreva e leia), realizado a soma de N1 com N2 e o valor armazenado na varivel SOMA, e por fim, o valor impresso. Quando os comandos so finalizados encontrando o comando fim da funo, o programa volta para o programa principal. Mas o que acontece com as variveis locais? Elas so destrudas. isso mesmo. So destrudas e recriadas sempre que a funo FUNCAO_SOMA for chamada. Por isso no podemos acessar essas variveis a partir do programa principal. Dentro da funo FUNCAO_SOMA as variveis locais N1, N2 e SOMA so criadas no incio e destrudas no fim.
103

Unidade 5

Universidade do Sul de Santa Catarina

3. Podemos criar variveis no programa principal com os mesmos nomes das variveis da funo FUNCAO_SOMA? A resposta sim. Elas so variveis locais e uma nada tem a ver com a outra. Assim, nosso pseudocdigo principal estaria correto:
incio {declarando varivel N1} N1: inteiro N1 10 escreva Programa de soma de dois nmeros CHAMADA DA FUNO SOMA escreva O Valor de N1 =, N1 {agora est correto pois a varivel N1 est definida dentro do programa principal. Essa varivel local diferente da varivel local definida na funo SOMA.} escreva Programa Finalizado fim

4. Podemos chamar a funo FUNCAO_SOMA quantas vezes quisermos. Veja o pseudocdigo abaixo:
incio escreva Programa de soma de dois nmeros CHAMADA DA FUNO FUNCAO_SOMA {primeira chamada da funo FUNCAO_SOMA} CHAMADA DA FUNO FUNCAO_SOMA {segunda chamada da funo FUNCAO_SOMA} CHAMADA DA FUNO FUNCAO_SOMA {terceira chamada da funo FUNCAO_SOMA} escreva Programa Finalizado fim

Esta uma das vantagens da modularizao: construmos a funo uma vez e chamamos quantas vezes quisermos. 5. O nome FUNCAO_SOMA foi escolhido apenas para mostrar que estamos nos referindo a uma funo cuja funo seja a de somar dois nmeros. No necessrio colocar a palavra FUNCAO. Poderamos ter definido a funo como FSOMA,
104

Lgica de Programao II

SOMAS, ou outro nome qualquer. No poderamos chamar a funo de SOMA apenas porque criamos uma varivel tambm chamada de SOMA. O que quero dizer que no podemos ter o mesmo nome significando coisas diferentes (funo ou varivel).

SEO 2 - Modularizao: retorno de valores e passagem de parmetros


Na seo 1 vimos um algoritmo de funo bastante simples que permite implementar a soma de dois nmeros. Todo o processo de entrada, clculo da soma e escrita do resultado feito na funo FUNCAO_SOMA.
No entanto, se perguntssemos o que realmente a funo FUNCAO_SOMA deve fazer, qual a funo principal da funo FUNCAO_SOMA, qual seria sua resposta?

Se voc respondeu que a funo FUNCAO_SOMA deve somar e somente somar dois nmeros voc acertou. Observe que dentro da funo FUNCAO_SOMA temos comandos de entrada e sada, alm da soma propriamente dita.
Veja o seguinte exemplo:

Voc quer somar dois nmeros quaisquer mas no deseja imprimir o resultado na tela do seu computador, isso porque a soma dos dois nmeros serve apenas para verificar se o resultado um nmero superior ou abaixo de 10, por exemplo. Para esse caso, a nossa funo FUNCAO_SOMA no serve, sabe por qu? Por que alm de somar os dois nmeros e funo, tambm imprime o resultado na tela. Ou seja, estamos atribuindo funo FUNCAO_SOMA funes que na verdade no lhe pertencem. A funo FUNCAO_SOMA deve somar, e to somente somar, dois nmeros. Dados de entrada e sada devem ser feitos parte. Isso vai nos levar ao tema de Passagem de
Unidade 5

105

Universidade do Sul de Santa Catarina

parmetros e retorno de valores a partir das funes. Podemos imaginar uma funo como sendo uma caixa que aceita valores, processa-os e retorna um resultado para o programa principal. Se utilizarmos o mesmo exemplo da funo FUNCAO_SOMA, o seguinte esquema nos mostra onde estamos querendo chegar: Dois valores so passados para a funo FUNCAO_SOMA, N1 e N2. A funo realiza a soma e retorna o valor (resultado) para o programa principal. De onde vm N1 e N2? Para onde vai o valor da varivel SOMA? isso que vamos responder a partir de agora.

Retornando valores de funes


Retornar um valor de uma funo significa que o valor calculado pela funo pode ser lido no programa principal. Voc deve estar se perguntando: Como assim? Veja o exemplo da funo FUNCAO_SOMA. Queremos que a funo no imprima mais o resultado, ou seja, queremos eliminar o comando escreva da funo FUNCAO_SOMA. Quem ir imprimir o resultado da soma ser o programa principal. Conforme disse na seo 1, a varivel SOMA criada sempre que a funo FUNCAO_SOMA chamada. Ao finalizar a funo com o comando fim, a varivel SOMA destruda e no podemos acessar mais seu contedo. No entanto, ainda assim possvel ler seu valor antes mesmo da varivel ser destruda. O que estamos querendo dizer que possvel ler o valor da varivel SOMA no momento em que chamamos a funo FUNCAO_SOMA no programa principal.

106

Lgica de Programao II

Veja como isso pode ser feito:


FUNO_SOMA incio {declarando as variveis} N1, N2, SOMA: inteiro {entrada de dados} escreva Entre com o primeiro nmero: leia N1 escreva Entre com o segundo nmero: leia N2 {processamento da soma} SOMA N1 + N2 {em vez de imprimir o resultado na tela, vamos retornar o valor da varivel SOMA para o programa principal. Esse valor vai ser retornado para a linha de comando onde a funo FUNCAO_SOMA chamada. O comando que executamos nesse caso o comando retorna <identificador> onde identificador o nome de uma varivel definida dentro da funo} retorna SOMA. fim-funo

No programa principal, podemos ter:


incio {declarao da varivel} RESULTADO: inteiro escreva Programa de soma de dois nmeros {observe o comando a seguir: Ele nos indica que o valor retornado pela funo FUNCAO_SOMA armazenado na varivel RESULTADO, varivel essa declarada no programa principal. Com isso, podemos ler o contedo da varivel SOMA declarada na funo FUNCAO_SOMA.} RESULTADO CHAMADA DA FUNO FUNCAO_SOMA

Unidade 5

107

Universidade do Sul de Santa Catarina

{Vamos supor que estamos entrando com os nmeros 2 e 3 e queremos som-los. Na chamada da funo FUNCAO_SOMA a funo retorna o valor da varivel SOMA que 5. Sendo assim, o comando ficaria RESULTADO 5} {Importante: O valor retornado por uma funo somente pode ser lido no momento em que ela chamada. Os comandos a seguir esto completamente errados: CHAMADA DA FUNO FUNCAO_SOMA RESULTADO SOMA.

Voc sabe por qu? Por dois motivos bsicos. Quando uma funo retorna um valor ela retorna na linha de comando em que ela chamada. {Voc sabe por qu? Por dois motivos bsicos. Quando uma funo retorna um valor ela retorna na linha de comando em que ela chamada. Ao encontrar o comando CHAMADA DA FUNO FUNCAO_SOMA, a funo chamada, e ao encontrar o comando retorna <identificador> dentro da funo, o valor de <identificador> colocado na mesma linha que a funo chamada. O segundo motivo que a varivel SOMA no pode ser lida a partir do programa principal, tendo em vista que ela definida apenas na sub-rotina FUNCAO_SOMA.} {podemos agora fazer o que quisermos com o resultado da soma, tendo em vista que armazenamos o resultado na varivel RESULTADO. Podemos verificar se o valor da soma maior ou igual a 10, por exemplo: se RESULTADO > 10 ento escreva A soma maior que 10 seno escreva A soma menor ou igual a 10. Tambm, podemos apenas imprimi-lo conforme algoritmo anterior.} escreva Resultado da soma =, RESULTADO escreva Programa Finalizado fim

Sem segredos no mesmo? Estamos com uma funo (FUNCAO_SOMA) que tem duas funes bsicas: entrada de dados e a soma dos nmeros. A impresso fica a cargo do programa principal. Nosso prximo passo fazer com que a funo FUNCAO_SOMA apenas some, deixando a entrada de dados para o programa principal ou at mesmo uma outra funo qualquer.
108

Lgica de Programao II

Passando valores para funes


At agora no nos preocupamos com a sintaxe para a implementao de uma funo em pseudocdigo. Acho que mais importante entender o conceito agora do que mostrar a sintaxe propriamente dita. Entendido o conceito de funo, a sintaxe mero detalhe.
Vimos como voltar um valor de uma funo. A questo agora : Podemos passar valores para dentro de uma funo, ou seja, podemos passar um valor de uma varivel definida dentro do programa principal para uma funo?

A resposta sim. Perceba que estamos agora fazendo o caminho da volta do que fizemos no item 2.1. A transferncia de valores para dentro de uma funo se d atravs de passagem por parmetros. Mas o que significa passagem de parmetros? Para responder essa questo, voltamos figura onde definimos um esquema para a funo FUNCAO_SOMA.

Vimos que SOMA representa o valor de retorno da funo FUNCAO_SOMA. Mas quem so N1 e N2? De onde vm essas variveis? Pois bem, N1 e N2 so duas variveis declaradas fora da funo FUNCAO_SOMA. Por exemplo, elas podem estar declaradas dentro do programa principal de forma que a entrada de dados no mais realizada pela funo FUNCAO_ SOMA e sim pelo programa principal. Poderiam estar definidas em outra funo qualquer tambm.

Unidade 5

109

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 variveis N1 e N2 armazenam dois valores que queremos somar, e cuja operao de soma realizada pela funo FUNCAO_SOMA, obviamente temos que fazer com que esses dois valores possam ser lidos dentro da funo tambm. sempre importante lembrar que as variveis so locais (definidas dentro do programa principal) e no podem ser utilizadas em quaisquer outras funes. A passagem dos valores das variveis N1 e N2 se d atravs de passagem de parmetros. Os parmetros de uma funo so variveis locais definidas junto ao nome da funo e servem para receber valores de outras funes ou programa principal e podem ser utilizados como variveis locais dentro da funo. Por exemplo, quando definimos anteriormente a funo FUNCAO_SOMA, utilizamos a seguinte sintaxe provisria:
FUNCAO_SOMA incio {declarao de variveis locais} {comandos da funo} fim-funo

Os parmetros de uma funo so definidos junto ao nome da funo. Eles recebem valores que sero passados para a funo no momento em que chamada no programa principal. Em nosso programa de soma, a funo FUNCAO_SOMA deve receber dois valores para serem somados. Ento, temos:
FUNCAO_SOMA( NUM1, NUM2 ) incio {declarao de variveis locais} {comandos da funo} fim-funo

110

Lgica de Programao II

Perceba que os parmetros NUM1 e NUM2 so colocados entre parnteses aps o nome da funo. Podemos utilizar NUM1 e NUM2 dentro da funo de modo que nos convier. Essas variveis so variveis locais que servem para receber valores a partir da chamada da funo. Mostro um exemplo que explica melhor. Veja o nosso programa principal:
incio N1, N2, RESULTADO: inteiro {vamos realizar a entrada pelo programa principal} escreva entre com o nmero 1 leia N1 escreva entre com o nmero 2 leia N2 {N1 e N2 so duas variveis locais que armazenam os valores que queremos somar. Devemos, portanto, passar esses valores para dentro da funo FUNCAO_SOMA. Fizemos isso atravs da passagem de parmetros} RESULTADO FUNCAO_SOMA (N1, N2) {Nesse momento, a funo FUNCAO_SOMA chamada e o valor da varivel N1 armazenado na varivel NUM1 e o valor da varivel N2 armazenado na varivel NUM2, exatamente nessa seqncia. A funo calcula a soma e retorna um valor, cujo resultado armazenado em RESULTADO.} escreva resultado da soma =, RESULTADO fim

Nossa funo FUNCAO_SOMA a seguinte:


FUNCAO_SOMA( NUM1, NUM2 ) incio {declarao de variveis locais} SOMA : numrico {o parmetro ou varivel NUM1 armazena o valor da varivel N1 e o parmetro ou varivel NUM2 armazena o valor da varivel N2} SOMA NUM1 + NUM2 {observe aqui que estamos utilizando NUM1 e NUM2 como variveis locais. Diferentemente das variveis declaradas dentro da funo, os parmetros da funo servem para receber valores no momento em que so chamadas. Uma observao importante o fato de no podermos definir variveis locais com os mesmos nomes do que os parmetros da funo. Em nosso exemplo, no podemos declarar

Unidade 5

111

Universidade do Sul de Santa Catarina

uma varivel chamada NUM1 porque j est definida como parmetro da funo} retorna SOMA {retorna o valor da varivel SOMA para a linha de comando em que a funo foi chamada} fim-funo

Se fssemos montar um novo esquema para a funo FUNCAO_SOMA, teramos:

No momento em que a funo FUNCAO_SOMA chamada, os parmetros da funo (NUM1 e NUM2) so criados e so passados os valores das variveis N1 e N2 respectivamente.
Observe que estamos transferindo valores de N1 para NUM1 e de N2 para NUM2. isso significa que ambos devem ser do mesmo tipo, ou seja, se N1 inteiro, NUM1 tambm deve ser inteiro. Se a varivel N2 for literal, ento NUM2 tambm deve ser literal.

Sintaxe da funo
Bem, j conhecendo a importncia de uma funo e de como ela chamada, basta saber como implementar utilizando pseudocdigo. Veja a sintaxe:
Sintaxe da funo funo <nome da funo> (< lista de parmetros>): <tipo de retorno>

112

Lgica de Programao II

Os termos utilizados nesse tipo de sintaxe so explicados a seguir:


Funo
<nome da funo> < lista de parmetros>

Comando referente funo


Nome da funo que ser declarada. Lista dos parmetros que sero utilizados (se houver) Tipo da varivel que ser retornada pela funo declarada (numrico, literal, lgico)

<tipo de retorno>

Observe como fica a funo FUNCAO_SOMA utilizando a sintaxe em pseudocdigo:


Nome da funo: FUNCAO_SOMA Lista de parmetros: NUM1 e NUM2 do tipo inteiro Tipo de retorno: inteiro

Desta forma, a sintaxe para a funo FUNCAO_SOMA fica:


funo FUNCAO_SOMA (NUM1, NUM2: inteiro): inteiro

Veja outros exemplos de declarao de funo:


1. Funo que recebe 4 notas e retorna a mdia.

funo MEDIA (NOTA1, NOTA2, NOTA3, NOTA4: real): real


2. Funo que recebe o nome e idade de uma pessoa e retorna verdadeiro ou falso.

funo CADASTRA (NOME: literal, IDADE: inteiro): lgico


3. Funo que recebe o nome de um ms e volta o ms em nmero

funo FUNCAO_MES ( MS: literal ): inteiro

Unidade 5

113

Universidade do Sul de Santa Catarina

Acompanhe mais alguns exemplos de funes. O interesse aqui apenas verificar a implementao das funes. Voc poder construir qualquer tipo de programa que chame essas funes da maneira que voc quiser, quantas vezes quiser e onde quiser. Por isso que chamamos de modularizao. Fazemos uma vez e podemos usar vrias.
1. Criar uma funo para receber o ano corrente e o ano de nascimento de uma pessoa. Em seguida, retornar a idade da pessoa. Pseudocdigo:

funo idade (anocorrente, anonascimento: inteiro): inteiro retorna ANOCORRENTE ANONASCIMENTO fim-funo
2. Criar uma funo para receber o valor de uma determinada temperatura em graus Fahrenheit e retornar o valor correspondente em Centgrados. A frmula de converso C = 5/9 (F-32). Pseudocdigo:

funo CELSIUS (FAHRENHEIT : real) : real retorna (5/9) * (FAHRENHEIT - 32) fim-funo
3. Um exemplo bastante interessante o desenvolvimento de um algoritmo para implementao de menus de entrada, ou seja, a elaborao de opes que permitam o usurio entrar com os dados de acordo com a seleo de um item.

- Bem, agora voc est mesmo finalizando os estudos de lgica de programao. Foi um desafio e tanto no?

114

Lgica de Programao II

Mas o estudo no deve terminar por aqui. O que voc conheceu e aprendeu apenas o ponta-p inicial para aprofundamentos futuros. Lembro novamente que, quanto mais exerccios voc fizer, melhor voc ser e se diferenciar dos outros programadores. Um outro fato importante que recomendo que, ao estudar linguagem de programao, voc no abandone a lgica. Pense inicialmente em uma soluo algortmica. Isso pensar no problema de forma inteligente. Alis, isso ser inteligente. Com a soluo pensada, o programador ter apenas trabalho de digitar a soluo lgica encontrada em qualquer linguagem de programao. Passa a ser um trabalho de digitao. Fao uma ltima pergunta a voc:
Voc quer se tornar um profissional de programao ou um digitador profissional?

Pense nisso quando estiver programando um website. Um grande abrao e sucesso!

Sntese
Nesta unidade voc viu que para a soluo de problemas mais complexos, devemos dividi-los em partes. Caso separemos um problema complexo em problemas menores, podemos construir algoritmos para cada um deles de forma bem definida, e fazer com que eles sejam independentes um dos outros. A essa tcnica de dividir os algoritmos em mdulos chamamos de modularizao. Cada mdulo, quando bem elaborado, deve possuir uma srie de caractersticas: implementar tarefas no-redundantes e nem subjetivas; ter uma funo especfica e clara; ser independente de todos os outros mdulos de um programa; ser testado e corrigido antes de ser integrado soluo completa, tendo em vista que parte da soluo lgica do problema.

Unidade 5

115

Universidade do Sul de Santa Catarina

Em pseudocdigo, utilizamos o conceito de funo para modularizar um algoritmo. Uma funo dita como sendo uma sub-rotina ou mdulo do algoritmo principal. Cada funo independente uma da outra. Chamamos uma funo a partir do algoritmo principal. A sintaxe para implementar uma funo a seguinte:
funo <nome da funo> (< lista de parmetros>): <tipo de retorno>

Onde a lista de parmetros representa a forma de passagem de valores para dentro da funo. o que chamamos de passagem de valor ou passagem de parmetros por valor. A funo tambm pode retornar um valor. Esse valor do tipo <tipo de retorno>, podendo ser numrico, literal ou lgico. Sempre que necessrio, devemos utilizar funes para desenvolvimento de algoritmos. As grandes vantagens so:

Para permitir o reaproveitamento de cdigo j construdo por voc ou por outros programadores. Para evitar que um trecho de cdigo que seja repetido vrias vezes dentro de um mesmo programa. Para permitir a alterao de um trecho de cdigo de uma forma mais rpida. Com o uso de uma funo preciso alterar apenas dentro da funo que se deseja. Para que os blocos do programa no fiquem grandes demais e, por conseqncia, mais difceis de entender. Para facilitar a leitura do programa de uma forma mais fcil. Para separar o programa em partes (blocos) que possam ser logicamente compreendidas de forma isolada.

116

Lgica de Programao II

Atividades de autoavaliao
1. Utilizando o algoritmo anterior, implemente a funo SUBTRACAO, MULTiPLiCACAO e DiViSAO. Elabore um programa principal que possa chamar as funes de acordo com o que o usurio deseja. Por exemplo, se o usurio digitar 1, a funo SUBTRACAO chamada, se o usurio digitar 2, a funo MULTiPLiCACAO chamada, se o usurio digitar 3 a funo DiViSAO chamada. Qualquer outro nmero, o programa dever indicar uma mensagem de erro e solicitar com que o usurio digite 1, 2 ou 3 novamente.

Unidade 5

117

Universidade do Sul de Santa Catarina

2. Na atividade 1, altere os algoritmos de cada funo de forma que as mesmas retornem os valores por elas calculados. O programa principal que dever imprimir o resultado de sada, qualquer que seja a operao escolhida (subtrao, multiplicao ou diviso).

118

Lgica de Programao II

3. Elaborar uma funo que calcule o maior nmero entre trs valores. A funo deve aceitar trs parmetros e retornar o maior valor entre eles. A entrada de dados e a impresso do resultado devem ser feitas no programa principal.

Unidade 5

119

Universidade do Sul de Santa Catarina

Saiba mais
Para aprofundar os estudos leia os livros indicados a seguir. MANZANO, Jos Augusto N. G. LGICA estruturada para programao de computadores. XAVIER, Gley Fabiano Cardoso. Lgica de Programao. MANZANO, Jos Augusto N. G. Algoritmos: lgica para desenvolvimento de programao de computadores.

120

Para concluir o estudo


Voc chegou ao final da disciplina de Lgica de Programao II. Foram 120 horas de estudos de algoritmos de programao. O objetivo principal foi estudar as principais estruturas lgicas de programao e perceber a importncia de realizar um projeto de qualquer software atravs de algoritmos. Pois bem, gostaria de enfatizar que o contedo no terminou, muito pelo contrrio, voc est agora apto para se aprofundar em algoritmos de programao. Por isso, agora com voc, nobre estudante. Siga em frente! Se voc quiser realmente ser um programador diferenciado no mercado, passo o basto para voc. A corrida sua agora. Tenho certeza tambm que a vitria vir. No se esquea disso, quanto mais voc estiver preparado em lgica de programao, melhor voc ser, independente de qualquer linguagem de programao que voc poder vir a utilizar. Esse realmente o diferencial de um bom programador. No seja apenas um digitador, seja um pensador, por isso, saiba bem lgica de programao. Um grande abrao e at a prxima oportunidade. Professor Carlos Fernando Martins.

Referncias
MANZANO, Jos Augusto N. G.; OLiVEiRA, Jayr Figueiredo de. ALGORITMOS: lgica para desenvolvimento de programao. 9. ed. So Paulo: rica, 2000. 265 p. ABE, Jair Minoro; SCALZiTTi, Alexandre,; SiLVA FiLHO, Joo incio da,. Introduo lgica para a cincia da computao. 2. ed. So Paulo: Arte & Cincia, 2002. 247 p. WARNiER, Jean-Dominique. LCP - Lgica de Construo de Programas: um mtodo de programao estruturada. 3. ed. Rio de Janeiro: Campus, 1984. 185 p. UCCi, Waldir; SOUSA, Reginaldo Luiz; KOTANi, Alice Mayumi. LGICA de programao: os primeiros passos. 8. ed. So Paulo: rica, 1999. 339 p. FORBELLONE, Andr Luiz Villar; EBERSPCHER, Henri Frederico. LGICA de programao: a construo de algoritmos e estruturas de dados. 2. ed. rev. e atual. So Paulo: Makron Books, 2000. 197 p. MANZANO, Jos Augusto N. G. LGICA estruturada para programao de computadores. So Paulo: rica, 2002. 180 p.

Sobre o professor conteudista


Carlos Fernando Martins Engenheiro de Controle e Automao Industrial pela Universidade Federal de Santa Catarina UFSC (1990-1995); Mestre em Engenharia Eltrica pelo Departamento de Automao e Sistemas da UFSC (1995-1996); Doutorando no Departamento de Engenharia Mecnica da UFSC (incio em 2001) na rea de Concentrao: Sistemas de Produo da Manufatura. Professor da Faculdade de Tecnologia do SENAI Florianpolis nas disciplinas de Lgica de Programao, Programao Orientada a Objetos, Linguagens de Programao C/C++ e UML; Professor de cursos de Ps Graduao em nvel de especializao em automao industrial (Sistemas Discretos da Manufatura, Integrao de Sistemas da Manufatura, Sistemas da Informao).

Respostas e comentrios das atividades de autoavaliao


Unidade 1
1) temperaturas: vetor[25] real 2) nomes: vetor[150] literal 3) produtos: vetor[2500] literal 4) Pseudocdigo do programa de reserva de vos

incio {declarao de variveis} NUM_VOOS, I, NVD: inteiro {NVD = nmero do vo desejado} vetor: VOOS[500] inteiro {supondo 500 vos ao dia. Cada posio do vetor armazena o nmero de lugares disponveis} RG: literal {incio do programa} escreva Especifique o nmero de vos disponveis leia NUM_VOOS para I de 0 at NUM_VOOS-1 passo 1 faa escreva Especifique a quantidade de lugares disponveis para o vo:, I+1 leia VOOS[ I ] fim-para {processamento} escreva Entre com o nmero do vo ou 1 para sair: leia NVD {leitura do nmero do vo desejado pelo cliente} enquanto NVD <> -1 faa se (NVD >= 0 E NVD < NUM_VOOS) ento se VOOS[ NVD ] > 0 ento {h lugares disponveis} VOOS[ NVD ] VOOS[ NVD ] 1 {1 lugar ocupado no vo}

Universidade do Sul de Santa Catarina

escreva Entre com o RG do passageiro: leia RG seno escreva No h lugares disponveis no vo, NVD fim-se seno escreva No existe esse vo, fim-se escreva Entre com o nmero do vo ou 1 para sair: leia NVD fim-enquanto fim

Unidade 2
1) Pseudocdigo

incio NOMES : vetor [27] literal DISTANCIAS : matriz [27][27] real LINHA, COLUNA : inteiro CAPITAL1, CAPITAL2 : literal para LINHA de 0 at 26 passo 1 faa escreva Digite o nome de uma capital: leia NOMES[LINHA] fim-para para LINHA de 0 at 26 passo 1 faa para COLUNA de 0 at 26 passo 1 faa se LINHA = COLUNA ento DISTANCIAS[LINHA][COLUNA] 0 seno escreva Digite a distncia (kms) entre ,NOMES[LINHA], e , NOMES[COLUNA]

128

Lgica de Programao II

leia DISTANCIAS[LINHA][COLUNA] fim-se fim-para fim-para escreva Digite o nome da primeira capital escolhida: leia CAPITAL1 escreva Digite o nome da segunda capital escolhida: leia CAPITAL2 LINHA 0 enquanto NOMES[LINHA] <> CAPITAL1 ou LINHA <= 27 faa LINHA LINHA + 1 fim-enquanto COLUNA 0 enquanto NOMES[COLUNA] <> CAPITAL2 ou COLUNA <= 27 faa COLUNA COLUNA + 1 fim-enquanto se LINHA <= 27 ento se COLUNA <= 27 ento escreva A distncia entre ,CAPITAL1, e ,CAPITAL2, de , DISTANCIAS[LINHA][COLUNA], kms. seno escreva Nome ,CAPITAL2, no consta no cadastro! fim-se seno escreva Nome ,CAPITAL1, no consta no cadastro! fim-se fim

129

Universidade do Sul de Santa Catarina

Unidade 3
1) Declarao de um registro de um hspede de um hotel de luxo:

FICHA: registro NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO, EMAIL, MOTIVO_ VIAGEM: literal TELEFONE, NUM_RESERVAS: inteiro fim-registro
2) Algoritmo de um sistema de administrao escolar:

incio {declarao do registro FICHA} FICHA: registro {variveis da ficha} NOME, ENDERECO, CIDADE, ESTADO, CEP, CPF, RG, DATA_NASC, CURSO: literal TELEFONE, GRAU_ESC: inteiro fim-registro CONT, NUM_PROF: inteiro {especifica o nmero de professores a serem cadastrados} CADASTRO: vetor[0..199] FICHA {permite armazenar at 200 professores. As posies do vetor vo de 0 at 199} escreva Entre com o nmero de professores a serem cadastrados leia NUM_PROF para CONT de 0 at NUM_PROF-1 passo 1 faa {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 Endereo: leia CADASTRO[CONT].ENDERECO escreva Cidade: 130

Lgica de Programao II

leia CADASTRO[CONT].CIDADE escreva Estado: leia CADASTRO[CONT].ESTADO escreva CEP: leia CADASTRO[CONT].CEP escreva Telefone de Contato: leia CADASTRO[CONT].TELEFONE fim-para fim
3) Algoritmo de um sistema de cadastro de uma Vdeo Locadora:

incio {declarao do registro FICHA} VIDEO: registro {variveis da ficha} NOME, CODIGO, TIPO, PRODUTOR, ATOR, DIRETOR: literal ANO: inteiro DURACAO: real fim-registro FITAS: vetor[0..499] VIDEO {permite cadastrar at 500 fitas de vdeo} NUM_FITAS, CONT: inteiro {entrada de dados} escreva Entre com o nmero de fitas a serem cadastradas leia NUM_FITAS para CONT de 0 at NUM_FITAS-1 passo 1 faa escreva Entre com o nome do filme: leia FITAS[CONT].NOME escreva Entre com o cdigo do filme: leia FITAS[CONT].CODIGO escreva Entre com o tipo de filme: leia FITAS[CONT].TIPO escreva Entre com o nome do produtor: leia FITAS[CONT].PRODUTOR escreva Entre com o nome do ator principal: leia FITAS[CONT].ATOR escreva Entre com o nome do diretor do filme: leia FITAS[CONT].DIRETOR escreva Entre com o tempo de durao do filme: leia FITAS[CONT].DURACAO escreva Entre com o ano da produo: leia FITAS[CONT].ANO fim-para 131

Universidade do Sul de Santa Catarina

{resultados de sada} para CONT de 0 at NUM_FITAS-1 passo 1 faa {resultado de sada do algoritmo. Perceba que vamos colocar as principais sadas tudo no mesmo comando} escreva O filme, FITAS[CONT].NOME, do produtor, FITAS[CONT]. PRODUTOR, um, FITAS[CONT].TIPO, com uma durao de, FITAS[CONT]. DURACAO, .Estrelando o ator, FITAS[CONT].ATOR .O filme foi produzido no ano de, FITAS[CONT].ANO fim-para fim
4) Cadastro de 200 funcionrios de uma empresa. Pseudocdigo:

incio tipo FICHA = registro DATA_NASC, NOME, ENDERECO, CIDADE, UF, RG, CURSO, GRAU_ESC, CONJUGE : literal CODIGO,CEP, DEPENDENTES, FONE, CPF : inteiro fim-registro FUNCIONARIOS : vetor [0..199] FICHA CODIGOCONSUL, CONT, POS : inteiro para POS de 0 at 199 passo 1 faa escreva Especifique o cdigo do funcionrio: leia FUNCIONARIOS[POS].CODIGO escreva Digite o nome do funcionrio: leia FUNCIONARIOS[POS].NOME escreva Especifique o endereo: leia, FUNCIONARIOS[POS].ENDERECO escreva Espeficique a cidade onde funcionrio reside: leia FUNCIONARIOS[POS].CIDADE escreva Especifique o estado:, leia FUNCIONARIOS[POS].UF escreva Especifique o CEP: leia FUNCIONARIOS[POS].CEP escreva Especifique o telefone leia FUNCIONARIOS[POS].FONE

132

Lgica de Programao II

escreva Digite CPF leia FUNCIONARIOS[POS].CPF escreva Especifique R.G.:, leia FUNCIONARIOS[POS].RG escreva Digite a data de nascimento leia FUNCIONARIOS[POS].DATA_NASC escreva Digite o grau de escolaridade: leia FUNCIONARIOS[POS].GRAU_ESC escreva Digite o nome do cnjuge: leia FUNCIONARIOS[POS].CONJUGE escreva Digite o nmero de dependentes: leia FUNCIONARIOS[POS].DEPENDENTES fim-para para CONT de 1 at 20 passo 1 faa escreva Digite o cdigo do funcionrio a ser consultado: leia CODIGOCONSUL POS 0 enquanto CODIGOCONSUL < > FUNCIONARIOS[POS].CODIGO OU POS < 200 POS POS + 1 fim-enquanto se CODIGOCONSUL = FUNCIONARIOS[POS].CODIGO ento escreva Nome:, FUNCIONARIOS[POS].NOME escreva Endereo:, FUNCIONARIOS[POS].ENDERECO escreva Telefone:, FUNCIONARIOS[POS].FONE seno escreva Cdigo do funcionrio no consta no cadastro fim-se fim-para fim
5) A Primeira Maneira, declaramos as variveis individualmente e a segunda maneira, colocamos as variveis em um bloco. A praticidade do segundo tipo est na possibilidade de voc criar novas variveis em vez de declarar os dados ou estrutura vrias vezes. Facilita na construo de estrutura de dados. Conforme voc pode ver na seqncia do exerccio, 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 posio um registro de dados, e cada registro possui campos (variveis) onde so armazenados os valores.

133

Universidade do Sul de Santa Catarina

Unidade 4
1) Pseudocdigo

incio CODIGOPRODUTO : vetor[100] literal QUANTIDADE : vetor[100] inteiro POS, ULTIMO, AUX1 : inteiro AUX2 : literal para POS de 0 at 99 passo 1 faa escreva Entre com o cdigo da mercadoria: leia CODIGOPRODUTO[POS] escreva Entre com a quantidade: leia QUANTIDADE[POS] fim-para POS 0 ULTIMO 99 AUX 0 enquanto ULTIMO < > 1 faa enquanto POS < > (ULTIMO - 1) faa se QUANTIDADE[POS] > QUANTIDADE[POS+1] ento AUX1 QUANTIDADE[POS] AUX2 CODIGOPRODUTO[POS] QUANTIDADE[POS] QUANTIDADE[POS+1] CODIGOPRODUTO[POS] CODIGOPRODUTO[POS+1] QUANTIDADE[POS+1] AUX1 CODIGOPRODUTO[POS+1] AUX2 fim-se POS POS + 1 fim-enquanto POS 1 ULTIMO ULTIMO - 1 fim-enquanto escreva Imprimindo os cdigos e as quantidades em ordem crescente. para POS de 0 at 99 passo 1 faa escreva CODIGOPRODUTO[POS]

134

Lgica de Programao II

escreva QUANTIDADE[POS] fim-para fim


2) Pseudocdigo

incio ALUNOS : vetor[100] inteiro POS, PESQUISADO, CONT: inteiro para POS de 0 at 99 passo 1 faa escreva Digite o cdigo de matrcula de um aluno: leia ALUNOS[POS] fim-para {leitura de 5 nmeros de matrcula} para CONT de 1 at 5 passo 1 faa escreva Digite o nmero de matrcula 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 ento escreva Nmero no cadastrado ! seno escreva Nmero localizado na posio ,POS, do vetor. fim-se fim-para fim

135

Universidade do Sul de Santa Catarina

3) incio

VET: vetor[5] inteiro NUMEROLIDO, PRIMEIRA, ULTIMA, METADE: inteiro POS: inteiro ACHOU : lgico {varivel que armazena verdadeiro quando o valor numrico for encontrado no vetor. Caso contrrio, armazena falso} {preenchendo um vetor com nmeros em ordem crescente} para POS de 0 at 4 passo 1 faa escreva digite um nmero: leia VET[ POS ] fim-para escreva digite um nmero a ser pesquisado : leia NUMEROLIDO {inicializao das variveis} PRIMEIRA 0 ULTIMA 4 ACHOU falso {processo de procura} enquanto PRIMEIRA <= ULTIMA e no ACHOU faa {clculo da metade. Utilizamos a funo aritmtica DIV para realizar uma diviso inteira, Veja Lgica de Programao I} METADE DIV((PRIMEIRA + ULTIMA), 2) {verifica se o nmero procurado j se encontra na metade. o primeiro teste} se VET[ METADE ] = NUMEROLIDO ento ACHOU verdadeiro fim-se {caso o nmero procurado no esteja exatamente na metade o vetor, verificamos se ele maior do que esse nmero} {Segundo teste} se VET[ METADE ] < NUMEROLIDO ento PRIMEIRA METADE + 1 {Se ele no for maior, ento s poder ser menor do que o nmero contido na metade do vetor. Terceiro teste} seno ULTIMA METADE 1

136

Lgica de Programao II

fim-se fim-enquanto {verifica o valor lgico da varivel ACHOU} se ACHOU = verdadeiro ento escreva Nmero , NUMEROLIDO, encontrado na posio , METADE, do vetor seno escreva Nmero no encontrado no vetor fim-se fim
4) Algoritmo para cadastro de cdigos e quantidades dos produtos, seguindo a ordem crescente das quantidades. Pseudocdigo:

incio COD_PRODUTO : vetor[0..99] literal {cdigo do produto} QTDE : vetor[0..99] inteiro {quantidade de mercadoria} POS, ULTIMO, AUX1: inteiro AUX2 : literal para POS de 0 at 99 faa leia COD_PRODUTO[POS] leia QTDE[POS] fim-para POS 0 ULTIMO 99 AUX 0 enquanto ULTIMO < > 1 faa enquanto POS < > (ULTIMO - 1) faa {mecanismos de ordenao de valores} se QTDE[POS] > QTDE[POS+1] ento AUX1 QTDE[POS] AUX2 COD_PRODUTO[POS] QTDE[POS] QTDE[POS+1] COD_PRODUTO[POS] COD_PRODUTO[POS+1] QTDE[POS+1] AUX1 COD_PRODUTO[POS+1] AUX2

137

Universidade do Sul de Santa Catarina

fim-se POS POS + 1 fim-enquanto POS 1 ULTIMO ULTIMO - 1 fim-enquanto escreva Imprimindo os cdigos e as quantidades em ordem crescente. para POS de 0 at 99 faa escreva COD_PRODUTO[POS] escreva QTDE[POS] fim-para fim

Unidade 5
1) implementando a funo SUBTRACAO, MULTiPLiCACAO e DiViSAO sem retorno de valores. Pseudocdigo

incio {declarao de variveis} OPCAO: inteiro N1, N2: real OPCAO 1 enquanto OPCAO < > 4 faa escreva Menu de Opes escreva 1. Subtrao escreva 2. Multiplicao escreva 3. Diviso escreva 4. Sair escreva Selecione uma opo: leia OPCAO leia N1 se OPCAO < > 4 faa se OPCAO = 1 ento {operao de subtrao} SUBTRACAO (N1, N2)

138

Lgica de Programao II

Seno

fim-se

leia N2 fim-se

se OPCAO = 2 ento {operao de Multiplicao} MULTIPLICACAO (N1, N2) Seno se OPCAO = 3 ento {operao de diviso} DIVISAO (N1, N2) seno escreva Opo errada. Digite novamente fim-se fim-se

fim-enquanto fim {implementao das funes} funo SUBTRACAO (NUM1, NUM2: real) escreva resultado =, NUM1 NUM2 fim-funo funo MULTIPLICACAO (NUM1, NUM2: real) escreva resultado =, NUM1*NUM2 fim-funo funo DIVISAO (NUM1, NUM2: real) se NUM2 < > 0 ento {garante que a diviso nunca ser feita por zero} escreva resultado = NUM1/NUM2 seno escreva no existe diviso por zero fim-se fim-funo

139

Universidade do Sul de Santa Catarina

2) implementando a funo SUBTRACAO, MULTiPLiCACAO e DiViSAO com retorno de valores. Pseudocdigo

incio {declarao de variveis} OPCAO, NUM1, NUM2, RESULTADO: real OPCAO : inteiro OPCAO 1 enquanto OPCAO < > 4 faa escreva Menu de Opes escreva 1. Subtrao escreva 2. Multiplicao escreva 3. Diviso escreva 4. Sair escreva Selecione uma opo: leia OPCAO se OPCAO < > 4 faa Escreva Digite dois nmeros Leia N1 Leia N2 se OPCAO = 1 ento {operao de subtrao} RESULTADO SUBTRACAO (N1, N2) seno se OPCAO = 2 ento {operao de Multiplicao} RESULTADO MULTIPLICACAO (N1, N2) seno se OPCAO = 3 ento {operao de diviso} RESULTADO DIVISAO (N1, N2) seno escreva Opo errada. Digite novamente fim se fim se fim se escreva resultado da operao =, RESULTADO fim se fim enquanto fim 140

Lgica de Programao II

{implementao das funes} funo SUBTRACAO (NUM1, NUM2: real): real retorna NUM1 NUM2 {retorna a diferena entre os parmetros da funo} fim-funo funo MULTIPLICACAO (NUM1, NUM2: real): real retorna NUM1*NUM2 {retorna a multiplicao entre os parmetros da funo} fim-funo funo DIVISAO (NUM1, NUM2: real): real se NUM2 < > 0 ento {garante que a diviso nunca ser feita por zero} retorna NUM1/NUM2 seno escreva no existe diviso por zero retorna 0 fim-se fim-funo
3) Algoritmo do programa que implementa uma funo que aceita trs valores como parmetro e retorna o maior valor.

incio {declarao de variveis} RESULT, VAL1, VAL2, VAL3: inteiro {entrada de dados} escreva Digite o primeiro nmero leia VAL1 escreva Digite o segundo nmero leia VAL2 escreva Digite o terceiro nmero leia VAL3 {chamando a funo} RESULT FUNCAO_MAIOR(VAL1, VAL2, VAL3) escreva O maior valor :, RESULT fim

141

Universidade do Sul de Santa Catarina

{implementao da funo} funo FUNCAO_MAIOR (NUM1, NUM2, NUM3: inteiro): inteiro MAIOR: inteiro {varivel local. Vlido somente dentro da funo} se NUM1 > NUM2 E NUM1 > NUM3 ento {NUM1 o maior valor} MAIOR NUM1 seno se NUM2 > NUM1 E NUM2 > NUM3 ento {NUM2 o maior valor} MAIOR NUM2 seno {NUM3 o maior valor} MAIOR NUM3 fim-se retorna MAIOR fim-funo

142

Elton Joo Gubert Mrio Gerson Miranda Magno Jnior Patrcia Gerent Petry

Lgica de Programao II
Caderno de atividades
3 edio revista e atualizada Reviso e atualizao de contedo Clavison Martinelli Zapelini

Design instrucional Flavia Lumi Matuzawa Viviane Bastos

Palhoa UnisulVirtual 2009

Copyright UnisulVirtual 2009 Nenhuma parte desta publicao pode ser reproduzida por qualquer meio sem a prvia autorizao desta instituio.

Edio Livro Didtico


Professores Conteudistas Elton Joo Gubert Mrio Gerson Miranda Magno Jnior Patrcia Gerent Petry Design Instrucional Flvia Lumi Matuzawa Viviane Bastos Reviso e atualizao de contedo Clavison Martinelli Zapelini Assistente Acadmico Michele Antunes Corra (3 edio revista e atualizada) Projeto Grfico e Capa Equipe UnisulVirtual Diagramao Rafael Pessi Reviso Helosa Mano Dorneles 005.1 G95 Gubert, Elton Joo Lgica de programao I : caderno de atividades / Elton Joo Gubert, Mrio Gerson Miranda Magno Jnior, Patrcia Gerent Petry ; reviso e atualizao de contedo Clavison Martinelli Zapelini ; design instrucional Flvia Lumi Matuzawa, Viviane Bastos ; [assistente acadmico Michele Antunes Corra]. 3. ed. rev. e atual. Palhoa : UnisulVirtual, 2009. 198 p. : il. ; 28 cm. Inclui bibliografia. 1. Lgica Processamento de dados. 2. Programao (Computadores). 3. Estrutura de dados (Computao). 4. Algoritmos. I. Magno Jnior, Mrio Gerson Miranda. II. Petry, Patrcia Gerent. III. Zapelini, Clavison Martinelli. IV. Matuzawa, Flvia Lumi. V. Bastos, Viviane. VI Corra, Michele Antunes. VII. Ttulo.
Ficha catalogrfica elaborada pela Biblioteca Universitria da Unisul

Sumrio

Palavras do professor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 UNIDADE UNIDADE UNIDADE UNIDADE UNIDADE 1 2 3 4 5 Manipulao de vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 Manipulao de matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Manipulao de registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Tpicos avanados em algoritmos computacionais . . . . 183 Programao estruturada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193

Respostas e comentrios das atividades de autoavaliao . . . . . . . . . . . . . 201 Sobre os professores conteudistas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217

146

Apresentao
Este caderno de atividades corresponde ao material complementar da disciplina de Lgica de Programao II. O material foi elaborado visando a uma aprendizagem autnoma, abordando contedos especialmente selecionados e adotando uma linguagem que facilite seu estudo a distncia. Por falar em distncia, isso no significa que voc estar sozinho. No esquea que sua caminhada nesta disciplina tambm ser acompanhada constantemente pelo Sistema Tutorial da UnisulVirtual. Entre em contato sempre que sentir necessidade, seja por correio postal, fax, telefone, e-mail ou Espao UnisulVirtual de Aprendizagem. Nossa equipe ter o maior prazer em atend-lo, pois sua aprendizagem nosso principal objetivo Bom estudo e sucesso! Equipe UnisulVirtual.

147

Palavras dos professores


Prezado aluno, Voc aprendeu, em Lgica de Programao I, os conceitos iniciais de algoritmos, criao de variveis, tipos de dados, expresses e estruturas seqenciais de deciso e de repetio. Em Lgica de Programao II, estudou novas estruturas, que o auxiliaro na resoluo de problemas, e novas maneiras de representar a informao, como vetores, matrizes, registros, funes. Neste caderno de atividades, voc vai aprimorar seu conhecimento com alguns exerccios resolvidos utilizando todos os conceitos abordados em Lgica de Programao I e II. Mos obra!

UNiDADE 1

Manipulao de vetores
Objetivos de aprendizagem

Conhecer os algoritmos de maiores complexidades. Construir algoritmos com utilizao de vetores.

Universidade do Sul de Santa Catarina

Para incio de estudo


Na Unidade referente Lgica de Programao II, voc aprendeu a manipular vetores, que nada mais do que uma varivel que pode armazenar vrios valores de mesmo tipo. Neste caderno de atividades, vamos apresentar alguns exerccios resolvidos passo a passo e, ao fim da unidade, exerccios propostos para a sua resoluo. Bom trabalho!

Exemplos resolvidos
1) Leia um conjunto N de nmeros armazenados em um vetor, que representa alturas de pessoas. Calcule e escreva: a) mdia aritmtica; c) a maior altura; b) quantas pessoas possuem altura acima da mdia; d) quantas pessoas possuem a maior altura. Algoritmo AlturaPessoas
Altura : vetor[9999] real I, N, TotalAcimaMedia, TotalMaiorAltura: inteiro MediaAltura, MaiorAltura: real Incio {L o total de alturas armazenadas no vetor Altura} Leia (Digite o total de pessoas,N) {Inicializar a varivel Soma, que contm a soma de todas as alturas, para no final calcular a mdia} Soma 0

152

Lgica de Programao II

{Iniciamos com um valor bem BAIXO, para garantir que encontraremos uma altura MAIOR que essa no vetor} MaiorAltura -1 {Iniciamos o lao} Para I de 1 at N faa {leitura do vetor de alturas} Leia Digite a altura, ALTURA [I] {Somamos a altura das pessoas, para depois calcularmos a mdia} Soma Soma + Altura[I] {Se a altura da pessoa atual (Altura[I]) for MAIOR que a maior altura at agora ento, aquela passa a ser a maior altura} Se Altura[I] > MaiorAltura Ento MaiorAltura Altura[I] Fim Se Fim Para {Calcula a mdia das alturas} MediaAltura Soma / N {Inicializando as variveis que so contadores} TotalAcimaMedia 0 TotalMaiorAltura 0 {Novamente iniciamos o lao, para verificar quem tem altura maior que a mdia e quem tem a maior altura} Para I de 1 at N faa {Aqui iremos verificar o total de pessoas que tm a altura acima da mdia} Se Altura[I]>MediaAltura ento TotalAcimaMedia TotalAcimaMedia + 1 Fim Se {Agora vamos verificar o total de pessoas que tm a maior altura} Se Altura[I]= MaiorAltura ento TotalMaiorAltura TotalMaiorAltura + 1 Fim Se Fim Para

Unidade 1

153

Universidade do Sul de Santa Catarina

{Escrevendo os dados de sada} Escreva(Mdia das alturas: + MediaAltura) Escreva(Total de pessoas com altura acima da mdia: + TotalAcimaMedia) Escreva(A maior altura : + MaiorAltura) Escreva(Total de pessoas com a maior altura : +TotalMaiorAltura) Fim

2) Faa 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 tambm: a) imprimir as idades dos homens e depois as idades das mulheres; b) imprimir as mdias de idade de cada sexo; c) encontrar o homem mais velho e coloc-lo na posio 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] inteiro I, N, PosMaisJovem, IdadeMaisNova, PosMaisVelho, IdadeMaisVelho: inteiro MediaIdadeHomens, MediaIdadeMulheres: real Incio I 1 {L a idade da primeira pessoa j fora do lao, para que a condio do comando enquanto-faa possa ser verificada} Leia (Digite a idade,Idade[I])

154

Lgica de Programao II

{Enquanto o usurio digitar nmeros maiores que -1, o lao continua girando e, conseqentemente, lendo a Idade e o Sexo de outra pessoa.} Enquanto Idade[I] > -1 faa Leia(Digite o sexo,Sexo[I]) I I + 1 {Antes de o lao retornar, preciso ler a idade de outra pessoa. Veja que a leitura da Idade da primeira pessoa foi realizada fora do lao} Leia(Digite um valor para a idade ou -1 para finalizar,Idade[I]) Fim Enquanto {Aqui descobrimos quantos dados foram realmente lidos (N) j que no sabamos de antemo} , N I - 1 {Escreve a idade de todos os homens. Aproveita o lao 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 faa Se Sexo[I] = 1 Ento {Escrevemos a idade de cada homem} Escreva (Idade[I]) {Somamos a idade de cada homem para depois calcular a mdia} Soma Soma + Idade[I] {Se a idade do Homem atual (Idade[I]) for MAIOR que a idade do mais velho at agora ento, aquele passa a ser o mais velho. A posio atual no vetor guardada em PosMaisVelho} Se Idade[I] > IdadeMaisVelho Ento IdadeMaisVelho Idade[I] PosMaisVelho I Fim Se Fim Se Fim Para {Calcula a mdia de idade dos homens} MediaIdadeHomens Soma / N

Unidade 1

155

Universidade do Sul de Santa Catarina

{Trocando de posio o homem mais velho com a primeira posio em que aparece homem} I 1 Enquanto |<=N faa Se Sexo[I]=1 Ento {guardo a primeira idade do homem em uma varivel auxiliar} Aux Idade[I] {coloco a idade do homem mais velho na primeira posio do homem} Idade[I] Idade[PosMaisVelho] {coloco a primeira idade do homem no local do mais velho} Idade[PosMaisVelho] Aux {para parar a repetio. No precisa achar outra idade, basta a primeira. A troca j foi realizada.} I N Fim se I I + 1 Fim enquanto {Escreve a idade de todas as mulheres. Aproveita o lao 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 faa Se Sexo[I] = 0 Ento {Escrevemos a idade de cada mulher} Escreva (Idade[I]) {Somamos a idade de cada mulher para depois calcularmos a mdia} Soma Soma + Idade[I] {Se a idade da Mulher atual (Idade[I]) for MENOR que a idade da mais nova at agora ento, aquela passa a ser a mais nova. A posio atual no vetor guardada em PosMaisNova} Se Idade[I] < IdadeMaisNova Ento IdadeMaisNova Idade[I] PosMaisNova I Fim se Fim Se Fim Para {Calcula a mdia de idade das mulheres} MediaIdadeMulheres Soma / N {Trocando de posio a mulher mais nova com a primeira posio em que aparece mulher} I 1 Enquanto |<=N faa Se Sexo[I]=1 Ento {guardo a primeira idade da mulher em uma varivel auxiliar} Aux Idade[I] {coloco a idade da mulher mais nova na primeira posio da mulher} Idade[I] Idade[PosMaisNova]

156

Lgica de Programao II

{coloco a primeira idade da mulher no local da mais nova} Idade[PosMaisVelho] Aux {para parar a repetio. No precisa achar outra idade, basta a primeira. A troca j foi realizada.} I N Fim se I I + 1 Fim enquanto {Escrevendo dados de sada} Escreva(Mdia de idade dos homens: , MediaIdadeHomens) Escreva(Mdia de idade das mulheres: , MediaIdadeMulheres) Escreva(A idade do homem mais velho : , IdadeMaisVelho, sua posio no vetor : , PosMaisVelho) Escreva(A idade da mulher mais nova : , IdadeMaisNova, sua posio no vetor : , PosMaisNova) Fim

3) Um concurso foi realizado por um nmero no conhecido de candidatos e constou de 50 questes, cada uma contendo 5 opes. Cada candidato teve o seu nmero e respostas registradas. Sabendo o gabarito da prova, faa um algoritmo que imprima o nmero do candidato e o total de acertos de cada candidato.
{Iniciamos o desenvolvimento deste algoritmo definindo quatro variveis: V _ Respostas: Um vetor de cinqenta posies que armazenar as respostas de cada questo. V _ Gabarito: Um vetor de cinqenta posies que armazenar os resultados de cada candidato. NumeroDoCandidato: usado para identificar o candidato. Continuar: uma varivel lgica usada no lao de repetio.}

Unidade 1

157

Universidade do Sul de Santa Catarina

Algoritmo Concurso
V _ Respostas, V _ Gabarito : Vetor[50] Literal NumeroDocandidato, X, ContadorAcertos : numrico Continuar : Lgico Incio {Primeiramente, as variveis devem apresentar os valores necessrios; aps, solicitamos a digitao do gabarito} Continuar V Para X de 1 at 50 faa Leia (V _ Gabarito[X]) Fim Para {Aps a digitao do gabarito, podemos desenvolver a correo das provas; para isso usamos um lao de repetio enquanto; este usado porque no sabemos o nmero correto de candidatos} Enquanto (Continuar) faa {Leitura do nmero do candidato e um lao de repetio para ler suas respostas} Leia (NumeroDocandidato) Para X de 1 at 50 faa Leia (V _ Respostas[X]) Fim Para {Agora vamos comparar os resultados de cada questo do candidato com o gabarito} ContadorAcertos 0 {para cada candidato vamos inicializar dentro do lao enquanto} Para X de 1 at 50 faa Se V _ Gabarito[X] = V _ Respostas[X] ento ContadorAcertos ContadorAcertos +1 Fim Se Fim para {Impresso dos resultados deste candidato e a leitura da varivel usada como sinalizador de parada Continuar} Escreva (NumeroDocandidato) Escreva (ContadorAcertos) Escreva (Digite V para avaliar mais um candidato ou F para parar) Leia (Continuar) Fim Enquanto Fim

158

Lgica de Programao II

Atividades propostas
1) Analise o algoritmo a seguir e mostre o desenvolvimento do mesmo por meio de um teste de mesa (execuo passo a passo do algoritmo).
Algoritmo Teste I: inteiro V: Vetor[5] inteiro Para I de 1 at 5 faa V[I] I+1 Fimpara V[3] V[1]+V[5] V[5] V[V[2]] Para I de 1 at 5 faa Escreva (V[I]) Fim para

Incio

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 nmero do seu carto e um vetor de Respostas de 13 posies. Verifique para cada apostador o nmero de acertos, comparando o vetor de Gabarito com o vetor de Respostas. Escreva o nmero do apostador e o nmero de acertos. Se o apostador tiver 13 acertos, mostre a mensagem Ganhador.

Unidade 1

159

Universidade do Sul de Santa Catarina

3) Escreva um algoritmo que leia um vetor de 20 posies e mostre-o. Em seguida, troque o primeiro elemento pelo ltimo, o segundo pelo penltimo, o terceiro pelo antepenltimo, e assim sucessivamente. Mostre o novo vetor depois da troca.

4) Faa um algoritmo que leia um vetor (A) de 100 posies. Em seguida, compacte o vetor retirando os valores nulos e negativos. Coloque o resultado no vetor B.

160

UNiDADE 2

Manipulao de matrizes
Objetivos de aprendizagem

Entender o conceito de matrizes. Conhecer e praticar montagens de matrizes. Construir algoritmos com utilizao de matrizes.

Universidade do Sul de Santa Catarina

Para incio de estudo


Nesta unidade, voc estudou as matrizes, que nada mais so que variveis bidimensionais (com 2 ndices). Em muitos problemas, torna-se impossvel a utilizao de variveis simples para guardar vrias informaes. Na unidade anterior, voc viu que os vetores (variveis unidimensionais) permitem manipular vrias informaes em uma nica varivel de mesmo tipo de dados. Esse conceito tambm serve para uma matriz. Em alguns problemas o uso de vetores torna-se trabalhoso e, com a utilizao de matrizes, pode facilitar a resoluo do problema.

Exemplos resolvidos
1) Um fazendeiro anotou as produes de leite, em litros, de cada uma de suas dez melhores vacas, durante 30 dias e montou a Tabela 1 abaixo esquematizada: Tabela 1- Produes de leite
VACA DIA 1

1
15.5 18.2 16.2

2
18.5 15.2 12.2

3
10.2 9.9 10.9

4
18.3 15.0 16.2

5
20.3 19.9 20.0

6
15.2 20.2 17.2

7
9.5 12.9 13.3

8
13.2 15.4 16.2

9
11.2 13.4 12.2

10
23.4 25.4 24.9

2 3

30

15.6

11.0

10.9

16.3

18.9

17.2

15.2

14.2

12.6

23.9

Faa um algoritmo que: a) leia e armazene os dados; b) imprima as produes da vaca 5 e a da vaca 8 no ms; c) imprima a produo total do dia 10 com a do dia 20; d) registre quantos litros de leite o fazendeiro tirou no ms.
162

Lgica de Programao II

Algoritmo Leite
Leite: matriz[30,10] real vaca5,vaca8,linha,coluna,dia10e20,dia01a30 : inteiro

Incio

{Inicializao dos acumuladores.} vaca5 = 0 vaca8 = 0 dia10e20 = 0 dia01a30 = 0 {Leitura e armazenamento da matriz} {As produes de leite acima so, claramente, dados de mesma natureza que podem ser armazenados numa matriz tipo numrico de 30 linhas por 10 colunas, perfazendo um total de 300 posies de memria. Caso no armazenssemos em matriz, teramos 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 repetio e chamando de LINHA o primeiro ndice, que varia de 1 a 30, e outra estrutura de repetio embutida dentro da primeira, chamando, assim, o segundo ndice de COLUNA, que varia de 1 a 10, para cada valor assumido por LINHA, teramos: LINHA = 1, o segundo ndice assume valores 1, 2,..., 10 LINHA = 2, o segundo ndice assume valores 1, 2,..., 10 ... LINHA = 30, o segundo ndice assume valores 1, 2,..., 10 Assim a leitura da matriz acima ficaria:} Para linha de 1 a 30 faa Para coluna de 1 a 10 faa Leia (leite[linha, coluna]) Fim Para {Como se observa, cada execuo do comando LEIA l primeiramente uma linha da matriz. Quando a LINHA for 2, estar lendo a segunda linha} Fim Para

Unidade 2

163

Universidade do Sul de Santa Catarina

{Produes da vaca 5 e da vaca 8} {O que se deseja na realidade a soma da 5a. coluna e a soma da 8a. coluna. Ento, basta zerar um acumulador para a vaca 5 e outro para a vaca 8 e percorrer todas as linhas da matriz, somando os elementos da coluna 5 e os da coluna 8, isto , o primeiro ndice, que indica a linha, varia de 1 a 30, enquanto o segundo fica constante, valendo ou 5 ou 8} Para linha de 1 at 30 faa vaca5 = vaca5 + leite[linha,5] vaca8 = vaca8 + leite[linha,8] Fim Para {Produo total do dia 10 com a do dia 20.} {Nesse caso devem-se somar as produes 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 faa dia10e20 = dia10e20 + leite(10, col) + leite(20, col) Fim Para {Producao total do ms.} {A produo total de leite do ms 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. Ento, a varivel LINHA assumir valores de 1 a 30 e para cada valor assumido por LINHA, a varivel COLUNA assumir valores de 1 a 10} Para linha de 1 a 30 faa Para coluna de 1 a 10 faa dia01a30 = dia01a30 + leite(linha, coluna) Fim Para Fim Para {Impresso dos resultados} Escreva(Produo da vaca nmero 5 : , vaca5) Escreva(Produo da vaca nmero 8 : , vaca8) Escreva(Produo do dia 10 com a do dia 20: , dia10e20) Escreva(Produo total do ms : , dia01a30) Fim

164

Lgica de Programao II

2) Faa um algoritmo que: a) Leia uma matriz A de ordem N X M. b) Some todos os elementos da matriz e escreva o resultado na tela. c) Some os elementos pares da matriz e escreva o resultado na tela. d) Escreva uma mensagem, caso a matriz seja quadrada. OBS: Uma matriz quadrada quando o nmero de linhas igual ao nmero de colunas. e) Expresse os elementos da diagonal principal. f) Expresse a soma dos elementos da diagonal secundria. g) Expresse a soma de cada linha da matriz mostrando o resultado na tela. h) Expresse a soma da linha 3. Algoritmo MatrizNumerica
A: Matriz[999,999] inteiro {ou ainda poderamos declarar assim: A: Matriz[999x999] inteiro ou A: Matriz[999][999] inteiro ou, em vez de escrever Matriz, pode ser escrito Vetor, assim: A: Vetor[999,999] inteiro, ou ainda: A:Array[999,999] inteiro} I, J, N, M, Soma, SomaPar, SomaDS, SomaLinha, SomaLinha3 : inteiro Incio {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 faa Para J de 1 at M faa Leia (A[I, J]) Fim Para Fim Para

Unidade 2

165

Universidade do Sul de Santa Catarina

{Processo para somar os valores da matriz} Soma 0 Para I de 1 at N faa Para J de 1 at M faa Soma Soma + A[I,J] Fim Para Fim Para {Processo para somar os valores pares da matriz} SomaPar 0 Para I de 1 at N faa Para J de 1 at M faa {Verifica se o valor da matriz par. par quando o resto da diviso do valor por 2 for igual a zero} Se (RESTO (A[I,J],2) = 0) ento SomaPar SomaPar + A[I,J] Fim se Fim Para Fim Para {Processo para verificar se uma matriz quadrada} Se N = M ento Escreva (Matriz quadrada.) {Matriz quadrada tem diagonal principal e secundria. Agora vou mostrar na tela os valores da diagonal principal. diagonal principal quando I for igual a J} Para I de 1 at N faa Escreva (Diagonal Principal : , A[I,I] Fim Para {Agora some os elementos da diagonal secundria. diagonal secundria quando I + J for igual a N+1, ou de N=total de linhas} SomaDS SomaDS + 1 Para I de 1 at N faa Para J de 1 at M faca Se (I+J = N+1) ento SomaDS SomaDS + A[I,J] Fim se Fim Para Fim Para Seno Escreva (Matriz no quadrada.) Fim se

166

Lgica de Programao II

{Processo para somar cada linha da matriz} Para I de 1 at N faa SomaLinha 0 {a cada nova linha inicializo a soma} Para J de 1 at M faa 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 faa {Fixo a linha 3, ou seja, no lugar do I coloco 3 e percorro toda a coluna J} SomaLinha3 SomaLinha3 + A[3,J] Fim Para {Resultado} Escreva ,Soma) (A soma dos elementos da matriz :

Escreva (A soma dos elementos pares da matriz : ,SomaPar) Escreva (A soma dos elementos da diagonal secundria da matriz : ,SomaDS) Escreva (A soma dos elementos da linha 3 da matriz : ,SomaLinha3) Fim

Unidade 2

167

Universidade do Sul de Santa Catarina

3) Dada uma matriz de ordem N x N, faa um algoritmo que verifique se a matriz simtrica (aij=aji). Algoritmo MatrizSimetrica
A: Matriz [N,M] inteiro {tambm posso declarar, como N e M, quando no sei o tamanho. Mas cuidado com esse tipo de declarao, pois algumas linguagens no suportam} I, J, N, M : inteiro Simetrica : Lgica Incio {Leitura da ordem da matriz} Leia (N) {Leitura dos valores da matriz} Para I de 1 at N faa Para J de 1 at N faa Leia (A[I, J]) Fim Para Fim Para {Processo para descobrir se a matriz simtrica ou no} I 1 {A princpio consideramos a matriz como simtrica} Simetrica Verdadeiro Enquanto I < N faa {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 posio simtrica na diagonal inferior. Observe o comando Se a seguir.} J I + 1 Enquanto J < N faa Se A[I, J] <> A[J, I] ento {Se um dos valores for diferente, podemos, com certeza, afirmar que a matriz NO simtrica} Simetrica Falso

168

Lgica de Programao II

{Se j sabemos que a matriz NO simtrica, ento no preciso comparar os demais valores; por isso, foi atribudo o valor N, tanto para I como para J, para que os dois laos terminem} J N I N Fim Se J J + 1 Fim Enquanto I I + 1 Fim Enquanto {Neste momento a varivel Simtrica tem o valor Verdadeiro, ou Falso. Com base nesse valor, se escreve o resultado} Se Simetrica ento Escreva (A matriz simtrica) Seno Escreva (A matriz NO simtrica) Fim Se Fim

4) Dada uma matriz 10 x 10 de valores reais, faa um algoritmo que faa a leitura desses valores e, ao final da leitura de todos, imprima o relatrio com os seguintes itens: a) soma dos valores de cada coluna da matriz; b) lista dos valores que so menores que a mdia dos valores; c) soma dos elementos da diagonal secundria.
{O trabalho com matrizes praticamente todo baseado em comandos de repetio, e, como o tamanho da matriz conhecido, usa-se praticamente sempre o comando Para-faa. No caso a seguir, ser definida uma matriz de tamanho 10x10.}

Unidade 2

169

Universidade do Sul de Santa Catarina

Algoritmo Matriz
{Primeiramente sero definidas as variveis necessrias. Nesse caso, as variveis novas incluem um vetor, de nome SomaColuna, com 10 posies, que ser usado para obter o somatrio de cada coluna da matriz e uma varivel Mat, que representa uma matriz 10x10.} I, J : inteiro SomaTotal, Media : real SomaDiagSecund : real Mat : matriz[10,10] real SomaColuna : Vetor[10] real Incio {Como voc viu anteriormente, o processo de leitura dos dados em matrizes baseado em comandos de repetio. Voc ver, a seguir, que so necessrios sempre dois laos de repetio: o primeiro para navegao nas linhas, e o segundo, para navegao nas colunas} {No exemplo de leitura a seguir, a matriz ser preenchida linha a linha, na seguinte seqncia: 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 clulas, soma esta que ser utilizada mais tarde para o clculo da mdia} SomaTotal 0 Para I de 1 at 10 faa Para J de 1 at 10 faa Leia (Mat[I,J]) SomaTotal SomaTotal + Mat[I,J] Fim Para Fim Para {Para efetuar a soma das colunas, recorreu-se ao mesmo processo, porm foi invertida a ordem de navegao, variveis I e J. Assim, a navegao 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 faa SomaColuna[I] 0 {inicializo cada coluna com 0} Para I de I at 10 faa SomaColuna[I] SomaColuna[I] + Mat[I,J] Fim Para Fim Para

170

Lgica de Programao II

{Para a navegao em uma diagonal, foi usado um artifcio matemtico; como os nmeros so inversamente proporcionais, ser preciso apenas um lao de repetio} SomaDiagSecund 0 Para I de 1 at 10 faa SomaDiagSecund SomaDiagSecund + Mat[I, (11-I) ] Fim Para {A sada de dados deste algoritmo no to simples como nos outros. Para que se possam escrever os dados solicitados so necessrios tambm alguns laos de repetio} {Para escrever os valores das somas das colunas, foi construdo um lao que percorre o vetor SomaColuna escrevendo o contedo de cada posio} Para I de I at 10 faa Escreva (Soma da coluna,I, : , SomaColuna[I]) Fim Para {Calculando a mdia} Media = SomaTotal / 100 {Aps encontrar a mdia, necessrio percorrer novamente a matriz, comparando cada uma das posies com a mdia. Assim, possvel escrever somente aquelas que so menores que ela.} Para I de 1 at 10 faa Para J de I at 10 faa Se Mat[I,J] < Media ento Escreva (Mat[I,J]) Fim se Fim Para Fim Para {A soma da diagonal secundria foi calculada j na navegao. Ento para esse caso no ser preciso de nenhum lao de repetio} Escreva(Soma diagonal secundria :, SomaDiagSecund)

Fim

Unidade 2

171

Universidade do Sul de Santa Catarina

Atividades propostas
1) Considere a matriz M: O E R A Q * E * * E U * I S T S

Agora responda: qual ser a sua configurao aps a execuo do algoritmo a seguir?
Algoritmo Matriz Variveis I,J: inteiro M: Matriz[4x4] literal Aux: literal Incio Para I de 1 at 4 faa Para J de 1 at 4 faa Ler (M[I,J]) Fim Para Fim Para Para I de 1 at 4 faa Para J de I+1 at 4 faa Aux M[I,J] M[I,J] M[J,I] M[J,I] Aux Fim Para Fim Para Aux M[1,1] M[1,1] M[4,4] M[4,4] Aux Aux M[2,2] M[2,2] M[3,3] M[3,3] Aux Fim

172

Lgica de Programao II

2) Escreva um algoritmo que l uma matriz M (12,13) e divida todos os 13 elementos de cada uma das 12 linhas de M pelo maior elemento em mdulo daquela linha (escreva a matriz lida e a modificada).

3) Elabore um algoritmo que l uma matriz M (6x6) contendo valores numricos, e um valor A. Multiplicar M por A, armazenando os valores resultantes em vetor. Escreva o vetor ao final.

Unidade 2

173

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 secundria; d) a linha 5 pela coluna 10. Escreva a matriz assim modificada (Diagonal principal e diagonal secundria). Principal X X X X X X X Secundria X

174

UNiDADE 3

Manipulao de registros
Objetivos de aprendizagem

Entender o conceito de registro ou estrutura. Conhecer e praticar montagens de registros. Criar novos tipos de variveis.

Universidade do Sul de Santa Catarina

Para incio de estudo


Manipular registros nada mais que trabalhar com dados relacionados logicamente, porm de tipos de dados diferentes. Ou seja, visa a facilitar o agrupamento de variveis que no so do mesmo tipo, mas que guardam estreita relao lgica; por exemplo, o cadastro (nome, telefone, sexo, endereo, nmero de dependentes, idade, cidade, etc) de funcionrios de uma empresa.

Exemplos resolvidos
1) Crie um cadastro de funcionrios com as seguintes informaes: nome, idade, salrio, endereo. O cadastro de Endereo deve conter: rua, nmero e cidade. Aps, crie um algoritmo para ler as informaes de N funcionrios. Conte quantos funcionrios so de So Paulo. Algoritmo Empresa
{Como so dois cadastros, preciso ento, criar dois tipos} Tipo TENDEREO: registro Rua, Cidade :literal Nmero :inteiro Tipo TFUNCIONRIO: registro Nome, sexo: literal Salario: real Endereco: TEndereco Idade: inteiro {aqui informado que a varivel Endereco do tipo TEndereco} Var {Agora, ser declarada a varivel FUNCIONARIO, que um vetor do tipo TFuncionrio, na qual contm todas as informaes do funcionrio} FUNCIONARIO: Vetor[9999] TFUNCIONARIO N, cont, I : inteiro Incio Leia (Digite o total de funcionrios: ,N) Para I de 1 at N faa {Para acessar a informao nome, que um componente do tipo TFuncionrio, fao da seguinte forma:}

176

Lgica de Programao II

Leia Leia Leia Leia

(FUNCIONARIO[I].Nome) (FUNCIONARIO[I].Idade) (FUNCIONARIO[I].Salario) (FUNCIONARIO[I].Sexo)

{Como o endereo um tipo tambm, para acessar a rua, por exemplo, ser feito da seguinte forma:} Leia (FUNCIONARIO[I].Endereco.Rua) Leia (FUNCIONARIO[I].Endereco.Nmero) Leia (FUNCIONARIO[I].Endereco.Cidade) Fim Para {Clculo para contar quantos funcionrios so de So Paulo} cont 0 Para I de 1 ate N faa Se (FUNCIONARIO[I].Endereco.Cidade=So Paulo) ento cont cont + 1 Fim se Fim Para Escreva(Total de funcionrios de So Paulo :,cont) Fim

2) Imagine uma eleio onde haja 5 candidatos; voc deve gerar um relatrio parcial do andamento: a cada parcial, voc deve fornecer o nome do partido, o nome do candidato, o nmero do candidato e sua contagem de votos. Faa um algoritmo que seja usado para um nmero desconhecido de parciais. Algoritmo eleio
{Declarao de um registro com as variveis utilizadas em cada parcial; necessrio, pois, que os dados sejam relacionados e de tipos diferentes} tipo parcial = registro Partido: literal Candidato: inteiro Nome: Literal Votos: inteiro Fim-registro

Unidade 3

177

Universidade do Sul de Santa Catarina

{Como possumos cinco candidatos para cada relatrio de parciais, sero necessrios, ento, cinco conjuntos de dados, e a criao de um vetor facilitar a manipulao dos dados} relatrio: vetor[5] parcial {declarao de um vetor de parciais} X : inteiro Incio Para X de 1 at 5 faa Leia (relatrio[X].Partido) Leia (relatrio[X].Candidato) Leia (relatrio[X].Nome) Leia (relatrio[X].Votos) Fim Para Escreva (Impresso do relatrio de parciais:) Para X de 1 at 5 faa Escreva (Partido: , relatrio[X].Partido) Escreva (Canditato:, relatrio[X].Nome) Escreva (Numero: , relatrio[X].Candidato) Escreva (Votos: , relatrio[X].Votos) Fim Para Fim

3) Faa um algoritmo para ler nome, idade, altura, sexo, e as cinco (5) notas de 100 alunos e armazene estas informaes num vetor usando registro. Depois da leitura escreva um relatrio contendo nome e idade de todas as pessoas do sexo feminino que obtiveram mdia superior a 8.0. Algoritmo Aluno
Tipo ALUNO = registro Nome: literal Idade, Sexo: inteiro {Sexo 0-Feminino 1-Masculino} Altura: real {Observe que uma das partes do registro um vetor} Notas: Vetor[5] real Fim _ registro CAD _ ALUNOS: Vetor[100] ALUNO I, K: inteiro Soma: real

178

Lgica de Programao II

Incio Para I de 1 at 100 faa 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 so 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 faa Leia(CAD _ ALUNOS[I].Notas[K]) Fim Para Fim Para Para I de 1 ate 100 faa {Se o aluno NO do sexo feminino, ento NEM analisamos} Se (CAD _ ALUNOS[I].Sexo = 0) ento Soma 0 {Soma as 5 notas da aluna atual [I]. Observe a importncia de zerarmos a varivel Soma antes do Para-faa. Assim, garantimos que se faa uma soma nica para aquela determinada aluna} Para K de 1 at 5 faa Soma CAD _ ALUNOS[I].Notas[K] + Soma Fim Para {Calcula a mdia e verifica se ela maior que 8} Se (Soma / 5) > 8 ento {Escreve nome e idade das alunas com mdia superior a 8} Escreva(CAD _ ALUNOS[I].Nome) Escreva(CAD _ ALUNOS[I].Idade)

Fim Se Fim Para Fim

Unidade 3

179

Universidade do Sul de Santa Catarina

Atividades propostas
1) Utilizando os conceitos de vetor e registro, estudados nas unidades 1 e 3 respectivamente, faa um algoritmo para ler nome, salrio, endereo e sexo de 200 funcionrios e armazene estas informaes na memria. Aps a leitura, escreva na tela: a) quantas mulheres possuem salrio maior que R$ 1.000,00; b) qual o maior salrio entre os funcionrios homens; c) a mdia salarial.

180

Lgica de Programao II

2) Monte um algoritmo para cadastrar dados pessoais de 100 candidatos a uma vaga de engenheiro de um sistema de administrao de currculos. Os dados pessoais so: nome, endereo, cidade, estado, telefone, grau de escolaridade (1-Graduao, 2-Ps-graduao, 3Mestrado, 4-Doutorado) e curso em que se formou. Depois da leitura, imprima uma relao dos candidatos que tenham grau de psgraduao ou superior e que residam em SC. Os campos do relatrio devem ser: nome, cidade, telefone, grau de escolaridade e curso de formao.

Unidade 3

181

Universidade do Sul de Santa Catarina

3) Faa um algoritmo que receba as informaes sobre determinado acervo de filmes, ttulo, gnero, autor, durao e sinopse. Alm disso, imprima uma relao de filmes por gnero. Considere que a Pinacoteca tem 3.500 Filmes.

182

UNiDADE 4

Tpicos avanados em algoritmos computacionais


Objetivos de aprendizagem

identificar os comandos e compreender a lgica em pseudocdigo, proposta para resolver o problema.

Universidade do Sul de Santa Catarina

Para incio de estudo


Com esta unidade, voc vai aprimorar seus estudos em tpicos avanados utilizando vetores, como a ordenao de literais, pesquisa simples e pesquisa binria, com explicaes passo a passo da resoluo destes mtodos.

Exemplos resolvidos
Ordenao de literais
1. Faa um algoritmo para ordenar o nome de 50 pessoas.
Algoritmo OrdenarNomes
{Declarando variveis} NOME : Vetor[50] de literal AUX : literal I, J : inteiro Incio {Fazendo a leitura do vetor de nomes}

Para I de 1 at 50 faa {ou ainda poderia: Para I de 0 at 49 faa} Escreva Digite o nome na posio : , I Leia NOME[I] Fim Para {Fazendo a ordenao do vetor de nomes Isso ser explicado aps o algoritmo} Para I de 0 at 49 faa Para J de (I+1) at 49 faa Se NOME[I] > NOME[J] ento 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 0 at 49 faa Escreva NOME[I] Fim Para

Fim

184

Lgica de Programao II

Explicao do Mtodo de Ordenao utilizado


Imagine o vetor chamado NOME e suas posies I, com tamanho 4:
NOME I Jos 0 Marcos 1 Ana 2 Maria 3

importante lembrar que quando se menciona posio est-se referindo a I, e quando mencionado no contedo do vetor, na informao, refere-se a NOME[I]. Qual a idia do algoritmo apresentado anteriormente? Ser utilizado o primeiro nome (Jos), comparando-o com todos os demais, ou seja, ser fixada a posio I=0 e ser comparado o nome Jos com Marcos, Ana e Maria (I=1, 2 e 3). Ento ser colocado o menor nome (Ana) na primeira posio e ser comparada a posio do 2 nome com os demais, e assim por diante. Acompanhe o exemplo.
Para I de 0 at 3 faa {essa primeira estrutura de repetio serve para fixar o primeiro nome (a primeira vez que entra nesse parafaa Jos) a ser comparado com os demais quando I=0. Depois ser com I=1, I=2 e I=3.} Para J de (I+1) at 3 faa {essa segunda estrutura de repetio serve para percorrer os demais nomes a partir daquele que ser fixo, ou seja, se estou na primeira posio I=0, o J ser I+1, ou seja, 1 (depois 2, depois 3, e assim por diante).} Se NOME[I] > NOME[J] ento AUX NOME[I] NOME[I] NOME[J] NOME[J] AUX Fim se {Na estrutura de deciso, SE est sendo comparado NOME[0] > NOME[1] (Jos com Marcos) ou seja, o I=0 e J=1. Verifica-se , se Jos > que Marcos, ou seja, a letra J vem depois de M? No. Ento no h troca. O que ocorre? Volta para o PARA J DE (I+1) AT 3 FAA. Agora o I vale 0 e J est valendo 2.

Unidade 4

185

Universidade do Sul de Santa Catarina

Ento, entro na estrutura de deciso SE e testo NOME[0] > NOME[2]. Jos maior do que Ana? Sim. Ento a troca entre a posio 0 e 2 ser feita.} Meu vetor agora se apresenta assim:

NOME I

Ana 0

Marcos 1

Jos 2

Maria 3

{Volta para o PARA J DE (I+1) AT 3 FAA. Agora o J est valendo 3. Entra na estrutura de deciso SE e testa NOME[0] > NOME[3]. Agora ateno. Vou comparar Ana com Maria. Ana > que Maria? No. No realizada nenhuma troca. Volta para PARA J DE (I+1) AT 3 FAA. J chegou a 3. Ento sai do PARA J e volta para o PARA I, agora o I vale 1. Entra novamente no PARA J DE (I+1) ATE 3 FAA.} I=1 J=I+1 = 2 {Ento ser fixa; fixar a posio 1 e comparar com o restante do vetor a partir da posio 2. Se NOME[1] > NOME[2] ento. verdade? Marcos > Jos? Sim. Ento realiza a troca.} O vetor fica assim agora:

NOME I

Ana 0

Jos 1

Marcos 2

Maria 3

{Volta para o PARA J DE (I+1) AT 3 FAA. Entra no SE e compara NOME[1]>NOME[3]. No. No realizada troca. PARA J j chegou a 3. Ento pra! E vai para o PARA I novamente. O I j chegou a 3? No. O I estava valendo 1 e agora passa a valer 2.}

186

Lgica de Programao II

Entra no PARA J novamente: I=2 J=I+1=3 {Vou comparar NOME[2]>NOME[3], Marcos > Maria? No. Ento no troca. O PARA J j est em 3. Volta para o PARA I.} I=3 J=I+1=4. {No entra no PARA J porque j ultrapassou o limite 3. Volta para o PARA I. Agora o I j chegou a 3.} Observe que o vetor exemplo ficou ordenado.

NOME I
Fim Para Fim Para

Ana 0

Jos 1

Marcos 2

Maria 3

Unidade 4

187

Universidade do Sul de Santa Catarina

Pesquisa
Seqencial ou Linear 1) Dados desordenados Pesquisa Linear Simples
{Este algoritmo representa a forma mais bsica 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 no?} a,n,i: inteiro x: vetor[n] de inteiro {A varivel a representa o nmero procurado} {A varivel n representa o nmero de valores armazenados} Incio Leia (a, n) {Primeiramente, preciso preencher o vetor com os valores; para isso, usamos um lao que pede para o usurio digitar cada um dos valores} Para i de 1 at n faa Leia ( x[ i ] ) Fim Para {Abaixo posicionamos nossa varivel auxiliar i na primeira posio do vetor e ento desenvolvemos um lao procura do primeiro valor que corresponder ao valor procurado} i 1 Enquanto (i<=n) i i + 1 Fim Enquanto E (x[i]<>a) faa

{A seguir, verificamos se o nosso ponteiro est direcionado para uma posio no vetor; se ele estiver apontando para o final, quer dizer que no encontramos nenhum valor correspondente; se estiver no meio, esta corresponde posio do vetor procurado.} Se i > n ento Escreva (No encontrou) Seno Escreva (Encontrou na posio : , i) Fim Se Fim.

188

Lgica de Programao II

2) Dados Ordenados - Pesquisa Binria (para vetores grandes)


{O exemplo abaixo se refere Pesquisa Binria para nmeros inteiros, mas o mtodo pode ser aplicado para tipo de valor, como real e literal.} Algoritmo PesquisaBinaria numeroPesquisa: inteiro {nmero a ser pesquisado} N: inteiro {quantidade de valores no vetor} x: vetor[N] de inteiro {vetor de tamanho n de valores inteiros} incio, meio, final, i: inteiro Incio {A idia central deste mtodo 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 informao, ns redefinimos o incio e o fim 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 redefinindo incio e fim do vetor sucessivamente) at que o valor seja , encontrado, ou no seja mais possvel dividir o vetor; neste ltimo caso, significa que o valor no estava no vetor. Este mtodo especialmente utilizado em vetores GRANDES. Como vimos acima, a vantagem que a cada iterao o tamanho do vetor passa a ter a metade do anterior, e assim sucessivamente, diminuindo, desse modo, o tempo de processamento.} {Leitura do nmero a ser pesquisado e do tamanho do vetor} Leia (numeroPesquisa , N) {Leitura dos valores do vetor} Para i de 1 at N faa Leia ( x [ i ] ) Fim Para {O incio e o final neste ponto representam o tamanho original do vetor} Incio 1 final N Enquanto (incio <= final) faa

Unidade 4

189

Universidade do Sul de Santa Catarina

{Descobrimos qual o meio do vetor} meio (incio + final)/2 {Perguntamos se o nmero a ser pesquisado est na metade da esquerda ou da direita do vetor original (ou do passo anterior) } Se (numeroPesquisa < x[meio] ) ento {O nmero est na metade esquerda, redefino o final} Final meio - 1 Seno Se (numeroPesquisa > x[meio] ) ento {O nmero est na metade direita, redefino o incio} Incio final + 1 Seno {Nesta opo, o nmero foi encontrado, ento atribumos varivel incio um valor tal, para que o lao TERMINE de girar} Incio final + 1 {artifcio para interromper o lao} Fim Se Fim Se Fim enquanto {Se samos do lao e x[meio] diferente do numeroPesquisa, ento NO encontramos, seno... (x[meio] igual a numeroPesquisa, ento ENCONTRAMOS} Se (x[meio] <> numeroPesquisa) ento Escreva (No Encontrou) Seno Escreva (Encontrou na posio : , meio) Fim Se Fim

190

Lgica de Programao II

Atividades propostas
1) Faa um algoritmo para ler um vetor X com N elemento. Leia um valor A qualquer. Verifique se este valor pertence ao vetor. Se pertencer, mostre uma mensagem na tela. E informe quantas vezes ele aparece e em quais posies. Caso no exista, escreva uma mensagem.

Unidade 4

191

Universidade do Sul de Santa Catarina

2) Faa um algoritmo para ler um vetor com 500 valores inteiros e verificar se um determinado valor N est ou no dentro dele. Escreva uma mensagem dizendo se encontrou ou no o valor.

192

UNiDADE 5

Programao estruturada
Objetivos de aprendizagem

Entender os conceitos de programao estruturada. Aplicar modularizao aos algoritmos.

Universidade do Sul de Santa Catarina

Para incio de estudo


A realizao de uma determinada tarefa muitas vezes decomposta em seqncias de passos. Lembre-se da tarefa de trocar uma lmpada: existe uma srie de passos que devem ser seguidos. Conforme uma tarefa cresce e se torna mais complexa, surge uma srie de situaes a serem resolvidas para que esse problema possa ser solucionado. Podemos dizer que passamos a ter dentro deste problema uma srie de probleminhas. Muitas vezes, essa grande quantidade de probleminhas afeta a legibilidade (clareza), fazendo com que uma consulta ou manuteno futura dessa lgica seja uma tarefa difcil de se realizar. Por meio da modularizao possvel evitar isso, como tambm podemos reutilizar esse probleminha descrito em uma outra tarefa. Portanto, modularizar quebrar um problema em pequenas partes, sendo que cada uma dessas partes ser responsvel pela realizao de uma etapa do problema.

Exemplos resolvidos
1) Dada uma frase, faa uma FUNO que verifique se existe alguma palavra com mais de 7 caracteres. Considere que cada palavra separada da outra por, no mnimo, um espao em branco.
Funo ExistePalavraMaiorQueSete(Frase: literal): lgico K, TamPalavra: inteiro {Observe que Frase o parmetro da funo e ExistePalavraMaiorQueSete o prprio nome da funo que retorna Verdadeiro ou Falso} Incio {Partimos do princpio de que NO existe Palavra com tamanho maior que 7 (sete) } ExistePalavraMaiorQueSete Falso

194

Lgica de Programao II

{Artifcio identificar o final da frase, neste caso a frase est terminando com os caracteres $ (espao e cifro) } Frase Frase + $ K 0 {Vale lembrar que um literal pode ser manipulado como um VETOR de caracteres, iniciando na posio 0(zero) } TamPalavra 0 Enquanto (NO ExistePalavraMaiorQueSete) (Frase[K] <> $) faa e

{Se o caractere da posio K for diferente de um espao em branco, estamos assumindo que ele est fazendo parte de uma palavra, por isso incrementamos a varivel TamPalavra que guarda esta informao} Se Frase[K] <> Ento TamPalavra TamPalavra + 1 Seno {Neste ponto a palavra terminou e, ento, precisamos testar e seu tamanho} Se TamPalavra > 7 Ento {Se a palavra for maior que sete, j temos nosso resultado, por isso atribumos Verdadeiro varivel para que o lao termine} ExistePalavraMaiorQueSete Seno Verdadeiro

{Neste ponto precisamos zerar a varivel que guarda o tamanho da palavra, para comear a contar o tamanho de outra, visto que essa, neste ponto, no tem tamanho maior que 7(set(} TamPalavra 0 Fim Se Fim Se {Incrementamos a varivel K para acessar o prximo caractere da frase} K K + 1 Fim Enquanto Fim

Unidade 5

195

Universidade do Sul de Santa Catarina

2) Faa um programa para ler o nome e salrio bruto de N funcionrios. Calcule e imprima o valor do desconto do INSS, o valor de desconto do IRRF (se houver) e o valor do salrio lquido do funcionrio. Escreva uma funo para retornar o valor de desconto do INSS e outra funo para retornar o valor de desconto do IRRF.
Tabela de Desconto do INSS
SALRIO BRUTO At R$ 429,00 De R$ 429,01 at R$ 540,00 De R$ 540,01 at R$ 715,00 De R$ 715,01 at R$ 1.430,00 Acima de R$ 1430,00 % DE DESCONTO 7,65 % 8,65 % 9,00 % 11,00 % R$ 157,00 (teto de contribuio)

Tabela de Desconto do IRFF


SALRIO BRUTO At R$ 1.058,00 De R$ 1.059,00 a R$ 2.115,00 Acima R$ 2.115,00 % DE DESCONTO Isento 15% 27,5%

{Programa Principal; neste, precisamos apenas das chamadas para as funes} Algoritmo salrio NumDeFunc: inteiro SalBruto, DescINSS, DescIRRF, SalLiq: real Incio Leia (SalarioBruto) Leia (NumDeFunc) DescINSS CalculaINSS(SalarioBruto) DescIRRF CalculaIRRF (SalarioBruto) SalLiq = SalarioBruto DescINSS DescIRRF Escreva (O salrio Liquido :, SalLiq) Fim

196

Lgica de Programao II

{Esta a funo para calcular o valor do desconto de IRRF} Funo CalculaIRRF (SalarioBruto:real): real Incio Se SalarioBruto <= 1058 ento DescIRRF = 0 Seno Se SalarioBruto <= 2115 ento DescIRRF = SalarioBruto * 0,15 Seno DescIRRF = SalarioBruto * 0,275 Fim Se Fim Se Retorna DescIRRF Fim {Esta a funo para calcular o valor do desconto de INSS} Funo CalculaINSS(SalarioBruto:real): real Incio Se SalarioBruto <= 429 ento DescINSS = SalarioBruto * 0,0765 Seno SE SalarioBruto <= 540 ento DescINSS = SalarioBruto * 0,0865 Seno SE SalarioBruto <= 715 ento DescINSS = SalarioBruto * 0,0900 Seno SE SalarioBruto < 1.430 ento DescINSS = SalarioBruto * 0,1100 Seno DescINSS = 157,00 Fim SE Fim Se Fim Se Fim Se Retorna DescINSS Fim

Unidade 5

197

Universidade do Sul de Santa Catarina

Atividades propostas
1) Voc estudou, em nossa disciplina, modularizao ou sub-rotinas e descobriu que uma funo dita como sendo uma sub-rotina ou mdulo do algoritmo principal. A partir do exemplo supermercado abaixo, faa uma funo chamada CALCDESCONTO que receba como parmetro o cdigo de um produto e seu valor. Esta funo deve retornar o novo valor do produto, com as seguintes regras:

caso o produto tenha o cdigo ABC, ser concedido um desconto de 4,5% (quatro e meio por cento); caso o produto tenha o cdigo 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 no se enquadre em nenhum desses cdigos, ele no receber desconto;

Exemplo supermercado: Um cliente foi a um supermercado e comprou N produtos, sendo informado que, dependendo do cdigo do produto, ele receberia um desconto. Faa um algoritmo pedindo que o usurio digite as informaes de N produtos: seu valor e o seu cdigo. Aps a digitao, mostre na tela, o valor total que foi pago pelo cliente, considerando os possveis descontos (utilize a funo CALCDESCONTO neste algoritmo).

198

Lgica de Programao II

2) Faa uma funo chamada EhPrimo que receba um valor e retorne 1, caso o nmero seja primo, ou 0, em caso contrrio. Um nmero N primo quando no divisvel por nenhum valor (exceto 1) at N/2. Quando se encontrar um valor pelo qual N divisvel, a funo pode parar a busca e considerar o nmero no primo.

3) Faa um programa que calcule a rea e o permetro do retngulo. Modularize esse programa, ou seja, divida-o em funes adequadamente.

Unidade 5

199

Respostas e comentrios das atividades de autoavaliao


Unidade 1
1) Analise o algoritmo abaixo e mostre o desenvolvimento do mesmo mediante teste de mesa.
Algoritmo Teste Var Incio

I:inteiro V: Vetor[5] inteiro Para I de 1 at 5 faa V[I] I+1 Fim Para V[3] V[1]+V[5] V[5] V[V[2]] Para I de 1 at 5 faa Escreva (V[I]) Fim Para

Fim

Resposta:
I=1 V[1] = 2 V[3] = 2 + 6 = 8 V[5] = V[V[2]] = V[3] = 4 I=1 V[1] = 2 I=2 V[2] = 3 I=3 V[3] = 8 I=4 V[4] = 5 I=5 V[5] = 4 I=2 V[2] = 3 I=3 V[3] = 4 I=4 V[4] = 5 I=5 V[5] = 6

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 nmero do seu carto e um vetor de Respostas de 13 posies. Verifique para cada apostador o nmero de acertos, comparando o vetor de Gabarito com o vetor de Respostas. Escreva o nmero do apostador e o nmero de acertos. Se o apostador tiver 13 acertos, mostre a mensagem Ganhador. Resposta:
Algoritmo loteriaesportiva Var

Incio Escrever (Informe o gabarito do jogo) Para I de 1 at 13 faa Escreva(1= COLUNA1, 2= COLUNA2, 3= COLUNA DO MEIO) Leia (Gabarito[I]) Fim Para Escrever (Informe o nmero do carto:) Leia (NROCARTAO) CONTACERTOS 0 Escrever (Informe as 13 posies do jogo) Para I de 1 at 13 faa Escreva(1= COLUNA1, 2= COLUNA2, 3= COLUNA DO MEIO) Leia (RESPOSTAS[I]) Se (RESPOSTAS[I] = GABARITO[I]) ento CONTACERTOS CONTACERTOS + 1 Fim Se Fim Para Escrever (Nmero do carto = , NROCARTAO) Escrever (Nmero de acertos = , CONTACERTOS) Se (CONTACERTOS=13) ento Escreva (VENCEDOR) Fim Se Fim

Gabarito, Respostas: Vetor[13] inteiro NROCARTAO, CONTACERTOS, I : inteiro

3) Escreva um algoritmo que leia um vetor de 20 posies e mostre-o. Em seguida, troque o primeiro elemento com o ltimo, o segundo com o penltimo, o terceiro com o antepenltimo, e assim sucessivamente. Mostre o novo vetor depois da troca.

202

Lgica de Programao II

Resposta :
Algoritmo TROCA_TROCA Var

V : VETOR[20] inteiro AUX, I, J : inteiro Incio Escreva (INFORME 20 VALORES) Para I de 1 at 20 faa 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 faa Escrever (V[I]) Fim Para Fim

4) Faa um algoritmo que leia um vetor (A) de 100 posies. 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] inteiro I, J : inteiro Incio Escreva (Informe 100 valores) Para I de 1 at 100 faa Leia (A[I]) Fim Para J 1 Para I de 1 at 100 faa Se (A[I] > 0) ento B[J] A[I] J J + 1 Fim se Fim Para I 1 Enquanto (I<J) faa Escreva (B[I]) I I + 1 Fim enquanto Fim

203

Universidade do Sul de Santa Catarina

Unidade 2
1) Considere a matriz M: O E R A Q * E * * E U * I S T S

Agora responda: qual ser a sua configurao aps a execuo do algoritmo a seguir?
Algoritmo Matriz Variveis I,J: inteiro M: Matriz[4x4] literal Aux: literal Incio Para I de 1 at 4 faa Para J de 1 at 4 faa Ler (M[I,J]) Fimpara Fimpara Para I de 1 at 4 faa Para J de I+1 at 4 faa Aux M[I,J] M[I,J] M[J,I] M[J,I] Aux Fimpara Fimpara Aux M[1,1] M[1,1] M[4,4] M[4,4] Aux Aux M[2,2] M[2,2] M[3,3] M[3,3] Aux Fim

Resposta:
I = 1 J = 2 AUX M[1,2] (Q) M[1,2] M[2,1] (E) M[2,1] AUX (Q) I = 2 J = 3 AUX M[2,3] (E) M[2,3] M[3,2] (E) M[3,2] AUX (E) I = 3 J = 4 AUX M[3,4] (T) M[3,4] M[4,3] (*) M[4,3] AUX (T) I = 1 J = 3 AUX M[1,3] (*) M[1,3] M[3,1] (R) M[3,1] AUX (*) I = 2 J = 4 AUX M[2,4] (S) M[2,4] M[4,2] (*) M[4,2] AUX (S) I = 4 J = 5 NADA ACONTECE I = 1 J = 4 AUX M[1,4] (I) M[1,4] M[4,1] (A) M[4,1] AUX (I)

204

Lgica de Programao 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 (*)

Configurao final: S Q * I E U E S R E * T A * * O

2) Escreva um algoritmo que l uma matriz M (12,13) e divida todos os 13 elementos de cada uma das 12 linhas de M pelo maior elemento daquela linha. Escreva a matriz lida e a modificada. Resposta:
Algoritmo Matriz1 Variveis M : MATRIZ[12,13] inteiro MAIOR : inteiro I, J: inteiro Incio Para I de 1 at 12 faa Para J de 1 at 13 faa Escreva (Informe o valor de M[,I, ,,J, ]:) Leia (M[I,J]) Fim Para Fim Para Para I de 1 at 12 faa MAIOR M[I,1] Para J de 2 at 13 faa Se (M[I,J] > MAIOR ento MAIOR M[I,J] Fim se Fim Para Para J de 1 at 13 faa M[I,J] M[I,J] / MAIOR Fim Para Fim Para Para I de 1 at 12 faa Para J de 1 at 13 faa Escreva (M[ ,I, , J ,]=) Escreva (M[I,J]) Fim Para Fim Para Fim

205

Universidade do Sul de Santa Catarina

3) Elabore um algoritmo que l uma matriz M(6x6) contendo valores reais, e um valor A, do tipo inteiro. Multiplicar M por A, armazenando os valores resultantes em vetor. Escreva o vetor ao final. Resposta:
Algoritmo Matriz2 Variveis M : MATRIZ[6,6] real V : VETOR [36] real A : inteiro K, I, J: inteiro Incio Escrever (Informe um valor inteiro) Leia(A) Para I de 1 at 6 faa Para J de 1 at 6 faa Leia (M[I,J]) Fim para Fim para K 1 Para I de 1 at 6 faa Para J de 1 at 6 faa V[K] M[I,J] * A Escreva (V[K]) K K + 1 Fim Para Fim Para Fim

4) Troque, a seguir: a) a linha 2 pela linha 8; b) a coluna 4 pela coluna 10; c) a diagonal principal pela diagonal secundria; d) a linha 5 pela coluna 10. Escreva a matriz assim modificada (diagonal principal e diagonal secundria). Principal X X X X Resposta: X X X Secundria X

206

Lgica de Programao II

Algoritmo Matriz3 Var

M : MATRIZ[10,10] inteiro AUX, C, K, I, J: inteiro Incio Para I de 1 at 10 faa Para J de 1 at 10 faa Leia (M[I,J]) Fim Para Fim para {Troca a linha 2 pela linha 8} Para J de 1 at 10 faa 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 faa 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 faa AUX M[5,K] M[5,K] M[K,10] M[K,10] AUX Fim Para {Troca a secundria} I 1 J 1 K 10 Repita AUX M[I,C] M[I,K] I I J J K K At (I>10 diagonal principal pela diagonal

M[I,C] M[I,K] AUX + 1 + 1 1 E J >10 E K <1)

Para I de 1 at 10 faa Para J de 1 at 10 faa Escrever (M[I,J]) Fim para Fim Para Fim

207

Universidade do Sul de Santa Catarina

Unidade 3
1) Utilizando os conceitos de vetor e registro, estudados nas unidades 1 e 3 respectivamente, faa um algoritmo para ler nome, salrio, endereo e sexo de 200 funcionrios e armazene estas informaes na memria. Aps a leitura, escreva na tela: a) quantas mulheres possuem salrio maior que R$ 1.000,00; b) qual o maior salrio entre os funcionrios homens; c) a mdia salarial.

Resposta:
Algoritmo RelatorioSalarial Tipo TFUNC = Registro NOME, END, SEXO SALRIO

: literal : real

Fim _ Registro FUNC : vetor [200] TFUNC I, TOTALMUL: inteiro MAIORSAL, MEDIASAL : real Incio {leitura dos dados} Para I de 1 at 200 faa Escreva Digite o nome Leia FUNC[I].NOME Escreva Digite o endereo Leia FUNC[I].END Escreva Digite o sexo Leia FUNC[I].SEXO Escreva Digite o salrio Leia FUNC[I].SALRIO Fim para {Letra A} TOTALMUL0 Para I de 1 at 200 faa Se (FUNC[I].SEXO=F) E SALARIO>1000) ento TOTMULTOTMUL + 1 Fim se Fim Para

(FUNC[I].

208

Lgica de Programao II

{Letra B} MAIORSAL0 Para I de 1 at 200 faa Se (FUNC[I].SEXO=M)E(FUNC[I]. SALARIO>MAIORSAL) ento MAIORSALFUNC[I].SALARIO Fim se Fim Para {Letra C} MEDIASAL0 Para I de 1 at 200 faa MEDIASALMEDIASAL+ FUNC[I].SALARIO Fim Para MEDIASALMEDIASAL/200 {Sada dos dados} Escreva (Total de mulheres com mais de R$ 1.000,00 : , TOTALMUL) Escreva Maior salrio dos homens : , MAIORSAL Escreva Mdia Salarial : , MEDIASAL

Fim

2) Monte um algoritmo para cadastrar dados pessoais de 100 candidatos a uma vaga de engenheiro de um sistema de administrao de currculos. Os dados pessoais so: nome, endereo, cidade, estado, telefone, grau de escolaridade (1-Graduao, 2-Ps-graduao, 3-Mestrado, 4Doutorado) e curso em que se formou. Depois da leitura, imprima uma relao dos candidatos que tenham grau de ps-graduao ou superior e que residam em SC. Os campos do relatrio devem ser: nome, cidade, telefone, grau de escolaridade e curso de formao. Resposta:
Algoritmo PesquisaCandidatos Var {Definio do registro} tipo CADASTRO = registro NOME: literal {Nome do Candidato} ENDERECO: literal {Endereo} CIDADE: literal {Cidade} UF: literal {Unidade da Federao} FONE: literal {Telefone} GRAU : inteiro {Grau de Escolaridade} CURSO : literal {Nome do Curso} Fim-registro

209

Universidade do Sul de Santa Catarina

{Declarao das variveis} CANDIDATOS : vetor[100] CADASTRO K : inteiro {Contador} Incio {Leitura dos dados cadastrais} Para K de 1 at 100 passo 1 faa 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 faa Se (CANDIDATOS[K].UF=SC)E(CANDIDATOS[K]. GRAU > 1) Ento Escreva (CANDIDATOS[K].NOME) Escreva (CANDIDATOS[K].ENDEREO) 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

210

Lgica de Programao II

3) Faa um algoritmo que receba as informaes sobre determinado acervo de filmes, ttulo, gnero, autor, durao e sinopse. Alm disso, imprima uma relao de filmes por gnero. Considere que a Pinacoteca tem 3.500 Filmes. Resposta:
Algoritmo Acervo tipo Filme = registro Ttulo: literal Gnero: literal Autor: Literal Durao: real Sinopse: literal fim-registro Acervo : Vetor [3500] Filme Generodesejado: literal contador : inteiro Incio Para contador de 1 at 3500 faa Leia Acervo[contador].Ttulo Leia Acervo[contador].Genero Leia Acervo[contador].Autor Leia Acervo[contador].Duracao Leia Acervo[contador].Sinopse Fim Para Escreva (Deseja pesquisar algum gnero?) Leia (Generodesejado) Enquanto Genero = sim faa Para contador de 1 at 3500 faa Se Acervo[contador].Genero = Generodesejado Escreva Acervo[contador]. Ttulo Escreva Acervo[contador]. Genero Escreva Acervo[contador]. Autor Escreva Acervo[contador]. Duracao Escreva Acervo[contador]. Sinopse Fim Se Fim Para Escreva (Deseja mais algum gnero?) Leia (Generodesejado ) Fim Enquanto

Fim.

211

Universidade do Sul de Santa Catarina

Unidade 4
1) Faa um algoritmo para ler um vetor X com N elemento. Leia um valor A qualquer. Verifique se este valor pertence ao vetor. Se pertencer, mostre uma mensagem na tela. E informe quantas vezes ele aparece e em quais posies. Caso no exista, escreva uma mensagem. Resposta:
Algoritmo EncontraValor Var

X, Posicoes: vetor[9999] inteiro K, N, cont: inteiro {Leitura dos valores do vetor} Leia (Digite o total de valores do vetor: ,N) Para I de 1 at N faa Leia(X[I]) Fim Para {Leitura do valor a ser pesquisado} Leia (K) {Processamento Encontrar o valor} {Considerarmos inicialmente que NO encontraremos o valor} cont 0 Para I de 1 at N faa Se (X[I] = K) ento {pesquisando o valor no vetor} Posicoes[cont] I {guardando a posio onde o valor se encontra} cont cont + 1 Fim Se Fim Para Se cont = 0 ento Escreva (Valor no encontrado.) Seno {Escrever quantas vezes o valor aparece no vetor} Escreva (Valor encontrado. Ele aparece ,cont, vezes no vetor X) {Escrever as posies em que o valor aparece no vetor}

Inicio

Para I de 1 at cont faa Escreva(Posicoes[I]) Fim Para Fim Se Fim.

212

Lgica de Programao II

2) Faa um algoritmo para ler um vetor com 500 valores inteiros e verificar se um determinado valor N est ou no dentro dele. Escreva uma mensagem dizendo se encontrou ou no o valor. Resposta:
Algoritmo EncontraValor Algoritmo EncontraValor Var Nmeros: vetor[500] inteiro K, N: inteiro Encontrou: lgico Incio {Leitura dos valores do vetor} Para K de 1 at 500 faa Leia(Numeros[K]) Fim Para {Leitura do valor a ser pesquisado} Leia (N) {Processamento Encontrar o valor} {Considerarmos inicialmente que NO encontraremos o valor} Encontrou Falso K 1 Enquanto (No Encontrou) e (K < 500) faa Encontrou Numeros[K] = N K K + 1 Fim Enquanto {Precisamos decidir porque o lao terminou e isso nos garante a resposta.} Se Encontrou ento Escreva(O nmero + N + foi encontrado) Seno Escreva(O nmero + N + No foi encontrado) Fim Se Fim

213

Universidade do Sul de Santa Catarina

Unidade 5
1) Voc estudou, em nossa disciplina, modularizao ou sub-rotinas e descobriu que uma funo dita como sendo uma sub-rotina ou mdulo do algoritmo principal. A partir do exemplo supermercado abaixo, faa uma funo chamada CALCDESCONTO que receba como parmetro o cdigo de um produto e seu valor. Esta funo deve retornar o novo valor do produto, com as seguintes regras:

caso o produto tenha o cdigo ABC, ser concedido um desconto de 4,5% (quatro e meio por cento); caso o produto tenha o cdigo 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 no se enquadre em nenhum desses cdigos, ele no receber desconto;

Exemplo supermercado: Um cliente foi a um supermercado e comprou N produtos, sendo informado que, dependendo do cdigo do produto, ele receberia um desconto. Faa um algoritmo pedindo que o usurio digite as informaes de N produtos: seu valor e o seu cdigo. Aps a digitao, mostre na tela, o valor total que foi pago pelo cliente, considerando os possveis descontos (utilize a funo CALCDESCONTO neste algoritmo).
Funo CALCDESCONT (COD: literal, VALOR: real): real Incio NVALOR : real Se (COD=ABC) ento NVALOR VALOR VALOR * 4.5/100 Seno Se (COD=XYZ) E (VALOR<85.00) ento NVALOR VALOR VALOR * 6.5/100 Seno NVALOR VALOR Fim Se Fim Se Retorne NVALOR

Fim

Algoritmo Supermercado N, CONT: inteiro TOTALPAGO, VALORPROD: real CODPROD literal

214

Lgica de Programao II

Incio

Escreva Digite o total comprado Leia N TOTALPAGO 0 Para CONT de 1 at N faa {Entrada dos dados}

de

produtos

Escreva Digite o cdigo do produto Leia CODPROD Escreva Digite o valor do produto Leia VALORPROD {Chamando a funo parmetro o cdigo e o valor} VALORPROD) VALORPROD e levando de

CALCDESCONTO

(CODPROD,

{Acumulando valor de cada produto para, ao final, saber quanto o cliente pagou} TOTALPAGO TOTALPAGO + VALORPROD Fim Para Escreva O total pago pelo cliente na compra dos , N, produtos foi: , TOTALPAGO Fim

2) Faa uma funo chamada EhPrimo que receba um valor e retorne 1, caso o nmero seja primo, ou 0, em caso contrrio. Um nmero N primo quando no divisvel por nenhum valor (exceto 1) at N/2. Quando se encontrar um valor pelo qual N divisvel, a funo pode parar a busca e considerar o nmero no primo.
Funo EhPrimo (N: inteiro) : inteiro Var K, Fim : inteiro Incio EhPrimo 1 {Partimos do princpio de que o nmero N primo} K 2 Fim N/2 Enquanto (RESTO(N,K) > 0) E (K < Fim) Faca K K + 1 Fim Enquanto {Ao sair do lao precisamos saber o motivo: se foi porque encontrou um nmero divisvel ou porque chegou ao fim do lao (K alcanou o valor de N) } Se (RESTO(N,K) = EhPrimo 0 Seno EhPrimo 1 Fim Se Retorne EhPrimo Fim 0) Ento

215

Universidade do Sul de Santa Catarina

3) Faa um programa que calcule a rea e o permetro do retngulo. Modularize esse programa, ou seja, divida-o em funes adequadamente.
Algoritmo DadosDoRetangulo Variveis LadoA, LadoB : real Incio Leia (LadoA, LadoB) Escreva (A rea retngulo :,CalculaArea(LadoA, LadoB)) Escreva (O permetro :,CalculaPerimetro(Lado A, LadoB)) Fim Funo CalculaArea (LA:real; LB:real): real AreaTotal : real Incio AreaTotal = (LA * LB) Retorna AreaTotal Fim. Funo CalculaPerimetro (A:real; B:real) :real Perimetro : real Inicio Perimetro = ((A * 2)+(B * 2)) Retorna Perimetro Fim

216

Sobre os professores conteudistas


Patrcia Gerent Petry Formada em Cincias da Computao pela Universidade Federal de Santa Catarina, mestre em Cincias da Computao, rea Informtica e Educao, pela Universidade Federal de Santa Catarina, tendo como tema principal de sua dissertao o Processo de Ensino e Aprendizagem de Algoritmos. Atuou como professora substituta na Universidade Federal de Santa Catarina. Foi professora nas instituies 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 Programao I, Programao II, Laboratrio de Informtica e Anlise e Sistemas I dos cursos de Sistema de Informao e Cincia da Computao, no ensino presencial da Unisul. No ensino virtual, atua como tutora nas cadeiras de Introduo Internet, Lgica de Programao I e II do curso de Tecnlogo em Web Design e Programao. Elton Joo Gubert formado em Cincias da computao (UFSC) e especialista em Gesto empresarial (UFSC). Atua na empresa Sistemas e Tecnologias de Informao Ltda, voltada para o desenvolvimento de software para rea de produo animal de sunos e bovinos de confinamento. professor do curso de Cincias da Computao e Sistemas de Informao, nas disciplinas de Linguagem Visual (Delphi), Tcnicas de Programao, Estruturas de Dados e Anlise e Projetos de Sistemas Orientados a Objetos. professor do curso Web Designer da UnisulVirtual (Ensino Distancia). Apresenta slida atuao em desenvolvimento de sistemas informatizados, baseada em atividades de anlise de sistemas,

Universidade do Sul de Santa Catarina

projeto estruturado, programao, suporte a usurios. Alm disso, tem experincia em desenvolvimento de sistemas e programao orientada a objetos. Mrio Gerson Miranda Magno Jnior Formado em Cincias da Computao pela Universidade do Vale do Itaja, mestrando em Cincias da Linguagem pela Universidade do Sul de Santa Catarina, professor do ensino superior e Consultor em Gerncia de Projetos e Auditoria de Tecnologia da Informao, com experincia reconhecida no mercado nacional. responsvel, no ensino presencial, pelas cadeiras de Tecnologia da Informao de Programao para Engenharia e de Programao para Internet, respectivamente, nos cursos de Engenharia de Telemtica, Engenharia Civil e Sistemas de Informao. No ensino virtual, atua como professor tutor nas cadeiras de Lgica de Programao I e II do curso de Tecnlogo em Web Design e Programao.

218

You might also like