Livro - Lógica da Programação.pdf

April 22, 2017 | Author: Luciano Leal | Category: N/A
Share Embed Donate


Short Description

Download Livro - Lógica da Programação.pdf...

Description

Universidade do Sul de Santa Catarina

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

LIVRO DIDÁTICO E CADERNO DE ATIVIDADES

Palhoça UnisulVirtual 2007

logica_2_livro_caderno.indb 1

7/12/2006 14:19:18

Sumário LIVRO DIDÁTICO Palavras do professor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9 Plano de estudo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 UNIDADE UNIDADE UNIDADE UNIDADE UNIDADE

1 2 3 4 5

– – – – –

Manipulação de vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Manipulação de matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Manipulação de registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tópicos avançados em algoritmos computacionais . . . . . Programação estruturada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15 33 47 71 95

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

logica_2_livro_caderno.indb 2

7/12/2006 14:20:49

CADERNO DE ATIVIDADES Palavras dos professores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 UNIDADE UNIDADE UNIDADE UNIDADE UNIDADE

1 2 3 4 5

– – – – –

Manipulação de vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Manipulação de matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 Manipulação de registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 Tópicos avançados em algoritmos computacionais . . . . 181 Programação estruturada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191

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

logica_2_livro_caderno.indb 3

7/12/2006 14:20:49

logica_2_livro_caderno.indb 4

7/12/2006 14:20:49

Apresentação Este livro didático corresponde à disciplina de Lógica de Programação II. O material foi elaborado visando a uma aprendizagem autônoma, abordando conteúdos especialmente selecionados e adotando uma linguagem que facilite seu estudo a distância. Por falar em distância, isso não significa que você estará sozinho. Não esqueça que sua caminhada nesta disciplina também será acompanhada constantemente pelo Sistema Tutorial da UnisulVirtual. Entre em contato sempre que sentir necessidade, seja por correio postal, fax, telefone, e-mail ou Espaço UnisulVirtual de Aprendizagem. Nossa equipe terá o maior prazer em atendê-lo, pois sua aprendizagem é nosso principal objetivo Bom estudo e sucesso! Equipe UnisulVirtual.

logica_2_livro_caderno.indb 5

7/12/2006 14:20:49

logica_2_livro_caderno.indb 6

7/12/2006 14:20:49

Carlos Fernando Martins

Lógica de Programação II Livro didático Design instrucional Daniela Erani Monteiro Will Carolina Hoeller da Silva

4ª edição revista e atualizada

Palhoça UnisulVirtual 2007

logica_2_livro_caderno.indb 7

7/12/2006 14:20:49

Copyright © UnisulVirtual 2007 N enhum a parte desta publicação pode ser reproduzida por qualquer m eio sem a prévia autorização desta instituição.

005.1 M34 Martins, Carlos Fernando Lógica de programação II / Carlos Fernando Martins ; design instrucional Daniela Erani Monteiro Will, Carolina Hoeller da Silva, [Leandro Kingeski Pacheco] - 4. ed. rev. e atual. - Palhoça : UnisulVirtual, 2007. 216 p. : il. ; 28 cm

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

1. Programação (Computadores). 2. Lógica – Processamento de dados. I. Will, Daniela Erani Monteiro. II. Silva, Carolina Hoeller da. III. Pacheco, Leandro Kingeski. IIII. Título. Ficha catalográfica elaborada pela Biblioteca Universitária da Unisul

Créditos Unisul- Universidade do Sulde Santa Catarina UnisulVirtual- Educação Superiora Distância Cam pusUnisulVirtual Rua João Pereira dos Santos,303 Palhoça - SC- 88130-475 Fone/fax:(48)3279-1541 e 3279-1542 E-m ail: [email protected] Site:www.virtual.unisul.br ReitorUnisul Gerson LuizJoner da Silveira Vice-Reitore Pró-Reitor Acadêm ico Sebastião Salésio Heerdt Chefe de gabinete da Reitoria Fabian M artins de Castro Pró-Reitor Adm inistrativo M arcus Vinícius Anátoles da Silva Ferreira Cam pusSul Diretor:Valter Alves Schm itzNeto Diretora adjunta:Alexandra Orseni Cam pusNorte Diretor:Ailton Nazareno Soares Diretora adjunta:Cibele Schuelter Cam pusUnisulVirtual Diretor:João Vianney Diretora adjunta:Jucim ara Roesler Equipe UnisulVirtual

Adm inistração Renato AndréLuz Valm ir Venício Inácio Bibliotecária Soraya Arruda W altrick Coordenação dosCursos Adriano Sérgio da Cunha Ana Luisa M ülbert Ana Paula Reusing Pacheco Cátia M elissa S.Rodrigues (Auxiliar) Charles Cesconetto Diva Marília Flem m ing Elisa Flem m ing Luz Itam ar Pedro Bevilaqua Janete Elza Felisbino Jucim ara Roesler Lilian Cristina Pettres (Auxiliar) Lauro JoséBallock LuizGuilherm e Buchm ann Figueiredo LuizOtávio Botelho Lento M arcelo Cavalcanti M auri LuizHeerdt M auro Faccioni Filho M ichelle Denise Durieux Lopes Destri Nélio Herzm ann Onei Tadeu Dutra Patrícia Alberton Patrícia Pozza Raulino Jacó Brüning Design Gráfico Cristiano Neri Gonçalves Ribeiro (coordenador) Adriana Ferreira dos Santos AlexSandro Xavier Evandro Guedes M achado Fernando Roberto Dias Zim m erm ann Higor Ghisi Luciano

Pedro Paulo Alves Teixeira RafaelPessi Vilson Martins Filho Equipe DidáticoPedagógica Angelita MarçalFlores Carm en M aria Cipriani Pandini Carolina Hoeller da Silva Boeing Cristina Klipp de Oliveira Daniela Erani M onteiro W ill Dênia Falcão de Bittencourt Elisa Flem m ing Luz Enzo de Oliveira M oreira Flávia Lum i Matuzawa Karla Leonora Dahse Nunes Leandro Kingeski Pacheco Ligia Maria Soufen Tum olo M árcia Loch Patrícia M eneghel Silvana Denise Guim arães Tade-Ane de Am orim Vanessa de Andrade M anuel Vanessa Francine Corrêa Viviane Bastos Viviani Poyer Logística de Encontros Presenciais Caroline Batista (Coordenadora) Aracelli Araldi Graciele Marinês Lindenm ayr JoséCarlos Teixeira Letícia Cristina Barbosa Kênia Alexandra Costa Herm ann M arcia Luzde Oliveira Priscila Santos Alves Logística de M ateriais Jeferson Cassiano Alm eida da Costa (coordenador)

Eduardo Kraus

M onitoria e Suporte Rafaelda Cunha Lara (coordenador) Adriana Silveira Caroline M endonça Edison Rodrigo Valim Francielle Arruda Gabriela M alinverni Barbieri Gislane Frasson de Souza Josiane Conceição Leal M aria Eugênia Ferreira Celeghin Sim one Andréa de Castilho Vinícius M aycotSera.m Produção Industriale Suporte Arthur Em m anuelF. Silveira (coordenador) Francisco Asp ProjetosCorporativos Diane DalM ago Vanderlei Brasil Secretaria de Ensino a Distância Karine Augusta Zanoni (secretária de ensino) Djeim e Sam m er Bortolotti Carla Cristina Sbardella Grasiela M artins Jam es M arcelSilva Ribeiro Lam uniêSouza Liana Pam plona M aira M arina M artins Godinho M arcelo Pereira M arcos Alcides M edeiros Junior M aria IsabelAragon

Olavo Lajús Priscilla Geovana Pagani Silvana Henrique Silva Secretária Executiva Viviane Schalata M artins Tecnologia Osm ar de Oliveira Braz Júnior (coordenador) Ricardo Alexandre Bianchini Rodrigo de Barcelos M artins Edição – Livro Didático ProfessorConteudista Carlos Fernando M artins Design Instrucional Daniela Erani M onteiro W ill Carolina Hoeller da Silva Flavia Lum i Matuzawa (3a edição revista e atualizada) Leandro Kingeski Pacheco (4a edição revista e atualizada) Projeto Gráfico e Capa Equipe UnisulVirtual Diagram ação RafaelPessi Revisão Ortográfica Revisare

Palavras do professor Olá caro estudante, pronto para mais uma etapa? Na verdade, agora você vai aprimorar o que estudou em Lógica de Programação I. Não imagine que está na metade do caminho, tendo em vista que o estudo da lógica de programação é contínuo e eterno, pelo menos para quem quer ser um programador verdadeiro. Ainda hoje, mesmo depois de muitos anos trabalhando com programação, cada algoritmo que implemento é uma forma de exercitar os conceitos. Trato cada algoritmo como um desafio a ser vencido. Você deve pensar assim também, que lógica de programação é um aprendizado contínuo e dinâmico; que cada problema solucionado por um algoritmo de programação é um degrau alcançado. Isso pode ajudar e muito nos desafios desta disciplina. Lembre-se, um programador diferencia-se do outro pela quantidade de exercícios que ele faz. Portanto, aproveite esse material de base para se aprofundar. Consulte algumas bibliografias que poderão ajudá-lo a resolver outros problemas de programação. Quanto mais você estudar, melhor vai ficar. E quanto melhor ficar, mais você vai estudar. É um ciclo contínuo e desafiador. Planeje o seu tempo de forma que o estudo de lógica de programação se torne uma diversão. Se assim for, você já tem o espírito de programador. Bom estudo! Professor Carlos Fernando Martins.

logica_2_livro_caderno.indb 9

7/12/2006 14:20:50

logica_2_livro_caderno.indb 10

7/12/2006 14:20:50

Plano de estudo O plano de estudos visa a orientá-lo/a no desenvolvimento da Disciplina. Nele, você encontrará elementos que esclarecerão o contexto da Disciplina e sugerirão formas de organizar o seu tempo de estudos. O processo de ensino e aprendizagem na UnisulVirtual leva em conta instrumentos que se articulam e se complementam. Assim, a construção de competências se dá sobre a articulação de metodologias e por meio das diversas formas de ação/ mediação. São elementos desse processo: 

o livro didático;



o Espaço UnisulVirtual de Aprendizagem - EVA;



as atividades de avaliação (complementares, a distância e presenciais).

Ementa Continuação da “Lógica de Programação I” com aprofundamento dos estudos com Fluxogramas e Diagrama de Blocos. Linguagens de programação, Códigos computacionais e ambientes de desenvolvimento. Exercícios de Programação Linear, de Programação Estruturada e de Programação Visual.

Objetivos 



logica_2_livro_caderno.indb 11

Desenvolver a capacidade do aluno em pensar logicamente, sendo assim, capaz de desenvolver algoritmos computacionais de média e alta complexidade. Elaborar algoritmos de programação de média e alta complexidade.

7/12/2006 14:20:50

Universidade do Sul de Santa Catarina

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

Agenda de atividades/ Cronograma 

Verifique com atenção o EVA, organize-se para acessar periodicamente o espaço da Disciplina. O sucesso nos seus estudos depende da priorização do tempo para a leitura; da realização de análises e sínteses do conteúdo; e da interação com os seus colegas e tutor.



Não perca os prazos das atividades. Registre no espaço a seguir as datas, com base no cronograma da disciplina disponibilizado no EVA.



Use o quadro para agendar e programar as atividades relativas ao desenvolvimento da Disciplina.

12

logica_2_livro_caderno.indb 12

7/12/2006 14:20:50

Lógica de Programação II

Atividades Avaliação a Distância 1 Avaliação Presencial 1 Avaliação Presencial 2 (2ª chamada) Avaliação Final (caso necessário)

Demais atividades (registro pessoal)

13

logica_2_livro_caderno.indb 13

7/12/2006 14:20:50

logica_2_livro_caderno.indb 14

7/12/2006 14:20:51

UNIDADE 1

Manipulação de vetores

1

Objetivos de aprendizagem 

Conhecer os algoritmos de maiores complexidades.



Construir algoritmos com utilização de vetores.

Seções de estudo Seção 1 Conceito e declaração de vetores. Seção 2 Operação de vetores. Seção 3 Algoritmos com manipulação de vetores.

logica_2_livro_caderno.indb 15

7/12/2006 14:20:51

Universidade do Sul de Santa Catarina

Para início de conversa Antes de iniciar o estudo sobre vetores, você deve recordar o que é uma variável e para que ela serve, certo? Bem, voltando à unidade 4 de Lógica de Programação I, temos que variável é a representação simbólica dos elementos de memória de um computador. Cada variável corresponde a uma posição de memória, cujo conteúdo pode se alterado ao longo do tempo durante a execução de um programa. Embora uma variável possa assumir diferentes valores, ela só pode armazenar um valor a cada instante. Você também estudou que as variáveis podem ser de três tipos: numéricas, alfanuméricas e lógicas, e que para declarar uma variável precisamos definir o seu nome e que tipo de dados será armazenado nela. Veja a seguir: início nome: literal {variável do tipo literal} idade: numérica {variável do tipo numérica} fim

Outro exemplo bem fácil, já utilizando o sinal de atribuição. Veja. início nome: literal {variável do tipo literal} idade: numérica {variável do tipo numérica} idade  22 {variável idade assume valor 22} nome  “Paulo Pereira” {variável nome assume “Paulo Pereira”} fim

16

logica_2_livro_caderno.indb 16

7/12/2006 14:20:51

Lógica de Programação II

O algoritmo acima, amplamente discutido em Lógica de Programação I, serve de base para a seguinte questão: Suponha que precisamos cadastrar dois nomes de clientes com suas respectivas idades. Como fazer? Ora, parece bem simples, você não acha? Basta criar duas novas variáveis, conforme mostro a seguir: início nome1, nome2: literal {variáveis do tipo literal} idade1, idade2: numérica {variáveis do tipo numérica} idade1  22 {variável idade1assume valor 22} nome1  “Paulo Pereira” {variável nome1 assume “Paulo Pereira”} idade2  38 {variável idade2 assume valor 38} nome2  “Ana Luiza” {variável nome2 assume “Ana Luiza”} fim

Mas, e se quisermos criar um cadastro de alunos de um colégio? E agora? Quantas variáveis precisamos criar? 500, 2500, 10000? Basta utilizar o conceito de vetores para lidar com situações como essas. - Toda a lógica de programação estudada até agora vai se repetir. Não há nenhum outro comando. Tudo que você aprendeu em Lógica de Programação I será utilizado agora. Os únicos assuntos novos são o conceito, a criação e a utilização de vetores.

Unidade 1

logica_2_livro_caderno.indb 17

17

7/12/2006 14:20:51

Universidade do Sul de Santa Catarina

SEÇÃO 1 - Conceito e declaração de vetores Antes de definir vetor, imaginemos a seguinte situação. Precisamos criar um programa que armazene as seguintes notas de um aluno em Lógica de Programação II: 8.0, 10.0, 9.0, 10.0, 8.5, 10.0 e que calcule a média final. A solução é bem simples, conforme já visto em Lógica de Programação I.

início nota, conta, media, soma: numérico soma  0 {inicializa variável soma com o valor 0} para conta de 1 até 6 passo 1 faça {laço de repetição} escreva “Entre com a nota: “ leia nota {leitura da nota} soma  soma + nota {soma de todas as notas entradas} fim-para media  soma/6 {calcula a média final} escreva “A média final é “, media {mostra o resultado na tela} fim

Mas agora consta a seguinte complexidade: necessitamos imprimir também todas as notas do aluno, além da média final. Uma solução extremamente pobre seria criar seis variáveis para armazenar as seis notas digitadas e imprimi-las. Mas, se tiver mais notas (80, por exemplo), seu algoritmo já não resolveria mais o problema. Para resolver essa situação, utilize o conceito de vetor. Um vetor nada mais é do que uma variável que pode armazenar vários valores do mesmo tipo.

Bem, mas o que significa isso? Inicialmente, acompanhe o conceito de variáveis e sua definição.

18

logica_2_livro_caderno.indb 18

7/12/2006 14:20:51

Lógica de Programação II

Quando definimos uma variável, alocamos um espaço na memória do computador para armazenar uma e somente uma constante por vez, seja ela literal, numérica ou lógica. Quando atribuímos um valor à variável sobrescrevemos seu conteúdo. Por exemplo, ao criarmos uma variável numérica chamada nota, criamos um espaço na memória para armazenar apenas um valor numérico por vez, conforme a seguir: nota: numérica ....... nota  10

{variável armazena valor numérico 10}

escreva “O valor da variável nota é: “, nota {aqui, o valor impresso será 10} nota  8

{variável armazena valor numérico 8}

escreva “O valor da variável nota é: “, nota {aqui, o valor impresso será 8, ou seja, sobrescrevemos o valor 10} ......

Isso parece bem lógico, pois estamos escrevendo na mesma posição de memória do computador. Lembre-se que, sempre que criarmos uma variável, estaremos criando um espaço na memória do computador para armazenar dados. É um endereço na qual o computador se referencia para manipular os dados em questão. Como queremos armazenar vários valores numéricos, precisamos criar várias posições de memória sob o nome de uma mesma variável. O que devemos especificar é quantos valores queremos armazenar, ou seja, quantas posições de memória queremos alocar para armazenar esses números. Vejamos o exemplo para armazenar as notas de um aluno conforme o algoritmo anterior. Queremos armazenar seis valores diferentes em seis posições de memória diferentes:

