lógica de programação - conceitos básicos

Upload: jam-ian

Post on 18-Jul-2015

819 views

Category:

Documents


2 download

TRANSCRIPT

Apostila de Lgica de Programao BsicoAutor: E_L_E_C_T_R_O Entre em Contato

Abordagem Contextual Muitas pessoas gostam de falar ou julgar que possuem e sabem usar o raciocnio lgico, porm, quando questionadas direta ou indiretamente, perdem esta linha de raciocnio, pois este depende de inmeros fatores para complet-lo, tais como: calma, conhecimento, vivncia, versatibilidade, experincia, criatividade, ponderao, responsabilidade, entre outros. Bem podemos dizer que lgica a cincia que estuda as leis e critrios de validade que regem o pensamento e a demonstrao, ou seja, cincia dos princpios formais do raciocnio. Usar a lgica um fator a ser considerado por todos, principalmente pelos profissionais de informtica (programadores, analistas de sistemas e suporte), pois seu diaa-dia dentro das organizaes solucionar problemas e atingir os objetivos apresentados por seus usurios, com eficincia e eficcia, utilizando recursos computacionais e/ou automatizados mecatronicamente. Saber lidar com problemas de ordem administrativa, de controle, de planejamento e de estratgica requer ateno e boa performance de conhecimento. Portanto nosso interesse mostrar como desenvolver e aperfeioar melhor esta tcnica, lembrando que para isto, voc dever ser persistente e pratic-la constantemente, chegando exausto sempre que julgar necessrio. A lgica, hoje abordada principalmente em cursos de 3 grau, como Cincia da Computao, Engenharias (Eltrica, Mecnica, Civil, Mecatrnica, entre outras), e outras reas das cincias exatas, uma vez que exigem uma linha de raciocnio, cuja baseia-se na lgica para solucionar os problemas. Princpios de Resolues de Problemas Primeiramente, devemos entender e compreender a palavra problema. Podemos dizer que problema uma proposta duvidosa, que pode ter inmeras solues, ou questes no resolvidas e que o objeto de discusso, segundo a definio encontrada no Dicionrio Aurlio. Preferimos dizer que problema uma questo que foge a uma determinada regra, ou melhor, o desvio de um percurso, o qual impede de atingir com sucesso um determinado objetivo com eficincia e eficcia. Uma das solues utilizadas para a resoluo de problemas tem sido a utilizao dos diagramas, no decorrer do curso ser bastante enfatizado em sala de aula o uso de tais ferramentas com o intuito de auxiliar o aprendizado tanto na resoluo de problemas como no conhecimento das tcnicas de programao. Lgica de Programao A lgica de programao necessria para pessoas que desejam trabalhar com desenvolvimento de sistemas e programas, ela permite definir a seqncia lgica para o desenvolvimento. Ento o que lgica? 1

Lgica de programao a tcnica de encadear pensamentos para atingir determinado objetivo. Estes pensamentos, podem ser descritos como uma seqncia de instrues, que devem ser seguidas para se cumprir uma determinada tarefa. Para programar voc precisa seguir uma seqncia lgica e conhecer determinadas instrues a serem dadas ao computador. A unio dessa seqncia lgica com as instrues a lgica de programao. A lgica de Programao no envolve qualquer linguagem de programao, um rascunho que elaboramos do programa que vamos fazer, traando a lgica e determinando as instrues. A partir de agora desenvolveremos uma lgica para programao, para posteriormente ser transposta para uma linguagem de programao qualquer. Exerccios 1- Um homem precisa atravessar um rio com um barco que possui capacidade de carregar apenas ele mesmo e uma de suas trs cargas: um lobo, um bode, e um mao de alfafa. O que o homem deve fazer para conseguir atravessar o rio sem perder suas cargas? Dica: No podem coexistir do mesmo lado, o lobo e o bode, ou, o bode e o mao de alfafa. 2- Uma pessoa est beira de um rio e possui dois baldes cujas capacidades so de 3 litros e 8 litros, respectivamente. Sabendo que os baldes possuem apenas uma marca indicando a capacidade mxima, como a pessoa deve proceder para que ela consiga encher o balde de 8 litros pela metade, usando apenas os dois baldes? 3- Marcelo encarregado de determinar a idade dos trs filhos de Alessandro, que conta a ele que o produto das idades das crianas 36. Depois de levar em conta esta informao, Marcelo responde que precisa de mais informaes, e ento, Alessandro conta a Marcelo a soma das idades das crianas, sendo esta igual a 13. Novamente Marcelo diz que necessita de mais informaes, e assim Alessandro conta que a criana mais velha toca piano. Depois de ouvir isto, Marcelo responde para Alessandro a idade das 3 crianas. Qual a idade de cada uma delas? 4- Trs amigos foram a um restaurante, como o faziam todos os anos. Conversaram bastante, comeram e beberam umas 2 horas e resolveram ir embora. Pediram a conta e o garom a trouxe. Deu um total de trinta reais. Acharam excelente, pois ficaria fcil a diviso. Cada um pagou ento um tero da conta e se prepararam para ir para casa. Quando estavam j de sada o garom os chamou e disse que havia se enganado, pediu desculpas e disse que na verdade a conta era 25 Reais. Pensaram um pouco e um deu a idia de fazer a seguinte conta para facilitar: Vamos cada um pegar um real de volta e o garom ficar com 2 Reais de gorjeta por ter sido honesto. Toparam todos e saram. Quando j estavam l fora um se deu conta e perguntou: No estou entendendo uma coisa. Ns pagamos inicialmente 10 Reais cada um, aps isto recebemos um real de volta sendo o total que cada um pagou foi de R$ 9. Multiplicando por trs este valor chegamos a 27. Com estes 27 Reais e somando os dois do garom fica um total de R$ 29. Onde est o R$ 1 faltante? Outro companheiro afirma que para descobrir onde est o R$ 1,00 , temos que pegar o dinheiro de volta! Portanto, se cada um pagou 9, e 3 X 9 = 27. Mais um real que cada um possui, igual a R$ 30,00 mais o R$ 2,00 que esto com o garom, so R$ 32,00 !!!!! Antes que sobre 2 do que falte 1, no ? 2

