Você está na página 1de 216

Universidade do Sul de Santa Catarina

Lgica de Programao II
Disciplina na modalidade a distncia

LIVRO DIDTICO E CADERNO DE ATIVIDADES

Palhoa UnisulVirtual 2007

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 auto-avaliao . . . . . . . . . . . . 127

CADERNO DE ATIVIDADES
Palavras dos professores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 UNIDADE UNIDADE UNIDADE UNIDADE UNIDADE 1 2 3 4 5 Manipulao de vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Manipulao de matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 Manipulao de registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 Tpicos avanados em algoritmos computacionais . . . . 181 Programao estruturada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191

Respostas e comentrios das atividades de auto-avaliao . . . . . . . . . . . . 199 Sobre os professores conteudistas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215

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

Carlos Fernando Martins

Lgica de Programao II
Livro didtico Design instrucional Daniela Erani Monteiro Will Carolina Hoeller da Silva

4 edio revista e atualizada

Palhoa UnisulVirtual 2007

Copyright UnisulVirtual 2007 N enhum a parte desta publicao pode ser reproduzida por qualquer m eio sem a prvia autorizao desta instituio.

005.1 M34 Martins, Carlos Fernando Lgica de programao II / Carlos Fernando Martins ; design instrucional Daniela Erani Monteiro Will, Carolina Hoeller da Silva, [Leandro Kingeski Pacheco] - 4. ed. rev. e atual. - Palhoa : UnisulVirtual, 2007. 216 p. : il. ; 28 cm

Inclui bibliografia ISBN 978-85-7817-003-5

1. Programao (Computadores). 2. Lgica Processamento de dados. I. Will, Daniela Erani Monteiro. II. Silva, Carolina Hoeller da. III. Pacheco, Leandro Kingeski. IIII. Ttulo.
Ficha catalogrf elaborada pela Biblioteca Universitria da Unisul ica

Cr tos di
Uni - Uni si sul ver dade do Sulde Santa Catarna i Uni Vitual- Educao Superora Di sul r i stnci a
Cam pusUni Vitual sul r Rua Joo Pereira dos Sant 303 os, Pal - SC- 88130-475 hoa Fone/ax:( 3279-1541 e f 48) 3279-1542 E-m ail : cursovirt @unisulbr ual . Sit www. ualunisulbr e: virt . . Rei Uni tor sul Gerson LuizJoner da Sil veira Vi ce-Rei e Pr tor -Rei tor Acadm i co Sebast Sal Heerdt io sio Chef de gabi da e nete Rei i tora Fabian M art de Cast ins ro Pr -Rei tor Adm i str vo ni ati M arcus Vin Ant es da cius ol Sil va Ferreira Cam pusSul Diret Valer Al or: t ves Schm it Net z o Diret adj a:Al ora unt exandra Orseni Cam pusNor te Diret Ailon Nazareno or: t Soares Diret adj a:Cibel ora unt e Schueler t Cam pusUni Vitual sul r Diret Joo Vianney or: Diret adj a:Jucim ara ora unt Roesl er Equi Uni Vitual pe sul r Adm i str ni ao Renat AndrLuz o Val ir Ven I m cio ncio Bi i blotecra i Soraya Arruda W alrick t Coor denao dosCur sos Adriano Srgio da Cunha Ana Luisa M l bert Ana Paul Reusing Pac a heco Ct M el S.Rodrigues ia issa ( iar) Auxil Charl Cesconeto es t Diva Maria Fl m ing l em El Fl m ing Luz isa em Iam ar Pedro Bevil t aqua Janet El Fel e za isbino Jucim ara Roesl er Lil Crist Petres ian ina t ( iar) Auxil Lauro JosBalock l LuizGuil e Buc ann herm hm Figueiredo LuizOt Bot ho Lent vio el o M arcel Caval i o cant M auri LuizHeerdt M auro Faccioni Fil ho M ichele Denise Durieux l Lopes Dest ri Nl Herzm ann io Onei Tadeu Dut ra Pat cia Al on r bert Pat cia Pozza r Raul Jac Brning ino Desi Gr i gn fco Crist Neri Gon ves iano al Ribeiro ( coordenador) Adriana Ferreira dos Sant os Al Sandro Xavier ex Evandro Guedes M ac hado Fernando Robert Dias o Zim m erm ann Higor Ghisi Luciano Pedro Paul Al Teixeira o ves Raf Pessi ael Vil Mart Fil son ins ho Equi Di cope dti Pedaggi ca Angel a MaralFl it ores Carm en M aria Cipriani Pandini Carol Hoeler da Sil ina l va Boeing Crist Kl de Ol ina ipp iveira Daniel Erani M ont W il a eiro l Dnia Falo de Bitencourt c t El Fl m ing Luz isa em Enzo de Ol iveira M oreira Fl Lum i Mat via uzawa Karl Leonora Dahse Nunes a Leandro Kingeski Pacheco Ligia Maria Souf Tum ol en o M rcia Loc h Pat cia M eneghel r Sil Denise Guim ares vana Tade-Ane de Am orim Vanessa de Andrade M anuel Vanessa Francine Corra Viviane Bast os Viviani Poyer Log ca de Encontr sti os Pr esenci s ai Carol Bat a ine ist ( Coordenadora) Araceli Aral l di Graciel Marins e Lindenm ayr JosCarl Teixeira os Letcia Crist Barbosa ina Knia Al exandra Cost a Herm ann M arcia Luzde Ol iveira Priscil Sant Al a os ves Log ca de M aterai sti is Jef erson Cassiano Al eida m da Cost a ( coordenador) Eduardo Kraus Ol Laj avo s Priscila Geovana Pagani l Sil Henrique Sil vana va Secr i Executi etra va Viviane Schal a M art at ins Tecnol a ogi Osm ar de Ol iveira Braz Jnior ( coordenador) Ricardo Al exandre Bianc hini Rodrigo de Barcel os M art ins Edi Li o Di co o vr dti Pr essorConteudi of sta Carl Fernando M art os ins Desi I uci gn nstr onal Daniel Erani M ont W il a eiro l Carol Hoeler da Sil ina l va Fl Lum i Mat avia uzawa ( edi revist e 3a o a at izada) ual Leandro Kingeski Pacheco ( edi revist e 4a o a at izada) ual Pr eto Gr i e Capa oj fco Equipe Unisul ual Virt Di am ao agr Raf Pessi ael Revi Or fca so togr i Revisare

M oni i e Supor tora te Raf da Cunha Lara ael ( coordenador) Adriana Sil veira Carol M endona ine Edison Rodrigo Val im Franciele Arruda l Gabriel M al a inverni Barbieri Gisl Frasson de Souza ane Josiane Conceio Leal M aria Eugnia Ferreira Cel eghin Sim one Andra de Cast ho il Vin M aycotSera.m cius Pr oduo I ndustrale i Supor te Art Em m anuelF. hur Sil veira ( coordenador) Francisco Asp Pr etosCor ati oj por vos Diane DalM ago Vanderl Brasil ei Secr i de Ensi a etara no Di stnci a Karine August Zanoni a ( secret de ensino) ria Dj e Sam m er Bort oti eim ol t Carl Crist Sbardela a ina l Grasiel M art a ins Jam es M arcelSil Ribeiro va Lam uniSouza Liana Pam pl ona M aira M arina M art ins Godinho M arcel Pereira o M arcos Al M edeiros cides Junior M aria I Aragon sabel

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 desao 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 desaos 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 bibliograas que podero ajud-lo a resolver outros problemas de programao. Quanto mais voc estudar, melhor vai car. E quanto melhor car, mais voc vai estudar. um ciclo contnuo e desaador. 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