8.0

10.0

9.0

10.0

Unidade 1

logica_2_livro_caderno.indb 19

8.5

10.0

19

7/12/2006 14:20:51

Universidade do Sul de Santa Catarina

Devemos criar 6 posições de memórias para armazenar esses valores. Como solução, podemos criar 6 variáveis ou criar um vetor com 6 posições de memória. Esse esquema representa um vetor do tipo numérico de 6 posições, ou seja, 6 endereços de memória consecutivos alocados no computador que podem armazenar 6 valores numéricos diferentes. Cada quadradinho representa uma posição de memória, onde podem ser armazenados os valores numéricos. O número de posições que queremos criar é especificado na declaração. Em resumo: um vetor é prático quando precisamos manipular um conjunto de dados do mesmo tipo sem que seja necessário declarar muitas variáveis. Por exemplo: O registro de 26 livros e seus respectivos preços; o registro de notas de 13 avaliações de um aluno etc. Mas como criar um vetor? É muito simples. Especificamos o nome do vetor e o número de posições da memória que queremos alocar. Cada posição de memória pode armazenar um valor diferente dos demais.

: vetor [tamanho do vetor]

Sintaxe do vetor

Quando um vetor é declarado, ele se apresenta assim na memória: Valor 1

Valor 2

Valor n

20

logica_2_livro_caderno.indb 20

7/12/2006 14:20:51

Lógica de Programação II

notas: vetor[6] numérico {vetor numérico de 6 posições. Pode armazenar até 6 valores numéricos diferentes} estados: vetor[27] literal {vetor de caracteres de 27 posições. Pode armazenar até 27 caracteres diferentes}

Importante Assim como na criação das variáveis, para a criação de vetores não precisamos especificar os endereços de memória do computador. Isso é feito automaticamente, sem que sequer saibamos onde os valores estão armazenados na memória. A única coisa que sabemos é que é alocado um espaço para armazenar esses valores e que são armazenados em endereços de memória seqüenciais. Para acessar esses endereços, ou os valores armazenados nesses endereços, é que é um pouco diferente das variáveis. Veremos isso na seção 2.

Bem, até agora não resolvemos o nosso problema de mostrar todas as notas do aluno mais a média final, conforme solicitado. Sabemos que precisaremos criar um vetor conforme explicado, porém, ainda não sabemos manipular ou realizar operações com eles. A próxima seção tratará sobre isso.

Importante Alguns autores preferem utilizar uma sintaxe diferente para a criação de vetores, conforme a seguir:

: vetor[.. ]

Unidade 1

logica_2_livro_caderno.indb 21

21

7/12/2006 14:20:51

Universidade do Sul de Santa Catarina

notas: vetor [1..50]: numérico {criamos um vetor que inicia com índice 1 e vai até 50}. O mesmo vetor poderia ser criado da seguinte maneira: notas: vetor [0..49]: numérico {criamos um vetor que inicia com índice 0 e vai até 49}.

Qual a melhor maneira? Você pode escolher. Porém, em linguagens de programação de alto nível como C/C++, JAVA etc., os vetores começam sempre com índice 0. Desde que você faça a conversão correta entre pseudocódigo e uma linguagem de programação de alto nível, não há problemas de qual a maneira que você vai criar seus vetores. O importante é que seja claro e sem quaisquer ambigüidades.

SEÇÃO 2 - Operação de vetores Até agora nossa preocupação foi em saber como criar um vetor e saber quando ele é necessário. Sempre que trabalharmos com grandes quantidades de dados, estaremos criando um ou mais vetores. A sintaxe da criação é bastante simples conforme seção anterior. Mas como iremos trabalhar com um vetor? Por exemplo, como atribuir valores a um vetor? Como recuperar um valor de um vetor? Como realizar operações básicas de adição, subtração etc. de vetores? Bem, vamos por etapa. Inicialmente vamos inserir valores em cada parte do vetor. Como já foi dito anteriormente, quando um vetor é declarado, são reservados espaços na memória para armazenar as constantes (literal, numérica ou lógica). Porém, como acessar esses espaços? É muito simples, basta indicar a posição que você quer acessar.

22

logica_2_livro_caderno.indb 22

7/12/2006 14:20:52

Lógica de Programação II

Veja um exemplo de um vetor de notas: notas: vetor[6] numérico Quando o vetor notas é declarado, ele se apresenta assim na memória:

Cada quadrado, representando uma posição de memória, é uma posição do vetor declarado. Chamamos essa posição de índice do vetor. O primeiro quadrado (posição inicial), dizemos que tem índice 0 e o acesso a essa posição se dá através do nome do vetor seguido do abre colchete ‘[‘, do valor 0, seguido do fecha colchete ‘]’. Para as posições seguintes, temos os índices 1, 2, 3, .... . Para atribuirmos um valor à posição inicial do vetor notas, podemos então fazer: notas[0]  8.0 Para atribuirmos um valor à segunda posição do vetor notas, podemos fazer: notas[1]  10.0 Para atribuirmos um valor à terceira posição do vetor notas, podemos fazer: notas[2]  9.0. E assim sucessivamente, até preencher todo o vetor de notas. Nosso vetor ficaria assim preenchido: 8.0

10.0

9.0

Importante Perceba que a primeira posição do vetor tem índice 0, a segunda posição tem índice 1, a terceira posição tem índice 2, e assim sucessivamente. Isso significa que para um vetor de tamanho N, o último índice é N-1. Por exemplo, um vetor de notas de tamanho 150, declarado da seguinte forma notas: vetor [150] numérico tem índices de vão de 0 (posição inicial) até 150-1, ou seja, índice 149. Não existe a posição 150. 150 é o tamanho do vetor que vai de 0 até 149.

Unidade 1

logica_2_livro_caderno.indb 23

23

7/12/2006 14:20:52

Universidade do Sul de Santa Catarina

Todo o processo de manipulação agora se torna bastante simples, bastando especificar a posição do vetor onde estaremos armazenando os valores. Voltando ao nosso exemplo, onde queremos imprimir as notas do aluno, além da sua média, podemos armazenar os valores (notas digitadas) em um vetor de notas. Cada nota digitada será armazenada em uma posição específica. Perceba que temos 6 notas como entrada, o que sugere um vetor de tamanho 6, com índices variando de 0 até 5. início conta, media, soma: numérico notas: vetor[6] numérico {vetor para armazenar as notas digitadas} soma  0 {inicializa variável soma com o valor 0} para conta de 0 até 5 passo 1 faça {laço de repetição} escreva “Entre com a nota: “ leia notas[ conta ] {leitura das notas. Perceba que o que aparece entre colchetes é a variável conta. Dentro do laço de repetição, a variável conta vai sendo incrementada de 1, sendo seu valor inicial de 0 e o final de 5, conforme o comando para. Para o primeiro laço de repetição, a variável conta tem valo 0. Sendo assim, o comando leia notas[ conta ] está lendo notas na posição 0, ou seja, leia notas[ 0 ]. Para o segundo laço de repetição, a variável conta tem valo 1. Sendo assim, o comando leia notas[ conta ] está lendo notas na posição 1, ou seja, leia notas[ 1 ], e assim sucessivamente até atingir o valor 5, última posição do vetor. } soma  soma + notas[conta] {soma das notas digitadas} fim-para {para imprimir as notas, basta ler o vetor notas da posição 0 até a posição 5. Façamos com o laço de repetição novamente} para conta de 0 até 5 passo 1 faça {laço de repetição} escreva “Nota: “, notas[conta] fim-para media  soma/6

{calcula a média final}

escreva “A média final é “, media {mostra o resultado na tela} fim

Dica: para trabalhar com vetores, sempre precisamos especificar o seu tamanho inicial. Sendo assim, a forma mais usual e fácil para escrita/leitura de valores para/de vetores pode ser feita através do comando para/fim-para. Você consegue saber por quê?

24

logica_2_livro_caderno.indb 24

7/12/2006 14:20:52

Lógica de Programação II

Tudo, agora, não passa de operações simples, como se estivéssemos manipulando variáveis independentes. Por exemplo, vamos criar um vetor de números pares e um vetor de números ímpares: a diferença entre eles será armazenada em um terceiro vetor. Vamos assumir os 50 primeiros valores numéricos, ou seja, de 0 até 49. início {declaração das variáveis} pares: vetor[25] numérico {armazena números pares com 25 posições, pois se são os 50 primeiros números positivos, temos apenas 25 pares} impares: vetor[25] numérico {armazena números ímpares} subtracao: vetor[25] numérico {armazena a diferença entre números pares e ímpares} j,i: numérico {variáveis utilizadas para realizar o laço de repetição} {vamos armazenar os números pares no vetor pares} j  0 {será o contador do vetor pares e vetor ímpares} para i de 0 até 49 passo 2 faça {armazena 0,2,4,6.....48. Perceba que o passo do laço de repetição é de 2 em 2. Então o valor da variável i pula de 2 em 2. Mas no vetor pares precisamos guardar em posições seqüenciais. Vamos criar uma outra variável para contar os vetores pares (j).} pares[ j ]  i j  j +1 fim-para {vamos armazenar os números ímpares no vetor ímpares} j  0 {inicializar novamente, para iniciar o vetor impares de 0.} para i de 1 até 49 passo 2 faça impares [ j ]  i {armazena 1,3,5,7.....49. Perceba que o passo do laço de repetição é de 2 em 2, mas a contagem começa com 1. O contador j irá guardar o valor de i na posição correta em seqüência.} jj+1 fim-para {vamos realizar as subtrações de cada posição dos vetores pares e ímpares e armazenar o resultado no vetor subtracao. A estrutura repetição para-faça inicia em 0 e vai até 25, pois cada vetor tem apenas 25 elementos (25 pares e 25 ímpares) dentre os 50 primeiros números 0-49} para i de 0 até 24 passo 1 faça subtracao[ i ] = pares[ i ] – impares[ i ] fim-para {como resultado de saída, vamos imprimir os vetores} para i de 0 até 24 passo 1 faça escreva “Números Pares: “, pares[ i ] escreva “Números Ímpares “, impares[ i ] escreva “Diferença Pares - Ímpares: “, subtracao[ i ] fim-para fim Unidade 1

logica_2_livro_caderno.indb 25

25

7/12/2006 14:20:52

Universidade do Sul de Santa Catarina

Bem, agora você já sabe criar vetores, inserir e recuperar valores de vetores. Na próxima seção, vai estudar alguns algoritmos de programação utilizando vetores.

SEÇÃO 3 - Algoritmos com manipulação de Vetores Conforme falamos na disciplina de Lógica de Programação I, a melhor maneira de aprender a programar é programando. Continua valendo a idéia: A melhor maneira de aprender a utilizar vetores é construindo algoritmos com vetores. Nesta seção, mostraremos algumas aplicações que manuseiam vetores. Para esses exemplos, vamos definir as variáveis com nomes maiúsculos apenas por questões de estética. Vale lembrar que, de acordo com a seção 4 de Lógica de Programação I, por padrão, as variáveis são todas com letras minúsculas, mas isso para as linguagens de programação de alto nível como C/C++, JAVA, Visual etc. Para o pseudocódigo, podemos representar por letras maiúsculas, sem perda de padronização. 1. Ler um vetor de 50 números e montar outro vetor com os valores do primeiro multiplicados por 3. Pseudocódigo: início VET1,VET2 : vetor [50] numérico CONTADOR : numérico para CONTADOR de 0 até 49 faça leia “Digite um número: “,VET1[CONTADOR] VET2[CONTADOR]  VET1[CONTADOR] * 3 fim-para fim

26

logica_2_livro_caderno.indb 26

7/12/2006 14:20:52

Lógica de Programação II

2. Um armazém contém 400 produtos e para cada tipo de produto existe um código. Faça um algoritmo para ler o código do produto e a quantidade em estoque. Depois, monte dois vetores para armazenar respectivamente os códigos das mercadorias e a quantidade dos produtos. Pseudocódigo: início {declaração das variáveis} CODIGOPRODUTO : vetor [400] literal QUANTIDADE : vetor [400] numérico CONTADOR : numérico para CONTADOR de 0 até 399 faça {leitura de 400 códigos de produtos e a quantidade em estoque de cada um} escreva “Digite o código do produto: “ leia CODIGOPRODUTO[CONTADOR] escreva “Digite a quantidade do produto em estoque: “ leia QUANTIDADE[CONTADOR] fim-para fim

3. Ler um vetor contendo 100 números, que correspondem a matrículas de alunos. Ler cinco números e imprimir uma mensagem informando se eles estão ou não presentes no vetor. Pseudocódigo: início {declaração de variáveis} ALUNOS : vetor[100] numérico {lembre que o tamanho do vetor é 100, mas ele vai de 0 até 99} POS, PESQUISADO, CONT :numérico {laço de repetição para preencher o vetor ALUNOS} para POS de 0 até 99 faça escreva “Digite o código de matrícula de um aluno: “ leia ALUNOS[POS] fim-para Unidade 1

logica_2_livro_caderno.indb 27

27

7/12/2006 14:20:53

Universidade do Sul de Santa Catarina

{5 entradas de dados para verificar se alunos estão cadastrados ou não} para CONT de 1 até 5 faça escreva “Digite o número de matrícula a ser pesquisado: “ leia PESQUISADO POS  -1 {inicialmente é atribuído o valor –1 para a variável POS porque na seqüência, no comando repita, a variável POS será incrementada de 1 (POS  POS + 1). Como queremos começar a ler o vetor ALUNOS a partir da posição 0, no primeiro laço, a variável POS assume valor 0} repita POS  POS+1 {repete o laço até que o número sendo pesquisado (valor armazenado na variável PESQUISADO) seja igual ao número armazenado no vetor ALUNOS em uma determinada posição POS, ou que a variável POS seja maior que o tamanho do vetor ALUNOS, nesse caso, seja maior que 100} até que PESQUISADO = ALUNOS[POS] OU POS > 99 se POS > 99 então {se a variável POS possui um valor superior a 99, ou seja, 100, isso significa que todo o vetor ALUNOS foi lido desde o índice 0 até 99 (100 alunos), mas que não há nenhum número armazenado nesse vetor é igual ao valor armazenado na variável PESQUISADO} escreva “Número não cadastrado !” senão escreva “Número localizado na posição “, POS , “ do vetor.” fim-se fim-para fim

4. Criar um algoritmo que leia o preço de compra e o preço de venda de 100 mercadorias. O algoritmo deverá imprimir quantas mercadorias proporcionam: 

Lucro menor do que 10%



Lucro maior ou igual 10% e menor ou igual a 20%



Lucro superior a 20%

Pseudocódigo: 28

logica_2_livro_caderno.indb 28

7/12/2006 14:20:53

Lógica de Programação II