Voc capaz de explicar o que aconteceu com estas contas todas? 5. A pequena cidade de Xuxu organizou seu primeiro grande torneio ciclstico e aps a ltima volta chegaram os seguintes oitos corredores: Carlos, Ricardo, Raul, Tomas, Roberto, Boris, Diego e Luis. Pede-se encontrar a posio de chegada de cada um destes corredores sabendo que : A irm de Boris aplaudiu seu marido, que chegou em stimo; Tomas chegou entre os quatro primeiros; Na manh do torneio, Raul, Tomas e o que chegou em quarto lugar, tomaram caf da manh juntos; O terceiro colocado faz hoje o seu primeiro aniversrio de casamento; As esposas do primeiro e quarto colocados abraaram seus maridos no final do torneio; Diego, Boris e os que chegaram no stimo e oitavo lugares estavam esgotados na chegada; A esposa do quinto colocado irm de Roberto; Raul e o quinto colocado estavam na frente dos oito corredores antes da ltima volta; Carlos e Luis foram os dois primeiros a chegarem; Luis, Ricardo e Boris so solteiros, os outros so casados; 6. Trs pessoas se registram em um hotel. Elas pagam $30 ao gerente e vo para seus quartos. O gerente nota que a diria de $25 e entrega $5 ao mensageiro do hotel para ele devolver aos hspedes. No caminho, o mensageiro conclui que seria complicado dividir $5 entre 3 pessoas, ento ele embolsa $2 e entrega $1 para cada pessoa. Agora, cada um pagou $10 e pegou $1 de volta. Ento, cada um pagou $9, totalizando $27. O mensageiro tem $2, totalizando $29. Onde est o outro $1? Algoritmo Um algoritmo uma receita para um processamento computacional e consiste de uma srie de operaes primitivas , interconectadas devidamente, sobre um conjunto de objetos. Os objetos manipulados pela receita so as constantes e as variveis. Chamamos de constante a um objeto cujo valor no se altera ao longo do algoritmo. Uma constante pode ou no ter um nome. Neste caso diz-se ser annima. Por outro lado, uma varivel um objeto que pode ter um nome e um valor, que pode ser alterado pelo algoritmo. Ou seja, uma varivel pode assumir um valor num determinado instante e ser diferente em outro instante da execuo do algoritmo. Como exemplos de algoritmos podemos citar os algoritmos das operaes bsicas (adio, multiplicao, diviso e subtrao) de nmeros reais, decimais ou naturais. Outros exemplos seriam os manuais de aparelhos eletrnicos, como um videocassete, que explicam passo-a-passo como, por exemplo, gravar um evento. Programa Os programas de computadores nada mais so do que algoritmos escritos numa linguagem de computador (Pascal, C, Cobol, Fortran, Visual Basic, entre outras) e que so interpretados e executados por uma mquina, no caso um computador. Notem que dada 3

esta interpretao rigorosa, um programa por natureza muito especfico e rgido em relao aos algoritmos da vida real. Fases de um programa: Como tudo na terra, o programa tem um tempo de vida, chamado de ciclo de vida de um programa. Sendo ele abaixo especificado: Planejamento: a fase onde definimos o problema a ser resolvido utilizando um computador. Nesta fase relacionamos a entrada e a sada do futuro programa, assim como a definio dos arquivos auxiliares que ele venha a utilizar. Projeto: a fase onde a resoluo do problema concebida. Neste ponto so definidos detalhes do algoritmo, ou seja, a estrutura de dados empregados pelo programa. Escrita: Consiste em codificar o programa em uma linguagem de programao apropriada. Depurao : Ao final da escrita estaremos com o programa quase pronto; mas ser que ele funciona? Esta a fase onde depuramos o programa, ou seja, corrigimos os erros. Manuteno: Passada a fase de depurao, o programa ser ento liberado para utilizao. Mas durante sua vida til, um programa pode ser alterado; neste caso teremos que fazer novas mudanas, ou seja, manuteno. Mais o que um Algoritmo? Algoritmo um processo de clculo matemtico ou de resoluo de um grupo de problemas semelhantes, em que se estipulam, com generalidade e sem restries. Podemos dizer tambm, que so regras formais para obteno de um resultado ou da soluo de um problema, englobando frmulas de expresses aritmticas. Os algoritmos so descritos em uma linguagem chamada pseudocdigo. Este nome uma aluso posterior implementao em uma linguagem de programao, ou seja, quando formos programar em uma linguagem, por exemplo Visual Basic, estaremos gerando um cdigo em Visual Basic. Por isso os algoritmos so independentes das linguagens de programao. Ao contrrio de uma linguagem de programao no existe um formalismo rgido de como deve ser escrito o algoritmo. O algoritmo deve ser fcil de se interpretar e fcil de se codificar. Ou seja, ele deve ser o intermedirio entre a linguagem falada e a linguagem de programao. Arquitetura de Memria De um modo geral, a memria do computador pode ser vista como um conjunto de clulas, cada uma identificada unicamente por um nmero inteiro distinto, conhecido como endereo. Memria O acesso s informaes armazenadas na memria (leitura, escrita) feita Byte a Byte. Cada Byte formado por uma combinao de 8 dgitos binrios (0 e 1), sendo assim, um Byte possui 256 (28) estados possveis ou representa 256 smbolos de informao. Armazenamento de dados na memria Cada informao de determinado tipo representada de diferentes formas, e 4