Verique 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
Avaliao a Distncia 1 Avaliao Presencial 1 Avaliao Presencial 2 (2 chamada) Avaliao Final (caso necessrio)

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 conversa


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 trs tipos: numricas, alfanumricas e lgicas, e que para declarar uma varivel precisamos denir o seu nome e que tipo de dados ser armazenado nela. Veja a seguir:
incio nome: literal {varivel do tipo literal} idade: numrica {varivel do tipo numrica} m

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


incio nome: literal {varivel do tipo literal} idade: numrica {varivel do tipo numrica} idade nome m 22 {varivel idade assume valor 22} Paulo Pereira {varivel nome assume Paulo Pereira}

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: numrica {variveis do tipo numrica} idade1 nome1 idade2 nome2 m 22 {varivel idade1assume valor 22} Paulo Pereira {varivel nome1 assume Paulo Pereira} 38 {varivel idade2 assume valor 38} Ana Luiza {varivel nome2 assume Ana Luiza}

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 denir 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 nal. A soluo bem simples, conforme j visto em Lgica de Programao I.

incio nota, conta, media, soma: numrico 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 m-para media m soma/6 {calcula a mdia nal} escreva A mdia nal , media {mostra o resultado na tela} soma + nota {soma de todas as notas entradas}

Mas agora consta a seguinte complexidade: necessitamos imprimir tambm todas as notas do aluno, alm da mdia nal. 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 signica isso? Inicialmente, acompanhe o conceito de variveis e sua denio.

18

Lgica de Programao II

Quando denimos uma varivel, alocamos um espao na memria do computador para armazenar uma e somente uma constante por vez, seja ela literal, numrica ou lgica. Quando atribumos um valor varivel sobrescrevemos seu contedo. Por exemplo, ao criarmos uma varivel numrica chamada nota, criamos um espao na memria para armazenar apenas um valor numrico por vez, conforme a seguir:
nota: numrica ....... nota 10 {varivel armazena valor numrico 10} escreva O valor da varivel nota : , nota {aqui, o valor impresso ser 10} nota 8 {varivel armazena valor numrico 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 especicar 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 numrico de 6 posies, ou seja, 6 endereos de memria consecutivos alocados no computador que podem armazenar 6 valores numricos diferentes. Cada quadradinho representa uma posio de memria, onde podem ser armazenados os valores numricos. O nmero de posies que queremos criar especicado 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. Especicamos 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.

Sintaxe do vetor

<nome do vetor>: vetor [tamanho do vetor] <tipo de constante que o vetor poder conter>

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


Valor 1 Valor 2 Valor n

20

Lgica de Programao II

notas: vetor[6] numrico {vetor numrico de 6 posies. Pode armazenar at 6 valores numricos 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 nal, 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 nal do vetor>] <tipo de constante que o vetor poder conter>

Unidade 1

21

Universidade do Sul de Santa Catarina

notas: vetor [1..50]: numrico {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]: numrico {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 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] numrico Quando o vetor notas declarado, ele se apresenta assim na memria:

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 caria 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] numrico 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 especicar 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 especca. Perceba que temos 6 notas como entrada, o que sugere um vetor de tamanho 6, com ndices variando de 0 at 5.
incio conta, media, soma: numrico notas: vetor[6] numrico {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 nal de 5, conforme o comando para. Para o primeiro lao de repetio, a varivel conta tem valo 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 valo 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 m-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] m-para media m soma/6 {calcula a mdia nal} escreva A mdia nal , media {mostra o resultado na tela} soma + notas[conta] {soma das notas digitadas}

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?

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 numricos, ou seja, de 0 at 49.
incio {declarao das variveis} pares: vetor[25] numrico {armazena nmeros pares com 25 posies, pois se so os 50 primeiros nmeros positivos, temos apenas 25 pares} impares: vetor[25] numrico {armazena nmeros mpares} subtracao: vetor[25] numrico {armazena a diferena entre nmeros pares e mpares} j,i: numrico {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 m-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.} j j+1 m-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 ] m-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 ] m-para m
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 denir 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] numrico CONTADOR : numrico para CONTADOR de 0 at 49 faa leia Digite um nmero: ,VET1[CONTADOR] VET2[CONTADOR] m-para m VET1[CONTADOR] * 3

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] numrico CONTADOR : numrico 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] m-para m

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] numrico {lembre que o tamanho do vetor 100, mas ele vai de 0 at 99} POS, PESQUISADO, CONT :numrico {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] m-para
Unidade 1

27

Universidade do Sul de Santa Catarina

{5 entradas de dados para vericar 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 signica 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. m-se m-para m

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

incio {declarao de variveis} PRECOCOMPRA: vetor [100] numrico {armazena os preos de compra das mercadorias} PRECOVENDA: vetor [100] numrico {armazena os preos de venda das mercadorias} LUCRO, TOTLUCROMENOR10, TOTLUCROMENOR20, TOTLUCROMAIOR20: numrico {variveis utilizadas para armazenar o lucro, o lucro menor que 10%, menor do que 20% e maior do que 20%, respectivamente} i : numrico {varivel utilizada como contadora para laos de repetio} {precisamos inicializar as variveis contadoras de lucros} TOTLUCROMENOR10 TOTLUCROMENOR20 TOTLUCROMAIOR20 {entrada de dados} para I de 0 at 99 passo 1 faa {vamos especicar 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 ] m-para {Processamento do algoritmo. Vamos vericar o lucro de cada mercadoria (preo de venda preo de compra) e vericar 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 verica se o lucro inferior ou superior a 20%.} TOTLUCROMENOR10 + 1 0 0 0

Unidade 1

29

Universidade do Sul de Santa Catarina

se LUCRO < 20.0 ento TOTLUCROMENOR20 seno TOTLUCROMAIOR20 m-se m-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 m TOTLUCROMAIOR20 + 1 m-se {m da condio que testa se lucro menor do que 20.0} {m da condio que testa se lucro menor do que 10.0} TOTLUCROMENOR20 + 1

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

Valor 2

Valor 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 especicar 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 9. Poderamos representar as posies de um vetor de tamanho 5 conforme apresentado abaixo:

Valor 1

Valor 2

Valor n

[0]

[1]

[2]

[3]

[4]

Podemos perceber que o ndice [3] est no quarto quadrado. Tudo isso porque um vetor tem seu 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

Universidade do Sul de Santa Catarina

Atividades de auto-avaliao
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!

32

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 conversa


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 especica 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 gura anterior que temos uma linha, denominada linha 0, e vrias colunas, denominadas de colunas 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 gura anterior. J sabemos tambm que no precisamos saber o endereo de memria do computador para acessar os elementos do vetor, bastando especicar 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 gura, podemos constatar que o ndice 2 est na linha 0 e coluna 2. Isso mesmo, voc j deve ter percebido que um vetor nada mais do que uma tabela de 1 (uma) linha, na qual chamamos de linha 0 e vrias colunas, onde armazenado

34

Lgica de Programao II

cada um dos valores, seja ele numrico, alfanumrico ou lgico, e que o ndice que especicamos 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 gura a seguir?

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:

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

36

Lgica de Programao II

Veja a tabela a seguir:


Dias da semana Segunda Tera Quarta Temperatura 1 Temperatura 2 Temperatura 3 Temperatura 4 27 25 21 29 27 23 30 28 25 24 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. Especicamos 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 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] numrico {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 numricos} 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 especicar 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 relacionas 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 especicar 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] numrico

1. A Matriz NOTAS uma matriz de dimenso 6x4, ou seja, 6 linhas por 4 colunas. 2. Para armazenar uma constante numrica na matriz NOTAS, precisamos identicar 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 numrica 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 ca a matriz.

10.0