início {declaração de variáveis} PRECOCOMPRA: vetor [100] numérico {armazena os preços de compra das mercadorias} PRECOVENDA: vetor [100] numérico {armazena os preços de venda das mercadorias} LUCRO, TOTLUCROMENOR10, TOTLUCROMENOR20, TOTLUCROMAIOR20: numérico {variáveis utilizadas para armazenar o lucro, o lucro menor que 10%, menor do que 20% e maior do que 20%, respectivamente} i : numérico {variável utilizada como contadora para laços de repetição} {precisamos inicializar as variáveis contadoras de lucros} TOTLUCROMENOR10  0 TOTLUCROMENOR20  0 TOTLUCROMAIOR20  0 {entrada de dados} para I de 0 até 99 passo 1 faça {vamos especificar o preço de venda e de compra de todas as 100 mercadorias} escreva “Entre com o preço de compra da mercadoria: “ leia PRECOCOMPRA[ i ] escreva “Entre com o preço de venda da mercadoria: “ leia PRECOVENDA[ i ] fim-para {Processamento do algoritmo. Vamos verificar o lucro de cada mercadoria (preço de venda – preço de compra) e verificar as condições de lucro (10%, 20% ou maior do que 20%. Para isso, vamos ter que ler os vetores PRECOVENDA e PRECOCOMPRA novamente} para i de 0 até 99 passo 1 faça LUCRO  (PRECOVENDA[ i ] – PRECOCOMPRA[ i ]) * 100 / PRECOCOMPRA[ i ] {se a diferença entre preço de venda e preço de compra, ou seja, o lucro for menor do que 10, então incrementa a variável contadora de mercadorias com lucros inferior a 10%} se LUCRO < 10.0 então TOTLUCROMENOR10 

TOTLUCROMENOR10 + 1

senão {se o lucro não é inferior a 10%, então ele só pode ser superior a 10%. Mas quanto? Precisamos saber se o lucro é menor a 20% ou superior a esse valor. Por isso colocamos outra condição dentro do comando senão. Essa condição verifica se o lucro é inferior ou superior a 20%.}

Unidade 1

logica_2_livro_caderno.indb 29

29

7/12/2006 14:20:53

Universidade do Sul de Santa Catarina

se LUCRO < 20.0 então TOTLUCROMENOR20  TOTLUCROMENOR20 + 1 senão TOTLUCROMAIOR20  TOTLUCROMAIOR20 + 1 fim-se {fim da condição que testa se lucro é menor do que 20.0} fim-se

{fim da condição que testa se lucro é menor do que 10.0}

fim-para {saída do algoritmo} escreva “Número de mercadorias com lucro inferior a 10%: “, TOTLUCROMENOR10 escreva “Número de mercadorias com lucro maior ou igual a 10% e menor do que 20%: “, TOTLUCROMENOR20 escreva “Número de mercadorias com lucro superior a 20%: “, TOTLUCROMAIOR20 fim

Síntese Finalizamos mais uma etapa. Mais um passo da nossa caminhada. Nessa unidade, vimos que um vetor é uma variável que pode armazenar várias constantes do mesmo tipo (homogêneas). Isso permite manipular uma grande quantidade de dados sem a necessidade de declarar várias variáveis. Para declarar um vetor em pseudocódigo, utilizamos o seguinte comando: : vetor [tamanho do vetor] Quando um vetor é declarado, ele se apresenta assim na memória:

Valor 1

Valor 2

Valor n

30

logica_2_livro_caderno.indb 30

7/12/2006 14:20:53

Lógica de Programação II

Cada posição (representado por um quadrado no desenho acima) é uma posição de memória do computador. Para inserir ou ler valores de um vetor basta especificar seu nome e o índice (posição) que queremos acessar dentro do vetor. Por exemplo: notas [10]  8.5. Sabendo que o índice dos vetores começa com o valor numérico 0. Quando colocamos notas [10] estamos nos referindo ao índice 10, mas a posição no vetor (representado por um quadrado) é o 9. Poderíamos representar as posições de um vetor de tamanho 5 conforme apresentado abaixo:

Valor 1

Valor 2

[0]

[1]

Valor n

[2]

[3]

[4]

Podemos perceber que o índice [3] está no quarto quadrado. Tudo isso porque um vetor tem seu início no índice 0, conforme já dito. Bem, um vetor é unidimensional, ou seja, apresenta apenas uma dimensão ou 1 linha. Poderíamos estar trabalhando com vetores bidimensionais ou vetores que possuem várias colunas e várias linhas. A esses vetores damos o nome de matrizes. No próximo capítulo, estaremos estudando algoritmos que utilizam os conceitos de matrizes. Até lá!

Unidade 1

logica_2_livro_caderno.indb 31

31

7/12/2006 14:20:53

Universidade do Sul de Santa Catarina

Atividades de auto-avaliação 1. Crie um vetor para armazenar 25 valores de temperaturas. 2. Crie um vetor para armazenar 150 alunos de um colégio infantil. 3. Um site na web precisa registrar 2500 produtos cadastrados de um fornecedor. Crie um vetor para representar esses produtos. 4. Criar um algoritmo que realize as reservas de passagem aéreas de uma companhia. Além da leitura do número de vôos e da quantidade de lugares disponíveis, leia vários pedidos de reserva, constituídos do número da carteira de identidade e do número do vôo desejado. Para cada cliente, verificar se há possibilidade no vôo desejado. Em caso afirmativo, imprimir o número de identidade do cliente e o número do vôo, atualizando o número de lugares disponíveis. Caso contrário, avisar ao cliente a inexistência de lugares.

Saiba mais Consulte o site http://www.unidev.com.br/artigos. Há uma série de algoritmos já feitos. É um bom exercício fazer os exemplos e comparar com o que está feito. Também, neste site, constam dicas importantes de lógica de programação. Dicas de programação nunca são demais, não se esqueça disso!

32

logica_2_livro_caderno.indb 32

7/12/2006 14:20:53

UNIDADE 2

Manipulação de matrizes

2

Objetivos de aprendizagem 

Entender o conceito de matrizes.



Conhecer e praticar montagens de matrizes.



Construir algoritmos com utilização de matrizes.

Seções de estudo Seção 1 Conceito e declaração de matrizes. Seção 2 Operação de matrizes. Seção 3 Algoritmos com manipulação de matrizes.

logica_2_livro_caderno.indb 33

7/12/2006 14:20:53

Universidade do Sul de Santa Catarina

Para início de conversa Trabalhamos na unidade anterior apenas com vetores unidimensionais, ou seja, variáveis que podem conter diferentes valores de um mesmo tipo em diversas colunas. Na verdade, o conceito de vetor pode ser representado por uma tabela com 1 linha e várias colunas, onde o tamanho do vetor especifica o número de colunas, conforme você pode ver a seguir: Linha 0

Valor 1

Valor 2

Valor 3

Coluna 0

Coluna 1

Coluna 2

...

Valor n Coluna n-1

Perceba na figura anterior que temos uma linha, denominada linha 0, e várias colunas, denominadas de colunas 0, coluna 1 e assim sucessivamente. Como vimos na unidade anterior, cada valor de um vetor é armazenado em uma posição de memória, ou seja, em um dos quadrados representados na figura anterior. Já sabemos também que não precisamos saber o endereço de memória do computador para acessar os elementos do vetor, bastando especificar o índice que queremos acessar.

Por exemplo, para um vetor chamado de NOTAS de tamanho 5, podemos acessar os índices de 0 até 4 (lembrese de que um vetor sempre começa com índice 0). Para acessar qualquer posição do vetor, basta especificar o índice de interesse: NOTAS [2]  7.5. Se observarmos o índice que estamos acessando, no exemplo em questão, o índice 2 do vetor NOTAS, podemos representá-lo conforme a figura anterior:

Linha 0

7.5 Coluna 0

Coluna 1

Coluna 2

Coluna n-1

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

34

logica_2_livro_caderno.indb 34

7/12/2006 14:20:54

Lógica de Programação II

cada um dos valores, seja ele numérico, alfanumérico ou lógico, e que o índice que especificamos para acessar o vetor é exatamente o número da coluna desse vetor. Outro exemplo, NOTAS [4]  10.0. Podemos dizer que estamos inserindo no vetor NOTAS o valor 10.0 no índice 4, ou seja, na linha 0 e coluna 4 do vetor.

Mas agora vem a questão: e, se quisermos trabalhar com um vetor que possua várias linhas e várias colunas conforme a figura a seguir?

Temos agora várias linhas e colunas. Damos o nome para essas estruturas de matrizes. - Nesta unidade você vai conhecer o que são matrizes e saber o porquê de sua importância no mundo da programação.

Unidade 2

logica_2_livro_caderno.indb 35

35

7/12/2006 14:20:54

Universidade do Sul de Santa Catarina

SEÇÃO 1 - Conceito e declaração de matrizes Uma matriz nada mais é do que um vetor de 2 dimensões (linhas e colunas) capaz de armazenar variáveis do mesmo tipo (numérica, literal ou lógica).

Pode ser representada por uma tabela, conforme você pode ver a seguir:

Cada quadrado representa uma posição de memória onde podem ser armazenadas as variáveis, de maneira idêntica aos vetores. Porém, os vetores são unidimensionais (apenas colunas) e as matrizes são bidimensionais (2 dimensões: linhas e colunas). Agora teremos não somente a linha 0, mas também a linha 1, a linha 2 e assim sucessivamente. O número de posições que queremos criar é especificado na declaração, de forma similar a dos vetores. Mas qual a utilidade de uma matriz? Uma matriz é prática quando precisamos manipular um conjunto de dados do mesmo tipo, sem que seja necessário declarar muitas variáveis e precisamos fazer relações de 2 variáveis. Queremos registrar 4 temperaturas de três dias da semana (segunda-feira, terça-feira e quarta-feira). Nesse caso, temos duas variáveis: temperatura e dias da semana. A melhor maneira de representar isso é através de uma tabela, mostrando nas linhas os dias da semana e, nas colunas, as temperaturas medidas.

36

logica_2_livro_caderno.indb 36

7/12/2006 14:20:54

Lógica de Programação II

Veja a tabela a seguir: Dias da semana

Temperatura 1 Temperatura 2 Temperatura 3 Temperatura 4

Segunda

27

29

30

24

Terça

25

27

28

22

Quarta

21

23

25

20

Se olharmos para a tabela anterior, podemos saber, por exemplo, que na terça-feira, a 4ª temperatura medida foi 22ºC e que na quarta-feira a 2ª temperatura medida foi de 23ºC. Estamos fazendo uma correspondência entre a variável Temperatura e o Dia. Nesse caso, para determinar a temperatura em uma determinada hora de um dia. Para representar essa correspondência é que utilizamos o conceito de matrizes. Agora termos uma estrutura de linhas e colunas e não apenas de colunas como eram os vetores. Mas como criar uma matriz? É muito simples. Especificamos o nome da matriz seguido do número de linhas e colunas que a matriz conterá, além do tipo de variável que será armazenada. A exemplo de vetores, as matrizes só podem armazenar dados do mesmo tipo. Por exemplo: somente dados numéricos ou somente dados literais ou somente dados lógicos. Não podemos ter em uma matriz dados numéricos e literais ao mesmo tempo.

Sintaxe da matriz

: matriz [número de linhas][número de colunas]

notas_de_alunos: matriz[6][4] numérico {matriz que possui 6 linhas – numeradas de 0 até 5 e 4 colunas, numeradas de 0 até 3. Dizemos que a matriz tem dimensão de 6x4. No total, são 6x4 = 24 posições para armazenar valores numéricos} matriz_de_alunos: matriz[10][30] literal {matriz que possui 10 linhas – numeradas de 0 até 9 e 30 colunas, numeradas de 0 até 29. Dizemos que a matriz tem dimensão de 10x30. No total, são 10x30 = 300 posições para armazenar valores literais}

Unidade 2

logica_2_livro_caderno.indb 37

37

7/12/2006 14:20:54

Universidade do Sul de Santa Catarina

Assim como na criação de vetores, para a criação de matrizes não precisamos especificar os endereços de memória do computador. Isso é feito automaticamente, sem que sequer saibamos onde os valores estão armazenados na memória. A única coisa que sabemos é que é alocado um espaço para armazenar esses valores e que são armazenados em endereços de memória seqüenciais. Para acessar esses endereços ou os valores armazenados nesses endereços é que é um pouco diferente dos vetores. Veremos isso na seção 2. - Na próxima seção você vai estudar como manipular matrizes, ou seja, como inserir e ler valores a partir de matrizes.

SEÇÃO 2 - Operação de matrizes Até agora nossa preocupação foi em saber como criar uma matriz e saber quando ela é necessária. Sempre que trabalharmos com grandes quantidades de dados e precisamos relacionas duas ou mais variáveis, estaremos criando uma ou mais matrizes. A sintaxe da criação é bastante simples conforme seção anterior. Mas como iremos trabalhar com uma matriz? Por exemplo, como atribuir valores a uma matriz? Como recuperar um valor de uma matriz?

Para a nossa alegria, tudo é realizado de forma similar a dos vetores, somente com uma atenção especial: precisamos especificar qual a linha que estamos acessando, além da coluna como é feito com os vetores. Assim, para acessar as posições de uma matriz, basta indicar a linha e a coluna desejadas.

38

logica_2_livro_caderno.indb 38

7/12/2006 14:20:54

Lógica de Programação II

Exemplo: NOTAS. NOTAS: matriz [6][4] numérico

1. A Matriz NOTAS é uma matriz de dimensão 6x4, ou seja, 6 linhas por 4 colunas. 2. Para armazenar uma constante numérica na matriz NOTAS, precisamos identificar a linha e coluna que queremos acessar. Isso é feito da seguinte forma: nome da matriz [índice da linha][índice da coluna], lembrando que os índices começam sempre com o valor 0. Por exemplo, a 3ª (terceira) linha da matriz tem índice 2, isso por que a 1ª (primeira) linha tem o índice 0, a 2ª (segunda) linha tem índice 1 e a 3ª (terceira) o índice 2. 3. Para armazenar a constante numérica 10 na 3ª (terceira) linha (linha 2) da 2ª (segunda) coluna (coluna 1), utilizamos os índices da matriz NOTAS, nesse caso, o índice 2 para linha e o índice 1 para coluna. Assim, NOTAS [2][1]  10.0. Veja com fica a matriz.

10.0

Todo o processo de manipulação agora se torna simples, bastando especificar a posição onde estaremos armazenando os valores, ou seja, basta especificar o nome da matriz e, a seguir, entre colchetes, o índice que representa a linha e, depois, também entre colchetes, o índice que representa a coluna.

Unidade 2

logica_2_livro_caderno.indb 39

39

7/12/2006 14:20:54

Universidade do Sul de Santa Catarina

Dica: para trabalhar com matrizes, sempre precisamos especificar a sua dimensão, ou seja, o número de linha pelo número de colunas. Sendo assim, a forma mais usual e fácil para escrita/leitura de valores para/de matrizes pode ser feita através do comando para/fimpara. Você consegue saber o porquê?

1. Montar uma matriz nas dimensões 4x5 e imprimir a soma das linhas e colunas. Pseudocódigo:

início MAT : matriz [4][5] numérico {matriz de dimensão 4x5. 4 linhas e 5 colunas} SOMALINHA, SOMACOLUNA, LINHA, COLUNA : numérico {Aqui um fato importante. Para percorrer um vetor desde o seu início até o seu final, utilizamos o comando para/faça/fim-para. Agora temos que percorrer toda a matriz, ou seja, todas as linhas e colunas. O processo é bem simples. Para percorrer todas as colunas de uma linha de uma matriz continuamos utilizando o comando para/faça/fimpara. Assim que todas as colunas de uma linha são lidas ou acessadas, passa-se para a próxima linha. Novamente, para essa nova linha, todas as colunas são acessadas, e assim sucessivamente. Podemos perceber que para cada incremento da linha devemos ler ou acessar todas as colunas daquela linha. Isso sugere dois laços de repetição: 1 para pular as linhas e outro para pular as colunas. Dessa forma, elaboramos 2 laços de repetição, um para linha com a variável LINHA sendo incrementada de 0 até 3 (4 linhas no total), e um laço para coluna com a variável COLUNA sendo incrementada de 0 até 4 (5 colunas no total). Para cada repetição do laço dentro da linha executamos 5 repetições para as colunas, percorrendo assim toda a matriz} para LINHA de 0 até 3 passo 1 faça para COLUNA de 0 até 4 passo 1 faça escreva “Digite um número: “ leia MAT[LINHA][COLUNA] fim-para fim-para {Processamento do Algoritmo. Soma das linhas. A explicação desta parte está após o fim-para do primeiro laço de repetição}

40

logica_2_livro_caderno.indb 40

7/12/2006 14:20:55

Lógica de Programação II

para LINHA de 0 até 3 passo 1 faça SOMALINHA  0 para COLUNA de 0 até 4 passo 1 faça SOMALINHA  SOMALINHA + MAT[LINHA][COLUNA] fim-para escreva “Total da linha”, LINHA,”:”, SOMALINHA fim-para {Explicando a lógica anterior: Nossa matriz possui 4 linhas e 5 colunas. Sendo assim, vamos percorrer as linhas de 0 a 3 e as colunas de 0 a 4 (São os índices da matriz. Para o primeiro laço de repetição para LINHA de 0 até 3 passo 1 faça, a variável LINHA é incrementada de 0 até 3. Inicialmente ela tem valor numérico 0. O primeiro comando dentro do laço é inicializar a variável SOMALINHA igual a 0. A variável SOMALINHA armazenará a soma de todas os valores numéricos de cada linha. Sabendo que estamos na linha 0, devemos percorrer cada coluna dessa linha. Isso é feito pelo laço de repetição seguinte para COLUNA de 0 até 4 passo 1 faça. Quando o programa entra nesse segundo laço, a variável COLUNA é incrementada com passo 1, de 0 até 4, executando os comandos que estão dentro da estrutura para/faça/ fim-para, no nosso caso, apenas o comando SOMALINHA  SOMALINHA + MAT[LINHA][COLUNA]. Quando o segundo laço de repetição é finalizado, o programa executa os comandos seguintes ao fim-para, ou seja, executa o comando de impressão na tela escreva “Total da linha”, LINHA,”:”, SOMALINHA. Ao encontrar o fim-para do primeiro laço de repetição, o programa incrementa a variável LINHA de 1 no comando para LINHA de 0 até 3 passo 1 faça passando o valor da variável LINHA para o valor 1, e executa todos os comandos dentro da estrutura para/faça/fim-para novamente. Como SOMALINHA armazena o valor numérico da soma dos valores da linha anterior, a variável é reinicializada com valor 0. Um ótimo exercício é montar uma matriz e executar o algoritmo passo a passo. Essa é uma atividade para você fazer logo a seguir.} {Processamento do Algoritmo. Soma das colunas} para COLUNA de 0 até 4 passo 1 faça SOMACOLUNA  0 para LINHA de 0 até 3 passo 1 faça SOMACOLUNA  SOMACOLUNA + MAT[LINHA][COLUNA] fim-para escreva “Total da coluna”, COLUNA,”:”, SOMACOLUNA fim-para fim

Unidade 2

logica_2_livro_caderno.indb 41

41

7/12/2006 14:20:55

Universidade do Sul de Santa Catarina

SEÇÃO 3 - Algoritmos com manipulação de matrizes Você já deve ter observado que não criamos qualquer lógica para manipular tanto os vetores quanto as matrizes. Usamos os mesmos comandos que aprendemos em Lógica de Programação I, ou seja, comandos como leia, escreva, para/faça/fim-para, entre outros que poderíamos estar utilizando também. É uma oportunidade ímpar para você incrementar os conceitos e revisar toda a lógica de programação. Nesta seção, apresento mais alguns exercícios resolvidos, porém, com uma atividade: que você construa as matrizes em um caderno e execute o algoritmo passo a passo. Comporte-se como o processador do computador. Tente e experimente. É um exercício e tanto para aprender cada vez mais. 1. Monte uma matriz para quando o usuário informar um número correspondente a um mês, o algoritmo imprima o nome do mês indicado em português, a abreviatura e o nome do mês em inglês. Por exemplo, o usuário digita o número 4 e o algoritmo é ativado para imprimir: 4Abril, Abr, April. Pseudocódigo:

início MESES : matriz [12][3] literal LINHA, NUM : numérico para LINHA de 1 até 12 passo 1 faça escreva “Digite o nome do “,LINHA,”º mês:” leia MESES[LINHA][1] escreva “Digite a abreviação do mês de “,MESES[LINHA][1],”:” leia MESES[LINHA][2] escreva “Digite o nome em inglês do mês “,MESES[LINHA][1],”:” leia MESES[LINHA][3] fim-para leia “Digite o número do mês a ser consultado: “,NUM escreva NUM,” “, MESES[NUM][1], “,”, MESES[NUM][2], “, “, MESES[NUM][3] fim

42

logica_2_livro_caderno.indb 42

7/12/2006 14:20:55

Lógica de Programação II

2. Uma floricultura conhecedora de sua clientela gostaria de fazer um algoritmo que pudesse controlar via Web sempre um estoque mínimo de determinadas plantas, pois todo o dia, pela manhã, o dono faz novas aquisições. Criar um algoritmo que deixe cadastrar 50 tipos de plantas e nunca deixa o estoque ficar abaixo do ideal. O algoritmo será utilizado para construir um programa na página da empresa. Pseudocódigo:

início {vamos montar uma matriz de 50 linhas e 3 colunas. As 50 linhas servem para cadastrar todos os produtos e as três colunas servem para especificar a quantidade de produtos em estoque, a quantidade desejada e o resultado da diferença entre a quantidade em estoque e a quantidade desejada respectivamente.} PRODUTOS: matriz [50][3] : numérico NOME: vetor [50] literal I: numérico para I de 0 até 49 passo 1 faça escreva “Entre com o nome do produto: “ leia NOME [i] escreva “Entre com a quantidade em estoque: “ leia PRODUTOS[ I ][ 0 ] escreva “Entre com a quantidade desejada: “ leia PRODUTOS[ I ][ 1 ] se PRODUTOS[ I ][ 0 ] < PRODUTOS[ I ][ 1 ] então [PRODUTOS [ I ][ 2 ]  PRODUTOS[ I ][ 1 ] - PRODUTOS[ I ][ 0 ] senão [PRODUTOS [ I ][ 2 ]  0 fim-se fim-para {dados de saída do algoritmo} escreva “Total de Compras: ” para I de 0 até 49 passo 1 faça escreva “Produto: “, NOME [i], “ Qtde = “, PRODUTOS[ I ] [ 2 ] fim-para fim

Unidade 2

logica_2_livro_caderno.indb 43

43

7/12/2006 14:20:55

Universidade do Sul de Santa Catarina

Síntese Nesta unidade, você viu que para relacionar duas ou mais variáveis precisamos manipular matrizes. Diferentemente de vetores, que são unidimensionais, as matrizes são bidimensionais, possuindo linhas e colunas. Podemos ter matrizes com mais dimensões, mas nesta unidade trabalhamos apenas com 2. Similarmente aos vetores, as matrizes só podem armazenar dados do mesmo tipo, ou seja, quando definimos uma matriz, especificamos que tipo de variável a mesma vai armazenar (numérico, literal ou lógico). A sintaxe em pseudocódigo para definir uma matriz é a seguinte: : matriz [número de linhas][número de colunas] Quando criamos uma matriz, o computador reserva um espaço na memória para armazenar Linhas x Colunas valores. É o que chamamos de dimensão da matriz. Para acessar qualquer elemento da matriz, basta especificar o índice da linha e coluna, lembrando sempre que os índices começam com o valor numérico 0. Por exemplo, uma matriz NOTAS de dimensão 5x 6 começa em [0][0] e termina em [4][5]. Podemos acessar qualquer posição da matriz desde que esteja dentro das dimensões especificadas: NOTAS[3][2]  8.5. Estamos acessando a quarta linha e a terceira coluna da matriz. Por fim, viu que para percorrer uma matriz de ponta a ponta, precisamos de dois laços de repetição, um sendo utilizado para percorrer as colunas de cada linha e o outro para percorrer as linhas da matriz. Na próxima unidade, vamos trabalhar com aspectos mais sofisticados da linguagem de programação: as estruturas. Elas são a base para algoritmos avançados e também para a linguagem orientada a objetos, linguagem essa que você, programador web, deve dominar. Bom trabalho e até a próxima etapa desse mundo fabuloso que é o estudo da lógica de programação.

44

logica_2_livro_caderno.indb 44

7/12/2006 14:20:55

Lógica de Programação II

Atividades de auto-avaliação 1. A distância em quilômetros entre algumas capitais é mostrada no quadro a seguir. Suponha que você tenha sido contratado por uma empresa, que vende mapas, para montar um programa (algoritmo) que leia as capitais e suas respectivas distâncias e também deverá imprimir a distância entre duas capitais solicitadas por um usuário. Esse será um programa que poderá ser acessado via Web. Tabela mostrando as distâncias entre as capitais:

1 2

1 0 23

2 23 0

2 45 10

27

110

50

66

Unidade 2

logica_2_livro_caderno.indb 45

27

72

0

45

7/12/2006 14:20:56

Universidade do Sul de Santa Catarina

Saiba mais Consulte o livro “Construindo algoritmos computacionais: lógica de programação” de Alfredo Boente. Para quem deseja participar de um outro grupo de discussão, basta acessar o site: http://www.aprendaprogramacao.hpg. ig.com.br/grupo.html.

46

logica_2_livro_caderno.indb 46

7/12/2006 14:20:56

UNIDADE 3

Manipulação de registros

3

Objetivos de aprendizagem 

Entender o conceito de registro ou estrutura.



Conhecer e praticar montagens de registros.



Criar novos tipos de variáveis.

Seções de estudo Seção 1 Conceito e declaração de registros. Seção 2 Operação com registros. Seção 3 Algoritmos com manipulação de registros.

logica_2_livro_caderno.indb 47

7/12/2006 14:20:56

Universidade do Sul de Santa Catarina

Para início de conversa Quantas vezes você já preencheu fichas de cadastros, seja em hotéis, em videolocadoras, para propostas de consórcios ou ainda fichas de matrícula escolar? Nessas fichas, certamente você precisou entrar com dados como: seu nome, sua idade, seu telefone de contato, endereço etc. Nesses casos, estamos trabalhando com dados de diferentes tipos. Por exemplo: nome é uma variável literal, idade é uma variável numérica, informação se possui ou não veículo pode ser um valor lógico.

Percebeu que estamos entrando em um mundo onde as coisas não são tão homogêneas assim, ou seja, nem tudo que estamos trabalhando são apenas variáveis numéricas ou literais ou ainda lógicos? Há uma mistura de tipos de dados que devemos trabalhar. Mas, o que tem haver isso com lógica de programação? Não poderíamos criar variáveis independentes, ou seja, cada informação armazenada em um local diferente como temos feito até agora? Poderíamos criar, por exemplo, as variáveis em pseudocódigo representando nossa ficha cadastral. Acompanhe a seguir. início {Declaração de variáveis} NOME, ESTADOCIVIL, ENDERECO, BAIRRO: literal IDADE, DATANASC, NUMERO, CEP, FONE: numérico ..... fim

48

logica_2_livro_caderno.indb 48

7/12/2006 14:20:56

Lógica de Programação II

Se fôssemos preencher apenas uma ficha cadastral, isso resolveria nossos problemas. Mas vamos supor que queremos cadastrar 50 hóspedes de um hotel. Certamente, tendo visto e estudado as unidades sobre vetores e matrizes, você responderia que a solução continua simples. Basta fazer, de todas as variáveis criadas anteriormente, vetores de dimensão 50. NOME: vetor [50] literal; IDADE: vetor[50] numérico, e assim por diante. Isso também resolveria nossos problemas. Se você pensou assim, pensou certo. Parabéns, por que mostra que você conseguiu entender os conceitos das unidades anteriores.

Mas o que há de novo, então? Quando criamos variáveis independentes, o computador irá colocá-las em qualquer endereço de memória reservado para essas ocasiões. Ele não vai se preocupar em colocar em uma certa ordem que muitas vezes são necessárias por quesitos de velocidade de execução do programa. Imagine sua ficha cadastral onde o nome está em uma folha, o endereço está duas folhas a seguir, depois volta uma folha para preencher a idade e assim sucessivamente. Parece desorganizado você não acha? Além do tempo de preenchimento que será bem maior. Ou seja, se estamos criando variáveis para representar nossas fichas cadastrais, seria interessante que todas elas fossem declaradas próximas uma das outras. Isso faria com que o desempenho do programa fosse melhor. Pode parecer estranho, mas para um programa com muitas informações e dados para manipular, isso pode fazer a diferença entre um programa bom e um ruim. Pois bem, no mundo da lógica de programação, podemos criar estruturas de dados heterogêneas, ou seja, capaz de armazenar variáveis de tipos diferentes, de forma que as mesmas estejam declaradas próximas umas das outras no que diz respeito à posição de memória do computador. São os chamados registros. Com esse tipo de estrutura, podemos declarar múltiplas variáveis de diferentes tipos, todas organizadas umas próximas das outras, de forma similar a uma ficha cadastral. Na seção seguinte, vamos definir essa estrutura e vamos aprender a como declará-las.

Unidade 3

logica_2_livro_caderno.indb 49

49

7/12/2006 14:20:56

Universidade do Sul de Santa Catarina

Quando trabalhamos com vetores e matrizes nas unidades anteriores, os dados armazenados nessas estruturas devem ser homogêneos, ou seja, tudo do mesmo tipo. Não podemos utilizar nem vetores e nem matrizes para armazenar dados de tipos diferentes. Mas, se quisermos trabalhar com dados do tipo literal e numérico juntamente, isso é possível?

Posso dizer que sim. Nesta unidade você vai aprender como trabalhar com dados de tipos diferentes, ou seja, vai conhecer as estruturas ou registros de dados.

SEÇÃO 1 - Conceito e declaração de registros Mas, se quisermos trabalhar com dados do tipo literal e numérico juntamente, isso é possível?

Em lógica de programação um registro é um recurso que permite a criação de diferentes tipos de variáveis em um mesmo bloco de memória do computador. Quando criamos um registro, criamos um espaço na memória do computador que permite armazenar dados heterogêneos, ou seja, constantes de vários tipos. É como se fosse uma ficha de dados, organizada de forma que os dados estão próximos um dos outros dentro da memória do computador. Uma das grandes vantagens disso, além da organização, é a velocidade de acesso às informações ali contidas.

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

50

logica_2_livro_caderno.indb 50

7/12/2006 14:20:56

Lógica de Programação II

Sintaxe do registro

: registro fim-registro

onde são todas as variáveis que irão compor uma ficha de dados, ou seja, NOME, IDADE, CPF, ENDERECO etc. Vamos imaginar uma ficha cadastral que chamaremos de FICHA com as seguintes informações a serem preenchidas por um cliente de um hotel: Nome, estado civil, endereço, bairro, cidade, estado, e-mail, idade, telefone, número. Utilizando a sintaxe de criação de registro, temos:

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

Bem, você já deve estar perguntando. O que mudou além da palavra reservada registro e fim-registro? Pois bem, conforme dito anteriormente, quando declaramos a FICHA anterior como sendo registro uma parte da memória do computador é reservada e nela são inseridas as variáveis declaradas entre os comandos registro e fim-registro. Portanto, elas ocupam o mesmo bloco de memória, tornando o desempenho do programa mais rápido. Agora, por exemplo, NOME e IDADE estão num mesmo bloco de memória. Seria análogo a ter nome e idade em uma mesma ficha cadastral. Outra diferença importante é a questão de como acessamos as variáveis declaradas dentro de uma estrutura.

Unidade 3

logica_2_livro_caderno.indb 51

51

7/12/2006 14:20:56

Universidade do Sul de Santa Catarina

Como podemos ler e escrever nessas variáveis?

A resposta é bastante simples. Basta especificarmos o nome do registro criado, seguido de um ponto (.) e o nome da variável. Por exemplo, para acessar a variável NOME, precisamos especificar o nome do registro do qual ela pertence. Sendo assim, FICHA.NOME. Observe que a variável NOME não é uma variável independente qualquer. Ela pertence ao registro FICHA. Por isso, precisamos preceder o nome da variável NOME com o nome do registro FICHA seguido de um ponto (.). Assim como na criação de vetores e matrizes, para a criação de registros não precisamos especificar os endereços de memória do computador. Isso é feito automaticamente, sem que sequer saibamos onde os valores estão armazenados na memória. A única coisa que sabemos é que é alocado um espaço para armazenar esses valores e que são armazenados em blocos de memória. - Na próxima seção você vai saber como montar algoritmos com registros.

SEÇÃO 2 - Operação com registros Novamente, você já deve ter percebido que não criamos qualquer outra lógica de controle além das já estudadas. É mais uma oportunidade de mostrar a você a importância dos comandos básicos de lógica de programação. Nesta seção, vamos mostrar uma aplicação típica de registros: o conceito de fichas cadastrais. A figura a seguir mostra uma possível ficha cadastral: Nome: Estado Civil: Endereço: Número: Bairro: Estado:

Idade:

Cidade: Telefone:

52

logica_2_livro_caderno.indb 52

7/12/2006 14:20:57

Lógica de Programação II

Observando a figura anterior, podemos verificar que temos variáveis literais e numéricas. Vamos classificá-las inicialmente: Nome, Estado Civil, Endereço, Bairro, Cidade e Estado são variáveis literais. Idade, Número e Telefone de Contato são variáveis numéricas. Observe que poderíamos colocar Telefone de Contato como literal também. Se quiséssemos representar um número telefônico por 278-8080, isso é um literal e não um valor numérico. Mas para nosso exemplo, vamos considerar o Telefone de Contato como sendo numérico. Para o telefone especificado devemos colocar então como sendo 2788080.

Criaremos um registro para a ficha cadastral. Iremos chamar esse registro de FICHA. Sendo assim, em pseudocódigo, temos: FICHA: registro {variáveis da ficha} fim-registro

Agora vamos definir as variáveis. Iremos especificar seis variáveis literais e três variáveis numéricas. Colocaremos os nomes das variáveis de forma a não deixar qualquer tipo de dúvida em relação às constantes que serão armazenadas. Dessa forma, nosso registro será conforme a seguir: FICHA: registro {variáveis da ficha} NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal IDADE, NUMERO, TELEFONE: numérico fim-registro

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

Unidade 3

logica_2_livro_caderno.indb 53

53

7/12/2006 14:20:57

Universidade do Sul de Santa Catarina

Pseudocódigo: início {declaração do registro FICHA} FICHA: registro {variáveis da ficha} NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal IDADE, NUMERO, TELEFONE: numérico fim-registro {entrada de dados} escreva “Nome: “ leia FICHA.NOME escreva “Estado Civil: “ leia FICHA.ESTADOCIVIL escreva “Idade: “ leia FICHA.IDADE escreva “Endereço: “ leia FICHA.ENDERECO escreva “Bairro: “ leia FICHA.BAIRRO escreva “Número: “ leia FICHA.NUMERO escreva “Cidade: “ leia FICHA.CIDADE escreva “Estado: “ leia FICHA.ESTADO escreva “Telefone de Contato: “ leia FICHA.TELEFONE fim

No algoritmo anterior não mostramos nenhuma saída. O exemplo foi apenas para mostrar como trabalhar com criar um registro e como acessar suas variáveis.

54

logica_2_livro_caderno.indb 54

7/12/2006 14:20:57

Lógica de Programação II

Criando novos tipos de variáveis Muitas vezes, os tipos básicos de variáveis que utilizamos até agora (numérico, literal e lógico) não são suficientes para resolver um algoritmo. Seria interessante que pudéssemos criar tipos definidos pelo usuário. Por exemplo, um tipo de variável que armazenasse, ao mesmo tempo, um valor literal, um valor numérico e um valor lógico. Vou lhe dar a boa notícia. Isso é possível sim, graças à estrutura de registros que acabamos de estudar. Podemos fazer de um registro criado um tipo de variável. Por exemplo, além de termos os tipos básicos como o numérico, o literal e o lógico, poderíamos ter também o tipo FICHA. FICHA na verdade, é um registro criado pelo programador. Chamamos isso de tipo definido pelo usuário.

Isso é fantástico, pode acreditar. Além de podermos criar variáveis, podemos criar agora, também tipos de variáveis.

Mas como posso fazer isso e para que serve?

Bem, para criar um tipo registro, em pseudocódigo, é necessário apenas colocar a palavra reservada tipo antes do nome do registro, ficando assim sua sintaxe: tipo = registro fim-registro

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

Unidade 3

logica_2_livro_caderno.indb 55

55

7/12/2006 14:20:57

Universidade do Sul de Santa Catarina

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

tipo FICHA = registro {variáveis da ficha} NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal IDADE, NUMERO, TELEFONE: numérico fim-registro

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

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

O que quero dizer é que FICHA é um tipo definido pelo programador e que ficha1 é uma variável do tipo FICHA que ocupa um espaço na memória para armazenar seis variáveis literais e três variáveis numéricas, conforme nosso exemplo. Assim, veja parte do algoritmo anterior atualizado:

56

logica_2_livro_caderno.indb 56

7/12/2006 14:20:57

Lógica de Programação II

início {declaração do registro FICHA} tipo FICHA = registro {variáveis da ficha} NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal IDADE, NUMERO, TELEFONE: numérico fim-registro ficha1 : FICHA {declaração da variável do tipo FICHA. Observe que o tipo FICHA é definido antes de ser utilizado. Isso é obrigatório, tendo em vista que o programa precisa saber o que é FICHA. Como definimos FICHA como sendo um registro, ao especificar ficha1 como sendo do tipo FICHA, nenhum problema será encontrado} escreva “Nome: “ leia ficha1.NOME escreva “Estado Civil: “ leia ficha1.ESTADOCIVIL ........ {restante do algoritmo} fim

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

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

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

Unidade 3

logica_2_livro_caderno.indb 57

57

7/12/2006 14:20:57

Universidade do Sul de Santa Catarina

é como se tivéssemos três variáveis independentes em locais de memória diferentes, porém, cada uma delas contendo seis variáveis literais e três numéricas, conforme você já leu.

Criando um conjunto de registros Precisamos incrementar nosso algoritmo anterior. Ele permite o cadastramento de 5 hóspedes apenas. Nosso hotel tem 100 quartos. Podemos admitir até 100 hóspedes, certo? Devemos criar 100 fichas cadastrais. E agora? Você terá problemas se tiver que criar 100 variáveis do tipo FICHA. Lembra para que servem os vetores? Será que você deduziu que podemos utilizar vetores para esse caso?

Vamos por analogia: se estamos precisando armazenar 100 valores numéricos, criamos um vetor do tipo numérico; se precisamos armazenar 100 nomes de clientes, criamos um vetor do tipo literal. Raciocinando da mesma maneira, se precisarmos armazenar 100 fichas de clientes, criamos um vetor de FICHA (tipo definido por nós). Na sintaxe de pseudocódigo teríamos: fichas: vetor [100] FICHA. Agora, definimos um vetor de 100 posições chamado de fichas, onde cada posição (quadrado) tem uma variável do tipo FICHA. Veja a seguir: Ficha 1

Ficha 2

Ficha 3

...

Ficha 99

Ficha1 está na posição 0 do vetor fichas, Ficha2 está na posição 1 do vetor fichas, e assim sucessivamente. Mas o que é uma FICHA mesmo? FICHA é um registro que tem os seguintes campos definidos anteriormente: NOME, ESTADOCIVIL, ENDERECO, BAIRRO, CIDADE, ESTADO: literal IDADE, NUMERO, TELEFONE: numérico.

58

logica_2_livro_caderno.indb 58

7/12/2006 14:20:57

Lógica de Programação II

Como podemos acessar os dados de cada ficha dentro do vetor? Bem, de forma similar ao acesso dos dados em vetores, precisamos saber qual a posição que queremos acessar do vetor. Depois de sabermos qual o índice do vetor, devemos lembrar que dentro de cada posição do vetor temos um registro com aqueles campos ou variáveis definidas. Veja a figura a seguir. [0]

[1]

       

[2]

...

nome estadocivil endereco bairro cidade estado idade, numero telefone

...

       

Ficha 99

nome estadocivil endereco bairro cidade estado idade, numero telefone

Para acessar um desses campos basta colocar um ponto (.) seguido do nome da variável definida dentro do registro. Por exemplo, para acessar o nome do primeiro hóspede (definido na posição 0 do vetor fichas), colocamos fichas [0]. NOME; para acessar a idade dessa mesma ficha, colocarmos fichas [0].IDADE e assim por diante.

Vamos supor que estamos cadastrando o cliente 60 do nosso hotel. Como poderíamos fazer? Bem, devemos lembrar que, como um vetor sempre começa na posição 0 (zero), assim o cliente 60 está definido da posição 59 do nosso vetor, certo? Desta forma, podemos preencher os dados conforme a seguir: fichas[59].NOME  “Luiz Silva” fichas[59].ESTADOCIVIL  “solteiro” fichas[59].ENDERECO  “Avenida Paulista” fichas[59].IDADE  30 {e assim para os demais dados deste hóspede}.

Unidade 3

logica_2_livro_caderno.indb 59

59

7/12/2006 14:20:58

Universidade do Sul de Santa Catarina

- Olha aí a importância dos vetores novamente. Na seção seguinte você verá exemplos com código pronto para você estudar e tirar dúvidas. Tente implementar cada exercício sozinho, depois compare com a solução proposta. Faça tantas vezes você quiser. Quanto mais exercícios você fizer, melhor você será.

SEÇÃO 3 - Algoritmos com manipulação de registros Veja agora alguns exercícios resolvidos com manipulação de registros.

1. Cadastrar os dados gerais de 300 disciplinas que os professores lecionam: nome, conteúdo, freqüência e nota mínimas para aprovação. Ler cinco nomes de disciplinas e mostrar freqüência e média mínimas para aprovação em cada uma. Pseudocódigo:

início tipo FICHA = registro {criando um tipo FICHA} NOME, CONTEUDO : literal FREQUENCIA, MEDIA : numérico fim-registro DISCIPLINAS : vetor [300] FICHA {criando um vetor para cadastrar 300 disciplinas, onde cada disciplina é constituída por um nome (NOME), conteúdo (CONTEUDO), freqüência (FREQUENCIA) e média (MEDIA)} NOMECONSUL : literal {Nome da disciplina a ser consultada} CONT, POS : numérico {Variáveis para controle de laço de repetição} {Entrada de dados para 300 disciplinas} para POS de 0 até 299 passo 1 faça escreva “Digite o nome da disciplina: “ leia DISCIPLINAS[POS].NOME escreva “Digite o conteúdo da disciplina: “ leia DISCIPLINAS[POS].CONTEUDO escreva “Digite a freqüência mínima necessária para aprovação: “ leia DISCIPLINAS[POS].FREQUENCIA

60

logica_2_livro_caderno.indb 60

7/12/2006 14:20:58

Lógica de Programação II

escreva “Digite a média mínima necessária para aprovação: “ leia DISCIPLINAS[POS].MEDIA fim-para {verificação de 5 disciplinas, conforme o enunciado} para CONT de 1 até 5 passo 1 faça escreva “Digite o nome da disciplina a ser consultada: “ leia NOMECONSUL {nome da disciplina a ser consultada} POS  0 {inicializa a variável POS pois o vetor começa em 0} enquanto NOMECONSUL < > DISCIPLINAS[POS].NOME ou POS < 300 {percorre todo o vetor DISCIPLINAS até que a variável NOMECONSUL seja igual a DISCIPLINAS [POS].NOME e POS < 300. Utilize aqui, como exercício, uma tabela-verdade para saber quando a condição resultante se torna falsa. É uma excelente revisão da operação lógica ou.} POS  POS + 1 {enquanto não encontrar a disciplinas digitadas, soma POS de 1, o que significa pular para a próxima posição do vetor} fim-enquanto se NOMECONSUL = DISCIPLINAS[POS].NOME então escreva “Disciplina:”, DISCIPLINAS[POS].NOME escreva “Média Mínima:”, DISCIPLINAS[POS].MEDIA escreva “Freq. Mínima:”, DISCIPLINAS[POS].FREQUENCIA senão escreva “Disciplina não consta no cadastro !” fim-se fim-para fim 2. Elaborar um algoritmo para cadastrar 5000 CDs de uma loja. Os dados a serem cadastrados são: código, nome do CD, nome do cantor/grupo, tipo de música, produtora e ano de produção. Exibir os códigos e nomes dos CDs solicitados por um usuário por meio do nome de um cantor ou grupo musical.

Pseudocódigo: início {declaração do tipo FICHA} tipo FICHA = registro NOME, CANTOR, TIPO, PRODUTORA : literal CODIGO, ANOPRODUCAO : numérico fim-registro {declaração do vetor CDS. Cada posição do vetor contém um registro do tipo FICHA} CDS : vetor [5000] FICHA CANTORCONSUL : literal {Cantor a ser consultado} POS : numérico {variável para percorrer o vetor CDS}

Unidade 3

logica_2_livro_caderno.indb 61

61

7/12/2006 14:20:58

Universidade do Sul de Santa Catarina

{Dados de entrada para o programa de cadastramento de CDS} para POS de 0 até 4999 passo 1 faça escreva “Digite o código do CD: “ leia CDS[POS].CODIGO escreva “Digite o nome do CD: “ leia CDS[POS].NOME escreva “Digite o nome do cantor ou do grupo: “ leia CDS[POS].CANTOR escreva “Digite o tipo de música: “ leia CDS[POS].TIPO escreva “Digite o nome da produtora: “ leia CDS[POS].PRODUTORA escreva “Digite o ano de produção (somente os números) do CD:” leia CDS[POS].ANOPRODUCAO fim-para {processamento do algoritmo} escreva “Digite o nome do cantor ou grupo a ser consultado (ou FIM para encerrar):” leia CANTORCONSUL enquanto CANTORCONSUL < > “FIM” faça POS  0 enquanto CANTORCONSUL < > CDS[POS].CANTOR ou POS < 5000 {percorre cada posição do vetor para verificar a existência do cantor} POS  POS + 1 fim-enquanto se CANTORCONSUL = CDS[POS].CANTOR então escreva “Código:”, CDS[POS].CODIGO escreva “Nome do CD:”, CDS[POS].NOME senão escreva “Cantor ou grupo musical não possui nenhum CD cadastrado !” fim-se {Observe aqui que estamos solicitando que o usuário entre com o nome do cantor ou a palavra FIM novamente. Perceba que a primeira vez ocorreu fora do laço de repetição. Dessa vez, o comando de leitura é realizado para permitir com que o usuário finalize o programa digitando FIM. Caso não colocássemos essa opção, teríamos um laço infinito. Lembra que todo algoritmo tem que possuir um fim?} escreva “Digite o nome do cantor ou grupo a ser consultado (ou FIM para encerrar): “ leia CANTORCONSUL fim-enquanto fim

62

logica_2_livro_caderno.indb 62

7/12/2006 14:20:58

Lógica de Programação II

Síntese Você acaba de finalizar mais uma etapa na busca pela excelência. Viu que para implementar variáveis de diferentes tipos utilizamos um registro, que nada mais é do que um recurso que permite a criação de diferentes tipos de variáveis em um mesmo bloco de memória do computador, facilitando, sobretudo, o desempenho do programa. Quando criamos um registro, criamos um espaço na memória do computador que permite armazenar dados heterogêneos, ou seja, constantes de vários tipos. É como se fosse uma ficha de dados, organizada de forma que os dados estão próximos um dos outros dentro da memória do computador. A sintaxe em pseudocódigo para criar um registro é a seguinte: : registro fim-registro

Viu também que a lógica de programação permite ao usuário criar seus próprios tipos. Isso facilita bastante porque nem tudo que estamos trabalhando são apenas números, literais ou lógicos. Há uma combinação desses tipos básicos. A sintaxe para implementar um tipo registro é a seguinte: tipo : registro

fim-registro

Por fim, aprendeu que podemos construir uma poderosa estrutura de dados misturando vetores com registros. Podemos construir vetores de registros, onde cada posição do vetor é um registro de dados. O acesso a cada elemento dentro do vetor é a seguinte: [índice do vetor]. 0 faça

Unidade 4

logica_2_livro_caderno.indb 79

79

7/12/2006 14:21:00

Universidade do Sul de Santa Catarina

enquanto POS < > ULTIMA faça se NOTAS[ POS ] > NOTAS[ POS + 1 ] então {processo de troca dos números} AUX  NOTAS [ POS ] NOTAS [ POS ]  NOTAS[ POS + 1] NOTAS [ POS + 1]  AUX fim-se {incrementa posição do vetor} POS  POS + 1 fim-enquanto {inicializa variável POS e decrementa a variável ULTIMA de 1} POS  0 ULTIMA  ULTIMA -1 fim-enquanto fim

SEÇÃO 2 - Implementação de algoritmos de pesquisa Métodos de pesquisa, também chamados de métodos de busca, são algoritmos utilizados para localizar valores dentro de um vetor.

Na seção anterior, aprendemos a como ordenar os valores de um vetor. Nesta seção, procuramos por determinados valores de interesse dentro do vetor, seja os elementos do vetor ordenados ou não. Há várias técnicas de ordenação. Você vai estudar duas aplicações bem simples: 

O método de procura seqüencial.



O método de procura binária.

80

logica_2_livro_caderno.indb 80

7/12/2006 14:21:00

Lógica de Programação II

Método de procura seqüencial O método de pesquisa seqüencial é o mais simples de todos. Um vetor é pesquisado (percorrido) até encontrar o valor desejado ou até que o vetor termine. É um método bastante aplicado para vetores com valores desordenados, ou seja, que não estão ordenados em ordem crescente ou decrescente de valores. Vamos supor o seguinte exemplo: Um vetor de 5 valores representando as idades dos clientes de uma loja de vídeo locadora. Precisamos saber se há clientes com idade de 15 anos, por exemplo. A representação do vetor é mostrada a seguir:

27

44

14

15

20

Solucionando o problema em passos 1. Inicialmente, precisamos criar nosso vetor de 5 posições. Esse vetor armazenará as idades de nossos clientes. Vamos permitir com que o usuário especifique as idades que desejar, ou seja, será uma entrada de dados via teclado. Pseudocódigo: início IDADES: vetor [5] numérico ENTRADA: numérico {variável utilizada para armazenar a entrada de uma idade a ser pesquisada no vetor IDADES.} CONT: numérico {variável contadora} {entrada de dados: idade dos clientes. Estamos percorrendo o vetor da posição 0 até a posição 4.} para CONT de 0 até 4 passo 1 faça escreva “Especifique a idade do cliente: “ leia IDADES[CONT] {observe que a variável CONT vai de 0 até 4} fim-para

Unidade 4

logica_2_livro_caderno.indb 81

81

7/12/2006 14:21:01

Universidade do Sul de Santa Catarina

2. Preenchido o vetor, iremos realizar nosso processamento. O processamento é simplesmente encontrar a idade especificada pelo usuário. Vamos precisar entrar com a idade do cliente e verificar se ela existe ou não no vetor IDADES. {processamento de procura} escreva “Entre com a idade a ser procurada no cadastro de clientes: “ leia ENTRADA {agora, vamos percorrer o vetor IDADES para verificar se existe ou não o valor numérico digitado pelo usuário e armazenado na variável ENTRADA. Vamos supor que você especifique a idade 15, ou seja, a variável ENTRADA possui valor numérico 15. Dessa forma, vamos percorrer todo o vetor IDADES procurando pelo valor numérico 15. O processo é bem simples. Para cada laço de repetição, lemos o valor contido na posição do vetor. Se encontrarmos o valor que estamos procurando, finalizamos a pesquisa. Caso contrário, percorremos o vetor IDADES até encontrar o valor desejado ou até o fim do vetor. Vamos inicializar a variável CONT para ser reutilizada, ou seja, para percorrer o vetor novamente da posição 0 até a posição 4 do vetor IDADES} CONT  0 enquanto IDADES[ CONT ] < > ENTRADA e CONT ENTRADA) e não atingirmos o final do vetor IDADES (CONT ENTRADA e CONT 10 então escreva “A soma é maior que 10” senão escreva “A soma é menor ou igual a 10”. Também, podemos apenas imprimi-lo conforme algoritmo anterior.} escreva “Resultado da soma =”, RESULTADO escreva “Programa Finalizado” fim

Sem segredos não é mesmo? Estamos com uma função (FUNCAO_SOMA) que tem duas funções básicas: entrada de dados e a soma dos números. A impressão fica a cargo do programa principal. Nosso próximo passo é fazer com que a função FUNCAO_SOMA apenas some, deixando a entrada de dados para o programa principal ou até mesmo uma outra função qualquer.

108

logica_2_livro_caderno.indb 108

7/12/2006 14:21:05

Lógica de Programação II

Passando valores para funções Até agora não nos preocuparmos com a sintaxe para a implementação de uma função em pseudocódigo. Acho que é mais importante entender o conceito agora do que mostrar a sintaxe propriamente dita. Entendido o conceito de função, a sintaxe é mero detalhe. Vimos como voltar um valor de uma função. A questão agora é: Podemos passar valores para dentro de uma função, ou seja, podemos passar um valor de uma variável definida dentro do programa principal para uma função?

A resposta é sim. Perceba que estamos agora fazendo o caminho da volta do que fizemos no item 2.1. A transferência de valores para dentro de uma função se dá através de passagem por parâmetros. Mas o que significa passagem de parâmetros? Para responder essa questão, voltamos à figura onde definimos um esquema para a função FUNCAO_SOMA.

Vimos que SOMA representa o valor de retorno da função FUNCAO_SOMA. Mas quem são N1 e N2? De onde vêm essas variáveis? Pois bem, N1 e N2 são duas variáveis declaradas fora da função FUNCAO_SOMA. Por exemplo, elas podem estar declaradas dentro do programa principal de forma que a entrada de dados não é mais realizada pela função FUNCAO_ SOMA e sim pelo programa principal. Poderiam estar definidas em outra função qualquer também.

Unidade 5

logica_2_livro_caderno.indb 109

109

7/12/2006 14:21:05

Universidade do Sul de Santa Catarina

Para o nosso exemplo, vamos considerar que a entrada de dados seja feita pelo programa principal.

Sabendo que as variáveis N1 e N2 armazenam dois valores que queremos somar, e cuja operação de soma é realizada pela função FUNCAO_SOMA, obviamente temos que fazer com que esses dois valores possam ser lidos dentro da função também. É sempre importante lembrar que as variáveis são locais (definidas dentro do programa principal) e não podem ser utilizadas em quaisquer outras funções. A passagem dos valores das variáveis N1 e N2 se dá através de passagem de parâmetros. Os parâmetros de uma função são variáveis locais definidas junto ao nome da função e servem para receber valores de outras funções ou programa principal e podem ser utilizados como variáveis locais dentro da função. Por exemplo, quando definimos anteriormente a função FUNCAO_ SOMA, utilizamos a seguinte sintaxe provisória: FUNCAO_SOMA início {declaração de variáveis locais} {comandos da função} fim-função

Os parâmetros de uma função são definidos junto ao nome da função. Eles recebem valores que serão passados para a função no momento em que é chamada no programa principal. Em nosso programa de soma, a função FUNCAO_SOMA deve receber dois valores para serem somados. Então, temos: FUNCAO_SOMA( NUM1, NUM2 ) início {declaração de variáveis locais} {comandos da função} fim-função

110

logica_2_livro_caderno.indb 110

7/12/2006 14:21:05

Lógica de Programação II

Perceba que os parâmetros NUM1 e NUM2 são colocados entre parênteses após o nome da função. Podemos utilizar NUM1 e NUM2 dentro da função de modo que nos convier. Essas variáveis são variáveis locais que servem para receber valores a partir da chamada da função. Mostro um exemplo que explica melhor. Veja o nosso programa principal: início N1, N2, RESULTADO: numérico {vamos realizar a entrada pelo programa principal} escreva “entre com o número 1” leia N1 escreva “entre com o número 2” leia N2 {N1 e N2 são duas variáveis locais que armazenam os valores que queremos somar. Devemos, portanto, passar esses valores para dentro da função FUNCAO_SOMA. Fizemos isso através da passagem de parâmetros} RESULTADO  FUNCAO_SOMA (N1, N2) {Nesse momento, a função FUNCAO_SOMA é chamada e o valor da variável N1 é armazenado na variável NUM1 e o valor da variável N2 é armazenado na variável NUM2, exatamente nessa seqüência. A função calcula a soma e retorna um valor, cujo resultado é armazenado em RESULTADO.} escreva “resultado da soma =”, RESULTADO fim

Nossa função FUNCAO_SOMA é a seguinte: FUNCAO_ SOMA( NUM1, NUM2 ) início {declaração de variáveis locais} SOMA : numérico {o parâmetro ou variável NUM1 armazena o valor da variável N1 e o parâmetro ou variável NUM2 armazena o valor da variável N2} SOMA  NUM1 + NUM2 {observe aqui que estamos utilizando NUM1 e NUM2 como variáveis locais. Diferentemente das variáveis declaradas dentro da função, os parâmetros da função servem para receber valores no momento em que são chamadas. Uma observação importante é o fato de não podermos definir variáveis locais com os mesmos nomes do que os parâmetros da função. Em nosso exemplo, não podemos declarar

Unidade 5

logica_2_livro_caderno.indb 111

111

7/12/2006 14:21:05

Universidade do Sul de Santa Catarina

uma variável chamada NUM1 porque já está definida como parâmetro da função} retorna SOMA {retorna o valor da variável SOMA para a linha de comando em que a função foi chamada} fim-função

Se fôssemos montar um novo esquema para a função FUNCAO_SOMA, teríamos:

No momento em que a função FUNCAO_SOMA é chamada, os parâmetros da função (NUM1 e NUM2) são criados e são passados os valores das variáveis N1 e N2 respectivamente. Observe que estamos transferindo valores de N1 para NUM1 e de N2 para NUM2. Isso significa que ambos devem ser do mesmo tipo, ou seja, se N1 é numérico, NUM1 também deve ser numérico. Se a variável N2 for literal, então NUM2 também deve ser literal.

Sintaxe da função Bem, já conhecendo a importância de uma função e de como ela é chamada, basta saber como implementar utilizando pseudocódigo. Veja a sintaxe: Sintaxe da função

função (< lista de parâmetros>):

112

logica_2_livro_caderno.indb 112

7/12/2006 14:21:05

Lógica de Programação II

Os termos utilizados nesse tipo de sintaxe são explicados a seguir: Função

Comando referente à função



Nome da função que será declarada.

< lista de parâmetros>

Lista dos parâmetros que serão utilizados (se houver)



Tipo da variável que será retornada pela função declarada (numérico, literal, lógico)

Observe como fica a função FUNCAO_SOMA utilizando a sintaxe em pseudocódigo: Nome da função: FUNCAO_SOMA Lista de parâmetros: NUM1 e NUM2 do tipo numérico Tipo de retorno: numérico

Desta forma, a sintaxe para a função FUNCAO_SOMA fica: função FUNCAO_SOMA (NUM1, NUM2: numérico): numérico

Veja outros exemplos de declaração de função:

1. Função que recebe 4 notas e retorna a média.

função MEDIA (NOTA1, NOTA2, NOTA3, NOTA4: numérico): numérico 2. Função que recebe o nome e idade de uma pessoa e retorna verdadeiro ou falso.

função CADASTRA (NOME: literal, IDADE: numérico): lógico 3. Função que recebe o nome de um mês e volta o mês em número

função FUNCAO_MES ( MÊS: literal ): numérico

Unidade 5

logica_2_livro_caderno.indb 113

113

7/12/2006 14:21:05

Universidade do Sul de Santa Catarina

Acompanhe mais alguns exemplos de funções. O interesse aqui é apenas verificar a implementação das funções. Você poderá construir qualquer tipo de programa que chame essas funções da maneira que você quiser, quantas vezes quiser e onde quiser. Por isso é que chamamos de modularização. Fazemos uma vez e podemos usar várias.

1. Criar uma função para receber o ano corrente e o ano de nascimento de uma pessoa. Em seguida, retornar a idade da pessoa. Pseudocódigo:

função IDADE (ANOCORRENTE, ANONASCIMENTO: numérico): numérico retorna ANOCORRENTE – ANONASCIMENTO fim-função 2. Criar uma fração para receber o valor de uma determinada temperatura em graus Fahrenheit e retornar o valor correspondente em Centígrados. A fórmula de conversão é C = 5/9 (F-32). Pseudocódigo:

função CELSUIS (FAHRENHEIT : numérico) : numérico retorna (5/9) * (FAHRENHEIT - 32) fim-função 3. Um exemplo bastante interessante é o desenvolvimento de um algoritmo para implementação de menus de entrada, ou seja, a elaboração de opções que permitam o usuário entrar com os dados de acordo com a seleção de um item.

- Bem, agora você está mesmo finalizando os estudos de lógica de programação. Foi um desafio e tanto não?

114

logica_2_livro_caderno.indb 114

7/12/2006 14:21:06

Lógica de Programação II

Mas o estudo não deve terminar por aqui. O que você conheceu e aprendeu é apenas o “ponta-pé” inicial para aprofundamentos futuros. Lembro novamente que, quanto mais exercícios você fizer, melhor você será e se diferenciará dos outros programadores. Um outro fato importante que recomendo é que, ao estudar linguagem de programação, você não abandone a lógica. Pense inicialmente em uma solução algorítmica. Isso é pensar no problema de forma inteligente. Aliás, isso é ser inteligente. Com a solução pensada, o programador terá apenas trabalho de digitar a solução lógica encontrada em qualquer linguagem de programação. Passa a ser um trabalho de digitação. Faço uma última pergunta a você: Você quer se tornar um profissional de programação ou um digitador profissional?

Pense nisso quando estiver programando um website. Um grande abraço e sucesso!

Síntese Nesta unidade você viu que para a solução de problemas mais complexos, devemos dividi-los em partes. Caso separemos um problema complexo em problemas menores, podemos construir algoritmos para cada um deles de forma bem definida, e fazer com que eles sejam independentes um dos outros. A essa técnica de dividir os algoritmos em módulos chamamos de modularização. Cada módulo, quando bem elaborado, deve possuir uma série de características: implementar tarefas não-redundantes e nem subjetivas; ter uma função específica e clara; ser independente de todos os outros módulos de um programa; ser testado e corrigido antes de ser integrado à solução completa, tendo em vista que é parte da solução lógica do problema.

Unidade 5

logica_2_livro_caderno.indb 115

115

7/12/2006 14:21:06

Universidade do Sul de Santa Catarina

Em pseudocódigo, utilizamos o conceito de função para modularizar um algoritmo. Uma função é dita como sendo uma sub-rotina ou módulo do algoritmo principal. Cada função é independente uma da outra. Chamamos uma função a partir do algoritmo principal. A sintaxe para implementar uma função é a seguinte: função (< lista de parâmetros>):

Onde a lista de parâmetros representa a forma de passagem de valores para dentro da função. É o que chamamos de passagem de valor ou passagem de parâmetros por valor. A função também pode retornar um valor. Esse valor é do tipo , podendo ser numérico, literal ou lógico. Sempre que necessário, devemos utilizar funções para desenvolvimento de algoritmos. As grandes vantagens são: 











Para permitir o reaproveitamento de código já construído por você ou por outros programadores. Para evitar que um trecho de código que seja repetido várias vezes dentro de um mesmo programa. Para permitir a alteração de um trecho de código de uma forma mais rápida. Com o uso de uma função é preciso alterar apenas dentro da função que se deseja. Para que os blocos do programa não fiquem grandes demais e, por conseqüência, mais difíceis de entender. Para facilitar a leitura do programa de uma forma mais fácil. Para separar o programa em partes (blocos) que possam ser logicamente compreendidas de forma isolada.

116

logica_2_livro_caderno.indb 116

7/12/2006 14:21:06

Lógica de Programação II

Atividades de auto-avaliação 1. Utilizando o algoritmo anterior, implemente a função SUBTRACAO, MULTIPLICACAO e DIVISAO. Elabore um programa principal que possa chamar as funções de acordo com o que o usuário deseja. Por exemplo, se o usuário digitar 1, a função SUBTRACAO é chamada, se o usuário digitar 2, a função MULTIPLICACAO é chamada, se o usuário digitar 3 a função DIVISAO é chamada. Qualquer outro número, o programa deverá indicar uma mensagem de erro e solicitar com que o usuário digite 1, 2 ou 3 novamente.

Unidade 5

logica_2_livro_caderno.indb 117

117

7/12/2006 14:21:06

Universidade do Sul de Santa Catarina

2. Na atividade 1, altere os algoritmos de cada função de forma que as mesmas retornem os valores por elas calculados. O programa principal é que deverá imprimir o resultado de saída, qualquer que seja a operação escolhida (subtração, multiplicação ou divisão).

118

logica_2_livro_caderno.indb 118

7/12/2006 14:21:06

Lógica de Programação II

3. Elaborar uma função que calcule o maior número entre três valores. A função deve aceitar três parâmetros e retornar o maior valor entre eles. A entrada de dados e a impressão do resultado devem ser feitas no programa principal.

Unidade 5

logica_2_livro_caderno.indb 119

119

7/12/2006 14:21:06

Universidade do Sul de Santa Catarina

Saiba mais Para aprofundar os estudos leia os livros indicados a seguir. MANZANO, José Augusto N. G. LÓGICA estruturada para programação de computadores. XAVIER, Gley Fabiano Cardoso. Lógica de Programação. MANZANO, José Augusto N. G. Algoritmos: lógica para desenvolvimento de programação de computadores.

120

logica_2_livro_caderno.indb 120

7/12/2006 14:21:06

Para concluir o estudo Você chegou ao final da disciplina de Lógica de Programação II. Foram 120 horas de estudos de algoritmos de programação. O objetivo principal foi estudar as principais estruturas lógicas de programação e perceber a importância de realizar um projeto de qualquer software através de algoritmos. Pois bem, gostaria de enfatizar que o conteúdo não terminou, muito pelo contrário, você está agora apto para se aprofundar em algoritmos de programação. Por isso, agora é com você, nobre estudante. Siga em frente! Se você quiser realmente ser um programador diferenciado no mercado, passo o bastão para você. A corrida é sua agora. Tenho certeza também que a vitória virá. Não se esqueça disso, quanto mais você estiver preparado em lógica de programação, melhor você será, independente de qualquer linguagem de programação que você poderá vir a utilizar. Esse é realmente o diferencial de um bom programador. Não seja apenas um digitador, seja um pensador, por isso, saiba bem lógica de programação. Um grande abraço e até a próxima oportunidade. Professor Carlos Fernando Martins.

logica_2_livro_caderno.indb 121

7/12/2006 14:21:06

logica_2_livro_caderno.indb 122

7/12/2006 14:21:06

Referências MANZANO, José Augusto N. G.; OLIVEIRA, Jayr Figueiredo de. ALGORITMOS: lógica para desenvolvimento de programação. 9. ed. São Paulo: Érica, 2000. 265 p. ABE, Jair Minoro; SCALZITTI, Alexandre,; SILVA FILHO, João Inácio da,. Introdução à lógica para a ciência da computação. 2. ed. São Paulo: Arte & Ciência, 2002. 247 p. WARNIER, Jean-Dominique. LCP - Lógica de Construção de Programas: um método de programação estruturada. 3. ed. Rio de Janeiro: Campus, 1984. 185 p. UCCI, Waldir; SOUSA, Reginaldo Luiz; KOTANI, Alice Mayumi. LÓGICA de programação: os primeiros passos. 8. ed. São Paulo: Érica, 1999. 339 p. FORBELLONE, André Luiz Villar; EBERSPÄCHER, Henri Frederico. LÓGICA de programação: a construção de algoritmos e estruturas de dados. 2. ed. rev. e atual. São Paulo: Makron Books, 2000. 197 p. MANZANO, José Augusto N. G. LÓGICA estruturada para programação de computadores. São Paulo: Érica, 2002. 180 p.

logica_2_livro_caderno.indb 123

7/12/2006 14:21:06

logica_2_livro_caderno.indb 124

7/12/2006 14:21:07

Sobre o professor conteudista Carlos Fernando Martins Engenheiro de Controle e Automação Industrial pela Universidade Federal de Santa Catarina – UFSC (1990-1995); Mestre em Engenharia Elétrica pelo Departamento de Automação e Sistemas da UFSC (1995-1996); Doutorando no Departamento de Engenharia Mecânica da UFSC (início em 2001) na Área de Concentração: Sistemas de Produção da Manufatura. Professor da Faculdade de Tecnologia do SENAI Florianópolis nas disciplinas de Lógica de Programação, Programação Orientada a Objetos, Linguagens de Programação C/C++ e UML; Professor de cursos de Pós Graduação em nível de especialização em automação industrial (Sistemas Discretos da Manufatura, Integração de Sistemas da Manufatura, Sistemas da Informação).

logica_2_livro_caderno.indb 125

7/12/2006 14:21:07

logica_2_livro_caderno.indb 126

7/12/2006 14:21:07

Respostas e comentários das atividades de auto-avaliação Unidade 1 1) temperaturas: vetor[25] numérico 2) nomes: vetor[150] literal 3) produtos: vetor[2500] literal 4) Pseudocódigo do programa de reserva de vôos