necessita de uma certa quantidade de memria para armazen-las. O nmero de bytes necessrios para armazenar uma informao depender do seu tipo. Por exemplo, na maioria das linguagens de programao o tipo inteiro armazenado ocupando 2 bytes, ou seja 65536 (28 x 28 = 216) possibilidades. Um dado do tipo caractere formado por vrios smbolos, sendo que cada um ocupa 1 byte. Desta forma o nmero de bytes utilizados no armazenamento do tipo caractere depender do seu tamanho. 1 endereo - 1 byte Formao de Identificadores Podemos imaginar a memria como sendo um armrio repleto de gavetas, no qual as gavetas seriam os locais fsicos responsveis por armazenar objetos; os objetos (que podem ser substitudos ou no) seriam as informaes (dados), e as gavetas, as variveis ou constantes. Visto que na memria (armrio) existem inmeras variveis (gavetas), precisamos diferenci-las, o que feito por meio de identificadores (etiquetas). Cada varivel (gaveta), no entanto, pode guardar apenas uma informao (objeto) de cada vez, sendo sempre do mesmo tipo (material). Os identificadores possuem certas regras para serem formados: devem comear por um caracter alfabtico; 1.Podem ser seguidos por mais caracteres alfabticos e/ou alfanumricos; 2.No permitido o uso de caracteres especiais ou espaos, com exceo do underscore ( _ ). Variveis e Constantes So entidades que armazenam valores. A diferena entre variveis e constantes est na possibilidade de alterao do valor armazenado, durante todo o tempo de durao do programa. Variveis Variveis so endereos de memria destinados a armazenar informaes temporariamente. Obs.: Todo Algoritmo ou programa deve possuir pelo menos uma varivel! Para guardar dados na memria temos que criar um endereo do dado que ser armazenado. Varivel o nome deste endereo na memria que guardar um determinado dado. Para dar nome a uma varivel algumas regras devem ser seguidas. Conforme j falamos anteriormente, para construir um programa o programador precisa utilizar uma linguagem de programao. As regras de nomenclatura podem e vo variar de uma linguagem para a outra, portanto deve-se consultar o manual da linguagem para saber as regras da nomenclatura de variveis determinadas para a linguagem que voc vai utilizar. A seguir esto determinadas as regras de nomenclatura para as variveis que devero ser seguidas no decorrer do curso: 12345Deve comear com uma letra qualquer; Ter um tamanho definido de at 256 caracteres; No deve conter espaos em branco, nem sinais de operadores; No pode ser nome de comandos; No pode existir outra varivel ou constante com o mesmo nome.

Veja alguns exemplos: Nome de Variveis 5

Vlidos Aluno Idade A12xKl Nome_Aluno

Invlidos 1 Aluno Idade do Aluno 12xKl21 Escrever

De acordo com o tipo de dado que ser utilizado no programa voc precisa definir o tipo da varivel. Durante o curso utilizaremos as seguintes variveis: real, inteiro, caractere e lgico. OBS.: Toda vez que voc fizer referncia a uma varivel estar na verdade se referindo ao seu contedo. Tipos primitivos de dados Inteiro Real Caractere Lgico Admite somente nmeros inteiros. Geralmente utilizado para representar uma contagem (quantidade). Admite nmeros reais (com ou sem casas decimais). Geralmente utilizado para representar uma medio. Admite caracteres alfanumricos. Os nmeros quando declarados como caracteres tornam-se representativos e perdem a atribuio de valor. Admite somente valores lgicos (verdadeiro / falso). Operadores aritmticos + * / mod div Adio Subtrao Multiplicao Diviso resto da diviso quociente da diviso inteira Operadores Lgicos Os operadores lgicos servem para combinar resultados de expresses, retornando se o resultado final verdadeiro ou falso. Os operadores lgicos so: E (AND): Uma expresso E (AND) verdadeira se todas as condies forem verdadeiras; OU (OR): Uma expresso OU (OR) verdadeira se pelo menos uma condio for verdadeira; NO (NOT): Uma expresso NO (NOT) inverte o valor da expresso ou condio, se verdadeira inverte para falsa e vice-versa; Operaes Lgicas so utilizadas quando se torna necessrio tomar decises em um diagrama de bloco; 6

Num diagrama de bloco, toda deciso ter sempre como resposta o resultado VERDADEIRO ou FALSO; A tabela abaixo mostra todos os valores possveis criados pelos trs operadores lgicos:

1 Valor T T F F T T F T F

AND, OR e NOT Operador 2 Valor AND T AND F AND T AND F OR T OR F OR T NOT NOT -

Resultado T F F F T T T T T

Explicando: Com o operador E a expresso s ser verdadeira se todas as condies forem verdadeiras, com o operador OU para que a expresso seja verdadeira basta que uma das condies o seja. Operadores relacionais > < >= 200) seja verdadeiro todos os comandos entre a linha do teste e o comando que indica o final do bloco (Fim Se) 15

sero executados, caso contrrio o programa vai direto para o primeiro comando aps o "Fim Se".

Estrutura de Deciso Composta Sempre que testamos uma condio podemos obter, apenas, dois resultados, verdadeiro ou falso. A estrutura de deciso simples permite que executemos, ou no, um bloco de comandos, j a estrutura de deciso composta apresenta 2 blocos, um a ser executado caso a condio testada seja falsa, e outro a ser executado caso a condio seja verdadeira, como s podemos ter uma das duas resposta um e apenas um destes blocos sempre executado. Sua estrutura bsica a seguinte: se condio ento comando 11; comando 12; ... comando 1n; seno comando 21; comando 22; ... comando 2n; fim se Vamos analisar o caso abaixo que ler 2 nmeros e escreve o maior deles: programa maior_de_2; var a, b : nmero; incio escrever ('entre com o primeiro nmero: '); ler (a); escrever ('entre com o segundo nmero: '); ler (b); se a > b ento escrever ('o maior dos nmeros lidos ', a); seno escrever ('o maior dos nmeros lidos ', b); fim se final. Aps termos entrado com 2 nmeros o computador faz a avaliao da expresso lgica (A > B) e decide se deve executar os comandos da parte verdadeira ou da parte falsa do comando Se, ou seja, caso o valor de A seja maior que de B ele escrever o valor de A, caso contrrio escrever o de B. Agora responda rpido, e se A for igual a B, o que ser escrito? Veja bem, a condio sempre retorna um valor verdadeiro ou falso, logo o teste executado ir retornar um destes valores. Quando A for igual a B qual o resultado do teste? 16