Todo o processo de manipulao agora se torna simples, bastando especicar a posio onde estaremos armazenando os valores, ou seja, basta especicar 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] numrico {matriz de dimenso 4x5. 4 linhas e 5 colunas} SOMALINHA, SOMACOLUNA, LINHA, COLUNA : numrico {Aqui um fato importante. Para percorrer um vetor desde o seu incio at o seu nal, utilizamos o comando para/faa/m-para. Agora temos que percorrer toda a matriz, ou seja, todas as linhas e colunas. O processo bem simples. Para percorrer todas as colunas de uma linha de uma matriz continuamos utilizando o comando para/faa/mpara. 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] m-para m-para {Processamento do Algoritmo. Soma das linhas. A explicao desta parte est aps o m-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] m-para escreva Total da linha, LINHA,:, SOMALINHA m-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 todas os valores numricos 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/ m-para, no nosso caso, apenas o comando SOMALINHA SOMALINHA + MAT[LINHA][COLUNA]. Quando o segundo lao de repetio nalizado, o programa executa os comandos seguintes ao m-para, ou seja, executa o comando de impresso na tela escreva Total da linha, LINHA,:, SOMALINHA. Ao encontrar o m-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/m-para novamente. Como SOMALINHA armazena o valor numrico 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] m-para escreva Total da coluna, COLUNA,:, SOMACOLUNA m-para m

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/m-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 : numrico para LINHA de 1 at 12 passo 1 faa escreva Digite o nome do ,LINHA, 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] m-para leia Digite o nmero do ms a ser consultado: ,NUM escreva NUM, , MESES[NUM][1], ,, MESES[NUM][2], , , MESES[NUM][3] m

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 especicar 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] : numrico NOME: vetor [50] literal I: numrico 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 ][ 0 ] seno [PRODUTOS [ I ][ 2 ] m-se m-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 ] m-para m 0 PRODUTOS[ I ][ 1 ]

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 denimos uma matriz, especicamos que tipo de varivel a mesma vai armazenar (numrico, literal ou lgico). A sintaxe em pseudocdigo para denir 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 valores. o que chamamos de dimenso da matriz. Para acessar qualquer elemento da matriz, basta especicar 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 especicadas: NOTAS[3][2] 8.5. Estamos acessando a quarta linha e a terceira coluna da matriz. Por m, 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 sosticados 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 auto-avaliao
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 conversa


Quantas vezes voc j preencheu chas de cadastros, seja em hotis, em videolocadoras, para propostas de consrcios ou ainda chas de matrcula escolar? Nessas chas, 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 numrica, 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 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 cha cadastral. Acompanhe a seguir.
incio {Declarao de variveis} NOME, ESTADOCIVIL, ENDERECO, BAIRRO: literal IDADE, DATANASC, NUMERO, CEP, FONE: numrico ..... m

48

Lgica de Programao II

Se fssemos preencher apenas uma cha 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] numrico, 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 cha 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 chas 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 cha cadastral. Na seo seguinte, vamos denir 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 numrico 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 cha 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> m-registro

onde <campos que comporo o registro> so todas as variveis que iro compor uma cha 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: numrico m-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 m-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 cha 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 especicarmos o nome do registro criado, seguido de um ponto (.) e o nome da varivel. Por exemplo, para acessar a varivel NOME, precisamos especicar 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 especicar 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 chas cadastrais. A gura a seguir mostra uma possvel cha cadastral:
Nome: Estado Civil: Endereo: Nmero: Bairro: Estado: Idade:

Cidade: Telefone:

52

Lgica de Programao II

Observando a gura anterior, podemos vericar que temos variveis literais e numricas. Vamos classic-las inicialmente: Nome, Estado Civil, Endereo, Bairro, Cidade e Estado so variveis literais. Idade, Nmero e Telefone de Contato so variveis numricas. 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 numrico. Mas para nosso exemplo, vamos considerar o Telefone de Contato como sendo numrico. Para o telefone especificado devemos colocar ento como sendo 2788080.

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

Agora vamos denir as variveis. Iremos especicar seis variveis literais e trs variveis numricas. 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 cha} NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal IDADE, NUMERO, TELEFONE: numrico m-registro

Isso tudo. Nossa cha 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 cha} NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal IDADE, NUMERO, TELEFONE: numrico m-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 m

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 (numrico, literal e lgico) no so sucientes para resolver um algoritmo. Seria interessante que pudssemos criar tipos denidos 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 numrico, 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, cando assim sua sintaxe:
tipo <nome do registro> = registro <campos que comporo o registro> m-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 de 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 cha} NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal IDADE, NUMERO, TELEFONE: numrico m-registro

Para criar uma varivel do tipo FICHA, criamos da mesma forma que criamos as variveis dos tipos primitivos. Por exemplo, cha1: FICHA, onde cha1 agora uma varivel do tipo FICHA. Passamos a acessar as variveis do registro FICHA a partir da varivel cha1.

Exemplo: ficha1.NOME, ficha1.ENDERECO e assim por diante.

O que quero dizer que FICHA um tipo denido pelo programador e que cha1 uma varivel do tipo FICHA que ocupa um espao na memria para armazenar seis variveis literais e trs variveis numricas, 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 cha} NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal IDADE, NUMERO, TELEFONE: numrico m-registro cha1 : FICHA {declarao da varivel do tipo FICHA. Observe que o tipo FICHA denido antes de ser utilizado. Isso obrigatrio, tendo em vista que o programa precisa saber o que FICHA. Como denimos FICHA como sendo um registro, ao especicar cha1 como sendo do tipo FICHA, nenhum problema ser encontrado} escreva Nome: leia cha1.NOME escreva Estado Civil: leia cha1.ESTADOCIVIL ........ {restante do algoritmo} m

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

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

Cada varivel representa uma cha para cadastrar um hspede. como se tivssemos 3 chas cadastrais para serem preenchidas na mo. Para acessar o nome de cha1, apenas colocaramos cha1.NOME. Para acessar o nome de cha2, cha2.NOME, e para cha3, cha3.NOME. Como cada varivel, nesse caso, cha1, cha2 e cha3 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 chas 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 numricos, criamos um vetor do tipo numrico; se precisamos armazenar 100 nomes de clientes, criamos um vetor do tipo literal. Raciocinando da mesma maneira, se precisarmos armazenar 100 chas de clientes, criamos um vetor de FICHA (tipo denido por ns). Na sintaxe de pseudocdigo teramos: chas: vetor [100] FICHA. Agora, denimos um vetor de 100 posies chamado de chas, onde cada posio (quadrado) tem uma varivel do tipo FICHA. Veja a seguir:
Ficha 1 Ficha 2 Ficha 3 ... Ficha 99

Ficha1 est na posio 0 do vetor chas, Ficha2 est na posio 1 do vetor chas, 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: numrico.

58

Lgica de Programao II

Como podemos acessar os dados de cada cha 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 denidas. Veja a gura 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 denida 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 denido da posio 59 do nosso vetor, certo? Desta forma, podemos preencher os dados conforme a seguir:
chas[59].NOME chas[59].ENDERECO chas[59].IDADE 30 Luiz Silva solteiro Avenida Paulista

chas[59].ESTADOCIVIL