início {declaração de variáveis} NUM_VOOS, I, NVD: numérico {NVD = número do vôo desejado} vetor: VOOS[500] numérico {supondo 500 vôos ao dia. Cada posição do vetor armazena o número de lugares disponíveis} RG: literal {início do programa} escreva “Especifique o número de vôos disponíveis” leia NUM_VOOS para I de 0 até NUM_VOOS-1 passo 1 faça escreva “Especifique a quantidade de lugares disponíveis para o vôo:”, I+1 leia VOOS[ I ] fim-para {processamento} escreva “Entre com o número do vôo ou –1 para sair:” leia NVD {leitura do número do vôo desejado pelo cliente} enquanto NVD -1 faça se (NVD >= 0 E NVD < NUM_VOOS) então se VOOS[ NVD ] > 0 então {há lugares disponíveis} VOOS[ NVD ]  VOOS[ NVD ] – 1 {1 lugar ocupado no vôo}

logica_2_livro_caderno.indb 127

7/12/2006 14:21:07

Universidade do Sul de Santa Catarina

escreva “Entre com o RG do passageiro:” leia RG senão escreva “Não há lugares disponíveis no vôo”, NVD fim-se senão escreva “Não existe esse vôo”, fim-se escreva “Entre com o número do vôo ou –1 para sair:” leia NVD fim-enquanto fim

