
























Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Chegou a hora de você aprender lógica de programação, seus conceitos, raciocínio matemático, algoritmos, mapeamento, sintaxe do pascal, tudo nessa apostila de lógica de programação.
Tipologia: Notas de estudo
1 / 32
Esta página não é visível na pré-visualização
Não perca as partes importantes!

























Lógica de Programação
Muitos anos se passaram desde os primórdios da história da computação, mas apesar de já termos vivido vários paradigmas de programação, existe uma base de conhecimento que não mudou e não mudará nunca – a Lógica de Programação.
Faço uma associação direta da Lógica de Programação com o Raciocínio Matemático, onde o importante é a interpretação de um problema e a utilização correta de uma fórmula, e não a sintaxe pré-definida da mesma. O saber da Lógica está no “praticar”.
Não existem “fórmulas” em Informática, o que existe é o aperfeiçoamento de nossa forma de pensar e raciocinar sobre um problema, podendo extrair do mesmo uma solução eficiente e eficaz, sob um determinado ângulo de visão. Assim, verificamos que é preciso aprender a pensar sobre os problemas, extraindo deles o máximo de informações.
A solução que criamos para um determinado problema necessita ser exteriorizada e expressa numa linguagem publicamente conhecida. Assim, utilizamos a lógica de programação para desenvolver nossas soluções e os algoritmos para apresentar essas soluções ao mundo.
Venho acompanhando nos últimos anos vários livros de Algoritmos e Estruturas de Dados. Todos ensinam como representamos estruturas de controle e atribuições, ou como declaramos variáveis, mas nenhum deles – que eu tenha lido até o momento –, orientou o aluno na forma de pensar. Precisamos mais do que “fórmulas”, precisamos aprender a pensar.
Os princípios da programação estruturada surgida no final da década de 60 – introduzidos por Dijkstra – levaram a necessidade de se ter uma linguagem que implementasse essas idéias, já que as linguagens de época (FORTRAN, COBOL e BASIC) não permitiam aplicar claramente as técnicas ensinadas. Assim, o professor Niklaus Wirth e seus colegas da Universidade Técnica de Zurique (Suíça) desenvolveram, no início dos anos 70, a linguagem PASCAL – uma derivação da linguagem ALGOL 60, porém de implementação mais simples e com uma estrutura de dados mais poderosa. O nome Pascal foi uma homenagem a Blaise Pascal, famoso matemático, que criou a calculadora baseada em discos de madeira, que foi a predecessora da calculadora de mesa e serviu de inspiração para diversos computadores.
Assim, nossa apostila oferecerá, inicialmente, conceitos gerais sobre Programação. Posteriormente, vocês terão exercícios de Raciocínio Matemático que lhes exercitarão o poder de PENSAR! Em seguida, apresentaremos como desenvolver algoritmos de soluções para Sistemas. E por último, vamos conhecer a Linguagem Pascal, a fim de vermos nossos algoritmos funcionando – ao vivo e à cores!
Atualmente, a sociedade está totalmente dependente dos sistemas de computação. Assim, aumenta exponencialmente a importância do nosso trabalho. Nos fins dos anos 60, constatou-se que as sistemáticas usadas pelos programadores eram os grandes responsáveis pela baixa confiabilidade dos programas. Como solução destes problemas, surgiu a Programação Estruturada (PE).
As revisões sofridas por um programa (releases) tanto para correção de erros quanto para mudanças de especificação, são consideradas como manutenção de software. Os programas devem passar por testes exaustivos de confiabilidade antes de serem colocados em produção. Falhas nesta fase levam a altos níveis de manutenção, que conseqüentemente, levam a altos custos.
Sabemos que ao desenvolver programas necessitamos de nossa criatividade, para que tenhamos soluções eficazes e eficientes. Todavia, não podemos representar nossas soluções em algoritmos totalmente escritos em português. Em programação, todas as vezes que executarmos um algoritmo a partir de um estado inicial x , devemos sempre obter o mesmo estado final y. Desta forma, é fácil perceber que a linguagem natural, não formalizada, geraria ambigüidades. Assim, temos o PORTUGOL, que é uma pseudolinguagem de programação (simbiose do Português com o ALGOL e PASCAL), que permite pensarmos no problema e não na máquina que vai executar o algoritmo. Além disso, não perdemos a flexibilidade e continuamos a ter a proximidade com a linguagem humana, facilitando, portanto, a interpretação.
As crianças aprendem facilmente como adicionar e subtrair valores. Suas dificuldades começam no momento em que elas se deparam com problemas e necessitam identificar quais operações trarão soluções para os mesmos.
Podemos pensar também num algoritmo como um “mecanismo” de transformação de entradas em saídas. Assim, um algoritmo ao ser “executado”, receberá algumas entradas, que serão processadas e nos devolverá algumas saídas.
Um algoritmo é um texto estático, onde temos vários passos que são lidos e interpretados de cima para baixo. Para que venhamos a obter o(s) resultado(s) deste algoritmo, necessitamos “executá-lo”, o que resulta em um processo dinâmico.
No fluxo de controle identificamos em cada passo da execução qual é o próximo comando a ser executado.
A compreensão da lógica de programação de um algoritmo está diretamente ligada a compreensão de seu fluxo de controle. A partir de uma compreensão correta, podemos traçar as diversas execuções possíveis de um algoritmo. Se testarmos todas essas possibilidades, e obtivermos resultados corretos, podemos ter certeza de estar entregando um produto final confiável.
Os iniciantes no mundo da programação encontram alguma dificuldade em diminuir a distância conceitual que separa a representação estática de um algoritmo do(s) processo(s) dinâmico(s) de sua execução. É importante frisar que quando nos propomos a entender um algoritmo, lidamos fisicamente com um texto, mas mentalmente temos processos.
Toda linguagem é composta de sintaxe e semântica, onde a sintaxe corresponde à forma e a semântica corresponde ao conteúdo. Vocês devem aprender a sintaxe dos comandos, mas a principal preocupação deve ser de “como usar esses comandos”.
Regras para criação de bons algoritmos
Conselho: Só tente conseguir o ótimo, depois de realizar o bom.
As variáveis, funções e procedimentos que usamos em nossos algoritmos precisam receber um nome (rótulo). Estes nome são chamados de Identificadores e possuem algumas regras de formação:
F02D Exemplos de nomes de identificadores:
SalarioBruto Preco_Unitario BuscaValor NOTA Nota
Vocês sabem que os computadores possuem CPU e memória, certo? Sim. A CPU (Unidade Central de Processamento) é responsável pelo controle e processamento dos cálculos matemáticos e das resoluções de expressões lógicas. Todavia, os dados que são usados num processamento precisam ser armazenados em algum lugar – este lugar é a memória principal. Ela funciona como um “armário” que guarda nossos pertences. Todavia, como um armário, não podemos simplesmente ir guardando nossos pertences sem nenhuma arrumação. Para isso, existem “caixas” na memória (posições de memória), que nos permitem organizar essas informações. Essas caixas, conceitualmente recebem nomes e são conhecidas como variáveis.
Assim, a variável é o local da memória onde guardamos os dados e o nome da variável é um identificador conforme definição anterior.
F02D Exemplos de variáveis:
SalarioBruto NomeFuncionario
Toda variável necessita ser declarada, ou seja, reserva-se um local da memória informando que tipo de dados residirão ali. Assim, a sintaxe de declaração de uma variável é : variável : tipo de dados ; ou variável1, variável2, ..., variáveln : tipo de dados ;
Exemplo:
Se declararmos as variáveis A, B e C da seguinte forma: declare A : inteiro; B : caracter; C : lógico;
estamos criando áreas na memória identificadas por A, B e C, que só poderão receber, respectivamente, valores inteiros, alfanuméricos e lógicos (Verdadeiro ou Falso).
Ao armazenarmos variáveis na memória do computador, precisamos dizer que tipo elas são, para que seja reservado o espaço adequado, além de ser dado o trabalho correto a elas. Além dos tipos básicos de dados citados abaixo, podemos criar nossos próprios tipos.
INTEIRO: qualquer número inteiro, negativo, nulo ou positivo Ex.: -15, 0, 101
REAL: qualquer número real, negativo, nulo ou positivo Ex.: -1, -0.5, 0, 5, 9.
CARACTER: qualquer conjunto de caracteres alfanuméricos Ex.: “AB”, “ 123”, “ A123” , “CASA”
LÓGICO: conjunto de valores ( FALSO ou VERDADEIRO )
Além de operações matemáticas, é freqüente nossa necessidade em comparar informações. Por exemplo: Se média for maior ou igual a 7. Para isso, utilizamos operadores relacionais.
Operador Relação = Igualdade F 0 B 9 (^) Diferente > Maior que F 0 B 3ou >= Maior ou igual que < Menor que F 0 A 3ou <= Menor ou igual que
É freqüente precisarmos analisar expressões lógicas, aquelas que só possuem dois valores possíveis: Verdadeiro ou Falso. Os operadores usados em expressões lógicas são os Operadores Lógicos. Veja:
Operador Relação E (And) E lógico Ou (Or) Ou lógico Não (Not) Negação lógica Ou-X (Xor)
Ou ‘Exclusivo’
Veja a seguinte tabela para entender melhor os operadores lógicos.
P Q P e Q P ou Q P ou-X Q
1º Parênteses e funções (resolvidos da esquerda para a direita) 2º Multiplicação (*), Divisão ( / e div ) e Resto ( Mod ) (resolvidos da esquerda para a direita) 3º soma e subtração 4º Operadores relacionais: >, <, F 0 B 3,F 0 A 3, =, F 0 B 9 5º Operador Lógico Não 6º Operador Lógico E 7º Operador Lógico Ou
Para atingirmos os objetivos de um algoritmo, necessitamos receber dados do mundo externo e precisamos exteriorizar as informações produzidas. No momento do desenvolvimento de um algoritmo, não nos interessa saber se os dados virão via teclado, ou pela leitura de um arquivo de dados ou por qualquer outro meio. Para obtermos e exteriorizarmos esses dados, utilizamos os seguintes comandos de entrada e saída, LER, ESCREVER e IMPRIMIR. O comando ler espera receber um determinado dado (sem importar a origem). O comando escrever mostra a informação produzida no vídeo. O comando imprimir faz a impressão em papel da informação produzida. Veja a sintaxe dos comandos: ler (variável1, variável2, ... , variável n);
escrever (lista de constantes, variáveis e/ou expressões );
imprimir (lista de constantes, variáveis e/ou expressões );
F02D Exemplos:
ler(numero1); numero2 F 0 A C numero1 * 2; escrever(‘O dobro do número é ‘, numero2); imprimir(‘O triplo do número é ‘, numero1 * 3);
Em toda linguagem vocês encontram funções primitivas que realizam operação básicas com os tipos de dados.
Nome da Descrição da Exemplo
declare < declaração de variáveis, constantes e tipos > início < comandos > fim
Blocos
Delimitam um conjunto de comandos com uma função bem definida.
início
Seqüências Simples
Conjunto de comandos que serão executados numa seqüência linear de cima para baixo. Estes comandos podem aparecer em qualquer estrutura de controle, agrupados ou não por blocos. Ao final de cada comando é obrigatório a colocação de um ponto-e-vírgula ( ; ). Mais de um comando pode ser colocado por linha, mas isso não é aconselhável. Um comando pode ocupar mais de uma linha. Nesse caso, o ponto-e-vírgula só vai aparecer no final da última linha.
Veja a sintaxe:
comando 1; comando 2; início comando 3 ... meio comando 3 ... fim comando 3 ; ... comando n;
Exemplo 1
Faça um algoritmo que leia dois números inteiros e mostre a soma deles.
Algoritmo SomaNumerosInteiros
declare num1, num2, soma : inteiro; inicio ler (num1, num2);
soma F 0 A C num1 + num2; escrever(‘A soma dos números é : ‘, soma); fim
Exemplo 2
Faça um algoritmo que leia 3 nomes e mostre-os na ordem inversa de leitura
Obs: Veja como este algoritmo já apresenta mais detalhes.
Algoritmo LeituraNomes
declare nome1, nome2, nome3 : string; inicio escrever (‘Entre com primeiro nome : ‘); ler (nome1); escrever (‘Entre com segundo nome : ‘); ler (nome2); escrever (‘Entre com terceiro nome : ‘); ler (nome3); escrever (‘A ordem inversa dos nomes é ‘); escrever (nome3); escrever (nome2); escrever (nome1); fim
Exemplo 3
Fazer um algoritmo que leia uma palavra e mostre a primeira letra dela.
Algoritmo PrimeiraLetra
declare palavra, letra1 : caractere;
inicio escrever(‘Digite palavra : ‘ ); ler(palavra); letra1 F 0 A C Substring(palavra, 1, 1); escrever(‘A primeira letra da palavra é : ‘ , letra1); fim
Estruturas Condicionais
Quando uma ação para ser executada depender de uma inspeção ou teste, teremos uma alternativa simples ou composta.
Sintaxe da Alternativa Simples:
se <condição> então <comando 1>; <comando 2>;
Quando o programa encontra a instrução fim-para, incrementa a variável varControle em 1 unidade. Cada vez que o programa passa pela linha de instrução para ..., ele testa se varControle é menor ou igual a ValFinal. Se não for, o comando é abandonado.
Obs: O valor da variável varControle não pode ser alterado no interior da estrutura para...fim-para.
F02D Exemplo:
para aux F 0 A C 1 até 10 faça resultado F 0 A C 5 * aux; fim-para
Enquanto
Utilizada quando não sabemos o número de repetições e quando possuímos uma expressão que deve ser avaliada para que os comandos da estrutura sejam executados. Assim, enquanto o valor da <condição> for verdadeiro, as ações dos comandos são executadas. Quando for falso, a estrutura é abandonada, passando a execução para a próxima linha após o comando. Se já da primeira vez o resultado for falso, os comandos não são executados nenhuma vez.
enquanto <condição> faça <comando 1>; <comando 2>;
F02D Exemplo:
aux F 0 A C 1; enquanto (aux <= 10) faça resultado F 0 A C 5 * aux; aux F 0 A C aux + 1; fim-para
Repita ... Até que
Utilizada quando não sabemos o número de repetições e quando os comandos devem ser executados pelo menos uma vez, antes da expressão ser avaliada. Assim, o programa entra
na estrutura Repita...Até que e executa seus comandos pelo menos uma vez. Ao chegar no fim da estrutura, a expressão será avaliada. Se o resultado da expressão for verdadeiro, então o comando é abandonado.
repita <comando 1>; <comando 2>;
F02D Exemplo:
aux F 0 A C 1; repita resultado F 0 A C 5 * aux; escrever resultado; aux F 0 A C aux + 1; até que (aux > 10);
Resultado do algoritmo: 5 10 15 20 25 30 35 40 45 50
Estrutura de Múltipla Escolha
Utilizada quando temos muitas possibilidades para uma deter minada situação, onde a aplicação da estrutura se...e ntão...senão...fim-se, tornaria o algoritmo muito complexo. escolha <expressão> caso valor1 : <comando 1>; caso valor2 : valor5 : <comando 2>; ... senão
F02D Exemplo:
ler(Numero); escolha Numero caso 1: Extenso F 0 A C ‘Um’; caso 2: Extenso F 0 A C ‘Dois’; caso 3: Extenso F 0 A C ‘Três’; caso 4: Extenso F 0 A C ‘Quatro’; caso 5: Extenso F 0 A C ‘Cinco’; caso 6: Extenso F 0 A C ‘Seis’;
escrever(‘Ordem Inversa de Leitura ‘); escrever(nome5); escrever(nome4); escrever(nome3); escrever(nome2); escrever(nome1); fim
Assim, na memória teríamos ...
Nom e
Nom e
Nom e
Nom e
Nom e ANA PAU LA
Todavia, se alterássemos esse algoritmo para ler o nome de 100 pessoas, a solução anterior se tornaria inviável. Para casos como este, podemos fazer uso de vetores. Se tivéssemos criado 100 variáveis, teríamos que declarar e usar: nome1, nome2, nome3, ... , nome99, nome100. Com o vetor passamos a ter: nome[1], nome[2], nome[3], nome[99], nome[100], onde a declaração do vetor se limita à linha: nome : vetor[1..100] de caracter.
Veja que para todos os elementos nos referimos ao mesmo nome de vetor.
Assim, veja a solução do algoritmo anterior com o uso de vetores:
declare nome : vetor[5] de caracter; aux : inteiro; início para aux F 0 A C 1 até 5 faça escrever (‘Informe o Nome ‘, aux); ler (nome[aux]); fim-para; escrever(‘Ordem Inversa de Leitura ‘); para aux F 0 A C 5 até 1 faça escrever (nome[aux]); fim-para fim
Veja a representação da memória:
Nom e[1]
Nom e[2]
Nom e[3]
Nom e[4]
Nom e[5] ANA PAU LA
As matrizes são estruturas de dados que permitem o armazenamento de um conjunto de dados de mesmo tipo, mas em dimensões diferentes. Os vetores são unidimensionais, enquanto as matrizes podem ser bidimensionais (duas dimensões) ou multidimensionais.
Similarmente podemos conceituar matrizes como um conjunto de dados referenciado por um mesmo nome e que necessitam de mais de um índice para ter seus elementos individualizados.
Para fazer referência a um elemento da matriz serão necessários tantos índices quantas forem as dimensões da matriz.
Veja a sintaxe da declaração de uma matriz:
onde:
li – limite inferior ls – limite superior li 1 : ls 1 , li 2 :ls 2 , ... , li (^) n:ls (^) n – são os limites dos intervalos de variação dos índices da matriz, onde cada par de limites está associado a um índice. tipo – tipo a que pertencem todos os campos do conjunto.
Para fazermos referência a um elemento da matriz, colocamos:
Nome da matriz [ linha, coluna ]
O número de dimensões de uma matriz pode ser obtido pelo número de vírgulas (,) da declaração mais 1. O número de elementos pode ser obtido através do produto do número de elementos de cada dimensão.
Obs: Quando você desejar percorrer uma matriz, linha por linha, crie uma estrutura de repetição, fixando a linha e variando a coluna. Para percorrer uma matriz, coluna por coluna, fixe a coluna e varie a linha.
Vamos pensar numa estrutura onde as colunas representem os cinco dias úteis da semana, e as linhas representem as três vendedoras de uma loja. Na interseção de cada linha x coluna, colocaremos o faturamento diário de cada vendedora.
( Segunda )
Terça )
Quarta )
Quinta )
exta )