{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 zer, 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 : numrico m-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 : numrico {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

escreva Digite a mdia mnima necessria para aprovao: leia DISCIPLINAS[POS].MEDIA m-para {vericao 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 signica pular para a prxima posio do vetor} m-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 ! m-se m-para m
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 : numrico m-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 : numrico {varivel para percorrer o vetor CDS}

Unidade 3

61

Universidade do Sul de Santa Catarina

{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 m-para {processamento do algoritmo} escreva Digite o nome do cantor ou grupo a ser consultado (ou FIM para encerrar): leia CANTORCONSUL enquanto CANTORCONSUL < > FIM faa POS 0 enquanto CANTORCONSUL < > CDS[POS].CANTOR ou POS < 5000 {percorre cada posio do vetor para vericar a existncia do cantor} POS POS + 1 m-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 ! m-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 nalize o programa digitando FIM. Caso no colocssemos essa opo, teramos um lao innito. Lembra que todo algoritmo tem que possuir um m?} escreva Digite o nome do cantor ou grupo a ser consultado (ou FIM para encerrar): leia CANTORCONSUL m-enquanto m

62

Lgica de Programao II

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

Por m, 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 auto-avaliao
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 lgica 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] numrico ..... {implementao do algoritmo} m
Segunda maneira:

incio tipo FICHA = registro NOME: literal CPF: literal FONE: numrico m-registro chas: vetor[50] FICHA {declarao de um vetor de FICHAS} ..... {implementao do algoritmo} m
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 conversa


Voc est quase nalizando 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 identique 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 vericar se realmente entendeu. So fascinantes os desaos 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 desao? Respire fundo e mos obra! Problema 1: Imagine um vetor com cinco elementos conforme descrito a seguir.
10.0 8.0 9.0 7.0 8.5

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

Perceba que h uma troca dos valores dentro do vetor.


Por exemplo, o 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] numrico {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/ m-para para percorrer todo o vetor. Precisamos criar uma varivel de contagem. Vamos cham-la de CONT.
CONT: numrica para CONT de 0 at 4 passo 1 faa escreva Entre com uma nota: leia NOTAS[ CONT ] m-para

O vetor poderia se mostrar conforme a seguir:


10.0 8.0 9.0 7.0 8.5

Perceba que estamos lendo os nmeros de uma forma aleatria, ou seja, sem qualquer seqncia pr-denida. 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 que posio estamos testando e quando nalizado o teste. Precisamos, assim, criar 2 novas variveis: POS, armazena
74

Lgica de Programao II

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 nal do vetor).
POS, ULTIMO: numrico POS ULTIMO 10.0 8.0 0 4 9.0 7.0 8.5

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

10.0

9.0

7.0

8.5

POS

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

POS

ULTIMA

7. Realizamos a segunda comparao, entre a segunda e terceira 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. Podemos vericar que a resposta verdadeira. 8. Executamos o passo de maneira anloga ao passo 5, mas agora observando que estamos testando entre as posies 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

9.0

10.0

7.0

8.5

POS

ULTIMA

9. Executamos o passo 6, 7 e 8 novamente, porm nossa posio de teste agora a terceira e iremos comparar os valores numricos armazenados na terceira e quarta posio do vetor de NOTAS.

8.0

9.0

10.0

7.0

8.5

POS

ULTIMA

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

8.0

9.0

7.0

10.0

8.5

POS

ULTIMA

10. Executamos o passo 6, 7 e 8 novamente, porm nossa posio de teste agora a quarta e iremos comparar os valores numricos armazenados na quarta e quinta posio do vetor de NOTAS.

8.0

9.0

7.0

10.0

8.5

POS

ULTIMA

Unidade 4

77

Universidade do Sul de Santa Catarina

11. Como resposta da execuo do passo anterior, temos a seguinte formao do vetor:

8.0

9.0

7.0

8.5

10.0

12. Observando o resultado do passo anterior, podemos perceber que o nmero 10.0 est na ltima posio do vetor e l dever car, tendo em vista que no h nmero maior do que 10.0 dentro do vetor de NOTAS, certo? Atingimos, dessa forma a posio nal 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 vericar 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 nal do vetor NOTAS. O que nos interessa agora reinicializar a ordenao da posio 0 at a posio 3 do vetor de NOTAS, conforme a seguir:

8.0

9.0

7.0

8.5

10.0

POS

ULTIMA

13. Repetimos todos os passos anteriores. Como resultado, temos a seguinte ordenao, j decrementando a varivel ULTIMA de 1 tambm:

8.0

7.0

8.5

9.0

10.0

POS 78

ULTIMA

Lgica de Programao II

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

7.0

8.0

8.5

9.0

10.0

POS

ULTIMA

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: numrico {entrada de dados} para POS de 0 at 4 passo 1 faa escreva Entre com a Nota: leia NOTAS[ POS ] {armazena os valores lidos no vetor NOTAS} m-para {inicializao das variveis} POS ULTIMA 0 {inicializa a varivel POS} 4 {inicializa a varivel ULTIMA}

AUX 0 {inicializa a varivel AUX, varivel que auxilia na troca de valores entre as posies do vetor NOTAS} {processamento da ordenao dos nmeros} enquanto ULTIMA < > 0 faa

Unidade 4

79

Universidade do Sul de Santa Catarina

enquanto POS < > ULTIMA faa se NOTAS[ POS ] > NOTAS[ POS + 1 ] ento {processo de troca dos nmeros} AUX NOTAS [ POS ] NOTAS[ POS + 1] AUX NOTAS [ POS ] NOTAS [ POS + 1] m-se {incrementa posio do vetor} POS POS + 1 m-enquanto {inicializa varivel POS e decrementa a varivel ULTIMA de 1} POS ULTIMA m-enquanto m 0 ULTIMA -1

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

44

14

15