Unidade 2 1) Pseudocódigo

início NOMES : vetor [27] literal DISTANCIAS : matriz [27][27] numérico LINHA, COLUNA : numérico CAPITAL1, CAPITAL2 : literal para LINHA de 0 até 26 passo 1 faça escreva “Digite o nome de uma capital: “ leia NOMES[LINHA] fim-para para LINHA de 0 até 26 passo 1 faça para COLUNA de 0 até 26 passo 1 faça se LINHA = COLUNA então DISTANCIAS[LINHA][COLUNA]  0 senão escreva “Digite a distância (kms) entre “,NOMES[LINHA], “ e “, NOMES[COLUNA]

128

logica_2_livro_caderno.indb 128

7/12/2006 14:21:07

Lógica de Programação II

leia DISTANCIAS[LINHA][COLUNA] fim-se fim-para fim-para escreva “Digite o nome da primeira capital escolhida:” leia CAPITAL1 escreva “Digite o nome da segunda capital escolhida:” leia CAPITAL2 LINHA  0 enquanto NOMES[LINHA] CAPITAL1 ou LINHA QUANTIDADE[POS+1] então AUX1  QUANTIDADE[POS] AUX2  CODIGOPRODUTO[POS] QUANTIDADE[POS]  QUANTIDADE[POS+1] CODIGOPRODUTO[POS]  CODIGOPRODUTO[POS+1] QUANTIDADE[POS+1]  AUX1 CODIGOPRODUTO[POS+1]  AUX2 senão POS  POS + 1 fim-se fim-enquanto POS  1 ULTIMO  ULTIMO - 1 fim-enquanto