Falso claro, logo o programa executar os comandos da parte falsa do Se, e ir escrever, neste caso, o valor de B. (Claro que ser o mesmo valor de A, pois eles so iguais...) Vamos a outro exemplo: Escreva um algoritmo que leia o nome e duas notas de um aluno e escreva se ele foi aprovado ou reprovado. Para que o aluno tenha sido aprovado ele precisa ter mdia maior ou igual a 6. programa aprovado_ou_reprovado; var nome: caracter; nota 1, nota 2, mdia : nmero; incio escrever ('entre com o nome do aluno: '); ler (nome); escrever ('entre com a primeira nota: '); ler (nota 1); escrever ('entre com a segunda nota: '); ler (nota 2); mdia := (nota 1 + nota 2) / 2; se mdia >= 6 ento escrever ('o aluno ', nome, ' foi aprovado'); seno escrever ('o aluno ', nome, ' foi 'reprovado'); fim se; final. Estrutura de Deciso Encadeada Muitas vezes apenas a resposta verdadeiro ou falso no suficiente para que obtenhamos uma soluo definitiva para o problema, lembra o caso de escrever o maior de 2 nmeros ??? Como vimos dentro da parte verdadeira, ou falsa, de uma deciso temos um bloco de comandos, podemos ento ter outra estrutura de deciso dentro do bloco, e tantas quantas forem necessrias. Vamos reescrever o algoritmo escrevendo o maior deles e ou a expresso 'Os nmeros so iguais' caso sejam realmente iguais. programa maior_de_2; var a, b : nmero; incio escrever ('entre com o primeiro nmero: '); ler (a); escrever ('entre com o segundo nmero: '); ler (b); se a > b ento escrever ('o maior dos nmeros lidos ', a); seno se a = b ento escrever ('os nmeros so iguais'); seno escrever ('o maior dos nmeros lidos ', b); fim se; 17

fim se; final. Entendendo o algoritmo A nica diferena entre este algoritmo e o da seo anterior que agora dentro da parte falsa da estrutura de seleo inserimos outra estrutura de deciso. Notamos ento que cada bloco de comando funciona como se fosse um outro algoritmo, podendo ter quantas estruturas de seleo, ou repetio, (veremos estruturas de repetio no prximo captulo), quantas forem necessrias. Vamos a outro exemplo: Escreva um Algoritmo que leia 3 nmeros e escreva o maior deles. programa maior_de_3; var a, b, c, maior : nmero; incio escrever ('entre com o primeiro nmero: '); ler (a); escrever ('entre com o segundo nmero: '); ler (b); escrever ('entre com o terceiro nmero: '); ler (c); se a > b ento se a > c ento maior:= a; seno maior:= c; fim se seno se b > c ento maior:= b; seno maior:= c; fim se fim se escrever ('o maior dos nmeros lidos ', maior); final. Entendendo o algoritmo Antes de tudo precisamos saber que o algoritmo s pode testar variveis duas a duas, ou seja, impossvel fazer um teste do tipo Se (A>B>C), logo temos que escolher duas e compar-las. Escolhemos ao acaso A e B e as comparamos, se A for maior que B saberemos que a maior das 3 ou A ou C, precisamos ento compar-las para descobrir a maior, j se B for menor que A, precisamos comparar B com C para descobrir a maior delas. Feitas as comparaes necessrias atribumos a varivel Maior a maior das variveis e escrevemo-la. Poderamos escrever o algoritmo utilizando os operadores lgicos, ele ficaria assim: programa maior_de_3; 18

var a, b, c, maior : nmero; incio escrever ('entre com o primeiro nmero: '); ler (a); escrever ('entre com o segundo nmero: '); ler (b); escrever ('entre com o terceiro nmero: '); ler (c); se (a > b) e (a>c) ento maior:= a seno se b > c ento maior:= b; seno maior:= c; fim se fim se escrever ('o maior dos nmeros lidos ', maior); final. Exerccios Resolvidos 1) Escreva um Algoritmo que leia 3 nmeros e os escreva em ordem crescente: programa ordem_crescente; var a, b, c : nmero; incio escrever ('entre com o primeiro nmero: '); ler (a) escrever ('entre com o segundo nmero: '); ler (b) escrever ('entre com o terceiro nmero: '); ler (c) escrever (' os nmeros em ordem so: '); se a > b ento se b > c ento escrever (c,b,a); seno se a > c ento escrever (b,c,a); seno escrever (b,a,c); fim se; fim se seno se a > c ento escrever (c,a,b); seno se b > c ento 19

escrever(a,c,b); seno escrever(a,b,c); fim se; fim se; fim se; final. 2) Escreva um Algoritmo que leia 3 nmeros e escreva a soma dos 2 maiores: programa soma_2_maiores; var a, b, c, soma : nmero; incio escrever ('entre com o primeiro nmero: '); ler (a); escrever ('entre com o segundo nmero: '); ler (b); escrever ('entre com o terceiro nmero: '); ler (c); se a > b ento se b > c ento soma := a + b; seno soma := a + c; fim se seno se a > c ento soma := b + a; seno soma := b + c; fim se; fim se; escrever (' a soma dos 2 maiores nmeros lidos ', soma); final Exerccios Propostos 1. Escreva um Algoritmo que leia 3 nmeros e os escreva em ordem crescente utilizando operadores relacionais. 2. Escreva um algoritmo que leia 3 nmeros e escreva a diferena entre o maior e o menor. 3. Escreva um algoritmo que leia os 3 lados de um tringulo e escreva se o mesmo retngulo, escaleno, issceles ou equiltero. 4. Escreva um algoritmo que leia 2 notas de um aluno e escreva sua situao sabendo que, se a mdia for menor que 5 ele estar reprovado; se a mdia estiver entre 5 (inclusive) e 7 (exclusive) ele estar em recuperao; e se a mdia for maior ou igual a 7 ele estar aprovado. 20