20

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 especique as idades que desejar, ou seja, ser uma entrada de dados via teclado. Pseudocdigo:
incio IDADES: vetor [5] numrico ENTRADA: numrico {varivel utilizada para armazenar a entrada de uma idade a ser pesquisada no vetor IDADES.} CONT: numrico {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 Especique a idade do cliente: leia IDADES[CONT] {observe que a varivel CONT vai de 0 at 4} m-para

Unidade 4

81

Universidade do Sul de Santa Catarina

2. Preenchido o vetor, iremos realizar nosso processamento. O processamento simplesmente encontrar a idade especicada pelo usurio. Vamos precisar entrar com a idade do cliente e vericar 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 vericar se existe ou no o valor numrico digitado pelo usurio e armazenado na varivel ENTRADA. Vamos supor que voc especique a idade 15, ou seja, a varivel ENTRADA possui valor numrico 15. Dessa forma, vamos percorrer todo o vetor IDADES procurando pelo valor numrico 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, nalizamos a pesquisa. Caso contrrio, percorremos o vetor IDADES at encontrar o valor desejado ou at o m 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 nal do vetor IDADES (CONT <= 4 ), incrementamos a varivel CONT de 1. Isso signica irmos de posio em posio do vetor IDADES. Observe a instruo lgica e aqui no exemplo. Como exerccio, faa a tabela verdade e verique quando a condio se torna falsa, ou seja, quando que o lao de repetio nalizado.} CONT CONT + 1 m-enquanto {na seqncia, verica-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. m-se m-algoritmo

82

Lgica de Programao II

3. O algoritmo completo mostrado a seguir:


incio IDADES: vetor [5] numrico ENTRADA: numrico CONT: numrico para CONT de 0 at 4 passo 1 faa escreva Especique a idade do cliente: leia IDADES[ CONT ] m-para CONT 0 escreva Entre com a idade leia ENTRADA enquanto IDADES[ CONT ] < > ENTRADA e CONT <= 4 faa CONT CONT + 1 m-enquanto se IDADES[ CONT ] = ENTRADA ento escreva O nmero , ENTRADA, est na posio , CONT seno escreva O nmero , ENTRADA, no foi encontrado. m-se m-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 signica uma reduo importante de tempo de procura, principalmente se temos um vetor de dimenso grande, por exemplo, 1000 elementos.

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 desao voc tem pela frente. A soluo completa est no nal da unidade, para voc vericar 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 44 58 78 100

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 na posio 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 vericar que o nmero central do vetor VET est na posio 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 VET, ou seja, da posio 2 at a posio 4, sem precisar percorrer

84

Lgica de Programao II

o vetor desde o seu incio. Parece uma vantagem enorme voc no acha, principalmente quando estamos trabalhando com vetores de dimenses maiores?
10 44 58 78 100

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

Se fssemos realizar a pesquisa seqencialmente, teramos 4 passos at encontrar o nmero 78. Teramos que ler da posio 0 at a posio 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 signica cri-lo e preench-lo com os valores colocados na seqncia.
10 44 58 78 100

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 a posio inicial do vetor e outra para armazenar a posio nal. As variveis podem ser chamadas de PRIMEIRA e ULTIMA respectivamente. Lembre-se de que a posio inicial do vetor a posio 0. Some os dois valores e divida por 2 para achar a posio que corresponde metade do vetor VET. Armazena o valor na varivel METADE.
85

Unidade 4

Universidade do Sul de Santa Catarina

METADE = (PRIMEIRA + ULTIMA)/2 PRIMEIRA: 0 ULTIMA: 4 METADE: (0 + 4)/2 = 2 10 44 58 78 100

PRIMEIRA

METADE

ULTIMA

4. Para o primeiro teste, 78 igual a 58? o resultado falso. Para o segundo teste, 78 maior do que 58? o resultado verdadeiro. Portanto, o valor que estamos procurando s pode estar entre a metade do vetor VET at a posio nal. Como j vericamos 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, cando assim nossa nova estrutura:
10 44 58 78 100

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. 10 44 58 78 100

PRIMEIRA

METADE

ULTIMA

86

Lgica de Programao II

5. Para o teste 78 igual a 78?, o resultado verdadeiro. Nesse caso, o algoritmo deve imprimir a mensagem o nmero 78 est na posio 3 do vetor. Essa primeira parte est concluda. 6. No podemos nos esquecer de que o nmero digitado pode estar entre a posio 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 44 58 78 100

PRIMEIRA

METADE

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 vericamos 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.
10 44 58 78 100

PRIMEIRA

ULTIMA

Unidade 4

87

Universidade do Sul de Santa Catarina

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

PRIMEIRA

METADE

ULTIMA

Para o teste 10 igual a 10?, o resultado verdadeiro. Nesse caso, o algoritmo deve imprimir a mensagem o nmero 10 est na posio 0 do vetor. Nosso processo lgico de encontrar um valor numrico atravs de um vetor com valores numricos ordenados em ordem crescente est nalizado. 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 um busca por valores contidos dentro de um vetor. Voc pde observar dois tipos de procura: 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 eciente, 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 vericar se o valor que estamos procurando est exatamente na metade do vetor, ou acima ou abaixo da metade encontra. Caso esteja
88

Lgica de Programao II

acima ou abaixo da metade, dividimos o vetor novamente at que o nmero seja encontrado. um mtodo bastante eciente de procura, porm h a necessidade de que o mesmo esteja ordenado em ordem crescente. Nossos algoritmos esto cando grandes e complexos. hora de estrutur-los de forma a carem 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 auto-avaliao
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 conversa


Voc est iniciando agora a ltima unidade da disciplina. Isso no signica que os estudos acabaram por aqui. Muito pelo contrrio, acabaram de comear. No nal 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 especca 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 nal. A cada uma dessas partes bem denidas, 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 denida 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 nal. 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 gura 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 denidos

Unidade 5

99

Universidade do Sul de Santa Catarina

dentro do mdulo so executados. Quando nalizados, 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 do programa de uma forma mais fcil. 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 denimos 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: numrico {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 m

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 nal. Sempre que quisermos somar dois nmeros chamamos essa sub-rotina.

Unidade 5

101

Universidade do Sul de Santa Catarina

Nosso pseudocdigo caria 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 m FUNO_SOMA incio {declarando as variveis} N1, N2, SOMA: numrico {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 m-funo

102

Lgica de Programao II

Pontos a observar:
1. Observe onde esto denidas as variveis antes e aps a modularizao. Antes da modularizao, as variveis esto denidas dentro do programa principal. Aps a modularizao, as variveis esto denidas dentro da funo FUNCAO_SOMA. Isso apenas para colocar o seguinte: as variveis so denidas onde elas so utilizadas. Mais importante, uma varivel denida no programa principal no reconhecida na funo FUNCAO_SOMA, e uma varivel denida na funo FUNCAO_SOMA no reconhecida no programa principal. A isso damos o nome de variveis locais. Por exemplo, em nosso algoritmo principal anterior, o comando de escrita do valor numrico da varivel N1 est errado.
incio escreva Programa de soma de dois nmeros CHAMADA DA FUNO FUNCAO_SOMA escreva O Valor de N1 =, N1 {errado pois N1 no est denida dentro do programa principal} escreva Programa Finalizado m

O porqu disso? A resposta que a varivel N1 est denida 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 m, o valor impresso. Quando os comandos so nalizados encontrando o comando m 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 m.

Unidade 5

103

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: numrico 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 denida dentro do programa principal. Essa varivel local diferente da varivel local denida na funo SOMA.} escreva Programa Finalizado m

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 m

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 denido 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 signicando 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 vericar 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
105

Unidade 5

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 signica 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 nalizar a funo com o comando m, 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: numrico {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 <identicador> onde identicador o nome de uma varivel denida dentro da funo} retorna SOMA. m-funo

No programa principal, podemos ter:


incio {declarao da varivel} RESULTADO: numrico 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 caria 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. Ao encontrar o comando CHAMADA DA FUNO FUNCAO_SOMA, a funo chamada, e ao encontrar o comando retorna <identicador> dentro da funo, o valor de <identicador> 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 denida 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 vericar 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 m

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 ca 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 preocuparmos 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 zemos no item 2.1. A transferncia de valores para dentro de uma funo se d atravs de passagem por parmetros. Mas o que signica passagem de parmetros? Para responder essa questo, voltamos gura onde denimos 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 denidas 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 (denidas 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 denidas 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 denimos anteriormente a funo FUNCAO_ SOMA, utilizamos a seguinte sintaxe provisria:
FUNCAO_SOMA incio {declarao de variveis locais} {comandos da funo} m-funo

Os parmetros de uma funo so denidos 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} m-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: numrico {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 m

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 denir 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 denida como parmetro da funo} retorna SOMA {retorna o valor da varivel SOMA para a linha de comando em que a funo foi chamada} m-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 numrico, NUM1 tambm deve ser numrico. 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 ca a funo FUNCAO_SOMA utilizando a sintaxe em pseudocdigo:


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

Desta forma, a sintaxe para a funo FUNCAO_SOMA ca:


funo FUNCAO_SOMA (NUM1, NUM2: numrico): numrico

Veja outros exemplos de declarao de funo:

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

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


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

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


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

funo FUNCAO_MES ( MS: literal ): numrico

Unidade 5

113

Universidade do Sul de Santa Catarina

Acompanhe mais alguns exemplos de funes. O interesse aqui apenas vericar 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: numrico): numrico retorna ANOCORRENTE ANONASCIMENTO m-funo
2. Criar uma frao 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 CELSUIS (FAHRENHEIT : numrico) : numrico retorna (5/9) * (FAHRENHEIT - 32) m-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 nalizando os estudos de lgica de programao. Foi um desao 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 zer, 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 denida, 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 especca 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 auto-avaliao
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 nal 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 auto-avaliao


Unidade 1
1) temperaturas: vetor[25] numrico 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: numrico {NVD = nmero do vo desejado} vetor: VOOS[500] numrico {supondo 500 vos ao dia. Cada posio do vetor armazena o nmero de lugares disponveis} RG: literal {incio do programa} escreva Especique o nmero de vos disponveis leia NUM_VOOS para I de 0 at NUM_VOOS-1 passo 1 faa escreva Especique a quantidade de lugares disponveis para o vo:, I+1 leia VOOS[ I ] m-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 m-se seno escreva No existe esse vo, m-se escreva Entre com o nmero do vo ou 1 para sair: leia NVD m-enquanto m

Unidade 2
1) Pseudocdigo

incio NOMES : vetor [27] literal DISTANCIAS : matriz [27][27] numrico LINHA, COLUNA : numrico CAPITAL1, CAPITAL2 : literal para LINHA de 0 at 26 passo 1 faa escreva Digite o nome de uma capital: leia NOMES[LINHA] m-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] seno escreva Digite a distncia (kms) entre ,NOMES[LINHA], e , NOMES[COLUNA] 0

128

Lgica de Programao II