134

logica_2_livro_caderno.indb 134

7/12/2006 14:21:08

Lógica de Programação II

escreva “Imprimindo os códigos e as quantidades em ordem crescente.” para POS de 0 até 99 passo 1 faça escreva CODIGOPRODUTO[POS] escreva QUANTIDADE[POS] fim-para fim 2) Pseudocódigo

início ALUNOS : vetor[100] numérico POS, PESQUISADO, CONT :numérico para POS de 0 até 99 passo 1 faça escreva “Digite o código de matrícula de um aluno: “ leia ALUNOS[POS] fim-para {leitura de 5 números de matrícula} para CONT de 1 até 5 passo 1 faça escreva “Digite o número de matrícula a ser pesquisado: “ leia PESQUISADO POS  0 {o comando repita está sendo utilizado para percorrer o vetor ALUNOS} repita POS  POS + 1 até que PESQUISADO = ALUNOS[POS] ou POS > 99 se POS > 99 então escreva “Número não cadastrado !” senão escreva “Número localizado na posição “,POS,” do vetor.” fim-se fim-para fim

135

logica_2_livro_caderno.indb 135

7/12/2006 14:21:08

Universidade do Sul de Santa Catarina

3) início

VET: vetor[5] numérico NUMEROLIDO, PRIMEIRA, ULTIMA, METADE: numérico POS: numérico ACHOU : lógico {variável que armazena verdadeiro quando o valor numérico for encontrado no vetor. Caso contrário, armazena falso} {preenchendo um vetor com números em ordem crescente} para POS de 0 até 4 passo 1 faça escreva “digite um número: “ leia VET[ POS ] fim-para escreva “digite um número a ser pesquisado : “ leia NUMEROLIDO {inicialização das variáveis} PRIMEIRA  0 ULTIMA  4 ACHOU  falso {processo de procura} enquanto PRIMEIRA 1 faça enquanto POS < > (ULTIMO - 1) faça {mecanismos de ordenação de valores} se QTDE[POS] > QTDE[POS+1] então AUX1  QTDE[POS] AUX2  COD_PRODUTO[POS] QTDE[POS]  QTDE[POS+1] COD_PRODUTO[POS]  COD_PRODUTO[POS+1] QTDE[POS+1]  AUX1 COD_PRODUTO[POS+1]  AUX2