5. Escreva um algoritmo que leia a nota e o nome de 2 alunos e escreva o nome do aluno que obteve a maior nota. 6. Escreva um algoritmo que leia 3 nmeros e escreva o nmero central. 7. Faa uma algoritmo que leia um nmero inteiro e escreva o mdulo deste nmero. 8. Escreva um algoritmo que leia um valor inteiro e determine se ele par ou mpar. 9. Desenvolva um algoritmo que leia um nmero inteiro que corresponde a uma temperatura em graus Celsius e efetue a converso para Kelvin ou Fahrenheit, de acordo com a tecla pressionada: K / F (opo do usurio). Lembrando-se que: Kelvin = Celsius + 273,15 ; e Fahrenheit = ((9 * Celsius)/5)/32 . 10. Faa um algoritmo que, dada a idade de um nadador, classifique-o em uma das seguintes categorias: Infantil A: 5 a 7 anos; Infantil B: 8 a 10 anos; Juvenil A: 11 a 13 anos; Juvenil B: 14 a 17 anos; Snior: maiores de 18 anos; 11. Construa um algoritmo que, dado um conjunto de valores inteiros e positivos, determine qual o menor valor do conjunto. 12. Construa um algoritmo que leia trs valores inteiros e os coloque em ordem crescente. 13. Escreva um algoritmo que imprima todas as possibilidades de que no lanamento de dois dados tenhamos o valor 7 como resultado da soma dos valores de cada dado. 14. Elabore um algoritmo que imprima todos os nmeros primos existentes entre N1 e N2, onde N1 e N2 so nmeros naturais fornecidos pelo usurio. 15. Fulano tem 1,50 metros e cresce 2 cm por ano, enquanto Ciclano tem 1,10 metros e cresce 3 cm por ano. Construa um algoritmo que calcule e imprima quantos anos sero necessrios para que Ciclano seja maior que Fulano.

Estrutura de Repetio Em certas situaes precisamos repetir o mesmo bloco de cdigo vrias vezes, por exemplo, suponha que precisamos ler a nota de 2 alunos e calcular sua mdia, teramos o seguinte algoritmo: programa mdia_de_2; var nota 1, nota 2, mdia : nmero; 21

incio escrever (entre com a primeira nota: ); ler (nota 1); escrever (entre com a segunda nota: ); ler (nota 2); mdia := (nota 1 + nota 2) / 2; escrever (mdia); final. Agora vamos aumentar para 4 alunos programa mdia_de_4; var nota 1, nota 2, nota 3, nota 4, mdia : nmero; incio escrever (entre com a primeira nota: ); ler (nota 1); escrever (entre com a segunda nota: ); ler (nota 2); escrever (entre com a terceira nota: ); ler (nota 3); escrever (entre com a quarta nota: ); ler (nota 4); mdia := (nota 1 + nota 2) / 4; escrever (mdia); final. Agora, imagine uma turma de 30 alunos, nosso algoritmo ficaria monstruosamente grande, sendo que o mesmo bloco de comandos repetido tantas vezes quanto forem os alunos. Vamos ver neste captulo que temos 3 maneiras diferentes de repetir um bloco de comando, tornando, deste modo, nossos algoritmos menores e mais fceis de entender. Repetio Controlada Esta a mais simples das estruturas de repetio, porm a menos flexvel, ela nos permite repetir um bloco de comandos um determinado nmero de vezes, precisamos saber o nmero de vezes a repetir antes de entrarmos na estrutura. O funcionamento bsico bastante simples, definimos um valor inicial e um final para uma varivel de controle, ento a estrutura fica se repetindo at que a varivel de controle atinja, partindo do valor inicial, o valor final. Vejamos sua estrutura bsica: para varivel_controle := valor_inicial at valor_final faa comando 1; comando 2; ... comando n; fim para; onde: Varivel_Controle uma varivel que ser incrementada ou decrementada a partir do valor inicial at que atinja o valor final previamente estabelecido. 22

Valor_Inicial o primeiro valor que a varivel de controle ir assumir. Valor_Final o valor limite que a varivel de controle poder assumir. Vamos a um exemplo: Escrever um algoritmo que escreva de 1 at 100. programa escrevendo_nmeros; var i : nmero; incio escrever(escrevendo de 1 at 100); para i:= 1 at 100 faa escrever (i ); fim para; final. Entendendo o algoritmo. A varivel de controle I ter como valor inicial 1 e o bloco de comando, no caso apenas o comando Escrever (I), ir se repetir at que I atinja o valor 100. Note que se quisssemos que fossem escritos os 1000 primeiros nmeros somente seria necessrio trocar o valor final de I de 100 para 1000. A varivel de controle pode ser lida dentro do bloco, porm no deve ser modificada pelo processamento. Outro exemplo: Escrever um algoritmo que leia 2 nmeros e escreva todos os nmeros compreendidos entre eles. programa numeros_compreendidos; var i, a, b : nmero; incio escrever(entre com o menor nmero:); ler(a); escrever(entre com o maior nmero:); ler(b); para i:= a at b faa i:=i + 1; escrever (i ); fim para; final. Note que pedimos primeiro o menor nmero e depois o maior, como exerccio reescreva o algoritmo para que os nmeros possam ser digitados em qualquer ordem. Repetio com Teste no incio O que acontece em muitos casos que nem sempre sabemos o nmero de vezes que o bloco de comando deve ser executado, nestes casos temos que executar um teste lgico que nos dir se devemos ou no executar o bloco de comandos. Vejamos sua estrutura: 23

enquanto condio faa comando 1; comando 2; ... comando n; fim enquanto; Onde Condio uma expresso lgica que ser avaliada, e como sabemos uma expresso lgica s admite 2 resultados: Verdadeiro ou Falso. Caso o resultado seja verdadeiro o bloco de comandos ser executado, ao chegarmos ao fim do bloco o fluxo do programa retorna ao seu incio e faz nova avaliao da condio, e continua executando o bloco at que a condio se torne falsa. Quando isto ocorre o fluxo do programa segue para a primeira instruo aps a marca de fim de bloco (Fim Enquanto). Temos 2 maneiras de utilizar a estrutura Enquanto ... Fim Enquanto, so elas: Usando um Flag Usando um contador Usando um flag: Um flag um valor que estabelecemos como valor de parada, um valor que quando alcanado informa ao programa que a repetio do bloco deve ser finalizada, geralmente um valor absurdo, do mesmo tipo que estamos lendo. Vamos a um exemplo: Escrever um algoritmo que leia a quantidade de filhos de cada um dos funcionrios de uma empresa, at que seja lido o valor -1, e escreva a quantidade mdia de filhos dos funcionrios. programa filhos; var filhos, mdia : nmero; totfilhos, totfunc : nmero; incio filhos := 0; totfilhos := 0; totfunc := 0; enquanto filhos -1 faa escrever(entre com o nmero de filhos:); ler(filhos); totfilhos := totfilhos + filhos; totfunc := totfunc + 1; fim enquanto; mdia := totfilhos / totfunc; escrever(o nmero mdio de filhos : , mdia); final. Entendendo o algoritmo Primeiro escolhemos o valor -1 como condio de parada pois, ningum tem -1 filhos, logo um valor ideal para servir de flag. Utilizamos uma varivel para contar o total de filhos lidos (TotFilhos), e outra para contar o nmero de funcionrio (TotFunc), e ficamos lendo e contando at que seja lido o valor -1, quando, ento, samos do bloco e calculamos o nmero mdio de filhos por funcionrio. Por que no usamos a estrutura Para ... Fim Para ??? Exatamente. No sabemos o nmero de funcionrios, logo no podemos utilizar esta estrutura. Vamos fazer o teste de mesa, suponha que a empresa tem 5 funcionrios e o nmero de filhos de cada um deles , respectivamente: 2,2,1,0 e 3. 24