leia DISTANCIAS[LINHA][COLUNA] m-se m-para m-para escreva Digite o nome da primeira capital escolhida: leia CAPITAL1 escreva Digite o nome da segunda capital escolhida: leia CAPITAL2 LINHA LINHA COLUNA COLUNA m-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! m-se seno escreva Nome ,CAPITAL1, no consta no cadastro! m-se m 0 LINHA + 1 0 COLUNA + 1 enquanto NOMES[LINHA] <> CAPITAL1 ou LINHA <= 27 faa m-enquanto enquanto NOMES[COLUNA] <> CAPITAL2 ou COLUNA <= 27 faa

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: numrico m-registro
2) Algoritmo de um sistema de administrao escolar:

incio {declarao do registro FICHA} FICHA: registro {variveis da cha} NOME, ENDERECO, CIDADE, ESTADO, CEP, CPF, RG, DATA_NASC, CURSO: literal TELEFONE, GRAU_ESC: numrico m-registro CONT, NUM_PROF: numrico {especica 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 m-para m

3) Algoritmo de um sistema de cadastro de uma Vdeo Locadora:

incio {declarao do registro FICHA} VIDEO: registro {variveis da cha} NOME, CODIGO, TIPO, PRODUTOR, ATOR, DIRETOR: literal DURACAO, ANO: numrico m-registro FITAS: vetor[0..499] VIDEO {permite cadastrar at 500 tas de vdeo} NUM_FITAS, CONT: numrico {entrada de dados} escreva Entre com o nmero de tas a serem cadastradas leia NUM_FITAS para CONT de 0 at NUM_FITAS-1 passo 1 faa escreva Entre com o nome do lme: leia FITAS[CONT].NOME escreva Entre com o cdigo do lme: leia FITAS[CONT].CODIGO escreva Entre com o tipo de lme: leia FITAS[CONT].TIPO escreva Entre com o nome do produtor: leia FITAS[CONT].PRODUTOR escreva Entre com o nome do ator principal: leia FITAS[CONT].ATOR escreva Entre com o nome do diretor do lme: leia FITAS[CONT].DIRETOR escreva Entre com o tempo de durao do lme: leia FITAS[CONT].DURACAO escreva Entre com o ano da produo: leia FITAS[CONT].ANO m-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 lme, 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 lme foi produzido no ano de, FITAS[CONT].ANO m-para m
4) Cadastro de 200 funcionrios de uma empresa. Pseudocdigo:

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

132

Lgica de Programao II

escreva Digite CPF leia FUNCIONARIOS[POS].CPF escreva Especique 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 m-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 m-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 m-se m-para m
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] numrico POS, ULTIMO, AUX1 : numrico AUX2 : literal para POS de 0 at 99 passo 1 faa escreva Entre com o cdigo da mercadoria: leia CODIGOPRODUTO[POS] m-para para POS de 0 at 99 passo 1 faa escreva Entre com a quantidade: leia QUANTIDADE[POS] m-para POS ULTIMO AUX 0 0 99

enquanto ULTIMO < > 1 faa enquanto POS < > (ULTIMO - 1) faa se QUANTIDADE[POS] > QUANTIDADE[POS+1] ento AUX1 AUX2 QUANTIDADE[POS] CODIGOPRODUTO[POS] QUANTIDADE[POS+1] CODIGOPRODUTO[POS+1] AUX1 AUX2

QUANTIDADE[POS] QUANTIDADE[POS+1]

CODIGOPRODUTO[POS] CODIGOPRODUTO[POS+1] seno POS m-se m-enquanto POS ULTIMO 1 ULTIMO - 1 POS + 1

m-enquanto

134

Lgica de Programao II

escreva Imprimindo os cdigos e as quantidades em ordem crescente. para POS de 0 at 99 passo 1 faa escreva CODIGOPRODUTO[POS] escreva QUANTIDADE[POS] m-para m
2) Pseudocdigo

incio ALUNOS : vetor[100] numrico POS, PESQUISADO, CONT :numrico para POS de 0 at 99 passo 1 faa escreva Digite o cdigo de matrcula de um aluno: leia ALUNOS[POS] m-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 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. m-se m-para m 0 {o comando repita est sendo utilizado para percorrer o vetor ALUNOS}

135

Universidade do Sul de Santa Catarina

3) incio

VET: vetor[5] numrico NUMEROLIDO, PRIMEIRA, ULTIMA, METADE: numrico POS: numrico 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 ] m-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) {verica se o nmero procurado j se encontra na metade. o primeiro teste} se VET[ METADE ] = NUMEROLIDO ento ACHOU verdadeiro m-se {caso o nmero procurado no esteja exatamente na metade o vetor, vericamos 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

m-se m-enquanto {verica 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 m-se m
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] numrico {quantidade de mercadoria} POS, ULTIMO, AUX1 :numrico AUX2 : literal para POS de 0 at 99 faa leia COD_PRODUTO[POS] leia QTDE[POS] m-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

seno POS POS + 1 m-se m-enquanto POS 1 ULTIMO ULTIMO - 1 m-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] m-para m

Unidade 5
1) Implementando a funo SUBTRACAO, MULTIPLICACAO e DIVISAO sem retorno de valores. Pseudocdigo

incio {declarao de variveis} OPCAO, N1, N2: numrico 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 leia N2 se OPCAO < > 4 faa se OPCAO = 1 ento {operao de subtrao} SUBTRACAO (N1, N2)

138

Lgica de Programao II

Seno 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 m-se m-se m-se m-se m-enquanto m {implementao das funes} funo SUBTRACAO (NUM1, NUM2: numrico) escreva resultado =, NUM1 NUM2 m-funo funo MULTIPLICACAO (NUM1, NUM2: numrico) escreva resultado =, NUM1*NUM2 m-funo funo DIVISAO (NUM1, NUM2: numrico) se NUM2 < > 0 ento {garante que a diviso nunca ser feita por zero} escreva resultado = NUM1/NUM2 seno escreva no existe diviso por zero m-se m-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: numrico 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 m se m se m se escreva resultado da operao =, RESULTADO m se m enquanto m

140

Lgica de Programao II