137

logica_2_livro_caderno.indb 137

7/12/2006 14:21:08

Universidade do Sul de Santa Catarina

senão POS  POS + 1 fim-se fim-enquanto POS  1 ULTIMO  ULTIMO - 1 fim-enquanto escreva “Imprimindo os códigos e as quantidades em ordem crescente.” para POS de 0 até 99 faça escreva COD_PRODUTO[POS] escreva QTDE[POS] fim-para fim

Unidade 5 1) Implementando a função SUBTRACAO, MULTIPLICACAO e DIVISAO sem retorno de valores. Pseudocódigo

início {declaração de variáveis} OPCAO, N1, N2: numérico OPCAO  1 enquanto OPCAO < > 4 faça escreva “Menu de Opções” escreva “1. Subtração” escreva “2. Multiplicação” escreva “3. Divisão” escreva “4. Sair” escreva “Selecione uma opção: ” leia OPCAO leia N1 leia N2 se OPCAO < > 4 faça se OPCAO = 1 então {operação de subtração} SUBTRACAO (N1, N2)

138

logica_2_livro_caderno.indb 138

7/12/2006 14:21:08

Lógica de Programação II

Senão se OPCAO = 2 então {operação de Multiplicação} MULTIPLICACAO (N1, N2) Senão se OPCAO = 3 então {operação de divisão} DIVISAO (N1, N2) senão escreva “Opção errada. Digite novamente” fim-se fim-se fim-se fim-se fim-enquanto fim {implementação das funções} função SUBTRACAO (NUM1, NUM2: numérico) escreva “resultado =”, NUM1 – NUM2 fim-função função MULTIPLICACAO (NUM1, NUM2: numérico) escreva “resultado =”, NUM1*NUM2 fim-função função DIVISAO (NUM1, NUM2: numérico) se NUM2 < > 0 então {garante que a divisão nunca será feita por zero} escreva “resultado =” NUM1/NUM2 senão escreva “não existe divisão por zero” fim-se fim-função

139

logica_2_livro_caderno.indb 139

7/12/2006 14:21:09

Universidade do Sul de Santa Catarina

2) Implementando a função SUBTRACAO, MULTIPLICACAO e DIVISAO com retorno de valores. Pseudocódigo

início {declaração de variáveis} OPCAO, NUM1, NUM2, RESULTADO: numérico OPCAO  1 enquanto OPCAO < > 4 faça escreva “Menu de Opções” escreva “1. Subtração” escreva “2. Multiplicação” escreva “3. Divisão” escreva “4. Sair” escreva “Selecione uma opção: ” leia OPCAO se OPCAO < > 4 faça Escreva “Digite dois números” Leia N1 Leia N2 se OPCAO = 1 então {operação de subtração} RESULTADO  SUBTRACAO (N1, N2) senão se OPCAO = 2 então {operação de Multiplicação} RESULTADO  MULTIPLICACAO (N1, N2) senão se OPCAO = 3 então {operação de divisão} RESULTADO  DIVISAO (N1, N2) senão escreva “Opção errada. Digite novamente” fim se fim se fim se escreva “resultado da operação =”, RESULTADO fim se fim enquanto fim

140

logica_2_livro_caderno.indb 140

7/12/2006 14:21:09

Lógica de Programação II

{implementação das funções} função SUBTRACAO (NUM1, NUM2: numérico): numérico retorna NUM1 – NUM2 {retorna a diferença entre os parâmetros da função} fim-função função MULTIPLICACAO (NUM1, NUM2: numérico): numérico retorna NUM1*NUM2 {retorna a multiplicação entre os parâmetros da função} fim-função função DIVISAO (NUM1, NUM2: numérico): numérico se NUM2 < > 0 então {garante que a divisão nunca será feita por zero} retorna NUM1/NUM2 senão escreva “não existe divisão por zero” retorna 0 fim-se fim-função 3) Algoritmo do programa que implementa uma função que aceita três valores como parâmetro e retorna o maior valor.

início {declaração de variáveis} RESULT, VAL1, VAL2, VAL3: numérico {entrada de dados} escreva “Digite o primeiro número” leia VAL1 escreva “Digite o segundo número” leia VAL2 escreva “Digite o terceiro número” leia VAL3 {chamando a função} RESULT  FUNCAO_MAIOR(VAL1, VAL2, VAL3) escreva “O maior valor é:”, RESULT fim

141

logica_2_livro_caderno.indb 141

7/12/2006 14:21:09

Universidade do Sul de Santa Catarina

{implementação da função} função FUNCAO_MAIOR (NUM1, NUM2, NUM3: numérico): numérico MAIOR: numérico {variável local. Válido somente dentro da função} se NUM1 > NUM2 E NUM1 > NUM3 então {NUM1 é o maior valor} MAIOR  NUM1 senão se NUM2 > NUM1 E NUM2 > NUM3 então {NUM2 é o maior valor} MAIOR  NUM2 senão {NUM3 é o maior valor} MAIOR  NUM3 fim-se retorna MAIOR fim-função

142

logica_2_livro_caderno.indb 142

7/12/2006 14:21:09

Elton João Gubert Mário Gerson Miranda Magno Júnior Patrícia Gerent Petry

Lógica de Programação II Caderno de atividades Design instrucional Flavia Lumi Matuzawa Viviane Bastos

2ª edição revista

Palhoça UnisulVirtual 2007

logica_2_livro_caderno.indb 143

7/12/2006 14:21:09

logica_2_livro_caderno.indb 144

7/12/2006 14:21:09

Apresentação Este caderno de atividades corresponde ao material complementar da disciplina de Lógica de Programação II. O material foi elaborado visando a uma aprendizagem autônoma, abordando conteúdos especialmente selecionados e adotando uma linguagem que facilite seu estudo a distância. Por falar em distância, isso não significa que você estará sozinho. Não esqueça que sua caminhada nesta disciplina também será acompanhada constantemente pelo Sistema Tutorial da UnisulVirtual. Entre em contato sempre que sentir necessidade, seja por correio postal, fax, telefone, e-mail ou Espaço UnisulVirtual de Aprendizagem. Nossa equipe terá o maior prazer em atendê-lo, pois sua aprendizagem é nosso principal objetivo Bom estudo e sucesso! Equipe UnisulVirtual.

logica_2_livro_caderno.indb 145

7/12/2006 14:21:09

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

005.1 G95

Gubert, Elton João Lógica de programação II : caderno de atividades / Elton João Gubert, Mário Gerson Miranda Magno Júnior, Patrícia Gerent Petry ; design instrucional Flavia Lumi Matuzawa; Viviane Bastos. – 2. ed. rev. – Palhoça : UnisulVirtual, 2007. 73p. : il. ; 28 cm. 1. Programação (Computadores). 2. Estrutura de dados (Computador). 3. Algoritmos. I. Magno Júnior, Mario Gerson Miranda. II. Petry, Patrícia Gerent. III. Matuzawa, Flavia Lumi. IV. Bastos, Viviane. V. Título.

Ficha catalográfica elaborada pela Biblioteca Universitária da Unisul

Créditos Unisul - Universidade do Sul de Santa Catarina UnisulVirtual - Educação Superior a Distância Campus UnisulVirtual Rua João Pereira dos Santos, 303 Palhoça - SC - 88130-475 Fone/fax: (48) 3279-1541 e 3279-1542 E-mail: [email protected] Site: www.virtual.unisul.br Reitor Unisul Gerson Luiz Joner da Silveira Vice-Reitor e Pró-Reitor Acadêmico Sebastião Salésio Heerdt Chefe de gabinete da Reitoria Fabian Martins de Castro Pró-Reitor Administrativo Marcus Vinícius Anátoles da Silva Ferreira Campus Sul Diretor: Valter Alves Schmitz Neto Diretora adjunta: Alexandra Orseni Campus Norte Diretor: Ailton Nazareno Soares Diretora adjunta: Cibele Schuelter Campus UnisulVirtual Diretor: João Vianney Diretora adjunta: Jucimara Roesler

Equipe UnisulVirtual Administração Renato André Luz Valmir Venício Inácio

logica_2_livro_caderno.indb 146

Bibliotecária Soraya Arruda Waltrick Coordenação dos Cursos Adriano Sérgio da Cunha Ana Luisa Mülbert Ana Paula Reusing Pacheco Cátia Melissa S. Rodrigues (Auxiliar) Charles Cesconetto Diva Marília Flemming Elisa Flemming Luz Itamar Pedro Bevilaqua Janete Elza Felisbino Jucimara Roesler Lilian Cristina Pettres (Auxiliar) Lauro José Ballock Luiz Guilherme Buchmann Figueiredo Luiz Otávio Botelho Lento Marcelo Cavalcanti Mauri Luiz Heerdt Mauro Faccioni Filho Michelle Denise Durieux Lopes Destri Nélio Herzmann Onei Tadeu Dutra Patrícia Alberton Patrícia Pozza Raulino Jacó Brüning Design Gráfico Cristiano Neri Gonçalves Ribeiro (coordenador) Adriana Ferreira dos Santos Alex Sandro Xavier Evandro Guedes Machado Fernando Roberto Dias Zimmermann Higor Ghisi Luciano Pedro Paulo Alves Teixeira Rafael Pessi Vilson Martins Filho

Equipe Didático-Pedagógica Angelita Marçal Flores Carmen Maria Cipriani Pandini Carolina Hoeller da Silva Boeing Cristina Klipp de Oliveira Daniela Erani Monteiro Will Dênia Falcão de Bittencourt Elisa Flemming Luz Enzo de Oliveira Moreira Flávia Lumi Matuzawa Karla Leonora Dahse Nunes Leandro Kingeski Pacheco Ligia Maria Soufen Tumolo Márcia Loch Patrícia Meneghel Silvana Denise Guimarães Tade-Ane de Amorim Vanessa de Andrade Manuel Vanessa Francine Corrêa Viviane Bastos Viviani Poyer

Monitoria e Suporte Rafael da Cunha Lara (coordenador) Adriana Silveira Caroline Mendonça Edison Rodrigo Valim Francielle Arruda Gabriela Malinverni Barbieri Gislane Frasson de Souza Josiane Conceição Leal Maria Eugênia Ferreira Celeghin Simone Andréa de Castilho Vinícius Maycot Serafim

Logística de Encontros Presenciais Caroline Batista (Coordenadora) Aracelli Araldi Graciele Marinês Lindenmayr José Carlos Teixeira Letícia Cristina Barbosa Kênia Alexandra Costa Hermann Marcia Luz de Oliveira Priscila Santos Alves

Secretaria de Ensino a Distância Karine Augusta Zanoni (secretária de ensino) Djeime Sammer Bortolotti Carla Cristina Sbardella Grasiela Martins James Marcel Silva Ribeiro Lamuniê Souza Liana Pamplona Maira Marina Martins Godinho Marcelo Pereira Marcos Alcides Medeiros Junior Maria Isabel Aragon Olavo Lajús Priscilla Geovana Pagani Silvana Henrique Silva

Logística de Materiais Jeferson Cassiano Almeida da Costa (coordenador) Eduardo Kraus

Produção Industrial e Suporte Arthur Emmanuel F. Silveira (coordenador) Francisco Asp Projetos Corporativos Diane Dal Mago Vanderlei Brasil

Secretária Executiva Viviane Schalata Martins Tecnologia Osmar de Oliveira Braz Júnior (coordenador) Ricardo Alexandre Bianchini Rodrigo de Barcelos Martins

Edição – Livro Didático Professores Conteudistas Elton João Gubert Mário Gerson Miranda Magno Júnior Patrícia Gerent Petry Design Instrucional Flavia Lumi Matuzawa Viviane Bastos Leandro Kingeski Pacheco (2a edição revista) Projeto Gráfico e Capa Equipe UnisulVirtual Diagramação Rafael Pessi Revisão Ortográfica Heloísa Mano Dorneles

7/12/2006 14:21:10

Palavras dos professores Prezado aluno, Você aprendeu, em Lógica de Programação I, os conceitos iniciais de algoritmos, criação de variáveis, tipos de dados, expressões e estruturas seqüenciais de decisão e de repetição. Em Lógica de Programação II, estudou novas estruturas, que o auxiliarão na resolução de problemas, e novas maneiras de representar a informação, como vetores, matrizes, registros, funções. Neste caderno de atividades, você vai aprimorar seu conhecimento com alguns exercícios resolvidos utilizando todos os conceitos abordados em Lógica de Programação I e II. Mãos à obra!

logica_2_livro_caderno.indb 147

7/12/2006 14:21:10

logica_2_livro_caderno.indb 148

7/12/2006 14:21:10

UNIDADE 1

Manipulação de vetores

1

Objetivos de aprendizagem

logica_2_livro_caderno.indb 149



Conhecer os algoritmos de maiores complexidades.



Construir algoritmos com utilização de vetores.

7/12/2006 14:21:10

Universidade do Sul de Santa Catarina

Para início de conversa Na Unidade referente à Lógica de Programação II, você aprendeu a manipular vetores, que nada mais é do que uma variável que pode armazenar vários valores de mesmo tipo. Neste caderno de atividades, vamos apresentar alguns exercícios resolvidos passo a passo e, ao fim da unidade, exercícios propostos para a sua resolução. Bom trabalho!

Exemplos resolvidos 1) Leia um conjunto N de números armazenados em um vetor, que representa alturas de pessoas. Calcule e escreva: a) média aritmética; b) quantas pessoas possuem altura acima da média; c) a maior altura; d) quantas pessoas possuem a maior altura. Algoritmo AlturaPessoas Altura : vetor[9999] numérico I, N, MediaAltura, TotalAcimaMedia, MaiorAltura, TotalMaiorAltura: numérico Início {Lê o total de alturas armazenadas no vetor Altura} Leia (“Digite o total de pessoas”,N) {Inicializar a variável Soma, que contém a soma de todas as alturas, para no fi nal calcular a média} Soma ← 0

150

logica_2_livro_caderno.indb 150

7/12/2006 14:21:11

Lógica de Programação II