Faamos outro, agora vamos escrever um algoritmo que leia vrios nmeros, at que seja lido o nmero 0, e escreva o maior dos nmeros lidos. programa maior_de_muitos; var a, maior : nmero; incio ler(a); maior := a; enquanto a 0 faa se a > maior ento maior := a; fim se; ler (a); fim enquanto; escrever(o maior nmero lido : , maior); final. Usando um contador: Podemos utilizar a estrutura Enquanto ... Fim Enquanto mesmo quando sabemos o nmero de vezes que iremos executar o bloco de comando, para isso temos que controlar manualmente o nmero de vezes que o bloco executado, para isso utilizamos um contador, vamos a um exemplo. Vamos supor que queremos saber o maior de 100 nmeros, o algoritmo poderia, ento, ser escrito assim: programa maior_de_muitos; var a, maior : nmero; contador : nmero; incio ler(a); maior := a; contador := 1; enquanto contador maior ento maior := a; fim se; ler (a); contador := contador + 1; fim enquanto; escrever(o maior nmero lido : , maior); final. Entendendo o algoritmo Agora ns sabemos que o bloco ser executado 100 vezes, precisamos ento contar as vezes que o executamos, utilizamos uma varivel para isso, ou seja, a cada vez que o bloco executado acrescentamos 1 ao contador, at que o mesmo atinja o valor de 101, quando o bloco deixa de ser executado, escrito o maior dos nmeros lidos.

25

Repetio com Teste no final A estrutura de repetio com teste no final tem a seguinte estrutura: repita comando 1; comando 2; ... comando n; at condio H duas diferenas fundamentais entre as estruturas Enquanto ... Fim Enquanto e Repita ... At. A primeira que na segunda estrutura, como o teste feito no final do bloco, ele (o bloco de comando) executado pelo menos uma vez. A segunda que na estrutura Enquanto o bloco de comandos executado at que a Condio se torne falsa e na estrutura Repita o bloco executado at que a condio se torne verdadeira. Vamos escrever o algoritmo que escrevia o maior de 100 nmeros utilizando a estrutura Repita. programa maior_de_muitos_2_a_misso; var a, maior : nmero; contador : nmero; incio ler (a); maior := a; contador := 1; repita se a > maior ento maior := a fim se; ler (a); contador := contador + 1; at contador > 100 escrever (o maior nmero lido : , maior); final. Como exerccio escreva o algoritmo que calcula a mdia de filhos de funcionrios, j feito com a estrutura Enquanto, utilizando a estrutura Repita. Exerccios Resolvidos 1) Escreva um Algoritmo que leia 100 nmeros e escreva todos os nmeros que forem positivos: programa escrever_positivos; var a, i : nmero; incio para i de 1 at 100 faa escrever (entre com um nmero: ); ler (a); se a > 0 ento 26

escrever (a); fim se; fim para; final. 2) Escreva um Algoritmo que leia 30 nmeros e escreva a quantidade de nmeros lidos maiores que 12: programa maiores_que_12; var a, i, quant : nmero; incio quant:= 0; para i de 1 at 30 faa escrever (entre com um nmero: ) ler (a); se a > 12 ento quant:= quant + 1; fim se; fim para; escrever ( a quantidade de nmeros maiores que 12 , quant); final 3) Escreva um Algoritmo que leia vrios nmeros, at que seja lido -1, e escreva a soma dos nmeros lidos: programa at_ler_negativo; var a, soma : nmero; incio soma:= 0; escrever (entre com um nmero: ); ler (a); enquanto a -1 faa soma:= soma + a; escrever (entre com um nmero: ); ler (a); fim enquanto; escrever ( a soma dos nmeros lidos , soma); final. 4) Escreva um Algoritmo que leia vrios nmeros, at que seja lido um nmero negativo, e escreva todos os nmeros maiores que o primeiro nmero lido. programa maiores_que_primeiro; var a, primeiro: nmero; incio escrever (entre com o primeiro nmero: ); ler (a); primeiro := a; enquanto a < 0 faa 27

escrever (entre com um nmero: ); ler (a); se a > primeiro ento escrever (a); fim se; fim enquanto; final. 5) Escreva um Algoritmo que leia um nmero e escreva o seu fatorial. programa fatorial; var a, i, fat : nmero; incio fat:= 1; escrever (entre com um nmero: ); ler (a); para i de 1 at a faa fat:= fat * i; fim para; escrever ( o fatorial de , a, , fat); final. 6) Escreva um Algoritmo que escreva os primeiros 50 termos da seguinte srie : 1,1,2,3,5,8,13....., onde cada termo, a partir do terceiro, formado pela soma dos dois termos anteriores: programa srie; var ant 1, ant 2, termo, i : nmero; incio ant2:= 1; ant1:= 1; escrever (ant 2); escrever (ant 1); para i de 3 at 50 faa termo:= ant 1 + ant 2; escrever (termo); ant2:= ant1; ant1:= termo; fim para; final. 7) Escreva um Algoritmo que leia o nome, o sexo e a altura de 50 pessoas e escreva o nome da mulher mais alta e do homem mais baixo: programa pessoas; var altura, i, hbaixo, malta : nmero; sexo, nome, nomehomem, nomemulher : caracter; incio hbaixo:= 5; 28

nomehomem:= no existe homem com mais de 5 metros ; malta:= 0; nomemulher:= nem mulher de altura zero; para i de 1 at 50 faa escrever (informe o nome da pessoa: ); ler (nome); escrever (informe o sexo da pessoa: ); ler (sexo); escrever (informe a altura da pessoa: ); ler (altura); se sexo = f ento se altura > malta ento malta:= altura; nomemulher:= nome; fim se seno se altura < hbaixo ento hbaixo:= altura; nomehomem:= nome; fim se; fim se; fim para; escrever (o homem mais baixo o , nomehomem, . ele mede apenas , altura) escrever (a mulher mais alta a , nomemulher . ela mede , altura); final. Exerccios Propostos 1) Escrever um algoritmo que escreva os 10 primeiros mltiplos de 3. 2) Escrever um algoritmo que escreva o menor de 50 nmeros lidos. 3) Escrever um algoritmo que leia 20 nmeros e escreva sua mdia. 4) Escrever um algoritmo que leia vrios nmeros at que seja lido um nmero negativo e escreva a diferena entre o maior e o menor dos nmeros lidos. 5) Escrever um algoritmo que leia vrios nmeros, at que seja lido o nmero -1, e escreva a soma de todos os nmeros lidos. 6) Uma academia de ginstica tem vrios alunos, escreva um algoritmo que leia o nome, o sexo, a idade, o peso e a altura de todos estes alunos e escreva: O nome do aluno mais alto A quantidade de alunos do sexo feminino com mais de 60 Kgs A quantidade de alunos com mais de 1,80 cm A quantidade de alunos do sexo masculino com peso maior que 80 kgs e com mais de 1,90 m O percentual de alunos do sexo masculino e do sexo feminino

29

7) Um banco tem 5120 clientes e quer entrar em contato com todos os clientes que tem saldo maior ou igual a R$ 10.000,00. Escreva um algoritmo que leia o nome, o telefone e o saldo de cada um destes clientes, e escreva o nome e o telefone de todos os clientes que devem ser contatados, assim como a quantidade de clientes com saldo inferior a R$ 100,00, a quantidade de clientes com saldo entre R$ 100,00 e 999,99 e a quantidade de clientes com saldo entre R$ 1000,00 e R$ 9.999,99. 8. Faa um algoritmo para calcular o fatorial de qualquer nmero inteiro. 9. Faa um algoritmo de um programa para mostrar ao usurio qual o resto da diviso de qualquer nmero por 10. 10. Elabore um algoritmo para informar qual a idade do usurio (quantos anos tem, apenas), sendo informado a data atual e sua data de nascimento. 11. Faa um algoritmo de um programa para indicar o valor de desconto de Imposto Sindical, para o usurio que informar seu salrio, de acordo com a tabela abaixo: Salrio (R$) At 1200,00 De 1200,01 at 2500,00 Acima de 2500,00 Desconto do IS Isento 8% 12%

12. Faa um algoritmo que conhea as quatro notas bimestrais e, informe a mdia do aluno e se ele passou (mdia para aprovao 6).

Estrutura Seqencial No captulo anterior definimos a estrutura bsica de um programa, a partir de agora vamos conhecer os comandos, e aplic-los para encontrar solues de problemas a serem apresentados, vamos efetivamente comear a escrever nossos algoritmos. Comando de Atribuio At o momento aprendemos que todas as variveis so definidas antes do incio do programa, porm quando definimos uma varivel apenas atribumos a ela um nome e um tipo, para atribuir valores as variveis precisamos utilizar o comando de atribuio ( = ), o que s pode ser feito no corpo do programa, veja como no exemplo abaixo: programa abono; const salrio= 130; var abono, filhos: nmero; empregado: caracter; inicio 30

empregado:= "marcelo"; filhos:= 3; abono:= 15 * filhos; final. Entendendo o algoritmo: Criamos 1 constante (salrio) e definimos seu valor como 130, e 3 variveis, sendo as variveis abono e filhos do tipo nmero e a varivel empregado do tipo caracter. Durante a execuo do programa atribumos a varivel empregado o valor "Marcelo", a varivel filhos o valor 3 e a varivel abono o resultado da expresso (filhos * 15). Como j foi dito sempre que nos referimos a uma varivel estamos nos referindo, implicitamente, ao seu contedo, logo temos ao fim do programa o valor de 45 armazenado na varivel abono. Veja outro exemplo: programa trocando_valores; var num 1, num 2,soma : nmero; frase : caracter; inicio {vamos atribuir valores as variveis} frase:= "lgica fcil"; num 1:= 3; num 2:= 5; {agora vamos alterar seus valores} soma:= num 1 + num 2; num 1:= soma + num 1; frase:= "trocaram o meu contedo"; num 2:= soma num 2; final.

Entendendo o algoritmo Aps definirmos as variveis e atribuirmos valores nas 3 primeiras linhas do corpo do programa passamos a manipul-las trocando seu contedo, para acompanharmos os valores assumidos pelas variveis durante o processamento devemos fazer o que chamamos de teste de mesa, ou chins. Veja como isto feito: Num 1 3 11 Num 2 5 3 Soma 8 Frase "Lgica fcil" "Trocaram meu contedo"

Para fazermos o teste de mesa em um algoritmo devemos criar uma tabela com tantas colunas quantas forem as variveis envolvidas. A medida que as variveis vo recebendo novos valores os valores antigos vo sendo substitudos, de modo que ao final 31

da execuo do algoritmo tenhamos na coluna correspondente a cada varivel seu valor final. Tente agora voc... Utilizando a tabela abaixo do algoritmo faa o teste de mesa e identifique o valor que as variveis assumem ao final de sua execuo. programa para_voc_fazer var num 1, num 2, num 3 : nmero inicio num 1:= 3; num 2:= 5; num 3:= 2; num 3:= num 1 + num 2; num 1:= num 2 + num 1; num 2:= num 3 num 2; num 3:= num 1 + num 2 + num 3; final.

Num 1

Num 2

Num 3

Exerccios Resolvidos 1) Escreva um algoritmo que calcule a rea de um tringulo, sendo a base e a altura fornecidas via teclado. Faa o teste de mesa. programa calcula_rea; var base, altura, rea : nmero; inicio ler (base); ler (altura); rea:= (base * altura) / 2; escrever (a rea do tringulo , rea); final. 2) Sabendo que o salrio lquido de um trabalhador calculado subtraindo-se do salrio bruto 11% para a previdncia social e, do que sobrar, 15% a ttulo de imposto de renda, escreva um algoritmo que leia o nome e o salrio bruto de um trabalhador, calcule e imprima seu salrio lquido. Faa o teste de mesa. programa salrio_liquido; const previdncia = 0,11; imposto = 0,15; 32

var nome : caracter; salrio, lquido : nmero; inicio leia(nome, salrio); lquido:= salrio (salrio * previdncia) ; lquido:= lquido (lquido * imposto); escreva (o salrio de , nome, ,lquido); final. Exerccios Propostos 1. Faa o teste de mesa nos algoritmos abaixo: programa exerccio_proposto_32; var num 1, num 2, num 3 : nmero; inicio num 1:= 3; num 2:= num 1 + 5 ; num 3:= num 2 + num 1; num 3:= 2 * (num 2 + num 3); final. 2. Faa o teste de mesa nos algoritmos abaixo: programa troca_valores; var num 1, num 2, aux : nmero; inicio num 1:= 3; num 2:= 5; aux:= num 1; num 1:= num 2; num 2:= aux; final. 3. Escreva um algoritmo que leia 3 nmeros e escreva sua mdia. 4. Escreva um algoritmo que leia o lado de um quadrado e escreva sua rea e seu permetro. 5. Escreva um algoritmo que leia o nome, o salrio e o nmero de filhos de um trabalhador e escreva seu salrio total. Sabe-se que concedido um abono de R$ 12,00 por filho. 6. Desenvolva um algoritmo que leia e imprima todos os mltiplos do nmero 11 entre 0 e 1000. 7. Desenvolva um algoritmo que imprima os nmeros mpares entre 20 e 30. 8. Desenvolva um algoritmo que imprima os nmeros pares entre 0 e 100. 33

9. Faa um fluxograma de um programa para exibir qual o maior e o menor de 30 nmeros digitados pelo usurio.

Estrutura de Dados Mesmo possuindo tipos bsicos para as declaraes de variveis, voc deve ter notado que eles muitas vezes no so suficientes para representar toda e qualquer informao que possa surgir. Portanto, em muitas situaes esses recursos so escassos, o que poderia ser suprido se existissem mais tipos de informaes ou, ainda melhor, se esses tipos pudessem ser construdos, criados, medida que se fizessem necessrios. Agregados Homogneos Da mesma forma que na Teoria dos Conjuntos, uma varivel pode ser interpretada como um elemento e uma estrutura de dados como um conjunto. As variveis compostas homogneas so formadas de variveis com o mesmo tipo primitivo. Os agregados homogneos correspondem a posies de memria, identificadas por um mesmo nome, referenciadas por um ndice, e que possuem um mesmo tipo. Variveis Compostas Homogneas Suponha que voc est dentro de um elevador, e para ir a um determinado andar voc deve especificar o seu nmero, isto , em um vetor, voc deve se referenciar por seu ndice para acessar qualquer um de seus elementos.

DeclaraoTipo IDENTIFICADOR = vetor [LI .. LF] de ; variveis varivel : IDENTIFICADOR; Onde: LI - representa o limite inicial do vetor; LF - representa o limite final do vetor; qualquer um dos tipos primitivos, ou ainda um outro tipo que pode ser construdo, o qual veremos adiante. Primeiramente criaremos um novo tipo e lhe daremos um nome, aps isso podemos us-lo para declarar as variveis que sero utilizadas dentro do programa. Exemplo: Utilizaremos o exerccio de mdia das notas: programa media_vetor; variveis v_notas = vetor [1..4] de real; ndice: inteiro; mdia: real; incio mdia:= 0; para ndice:= 1 at 4 faa 34

leia( notas[ndice] ); mdia:= mdia + notas[ndice]; mdia:= mdia / 4; indice:= indice + 1; escreva (mdia); fim para; fim.

Exerccio1.Elabore um algoritmo que leia, some e imprima o resultado da soma, entre dois vetores inteiros de 50 posies, com o nmero de elementos informados pelo usurio. 2.Construa um algoritmo que preencha um vetor de 100 elementos inteiros colocando 1 na posio correspondente a um quadrado perfeito e 0 nos demais casos. Agregados Multidimensionais Suponha que, alm do acesso pelo elevador at um determinado andar, tenhamos tambm a diviso desse andar em apartamentos. Para chegar a algum deles no basta s o nmero do andar, precisamos tambm do nmero do apartamento. Os vetores tm como principal caracterstica a necessidade de apenas um ndice para endereamento - estruturas unidimensionais. Uma estrutura que precisasse de mais de um ndice, como no caso especfico, dividido em apartamentos, seria ento denominada estrutura composta multidimensional (agregado), neste caso, de duas dimenses (bidimensional).

DeclaraoTipo IDENTIFICADOR = matriz [LI1 .. LF1, LI2 .. LF2] de ; variveis varivel : IDENTIFICADOR; Onde: LIN, LFN - so os limites dos intervalos de variao dos ndices da varivel, onde cada par de limites est associado a um ndice. O nmero de dimenses igual ao nmero de intervalos; - qualquer um dos tipos primitivos, ou ainda um outro tipo que pode ser construdo, o qual veremos adiante. Primeiramente criaremos um novo tipo e lhe daremos um nome, aps isso podemos us-lo para declarar as variveis que sero utilizadas dentro do programa. Exemplo: Construa um algoritmo que efetue a leitura, a soma e a impresso do resultado, entre duas matrizes inteiras que comportem 25 elementos; programa soma_matrizes; tipo m = matriz [1 .. 5, 1 .. 5] de inteiros; variveis ma, mb, mc : m; 35

i,j : inteiro; incio i:= 1; enquanto i