{implementao das funes} funo SUBTRACAO (NUM1, NUM2: numrico): numrico retorna NUM1 NUM2 {retorna a diferena entre os parmetros da funo} m-funo funo MULTIPLICACAO (NUM1, NUM2: numrico): numrico retorna NUM1*NUM2 {retorna a multiplicao entre os parmetros da funo} m-funo funo DIVISAO (NUM1, NUM2: numrico): numrico 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 m-se m-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: numrico {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 m

141

Universidade do Sul de Santa Catarina

{implementao da funo} funo FUNCAO_MAIOR (NUM1, NUM2, NUM3: numrico): numrico MAIOR: numrico {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 m-se retorna MAIOR m-funo

142

Elton Joo Gubert Mrio Gerson Miranda Magno Jnior Patrcia Gerent Petry

Lgica de Programao II
Caderno de atividades
Design instrucional Flavia Lumi Matuzawa Viviane Bastos

2 edio revista

Palhoa UnisulVirtual 2007

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

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

005.1 G95

Gubert, Elton Joo Lgica de programao II : caderno de atividades / Elton Joo Gubert, Mrio Gerson Miranda Magno Jnior, Patrcia Gerent Petry ; design instrucional Flavia Lumi Matuzawa; Viviane Bastos. 2. ed. rev. Palhoa : UnisulVirtual, 2007. 73p. : il. ; 28 cm. 1. Programao (Computadores). 2. Estrutura de dados (Computador). 3. Algoritmos. I. Magno Jnior, Mario Gerson Miranda. II. Petry, Patrcia Gerent. III. Matuzawa, Flavia Lumi. IV. Bastos, Viviane. V. Ttulo.

Ficha catalogrfica elaborada pela Biblioteca Universitria da Unisul

Crditos
Unisul - Universidade do Sul de Santa Catarina UnisulVirtual - Educao Superior a Distncia
Campus UnisulVirtual Rua Joo Pereira dos Santos, 303 Palhoa - SC - 88130-475 Fone/fax: (48) 3279-1541 e 3279-1542 E-mail: cursovirtual@unisul.br Site: www.virtual.unisul.br Reitor Unisul Gerson Luiz Joner da Silveira Vice-Reitor e Pr-Reitor Acadmico Sebastio Salsio Heerdt Chefe de gabinete da Reitoria Fabian Martins de Castro Pr-Reitor Administrativo Marcus Vincius Antoles da Silva Ferreira Campus Sul Diretor: Valter Alves Schmitz Neto Diretora adjunta: Alexandra Orseni Campus Norte Diretor: Ailton Nazareno Soares Diretora adjunta: Cibele Schuelter Campus UnisulVirtual Diretor: Joo Vianney Diretora adjunta: Jucimara Roesler Bibliotecria Soraya Arruda Waltrick Coordenao dos Cursos Adriano Srgio da Cunha Ana Luisa Mlbert Ana Paula Reusing Pacheco Ctia Melissa S. Rodrigues (Auxiliar) Charles Cesconetto Diva Marlia Flemming Elisa Flemming Luz Itamar Pedro Bevilaqua Janete Elza Felisbino Jucimara Roesler Lilian Cristina Pettres (Auxiliar) Lauro Jos Ballock Luiz Guilherme Buchmann Figueiredo Luiz Otvio Botelho Lento Marcelo Cavalcanti Mauri Luiz Heerdt Mauro Faccioni Filho Michelle Denise Durieux Lopes Destri Nlio Herzmann Onei Tadeu Dutra Patrcia Alberton Patrcia Pozza Raulino Jac Brning Design Grco Cristiano Neri Gonalves Ribeiro (coordenador) Adriana Ferreira dos Santos Alex Sandro Xavier Evandro Guedes Machado Fernando Roberto Dias Zimmermann Higor Ghisi Luciano Pedro Paulo Alves Teixeira Rafael Pessi Vilson Martins Filho Equipe Didtico-Pedaggica Angelita Maral Flores Carmen Maria Cipriani Pandini Carolina Hoeller da Silva Boeing Cristina Klipp de Oliveira Daniela Erani Monteiro Will Dnia Falco de Bittencourt Elisa Flemming Luz Enzo de Oliveira Moreira Flvia Lumi Matuzawa Karla Leonora Dahse Nunes Leandro Kingeski Pacheco Ligia Maria Soufen Tumolo Mrcia Loch Patrcia Meneghel Silvana Denise Guimares Tade-Ane de Amorim Vanessa de Andrade Manuel Vanessa Francine Corra Viviane Bastos Viviani Poyer Logstica de Encontros Presenciais Caroline Batista (Coordenadora) Aracelli Araldi Graciele Marins Lindenmayr Jos Carlos Teixeira Letcia Cristina Barbosa Knia Alexandra Costa Hermann Marcia Luz de Oliveira Priscila Santos Alves Logstica de Materiais Jeferson Cassiano Almeida da Costa (coordenador) Eduardo Kraus Monitoria e Suporte Rafael da Cunha Lara (coordenador) Adriana Silveira Caroline Mendona Edison Rodrigo Valim Francielle Arruda Gabriela Malinverni Barbieri Gislane Frasson de Souza Josiane Conceio Leal Maria Eugnia Ferreira Celeghin Simone Andra de Castilho Vincius Maycot Seram Produo Industrial e Suporte Arthur Emmanuel F. Silveira (coordenador) Francisco Asp Projetos Corporativos Diane Dal Mago Vanderlei Brasil Secretaria de Ensino a Distncia Karine Augusta Zanoni (secretria de ensino) Djeime Sammer Bortolotti Carla Cristina Sbardella Grasiela Martins James Marcel Silva Ribeiro Lamuni Souza Liana Pamplona Maira Marina Martins Godinho Marcelo Pereira Marcos Alcides Medeiros Junior Maria Isabel Aragon Olavo Lajs Priscilla Geovana Pagani Silvana Henrique Silva Secretria Executiva Viviane Schalata Martins Tecnologia Osmar de Oliveira Braz Jnior (coordenador) Ricardo Alexandre Bianchini Rodrigo de Barcelos Martins

Edio Livro Didtico


Professores Conteudistas Elton Joo Gubert Mrio Gerson Miranda Magno Jnior Patrcia Gerent Petry Design Instrucional Flavia Lumi Matuzawa Viviane Bastos Leandro Kingeski Pacheco (2a edio revista) Projeto Grco e Capa Equipe UnisulVirtual Diagramao Rafael Pessi Reviso Ortogrca Helosa Mano Dorneles

Equipe UnisulVirtual
Administrao Renato Andr Luz Valmir Vencio Incio

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 conversa


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 m 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; b) quantas pessoas possuem altura acima da mdia; c) a maior altura; d) quantas pessoas possuem a maior altura. Algoritmo AlturaPessoas
Altura : vetor[9999] numrico I, N, MediaAltura, TotalAcimaMedia, MaiorAltura, TotalMaiorAltura: numrico 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 nal calcular a mdia} Soma 0

150

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 vericar quem tem altura maior que a mdia e quem tem a maior altura} Para I de 1 at N faa {Aqui iremos vericar o total de pessoas que tm a altura acima da mdia} Se Altura[I]>MediaAltura ento TotalAcimaMedia TotalAcimaMedia + 1 Fim Se {Agora vamos vericar o total de pessoas que tm a maior altura} Se Altura[I]= MaiorAltura ento TotalMaiorAltura TotalMaiorAltura + 1 Fim Se Fim Para

Unidade 1

151

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 novo 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] numrico I, N, PosMaisJovem, IdadeMaisNova, PosMaisVelho, IdadeMaisVelho: numrico MediaIdadeHomens, MediaIdadeMulheres: numrico Incio I 1 {L a idade da primeira pessoa j fora do lao, para que a condio do comando enquanto-faa possa ser vericada} Leia (Digite a idade,Idade[I])

152

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 nalizar,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

153

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]

154

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 de nindo 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 identicar o candidato. Continuar: uma varivel lgica usada no lao de repetio.}

Unidade 1

155

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

156

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: numrico V: Vetor[5] numrico Incio 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 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

157

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.

158

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 conversa


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

Lgica de Programao II

Algoritmo Leite
Leite: matriz[30,10] numrico vaca5,vaca8,linha,coluna,dia10e20,dia01a30 : numrico 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 caria:} 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

161

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

162

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] numrico {ou ainda poderamos declarar assim: A: Matriz[999x999] numrico ou A: Matriz[999][999] numrico ou, em vez de escrever Matriz, pode ser escrito Vetor, assim: A: Vetor[999,999] numrico, ou ainda: A:Array[999,999] numrico} I, J, N, M, Soma, SomaPar, SomaDS, SomaLinha, SomaLinha3 : numrico 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

163

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 {Verica 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 vericar 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

164

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

165

Universidade do Sul de Santa Catarina

3) Dada uma matriz de ordem N x N, faa um algoritmo que verique se a matriz simtrica (aij=aji). Algoritmo MatrizSimetrica
A: Matriz [N,M] numrico {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 : Numrico 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, armar que a matriz NO simtrica} Simetrica Falso

166

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 nal 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 de nida uma matriz de tamanho 10x10.}

Unidade 2

167

Universidade do Sul de Santa Catarina