{Iniciamos com um valor bem BAIXO, para garantir que encontraremos uma altura MAIOR que essa no vetor} MaiorAltura ← -1 {Iniciamos o laço} Para I de 1 até N faça {leitura do vetor de alturas} Leia “Digite a altura”, ALTURA [I] {Somamos a altura das pessoas, para depois calcularmos a média} Soma ← Soma + Altura[I] {Se a altura da pessoa atual (Altura[I]) for MAIOR que a maior altura até agora então, aquela passa a ser a maior altura} Se Altura[I] > MaiorAltura Então MaiorAltura ← Altura[I] Fim Se Fim Para {Calcula a média das alturas} MediaAltura ← Soma / N {Inicializando as variáveis que são contadores} TotalAcimaMedia ← 0 TotalMaiorAltura ← 0 {Novamente iniciamos o laço, para verificar quem tem altura maior que a média e quem tem a maior altura} Para I de 1 até N faça {Aqui iremos verificar o total de pessoas que têm a altura acima da média} Se Altura[I]>MediaAltura então TotalAcimaMedia ← TotalAcimaMedia + 1 Fim Se {Agora vamos verificar o total de pessoas que têm a maior altura} Se Altura[I]= MaiorAltura então TotalMaiorAltura ← TotalMaiorAltura + 1 Fim Se Fim Para

Unidade 1

logica_2_livro_caderno.indb 151

151

7/12/2006 14:21:11

Universidade do Sul de Santa Catarina

{Escrevendo os dados de saída} Escreva(“Média das alturas: “ + MediaAltura) Escreva(“Total de pessoas com altura acima da média: “ + TotalAcimaMedia) Escreva(“A maior altura é: “ + MaiorAltura) Escreva(“Total de pessoas com a maior altura é : “+TotalMaiorAltura) Fim

2) Faça um programa que leia e armazene em vetores as idades e o sexo (Masculino: 0 ou Feminino: 1) de um conjunto de pessoas. A leitura deverá parar quando for lida uma idade negativa. O programa deverá também: a) imprimir as idades dos homens e depois as idades das mulheres; b) imprimir as médias de idade de cada sexo; c) encontrar o homem mais novo e colocá-lo na posição inicial como o primeiro dos homens; d) encontrar a mulher mais jovem e posicioná-la como a primeira entre as mulheres. Algoritmo Pessoas Idade, Sexo: vetor[9999] numérico I, N, PosMaisJovem, IdadeMaisNova, PosMaisVelho, IdadeMaisVelho: numérico MediaIdadeHomens, MediaIdadeMulheres: numérico Início I ← 1 {Lê a idade da primeira pessoa já fora do laço, para que a condição do comando “enquanto-faça” possa ser verificada} Leia (“Digite a idade”,Idade[I])

152

logica_2_livro_caderno.indb 152

7/12/2006 14:21:11

Lógica de Programação II

{Enquanto o usuário digitar números maiores que -1, o laço continua girando e, conseqüentemente, lendo a Idade e o Sexo de outra pessoa.} Enquanto Idade[I] > -1 faça Leia(“Digite o sexo”,Sexo[I]) I ← I + 1 {Antes de o laço “retornar”, é preciso ler a idade de outra pessoa. Veja que a leitura da Idade da primeira pessoa foi realizada “fora” do laço} Leia(“Digite um valor para a idade ou -1 para fi nalizar”,Idade[I]) Fim Enquanto {Aqui descobrimos quantos dados foram realmente lidos (N), já que não sabíamos de antemão} N ← I - 1 {Escreve a idade de todos os homens. Aproveita o laço para somar as idades deles e encontrar o mais velho} Soma ← 0 {Iniciamos com um valor bem BAIXO, para garantir que encontraremos uma idade MAIOR que essa no vetor} IdadeMaisVelho ← -1 Para I de 1 até N faça Se Sexo[I] = 1 Então {Escrevemos a idade de cada homem} Escreva (Idade[I]) {Somamos a idade de cada homem para depois calcular a média} Soma ← Soma + Idade[I] {Se a idade do Homem atual (Idade[I]) for MAIOR que a idade do mais velho até agora então, aquele passa a ser o mais velho. A posição atual no vetor é “guardada” em PosMaisVelho} Se Idade[I] > IdadeMaisVelho Então IdadeMaisVelho ← Idade[I] PosMaisVelho ← I Fim Se Fim Se Fim Para {Calcula a média de idade dos homens} MediaIdadeHomens ← Soma / N

Unidade 1

logica_2_livro_caderno.indb 153

153

7/12/2006 14:21:11

Universidade do Sul de Santa Catarina

{Trocando de posição o homem mais velho com a primeira posição em que aparece homem} I ←1 Enquanto | NOME[J] então AUX  NOME[I] NOME[I]  NOME[J] NOME[J]  AUX Fim se Fim Para Fim Para {Escrevendo o vetor ordenado} Escreva “Nomes Ordenados:” Para I de 1 até 50 faça Escreva NOME[I] Fim Para Fim

182

logica_2_livro_caderno.indb 182

7/12/2006 14:21:17

Lógica de Programação II

Explicação do Método de Ordenação utilizado Imagine o vetor chamado NOME e suas posições I, com tamanho 4: NOME

José

Marcos

Ana

Maria

I

1

2

3

4

É importante lembrar que quando se menciona posição está-se referindo a I, e quando mencionado no conteúdo do vetor, na informação, refere-se a NOME[I]. Qual é a idéia do algoritmo apresentado anteriormente? Será utilizado o primeiro nome (José), comparando-o com todos os demais, ou seja, será fi xada a posição I=1 e será comparado o nome José com Marcos, Ana e Maria (I=2, 3 e 4). Então será colocado o menor nome (Ana) na primeira posição e será comparada a posição do 2º nome com os demais, e assim por diante. Acompanhe o exemplo. Para I de 1 até 4 faça {essa primeira estrutura de repetição serve para fi xar o primeiro nome (a primeira vez que entra nesse para-faça é José) a ser comparado com os demais quando I=1. Depois será com I=2, I=3 e I=4.} Para J de (I+1) até 4 faça {essa segunda estrutura de repetição serve para percorrer os demais nomes a partir daquele que será fi xo, ou seja, se estou na primeira posição I=1, o J será I+1, ou seja, 2 (depois 3, depois 4, e assim por diante).} Se NOME[I] > NOME[J] então AUX  NOME[I] NOME[I]  NOME[J] NOME[J]  AUX Fim se {Na estrutura de decisão, SE está sendo comparado NOME[1] > NOME[2] (José com Marcos), ou seja, o I=1 e J=2. Verifica-se se José é > que Marcos, ou seja, a letra J vem depois de M? Não. Então não há troca. O que ocorre? Volta para o PARA J DE (I+1) ATÉ 4 FAÇA. Agora o I vale 1 e J está valendo 3.

Unidade 4

logica_2_livro_caderno.indb 183

183

7/12/2006 14:21:17

Universidade do Sul de Santa Catarina

Então, entro na estrutura de decisão SE e testo NOME[1] > NOME[3]. José é maior do que Ana? Sim. Então a troca entre a posição 1 e 3 será feita.} Meu vetor agora se apresenta assim:

NOME

Ana

Marcos

José

Maria

I

1

2

3

4

{Volta para o PARA J DE (I+1) ATÉ 4 FAÇA. Agora o J está valendo 4. Entra na estrutura de decisão SE e testa NOME[1] > NOME[4]. Agora atenção. Vou comparar Ana com Maria. Ana é > que Maria? Não. Não é realizada nenhuma troca. Volta para PARA J DE (I+1) ATÉ 4 FAÇA. Já chegou a 4. Então sai do PARA J e volta para o PARA I, agora o I vale 2. Entra novamente no PARA J DE (I+1) ATE 4 FAÇA.} I=2 J=I+1 = 3 {Então será fi xa; fi xar a posição 2 e comparar com o restante do vetor a partir da posição 3. Se NOME[2] > NOME[3] então. É verdade? Marcos é > José? Sim. Então realiza a troca.} O vetor fica assim agora:

NOME

Ana

José

Marcos

Maria

I

1

2

3

4

{Volta para o PARA J DE (I+1) ATÉ 4 FAÇA. Entra no SE e compara NOME[2]>NOME[4]. Não. Não é realizada troca. PARA J já chegou a 4. Então pára! E vai para o PARA I novamente. O I já chegou a 4? Não. O I estava valendo 2 e agora passa a valer 3.}

184

logica_2_livro_caderno.indb 184

7/12/2006 14:21:17

Lógica de Programação II

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

NOME

Ana

José

Marcos

Maria

I

1

2

3

4

Fim Para Fim Para

Unidade 4

logica_2_livro_caderno.indb 185

185

7/12/2006 14:21:17

Universidade do Sul de Santa Catarina

Pesquisa Seqüencial ou Linear 1) Dados desordenados – Pesquisa Linear Simples {Este algoritmo representa a forma mais básica de consulta a um grupo de dados; seria o equivalente à leitura de um livro em procura de uma determinada palavra; você pode imaginar como isso é trabalhoso não?} a,n,i: numérico {A variável a representa o número procurado} {A variável n representa o número de valores armazenados} Início Leia (a, n) {Primeiramente, é preciso preencher o vetor com os valores; para isso, usamos um laço que pede para o usuário digitar cada um dos valores} Para i de 1 até n faça Leia ( x[ i ] ) Fim Para {Abaixo posicionamos nossa variável auxiliar i na primeira posição do vetor e então desenvolvemos um laço à procura do primeiro valor que corresponder ao valor procurado} i ← 1 Enquanto (i n então Escreva (“Não encontrou”) Senão Escreva (“Encontrou na posição : “, i) Fim Se Fim.

186

logica_2_livro_caderno.indb 186

7/12/2006 14:21:17

Lógica de Programação II

2) Dados Ordenados - Pesquisa Binária (para vetores grandes) {O exemplo abaixo se refere à Pesquisa Binária para números inteiros, mas o método pode ser aplicado para tipo de valor, como real e literal.} Algoritmo PesquisaBinaria numeroPesquisa: numérico {número a ser pesquisado} n: numérico {quantidade de valores no vetor} x: vetor[N] de numérico {vetor de tamanho “n” de valores inteiros} início, meio, fi nal, i: numérico Início {A idéia central deste método de pesquisa é “dividir para conquistar”, isto é, sempre perguntar “ao vetor” onde está o valor que estamos procurando: se na metade da esquerda do vetor, ou na metade da direita. De posse dessa informação, nós “redefi nimos” o início e o fi m desse vetor e passamos a ter agora a metade do vetor original, via de regra, um “novo” vetor. A partir daí o processo continua, sempre descobrindo em que metade o valor está (e redefi nindo início e fi m do vetor sucessivamente), até que o valor seja encontrado, ou não seja mais possível dividir o vetor; neste último caso, significa que o valor não estava no vetor. Este método é especialmente utilizado em vetores GRANDES. Como vimos acima, a vantagem é que a cada iteração o tamanho do vetor passa a ter a metade do anterior, e assim sucessivamente, diminuindo, desse modo, o tempo de processamento.} {Leitura do número a ser pesquisado e do tamanho do vetor} Leia (numeroPesquisa , N) {Leitura dos valores do vetor} Para i de 1 até N faça Leia ( x [ i ] ) Fim Para {O início e o fi nal neste ponto representam o tamanho original do vetor} Início ← 1 fi nal ← N Enquanto (início x[meio] ) então {O número está na metade direita, “redefi no” o início} Início ← fi nal + 1 Senão {Nesta opção, o número foi encontrado, então atribuímos à variável início um valor tal, para que o laço TERMINE de “girar”} Início ← fi nal + 1 {artifício para interromper o laço} Fim Se Fim Se Fim enquanto {Se saímos do laço e x[meio] é diferente do numeroPesquisa, então NÃO encontramos, senão... (x[meio] é igual a numeroPesquisa, então ENCONTRAMOS} Se (x[meio] numeroPesquisa) então Escreva (“Não Encontrou”) Senão Escreva (“Encontrou na posição : “, meio) Fim Se Fim

188

logica_2_livro_caderno.indb 188

7/12/2006 14:21:18

Lógica de Programação II

Atividades propostas 1) Faça um algoritmo para ler um vetor X com N elemento. Leia um valor A qualquer. Verifique se este valor pertence ao vetor. Se pertencer, mostre uma mensagem na tela. E informe quantas vezes ele aparece e em quais posições. Caso não exista, escreva uma mensagem.

Unidade 4

logica_2_livro_caderno.indb 189

189

7/12/2006 14:21:18

Universidade do Sul de Santa Catarina

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

190

logica_2_livro_caderno.indb 190

7/12/2006 14:21:18

UNIDADE 5

Programação estruturada

5

Objetivos de aprendizagem

logica_2_livro_caderno.indb 191



Entender os conceitos de programação estruturada.



Aplicar modularização aos algoritmos.

7/12/2006 14:21:18

Universidade do Sul de Santa Catarina

Para início de conversa A realização de uma determinada tarefa muitas vezes é decomposta em seqüências de passos. Lembre-se da tarefa de trocar uma lâmpada: existe uma série de passos que devem ser seguidos. Conforme uma tarefa cresce e se torna mais complexa, surge uma série de situações a serem resolvidas para que esse problema possa ser solucionado. Podemos dizer que passamos a ter dentro deste problema uma série de “probleminhas”. Muitas vezes, essa grande quantidade de probleminhas afeta a legibilidade (clareza), fazendo com que uma consulta ou manutenção futura dessa lógica seja uma tarefa difícil de se realizar. Por meio da modularização é possível evitar isso, como também podemos reutilizar esse probleminha descrito em uma outra tarefa. Portanto, modularizar é quebrar um problema em pequenas partes, sendo que cada uma dessas partes será responsável pela realização de uma etapa do problema.

Exemplos resolvidos 1) Dada uma frase, faça uma FUNÇÃO que verifique se existe alguma palavra com mais de 7 caracteres. Considere que cada palavra é separada da outra por, no mínimo, um espaço em branco.

Função ExistePalavraMaiorQueSete(Frase: literal): lógico K, TamPalavra: numérico {Observe que “Frase” é o parâmetro da função e ExistePalavraMaiorQueSete é o próprio nome da função que retorna Verdadeiro ou Falso} Início {Partimos do princípio de que NÃO existe Palavra com tamanho maior que 7 (sete)} ExistePalavraMaiorQueSete ← Falso

192

logica_2_livro_caderno.indb 192

7/12/2006 14:21:18

Lógica de Programação II

{Artifício identificar o fi nal da frase, neste caso a frase está terminando com os caracteres “ $” (espaço e cifrão) } Frase ← Frase + “ $” K ← 0 {Vale lembrar que um literal pode ser manipulado como um VETOR de caracteres, iniciando na posição 0(zero)} TamPalavra ← 0 Enquanto (NÃO ExistePalavraMaiorQueSete) (Frase[K] “$”) faça

e

{Se o caractere da posição K for diferente de um espaço em branco, estamos assumindo que ele está fazendo parte de uma palavra, por isso incrementamos a variável TamPalavra que guarda esta informação} Se Frase[K] “ “ Então TamPalavra ← TamPalavra + 1 Senão {Neste ponto a palavra terminou e, então, precisamos testar e seu tamanho} Se TamPalavra > 7 Então {Se a palavra for maior que sete, já temos nosso resultado, por isso atribuímos “Verdadeiro” à variável para que o laço termine} ExistePalavraMaiorQueSete Senão

← Verdadeiro

{Neste ponto precisamos “zerar” a variável que guarda o tamanho da palavra, para começar a contar o tamanho de outra, visto que essa, neste ponto, não tem tamanho maior que 7(set(} TamPalavra ← 0 Fim Se Fim Se {Incrementamos a variável K para acessar o próximo caractere da frase} K ← K + 1 Fim Enquanto Fim

Unidade 5

logica_2_livro_caderno.indb 193

193

7/12/2006 14:21:19

Universidade do Sul de Santa Catarina

2) Faça um programa para ler o nome e salário bruto de N funcionários. Calcule e imprima o valor do desconto do INSS, o valor de desconto do IRRF (se houver) e o valor do salário líquido do funcionário. Escreva uma função para retornar o valor de desconto do INSS e outra função para retornar o valor de desconto do IRRF. Tabela de Desconto do INSS SALÁRIO BRUTO

% DE DESCONTO

Até R$ 429,00

7,65 %

De R$ 429,01 até R$ 540,00

8,65 %

De R$ 540,01 até R$ 715,00

9,00 %

De R$ 715,01 até R$ 1.430,00

11,00 %

Acima de R$ 1430,00

R$ 157,00 (teto de contribuição)

Tabela de Desconto do IRFF SALÁRIO BRUTO

% DE DESCONTO

Até R$ 1.058,00

Isento

De R$ 1.059,00 a R$ 2.115,00

15%

Acima R$ 2.115,00

27,5%

{Programa Principal; neste, precisamos apenas das chamadas para as funções} Algoritmo salário SalBruto, NumDeFunc, DescINSS, DescIRRF, SalLiq: numérico Início Leia (SalarioBruto) Leia (NumDeFunc) DescINSS  CalculaINSS(SalarioBruto) DescIRRF  CalculaIRRF (SalarioBruto) SalLiq = SalarioBruto – DescINSS – DescIRRF Escreva (“O salário Liquido é:”, SalLiq) Fim

194

logica_2_livro_caderno.indb 194

7/12/2006 14:21:19

Lógica de Programação II

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

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF