Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


logica de programação, Notas de estudo de Informática

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

Antes de 2010

Compartilhado em 05/02/2010

gustavo-dias-11
gustavo-dias-11 🇧🇷

4.7

(7)

46 documentos

1 / 32

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Apostila de
Lógica de
Programação
ÍNDICE
Lógica de Programação
1. Introdução
Muitos anos se passaram desde os primórdios da história da computação, mas apesar
de 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.
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20

Pré-visualização parcial do texto

Baixe logica de programação e outras Notas de estudo em PDF para Informática, somente na Docsity!

Apostila de

Lógica de

Programação

ÍNDICE

Lógica de Programação

1. Introduçã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!

2. Conceitos Gerais

Programação Estruturada

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

Manutenibilidade

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.

PseudoLinguagem - PORTUGOL

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.

3. Raciocínio Matemático

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.

Fluxo de Controle em Algoritmos

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.

Criando Algoritmos

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

  1. (^) Use comentários com freqüência. Isto torna o algoritmo mais legível e facilita o entendimento da lógica empregada. Seus algoritmos deverão ser lidos e entendidos por outras pessoas (e por você mesmo) de tal forma que possam ser corrigidos e receber manutenção. Obs: Não se esqueça de atualizar os comentários, em caso de manutenção. Pior do que um programa sem comentários, é um programa com comentários errados.
  2. Use comentários, também, no cabeçalho do algoritmo, incluindo, principalmente:
  • descrição do que faz o algoritmo
  • autor
  • data de criação
  1. Escolha nomes de variáveis significativos, todavia evite nomes muito longos. Ex: Prefira SalBruto ou SalarioBruto ao invés de SB ou VAR Prefira TotAlunosAprovDireta ao invés de
  1. Reveja o algoritmo, checando as boas normas de criação.

Conselho: Só tente conseguir o ótimo, depois de realizar o bom.

Identificadores

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:

  • O primeiro caractere deve ser, obrigatoriamente, uma letra.
  • Do segundo caractere em diante são permitidos números e letras. O símbolo de underscore ( _ ) pode ser usado para separar nomes compostos. Portanto, não são permitidos espaços, caracteres acentuados e símbolos especiais na composição do nome de um identificador;
  • Palavras reservadas (em inglês ou português) não podem ser usadas com identificadores. (Exemplo: begin, end, for, var, inicio, fim, para, etc...)
  • Não há distinção entre maiúsculo e minúsculo, na forma como os identificadores são escritos;

F02D Exemplos de nomes de identificadores:

SalarioBruto Preco_Unitario BuscaValor NOTA Nota

Variáveis

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

Tipos Básicos de Dados

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 )

Operadores Relacionais

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

Operadores Lógicos

É 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

F F F F F
F V F V V
V F F V V
V V V V F

Prioridade na Avaliação de Expressões

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

Comandos de Entrada e Saída

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

Funções

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

Estrutura de um Algoritmo

declare < declaração de variáveis, constantes e tipos > início < comandos > fim

Estruturas de Controle

Blocos

Delimitam um conjunto de comandos com uma função bem definida.

início fim

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>; ; fim-se;

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>; ; fim-enquanto;

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>; ; até que <condição>;

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 ; fim-escolha;

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

CRI
STINA
GUS
TAVO
ANT
ONIO

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

CRI
STINA
GUS
TAVO
ANT
ONIO

Matrizes

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:

Nome da matriz : matriz [ li 1 : ls 1 , li 2 :ls 2 , ... ,

lin :ls n ] de <tipo básico da 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 )

( S

exta )