Algoritmo Matriz
{Primeiramente sero de nidas 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, SomaTotal, Media : numrico SomaDiagSecund : numrico Mat : matriz[10,10] numrico SomaColuna : Vetor[10] numrico 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

168

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

169

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: numrico 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

170

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

171

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

172

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 conversa


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 :numrico Tipo TFUNCIONRIO: registro Nome, sexo: literal Idade, Salario: numrico Endereco: TEndereco {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 : numrico 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:}

174

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: numrico Nome: Literal Votos: numrico Fim-registro

Unidade 3

175

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 : numrico 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
ALUNO: registro Nome: literal Idade, Sexo: numrico {Sexo 0-Feminino 1-Masculino} Altura: numrico {Observe que uma das partes do registro um vetor} Notas: Vetor[5] numrico CAD _ ALUNOS: Vetor[100] ALUNO I, K: Numrico Soma: numrico

176

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

177

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.

178

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

179

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.

180

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 conversa


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 : numrico 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 1 at 50 faa Para J de (I+1) at 50 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 1 at 50 faa Escreva NOME[I] Fim Para Fim

182

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 1 Marcos 2 Ana 3 Maria 4

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 xada a posio I=1 e ser comparado o nome Jos com Marcos, Ana e Maria (I=2, 3 e 4). 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 1 at 4 faa {essa primeira estrutura de repetio serve para xar o primeiro nome (a primeira vez que entra nesse para-faa Jos) a ser comparado com os demais quando I=1. Depois ser com I=2, I=3 e I=4.} Para J de (I+1) at 4 faa {essa segunda estrutura de repetio serve para percorrer os demais nomes a partir daquele que ser xo, ou seja, se estou na primeira posio I=1, o J ser I+1, ou seja, 2 (depois 3, depois 4, 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[1] > NOME[2] (Jos com Marcos), ou seja, o I=1 e J=2. Verica-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 4 FAA. Agora o I vale 1 e J est valendo 3.

Unidade 4

183

Universidade do Sul de Santa Catarina

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

NOME I

Ana 1

Marcos 2

Jos 3

Maria 4

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

NOME I

Ana 1

Jos 2

Marcos 3

Maria 4

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

184

Lgica de Programao II

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

NOME I
Fim Para Fim Para

Ana 1

Jos 2

Marcos 3

Maria 4

Unidade 4

185

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: numrico {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, vericamos se o nosso ponteiro est direcionado para uma posio no vetor; se ele estiver apontando para o nal, 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.

186

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: numrico {nmero a ser pesquisado} n: numrico {quantidade de valores no vetor} x: vetor[N] de numrico {vetor de tamanho n de valores inteiros} incio, meio, nal, i: numrico 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 rede nimos o incio e o m desse vetor e passamos a ter agora a metade do vetor original, via de regra, um novo vetor. A partir da o processo continua, sempre descobrindo em que metade o valor est (e rede nindo incio e m do vetor sucessivamente), at que o valor seja encontrado, ou no seja mais possvel dividir o vetor; neste ltimo caso, signica 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 nal neste ponto representam o tamanho original do vetor} Incio 1 nal N Enquanto (incio <= nal) faa

Unidade 4

187

Universidade do Sul de Santa Catarina

{Descobrimos qual o meio do vetor} meio (incio + nal)/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, rede no o nal} Final meio - 1 Seno Se (numeroPesquisa > x[meio] ) ento {O nmero est na metade direita, rede no o incio} Incio nal + 1 Seno {Nesta opo, o nmero foi encontrado, ento atribumos varivel incio um valor tal, para que o lao TERMINE de girar} Incio nal + 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

188

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

189

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.

190

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 conversa


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 verique 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: numrico {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

192

Lgica de Programao II

{Artifcio identicar o nal 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

193

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 SalBruto, NumDeFunc, DescINSS, DescIRRF, SalLiq: numrico Incio Leia (SalarioBruto) Leia (NumDeFunc) DescINSS CalculaINSS(SalarioBruto) DescIRRF CalculaIRRF (SalarioBruto) SalLiq = SalarioBruto DescINSS DescIRRF Escreva (O salrio Liquido :, SalLiq) Fim

194

Lgica de Programao II

{Esta a funo para calcular o valor do desconto de IRRF} Funo CalculaIRRF (SalarioBruto:Numrico) :numrico 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:Numrico) :numrico 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

195

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

196

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

197

Respostas e comentrios das atividades de auto-avaliao


Unidade 1
1) Analise o algoritmo abaixo e mostre o desenvolvimento do mesmo mediante teste de mesa.
Algoritmo Teste Var I:numrico V: Vetor[5] numrico Incio 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 I=2 V[2] = 3 I=3 V[3] = 4 I=4 V[4] = 5 I=5 V[5] = 6

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

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 Gabarito, Respostas: Vetor[13] numrico NROCARTAO, CONTACERTOS, I : numrico 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

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.

200

Lgica de Programao II

Resposta :
Algoritmo TROCA_TROCA Var V : VETOR[20] numrico AUX, I, J : numrico 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] numrico I, J : numrico 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

201

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: numrico 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)

202

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] numrico MAIOR : numrico I, J: numrico 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

203

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] numrico V : VETOR [36] numrico A : numrico K, I, J: numrico 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

204

Lgica de Programao II

Algoritmo Matriz3 Var M : MATRIZ[10,10] numrico AUX, C, K, I, J: numrico 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

205

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 NOME, END, SEXO SALRIO Var FUNC : vetor [200] TFUNC I, TOTALMUL, MAIORSAL, MEDIASAL : numrico 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} TOTALMUL 0 Para I de 1 at 200 faa Se (FUNC[I].SEXO=F) E SALARIO>1000) ento TOTMUL TOTMUL + 1 Fim se Fim Para

: literal : numrico

(FUNC[I].

206

Lgica de Programao II

{Letra B} MAIORSAL 0 Para I de 1 at 200 faa Se (FUNC[I].SEXO=M)E(FUNC[I]. SALARIO>MAIORSAL) ento MAIORSAL FUNC[I].SALARIO Fim se Fim Para {Letra C} MEDIASAL 0 Para I de 1 at 200 faa MEDIASAL MEDIASAL+ FUNC[I].SALARIO Fim Para MEDIASAL MEDIASAL/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 {De nio 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 : numrico {Grau de Escolaridade} CURSO : literal {Nome do Curso} Fim-registro

207

Universidade do Sul de Santa Catarina

{Declarao das variveis} CANDIDATOS : vetor[100] CADASTRO K : numrico {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

208

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: numrico Sinopse: literal m-registro Acervo : Vetor [3500] Filme Generodesejado: literal contador : numrico 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.

209

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] numrico K, N, cont: numrico Inicio {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} Para I de 1 at cont faa Escreva(Posicoes[I]) Fim Para Fim Se Fim.

210

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] numrico K, N: numrico 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

211

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: numrico): numrico Var NVALOR : numrico Incio 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 Var N, TOTALPAGO, VALORPROD, CONT : numrico CODPROD : literal

212

Lgica de Programao II

Incio Escreva Digite o total comprado Leia N TOTALPAGO 0 Para CONT de 1 at N faa {Entrada dos dados} 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) {Acumulando valor de cada produto para, ao nal, saber quanto o cliente pagou} TOTALPAGO TOTALPAGO + VALORPROD Fim Para Escreva O total pago pelo cliente na compra dos , N, produtos foi: , TOTALPAGO Fim e levando de de produtos

CALCDESCONTO

(CODPROD,

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: numrico) : numrico Var K, Fim : numrico 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 m do lao (K alcanou o valor de N)} Se (RESTO(N,K) = EhPrimo 0 Seno EhPrimo 1 Fim Se Retorne EhPrimo Fim 0) Ento

213

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 : numrico Incio Leia (LadoA, LadoB) Escreva (A rea retngulo :,CalculaArea(LadoA, LadoB)) Escreva (O permetro :,CalculaPerimetro(Lado A, LadoB)) Fim Funo CalculaArea (LA:numrico; LB:numrico) : numrico AreaTotal : numrico Incio AreaTotal = (LA * LB) Retorna AreaTotal Fim. Funo CalculaPerimetro (A:numrico; B:numrico) : numrico Perimetro : numrico Inicio Perimetro = ((A * 2)+(B * 2)) Retorna Perimetro Fim

214

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

216